X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=src%2Fmeshlink%2B%2B.h;h=16a6e36624ec7c6fa772ffdc73ad4331bdddb3d9;hb=1a7277c64d74ae5ae18c48ebe09a522ffe7c696b;hp=b012bb4aa07f0835e053c3616378279c61b86f38;hpb=5dec7459d9920c930bdfb3ac0f2a3740a6247ec0;p=meshlink diff --git a/src/meshlink++.h b/src/meshlink++.h index b012bb4a..16a6e366 100644 --- a/src/meshlink++.h +++ b/src/meshlink++.h @@ -49,6 +49,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. @@ -108,7 +115,7 @@ public: } bool isOpen() const { - return (handle!=0); + return (handle != 0); } // TODO: please enable C++11 in autoconf to enable "move constructors": @@ -137,15 +144,17 @@ public: * * @return This function will return a pointer to a meshlink::mesh if MeshLink has succesfully set up its configuration files, NULL otherwise. */ - bool open(const char *confbase, const char *name, const char* appname, dev_class_t devclass) { + bool open(const char *confbase, const char *name, const char *appname, dev_class_t devclass) { handle = meshlink_open(confbase, name, appname, devclass); - if(handle) + + if(handle) { handle->priv = this; + } return isOpen(); } - mesh(const char *confbase, const char *name, const char* appname, dev_class_t devclass) { + mesh(const char *confbase, const char *name, const char *appname, dev_class_t devclass) { open(confbase, name, appname, devclass); } @@ -159,7 +168,8 @@ public: handle->priv = 0; meshlink_close(handle); } - handle=0; + + handle = 0; } /** instead of registerin callbacks you derive your own class and overwrite the following abstract member functions. @@ -171,13 +181,32 @@ public: */ /// This function is called whenever another node sends data to the local node. - virtual void receive(node* source, const void* data, size_t length) { /* do nothing */ } + virtual void receive(node *source, const void *data, size_t length) { + /* do nothing */ + (void)source; + (void)data; + (void) length; + } - /// This functions is called whenever another node's status changed. - virtual void node_status(node* peer, bool reachable) { /* do nothing */ } + /// 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) { /* do nothing */ } + 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. /** @@ -200,6 +229,10 @@ public: */ virtual bool channel_accept(channel *channel, uint16_t port, const void *data, size_t len) { /* by default reject all channels */ + (void)channel; + (void)port; + (void)data; + (void)len; return false; } @@ -214,7 +247,12 @@ public: * @param data A pointer to a buffer containing data sent by the source. * @param len The length of the data. */ - virtual void channel_receive(channel *channel, const void *data, size_t len) { /* do nothing */ } + virtual void channel_receive(channel *channel, const void *data, size_t len) { + /* do nothing */ + (void)channel; + (void)data; + (void)len; + } /// This function is called by Meshlink when data can be send on a channel. /** @@ -226,7 +264,11 @@ public: * @param channel A handle for the channel. * @param len The maximum length of data that is guaranteed to be accepted by a call to channel_send(). */ - virtual void channel_poll(channel *channel, size_t len) { /* do nothing */ } + virtual void channel_poll(channel *channel, size_t len) { + /* do nothing */ + (void)channel; + (void)len; + } /// Start MeshLink. /** This function causes MeshLink to open network sockets, make outgoing connections, and @@ -237,6 +279,7 @@ public: 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); return meshlink_start(handle); @@ -331,6 +374,42 @@ public: return meshlink_verify(handle, source, data, len, signature, siglen); } + /// Set the canonical Address for a node. + /** This function sets the canonical Address for a node. + * This address is stored permanently until it is changed by another call to this function, + * unlike other addresses associated with a node, + * such as those added with meshlink_hint_address() or addresses discovered at runtime. + * + * If a canonical Address is set for the local node, + * it will be used for the hostname part of generated invitation URLs. + * + * @param node A pointer to a meshlink_node_t describing the node. + * @param address A nul-terminated C string containing the address, which can be either in numeric format or a hostname. + * @param port A nul-terminated C string containing the port, which can be either in numeric or symbolic format. + * If it is NULL, the listening port's number will be used. + * + * @return This function returns true if the address was added, false otherwise. + */ + bool set_canonical_address(node *node, const char *address, const char *port = NULL) { + return meshlink_set_canonical_address(handle, node, address, port); + } + + /// Set the canonical Address for the local node. + /** This function sets the canonical Address for the local node. + * This address is stored permanently until it is changed by another call to this function, + * unlike other addresses associated with a node, + * such as those added with meshlink_hint_address() or addresses discovered at runtime. + * + * @param address A nul-terminated C string containing the address, which can be either in numeric format or a hostname. + * @param port A nul-terminated C string containing the port, which can be either in numeric or symbolic format. + * If it is NULL, the listening port's number will be used. + * + * @return This function returns true if the address was added, false otherwise. + */ + bool set_canonical_address(const char *address, const char *port = NULL) { + return meshlink_set_canonical_address(handle, get_self(), address, port); + } + /// Add an Address for the local node. /** This function adds an Address for the local node, which will be used for invitation URLs. * @@ -356,12 +435,37 @@ public: * There is no guarantee it will be able to resolve the external address. * Failures might be because by temporary network outages. * + * @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_external_address(int family = AF_UNSPEC) { + 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_external_address() { - return meshlink_get_external_address(handle); + 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. @@ -406,6 +510,16 @@ public: 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. @@ -413,12 +527,13 @@ public: * The URL can only be used once, after the user has joined the mesh the URL is no longer valid. * * @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(const char *name, uint32_t flags = 0) { + return meshlink_invite_ex(handle, name, flags); } /// Use an invitation to join a mesh. @@ -570,61 +685,84 @@ public: private: // non-copyable: - mesh(const mesh&) /* TODO: C++11: = delete */; - void operator=(const mesh&) /* TODO: C++11: = delete */ ; + mesh(const mesh &) /* TODO: C++11: = delete */; + void operator=(const mesh &) /* TODO: C++11: = delete */; /// static callback trampolines: - static void receive_trampoline(meshlink_handle_t* handle, meshlink_node_t* source, const void* data, size_t length) { - if(!(handle->priv)) + static void receive_trampoline(meshlink_handle_t *handle, meshlink_node_t *source, const void *data, size_t length) { + if(!(handle->priv)) { return; - meshlink::mesh* that = static_cast(handle->priv); - that->receive(static_cast(source), data, length); + } + + meshlink::mesh *that = static_cast(handle->priv); + that->receive(static_cast(source), data, length); } - static void node_status_trampoline(meshlink_handle_t* handle, meshlink_node_t* peer, bool reachable) { - if(!(handle->priv)) + static void node_status_trampoline(meshlink_handle_t *handle, meshlink_node_t *peer, bool reachable) { + if(!(handle->priv)) { return; - meshlink::mesh* that = static_cast(handle->priv); - that->node_status(static_cast(peer), reachable); + } + + meshlink::mesh *that = static_cast(handle->priv); + 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)) + static void log_trampoline(meshlink_handle_t *handle, log_level_t level, const char *message) { + if(!(handle->priv)) { return; - meshlink::mesh* that = static_cast(handle->priv); + } + + meshlink::mesh *that = static_cast(handle->priv); that->log(level, message); } static bool channel_accept_trampoline(meshlink_handle_t *handle, meshlink_channel *channel, uint16_t port, const void *data, size_t len) { - if(!(handle->priv)) + if(!(handle->priv)) { return false; - meshlink::mesh* that = static_cast(handle->priv); - bool accepted = that->channel_accept(static_cast(channel), port, data, len); + } + + meshlink::mesh *that = static_cast(handle->priv); + bool accepted = that->channel_accept(static_cast(channel), port, data, len); + if(accepted) { meshlink_set_channel_receive_cb(handle, channel, &channel_receive_trampoline); meshlink_set_channel_poll_cb(handle, channel, &channel_poll_trampoline); } + return accepted; } - static void channel_receive_trampoline(meshlink_handle_t *handle, meshlink_channel *channel, const void* data, size_t len) { - if(!(handle->priv)) + static void channel_receive_trampoline(meshlink_handle_t *handle, meshlink_channel *channel, const void *data, size_t len) { + if(!(handle->priv)) { return; - meshlink::mesh* that = static_cast(handle->priv); - that->channel_receive(static_cast(channel), data, len); + } + + meshlink::mesh *that = static_cast(handle->priv); + that->channel_receive(static_cast(channel), data, len); } static void channel_poll_trampoline(meshlink_handle_t *handle, meshlink_channel *channel, size_t len) { - if(!(handle->priv)) + if(!(handle->priv)) { return; - meshlink::mesh* that = static_cast(handle->priv); - that->channel_poll(static_cast(channel), len); + } + + meshlink::mesh *that = static_cast(handle->priv); + that->channel_poll(static_cast(channel), len); } - meshlink_handle_t* handle; + meshlink_handle_t *handle; }; -static const char *strerror(errno_t err = meshlink_errno) { +static inline const char *strerror(errno_t err = meshlink_errno) { return meshlink_strerror(err); } @@ -638,7 +776,7 @@ static const char *strerror(errno_t err = meshlink_errno) { * * @return This function will return true if the MeshLink instance was succesfully destroyed, false otherwise. */ -static bool destroy(const char *confbase) { +static inline bool destroy(const char *confbase) { return meshlink_destroy(confbase); } }