diff options
-rw-r--r-- | toxcore/Messenger.c | 44 | ||||
-rw-r--r-- | toxcore/Messenger.h | 24 | ||||
-rw-r--r-- | toxcore/tox.c | 84 |
3 files changed, 128 insertions, 24 deletions
diff --git a/toxcore/Messenger.c b/toxcore/Messenger.c index a9d5e6a1..e5298b31 100644 --- a/toxcore/Messenger.c +++ b/toxcore/Messenger.c | |||
@@ -366,7 +366,8 @@ static int do_receipts(Messenger *m, int32_t friendnumber) | |||
366 | while (receipts) { | 366 | while (receipts) { |
367 | struct Receipts *temp_r = receipts->next; | 367 | struct Receipts *temp_r = receipts->next; |
368 | 368 | ||
369 | if (cryptpacket_received(m->net_crypto, friend_connection_crypt_connection_id(m->fr_c, m->friendlist[friendnumber].friendcon_id), receipts->packet_num) == -1) | 369 | if (cryptpacket_received(m->net_crypto, friend_connection_crypt_connection_id(m->fr_c, |
370 | m->friendlist[friendnumber].friendcon_id), receipts->packet_num) == -1) | ||
370 | break; | 371 | break; |
371 | 372 | ||
372 | if (m->read_receipt) | 373 | if (m->read_receipt) |
@@ -450,15 +451,25 @@ int m_friend_exists(const Messenger *m, int32_t friendnumber) | |||
450 | return 1; | 451 | return 1; |
451 | } | 452 | } |
452 | 453 | ||
453 | 454 | /* Send a packet_id message. | |
454 | static uint32_t send_message_generic(Messenger *m, int32_t friendnumber, const uint8_t *message, uint32_t length, | 455 | * |
455 | uint8_t packet_id) | 456 | * return -1 if friend not valid. |
457 | * return -2 if too large. | ||
458 | * return -3 if friend not online. | ||
459 | * return -4 if send failed (because queue is full). | ||
460 | * return 0 if success. | ||
461 | */ | ||
462 | static int send_message_generic(Messenger *m, int32_t friendnumber, const uint8_t *message, uint32_t length, | ||
463 | uint8_t packet_id, uint32_t *message_id) | ||
456 | { | 464 | { |
457 | if (friend_not_valid(m, friendnumber)) | 465 | if (friend_not_valid(m, friendnumber)) |
458 | return 0; | 466 | return -1; |
459 | 467 | ||
460 | if (length >= MAX_CRYPTO_DATA_SIZE || m->friendlist[friendnumber].status != FRIEND_ONLINE) | 468 | if (length >= MAX_CRYPTO_DATA_SIZE) |
461 | return 0; | 469 | return -2; |
470 | |||
471 | if (m->friendlist[friendnumber].status != FRIEND_ONLINE) | ||
472 | return -3; | ||
462 | 473 | ||
463 | uint8_t packet[length + 1]; | 474 | uint8_t packet[length + 1]; |
464 | packet[0] = packet_id; | 475 | packet[0] = packet_id; |
@@ -466,10 +477,11 @@ static uint32_t send_message_generic(Messenger *m, int32_t friendnumber, const u | |||
466 | if (length != 0) | 477 | if (length != 0) |
467 | memcpy(packet + 1, message, length); | 478 | memcpy(packet + 1, message, length); |
468 | 479 | ||
469 | int64_t packet_num = write_cryptpacket(m->net_crypto, friend_connection_crypt_connection_id(m->fr_c, m->friendlist[friendnumber].friendcon_id), packet, length + 1, 0); | 480 | int64_t packet_num = write_cryptpacket(m->net_crypto, friend_connection_crypt_connection_id(m->fr_c, |
481 | m->friendlist[friendnumber].friendcon_id), packet, length + 1, 0); | ||
470 | 482 | ||
471 | if (packet_num == -1) | 483 | if (packet_num == -1) |
472 | return 0; | 484 | return -4; |
473 | 485 | ||
474 | uint32_t msg_id = ++m->friendlist[friendnumber].message_id; | 486 | uint32_t msg_id = ++m->friendlist[friendnumber].message_id; |
475 | 487 | ||
@@ -478,7 +490,11 @@ static uint32_t send_message_generic(Messenger *m, int32_t friendnumber, const u | |||
478 | } | 490 | } |
479 | 491 | ||
480 | add_receipt(m, friendnumber, packet_num, msg_id); | 492 | add_receipt(m, friendnumber, packet_num, msg_id); |
481 | return msg_id; | 493 | |
494 | if (message_id) | ||
495 | *message_id = msg_id; | ||
496 | |||
497 | return 0; | ||
482 | } | 498 | } |
483 | 499 | ||
484 | /* Send a text chat message to an online friend. | 500 | /* Send a text chat message to an online friend. |
@@ -486,9 +502,9 @@ static uint32_t send_message_generic(Messenger *m, int32_t friendnumber, const u | |||
486 | * return the message id if packet was successfully put into the send queue. | 502 | * return the message id if packet was successfully put into the send queue. |
487 | * return 0 if it was not. | 503 | * return 0 if it was not. |
488 | */ | 504 | */ |
489 | uint32_t m_sendmessage(Messenger *m, int32_t friendnumber, const uint8_t *message, uint32_t length) | 505 | int m_sendmessage(Messenger *m, int32_t friendnumber, const uint8_t *message, uint32_t length, uint32_t *message_id) |
490 | { | 506 | { |
491 | return send_message_generic(m, friendnumber, message, length, PACKET_ID_MESSAGE); | 507 | return send_message_generic(m, friendnumber, message, length, PACKET_ID_MESSAGE, message_id); |
492 | } | 508 | } |
493 | 509 | ||
494 | /* Send an action to an online friend. | 510 | /* Send an action to an online friend. |
@@ -496,9 +512,9 @@ uint32_t m_sendmessage(Messenger *m, int32_t friendnumber, const uint8_t *messag | |||
496 | * return the message id if packet was successfully put into the send queue. | 512 | * return the message id if packet was successfully put into the send queue. |
497 | * return 0 if it was not. | 513 | * return 0 if it was not. |
498 | */ | 514 | */ |
499 | uint32_t m_sendaction(Messenger *m, int32_t friendnumber, const uint8_t *action, uint32_t length) | 515 | int m_sendaction(Messenger *m, int32_t friendnumber, const uint8_t *action, uint32_t length, uint32_t *message_id) |
500 | { | 516 | { |
501 | return send_message_generic(m, friendnumber, action, length, PACKET_ID_ACTION); | 517 | return send_message_generic(m, friendnumber, action, length, PACKET_ID_ACTION, message_id); |
502 | } | 518 | } |
503 | 519 | ||
504 | /* Send a name packet to friendnumber. | 520 | /* Send a name packet to friendnumber. |
diff --git a/toxcore/Messenger.h b/toxcore/Messenger.h index 0a613c0b..4e011a57 100644 --- a/toxcore/Messenger.h +++ b/toxcore/Messenger.h | |||
@@ -403,23 +403,27 @@ int m_friend_exists(const Messenger *m, int32_t friendnumber); | |||
403 | 403 | ||
404 | /* Send a text chat message to an online friend. | 404 | /* Send a text chat message to an online friend. |
405 | * | 405 | * |
406 | * return the message id if packet was successfully put into the send queue. | 406 | * return -1 if friend not valid. |
407 | * return 0 if it was not. | 407 | * return -2 if too large. |
408 | * return -3 if friend not online. | ||
409 | * return -4 if send failed (because queue is full). | ||
410 | * return 0 if success. | ||
408 | * | 411 | * |
409 | * You will want to retain the return value, it will be passed to your read_receipt callback | 412 | * the value in message_id will be passed to your read_receipt callback when the other receives the message. |
410 | * if one is received. | ||
411 | */ | 413 | */ |
412 | uint32_t m_sendmessage(Messenger *m, int32_t friendnumber, const uint8_t *message, uint32_t length); | 414 | int m_sendmessage(Messenger *m, int32_t friendnumber, const uint8_t *message, uint32_t length, uint32_t *message_id); |
413 | 415 | ||
414 | /* Send an action to an online friend. | 416 | /* Send an action to an online friend. |
415 | * | 417 | * |
416 | * return the message id if packet was successfully put into the send queue. | 418 | * return -1 if friend not valid. |
417 | * return 0 if it was not. | 419 | * return -2 if too large. |
420 | * return -3 if friend not online. | ||
421 | * return -4 if send failed (because queue is full). | ||
422 | * return 0 if success. | ||
418 | * | 423 | * |
419 | * You will want to retain the return value, it will be passed to your read_receipt callback | 424 | * the value in message_id will be passed to your read_receipt callback when the other receives the message. |
420 | * if one is received. | ||
421 | */ | 425 | */ |
422 | uint32_t m_sendaction(Messenger *m, int32_t friendnumber, const uint8_t *action, uint32_t length); | 426 | int m_sendaction(Messenger *m, int32_t friendnumber, const uint8_t *action, uint32_t length, uint32_t *message_id); |
423 | 427 | ||
424 | /* Set the name and name_length of a friend. | 428 | /* Set the name and name_length of a friend. |
425 | * name must be a string of maximum MAX_NAME_LENGTH length. | 429 | * name must be a string of maximum MAX_NAME_LENGTH length. |
diff --git a/toxcore/tox.c b/toxcore/tox.c index db100459..54850d69 100644 --- a/toxcore/tox.c +++ b/toxcore/tox.c | |||
@@ -708,3 +708,87 @@ void tox_callback_friend_typing(Tox *tox, tox_friend_typing_cb *function, void * | |||
708 | Messenger *m = tox; | 708 | Messenger *m = tox; |
709 | m_callback_typingchange(m, function, user_data); | 709 | m_callback_typingchange(m, function, user_data); |
710 | } | 710 | } |
711 | |||
712 | bool tox_self_set_typing(Tox *tox, uint32_t friend_number, bool is_typing, TOX_ERR_SET_TYPING *error) | ||
713 | { | ||
714 | Messenger *m = tox; | ||
715 | |||
716 | if (m_set_usertyping(m, friend_number, is_typing) == -1) { | ||
717 | SET_ERROR_PARAMETER(error, TOX_ERR_SET_TYPING_FRIEND_NOT_FOUND); | ||
718 | return 0; | ||
719 | } | ||
720 | |||
721 | SET_ERROR_PARAMETER(error, TOX_ERR_SET_TYPING_OK); | ||
722 | return 1; | ||
723 | } | ||
724 | |||
725 | static void set_message_error(int ret, TOX_ERR_SEND_MESSAGE *error) | ||
726 | { | ||
727 | switch (ret) { | ||
728 | case 0: | ||
729 | SET_ERROR_PARAMETER(error, TOX_ERR_SEND_MESSAGE_OK); | ||
730 | break; | ||
731 | |||
732 | case -1: | ||
733 | SET_ERROR_PARAMETER(error, TOX_ERR_SEND_MESSAGE_FRIEND_NOT_FOUND); | ||
734 | break; | ||
735 | |||
736 | case -2: | ||
737 | SET_ERROR_PARAMETER(error, TOX_ERR_SEND_MESSAGE_TOO_LONG); | ||
738 | break; | ||
739 | |||
740 | case -3: | ||
741 | SET_ERROR_PARAMETER(error, TOX_ERR_SEND_MESSAGE_FRIEND_NOT_CONNECTED); | ||
742 | break; | ||
743 | |||
744 | case -4: | ||
745 | SET_ERROR_PARAMETER(error, TOX_ERR_SEND_MESSAGE_SENDQ); | ||
746 | break; | ||
747 | } | ||
748 | } | ||
749 | |||
750 | uint32_t tox_send_message(Tox *tox, uint32_t friend_number, const uint8_t *message, size_t length, | ||
751 | TOX_ERR_SEND_MESSAGE *error) | ||
752 | { | ||
753 | if (!message) { | ||
754 | SET_ERROR_PARAMETER(error, TOX_ERR_SEND_MESSAGE_NULL); | ||
755 | return 0; | ||
756 | } | ||
757 | |||
758 | if (!length) { | ||
759 | SET_ERROR_PARAMETER(error, TOX_ERR_SEND_MESSAGE_EMPTY); | ||
760 | return 0; | ||
761 | } | ||
762 | |||
763 | Messenger *m = tox; | ||
764 | uint32_t message_id = 0; | ||
765 | set_message_error(m_sendmessage(m, friend_number, message, length, &message_id), error); | ||
766 | return message_id; | ||
767 | } | ||
768 | |||
769 | uint32_t tox_send_action(Tox *tox, uint32_t friend_number, const uint8_t *action, size_t length, | ||
770 | TOX_ERR_SEND_MESSAGE *error) | ||
771 | { | ||
772 | if (!action) { | ||
773 | SET_ERROR_PARAMETER(error, TOX_ERR_SEND_MESSAGE_NULL); | ||
774 | return 0; | ||
775 | } | ||
776 | |||
777 | if (!length) { | ||
778 | SET_ERROR_PARAMETER(error, TOX_ERR_SEND_MESSAGE_EMPTY); | ||
779 | return 0; | ||
780 | } | ||
781 | |||
782 | Messenger *m = tox; | ||
783 | uint32_t message_id = 0; | ||
784 | set_message_error(m_sendaction(m, friend_number, action, length, &message_id), error); | ||
785 | return message_id; | ||
786 | } | ||
787 | |||
788 | void tox_callback_read_receipt(Tox *tox, tox_read_receipt_cb *function, void *user_data) | ||
789 | { | ||
790 | Messenger *m = tox; | ||
791 | m_callback_read_receipt(m, function, user_data); | ||
792 | } | ||
793 | |||
794 | |||