# mco_iot_comm_register_callback

Register a callback function.

### For an overview see page ARF Applications in C

### Prototype

        MCO_RET mco_iot_comm_register_callback(mco_iot_comm_h comm,
                                iot_comm_callback_t *callback,
                                void *context);

### Arguments

comm | The communicator object to register the callbacks on
callback | The callback structure `iot_comm_callback_t` with initialized function pointers
context | A user-defined context (a pointer to a structure containing application-specific data)

### Description

This function registers a callback function structure `iot_comm_callback_t` for communicator `comm` with the ARF (IoT) runtime. Note that the `context` must be unique for all currently active callbacks; i.e. it is not possible to register two callbacks with the same context. (See the `iot_comm_callback_t` structure definition for a description of the events for which callback functions are called.)

### Return Codes

MCO_S_OK | Callbacks successfully registered
MCO_E_ILLEGAL_PARAM | Values in `params` are not valid / suitable
MCO_E_NOMEM | Unable to allocate memory for the callback descriptor
MCO_E_IOT_DUPLICATE_CALLBACK | A callback with the same `context` is already registered (see Note above)

### Example

The code snippet below defines 5 callbacks, initializes the ARF (IoT) runtime and, after opening and connecting the database, creates the communicator then registers the callbacks:

        int iot_on_connect(mco_iot_connection_h iotc, void *context)
        {
            mco_iot_connection_stat_t iotc_stat;
            char address[MCO_NET_INETADDR_STRING_LEN];
            mco_iot_conn_get_stat(iotc, &iotc_stat);
            mco_net_ntoa(&iotc_stat.inetaddr, address);
            printf("Agent %llu connected. Address %s:%d\n", mco_iot_conn_get_agent_id(iotc), address, iotc_stat.port);
            return IOT_CALLBACK_OK;
        }

        int iot_on_receive(mco_iot_connection_h iotc, mco_iot_read_stream_t *stream, void *context)
        {
            printf("DATA received from agent %llu\n", mco_iot_conn_get_agent_id(iotc));
            return IOT_CALLBACK_OK;
        }

        int iot_on_ack(mco_iot_connection_h iotc, const iot_ack_t *ack, void *context)
        {
            printf("ACK  received from agent %llu : %llu->%llu, ts=%llu, errcode=%d (%s)\n", mco_iot_conn_get_agent_id(iotc),
            ack->sender_agent_id, ack->receiver_agent_id, ack->timestamp, ack->error_code, mco_strerror(ack->error_code));
            return IOT_CALLBACK_OK;
        }

        int iot_on_disconnect(mco_iot_connection_h iotc, void *context)
        {
            mco_iot_connection_stat_t iotc_stat;
            mco_iot_conn_get_stat(iotc, &iotc_stat);
            printf("Agent %llu disconnected. Bytes sent %llu, recevied %llu\n", mco_iot_conn_get_agent_id(iotc),
            iotc_stat.sent_bytes, iotc_stat.recv_bytes);
            return IOT_CALLBACK_OK;
        }

        int iot_on_destroy(mco_iot_connection_h iotc, void *context)
        {
            printf("Agent connection %llu destroyed\n", mco_iot_conn_get_agent_id(iotc));
            return IOT_CALLBACK_OK;
        }

        int main(int argc, char *argv[])
        {
            mco_db_params_t db_params;
            mco_device_t dev;
            mco_db_h db;
            mco_iot_replicator_params_t repl_params;
            mco_iot_comm_params_t comm_params;
            mco_iot_replicator_h repl;
            mco_iot_comm_h comm;
            const char *conn_string = (argc > 1) ? argv[1] : "127.0.0.1:15000";
            iot_comm_callback_t iot_callbacks = {&iot_on_connect, &iot_on_receive, &iot_on_ack, &iot_on_disconnect, &iot_on_destroy};

            /* Initialize eXtremeDB and IoT runtimes */
            mco_error_set_handler(&sample_errhandler);
            mco_runtime_start();
            mco_iot_init();

            /* Create database */
            dev.type       = MCO_MEMORY_CONV;
            dev.assignment = MCO_MEMORY_ASSIGN_DATABASE;
            dev.size       = DEVICE_DATABASE_SIZE;
            dev.dev.conv.ptr = (void*)malloc(dev.size);
            mco_db_params_init (&db_params);
            db_params.db_max_connections = 5;

            if (argc > 2) {
                db_params.iot_agent_id = atoi(argv[2]); /* Override the agent_id in the schema */
            }
            CHECK(mco_db_open_dev(db_name, iotdevice_get_dictionary(), &dev, 1, &db_params));
            CHECK(mco_db_connect(db_name, &db));
            mco_iot_comm_params_init(&comm_params);
            CHECK(mco_iot_comm_create(&comm_params, &comm));
            ...
            CHECK(mco_iot_comm_register_callback(comm, &iot_callbacks, comm));
        }

### Files

Header file:
mcoiot.h
Source file:
mcoiotcomm.c
Library:
libmcoiotcomm.a