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

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?

UserRevisionLine numberNew 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 }