The Pubnub C-core library. It's home is on https://github.com/pubnub/c_core, this is a copy
Dependents: Pubnub_c_core_mbed2_pal Pubnub_c_core_mbed2_pal Pubnub_c_core_mbed2_pal2
pubnub_ccore.cpp@2:d85e42c1125d, 2016-11-22 (annotated)
- Committer:
- sveljko
- Date:
- Tue Nov 22 22:21:39 2016 +0000
- Revision:
- 2:d85e42c1125d
- Parent:
- 0:d13755cfb705
Added `pubnub_helper` module
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
sveljko | 0:d13755cfb705 | 1 | /* -*- c-file-style:"stroustrup"; indent-tabs-mode: nil -*- */ |
sveljko | 0:d13755cfb705 | 2 | #include "pubnub_ccore.h" |
sveljko | 0:d13755cfb705 | 3 | #include "pubnub_version.h" |
sveljko | 0:d13755cfb705 | 4 | #include "pubnub_assert.h" |
sveljko | 0:d13755cfb705 | 5 | #include "pubnub_internal.h" |
sveljko | 0:d13755cfb705 | 6 | #include "pubnub_json_parse.h" |
sveljko | 0:d13755cfb705 | 7 | #include "pubnub_log.h" |
sveljko | 0:d13755cfb705 | 8 | |
sveljko | 0:d13755cfb705 | 9 | #include <string.h> |
sveljko | 0:d13755cfb705 | 10 | #include <stdio.h> |
sveljko | 0:d13755cfb705 | 11 | #include <stdlib.h> |
sveljko | 0:d13755cfb705 | 12 | |
sveljko | 0:d13755cfb705 | 13 | |
sveljko | 0:d13755cfb705 | 14 | void pbcc_init(struct pbcc_context *p, const char *publish_key, const char *subscribe_key) |
sveljko | 0:d13755cfb705 | 15 | { |
sveljko | 0:d13755cfb705 | 16 | p->publish_key = publish_key; |
sveljko | 0:d13755cfb705 | 17 | p->subscribe_key = subscribe_key; |
sveljko | 0:d13755cfb705 | 18 | p->timetoken[0] = '0'; |
sveljko | 0:d13755cfb705 | 19 | p->timetoken[1] = '\0'; |
sveljko | 0:d13755cfb705 | 20 | p->uuid = p->auth = NULL; |
sveljko | 0:d13755cfb705 | 21 | p->msg_ofs = p->msg_end = 0; |
sveljko | 0:d13755cfb705 | 22 | if (PUBNUB_DYNAMIC_REPLY_BUFFER) { |
sveljko | 0:d13755cfb705 | 23 | p->http_reply = NULL; |
sveljko | 0:d13755cfb705 | 24 | } |
sveljko | 0:d13755cfb705 | 25 | |
sveljko | 0:d13755cfb705 | 26 | #if PUBNUB_CRYPTO_API |
sveljko | 0:d13755cfb705 | 27 | p->secret_key = NULL; |
sveljko | 0:d13755cfb705 | 28 | #endif |
sveljko | 0:d13755cfb705 | 29 | } |
sveljko | 0:d13755cfb705 | 30 | |
sveljko | 0:d13755cfb705 | 31 | |
sveljko | 0:d13755cfb705 | 32 | void pbcc_deinit(struct pbcc_context *p) |
sveljko | 0:d13755cfb705 | 33 | { |
sveljko | 0:d13755cfb705 | 34 | if (PUBNUB_DYNAMIC_REPLY_BUFFER) { |
sveljko | 0:d13755cfb705 | 35 | if (p->http_reply != NULL) { |
sveljko | 0:d13755cfb705 | 36 | free(p->http_reply); |
sveljko | 0:d13755cfb705 | 37 | p->http_reply = NULL; |
sveljko | 0:d13755cfb705 | 38 | } |
sveljko | 0:d13755cfb705 | 39 | } |
sveljko | 0:d13755cfb705 | 40 | } |
sveljko | 0:d13755cfb705 | 41 | |
sveljko | 0:d13755cfb705 | 42 | |
sveljko | 0:d13755cfb705 | 43 | int pbcc_realloc_reply_buffer(struct pbcc_context *p, unsigned bytes) |
sveljko | 0:d13755cfb705 | 44 | { |
sveljko | 0:d13755cfb705 | 45 | #if PUBNUB_DYNAMIC_REPLY_BUFFER |
sveljko | 0:d13755cfb705 | 46 | char *newbuf = (char*)realloc(p->http_reply, bytes + 1); |
sveljko | 0:d13755cfb705 | 47 | if (NULL == newbuf) { |
sveljko | 0:d13755cfb705 | 48 | return -1; |
sveljko | 0:d13755cfb705 | 49 | } |
sveljko | 0:d13755cfb705 | 50 | p->http_reply = newbuf; |
sveljko | 0:d13755cfb705 | 51 | return 0; |
sveljko | 0:d13755cfb705 | 52 | #else |
sveljko | 0:d13755cfb705 | 53 | if (bytes < sizeof p->http_reply / sizeof p->http_reply[0]) { |
sveljko | 0:d13755cfb705 | 54 | return 0; |
sveljko | 0:d13755cfb705 | 55 | } |
sveljko | 0:d13755cfb705 | 56 | return -1; |
sveljko | 0:d13755cfb705 | 57 | #endif |
sveljko | 0:d13755cfb705 | 58 | } |
sveljko | 0:d13755cfb705 | 59 | |
sveljko | 0:d13755cfb705 | 60 | |
sveljko | 0:d13755cfb705 | 61 | char const *pbcc_get_msg(struct pbcc_context *pb) |
sveljko | 0:d13755cfb705 | 62 | { |
sveljko | 0:d13755cfb705 | 63 | if (pb->msg_ofs < pb->msg_end) { |
sveljko | 0:d13755cfb705 | 64 | char const *rslt = pb->http_reply + pb->msg_ofs; |
sveljko | 0:d13755cfb705 | 65 | pb->msg_ofs += strlen(rslt); |
sveljko | 0:d13755cfb705 | 66 | if (pb->msg_ofs++ <= pb->msg_end) { |
sveljko | 0:d13755cfb705 | 67 | return rslt; |
sveljko | 0:d13755cfb705 | 68 | } |
sveljko | 0:d13755cfb705 | 69 | } |
sveljko | 0:d13755cfb705 | 70 | |
sveljko | 0:d13755cfb705 | 71 | return NULL; |
sveljko | 0:d13755cfb705 | 72 | } |
sveljko | 0:d13755cfb705 | 73 | |
sveljko | 0:d13755cfb705 | 74 | |
sveljko | 0:d13755cfb705 | 75 | char const *pbcc_get_channel(struct pbcc_context *pb) |
sveljko | 0:d13755cfb705 | 76 | { |
sveljko | 0:d13755cfb705 | 77 | if (pb->chan_ofs < pb->chan_end) { |
sveljko | 0:d13755cfb705 | 78 | char const* rslt = pb->http_reply + pb->chan_ofs; |
sveljko | 0:d13755cfb705 | 79 | pb->chan_ofs += strlen(rslt); |
sveljko | 0:d13755cfb705 | 80 | if (pb->chan_ofs++ <= pb->chan_end) { |
sveljko | 0:d13755cfb705 | 81 | return rslt; |
sveljko | 0:d13755cfb705 | 82 | } |
sveljko | 0:d13755cfb705 | 83 | } |
sveljko | 0:d13755cfb705 | 84 | |
sveljko | 0:d13755cfb705 | 85 | return NULL; |
sveljko | 0:d13755cfb705 | 86 | } |
sveljko | 0:d13755cfb705 | 87 | |
sveljko | 0:d13755cfb705 | 88 | |
sveljko | 0:d13755cfb705 | 89 | void pbcc_set_uuid(struct pbcc_context *pb, const char *uuid) |
sveljko | 0:d13755cfb705 | 90 | { |
sveljko | 0:d13755cfb705 | 91 | pb->uuid = uuid; |
sveljko | 0:d13755cfb705 | 92 | } |
sveljko | 0:d13755cfb705 | 93 | |
sveljko | 0:d13755cfb705 | 94 | |
sveljko | 0:d13755cfb705 | 95 | void pbcc_set_auth(struct pbcc_context *pb, const char *auth) |
sveljko | 0:d13755cfb705 | 96 | { |
sveljko | 0:d13755cfb705 | 97 | pb->auth = auth; |
sveljko | 0:d13755cfb705 | 98 | } |
sveljko | 0:d13755cfb705 | 99 | |
sveljko | 0:d13755cfb705 | 100 | |
sveljko | 0:d13755cfb705 | 101 | /* Find the beginning of a JSON string that comes after comma and ends |
sveljko | 0:d13755cfb705 | 102 | * at @c &buf[len]. |
sveljko | 0:d13755cfb705 | 103 | * @return position (index) of the found start or -1 on error. */ |
sveljko | 0:d13755cfb705 | 104 | static int find_string_start(char const *buf, int len) |
sveljko | 0:d13755cfb705 | 105 | { |
sveljko | 0:d13755cfb705 | 106 | int i; |
sveljko | 0:d13755cfb705 | 107 | for (i = len-1; i > 0; --i) { |
sveljko | 0:d13755cfb705 | 108 | if (buf[i] == '"') { |
sveljko | 0:d13755cfb705 | 109 | return (buf[i-1] == ',') ? i : -1; |
sveljko | 0:d13755cfb705 | 110 | } |
sveljko | 0:d13755cfb705 | 111 | } |
sveljko | 0:d13755cfb705 | 112 | return -1; |
sveljko | 0:d13755cfb705 | 113 | } |
sveljko | 0:d13755cfb705 | 114 | |
sveljko | 0:d13755cfb705 | 115 | |
sveljko | 0:d13755cfb705 | 116 | /** Split @p buf string containing a JSON array (with arbitrary |
sveljko | 0:d13755cfb705 | 117 | * contents) to multiple NUL-terminated C strings, in-place. |
sveljko | 0:d13755cfb705 | 118 | */ |
sveljko | 0:d13755cfb705 | 119 | static bool split_array(char *buf) |
sveljko | 0:d13755cfb705 | 120 | { |
sveljko | 0:d13755cfb705 | 121 | bool escaped = false; |
sveljko | 0:d13755cfb705 | 122 | bool in_string = false; |
sveljko | 0:d13755cfb705 | 123 | int bracket_level = 0; |
sveljko | 0:d13755cfb705 | 124 | |
sveljko | 0:d13755cfb705 | 125 | for (; *buf != '\0'; ++buf) { |
sveljko | 0:d13755cfb705 | 126 | if (escaped) { |
sveljko | 0:d13755cfb705 | 127 | escaped = false; |
sveljko | 0:d13755cfb705 | 128 | } |
sveljko | 0:d13755cfb705 | 129 | else if ('"' == *buf) { |
sveljko | 0:d13755cfb705 | 130 | in_string = !in_string; |
sveljko | 0:d13755cfb705 | 131 | } |
sveljko | 0:d13755cfb705 | 132 | else if (in_string) { |
sveljko | 0:d13755cfb705 | 133 | escaped = ('\\' == *buf); |
sveljko | 0:d13755cfb705 | 134 | } |
sveljko | 0:d13755cfb705 | 135 | else { |
sveljko | 0:d13755cfb705 | 136 | switch (*buf) { |
sveljko | 0:d13755cfb705 | 137 | case '[': case '{': bracket_level++; break; |
sveljko | 0:d13755cfb705 | 138 | case ']': case '}': bracket_level--; break; |
sveljko | 0:d13755cfb705 | 139 | /* if at root, split! */ |
sveljko | 0:d13755cfb705 | 140 | case ',': if (bracket_level == 0) { *buf = '\0'; } break; |
sveljko | 0:d13755cfb705 | 141 | default: break; |
sveljko | 0:d13755cfb705 | 142 | } |
sveljko | 0:d13755cfb705 | 143 | } |
sveljko | 0:d13755cfb705 | 144 | } |
sveljko | 0:d13755cfb705 | 145 | |
sveljko | 0:d13755cfb705 | 146 | PUBNUB_LOG_TRACE("escaped = %d, in_string = %d, bracket_level = %d\n", escaped, in_string, bracket_level); |
sveljko | 0:d13755cfb705 | 147 | return !(escaped || in_string || (bracket_level > 0)); |
sveljko | 0:d13755cfb705 | 148 | } |
sveljko | 0:d13755cfb705 | 149 | |
sveljko | 0:d13755cfb705 | 150 | |
sveljko | 0:d13755cfb705 | 151 | static int simple_parse_response(struct pbcc_context *p) |
sveljko | 0:d13755cfb705 | 152 | { |
sveljko | 0:d13755cfb705 | 153 | char *reply = p->http_reply; |
sveljko | 0:d13755cfb705 | 154 | int replylen = p->http_buf_len; |
sveljko | 0:d13755cfb705 | 155 | if (replylen < 2) { |
sveljko | 0:d13755cfb705 | 156 | return -1; |
sveljko | 0:d13755cfb705 | 157 | } |
sveljko | 0:d13755cfb705 | 158 | if ((reply[0] != '[') || (reply[replylen-1] != ']')) { |
sveljko | 0:d13755cfb705 | 159 | return -1; |
sveljko | 0:d13755cfb705 | 160 | } |
sveljko | 0:d13755cfb705 | 161 | |
sveljko | 0:d13755cfb705 | 162 | p->chan_ofs = 0; |
sveljko | 0:d13755cfb705 | 163 | p->chan_end = 0; |
sveljko | 0:d13755cfb705 | 164 | |
sveljko | 0:d13755cfb705 | 165 | p->msg_ofs = 1; |
sveljko | 0:d13755cfb705 | 166 | p->msg_end = replylen - 1; |
sveljko | 0:d13755cfb705 | 167 | reply[replylen-1] = '\0'; |
sveljko | 0:d13755cfb705 | 168 | |
sveljko | 0:d13755cfb705 | 169 | return split_array(reply + p->msg_ofs) ? 0 : -1; |
sveljko | 0:d13755cfb705 | 170 | } |
sveljko | 0:d13755cfb705 | 171 | |
sveljko | 0:d13755cfb705 | 172 | |
sveljko | 0:d13755cfb705 | 173 | enum pubnub_res pbcc_parse_publish_response(struct pbcc_context *p) |
sveljko | 0:d13755cfb705 | 174 | { |
sveljko | 0:d13755cfb705 | 175 | char *reply = p->http_reply; |
sveljko | 0:d13755cfb705 | 176 | int replylen = p->http_buf_len; |
sveljko | 0:d13755cfb705 | 177 | if (replylen < 2) { |
sveljko | 0:d13755cfb705 | 178 | return PNR_FORMAT_ERROR; |
sveljko | 0:d13755cfb705 | 179 | } |
sveljko | 0:d13755cfb705 | 180 | if ((reply[0] != '[') || (reply[replylen-1] != ']')) { |
sveljko | 0:d13755cfb705 | 181 | return PNR_FORMAT_ERROR; |
sveljko | 0:d13755cfb705 | 182 | } |
sveljko | 0:d13755cfb705 | 183 | |
sveljko | 0:d13755cfb705 | 184 | p->chan_ofs = p->chan_end = 0; |
sveljko | 0:d13755cfb705 | 185 | p->msg_ofs = p->msg_end = 0; |
sveljko | 0:d13755cfb705 | 186 | |
sveljko | 0:d13755cfb705 | 187 | reply[replylen-1] = '\0'; |
sveljko | 0:d13755cfb705 | 188 | |
sveljko | 0:d13755cfb705 | 189 | if (split_array(reply + 1)) { |
sveljko | 0:d13755cfb705 | 190 | if (1 != strtol(reply+1, NULL, 10)) { |
sveljko | 0:d13755cfb705 | 191 | return PNR_PUBLISH_FAILED; |
sveljko | 0:d13755cfb705 | 192 | } |
sveljko | 0:d13755cfb705 | 193 | return PNR_OK; |
sveljko | 0:d13755cfb705 | 194 | } |
sveljko | 0:d13755cfb705 | 195 | else { |
sveljko | 0:d13755cfb705 | 196 | return PNR_FORMAT_ERROR; |
sveljko | 0:d13755cfb705 | 197 | } |
sveljko | 0:d13755cfb705 | 198 | } |
sveljko | 0:d13755cfb705 | 199 | |
sveljko | 0:d13755cfb705 | 200 | int pbcc_parse_time_response(struct pbcc_context *p) |
sveljko | 0:d13755cfb705 | 201 | { |
sveljko | 0:d13755cfb705 | 202 | return simple_parse_response(p); |
sveljko | 0:d13755cfb705 | 203 | } |
sveljko | 0:d13755cfb705 | 204 | |
sveljko | 0:d13755cfb705 | 205 | |
sveljko | 0:d13755cfb705 | 206 | int pbcc_parse_history_response(struct pbcc_context *p) |
sveljko | 0:d13755cfb705 | 207 | { |
sveljko | 0:d13755cfb705 | 208 | return simple_parse_response(p); |
sveljko | 0:d13755cfb705 | 209 | } |
sveljko | 0:d13755cfb705 | 210 | |
sveljko | 0:d13755cfb705 | 211 | |
sveljko | 0:d13755cfb705 | 212 | int pbcc_parse_presence_response(struct pbcc_context *p) |
sveljko | 0:d13755cfb705 | 213 | { |
sveljko | 0:d13755cfb705 | 214 | char *reply = p->http_reply; |
sveljko | 0:d13755cfb705 | 215 | int replylen = p->http_buf_len; |
sveljko | 0:d13755cfb705 | 216 | if (replylen < 2) { |
sveljko | 0:d13755cfb705 | 217 | return -1; |
sveljko | 0:d13755cfb705 | 218 | } |
sveljko | 0:d13755cfb705 | 219 | if ((reply[0] != '{') || (reply[replylen-1] != '}')) { |
sveljko | 0:d13755cfb705 | 220 | return -1; |
sveljko | 0:d13755cfb705 | 221 | } |
sveljko | 0:d13755cfb705 | 222 | |
sveljko | 0:d13755cfb705 | 223 | p->chan_ofs = p->chan_end = 0; |
sveljko | 0:d13755cfb705 | 224 | |
sveljko | 0:d13755cfb705 | 225 | p->msg_ofs = 0; |
sveljko | 0:d13755cfb705 | 226 | p->msg_end = replylen; |
sveljko | 0:d13755cfb705 | 227 | |
sveljko | 0:d13755cfb705 | 228 | return 0; |
sveljko | 0:d13755cfb705 | 229 | } |
sveljko | 0:d13755cfb705 | 230 | |
sveljko | 0:d13755cfb705 | 231 | |
sveljko | 0:d13755cfb705 | 232 | enum pubnub_res pbcc_parse_channel_registry_response(struct pbcc_context *p) |
sveljko | 0:d13755cfb705 | 233 | { |
sveljko | 0:d13755cfb705 | 234 | enum pbjson_object_name_parse_result result; |
sveljko | 0:d13755cfb705 | 235 | struct pbjson_elem el; |
sveljko | 0:d13755cfb705 | 236 | struct pbjson_elem found; |
sveljko | 0:d13755cfb705 | 237 | |
sveljko | 0:d13755cfb705 | 238 | el.start = p->http_reply; |
sveljko | 0:d13755cfb705 | 239 | el.end = p->http_reply + p->http_buf_len; |
sveljko | 0:d13755cfb705 | 240 | p->chan_ofs = 0; |
sveljko | 0:d13755cfb705 | 241 | p->chan_end = p->http_buf_len; |
sveljko | 0:d13755cfb705 | 242 | |
sveljko | 0:d13755cfb705 | 243 | p->msg_ofs = p->msg_end = 0; |
sveljko | 0:d13755cfb705 | 244 | |
sveljko | 0:d13755cfb705 | 245 | /* We should probably also check that there is a key "service" |
sveljko | 0:d13755cfb705 | 246 | with value "channel-registry". Maybe even that there is a key |
sveljko | 0:d13755cfb705 | 247 | "status" (with value 200). |
sveljko | 0:d13755cfb705 | 248 | */ |
sveljko | 0:d13755cfb705 | 249 | result = pbjson_get_object_value(&el, "error", &found); |
sveljko | 0:d13755cfb705 | 250 | if (jonmpOK == result) { |
sveljko | 0:d13755cfb705 | 251 | if (pbjson_elem_equals_string(&found, "false")) { |
sveljko | 0:d13755cfb705 | 252 | return PNR_OK; |
sveljko | 0:d13755cfb705 | 253 | } |
sveljko | 0:d13755cfb705 | 254 | else { |
sveljko | 0:d13755cfb705 | 255 | return PNR_CHANNEL_REGISTRY_ERROR; |
sveljko | 0:d13755cfb705 | 256 | } |
sveljko | 0:d13755cfb705 | 257 | } |
sveljko | 0:d13755cfb705 | 258 | else { |
sveljko | 0:d13755cfb705 | 259 | return PNR_FORMAT_ERROR; |
sveljko | 0:d13755cfb705 | 260 | } |
sveljko | 0:d13755cfb705 | 261 | } |
sveljko | 0:d13755cfb705 | 262 | |
sveljko | 0:d13755cfb705 | 263 | |
sveljko | 0:d13755cfb705 | 264 | int pbcc_parse_subscribe_response(struct pbcc_context *p) |
sveljko | 0:d13755cfb705 | 265 | { |
sveljko | 0:d13755cfb705 | 266 | int i; |
sveljko | 0:d13755cfb705 | 267 | int previous_i; |
sveljko | 0:d13755cfb705 | 268 | unsigned time_token_length; |
sveljko | 0:d13755cfb705 | 269 | char *reply = p->http_reply; |
sveljko | 0:d13755cfb705 | 270 | int replylen = p->http_buf_len; |
sveljko | 0:d13755cfb705 | 271 | if (replylen < 2) { |
sveljko | 0:d13755cfb705 | 272 | return -1; |
sveljko | 0:d13755cfb705 | 273 | } |
sveljko | 0:d13755cfb705 | 274 | if (reply[replylen-1] != ']' && replylen > 2) { |
sveljko | 0:d13755cfb705 | 275 | replylen -= 2; /* XXX: this seems required by Manxiang */ |
sveljko | 0:d13755cfb705 | 276 | } |
sveljko | 0:d13755cfb705 | 277 | if ((reply[0] != '[') || (reply[replylen-1] != ']') || (reply[replylen-2] != '"')) { |
sveljko | 0:d13755cfb705 | 278 | return -1; |
sveljko | 0:d13755cfb705 | 279 | } |
sveljko | 0:d13755cfb705 | 280 | |
sveljko | 0:d13755cfb705 | 281 | /* Extract the last argument. */ |
sveljko | 0:d13755cfb705 | 282 | previous_i = replylen - 2; |
sveljko | 0:d13755cfb705 | 283 | i = find_string_start(reply, previous_i); |
sveljko | 0:d13755cfb705 | 284 | if (i < 0) { |
sveljko | 0:d13755cfb705 | 285 | return -1; |
sveljko | 0:d13755cfb705 | 286 | } |
sveljko | 0:d13755cfb705 | 287 | reply[replylen - 2] = 0; |
sveljko | 0:d13755cfb705 | 288 | |
sveljko | 0:d13755cfb705 | 289 | /* Now, the last argument may either be a timetoken, a channel group list |
sveljko | 0:d13755cfb705 | 290 | or a channel list. */ |
sveljko | 0:d13755cfb705 | 291 | if (reply[i-2] == '"') { |
sveljko | 0:d13755cfb705 | 292 | int k; |
sveljko | 0:d13755cfb705 | 293 | /* It is a channel list, there is another string argument in front |
sveljko | 0:d13755cfb705 | 294 | * of us. Process the channel list ... */ |
sveljko | 0:d13755cfb705 | 295 | for (k = replylen - 2; k > i+1; --k) { |
sveljko | 0:d13755cfb705 | 296 | if (reply[k] == ',') { |
sveljko | 0:d13755cfb705 | 297 | reply[k] = '\0'; |
sveljko | 0:d13755cfb705 | 298 | } |
sveljko | 0:d13755cfb705 | 299 | } |
sveljko | 0:d13755cfb705 | 300 | |
sveljko | 0:d13755cfb705 | 301 | /* The previous argument is either a timetoken or a channel group |
sveljko | 0:d13755cfb705 | 302 | list. */ |
sveljko | 0:d13755cfb705 | 303 | reply[i-2] = '\0'; |
sveljko | 0:d13755cfb705 | 304 | p->chan_ofs = i+1; |
sveljko | 0:d13755cfb705 | 305 | p->chan_end = replylen - 1; |
sveljko | 0:d13755cfb705 | 306 | previous_i = i-2; |
sveljko | 0:d13755cfb705 | 307 | i = find_string_start(reply, previous_i); |
sveljko | 0:d13755cfb705 | 308 | if (i < 0) { |
sveljko | 0:d13755cfb705 | 309 | p->chan_ofs = 0; |
sveljko | 0:d13755cfb705 | 310 | p->chan_end = 0; |
sveljko | 0:d13755cfb705 | 311 | return -1; |
sveljko | 0:d13755cfb705 | 312 | } |
sveljko | 0:d13755cfb705 | 313 | if (reply[i-2] == '"') { |
sveljko | 0:d13755cfb705 | 314 | /* It is a channel group list. For now, we shall skip it. In |
sveljko | 0:d13755cfb705 | 315 | the future, we may process it like we do the channel list. |
sveljko | 0:d13755cfb705 | 316 | */ |
sveljko | 0:d13755cfb705 | 317 | reply[i-2] = '\0'; |
sveljko | 0:d13755cfb705 | 318 | previous_i = i-2; |
sveljko | 0:d13755cfb705 | 319 | i = find_string_start(reply, previous_i); |
sveljko | 0:d13755cfb705 | 320 | if (i < 0) { |
sveljko | 0:d13755cfb705 | 321 | return -1; |
sveljko | 0:d13755cfb705 | 322 | } |
sveljko | 0:d13755cfb705 | 323 | } |
sveljko | 0:d13755cfb705 | 324 | } |
sveljko | 0:d13755cfb705 | 325 | else { |
sveljko | 0:d13755cfb705 | 326 | p->chan_ofs = 0; |
sveljko | 0:d13755cfb705 | 327 | p->chan_end = 0; |
sveljko | 0:d13755cfb705 | 328 | } |
sveljko | 0:d13755cfb705 | 329 | |
sveljko | 0:d13755cfb705 | 330 | /* Now, `i` points to: |
sveljko | 0:d13755cfb705 | 331 | * [[1,2,3],"5678"] |
sveljko | 0:d13755cfb705 | 332 | * [[1,2,3],"5678","a,b,c"] |
sveljko | 0:d13755cfb705 | 333 | * [[1,2,3],"5678","gr-a,gr-b,gr-c","a,b,c"] |
sveljko | 0:d13755cfb705 | 334 | * ^-- here */ |
sveljko | 0:d13755cfb705 | 335 | |
sveljko | 0:d13755cfb705 | 336 | /* Setup timetoken. */ |
sveljko | 0:d13755cfb705 | 337 | time_token_length = previous_i - (i+1); |
sveljko | 0:d13755cfb705 | 338 | if (time_token_length >= sizeof p->timetoken) { |
sveljko | 0:d13755cfb705 | 339 | p->timetoken[0] = '\0'; |
sveljko | 0:d13755cfb705 | 340 | return -1; |
sveljko | 0:d13755cfb705 | 341 | } |
sveljko | 0:d13755cfb705 | 342 | memcpy(p->timetoken, reply + i+1, time_token_length+1); |
sveljko | 0:d13755cfb705 | 343 | |
sveljko | 0:d13755cfb705 | 344 | /* terminate the [] message array (before the `]`!) */ |
sveljko | 0:d13755cfb705 | 345 | reply[i-2] = 0; |
sveljko | 0:d13755cfb705 | 346 | |
sveljko | 0:d13755cfb705 | 347 | /* Set up the message list - offset, length and NUL-characters |
sveljko | 0:d13755cfb705 | 348 | * splitting the messages. */ |
sveljko | 0:d13755cfb705 | 349 | p->msg_ofs = 2; |
sveljko | 0:d13755cfb705 | 350 | p->msg_end = i-2; |
sveljko | 0:d13755cfb705 | 351 | |
sveljko | 0:d13755cfb705 | 352 | return split_array(reply + p->msg_ofs) ? 0 : -1; |
sveljko | 0:d13755cfb705 | 353 | } |
sveljko | 0:d13755cfb705 | 354 | |
sveljko | 0:d13755cfb705 | 355 | |
sveljko | 0:d13755cfb705 | 356 | static enum pubnub_res append_url_param(struct pbcc_context *pb, char const *param_name, size_t param_name_len, char const *param_val, char separator) |
sveljko | 0:d13755cfb705 | 357 | { |
sveljko | 0:d13755cfb705 | 358 | size_t param_val_len = strlen(param_val); |
sveljko | 0:d13755cfb705 | 359 | if (pb->http_buf_len + 1 + param_name_len + 1 + param_val_len > sizeof pb->http_buf) { |
sveljko | 0:d13755cfb705 | 360 | return PNR_TX_BUFF_TOO_SMALL; |
sveljko | 0:d13755cfb705 | 361 | } |
sveljko | 0:d13755cfb705 | 362 | |
sveljko | 0:d13755cfb705 | 363 | pb->http_buf[pb->http_buf_len++] = separator; |
sveljko | 0:d13755cfb705 | 364 | memcpy(pb->http_buf + pb->http_buf_len, param_name, param_name_len); |
sveljko | 0:d13755cfb705 | 365 | pb->http_buf_len += param_name_len; |
sveljko | 0:d13755cfb705 | 366 | pb->http_buf[pb->http_buf_len++] = '='; |
sveljko | 0:d13755cfb705 | 367 | memcpy(pb->http_buf + pb->http_buf_len, param_val, param_val_len+1); |
sveljko | 0:d13755cfb705 | 368 | pb->http_buf_len += param_val_len; |
sveljko | 0:d13755cfb705 | 369 | |
sveljko | 0:d13755cfb705 | 370 | return PNR_OK; |
sveljko | 0:d13755cfb705 | 371 | } |
sveljko | 0:d13755cfb705 | 372 | |
sveljko | 0:d13755cfb705 | 373 | |
sveljko | 0:d13755cfb705 | 374 | #define APPEND_URL_PARAM_M(pbc, name, var, separator) \ |
sveljko | 0:d13755cfb705 | 375 | if ((var) != NULL) { \ |
sveljko | 0:d13755cfb705 | 376 | const char param_[] = name; \ |
sveljko | 0:d13755cfb705 | 377 | enum pubnub_res rslt_ = append_url_param((pbc), param_, sizeof param_ - 1, (var), (separator)); \ |
sveljko | 0:d13755cfb705 | 378 | if (rslt_ != PNR_OK) { \ |
sveljko | 0:d13755cfb705 | 379 | return rslt_; \ |
sveljko | 0:d13755cfb705 | 380 | } \ |
sveljko | 0:d13755cfb705 | 381 | } |
sveljko | 0:d13755cfb705 | 382 | |
sveljko | 0:d13755cfb705 | 383 | |
sveljko | 0:d13755cfb705 | 384 | #define APPEND_URL_PARAM_INT_M(pbc, name, var, separator) \ |
sveljko | 0:d13755cfb705 | 385 | do { char v_[20]; \ |
sveljko | 0:d13755cfb705 | 386 | snprintf(v_, sizeof v_, "%d", (var)); \ |
sveljko | 0:d13755cfb705 | 387 | APPEND_URL_PARAM_M(pbc, name, v_, separator); \ |
sveljko | 0:d13755cfb705 | 388 | } while (0) |
sveljko | 0:d13755cfb705 | 389 | |
sveljko | 0:d13755cfb705 | 390 | |
sveljko | 0:d13755cfb705 | 391 | #define APPEND_URL_PARAM_UNSIGNED_M(pbc, name, var, separator) \ |
sveljko | 0:d13755cfb705 | 392 | do { char v_[20]; \ |
sveljko | 0:d13755cfb705 | 393 | snprintf(v_, sizeof v_, "%u", (var)); \ |
sveljko | 0:d13755cfb705 | 394 | APPEND_URL_PARAM_M(pbc, name, v_, separator); \ |
sveljko | 0:d13755cfb705 | 395 | } while (0) |
sveljko | 0:d13755cfb705 | 396 | |
sveljko | 0:d13755cfb705 | 397 | #define APPEND_URL_OPT_PARAM_UNSIGNED_M(pbc, name, var, separator) \ |
sveljko | 0:d13755cfb705 | 398 | if ((var) != NULL) { char v_[20]; \ |
sveljko | 0:d13755cfb705 | 399 | snprintf(v_, sizeof v_, "%u", *(var)); \ |
sveljko | 0:d13755cfb705 | 400 | APPEND_URL_PARAM_M(pbc, name, v_, separator); \ |
sveljko | 0:d13755cfb705 | 401 | } while (0) |
sveljko | 0:d13755cfb705 | 402 | |
sveljko | 0:d13755cfb705 | 403 | |
sveljko | 0:d13755cfb705 | 404 | #define APPEND_URL_PARAM_BOOL_M(pbc, name, var, separator) \ |
sveljko | 0:d13755cfb705 | 405 | do { char const *v_ = (var) ? "true" : "false"; \ |
sveljko | 0:d13755cfb705 | 406 | APPEND_URL_PARAM_M(pbc, name, v_, separator); \ |
sveljko | 0:d13755cfb705 | 407 | } while (0) |
sveljko | 0:d13755cfb705 | 408 | |
sveljko | 0:d13755cfb705 | 409 | #define APPEND_URL_PARAM_TRIBOOL_M(pbc, name, var, separator) \ |
sveljko | 0:d13755cfb705 | 410 | if ((var) != pbccNotSet) { \ |
sveljko | 0:d13755cfb705 | 411 | char const *v_ = (var) ? "1" : "0"; \ |
sveljko | 0:d13755cfb705 | 412 | APPEND_URL_PARAM_M(pbc, name, v_, separator); \ |
sveljko | 0:d13755cfb705 | 413 | } |
sveljko | 0:d13755cfb705 | 414 | |
sveljko | 0:d13755cfb705 | 415 | |
sveljko | 0:d13755cfb705 | 416 | enum pubnub_res pbcc_publish_prep(struct pbcc_context *pb, const char *channel, const char *message, bool store_in_history, bool eat_after_reading) |
sveljko | 0:d13755cfb705 | 417 | { |
sveljko | 0:d13755cfb705 | 418 | char const *const uname = pubnub_uname(); |
sveljko | 0:d13755cfb705 | 419 | char const *pmessage = message; |
sveljko | 0:d13755cfb705 | 420 | pb->http_content_len = 0; |
sveljko | 0:d13755cfb705 | 421 | |
sveljko | 0:d13755cfb705 | 422 | pb->http_buf_len = snprintf( |
sveljko | 0:d13755cfb705 | 423 | pb->http_buf, sizeof pb->http_buf, |
sveljko | 0:d13755cfb705 | 424 | "/publish/%s/%s/0/%s/0/", |
sveljko | 0:d13755cfb705 | 425 | pb->publish_key, pb->subscribe_key, channel |
sveljko | 0:d13755cfb705 | 426 | ); |
sveljko | 0:d13755cfb705 | 427 | |
sveljko | 0:d13755cfb705 | 428 | |
sveljko | 0:d13755cfb705 | 429 | while (pmessage[0]) { |
sveljko | 0:d13755cfb705 | 430 | /* RFC 3986 Unreserved characters plus few |
sveljko | 0:d13755cfb705 | 431 | * safe reserved ones. */ |
sveljko | 0:d13755cfb705 | 432 | size_t okspan = strspn(pmessage, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~" ",=:;@[]"); |
sveljko | 0:d13755cfb705 | 433 | if (okspan > 0) { |
sveljko | 0:d13755cfb705 | 434 | if (okspan > sizeof(pb->http_buf)-1 - pb->http_buf_len) { |
sveljko | 0:d13755cfb705 | 435 | pb->http_buf_len = 0; |
sveljko | 0:d13755cfb705 | 436 | return PNR_TX_BUFF_TOO_SMALL; |
sveljko | 0:d13755cfb705 | 437 | } |
sveljko | 0:d13755cfb705 | 438 | memcpy(pb->http_buf + pb->http_buf_len, pmessage, okspan); |
sveljko | 0:d13755cfb705 | 439 | pb->http_buf_len += okspan; |
sveljko | 0:d13755cfb705 | 440 | pb->http_buf[pb->http_buf_len] = 0; |
sveljko | 0:d13755cfb705 | 441 | pmessage += okspan; |
sveljko | 0:d13755cfb705 | 442 | } |
sveljko | 0:d13755cfb705 | 443 | if (pmessage[0]) { |
sveljko | 0:d13755cfb705 | 444 | /* %-encode a non-ok character. */ |
sveljko | 0:d13755cfb705 | 445 | char enc[4] = {'%'}; |
sveljko | 0:d13755cfb705 | 446 | enc[1] = "0123456789ABCDEF"[pmessage[0] / 16]; |
sveljko | 0:d13755cfb705 | 447 | enc[2] = "0123456789ABCDEF"[pmessage[0] % 16]; |
sveljko | 0:d13755cfb705 | 448 | if (3 > sizeof pb->http_buf - 1 - pb->http_buf_len) { |
sveljko | 0:d13755cfb705 | 449 | pb->http_buf_len = 0; |
sveljko | 0:d13755cfb705 | 450 | return PNR_TX_BUFF_TOO_SMALL; |
sveljko | 0:d13755cfb705 | 451 | } |
sveljko | 0:d13755cfb705 | 452 | memcpy(pb->http_buf + pb->http_buf_len, enc, 4); |
sveljko | 0:d13755cfb705 | 453 | pb->http_buf_len += 3; |
sveljko | 0:d13755cfb705 | 454 | ++pmessage; |
sveljko | 0:d13755cfb705 | 455 | } |
sveljko | 0:d13755cfb705 | 456 | } |
sveljko | 0:d13755cfb705 | 457 | APPEND_URL_PARAM_M(pb, "pnsdk", uname, '?'); |
sveljko | 0:d13755cfb705 | 458 | APPEND_URL_PARAM_M(pb, "uuid", pb->uuid, '&'); |
sveljko | 0:d13755cfb705 | 459 | APPEND_URL_PARAM_M(pb, "auth", pb->auth, '&'); |
sveljko | 0:d13755cfb705 | 460 | if (!store_in_history) { |
sveljko | 0:d13755cfb705 | 461 | APPEND_URL_PARAM_BOOL_M(pb, "store", store_in_history, '?'); |
sveljko | 0:d13755cfb705 | 462 | } |
sveljko | 0:d13755cfb705 | 463 | if (eat_after_reading) { |
sveljko | 0:d13755cfb705 | 464 | APPEND_URL_PARAM_BOOL_M(pb, "ear", eat_after_reading, '?'); |
sveljko | 0:d13755cfb705 | 465 | } |
sveljko | 0:d13755cfb705 | 466 | |
sveljko | 0:d13755cfb705 | 467 | return PNR_STARTED; |
sveljko | 0:d13755cfb705 | 468 | } |
sveljko | 0:d13755cfb705 | 469 | |
sveljko | 0:d13755cfb705 | 470 | |
sveljko | 0:d13755cfb705 | 471 | enum pubnub_res pbcc_subscribe_prep(struct pbcc_context *p, const char *channel, const char *channel_group, unsigned *heartbeat) |
sveljko | 0:d13755cfb705 | 472 | { |
sveljko | 0:d13755cfb705 | 473 | if (NULL == channel) { |
sveljko | 0:d13755cfb705 | 474 | if (NULL == channel_group) { |
sveljko | 0:d13755cfb705 | 475 | return PNR_INVALID_CHANNEL; |
sveljko | 0:d13755cfb705 | 476 | } |
sveljko | 0:d13755cfb705 | 477 | channel = ","; |
sveljko | 0:d13755cfb705 | 478 | } |
sveljko | 0:d13755cfb705 | 479 | if (p->msg_ofs < p->msg_end) { |
sveljko | 0:d13755cfb705 | 480 | return PNR_RX_BUFF_NOT_EMPTY; |
sveljko | 0:d13755cfb705 | 481 | } |
sveljko | 0:d13755cfb705 | 482 | |
sveljko | 0:d13755cfb705 | 483 | p->http_content_len = 0; |
sveljko | 0:d13755cfb705 | 484 | p->msg_ofs = p->msg_end = 0; |
sveljko | 0:d13755cfb705 | 485 | |
sveljko | 0:d13755cfb705 | 486 | p->http_buf_len = snprintf( |
sveljko | 0:d13755cfb705 | 487 | p->http_buf, sizeof(p->http_buf), |
sveljko | 0:d13755cfb705 | 488 | "/subscribe/%s/%s/0/%s?pnsdk=%s", |
sveljko | 0:d13755cfb705 | 489 | p->subscribe_key, channel, p->timetoken, |
sveljko | 0:d13755cfb705 | 490 | pubnub_uname() |
sveljko | 0:d13755cfb705 | 491 | ); |
sveljko | 0:d13755cfb705 | 492 | APPEND_URL_PARAM_M(p, "channel-group", channel_group, '&'); |
sveljko | 0:d13755cfb705 | 493 | APPEND_URL_PARAM_M(p, "uuid", p->uuid, '&'); |
sveljko | 0:d13755cfb705 | 494 | APPEND_URL_PARAM_M(p, "auth", p->auth, '&'); |
sveljko | 0:d13755cfb705 | 495 | APPEND_URL_OPT_PARAM_UNSIGNED_M(p, "heartbeat", heartbeat, '&'); |
sveljko | 0:d13755cfb705 | 496 | |
sveljko | 0:d13755cfb705 | 497 | return PNR_STARTED; |
sveljko | 0:d13755cfb705 | 498 | } |
sveljko | 0:d13755cfb705 | 499 | |
sveljko | 0:d13755cfb705 | 500 | |
sveljko | 0:d13755cfb705 | 501 | enum pubnub_res pbcc_leave_prep(struct pbcc_context *pb, const char *channel, const char *channel_group) |
sveljko | 0:d13755cfb705 | 502 | { |
sveljko | 0:d13755cfb705 | 503 | if (NULL == channel) { |
sveljko | 0:d13755cfb705 | 504 | if (NULL == channel_group) { |
sveljko | 0:d13755cfb705 | 505 | return PNR_INVALID_CHANNEL; |
sveljko | 0:d13755cfb705 | 506 | } |
sveljko | 0:d13755cfb705 | 507 | channel = ","; |
sveljko | 0:d13755cfb705 | 508 | } |
sveljko | 0:d13755cfb705 | 509 | pb->http_content_len = 0; |
sveljko | 0:d13755cfb705 | 510 | |
sveljko | 0:d13755cfb705 | 511 | /* Make sure next subscribe() will be a join. */ |
sveljko | 0:d13755cfb705 | 512 | pb->timetoken[0] = '0'; |
sveljko | 0:d13755cfb705 | 513 | pb->timetoken[1] = '\0'; |
sveljko | 0:d13755cfb705 | 514 | |
sveljko | 0:d13755cfb705 | 515 | pb->http_buf_len = snprintf( |
sveljko | 0:d13755cfb705 | 516 | pb->http_buf, sizeof pb->http_buf, |
sveljko | 0:d13755cfb705 | 517 | "/v2/presence/sub-key/%s/channel/%s/leave?pnsdk=%s", |
sveljko | 0:d13755cfb705 | 518 | pb->subscribe_key, channel, |
sveljko | 0:d13755cfb705 | 519 | pubnub_uname() |
sveljko | 0:d13755cfb705 | 520 | ); |
sveljko | 0:d13755cfb705 | 521 | APPEND_URL_PARAM_M(pb, "channel-group", channel_group, '&'); |
sveljko | 0:d13755cfb705 | 522 | APPEND_URL_PARAM_M(pb, "uuid", pb->uuid, '&'); |
sveljko | 0:d13755cfb705 | 523 | APPEND_URL_PARAM_M(pb, "auth", pb->auth, '&'); |
sveljko | 0:d13755cfb705 | 524 | |
sveljko | 0:d13755cfb705 | 525 | return PNR_STARTED; |
sveljko | 0:d13755cfb705 | 526 | } |
sveljko | 0:d13755cfb705 | 527 | |
sveljko | 0:d13755cfb705 | 528 | |
sveljko | 0:d13755cfb705 | 529 | enum pubnub_res pbcc_time_prep(struct pbcc_context *pb) |
sveljko | 0:d13755cfb705 | 530 | { |
sveljko | 0:d13755cfb705 | 531 | if (pb->msg_ofs < pb->msg_end) { |
sveljko | 0:d13755cfb705 | 532 | return PNR_RX_BUFF_NOT_EMPTY; |
sveljko | 0:d13755cfb705 | 533 | } |
sveljko | 0:d13755cfb705 | 534 | |
sveljko | 0:d13755cfb705 | 535 | pb->http_content_len = 0; |
sveljko | 0:d13755cfb705 | 536 | pb->msg_ofs = pb->msg_end = 0; |
sveljko | 0:d13755cfb705 | 537 | |
sveljko | 0:d13755cfb705 | 538 | pb->http_buf_len = snprintf( |
sveljko | 0:d13755cfb705 | 539 | pb->http_buf, sizeof pb->http_buf, |
sveljko | 0:d13755cfb705 | 540 | "/time/0?pnsdk=%s", |
sveljko | 0:d13755cfb705 | 541 | pubnub_uname() |
sveljko | 0:d13755cfb705 | 542 | ); |
sveljko | 0:d13755cfb705 | 543 | APPEND_URL_PARAM_M(pb, "uuid", pb->uuid, '&'); |
sveljko | 0:d13755cfb705 | 544 | APPEND_URL_PARAM_M(pb, "auth", pb->auth, '&'); |
sveljko | 0:d13755cfb705 | 545 | |
sveljko | 0:d13755cfb705 | 546 | return PNR_STARTED; |
sveljko | 0:d13755cfb705 | 547 | } |
sveljko | 0:d13755cfb705 | 548 | |
sveljko | 0:d13755cfb705 | 549 | |
sveljko | 0:d13755cfb705 | 550 | |
sveljko | 0:d13755cfb705 | 551 | enum pubnub_res pbcc_history_prep(struct pbcc_context *pb, const char *channel, unsigned count, bool include_token) |
sveljko | 0:d13755cfb705 | 552 | { |
sveljko | 0:d13755cfb705 | 553 | if (pb->msg_ofs < pb->msg_end) { |
sveljko | 0:d13755cfb705 | 554 | return PNR_RX_BUFF_NOT_EMPTY; |
sveljko | 0:d13755cfb705 | 555 | } |
sveljko | 0:d13755cfb705 | 556 | |
sveljko | 0:d13755cfb705 | 557 | pb->http_content_len = 0; |
sveljko | 0:d13755cfb705 | 558 | pb->msg_ofs = pb->msg_end = 0; |
sveljko | 0:d13755cfb705 | 559 | |
sveljko | 0:d13755cfb705 | 560 | pb->http_buf_len = snprintf( |
sveljko | 0:d13755cfb705 | 561 | pb->http_buf, sizeof pb->http_buf, |
sveljko | 0:d13755cfb705 | 562 | "/v2/history/sub-key/%s/channel/%s?pnsdk=%s", |
sveljko | 0:d13755cfb705 | 563 | pb->subscribe_key, channel, |
sveljko | 0:d13755cfb705 | 564 | pubnub_uname() |
sveljko | 0:d13755cfb705 | 565 | ); |
sveljko | 0:d13755cfb705 | 566 | APPEND_URL_PARAM_M(pb, "auth", pb->auth, '&'); |
sveljko | 0:d13755cfb705 | 567 | APPEND_URL_PARAM_UNSIGNED_M(pb, "count", count, '&'); |
sveljko | 0:d13755cfb705 | 568 | APPEND_URL_PARAM_BOOL_M(pb, "include_token", include_token, '&'); |
sveljko | 0:d13755cfb705 | 569 | |
sveljko | 0:d13755cfb705 | 570 | return PNR_STARTED; |
sveljko | 0:d13755cfb705 | 571 | } |
sveljko | 0:d13755cfb705 | 572 | |
sveljko | 0:d13755cfb705 | 573 | |
sveljko | 0:d13755cfb705 | 574 | enum pubnub_res pbcc_heartbeat_prep(struct pbcc_context *pb, const char *channel, const char *channel_group) |
sveljko | 0:d13755cfb705 | 575 | { |
sveljko | 0:d13755cfb705 | 576 | if (NULL == channel) { |
sveljko | 0:d13755cfb705 | 577 | if (NULL == channel_group) { |
sveljko | 0:d13755cfb705 | 578 | return PNR_INVALID_CHANNEL; |
sveljko | 0:d13755cfb705 | 579 | } |
sveljko | 0:d13755cfb705 | 580 | channel = ","; |
sveljko | 0:d13755cfb705 | 581 | } |
sveljko | 0:d13755cfb705 | 582 | if (pb->msg_ofs < pb->msg_end) { |
sveljko | 0:d13755cfb705 | 583 | return PNR_RX_BUFF_NOT_EMPTY; |
sveljko | 0:d13755cfb705 | 584 | } |
sveljko | 0:d13755cfb705 | 585 | |
sveljko | 0:d13755cfb705 | 586 | pb->http_content_len = 0; |
sveljko | 0:d13755cfb705 | 587 | pb->msg_ofs = pb->msg_end = 0; |
sveljko | 0:d13755cfb705 | 588 | |
sveljko | 0:d13755cfb705 | 589 | pb->http_buf_len = snprintf( |
sveljko | 0:d13755cfb705 | 590 | pb->http_buf, sizeof pb->http_buf, |
sveljko | 0:d13755cfb705 | 591 | "/v2/presence/sub-key/%s/channel/%s/heartbeat?pnsdk=%s", |
sveljko | 0:d13755cfb705 | 592 | pb->subscribe_key, |
sveljko | 0:d13755cfb705 | 593 | channel, |
sveljko | 0:d13755cfb705 | 594 | pubnub_uname() |
sveljko | 0:d13755cfb705 | 595 | ); |
sveljko | 0:d13755cfb705 | 596 | APPEND_URL_PARAM_M(pb, "channel-group", channel_group, '&'); |
sveljko | 0:d13755cfb705 | 597 | APPEND_URL_PARAM_M(pb, "auth", pb->auth, '&'); |
sveljko | 0:d13755cfb705 | 598 | APPEND_URL_PARAM_M(pb, "uuid", pb->uuid, '&'); |
sveljko | 0:d13755cfb705 | 599 | |
sveljko | 0:d13755cfb705 | 600 | return PNR_STARTED; |
sveljko | 0:d13755cfb705 | 601 | } |
sveljko | 0:d13755cfb705 | 602 | |
sveljko | 0:d13755cfb705 | 603 | |
sveljko | 0:d13755cfb705 | 604 | enum pubnub_res pbcc_here_now_prep(struct pbcc_context *pb, const char *channel, const char *channel_group, enum pbcc_tribool disable_uuids, enum pbcc_tribool state) |
sveljko | 0:d13755cfb705 | 605 | { |
sveljko | 0:d13755cfb705 | 606 | if (NULL == channel) { |
sveljko | 0:d13755cfb705 | 607 | if (channel_group != NULL) { |
sveljko | 0:d13755cfb705 | 608 | channel = ","; |
sveljko | 0:d13755cfb705 | 609 | } |
sveljko | 0:d13755cfb705 | 610 | } |
sveljko | 0:d13755cfb705 | 611 | if (pb->msg_ofs < pb->msg_end) { |
sveljko | 0:d13755cfb705 | 612 | return PNR_RX_BUFF_NOT_EMPTY; |
sveljko | 0:d13755cfb705 | 613 | } |
sveljko | 0:d13755cfb705 | 614 | |
sveljko | 0:d13755cfb705 | 615 | pb->http_content_len = 0; |
sveljko | 0:d13755cfb705 | 616 | pb->msg_ofs = pb->msg_end = 0; |
sveljko | 0:d13755cfb705 | 617 | |
sveljko | 0:d13755cfb705 | 618 | pb->http_buf_len = snprintf( |
sveljko | 0:d13755cfb705 | 619 | pb->http_buf, sizeof pb->http_buf, |
sveljko | 0:d13755cfb705 | 620 | "/v2/presence/sub-key/%s%s%s?pnsdk=%s", |
sveljko | 0:d13755cfb705 | 621 | pb->subscribe_key, |
sveljko | 0:d13755cfb705 | 622 | channel ? "/channel/" : "", |
sveljko | 0:d13755cfb705 | 623 | channel ? channel : "", |
sveljko | 0:d13755cfb705 | 624 | pubnub_uname() |
sveljko | 0:d13755cfb705 | 625 | ); |
sveljko | 0:d13755cfb705 | 626 | APPEND_URL_PARAM_M(pb, "channel-group", channel_group, '&'); |
sveljko | 0:d13755cfb705 | 627 | APPEND_URL_PARAM_M(pb, "auth", pb->auth, '&'); |
sveljko | 0:d13755cfb705 | 628 | APPEND_URL_PARAM_M(pb, "uuid", pb->uuid, '&'); |
sveljko | 0:d13755cfb705 | 629 | APPEND_URL_PARAM_TRIBOOL_M(pb, "disable_uuids", disable_uuids, '&'); |
sveljko | 0:d13755cfb705 | 630 | APPEND_URL_PARAM_TRIBOOL_M(pb, "state", state, '&'); |
sveljko | 0:d13755cfb705 | 631 | |
sveljko | 0:d13755cfb705 | 632 | return PNR_STARTED; |
sveljko | 0:d13755cfb705 | 633 | } |
sveljko | 0:d13755cfb705 | 634 | |
sveljko | 0:d13755cfb705 | 635 | |
sveljko | 0:d13755cfb705 | 636 | enum pubnub_res pbcc_where_now_prep(struct pbcc_context *pb, const char *uuid) |
sveljko | 0:d13755cfb705 | 637 | { |
sveljko | 0:d13755cfb705 | 638 | PUBNUB_ASSERT_OPT(uuid != NULL); |
sveljko | 0:d13755cfb705 | 639 | |
sveljko | 0:d13755cfb705 | 640 | if (pb->msg_ofs < pb->msg_end) { |
sveljko | 0:d13755cfb705 | 641 | return PNR_RX_BUFF_NOT_EMPTY; |
sveljko | 0:d13755cfb705 | 642 | } |
sveljko | 0:d13755cfb705 | 643 | |
sveljko | 0:d13755cfb705 | 644 | pb->http_content_len = 0; |
sveljko | 0:d13755cfb705 | 645 | pb->msg_ofs = pb->msg_end = 0; |
sveljko | 0:d13755cfb705 | 646 | |
sveljko | 0:d13755cfb705 | 647 | pb->http_buf_len = snprintf( |
sveljko | 0:d13755cfb705 | 648 | pb->http_buf, sizeof pb->http_buf, |
sveljko | 0:d13755cfb705 | 649 | "/v2/presence/sub-key/%s/uuid/%s?pnsdk=%s", |
sveljko | 0:d13755cfb705 | 650 | pb->subscribe_key, uuid, |
sveljko | 0:d13755cfb705 | 651 | pubnub_uname() |
sveljko | 0:d13755cfb705 | 652 | ); |
sveljko | 0:d13755cfb705 | 653 | APPEND_URL_PARAM_M(pb, "auth", pb->auth, '&'); |
sveljko | 0:d13755cfb705 | 654 | return PNR_STARTED; |
sveljko | 0:d13755cfb705 | 655 | } |
sveljko | 0:d13755cfb705 | 656 | |
sveljko | 0:d13755cfb705 | 657 | |
sveljko | 0:d13755cfb705 | 658 | enum pubnub_res pbcc_set_state_prep(struct pbcc_context *pb, char const *channel, char const *channel_group, const char *uuid, char const *state) |
sveljko | 0:d13755cfb705 | 659 | { |
sveljko | 0:d13755cfb705 | 660 | PUBNUB_ASSERT_OPT(uuid != NULL); |
sveljko | 0:d13755cfb705 | 661 | PUBNUB_ASSERT_OPT(state != NULL); |
sveljko | 0:d13755cfb705 | 662 | |
sveljko | 0:d13755cfb705 | 663 | if (NULL == channel) { |
sveljko | 0:d13755cfb705 | 664 | if (NULL == channel_group) { |
sveljko | 0:d13755cfb705 | 665 | return PNR_INVALID_CHANNEL; |
sveljko | 0:d13755cfb705 | 666 | } |
sveljko | 0:d13755cfb705 | 667 | channel = ","; |
sveljko | 0:d13755cfb705 | 668 | } |
sveljko | 0:d13755cfb705 | 669 | if (pb->msg_ofs < pb->msg_end) { |
sveljko | 0:d13755cfb705 | 670 | return PNR_RX_BUFF_NOT_EMPTY; |
sveljko | 0:d13755cfb705 | 671 | } |
sveljko | 0:d13755cfb705 | 672 | |
sveljko | 0:d13755cfb705 | 673 | pb->http_buf_len = snprintf( |
sveljko | 0:d13755cfb705 | 674 | pb->http_buf, sizeof pb->http_buf, |
sveljko | 0:d13755cfb705 | 675 | "/v2/presence/sub-key/%s/channel/%s/uuid/%s/data?pnsdk=%s&state=%s", |
sveljko | 0:d13755cfb705 | 676 | pb->subscribe_key, channel, uuid, |
sveljko | 0:d13755cfb705 | 677 | pubnub_uname(), state |
sveljko | 0:d13755cfb705 | 678 | ); |
sveljko | 0:d13755cfb705 | 679 | APPEND_URL_PARAM_M(pb, "channel-group", channel_group, '&'); |
sveljko | 0:d13755cfb705 | 680 | APPEND_URL_PARAM_M(pb, "auth", pb->auth, '&'); |
sveljko | 0:d13755cfb705 | 681 | |
sveljko | 0:d13755cfb705 | 682 | return PNR_STARTED; |
sveljko | 0:d13755cfb705 | 683 | } |
sveljko | 0:d13755cfb705 | 684 | |
sveljko | 0:d13755cfb705 | 685 | |
sveljko | 0:d13755cfb705 | 686 | enum pubnub_res pbcc_state_get_prep(struct pbcc_context *pb, char const *channel, char const *channel_group, const char *uuid) |
sveljko | 0:d13755cfb705 | 687 | { |
sveljko | 0:d13755cfb705 | 688 | PUBNUB_ASSERT_OPT(uuid != NULL); |
sveljko | 0:d13755cfb705 | 689 | |
sveljko | 0:d13755cfb705 | 690 | if (NULL == channel) { |
sveljko | 0:d13755cfb705 | 691 | if (NULL == channel_group) { |
sveljko | 0:d13755cfb705 | 692 | return PNR_INVALID_CHANNEL; |
sveljko | 0:d13755cfb705 | 693 | } |
sveljko | 0:d13755cfb705 | 694 | channel = ","; |
sveljko | 0:d13755cfb705 | 695 | } |
sveljko | 0:d13755cfb705 | 696 | if (pb->msg_ofs < pb->msg_end) { |
sveljko | 0:d13755cfb705 | 697 | return PNR_RX_BUFF_NOT_EMPTY; |
sveljko | 0:d13755cfb705 | 698 | } |
sveljko | 0:d13755cfb705 | 699 | |
sveljko | 0:d13755cfb705 | 700 | pb->http_buf_len = snprintf( |
sveljko | 0:d13755cfb705 | 701 | pb->http_buf, sizeof pb->http_buf, |
sveljko | 0:d13755cfb705 | 702 | "/v2/presence/sub-key/%s/channel/%s/uuid/%s?pnsdk=%s", |
sveljko | 0:d13755cfb705 | 703 | pb->subscribe_key, channel, uuid, |
sveljko | 0:d13755cfb705 | 704 | pubnub_uname() |
sveljko | 0:d13755cfb705 | 705 | ); |
sveljko | 0:d13755cfb705 | 706 | APPEND_URL_PARAM_M(pb, "channel-group", channel_group, '&'); |
sveljko | 0:d13755cfb705 | 707 | APPEND_URL_PARAM_M(pb, "auth", pb->auth, '&'); |
sveljko | 0:d13755cfb705 | 708 | |
sveljko | 0:d13755cfb705 | 709 | return PNR_STARTED; |
sveljko | 0:d13755cfb705 | 710 | } |
sveljko | 0:d13755cfb705 | 711 | |
sveljko | 0:d13755cfb705 | 712 | |
sveljko | 0:d13755cfb705 | 713 | enum pubnub_res pbcc_remove_channel_group_prep(struct pbcc_context *pb, char const *channel_group) |
sveljko | 0:d13755cfb705 | 714 | { |
sveljko | 0:d13755cfb705 | 715 | PUBNUB_ASSERT_OPT(channel_group != NULL); |
sveljko | 0:d13755cfb705 | 716 | |
sveljko | 0:d13755cfb705 | 717 | pb->http_buf_len = snprintf( |
sveljko | 0:d13755cfb705 | 718 | pb->http_buf, sizeof pb->http_buf, |
sveljko | 0:d13755cfb705 | 719 | "/v1/channel-registration/sub-key/%s/channel-group/%s/remove?pnsdk=%s", |
sveljko | 0:d13755cfb705 | 720 | pb->subscribe_key, channel_group, pubnub_uname() |
sveljko | 0:d13755cfb705 | 721 | ); |
sveljko | 0:d13755cfb705 | 722 | APPEND_URL_PARAM_M(pb, "auth", pb->auth, '&'); |
sveljko | 0:d13755cfb705 | 723 | |
sveljko | 0:d13755cfb705 | 724 | return PNR_STARTED; |
sveljko | 0:d13755cfb705 | 725 | } |
sveljko | 0:d13755cfb705 | 726 | |
sveljko | 0:d13755cfb705 | 727 | |
sveljko | 0:d13755cfb705 | 728 | enum pubnub_res pbcc_channel_registry_prep(struct pbcc_context *pb, char const *channel_group, char const *param, char const *channel) |
sveljko | 0:d13755cfb705 | 729 | { |
sveljko | 0:d13755cfb705 | 730 | PUBNUB_ASSERT_OPT(channel_group != NULL); |
sveljko | 0:d13755cfb705 | 731 | |
sveljko | 0:d13755cfb705 | 732 | pb->http_buf_len = snprintf( |
sveljko | 0:d13755cfb705 | 733 | pb->http_buf, sizeof pb->http_buf, |
sveljko | 0:d13755cfb705 | 734 | "/v1/channel-registration/sub-key/%s/channel-group/%s?pnsdk=%s", |
sveljko | 0:d13755cfb705 | 735 | pb->subscribe_key, channel_group, pubnub_uname() |
sveljko | 0:d13755cfb705 | 736 | ); |
sveljko | 0:d13755cfb705 | 737 | if (NULL != param) { |
sveljko | 0:d13755cfb705 | 738 | enum pubnub_res rslt; |
sveljko | 0:d13755cfb705 | 739 | PUBNUB_ASSERT_OPT(channel != NULL); |
sveljko | 0:d13755cfb705 | 740 | rslt = append_url_param(pb, param, strlen(param), channel, '&'); |
sveljko | 0:d13755cfb705 | 741 | if (rslt != PNR_OK) { |
sveljko | 0:d13755cfb705 | 742 | return rslt; |
sveljko | 0:d13755cfb705 | 743 | } |
sveljko | 0:d13755cfb705 | 744 | } |
sveljko | 0:d13755cfb705 | 745 | APPEND_URL_PARAM_M(pb, "auth", pb->auth, '&'); |
sveljko | 0:d13755cfb705 | 746 | |
sveljko | 0:d13755cfb705 | 747 | return PNR_STARTED; |
sveljko | 0:d13755cfb705 | 748 | } |