diff options
Diffstat (limited to 'protocols/Tox/include/tox.h')
| -rw-r--r-- | protocols/Tox/include/tox.h | 797 | 
1 files changed, 533 insertions, 264 deletions
diff --git a/protocols/Tox/include/tox.h b/protocols/Tox/include/tox.h index da328b89e9..9a6d3ecf79 100644 --- a/protocols/Tox/include/tox.h +++ b/protocols/Tox/include/tox.h @@ -66,23 +66,21 @@ extern "C" {   * function will try to use a sane default, but there will be no error code,   * and one possible action for the function to take is to have no effect.   */ -  /** \subsection events Events and callbacks   *   * Events are handled by callbacks. One callback can be registered per event. - * All events have a callback function type named `tox_${event}_cb` and a - * function to register it named `tox_callback_${event}`. Passing a NULL + * All events have a callback function type named `tox_{event}_cb` and a + * function to register it named `tox_callback_{event}`. Passing a NULL   * callback will result in no callback being registered for that event. Only   * one callback per event can be registered, so if a client needs multiple   * event listeners, it needs to implement the dispatch functionality itself.   */ -  /** \subsection threading Threading implications   *   * It is possible to run multiple concurrent threads with a Tox instance for   * each thread. It is also possible to run all Tox instances in the same thread.   * A common way to run Tox (multiple or single instance) is to have one thread - * running a simple tox_iteration loop, sleeping for tox_iteration_interval + * running a simple tox_iterate loop, sleeping for tox_iteration_interval   * milliseconds on each iteration.   *   * If you want to access a single Tox instance from multiple threads, access @@ -107,12 +105,9 @@ extern "C" {   * \endcode   *   * If any other thread calls tox_self_set_name while this thread is allocating - * memory, the length will have become invalid, and the call to + * memory, the length may have become invalid, and the call to   * tox_self_get_name may cause undefined behaviour.   */ - -#ifndef TOX_DEFINED -#define TOX_DEFINED  /**   * The Tox instance type. All the state associated with a connection is held   * within the instance. Multiple instances can exist and operate concurrently. @@ -120,8 +115,10 @@ extern "C" {   * device is limited. Note that this is not just a per-process limit, since the   * limiting factor is the number of usable ports on a device.   */ +#ifndef TOX_DEFINED +#define TOX_DEFINED  typedef struct Tox Tox; -#endif +#endif /* TOX_DEFINED */  /******************************************************************************* @@ -131,17 +128,20 @@ typedef struct Tox Tox;   ******************************************************************************/ +  /**   * The major version number. Incremented when the API or ABI changes in an   * incompatible way.   */  #define TOX_VERSION_MAJOR               0u +  /**   * The minor version number. Incremented when functionality is added without   * breaking the API or ABI. Set to 0 when the major version number is   * incremented.   */  #define TOX_VERSION_MINOR               0u +  /**   * The patch or revision number. Incremented when bugfixes are applied without   * changing any functionality or API or ABI. @@ -165,7 +165,6 @@ typedef struct Tox Tox;  #define TOX_VERSION_REQUIRE(MAJOR, MINOR, PATCH)                \    typedef char tox_required_version[TOX_IS_COMPATIBLE(MAJOR, MINOR, PATCH) ? 1 : -1] -  /**   * Return the major version number of the library. Can be used to display the   * Tox library version or to check whether the client is compatible with the @@ -204,15 +203,16 @@ bool tox_version_is_compatible(uint32_t major, uint32_t minor, uint32_t patch);   ******************************************************************************/ +  /**   * The size of a Tox Public Key in bytes.   */ -#define TOX_PUBLIC_KEY_SIZE              32 +#define TOX_PUBLIC_KEY_SIZE            32  /**   * The size of a Tox Secret Key in bytes.   */ -#define TOX_SECRET_KEY_SIZE              32 +#define TOX_SECRET_KEY_SIZE            32  /**   * The size of a Tox address in bytes. Tox addresses are in the format @@ -222,47 +222,48 @@ bool tox_version_is_compatible(uint32_t major, uint32_t minor, uint32_t patch);   * byte is an XOR of all the even bytes (0, 2, 4, ...), the second byte is an   * XOR of all the odd bytes (1, 3, 5, ...) of the Public Key and nospam.   */ -#define TOX_ADDRESS_SIZE                (TOX_PUBLIC_KEY_SIZE + sizeof(uint32_t) + sizeof(uint16_t)) +#define TOX_ADDRESS_SIZE               (TOX_PUBLIC_KEY_SIZE + sizeof(uint32_t) + sizeof(uint16_t))  /**   * Maximum length of a nickname in bytes.   */ -#define TOX_MAX_NAME_LENGTH             128 +#define TOX_MAX_NAME_LENGTH            128  /**   * Maximum length of a status message in bytes.   */ -#define TOX_MAX_STATUS_MESSAGE_LENGTH   1007 +#define TOX_MAX_STATUS_MESSAGE_LENGTH  1007  /**   * Maximum length of a friend request message in bytes.   */ -#define TOX_MAX_FRIEND_REQUEST_LENGTH   1016 +#define TOX_MAX_FRIEND_REQUEST_LENGTH  1016  /**   * Maximum length of a single message after which it should be split.   */ -#define TOX_MAX_MESSAGE_LENGTH          1372 +#define TOX_MAX_MESSAGE_LENGTH         1372  /**   * Maximum size of custom packets. TODO: should be LENGTH?   */ -#define TOX_MAX_CUSTOM_PACKET_SIZE      1373 +#define TOX_MAX_CUSTOM_PACKET_SIZE     1373  /**   * The number of bytes in a hash generated by tox_hash.   */ -#define TOX_HASH_LENGTH                 /*crypto_hash_sha256_BYTES*/ 32 +#define TOX_HASH_LENGTH                32  /**   * The number of bytes in a file id.   */ -#define TOX_FILE_ID_LENGTH              32 +#define TOX_FILE_ID_LENGTH             32  /** - * Maximum file name length for file tran. + * Maximum file name length for file transfers.   */ -#define TOX_MAX_FILENAME_LENGTH         255 +#define TOX_MAX_FILENAME_LENGTH        255 +  /*******************************************************************************   * @@ -271,42 +272,53 @@ bool tox_version_is_compatible(uint32_t major, uint32_t minor, uint32_t patch);   ******************************************************************************/ +  /**   * Represents the possible statuses a client can have.   */  typedef enum TOX_USER_STATUS { +      /**       * User is online and available.       */      TOX_USER_STATUS_NONE, +      /**       * User is away. Clients can set this e.g. after a user defined       * inactivity time.       */      TOX_USER_STATUS_AWAY, +      /**       * User is busy. Signals to other clients that this client does not       * currently wish to communicate.       */ -    TOX_USER_STATUS_BUSY +    TOX_USER_STATUS_BUSY, +  } TOX_USER_STATUS; +  /** - * Represents message types for friend messages and group chat + * Represents message types for tox_friend_send_message and group chat   * messages.   */  typedef enum TOX_MESSAGE_TYPE { +      /**       * Normal text message. Similar to PRIVMSG on IRC.       */      TOX_MESSAGE_TYPE_NORMAL, +      /**       * A message describing an user action. This is similar to /me (CTCP ACTION)       * on IRC.       */ -    TOX_MESSAGE_TYPE_ACTION +    TOX_MESSAGE_TYPE_ACTION, +  } TOX_MESSAGE_TYPE; + +  /*******************************************************************************   *   * :: Startup options @@ -314,28 +326,60 @@ typedef enum TOX_MESSAGE_TYPE {   ******************************************************************************/ + +/** + * Type of proxy used to connect to TCP relays. + */  typedef enum TOX_PROXY_TYPE { +      /**       * Don't use a proxy.       */      TOX_PROXY_TYPE_NONE, +      /**       * HTTP proxy using CONNECT.       */      TOX_PROXY_TYPE_HTTP, +      /**       * SOCKS proxy for simple socket pipes.       */ -    TOX_PROXY_TYPE_SOCKS5 +    TOX_PROXY_TYPE_SOCKS5, +  } TOX_PROXY_TYPE;  /** + * Type of savedata to create the Tox instance from. + */ +typedef enum TOX_SAVEDATA_TYPE { + +    /** +     * No savedata. +     */ +    TOX_SAVEDATA_TYPE_NONE, + +    /** +     * Savedata is one that was obtained from tox_get_savedata +     */ +    TOX_SAVEDATA_TYPE_TOX_SAVE, + +    /** +     * Savedata is a secret key of length TOX_SECRET_KEY_SIZE +     */ +    TOX_SAVEDATA_TYPE_SECRET_KEY, + +} TOX_SAVEDATA_TYPE; + + +/**   * This struct contains all the startup options for Tox. You can either allocate   * this object yourself, and pass it to tox_options_default, or call   * tox_options_new to get a new default options object.   */  struct Tox_Options { +      /**       * The type of socket to create.       * @@ -346,6 +390,7 @@ struct Tox_Options {       */      bool ipv6_enabled; +      /**       * Enable the use of UDP communication when available.       * @@ -355,11 +400,13 @@ struct Tox_Options {       */      bool udp_enabled; +      /**       * Pass communications through a proxy.       */      TOX_PROXY_TYPE proxy_type; +      /**       * The IP address or DNS name of the proxy to be used.       * @@ -367,18 +414,20 @@ struct Tox_Options {       * exceed 255 characters, and be in a NUL-terminated C string format       * (255 chars + 1 NUL byte).       * -     * This member is ignored (it can be NULL) if proxy_enabled is false. +     * This member is ignored (it can be NULL) if proxy_type is TOX_PROXY_TYPE_NONE.       */      const char *proxy_host; +      /**       * The port to use to connect to the proxy server.       *       * Ports must be in the range (1, 65535). The value is ignored if -     * proxy_enabled is false. +     * proxy_type is TOX_PROXY_TYPE_NONE.       */      uint16_t proxy_port; +      /**       * The start port of the inclusive port range to attempt to use.       * @@ -393,10 +442,36 @@ struct Tox_Options {       */      uint16_t start_port; +      /**       * The end port of the inclusive port range to attempt to use.       */      uint16_t end_port; + + +    /** +     * The port to use for the TCP server. If 0, the tcp server is disabled. +     */ +    uint16_t tcp_port; + + +    /** +     * The type of savedata to load from. +     */ +    TOX_SAVEDATA_TYPE savedata_type; + + +    /** +     * The savedata. +     */ +    const uint8_t *savedata_data; + + +    /** +     * The length of the savedata. +     */ +    size_t savedata_length; +  }; @@ -413,15 +488,21 @@ struct Tox_Options {   */  void tox_options_default(struct Tox_Options *options); -  typedef enum TOX_ERR_OPTIONS_NEW { + +    /** +     * The function returned successfully. +     */      TOX_ERR_OPTIONS_NEW_OK, +      /**       * The function failed to allocate enough memory for the options struct.       */ -    TOX_ERR_OPTIONS_NEW_MALLOC +    TOX_ERR_OPTIONS_NEW_MALLOC, +  } TOX_ERR_OPTIONS_NEW; +  /**   * Allocates a new Tox_Options object and initialises it with the default   * options. This function can be used to preserve long term ABI compatibility by @@ -434,7 +515,6 @@ typedef enum TOX_ERR_OPTIONS_NEW {   */  struct Tox_Options *tox_options_new(TOX_ERR_OPTIONS_NEW *error); -  /**   * Releases all resources associated with an options objects.   * @@ -451,41 +531,58 @@ void tox_options_free(struct Tox_Options *options);   ******************************************************************************/ +  typedef enum TOX_ERR_NEW { + +    /** +     * The function returned successfully. +     */      TOX_ERR_NEW_OK, + +    /** +     * One of the arguments to the function was NULL when it was not expected. +     */      TOX_ERR_NEW_NULL, +      /**       * The function was unable to allocate enough memory to store the internal       * structures for the Tox object.       */      TOX_ERR_NEW_MALLOC, +      /**       * The function was unable to bind to a port. This may mean that all ports       * have already been bound, e.g. by other Tox instances, or it may mean       * a permission error. You may be able to gather more information from errno.       */      TOX_ERR_NEW_PORT_ALLOC, +      /**       * proxy_type was invalid.       */      TOX_ERR_NEW_PROXY_BAD_TYPE, +      /**       * proxy_type was valid but the proxy_host passed had an invalid format       * or was NULL.       */      TOX_ERR_NEW_PROXY_BAD_HOST, +      /**       * proxy_type was valid, but the proxy_port was invalid.       */      TOX_ERR_NEW_PROXY_BAD_PORT, +      /** -     * The proxy host passed could not be resolved. +     * The proxy address passed could not be resolved.       */      TOX_ERR_NEW_PROXY_NOT_FOUND, +      /**       * The byte array to be loaded contained an encrypted save.       */      TOX_ERR_NEW_LOAD_ENCRYPTED, +      /**       * The data format was invalid. This can happen when loading data that was       * saved by an older version of Tox, or when the data has been corrupted. @@ -493,7 +590,8 @@ typedef enum TOX_ERR_NEW {       * and the rest is discarded. Passing an invalid length parameter also       * causes this error.       */ -    TOX_ERR_NEW_LOAD_BAD_FORMAT +    TOX_ERR_NEW_LOAD_BAD_FORMAT, +  } TOX_ERR_NEW; @@ -503,22 +601,15 @@ typedef enum TOX_ERR_NEW {   * This function will bring the instance into a valid state. Running the event   * loop with a new instance will operate correctly.   * - * If the data parameter is not NULL, this function will load the Tox instance - * from a byte array previously filled by tox_get_savedata. - *   * If loading failed or succeeded only partially, the new or partially loaded   * instance is returned and an error code is set.   *   * @param options An options object as described above. If this parameter is   *   NULL, the default options are used. - * @param data A byte array containing data previously stored by tox_get_savedata. - * @param length The length of the byte array data. If this parameter is 0, the - *   data parameter is ignored.   * - * @see tox_iteration for the event loop. + * @see tox_iterate for the event loop.   */ -Tox *tox_new(const struct Tox_Options *options, const uint8_t *data, size_t length, TOX_ERR_NEW *error); - +Tox *tox_new(const struct Tox_Options *options, TOX_ERR_NEW *error);  /**   * Releases all resources associated with the Tox instance and disconnects from @@ -529,11 +620,9 @@ Tox *tox_new(const struct Tox_Options *options, const uint8_t *data, size_t leng   */  void tox_kill(Tox *tox); -  /**   * Calculates the number of bytes required to store the tox instance with - * tox_get_savedata. This function cannot fail. The result is always greater - * than 0. + * tox_get_savedata. This function cannot fail. The result is always greater than 0.   *   * @see threading for concurrency implications.   */ @@ -546,7 +635,7 @@ size_t tox_get_savedata_size(const Tox *tox);   *   Call tox_get_savedata_size to find the number of bytes required. If this parameter   *   is NULL, this function has no effect.   */ -void tox_get_savedata(const Tox *tox, uint8_t *data); +void tox_get_savedata(const Tox *tox, uint8_t *savedata);  /******************************************************************************* @@ -556,20 +645,33 @@ void tox_get_savedata(const Tox *tox, uint8_t *data);   ******************************************************************************/ +  typedef enum TOX_ERR_BOOTSTRAP { + +    /** +     * The function returned successfully. +     */      TOX_ERR_BOOTSTRAP_OK, + +    /** +     * One of the arguments to the function was NULL when it was not expected. +     */      TOX_ERR_BOOTSTRAP_NULL, +      /** -     * The host could not be resolved to an IP address, or the IP address +     * The address could not be resolved to an IP address, or the IP address       * passed was invalid.       */      TOX_ERR_BOOTSTRAP_BAD_HOST, +      /**       * The port passed was invalid. The valid port range is (1, 65535).       */ -    TOX_ERR_BOOTSTRAP_BAD_PORT +    TOX_ERR_BOOTSTRAP_BAD_PORT, +  } TOX_ERR_BOOTSTRAP; +  /**   * Sends a "get nodes" request to the given bootstrap node with IP, port, and   * public key to setup connections. @@ -582,15 +684,14 @@ typedef enum TOX_ERR_BOOTSTRAP {   * also use the TCP connection when NAT hole punching is slow, and later switch   * to UDP if hole punching succeeds.   * - * @param host The hostname or IP address (IPv4 or IPv6) of the node. + * @param address The hostname or IP address (IPv4 or IPv6) of the node.   * @param port The port on the host on which the bootstrap Tox instance is   *   listening.   * @param public_key The long term public key of the bootstrap node   *   (TOX_PUBLIC_KEY_SIZE bytes).   * @return true on success.   */ -bool tox_bootstrap(Tox *tox, const char *host, uint16_t port, const uint8_t *public_key, TOX_ERR_BOOTSTRAP *error); - +bool tox_bootstrap(Tox *tox, const char *address, uint16_t port, const uint8_t *public_key, TOX_ERR_BOOTSTRAP *error);  /**   * Adds additional host:port pair as TCP relay. @@ -599,35 +700,41 @@ bool tox_bootstrap(Tox *tox, const char *host, uint16_t port, const uint8_t *pub   * the same bootstrap node, or to add TCP relays without using them as   * bootstrap nodes.   * - * @param host The hostname or IP address (IPv4 or IPv6) of the TCP relay. + * @param address The hostname or IP address (IPv4 or IPv6) of the TCP relay.   * @param port The port on the host on which the TCP relay is listening.   * @param public_key The long term public key of the TCP relay   *   (TOX_PUBLIC_KEY_SIZE bytes).   * @return true on success.   */ -bool tox_add_tcp_relay(Tox *tox, const char *host, uint16_t port, const uint8_t *public_key, +bool tox_add_tcp_relay(Tox *tox, const char *address, uint16_t port, const uint8_t *public_key,                         TOX_ERR_BOOTSTRAP *error); - +/** + * Protocols that can be used to connect to the network or friends. + */  typedef enum TOX_CONNECTION { +      /**       * There is no connection. This instance, or the friend the state change is       * about, is now offline.       */      TOX_CONNECTION_NONE, +      /**       * A TCP connection has been established. For the own instance, this means it       * is connected through a TCP relay, only. For a friend, this means that the       * connection to that particular friend goes through a TCP relay.       */      TOX_CONNECTION_TCP, +      /**       * A UDP connection has been established. For the own instance, this means it       * is able to send UDP packets to DHT nodes, but may still be connected to       * a TCP relay. For a friend, this means that the connection to that       * particular friend was built using direct UDP packets.       */ -    TOX_CONNECTION_UDP +    TOX_CONNECTION_UDP, +  } TOX_CONNECTION; @@ -638,13 +745,11 @@ typedef enum TOX_CONNECTION {  TOX_CONNECTION tox_self_get_connection_status(const Tox *tox);  /** - * The function type for the `self_connection_status` callback. - * - * @param connection_status Equal to the return value of - *   tox_self_get_connection_status. + * @param connection_status Whether we are connected to the DHT.   */  typedef void tox_self_connection_status_cb(Tox *tox, TOX_CONNECTION connection_status, void *user_data); +  /**   * Set the callback for the `self_connection_status` event. Pass NULL to unset.   * @@ -656,16 +761,14 @@ typedef void tox_self_connection_status_cb(Tox *tox, TOX_CONNECTION connection_s   *   * TODO: how long should a client wait before bootstrapping again?   */ -void tox_callback_self_connection_status(Tox *tox, tox_self_connection_status_cb *function, void *user_data); - +void tox_callback_self_connection_status(Tox *tox, tox_self_connection_status_cb *callback, void *user_data);  /** - * Return the time in milliseconds before tox_iteration() should be called again + * Return the time in milliseconds before tox_iterate() should be called again   * for optimal performance.   */  uint32_t tox_iteration_interval(const Tox *tox); -  /**   * The main loop that needs to be run in intervals of tox_iteration_interval()   * milliseconds. @@ -680,6 +783,7 @@ void tox_iterate(Tox *tox);   ******************************************************************************/ +  /**   * Writes the Tox friend address of the client to a byte array. The address is   * not in human-readable format. If a client wants to display the address, @@ -691,7 +795,6 @@ void tox_iterate(Tox *tox);   */  void tox_self_get_address(const Tox *tox, uint8_t *address); -  /**   * Set the 4-byte nospam part of the address.   * @@ -705,7 +808,7 @@ void tox_self_set_nospam(Tox *tox, uint32_t nospam);  uint32_t tox_self_get_nospam(const Tox *tox);  /** - * Copy the Tox Public Key (long term public key) from the Tox object. + * Copy the Tox Public Key (long term) from the Tox object.   *   * @param public_key A memory region of at least TOX_PUBLIC_KEY_SIZE bytes. If   *   this parameter is NULL, this function has no effect. @@ -713,7 +816,7 @@ uint32_t tox_self_get_nospam(const Tox *tox);  void tox_self_get_public_key(const Tox *tox, uint8_t *public_key);  /** - * Copy the secret key from the Tox object. + * Copy the Tox Secret Key from the Tox object.   *   * @param secret_key A memory region of at least TOX_SECRET_KEY_SIZE bytes. If   *   this parameter is NULL, this function has no effect. @@ -728,17 +831,28 @@ void tox_self_get_secret_key(const Tox *tox, uint8_t *secret_key);   ******************************************************************************/ +  /**   * Common error codes for all functions that set a piece of user-visible   * client information.   */  typedef enum TOX_ERR_SET_INFO { + +    /** +     * The function returned successfully. +     */      TOX_ERR_SET_INFO_OK, + +    /** +     * One of the arguments to the function was NULL when it was not expected. +     */      TOX_ERR_SET_INFO_NULL, +      /**       * Information length exceeded maximum permissible size.       */ -    TOX_ERR_SET_INFO_TOO_LONG +    TOX_ERR_SET_INFO_TOO_LONG, +  } TOX_ERR_SET_INFO; @@ -786,11 +900,10 @@ void tox_self_get_name(const Tox *tox, uint8_t *name);   * length is 0, the status parameter is ignored (it can be NULL), and the   * user status is set back to empty.   */ -bool tox_self_set_status_message(Tox *tox, const uint8_t *status, size_t length, TOX_ERR_SET_INFO *error); +bool tox_self_set_status_message(Tox *tox, const uint8_t *status_message, size_t length, TOX_ERR_SET_INFO *error);  /** - * Return the length of the current status message as passed to - * tox_self_set_status_message. + * Return the length of the current status message as passed to tox_self_set_status_message.   *   * If no status message was set before calling this function, the status   * is empty, and this function returns 0. @@ -805,21 +918,20 @@ size_t tox_self_get_status_message_size(const Tox *tox);   * If no status message was set before calling this function, the status is   * empty, and this function has no effect.   * - * Call tox_self_status_message_size to find out how much memory to allocate for + * Call tox_self_get_status_message_size to find out how much memory to allocate for   * the result.   *   * @param status A valid memory location large enough to hold the status message.   *   If this parameter is NULL, the function has no effect.   */ -void tox_self_get_status_message(const Tox *tox, uint8_t *status); - +void tox_self_get_status_message(const Tox *tox, uint8_t *status_message);  /**   * Set the client's user status.   *   * @param user_status One of the user statuses listed in the enumeration above.   */ -void tox_self_set_status(Tox *tox, TOX_USER_STATUS user_status); +void tox_self_set_status(Tox *tox, TOX_USER_STATUS status);  /**   * Returns the client's user status. @@ -834,42 +946,60 @@ TOX_USER_STATUS tox_self_get_status(const Tox *tox);   ******************************************************************************/ +  typedef enum TOX_ERR_FRIEND_ADD { + +    /** +     * The function returned successfully. +     */      TOX_ERR_FRIEND_ADD_OK, + +    /** +     * One of the arguments to the function was NULL when it was not expected. +     */      TOX_ERR_FRIEND_ADD_NULL, +      /**       * The length of the friend request message exceeded       * TOX_MAX_FRIEND_REQUEST_LENGTH.       */      TOX_ERR_FRIEND_ADD_TOO_LONG, +      /**       * The friend request message was empty. This, and the TOO_LONG code will       * never be returned from tox_friend_add_norequest.       */      TOX_ERR_FRIEND_ADD_NO_MESSAGE, +      /**       * The friend address belongs to the sending client.       */      TOX_ERR_FRIEND_ADD_OWN_KEY, +      /**       * A friend request has already been sent, or the address belongs to a friend       * that is already on the friend list.       */      TOX_ERR_FRIEND_ADD_ALREADY_SENT, +      /**       * The friend address checksum failed.       */      TOX_ERR_FRIEND_ADD_BAD_CHECKSUM, +      /**       * The friend was already there, but the nospam value was different.       */      TOX_ERR_FRIEND_ADD_SET_NEW_NOSPAM, +      /**       * A memory allocation failed when trying to increase the friend list size.       */ -    TOX_ERR_FRIEND_ADD_MALLOC +    TOX_ERR_FRIEND_ADD_MALLOC, +  } TOX_ERR_FRIEND_ADD; +  /**   * Add a friend to the friend list and send a friend request.   * @@ -896,7 +1026,6 @@ typedef enum TOX_ERR_FRIEND_ADD {  uint32_t tox_friend_add(Tox *tox, const uint8_t *address, const uint8_t *message, size_t length,                          TOX_ERR_FRIEND_ADD *error); -  /**   * Add a friend without sending a friend request.   * @@ -917,28 +1046,31 @@ uint32_t tox_friend_add(Tox *tox, const uint8_t *address, const uint8_t *message   */  uint32_t tox_friend_add_norequest(Tox *tox, const uint8_t *public_key, TOX_ERR_FRIEND_ADD *error); -  typedef enum TOX_ERR_FRIEND_DELETE { + +    /** +     * The function returned successfully. +     */      TOX_ERR_FRIEND_DELETE_OK, +      /**       * There was no friend with the given friend number. No friends were deleted.       */ -    TOX_ERR_FRIEND_DELETE_FRIEND_NOT_FOUND +    TOX_ERR_FRIEND_DELETE_FRIEND_NOT_FOUND, +  } TOX_ERR_FRIEND_DELETE; +  /**   * Remove a friend from the friend list. - * Other friend numbers are unchanged. - * The friend_number can be reused by toxcore as a friend number for a new friend.   *   * This does not notify the friend of their deletion. After calling this   * function, this client will appear offline to the friend and no communication   * can occur between the two.   * - * @friend_number Friend number for the friend to be deleted. + * @param friend_number Friend number for the friend to be deleted.   *   * @return true on success. - * @see tox_friend_add for detailed description of friend numbers.   */  bool tox_friend_delete(Tox *tox, uint32_t friend_number, TOX_ERR_FRIEND_DELETE *error); @@ -950,15 +1082,27 @@ bool tox_friend_delete(Tox *tox, uint32_t friend_number, TOX_ERR_FRIEND_DELETE *   ******************************************************************************/ +  typedef enum TOX_ERR_FRIEND_BY_PUBLIC_KEY { + +    /** +     * The function returned successfully. +     */      TOX_ERR_FRIEND_BY_PUBLIC_KEY_OK, + +    /** +     * One of the arguments to the function was NULL when it was not expected. +     */      TOX_ERR_FRIEND_BY_PUBLIC_KEY_NULL, +      /**       * No friend with the given Public Key exists on the friend list.       */ -    TOX_ERR_FRIEND_BY_PUBLIC_KEY_NOT_FOUND +    TOX_ERR_FRIEND_BY_PUBLIC_KEY_NOT_FOUND, +  } TOX_ERR_FRIEND_BY_PUBLIC_KEY; +  /**   * Return the friend number associated with that Public Key.   * @@ -967,15 +1111,45 @@ typedef enum TOX_ERR_FRIEND_BY_PUBLIC_KEY {   */  uint32_t tox_friend_by_public_key(const Tox *tox, const uint8_t *public_key, TOX_ERR_FRIEND_BY_PUBLIC_KEY *error); +/** + * Checks if a friend with the given friend number exists and returns true if + * it does. + */ +bool tox_friend_exists(const Tox *tox, uint32_t friend_number); + +/** + * Return the number of friends on the friend list. + * + * This function can be used to determine how much memory to allocate for + * tox_self_get_friend_list. + */ +size_t tox_self_get_friend_list_size(const Tox *tox); + +/** + * Copy a list of valid friend numbers into an array. + * + * Call tox_self_get_friend_list_size to determine the number of elements to allocate. + * + * @param list A memory region with enough space to hold the friend list. If + *   this parameter is NULL, this function has no effect. + */ +void tox_self_get_friend_list(const Tox *tox, uint32_t *friend_list);  typedef enum TOX_ERR_FRIEND_GET_PUBLIC_KEY { + +    /** +     * The function returned successfully. +     */      TOX_ERR_FRIEND_GET_PUBLIC_KEY_OK, +      /**       * No friend with the given number exists on the friend list.       */ -    TOX_ERR_FRIEND_GET_PUBLIC_KEY_FRIEND_NOT_FOUND +    TOX_ERR_FRIEND_GET_PUBLIC_KEY_FRIEND_NOT_FOUND, +  } TOX_ERR_FRIEND_GET_PUBLIC_KEY; +  /**   * Copies the Public Key associated with a given friend number to a byte array.   * @@ -988,21 +1162,21 @@ typedef enum TOX_ERR_FRIEND_GET_PUBLIC_KEY {  bool tox_friend_get_public_key(const Tox *tox, uint32_t friend_number, uint8_t *public_key,                                 TOX_ERR_FRIEND_GET_PUBLIC_KEY *error); - -/** - * Checks if a friend with the given friend number exists and returns true if - * it does. - */ -bool tox_friend_exists(const Tox *tox, uint32_t friend_number); -  typedef enum TOX_ERR_FRIEND_GET_LAST_ONLINE { + +    /** +     * The function returned successfully. +     */      TOX_ERR_FRIEND_GET_LAST_ONLINE_OK, +      /**       * No friend with the given number exists on the friend list.       */      TOX_ERR_FRIEND_GET_LAST_ONLINE_FRIEND_NOT_FOUND, +  } TOX_ERR_FRIEND_GET_LAST_ONLINE; +  /**   * Return a unix-time timestamp of the last time the friend associated with a given   * friend number was seen online. This function will return UINT64_MAX on error. @@ -1011,26 +1185,6 @@ typedef enum TOX_ERR_FRIEND_GET_LAST_ONLINE {   */  uint64_t tox_friend_get_last_online(const Tox *tox, uint32_t friend_number, TOX_ERR_FRIEND_GET_LAST_ONLINE *error); -/** - * Return the number of friends on the friend list. - * - * This function can be used to determine how much memory to allocate for - * tox_self_get_friend_list. - */ -size_t tox_self_get_friend_list_size(const Tox *tox); - - -/** - * Copy a list of valid friend numbers into an array. - * - * Call tox_self_get_friend_list_size to determine the number of elements to allocate. - * - * @param list A memory region with enough space to hold the friend list. If - *   this parameter is NULL, this function has no effect. - */ -void tox_self_get_friend_list(const Tox *tox, uint32_t *list); - -  /*******************************************************************************   * @@ -1039,27 +1193,35 @@ void tox_self_get_friend_list(const Tox *tox, uint32_t *list);   ******************************************************************************/ +  /**   * Common error codes for friend state query functions.   */  typedef enum TOX_ERR_FRIEND_QUERY { + +    /** +     * The function returned successfully. +     */      TOX_ERR_FRIEND_QUERY_OK, +      /**       * The pointer parameter for storing the query result (name, message) was       * NULL. Unlike the `_self_` variants of these functions, which have no effect       * when a parameter is NULL, these functions return an error in that case.       */      TOX_ERR_FRIEND_QUERY_NULL, +      /**       * The friend_number did not designate a valid friend.       */ -    TOX_ERR_FRIEND_QUERY_FRIEND_NOT_FOUND +    TOX_ERR_FRIEND_QUERY_FRIEND_NOT_FOUND, +  } TOX_ERR_FRIEND_QUERY;  /**   * Return the length of the friend's name. If the friend number is invalid, the - * return value is SIZE_MAX. + * return value is unspecified.   *   * The return value is equal to the `length` argument received by the last   * `friend_name` callback. @@ -1083,8 +1245,6 @@ size_t tox_friend_get_name_size(const Tox *tox, uint32_t friend_number, TOX_ERR_  bool tox_friend_get_name(const Tox *tox, uint32_t friend_number, uint8_t *name, TOX_ERR_FRIEND_QUERY *error);  /** - * The function type for the `friend_name` callback. - *   * @param friend_number The friend number of the friend whose name changed.   * @param name A byte array containing the same data as   *   tox_friend_get_name would write to its `name` parameter. @@ -1093,13 +1253,13 @@ bool tox_friend_get_name(const Tox *tox, uint32_t friend_number, uint8_t *name,   */  typedef void tox_friend_name_cb(Tox *tox, uint32_t friend_number, const uint8_t *name, size_t length, void *user_data); +  /**   * Set the callback for the `friend_name` event. Pass NULL to unset.   *   * This event is triggered when a friend changes their name.   */ -void tox_callback_friend_name(Tox *tox, tox_friend_name_cb *function, void *user_data); - +void tox_callback_friend_name(Tox *tox, tox_friend_name_cb *callback, void *user_data);  /**   * Return the length of the friend's status message. If the friend number is @@ -1111,37 +1271,35 @@ size_t tox_friend_get_status_message_size(const Tox *tox, uint32_t friend_number   * Write the name of the friend designated by the given friend number to a byte   * array.   * - * Call tox_friend_get_name_size to determine the allocation size for the `name` + * Call tox_friend_get_status_message_size to determine the allocation size for the `status_name`   * parameter.   * - * The data written to `message` is equal to the data received by the last + * The data written to `status_message` is equal to the data received by the last   * `friend_status_message` callback.   *   * @param name A valid memory region large enough to store the friend's name.   */ -bool tox_friend_get_status_message(const Tox *tox, uint32_t friend_number, uint8_t *message, +bool tox_friend_get_status_message(const Tox *tox, uint32_t friend_number, uint8_t *status_message,                                     TOX_ERR_FRIEND_QUERY *error);  /** - * The function type for the `friend_status_message` callback. - *   * @param friend_number The friend number of the friend whose status message   *   changed.   * @param message A byte array containing the same data as - *   tox_friend_get_status_message would write to its `message` parameter. + *   tox_friend_get_status_message would write to its `status_message` parameter.   * @param length A value equal to the return value of   *   tox_friend_get_status_message_size.   */  typedef void tox_friend_status_message_cb(Tox *tox, uint32_t friend_number, const uint8_t *message, size_t length, -                                          void *user_data); +        void *user_data); +  /**   * Set the callback for the `friend_status_message` event. Pass NULL to unset.   *   * This event is triggered when a friend changes their status message.   */ -void tox_callback_friend_status_message(Tox *tox, tox_friend_status_message_cb *function, void *user_data); - +void tox_callback_friend_status_message(Tox *tox, tox_friend_status_message_cb *callback, void *user_data);  /**   * Return the friend's user status (away/busy/...). If the friend number is @@ -1153,21 +1311,19 @@ void tox_callback_friend_status_message(Tox *tox, tox_friend_status_message_cb *  TOX_USER_STATUS tox_friend_get_status(const Tox *tox, uint32_t friend_number, TOX_ERR_FRIEND_QUERY *error);  /** - * The function type for the `friend_status` callback. - *   * @param friend_number The friend number of the friend whose user status   *   changed.   * @param status The new user status.   */  typedef void tox_friend_status_cb(Tox *tox, uint32_t friend_number, TOX_USER_STATUS status, void *user_data); +  /**   * Set the callback for the `friend_status` event. Pass NULL to unset.   *   * This event is triggered when a friend changes their user status.   */ -void tox_callback_friend_status(Tox *tox, tox_friend_status_cb *function, void *user_data); - +void tox_callback_friend_status(Tox *tox, tox_friend_status_cb *callback, void *user_data);  /**   * Check whether a friend is currently connected to this client. @@ -1184,28 +1340,25 @@ void tox_callback_friend_status(Tox *tox, tox_friend_status_cb *function, void *  TOX_CONNECTION tox_friend_get_connection_status(const Tox *tox, uint32_t friend_number, TOX_ERR_FRIEND_QUERY *error);  /** - * The function type for the `friend_connection_status` callback. - *   * @param friend_number The friend number of the friend whose connection status   *   changed.   * @param connection_status The result of calling   *   tox_friend_get_connection_status on the passed friend_number.   */  typedef void tox_friend_connection_status_cb(Tox *tox, uint32_t friend_number, TOX_CONNECTION connection_status, -                                             void *user_data); +        void *user_data); +  /** - * Set the callback for the `friend_connection_status` event. Pass NULL to - * unset. + * Set the callback for the `friend_connection_status` event. Pass NULL to unset.   *   * This event is triggered when a friend goes offline after having been online,   * or when a friend goes online.   *   * This callback is not called when adding friends. It is assumed that when - * adding friends, their connection status is offline. + * adding friends, their connection status is initially offline.   */ -void tox_callback_friend_connection_status(Tox *tox, tox_friend_connection_status_cb *function, void *user_data); - +void tox_callback_friend_connection_status(Tox *tox, tox_friend_connection_status_cb *callback, void *user_data);  /**   * Check whether a friend is currently typing a message. @@ -1219,8 +1372,6 @@ void tox_callback_friend_connection_status(Tox *tox, tox_friend_connection_statu  bool tox_friend_get_typing(const Tox *tox, uint32_t friend_number, TOX_ERR_FRIEND_QUERY *error);  /** - * The function type for the `friend_typing` callback. - *   * @param friend_number The friend number of the friend who started or stopped   *   typing.   * @param is_typing The result of calling tox_friend_get_typing on the passed @@ -1228,12 +1379,13 @@ bool tox_friend_get_typing(const Tox *tox, uint32_t friend_number, TOX_ERR_FRIEN   */  typedef void tox_friend_typing_cb(Tox *tox, uint32_t friend_number, bool is_typing, void *user_data); +  /**   * Set the callback for the `friend_typing` event. Pass NULL to unset.   *   * This event is triggered when a friend starts or stops typing.   */ -void tox_callback_friend_typing(Tox *tox, tox_friend_typing_cb *function, void *user_data); +void tox_callback_friend_typing(Tox *tox, tox_friend_typing_cb *callback, void *user_data);  /******************************************************************************* @@ -1243,90 +1395,115 @@ void tox_callback_friend_typing(Tox *tox, tox_friend_typing_cb *function, void *   ******************************************************************************/ +  typedef enum TOX_ERR_SET_TYPING { + +    /** +     * The function returned successfully. +     */      TOX_ERR_SET_TYPING_OK, +      /**       * The friend number did not designate a valid friend.       */ -    TOX_ERR_SET_TYPING_FRIEND_NOT_FOUND +    TOX_ERR_SET_TYPING_FRIEND_NOT_FOUND, +  } TOX_ERR_SET_TYPING; +  /**   * Set the client's typing status for a friend.   *   * The client is responsible for turning it on or off.   *   * @param friend_number The friend to which the client is typing a message. - * @param is_typing The typing status. True means the client is typing. + * @param typing The typing status. True means the client is typing.   *   * @return true on success.   */ -bool tox_self_set_typing(Tox *tox, uint32_t friend_number, bool is_typing, TOX_ERR_SET_TYPING *error); - +bool tox_self_set_typing(Tox *tox, uint32_t friend_number, bool typing, TOX_ERR_SET_TYPING *error);  typedef enum TOX_ERR_FRIEND_SEND_MESSAGE { + +    /** +     * The function returned successfully. +     */      TOX_ERR_FRIEND_SEND_MESSAGE_OK, + +    /** +     * One of the arguments to the function was NULL when it was not expected. +     */      TOX_ERR_FRIEND_SEND_MESSAGE_NULL, +      /**       * The friend number did not designate a valid friend.       */      TOX_ERR_FRIEND_SEND_MESSAGE_FRIEND_NOT_FOUND, +      /**       * This client is currently not connected to the friend.       */      TOX_ERR_FRIEND_SEND_MESSAGE_FRIEND_NOT_CONNECTED, +      /**       * An allocation error occurred while increasing the send queue size.       */      TOX_ERR_FRIEND_SEND_MESSAGE_SENDQ, +      /**       * Message length exceeded TOX_MAX_MESSAGE_LENGTH.       */      TOX_ERR_FRIEND_SEND_MESSAGE_TOO_LONG, +      /**       * Attempted to send a zero-length message.       */ -    TOX_ERR_FRIEND_SEND_MESSAGE_EMPTY +    TOX_ERR_FRIEND_SEND_MESSAGE_EMPTY, +  } TOX_ERR_FRIEND_SEND_MESSAGE; +  /**   * Send a text chat message to an online friend.   *   * This function creates a chat message packet and pushes it into the send   * queue.   * - * Type corresponds to the message type, for a list of valid types see TOX_MESSAGE_TYPE. - *   * The message length may not exceed TOX_MAX_MESSAGE_LENGTH. Larger messages   * must be split by the client and sent as separate messages. Other clients can   * then reassemble the fragments. Messages may not be empty.   *   * The return value of this function is the message ID. If a read receipt is - * received, the triggered `read_receipt` event will be passed this message ID. + * received, the triggered `friend_read_receipt` event will be passed this message ID.   *   * Message IDs are unique per friend. The first message ID is 0. Message IDs are   * incremented by 1 each time a message is sent. If UINT32_MAX messages were   * sent, the next message ID is 0. + * + * @param type Message type (normal, action, ...). + * @param friend_number The friend number of the friend to send the message to. + * @param message A non-NULL pointer to the first element of a byte array + *   containing the message text. + * @param length Length of the message to be sent.   */  uint32_t tox_friend_send_message(Tox *tox, uint32_t friend_number, TOX_MESSAGE_TYPE type, const uint8_t *message,                                   size_t length, TOX_ERR_FRIEND_SEND_MESSAGE *error);  /** - * The function type for the `read_receipt` callback. - *   * @param friend_number The friend number of the friend who received the message.   * @param message_id The message ID as returned from tox_friend_send_message   *   corresponding to the message sent.   */  typedef void tox_friend_read_receipt_cb(Tox *tox, uint32_t friend_number, uint32_t message_id, void *user_data); +  /** - * Set the callback for the `read_receipt` event. Pass NULL to unset. + * Set the callback for the `friend_read_receipt` event. Pass NULL to unset.   *   * This event is triggered when the friend receives the message sent with   * tox_friend_send_message with the corresponding message ID.   */ -void tox_callback_friend_read_receipt(Tox *tox, tox_friend_read_receipt_cb *function, void *user_data); +void tox_callback_friend_read_receipt(Tox *tox, tox_friend_read_receipt_cb *callback, void *user_data);  /******************************************************************************* @@ -1336,41 +1513,46 @@ void tox_callback_friend_read_receipt(Tox *tox, tox_friend_read_receipt_cb *func   ******************************************************************************/ +  /** - * The function type for the `friend_request` callback. - *   * @param public_key The Public Key of the user who sent the friend request. + * @param time_delta A delta in seconds between when the message was composed + *   and when it is being transmitted. For messages that are sent immediately, + *   it will be 0. If a message was written and couldn't be sent immediately + *   (due to a connection failure, for example), the time_delta is an + *   approximation of when it was composed.   * @param message The message they sent along with the request.   * @param length The size of the message byte array.   */  typedef void tox_friend_request_cb(Tox *tox, const uint8_t *public_key, const uint8_t *message, size_t length,                                     void *user_data); +  /**   * Set the callback for the `friend_request` event. Pass NULL to unset.   *   * This event is triggered when a friend request is received.   */ -void tox_callback_friend_request(Tox *tox, tox_friend_request_cb *function, void *user_data); - +void tox_callback_friend_request(Tox *tox, tox_friend_request_cb *callback, void *user_data);  /** - * The function type for the `friend_message` callback. - *   * @param friend_number The friend number of the friend who sent the message. - * @param type The message type, for a list of valid types see TOX_MESSAGE_TYPE. + * @param time_delta Time between composition and sending.   * @param message The message data they sent.   * @param length The size of the message byte array. + * + * @see friend_request for more information on time_delta.   */  typedef void tox_friend_message_cb(Tox *tox, uint32_t friend_number, TOX_MESSAGE_TYPE type, const uint8_t *message,                                     size_t length, void *user_data); +  /**   * Set the callback for the `friend_message` event. Pass NULL to unset.   *   * This event is triggered when a message from a friend is received.   */ -void tox_callback_friend_message(Tox *tox, tox_friend_message_cb *function, void *user_data); +void tox_callback_friend_message(Tox *tox, tox_friend_message_cb *callback, void *user_data);  /******************************************************************************* @@ -1380,12 +1562,36 @@ void tox_callback_friend_message(Tox *tox, tox_friend_message_cb *function, void   ******************************************************************************/ + +/** + * Generates a cryptographic hash of the given data. + * + * This function may be used by clients for any purpose, but is provided + * primarily for validating cached avatars. This use is highly recommended to + * avoid unnecessary avatar updates. + * + * If hash is NULL or data is NULL while length is not 0 the function returns false, + * otherwise it returns true. + * + * This function is a wrapper to internal message-digest functions. + * + * @param hash A valid memory location the hash data. It must be at least + *   TOX_HASH_LENGTH bytes in size. + * @param data Data to be hashed or NULL. + * @param length Size of the data array or 0. + * + * @return true if hash was not NULL. + */ +bool tox_hash(uint8_t *hash, const uint8_t *data, size_t length); +  enum TOX_FILE_KIND { +      /**       * Arbitrary file data. Clients can choose to handle it based on the file name       * or magic or any other way they choose.       */      TOX_FILE_KIND_DATA, +      /**       * Avatar filename. This consists of tox_hash(image).       * Avatar data. This consists of the image data. @@ -1403,41 +1609,22 @@ enum TOX_FILE_KIND {       * this hash with a saved hash and send TOX_FILE_CONTROL_CANCEL to terminate the avatar       * transfer if it matches.       * -     * When file_size is set to 0 in the transfer request it means that the client has no -     * avatar. +     * When file_size is set to 0 in the transfer request it means that the client +     * has no avatar.       */ -    TOX_FILE_KIND_AVATAR -}; - +    TOX_FILE_KIND_AVATAR, -/** - * Generates a cryptographic hash of the given data. - * - * This function may be used by clients for any purpose, but is provided - * primarily for validating cached avatars. This use is highly recommended to - * avoid unnecessary avatar updates. - * - * If length is zero or data is NULL, the hash will contain all zero. If hash is - * NULL, the function returns false, otherwise it returns true. - * - * This function is a wrapper to internal message-digest functions. - * - * @param hash A valid memory location the hash data. It must be at least - *   TOX_HASH_LENGTH bytes in size. - * @param data Data to be hashed or NULL. - * @param length Size of the data array or 0. - * - * @return true if hash was not NULL. - */ -bool tox_hash(uint8_t *hash, const uint8_t *data, size_t length); +};  typedef enum TOX_FILE_CONTROL { +      /**       * Sent by the receiving side to accept a file send request. Also sent after a       * TOX_FILE_CONTROL_PAUSE command to continue sending or receiving.       */      TOX_FILE_CONTROL_RESUME, +      /**       * Sent by clients to pause the file transfer. The initial state of a file       * transfer is always paused on the receiving side and running on the sending @@ -1445,47 +1632,62 @@ typedef enum TOX_FILE_CONTROL {       * need to send TOX_FILE_CONTROL_RESUME for the transfer to resume.       */      TOX_FILE_CONTROL_PAUSE, +      /**       * Sent by the receiving side to reject a file send request before any other       * commands are sent. Also sent by either side to terminate a file transfer.       */ -    TOX_FILE_CONTROL_CANCEL +    TOX_FILE_CONTROL_CANCEL, +  } TOX_FILE_CONTROL;  typedef enum TOX_ERR_FILE_CONTROL { + +    /** +     * The function returned successfully. +     */      TOX_ERR_FILE_CONTROL_OK, +      /**       * The friend_number passed did not designate a valid friend.       */      TOX_ERR_FILE_CONTROL_FRIEND_NOT_FOUND, +      /**       * This client is currently not connected to the friend.       */      TOX_ERR_FILE_CONTROL_FRIEND_NOT_CONNECTED, +      /**       * No file transfer with the given file number was found for the given friend.       */      TOX_ERR_FILE_CONTROL_NOT_FOUND, +      /**       * A RESUME control was sent, but the file transfer is running normally.       */      TOX_ERR_FILE_CONTROL_NOT_PAUSED, +      /**       * A RESUME control was sent, but the file transfer was paused by the other       * party. Only the party that paused the transfer can resume it.       */      TOX_ERR_FILE_CONTROL_DENIED, +      /**       * A PAUSE control was sent, but the file transfer was already paused.       */      TOX_ERR_FILE_CONTROL_ALREADY_PAUSED, +      /**       * Packet queue is full.       */ -    TOX_ERR_FILE_CONTROL_SENDQ +    TOX_ERR_FILE_CONTROL_SENDQ, +  } TOX_ERR_FILE_CONTROL; +  /**   * Sends a file control command to a friend for a given file transfer.   * @@ -1499,10 +1701,7 @@ typedef enum TOX_ERR_FILE_CONTROL {  bool tox_file_control(Tox *tox, uint32_t friend_number, uint32_t file_number, TOX_FILE_CONTROL control,                        TOX_ERR_FILE_CONTROL *error); -  /** - * The function type for the `file_control` callback. - *   * When receiving TOX_FILE_CONTROL_CANCEL, the client should release the   * resources associated with the file number and consider the transfer failed.   * @@ -1514,43 +1713,55 @@ bool tox_file_control(Tox *tox, uint32_t friend_number, uint32_t file_number, TO  typedef void tox_file_recv_control_cb(Tox *tox, uint32_t friend_number, uint32_t file_number, TOX_FILE_CONTROL control,                                        void *user_data); +  /** - * Set the callback for the `file_control` event. Pass NULL to unset. + * Set the callback for the `file_recv_control` event. Pass NULL to unset.   *   * This event is triggered when a file control command is received from a   * friend.   */ -void tox_callback_file_recv_control(Tox *tox, tox_file_recv_control_cb *function, void *user_data); - +void tox_callback_file_recv_control(Tox *tox, tox_file_recv_control_cb *callback, void *user_data);  typedef enum TOX_ERR_FILE_SEEK { + +    /** +     * The function returned successfully. +     */      TOX_ERR_FILE_SEEK_OK, +      /**       * The friend_number passed did not designate a valid friend.       */      TOX_ERR_FILE_SEEK_FRIEND_NOT_FOUND, +      /**       * This client is currently not connected to the friend.       */      TOX_ERR_FILE_SEEK_FRIEND_NOT_CONNECTED, +      /**       * No file transfer with the given file number was found for the given friend.       */      TOX_ERR_FILE_SEEK_NOT_FOUND, +      /**       * File was not in a state where it could be seeked.       */      TOX_ERR_FILE_SEEK_DENIED, +      /**       * Seek position was invalid       */      TOX_ERR_FILE_SEEK_INVALID_POSITION, +      /**       * Packet queue is full.       */ -    TOX_ERR_FILE_SEEK_SENDQ +    TOX_ERR_FILE_SEEK_SENDQ, +  } TOX_ERR_FILE_SEEK; +  /**   * Sends a file seek control command to a friend for a given file transfer.   * @@ -1562,26 +1773,33 @@ typedef enum TOX_ERR_FILE_SEEK {   * @param file_number The friend-specific identifier for the file transfer.   * @param position The position that the file should be seeked to.   */ -bool tox_file_seek(Tox *tox, uint32_t friend_number, uint32_t file_number, uint64_t position, -                   TOX_ERR_FILE_SEEK *error); +bool tox_file_seek(Tox *tox, uint32_t friend_number, uint32_t file_number, uint64_t position, TOX_ERR_FILE_SEEK *error);  typedef enum TOX_ERR_FILE_GET { + +    /** +     * The function returned successfully. +     */      TOX_ERR_FILE_GET_OK, +      /**       * The friend_number passed did not designate a valid friend.       */      TOX_ERR_FILE_GET_FRIEND_NOT_FOUND, +      /**       * No file transfer with the given file number was found for the given friend.       */ -    TOX_ERR_FILE_GET_NOT_FOUND +    TOX_ERR_FILE_GET_NOT_FOUND, +  } TOX_ERR_FILE_GET; +  /**   * Copy the file id associated to the file transfer to a byte array.   *   * @param friend_number The friend number of the friend the file is being - *   transferred to. + *   transferred to or received from.   * @param file_number The friend-specific identifier for the file transfer.   * @param file_id A memory region of at least TOX_FILE_ID_LENGTH bytes. If   *   this parameter is NULL, this function has no effect. @@ -1591,6 +1809,7 @@ typedef enum TOX_ERR_FILE_GET {  bool tox_file_get_file_id(const Tox *tox, uint32_t friend_number, uint32_t file_number, uint8_t *file_id,                            TOX_ERR_FILE_GET *error); +  /*******************************************************************************   *   * :: File transmission: sending @@ -1598,36 +1817,51 @@ bool tox_file_get_file_id(const Tox *tox, uint32_t friend_number, uint32_t file_   ******************************************************************************/ +  typedef enum TOX_ERR_FILE_SEND { + +    /** +     * The function returned successfully. +     */      TOX_ERR_FILE_SEND_OK, + +    /** +     * One of the arguments to the function was NULL when it was not expected. +     */      TOX_ERR_FILE_SEND_NULL, +      /**       * The friend_number passed did not designate a valid friend.       */      TOX_ERR_FILE_SEND_FRIEND_NOT_FOUND, +      /**       * This client is currently not connected to the friend.       */      TOX_ERR_FILE_SEND_FRIEND_NOT_CONNECTED, +      /**       * Filename length exceeded TOX_MAX_FILENAME_LENGTH bytes.       */      TOX_ERR_FILE_SEND_NAME_TOO_LONG, +      /**       * Too many ongoing transfers. The maximum number of concurrent file transfers       * is 256 per friend per direction (sending and receiving).       */ -    TOX_ERR_FILE_SEND_TOO_MANY +    TOX_ERR_FILE_SEND_TOO_MANY, +  } TOX_ERR_FILE_SEND; +  /**   * Send a file transmission request.   * - * Maximum filename length is TOX_MAX_FILENAME_LENGTH bytes. The filename should generally just be - * a file name, not a path with directory names. + * Maximum filename length is TOX_MAX_FILENAME_LENGTH bytes. The filename + * should generally just be a file name, not a path with directory names.   * - * If a non-zero file size is provided, this can be used by both sides to - * determine the sending progress. File size can be set to zero for streaming + * If a non-UINT64_MAX file size is provided, it can be used by both sides to + * determine the sending progress. File size can be set to UINT64_MAX for streaming   * data of unknown size.   *   * File transmission occurs in chunks, which are requested through the @@ -1641,13 +1875,14 @@ typedef enum TOX_ERR_FILE_SEND {   * was modified and how the client determines the file size.   *   * - If the file size was increased - *   - and sending mode was streaming (file_size = UINT64_MAX), the behaviour will be as - *     expected. - *   - and sending mode was file (file_size != UINT64_MAX), the file_chunk_request - *     callback will receive length = 0 when Core thinks the file transfer has - *     finished. If the client remembers the file size as it was when sending - *     the request, it will terminate the transfer normally. If the client - *     re-reads the size, it will think the friend cancelled the transfer. + *   - and sending mode was streaming (file_size = UINT64_MAX), the behaviour + *     will be as expected. + *   - and sending mode was file (file_size != UINT64_MAX), the + *     file_chunk_request callback will receive length = 0 when Core thinks + *     the file transfer has finished. If the client remembers the file size as + *     it was when sending the request, it will terminate the transfer normally. + *     If the client re-reads the size, it will think the friend cancelled the + *     transfer.   * - If the file size was decreased   *   - and sending mode was streaming, the behaviour is as expected.   *   - and sending mode was file, the callback will return 0 at the new @@ -1675,52 +1910,65 @@ typedef enum TOX_ERR_FILE_SEND {   *   * @return A file number used as an identifier in subsequent callbacks. This   *   number is per friend. File numbers are reused after a transfer terminates. - *   on failure, this function returns UINT32_MAX. Any pattern in file numbers + *   On failure, this function returns UINT32_MAX. Any pattern in file numbers   *   should not be relied on.   */  uint32_t tox_file_send(Tox *tox, uint32_t friend_number, uint32_t kind, uint64_t file_size, const uint8_t *file_id,                         const uint8_t *filename, size_t filename_length, TOX_ERR_FILE_SEND *error); -  typedef enum TOX_ERR_FILE_SEND_CHUNK { + +    /** +     * The function returned successfully. +     */      TOX_ERR_FILE_SEND_CHUNK_OK, +      /**       * The length parameter was non-zero, but data was NULL.       */      TOX_ERR_FILE_SEND_CHUNK_NULL, +      /**       * The friend_number passed did not designate a valid friend.       */      TOX_ERR_FILE_SEND_CHUNK_FRIEND_NOT_FOUND, +      /**       * This client is currently not connected to the friend.       */      TOX_ERR_FILE_SEND_CHUNK_FRIEND_NOT_CONNECTED, +      /**       * No file transfer with the given file number was found for the given friend.       */      TOX_ERR_FILE_SEND_CHUNK_NOT_FOUND, +      /**       * File transfer was found but isn't in a transferring state: (paused, done,       * broken, etc...) (happens only when not called from the request chunk callback).       */      TOX_ERR_FILE_SEND_CHUNK_NOT_TRANSFERRING, +      /**       * Attempted to send more or less data than requested. The requested data size is       * adjusted according to maximum transmission unit and the expected end of       * the file. Trying to send less or more than requested will return this error.       */      TOX_ERR_FILE_SEND_CHUNK_INVALID_LENGTH, +      /**       * Packet queue is full.       */      TOX_ERR_FILE_SEND_CHUNK_SENDQ, +      /**       * Position parameter was wrong.       */ -    TOX_ERR_FILE_SEND_CHUNK_WRONG_POSITION +    TOX_ERR_FILE_SEND_CHUNK_WRONG_POSITION, +  } TOX_ERR_FILE_SEND_CHUNK; +  /**   * Send a chunk of file data to a friend.   * @@ -1740,10 +1988,7 @@ typedef enum TOX_ERR_FILE_SEND_CHUNK {  bool tox_file_send_chunk(Tox *tox, uint32_t friend_number, uint32_t file_number, uint64_t position, const uint8_t *data,                           size_t length, TOX_ERR_FILE_SEND_CHUNK *error); -  /** - * The function type for the `file_chunk_request` callback. - *   * If the length parameter is 0, the file transfer is finished, and the client's   * resources associated with the file number should be released. After a call   * with zero length, the file number can be reused for future file transfers. @@ -1768,10 +2013,13 @@ bool tox_file_send_chunk(Tox *tox, uint32_t friend_number, uint32_t file_number,  typedef void tox_file_chunk_request_cb(Tox *tox, uint32_t friend_number, uint32_t file_number, uint64_t position,                                         size_t length, void *user_data); +  /**   * Set the callback for the `file_chunk_request` event. Pass NULL to unset. + * + * This event is triggered when Core is ready to send more file data.   */ -void tox_callback_file_chunk_request(Tox *tox, tox_file_chunk_request_cb *function, void *user_data); +void tox_callback_file_chunk_request(Tox *tox, tox_file_chunk_request_cb *callback, void *user_data);  /******************************************************************************* @@ -1781,12 +2029,8 @@ void tox_callback_file_chunk_request(Tox *tox, tox_file_chunk_request_cb *functi   ******************************************************************************/ +  /** - * The function type for the `file_receive` callback. - * - * Maximum filename length is TOX_MAX_FILENAME_LENGTH bytes. The filename should generally just be - * a file name, not a path with directory names. - *   * The client should acquire resources to be associated with the file transfer.   * Incoming file transfers start in the PAUSED state. After this callback   * returns, a transfer can be rejected by sending a TOX_FILE_CONTROL_CANCEL @@ -1798,27 +2042,24 @@ void tox_callback_file_chunk_request(Tox *tox, tox_file_chunk_request_cb *functi   * @param file_number The friend-specific file number the data received is   *   associated with.   * @param kind The meaning of the file to be sent. - * @param file_size Size in bytes of the file about to be received from the client, + * @param file_size Size in bytes of the file the client wants to send,   *   UINT64_MAX if unknown or streaming. + * @param filename Name of the file. Does not need to be the actual name. This + *   name will be sent along with the file send request.   * @param filename_length Size in bytes of the filename.   */ -typedef void tox_file_recv_cb(Tox *tox, uint32_t friend_number, uint32_t file_number, uint32_t kind, -                              uint64_t file_size, const uint8_t *filename, size_t filename_length, void *user_data); +typedef void tox_file_recv_cb(Tox *tox, uint32_t friend_number, uint32_t file_number, uint32_t kind, uint64_t file_size, +                              const uint8_t *filename, size_t filename_length, void *user_data); +  /** - * Set the callback for the `file_receive` event. Pass NULL to unset. + * Set the callback for the `file_recv` event. Pass NULL to unset.   *   * This event is triggered when a file transfer request is received.   */ -void tox_callback_file_recv(Tox *tox, tox_file_recv_cb *function, void *user_data); - +void tox_callback_file_recv(Tox *tox, tox_file_recv_cb *callback, void *user_data);  /** - * The function type for the `file_receive_chunk` callback. - * - * This function is first called when a file transfer request is received, and - * subsequently when a chunk of file data for an accepted request was received. - *   * When length is 0, the transfer is finished and the client should release the   * resources it acquired for the transfer. After a call with length = 0, the   * file number can be reused for new file transfers. @@ -1837,10 +2078,14 @@ void tox_callback_file_recv(Tox *tox, tox_file_recv_cb *function, void *user_dat  typedef void tox_file_recv_chunk_cb(Tox *tox, uint32_t friend_number, uint32_t file_number, uint64_t position,                                      const uint8_t *data, size_t length, void *user_data); +  /** - * Set the callback for the `file_receive_chunk` event. Pass NULL to unset. + * Set the callback for the `file_recv_chunk` event. Pass NULL to unset. + * + * This event is first triggered when a file transfer request is received, and + * subsequently when a chunk of file data for an accepted request was received.   */ -void tox_callback_file_recv_chunk(Tox *tox, tox_file_recv_chunk_cb *function, void *user_data); +void tox_callback_file_recv_chunk(Tox *tox, tox_file_recv_chunk_cb *callback, void *user_data);  /******************************************************************************* @@ -1850,13 +2095,16 @@ void tox_callback_file_recv_chunk(Tox *tox, tox_file_recv_chunk_cb *function, vo   ******************************************************************************/ -/****************************************************************************** + + +/*******************************************************************************   *   * :: Group chat message sending and receiving   *   ******************************************************************************/ -/* See: tox_old.h for now. */ + +  /*******************************************************************************   * @@ -1865,34 +2113,50 @@ void tox_callback_file_recv_chunk(Tox *tox, tox_file_recv_chunk_cb *function, vo   ******************************************************************************/ +  typedef enum TOX_ERR_FRIEND_CUSTOM_PACKET { + +    /** +     * The function returned successfully. +     */      TOX_ERR_FRIEND_CUSTOM_PACKET_OK, + +    /** +     * One of the arguments to the function was NULL when it was not expected. +     */      TOX_ERR_FRIEND_CUSTOM_PACKET_NULL, +      /**       * The friend number did not designate a valid friend.       */      TOX_ERR_FRIEND_CUSTOM_PACKET_FRIEND_NOT_FOUND, +      /**       * This client is currently not connected to the friend.       */      TOX_ERR_FRIEND_CUSTOM_PACKET_FRIEND_NOT_CONNECTED, +      /**       * The first byte of data was not in the specified range for the packet type.       * This range is 200-254 for lossy, and 160-191 for lossless packets.       */      TOX_ERR_FRIEND_CUSTOM_PACKET_INVALID, +      /**       * Attempted to send an empty packet.       */      TOX_ERR_FRIEND_CUSTOM_PACKET_EMPTY, +      /**       * Packet data length exceeded TOX_MAX_CUSTOM_PACKET_SIZE.       */      TOX_ERR_FRIEND_CUSTOM_PACKET_TOO_LONG, +      /** -     * Send queue size exceeded. +     * Packet queue is full.       */ -    TOX_ERR_FRIEND_CUSTOM_PACKET_SENDQ +    TOX_ERR_FRIEND_CUSTOM_PACKET_SENDQ, +  } TOX_ERR_FRIEND_CUSTOM_PACKET; @@ -1920,22 +2184,6 @@ bool tox_friend_send_lossy_packet(Tox *tox, uint32_t friend_number, const uint8_                                    TOX_ERR_FRIEND_CUSTOM_PACKET *error);  /** - * The function type for the `friend_lossy_packet` callback. - * - * @param friend_number The friend number of the friend who sent a lossy packet. - * @param data A byte array containing the received packet data. - * @param length The length of the packet data byte array. - */ -typedef void tox_friend_lossy_packet_cb(Tox *tox, uint32_t friend_number, const uint8_t *data, size_t length, -                                        void *user_data); - -/** - * Set the callback for the `friend_lossy_packet` event. Pass NULL to unset. - */ -void tox_callback_friend_lossy_packet(Tox *tox, tox_friend_lossy_packet_cb *function, void *user_data); - - -/**   * Send a custom lossless packet to a friend.   *   * The first byte of data must be in the range 160-191. Maximum length of a @@ -1955,20 +2203,34 @@ bool tox_friend_send_lossless_packet(Tox *tox, uint32_t friend_number, const uin                                       TOX_ERR_FRIEND_CUSTOM_PACKET *error);  /** - * The function type for the `friend_lossless_packet` callback. + * @param friend_number The friend number of the friend who sent a lossy packet. + * @param data A byte array containing the received packet data. + * @param length The length of the packet data byte array. + */ +typedef void tox_friend_lossy_packet_cb(Tox *tox, uint32_t friend_number, const uint8_t *data, size_t length, +                                        void *user_data); + + +/** + * Set the callback for the `friend_lossy_packet` event. Pass NULL to unset.   * + */ +void tox_callback_friend_lossy_packet(Tox *tox, tox_friend_lossy_packet_cb *callback, void *user_data); + +/**   * @param friend_number The friend number of the friend who sent the packet.   * @param data A byte array containing the received packet data.   * @param length The length of the packet data byte array.   */  typedef void tox_friend_lossless_packet_cb(Tox *tox, uint32_t friend_number, const uint8_t *data, size_t length, -                                           void *user_data); +        void *user_data); +  /**   * Set the callback for the `friend_lossless_packet` event. Pass NULL to unset. + *   */ -void tox_callback_friend_lossless_packet(Tox *tox, tox_friend_lossless_packet_cb *function, void *user_data); - +void tox_callback_friend_lossless_packet(Tox *tox, tox_friend_lossless_packet_cb *callback, void *user_data);  /******************************************************************************* @@ -1978,11 +2240,12 @@ void tox_callback_friend_lossless_packet(Tox *tox, tox_friend_lossless_packet_cb   ******************************************************************************/ +  /**   * Writes the temporary DHT public key of this instance to a byte array.   *   * This can be used in combination with an externally accessible IP address and - * the bound port (from tox_get_udp_port) to run a temporary bootstrap node. + * the bound port (from tox_self_get_udp_port) to run a temporary bootstrap node.   *   * Be aware that every time a new instance is created, the DHT public key   * changes, meaning this cannot be used to run a permanent bootstrap node. @@ -1992,15 +2255,21 @@ void tox_callback_friend_lossless_packet(Tox *tox, tox_friend_lossless_packet_cb   */  void tox_self_get_dht_id(const Tox *tox, uint8_t *dht_id); -  typedef enum TOX_ERR_GET_PORT { + +    /** +     * The function returned successfully. +     */      TOX_ERR_GET_PORT_OK, +      /**       * The instance was not bound to any port.       */ -    TOX_ERR_GET_PORT_NOT_BOUND +    TOX_ERR_GET_PORT_NOT_BOUND, +  } TOX_ERR_GET_PORT; +  /**   * Return the UDP port this Tox instance is bound to.   */  | 
