]> git.meshlink.io Git - meshlink/blobdiff - src/meshlink++.h
Check all arguments of the public API for NULL pointers.
[meshlink] / src / meshlink++.h
index a4829a4505204bb0c2f8b5a4494e1804cee36c45..2729130cc64872f686a1fe6a4ce9bda60a564c9f 100644 (file)
@@ -25,6 +25,7 @@
 namespace meshlink {
        class mesh;
        class node;
+       class channel;
 
        /// Severity of log messages generated by MeshLink.
        typedef meshlink_log_level_t log_level_t;
@@ -54,10 +55,35 @@ namespace meshlink {
         */
        typedef void (*log_cb_t)(mesh *mesh, log_level_t level, const char *text);
 
+       /// A callback for accepting incoming channels.
+       /** @param mesh         A handle which represents an instance of MeshLink.
+        *  @param channel      A handle for the incoming channel.
+        *  @param node         The node from 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 already received. (Not yet used.)
+        *  @param len          The length of the data. (Not yet used.)
+        *
+        *  @return             This function should return true if the application accepts the incoming channel, false otherwise.
+        *                      If returning false, the channel is invalid and may not be used anymore.
+        */
+       typedef bool (*channel_accept_cb_t)(mesh *mesh, channel *channel, node *node, uint16_t port, const void *data, size_t len);
+
+       /// A callback for receiving data from a channel.
+       /** @param mesh         A handle which represents an instance of MeshLink.
+        *  @param channel      A handle for the channel.
+        *  @param data         A pointer to a buffer containing data sent by the source.
+        *  @param len          The length of the data.
+        */
+       typedef void (*channel_receive_cb_t)(mesh *mesh, channel *channel, const void *data, size_t len);
+
        /// A class describing a MeshLink node.
        class node: public meshlink_node_t {
        };
 
+       /// A class describing a MeshLink channel.
+       class channel: public meshlink_channel_t {
+       };
+
        /// A class describing a MeshLink mesh.
        class mesh: public meshlink_handle_t {
                public:
@@ -156,9 +182,10 @@ namespace meshlink {
                 *  @param nodes        A pointer to an array of pointers to meshlink::node, which should be allocated by the application.
                 *  @param nmemb        The maximum number of pointers that can be stored in the nodes array.
                 *
-                *  @return             The number of known nodes. This can be larger than nmemb, in which case not all nodes were stored in the nodes array.
+                *  @return             The number of known nodes, or -1 in case of an error.
+                *                      This can be larger than nmemb, in which case not all nodes were stored in the nodes array.
                 */
-               size_t get_all_nodes(node **nodes, size_t nmemb) {
+               ssize_t get_all_nodes(node **nodes, size_t nmemb) {
                        return meshlink_get_all_nodes(this, (meshlink_node_t **)nodes, nmemb);
                }
 
@@ -265,6 +292,73 @@ namespace meshlink {
                void blacklist(node *node) {
                        return meshlink_blacklist(this, node);
                }
+
+               /// Set the accept callback.
+               /** This functions sets the callback that is called whenever another node sends data to the local node.
+                *  The callback is run in MeshLink's own thread.
+                *  It is therefore important that the callback uses apprioriate methods (queues, pipes, locking, etc.)
+                *  to hand the data over to the application's thread.
+                *  The callback should also not block itself and return as quickly as possible.
+                *
+                *  @param channel   A handle for the channel.
+                *  @param cb        A pointer to the function which will be called when another node sends data to the local node.
+                */
+               void set_channel_accept_cb(channel *channel, channel_accept_cb_t cb) {
+                       return meshlink_set_channel_accept_cb(this, (meshlink_channel_accept_cb_t)cb);
+               }
+
+               /// 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.
+                *
+                *  @param node         The node to which this channel is being initiated.
+                *  @param port         The port number the peer wishes to connect to.
+                *  @param cb           A pointer to the function which will be called when the remote node sends data to the local node.
+                *  @param data         A pointer to a buffer containing data to already queue for sending.
+                *  @param len          The length of the data.
+                *
+                *  @return             A handle for the channel, or NULL in case of an error.
+                */
+               channel *channel_open(node *node, uint16_t port, channel_receive_cb_t cb, const void *data, size_t len) {
+                       return (channel *)meshlink_channel_open(this, node, port, (meshlink_channel_receive_cb_t)cb, data, len);
+               }
+
+               /// Partially close a reliable stream channel.
+               /** This shuts down the read or write side of a channel, or both, without closing the handle.
+                *  It can be used to inform the remote node that the local node has finished sending all data on the channel,
+                *  but still allows waiting for incoming data from the remote node.
+                *
+                *  @param channel      A handle for the channel.
+                *  @param direction    Must be one of SHUT_RD, SHUT_WR or SHUT_RDWR.
+                */
+               void channel_shutdown(channel *channel, int direction) {
+                       return meshlink_channel_shutdown(this, channel, direction);
+               }
+
+               /// Close a reliable stream channel.
+               /** This informs the remote node that the local node has finished sending all data on the channel.
+                *  It also causes the local node to stop accepting incoming data from the remote node.
+                *  Afterwards, the channel handle is invalid and must not be used any more.
+                *
+                *  @param channel      A handle for the channel.
+                */
+               void channel_close(meshlink_channel_t *channel) {
+                       return meshlink_channel_close(this, channel);
+               }
+
+               /// Transmit data on a channel
+               /** This queues data to send to the remote node.
+                *
+                *  @param channel      A handle for the channel.
+                *  @param data         A pointer to a buffer containing data sent by the source.
+                *  @param len          The length of the data.
+                *
+                *  @return             The amount of data that was queued, which can be less than len, or a negative value in case of an error.
+                */
+               ssize_t channel_send(channel *channel, void *data, size_t len) {
+                       return meshlink_channel_send(this, channel, data, len);
+               }
+
        };
 
        /// Initialize MeshLink's configuration directory.
@@ -294,6 +388,10 @@ namespace meshlink {
        static void close(mesh *mesh) {
                meshlink_close(mesh);
        }
+
+       static const char *strerror(errno_t err = meshlink_errno) {
+               return meshlink_strerror(err);
+       }
 };
 
 #endif // MESHLINKPP_H