Part of TI's mqtt

Dependents:   mqtt_V1 cc3100_Test_mqtt_CM3

Committer:
dflet
Date:
Sat Jun 06 13:29:08 2015 +0000
Revision:
0:547251f42a60
Part of mqtt_V1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dflet 0:547251f42a60 1 /******************************************************************************
dflet 0:547251f42a60 2 *
dflet 0:547251f42a60 3 * Copyright (C) 2014 Texas Instruments Incorporated
dflet 0:547251f42a60 4 *
dflet 0:547251f42a60 5 * All rights reserved. Property of Texas Instruments Incorporated.
dflet 0:547251f42a60 6 * Restricted rights to use, duplicate or disclose this code are
dflet 0:547251f42a60 7 * granted through contract.
dflet 0:547251f42a60 8 *
dflet 0:547251f42a60 9 * The program may not be used without the written permission of
dflet 0:547251f42a60 10 * Texas Instruments Incorporated or against the terms and conditions
dflet 0:547251f42a60 11 * stipulated in the agreement under which this program has been supplied,
dflet 0:547251f42a60 12 * and under no circumstances can it be used with non-TI connectivity device.
dflet 0:547251f42a60 13 *
dflet 0:547251f42a60 14 ******************************************************************************/
dflet 0:547251f42a60 15
dflet 0:547251f42a60 16 #include "server_plug.h"
dflet 0:547251f42a60 17 #include "server_core.h"
dflet 0:547251f42a60 18 #include "server_util.h"
dflet 0:547251f42a60 19
dflet 0:547251f42a60 20 namespace mbed_mqtt {
dflet 0:547251f42a60 21
dflet 0:547251f42a60 22 #define MAX_PLUGINS PG_MAP_MAX_ELEMS
dflet 0:547251f42a60 23 #define PG_NAME_LEN 32
dflet 0:547251f42a60 24
dflet 0:547251f42a60 25 static struct plugin_desc {
dflet 0:547251f42a60 26
dflet 0:547251f42a60 27 char *name;
dflet 0:547251f42a60 28 uint8_t index;
dflet 0:547251f42a60 29 uint8_t inuse;
dflet 0:547251f42a60 30
dflet 0:547251f42a60 31 struct mqtt_server_app_cbs app_cbs;
dflet 0:547251f42a60 32
dflet 0:547251f42a60 33 } plugins[MAX_PLUGINS];
dflet 0:547251f42a60 34
dflet 0:547251f42a60 35 #define PLUGIN(app_hnd) ((struct plugin_desc*) app_hnd)
dflet 0:547251f42a60 36
dflet 0:547251f42a60 37 static inline bool is_inuse(struct plugin_desc *plugin)
dflet 0:547251f42a60 38 {
dflet 0:547251f42a60 39 return plugin->inuse? true : false;
dflet 0:547251f42a60 40 }
dflet 0:547251f42a60 41
dflet 0:547251f42a60 42 static inline void inuse_set(struct plugin_desc *plugin, bool inuse)
dflet 0:547251f42a60 43 {
dflet 0:547251f42a60 44 plugin->inuse = inuse? 0x01 : 0x00;
dflet 0:547251f42a60 45 }
dflet 0:547251f42a60 46
dflet 0:547251f42a60 47 static struct plugin_desc *acl_pg = NULL;
dflet 0:547251f42a60 48
dflet 0:547251f42a60 49 static struct plugin_core_msg_cbs *msg_cbs, msg_cbacks = {NULL, NULL, NULL};
dflet 0:547251f42a60 50
dflet 0:547251f42a60 51 static inline struct plugin_desc *plugin_find(int32_t idx)
dflet 0:547251f42a60 52 {
dflet 0:547251f42a60 53 return plugins + idx;
dflet 0:547251f42a60 54 }
dflet 0:547251f42a60 55
dflet 0:547251f42a60 56 static void plugin_reset(struct plugin_desc *plugin)
dflet 0:547251f42a60 57 {
dflet 0:547251f42a60 58 //plugin->app_cbs = NULL; ==> TBD
dflet 0:547251f42a60 59 inuse_set(plugin, false);
dflet 0:547251f42a60 60
dflet 0:547251f42a60 61 return;
dflet 0:547251f42a60 62 }
dflet 0:547251f42a60 63
dflet 0:547251f42a60 64 static struct plugin_desc *plugin_alloc(void)
dflet 0:547251f42a60 65 {
dflet 0:547251f42a60 66 struct plugin_desc *plugin = NULL;;
dflet 0:547251f42a60 67 int32_t idx = 0;
dflet 0:547251f42a60 68
dflet 0:547251f42a60 69 for(idx = 0; idx < MAX_PLUGINS; idx++) {
dflet 0:547251f42a60 70 plugin = plugins + idx;
dflet 0:547251f42a60 71 if(false == is_inuse(plugin)) {
dflet 0:547251f42a60 72 inuse_set(plugin, true);
dflet 0:547251f42a60 73 break;
dflet 0:547251f42a60 74 }
dflet 0:547251f42a60 75 }
dflet 0:547251f42a60 76
dflet 0:547251f42a60 77 DBG_INFO("Plugin alloc %s\n\r",
dflet 0:547251f42a60 78 (MAX_PLUGINS == idx)? "Failed" : "Success");
dflet 0:547251f42a60 79
dflet 0:547251f42a60 80 return (MAX_PLUGINS != idx)? plugin : NULL;
dflet 0:547251f42a60 81 }
dflet 0:547251f42a60 82
dflet 0:547251f42a60 83 #if 0
dflet 0:547251f42a60 84 static void plugin_free(struct plugin_desc *plugin)
dflet 0:547251f42a60 85 {
dflet 0:547251f42a60 86 plugin_reset(plugin);
dflet 0:547251f42a60 87 }
dflet 0:547251f42a60 88 #endif
dflet 0:547251f42a60 89
dflet 0:547251f42a60 90 uint16_t plugin_connect(const struct utf8_string *clientId,
dflet 0:547251f42a60 91 const struct utf8_string *username,
dflet 0:547251f42a60 92 const struct utf8_string *password,
dflet 0:547251f42a60 93 void **app_usr)
dflet 0:547251f42a60 94 {
dflet 0:547251f42a60 95 uint16_t rv = CONNACK_RC_REQ_ACCEPT; /* Accept everything from MQTT network */
dflet 0:547251f42a60 96
dflet 0:547251f42a60 97 *app_usr = NULL;
dflet 0:547251f42a60 98 if(acl_pg)
dflet 0:547251f42a60 99 rv = acl_pg->app_cbs.connect(clientId, username,
dflet 0:547251f42a60 100 password, app_usr);
dflet 0:547251f42a60 101
dflet 0:547251f42a60 102 return rv;
dflet 0:547251f42a60 103 }
dflet 0:547251f42a60 104
dflet 0:547251f42a60 105 int32_t plugin_publish(uint8_t pg_map, const struct utf8_string *topic,
dflet 0:547251f42a60 106 const uint8_t *payload, uint32_t pay_len,
dflet 0:547251f42a60 107 bool dup, uint8_t qos, bool retain)
dflet 0:547251f42a60 108 {
dflet 0:547251f42a60 109 int32_t i = 0;
dflet 0:547251f42a60 110 for(i = 0; i < MAX_PLUGINS; i++) {
dflet 0:547251f42a60 111 if(PG_MAP_HAS_VALUE(pg_map, i)) {
dflet 0:547251f42a60 112 struct plugin_desc *plugin = plugin_find(i);
dflet 0:547251f42a60 113
dflet 0:547251f42a60 114 DBG_INFO("Publishing to Plugin ID: %d (%s)\n\r",
dflet 0:547251f42a60 115 plugin->index, plugin->name);
dflet 0:547251f42a60 116
dflet 0:547251f42a60 117 if(false == is_inuse(plugin))
dflet 0:547251f42a60 118 continue; /* Must not happen */
dflet 0:547251f42a60 119
dflet 0:547251f42a60 120 plugin->app_cbs.publish(topic, payload, pay_len,
dflet 0:547251f42a60 121 dup, qos, retain);
dflet 0:547251f42a60 122 }
dflet 0:547251f42a60 123 }
dflet 0:547251f42a60 124
dflet 0:547251f42a60 125 /* TBD for error value return. */
dflet 0:547251f42a60 126
dflet 0:547251f42a60 127 return pay_len;
dflet 0:547251f42a60 128 }
dflet 0:547251f42a60 129
dflet 0:547251f42a60 130 int32_t plugin_disconn(const void *app_usr, bool due2err)
dflet 0:547251f42a60 131 {
dflet 0:547251f42a60 132 if(acl_pg)
dflet 0:547251f42a60 133 acl_pg->app_cbs.disconn(app_usr, due2err);
dflet 0:547251f42a60 134
dflet 0:547251f42a60 135 /* TBD for error value return. */
dflet 0:547251f42a60 136
dflet 0:547251f42a60 137 return 0;
dflet 0:547251f42a60 138 }
dflet 0:547251f42a60 139
dflet 0:547251f42a60 140 int32_t mqtt_server_topic_enroll(const void *app_hnd,
dflet 0:547251f42a60 141 const struct utf8_string *topic, enum mqtt_qos qos)
dflet 0:547251f42a60 142 {
dflet 0:547251f42a60 143 return app_hnd?
dflet 0:547251f42a60 144 msg_cbs->topic_enroll(PLUGIN(app_hnd)->index, topic, qos) : -1;
dflet 0:547251f42a60 145 }
dflet 0:547251f42a60 146
dflet 0:547251f42a60 147 int32_t mqtt_server_topic_disenroll(const void *app_hnd,
dflet 0:547251f42a60 148 const struct utf8_string *topic)
dflet 0:547251f42a60 149 {
dflet 0:547251f42a60 150 return app_hnd?
dflet 0:547251f42a60 151 msg_cbs->topic_cancel(PLUGIN(app_hnd)->index, topic) : -1;
dflet 0:547251f42a60 152 }
dflet 0:547251f42a60 153
dflet 0:547251f42a60 154 int32_t mqtt_server_app_pub_send(const struct utf8_string *topic,
dflet 0:547251f42a60 155 const uint8_t *data_buf, uint32_t data_len,
dflet 0:547251f42a60 156 enum mqtt_qos qos, bool retain)
dflet 0:547251f42a60 157 {
dflet 0:547251f42a60 158 return msg_cbs->publish(topic, data_buf, data_len, qos, retain);
dflet 0:547251f42a60 159 }
dflet 0:547251f42a60 160
dflet 0:547251f42a60 161 static void *server_app_register(const struct mqtt_server_app_cbs *cbs,
dflet 0:547251f42a60 162 const char *name)
dflet 0:547251f42a60 163 {
dflet 0:547251f42a60 164 struct plugin_desc *plugin = plugin_alloc();
dflet 0:547251f42a60 165 if(NULL != plugin) {
dflet 0:547251f42a60 166 strncpy(plugin->name, name, PG_NAME_LEN - 1);
dflet 0:547251f42a60 167 memcpy(&plugin->app_cbs, cbs,
dflet 0:547251f42a60 168 sizeof(struct mqtt_server_app_cbs));
dflet 0:547251f42a60 169
dflet 0:547251f42a60 170 if((NULL == acl_pg) && cbs->connect)
dflet 0:547251f42a60 171 acl_pg = plugin;
dflet 0:547251f42a60 172
dflet 0:547251f42a60 173 }
dflet 0:547251f42a60 174 return plugin;
dflet 0:547251f42a60 175 }
dflet 0:547251f42a60 176
dflet 0:547251f42a60 177 void *mqtt_server_app_register(const struct mqtt_server_app_cbs *cbs,
dflet 0:547251f42a60 178 const char *name)
dflet 0:547251f42a60 179 {
dflet 0:547251f42a60 180 if((NULL == cbs) ||
dflet 0:547251f42a60 181 ((!!cbs->connect) ^ (!!cbs->disconn)) ||
dflet 0:547251f42a60 182 (acl_pg && cbs->connect))
dflet 0:547251f42a60 183 return NULL;
dflet 0:547251f42a60 184
dflet 0:547251f42a60 185 return server_app_register(cbs, name);
dflet 0:547251f42a60 186 }
dflet 0:547251f42a60 187
dflet 0:547251f42a60 188 static bool inited = false;
dflet 0:547251f42a60 189
dflet 0:547251f42a60 190 int32_t plugin_init(const struct plugin_core_msg_cbs *cbs)
dflet 0:547251f42a60 191 {
dflet 0:547251f42a60 192 int32_t idx = 0;
dflet 0:547251f42a60 193
dflet 0:547251f42a60 194 if(inited)
dflet 0:547251f42a60 195 return -1;
dflet 0:547251f42a60 196
dflet 0:547251f42a60 197 if(NULL == cbs)
dflet 0:547251f42a60 198 return -2;
dflet 0:547251f42a60 199
dflet 0:547251f42a60 200 if(!(cbs->topic_enroll && cbs->topic_cancel && cbs->publish))
dflet 0:547251f42a60 201 return -3;
dflet 0:547251f42a60 202
dflet 0:547251f42a60 203 for(idx = 0; idx < MAX_PLUGINS; idx++) {
dflet 0:547251f42a60 204 struct plugin_desc *plugin = plugins + idx;
dflet 0:547251f42a60 205 plugin->index = idx;
dflet 0:547251f42a60 206
dflet 0:547251f42a60 207 plugin_reset(plugin);
dflet 0:547251f42a60 208 }
dflet 0:547251f42a60 209
dflet 0:547251f42a60 210 msg_cbs = &msg_cbacks;
dflet 0:547251f42a60 211 memcpy(msg_cbs, cbs, sizeof(struct plugin_core_msg_cbs));
dflet 0:547251f42a60 212
dflet 0:547251f42a60 213 inited = true;
dflet 0:547251f42a60 214
dflet 0:547251f42a60 215 USR_INFO("Plugin module has been initialized.\n\r");
dflet 0:547251f42a60 216 return 0;
dflet 0:547251f42a60 217 }
dflet 0:547251f42a60 218
dflet 0:547251f42a60 219 }//namespace mbed_mqtt