Part of TI's mqtt
Dependents: mqtt_V1 cc3100_Test_mqtt_CM3
server_plug.cpp@0:547251f42a60, 2015-06-06 (annotated)
- Committer:
- dflet
- Date:
- Sat Jun 06 13:29:08 2015 +0000
- Revision:
- 0:547251f42a60
Part of mqtt_V1
Who changed what in which revision?
User | Revision | Line number | New 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 |