X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=src%2Fmeshlink%2B%2B.h;h=48eabf3fbf5fdf80cfb3586c6a5001e808a7e208;hb=2fd608c4111ef4d48a649401d918f5981856cc44;hp=4cea8cfa206334e07b9b106b7941ce15daeeb4da;hpb=5c7be85686db219955e1af592b32d0d4108625cb;p=meshlink diff --git a/src/meshlink++.h b/src/meshlink++.h index 4cea8cfa..48eabf3f 100644 --- a/src/meshlink++.h +++ b/src/meshlink++.h @@ -27,6 +27,7 @@ namespace meshlink { class mesh; class node; class channel; +class submesh; /// Severity of log messages generated by MeshLink. typedef meshlink_log_level_t log_level_t; @@ -42,6 +43,13 @@ typedef meshlink_errno_t errno_t; */ typedef void (*receive_cb_t)(mesh *mesh, node *source, const void *data, size_t len); +/// A callback reporting the meta-connection attempt made by the host node to an another node. +/** @param mesh A handle which represents an instance of MeshLink. + * @param node A pointer to a meshlink_node_t describing the node to whom meta-connection is being tried. + * This pointer is valid until meshlink_close() is called. + */ +typedef void (*connection_try_cb_t)(mesh *mesh, node *node); + /// A callback reporting node status changes. /** @param mesh A handle which represents an instance of MeshLink. * @param node A pointer to a meshlink::node describing the node whose status changed. @@ -49,6 +57,13 @@ typedef void (*receive_cb_t)(mesh *mesh, node *source, const void *data, size_t */ typedef void (*node_status_cb_t)(mesh *mesh, node *node, bool reachable); +/// A callback reporting duplicate node detection. +/** @param mesh A handle which represents an instance of MeshLink. + * @param node A pointer to a meshlink_node_t describing the node which is duplicate. + * This pointer is valid until meshlink_close() is called. + */ +typedef void (*duplicate_cb_t)(mesh *mesh, node *node); + /// A callback for receiving log messages generated by MeshLink. /** @param mesh A handle which represents an instance of MeshLink. * @param level An enum describing the severity level of the message. @@ -87,6 +102,10 @@ typedef void (*channel_poll_cb_t)(mesh *mesh, channel *channel, size_t len); class node: public meshlink_node_t { }; +/// A class describing a MeshLink Sub-Mesh. +class submesh: public meshlink_submesh_t { +}; + /// A class describing a MeshLink channel. class channel: public meshlink_channel_t { public: @@ -133,9 +152,9 @@ public: * @param confbase The directory in which MeshLink will store its configuration files. * @param name The name which this instance of the application will use in the mesh. * @param appname The application name which will be used in the mesh. - * @param dclass The device class which will be used in the mesh. + * @param devclass The device class which will be used in the mesh. * - * @return This function will return a pointer to a meshlink::mesh if MeshLink has succesfully set up its configuration files, NULL otherwise. + * @return This function will return a pointer to a meshlink::mesh if MeshLink has successfully set up its configuration files, NULL otherwise. */ bool open(const char *confbase, const char *name, const char *appname, dev_class_t devclass) { handle = meshlink_open(confbase, name, appname, devclass); @@ -181,21 +200,33 @@ public: (void) length; } - /// This functions is called whenever another node's status changed. - virtual void node_status(node *peer, bool reachable) { + /// This functions is called whenever another node's status changed. + virtual void node_status(node *peer, bool reachable) { /* do nothing */ (void)peer; (void)reachable; } + /// This functions is called whenever a duplicate node is detected. + virtual void node_duplicate(node *peer) { + /* do nothing */ + (void)peer; + } + /// This functions is called whenever MeshLink has some information to log. - virtual void log(log_level_t level, const char *message) { + virtual void log(log_level_t level, const char *message) { /* do nothing */ (void)level; (void)message; } - /// This functions is called whenever another node attemps to open a channel to the local node. + /// This functions is called whenever MeshLink a meta-connection attempt is made. + virtual void connection_try(node *peer) { + /* do nothing */ + (void)peer; + } + + /// This functions is called whenever another node attempts to open a channel to the local node. /** * If the channel is accepted, the poll_callback will be set to channel_poll and can be * changed using set_channel_poll_cb(). Likewise, the receive callback is set to @@ -261,13 +292,15 @@ public: /** This function causes MeshLink to open network sockets, make outgoing connections, and * create a new thread, which will handle all network I/O. * - * @return This function will return true if MeshLink has succesfully started its thread, false otherwise. + * @return This function will return true if MeshLink has successfully started its thread, false otherwise. */ bool start() { meshlink_set_receive_cb(handle, &receive_trampoline); meshlink_set_node_status_cb(handle, &node_status_trampoline); + meshlink_set_node_duplicate_cb(handle, &node_duplicate_trampoline); meshlink_set_log_cb(handle, MESHLINK_DEBUG, &log_trampoline); meshlink_set_channel_accept_cb(handle, &channel_accept_trampoline); + meshlink_set_connection_try_cb(handle, &connection_try_trampoline); return meshlink_start(handle); } @@ -308,6 +341,18 @@ public: return (node *)meshlink_get_node(handle, name); } + /// Get a handle for a specific submesh. + /** This function returns a handle for the submesh with the given name. + * + * @param name The name of the submesh for which a handle is requested. + * + * @return A pointer to a meshlink::submesh which represents the requested submesh, + * or NULL if the requested submesh does not exist. + */ + submesh *get_submesh(const char *name) { + return (submesh *)meshlink_get_submesh(handle, name); + } + /// Get a handle for our own node. /** This function returns a handle for the local node. * @@ -432,6 +477,28 @@ public: return meshlink_get_external_address_for_family(handle, family); } + /** This function performs tries to discover the address of the local interface used for outgoing connection. + * + * Please note that this is function only returns a single address, + * even if the local node might have more than one external address. + * In that case, there is no control over which address will be selected. + * Also note that if you have a dynamic IP address, or are behind carrier-grade NAT, + * there is no guarantee that the external address will be valid for an extended period of time. + * + * This function will fail if it couldn't find a local address for the given address family. + * If hostname resolving is requested, this function may block for a few seconds. + * + * @param family The address family to check, for example AF_INET or AF_INET6. If AF_UNSPEC is given, + * this might return the external address for any working address family. + * + * @return This function returns a pointer to a C string containing the discovered external address, + * or NULL if there was an error looking up the address. + * After get_external_address() returns, the application is free to overwrite or free this string. + */ + bool get_local_address(int family = AF_UNSPEC) { + return meshlink_get_local_address_for_family(handle, family); + } + /// Try to discover the external address for the local node, and add it to its list of addresses. /** This function is equivalent to: * @@ -447,8 +514,6 @@ public: /// Get the network port used by the local node. /** This function returns the network port that the local node is listening on. - * - * @param mesh A handle which represents an instance of MeshLink. * * @return This function returns the port number, or -1 in case of an error. */ @@ -468,31 +533,43 @@ public: * If the port is set to 0, then MeshLink will listen on a port * that is randomly assigned by the operating system every time open() is called. * - * @return This function returns true if the port was succesfully changed, false otherwise. + * @return This function returns true if the port was successfully changed, false otherwise. */ bool set_port(int port) { return meshlink_set_port(handle, port); } + /// Set the timeout for invitations. + /** This function sets the timeout for invitations. + * The timeout is retroactively applied to all outstanding invitations. + * + * @param timeout The timeout for invitations in seconds. + */ + void set_invitation_timeout(int timeout) { + meshlink_set_invitation_timeout(handle, timeout); + } + /// Invite another node into the mesh. /** This function generates an invitation that can be used by another node to join the same mesh as the local node. * The generated invitation is a string containing a URL. * This URL should be passed by the application to the invitee in a way that no eavesdroppers can see the URL. * The URL can only be used once, after the user has joined the mesh the URL is no longer valid. * + * @param submesh A handle to the submesh to put the invitee in. * @param name The name that the invitee will use in the mesh. + * @param flags A bitwise-or'd combination of flags that controls how the URL is generated. * * @return This function returns a string that contains the invitation URL. * The application should call free() after it has finished using the URL. */ - char *invite(const char *name) { - return meshlink_invite(handle, name); + char *invite(submesh *submesh, const char *name, uint32_t flags = 0) { + return meshlink_invite_ex(handle, submesh, name, flags); } /// Use an invitation to join a mesh. /** This function allows the local node to join an existing mesh using an invitation URL generated by another node. * An invitation can only be used if the local node has never connected to other nodes before. - * After a succesfully accepted invitation, the name of the local node may have changed. + * After a successfully accepted invitation, the name of the local node may have changed. * * This function may only be called on a mesh that has not been started yet and which is not already part of an existing mesh. * @@ -563,7 +640,7 @@ public: * The application then has to decide whether to accept or reject this channel. * * This function sets the channel poll callback to channel_poll_trampoline, which in turn - * calls channel_poll. To set a differnt, channel-specific poll callback, use set_channel_poll_cb. + * calls channel_poll. To set a different, channel-specific poll callback, use set_channel_poll_cb. * * @param node The node to which this channel is being initiated. * @param port The port number the peer wishes to connect to. @@ -580,9 +657,23 @@ public: return ch; } - /** - * @override - * Sets channel_receive_trampoline as cb, which in turn calls this->channel_receive( ... ). + /// Open a reliable stream channel to another node. + /** This function is called whenever a remote node wants to open a channel to the local node. + * The application then has to decide whether to accept or reject this channel. + * + * This function sets the channel receive callback to channel_receive_trampoline, + * which in turn calls channel_receive. + * + * This function sets the channel poll callback to channel_poll_trampoline, which in turn + * calls channel_poll. To set a different, channel-specific poll callback, use set_channel_poll_cb. + * + * @param node The node to which this channel is being initiated. + * @param port The port number the peer wishes to connect to. + * @param data A pointer to a buffer containing data to already queue for sending. + * @param len The length of the data. + * @param flags A bitwise-or'd combination of flags that set the semantics for this channel. + * + * @return A handle for the channel, or NULL in case of an error. */ channel *channel_open(node *node, uint16_t port, const void *data, size_t len, uint32_t flags = channel::TCP) { channel *ch = (channel *)meshlink_channel_open_ex(handle, node, port, &channel_receive_trampoline, data, len, flags); @@ -626,6 +717,30 @@ public: return meshlink_channel_send(handle, channel, data, len); } + /// Get the amount of bytes in the send buffer. + /** This returns the amount of bytes in the send buffer. + * These bytes have not been received by the peer yet. + * + * @param channel A handle for the channel. + * + * @return The amount of un-ACKed bytes in the send buffer. + */ + size_t channel_get_sendq(channel *channel) { + return meshlink_channel_get_sendq(handle, channel); + } + + /// Get the amount of bytes in the receive buffer. + /** This returns the amount of bytes in the receive buffer. + * These bytes have not been processed by the application yet. + * + * @param channel A handle for the channel. + * + * @return The amount of bytes in the receive buffer. + */ + size_t channel_get_recvq(channel *channel) { + return meshlink_channel_get_recvq(handle, channel); + } + /// Enable or disable zeroconf discovery of local peers /** This controls whether zeroconf discovery using the Catta library will be * enabled to search for peers on the local network. By default, it is enabled. @@ -660,6 +775,15 @@ private: that->node_status(static_cast(peer), reachable); } + static void node_duplicate_trampoline(meshlink_handle_t *handle, meshlink_node_t *peer) { + if(!(handle->priv)) { + return; + } + + meshlink::mesh *that = static_cast(handle->priv); + that->node_duplicate(static_cast(peer)); + } + static void log_trampoline(meshlink_handle_t *handle, log_level_t level, const char *message) { if(!(handle->priv)) { return; @@ -669,6 +793,15 @@ private: that->log(level, message); } + static void connection_try_trampoline(meshlink_handle_t *handle, meshlink_node_t *peer) { + if(!(handle->priv)) { + return; + } + + meshlink::mesh *that = static_cast(handle->priv); + that->connection_try(static_cast(peer)); + } + static bool channel_accept_trampoline(meshlink_handle_t *handle, meshlink_channel *channel, uint16_t port, const void *data, size_t len) { if(!(handle->priv)) { return false; @@ -718,7 +851,7 @@ static inline const char *strerror(errno_t err = meshlink_errno) { * @param confbase The directory in which MeshLink stores its configuration files. * After the function returns, the application is free to overwrite or free @a confbase @a. * - * @return This function will return true if the MeshLink instance was succesfully destroyed, false otherwise. + * @return This function will return true if the MeshLink instance was successfully destroyed, false otherwise. */ static inline bool destroy(const char *confbase) { return meshlink_destroy(confbase);