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_coreapi.h"
sveljko 0:d13755cfb705 3
sveljko 0:d13755cfb705 4 #include "pubnub_ccore.h"
sveljko 0:d13755cfb705 5 #include "pubnub_netcore.h"
sveljko 0:d13755cfb705 6 #include "pubnub_internal.h"
sveljko 0:d13755cfb705 7 #include "pubnub_assert.h"
sveljko 0:d13755cfb705 8 #include "pubnub_timers.h"
sveljko 0:d13755cfb705 9
sveljko 0:d13755cfb705 10 #include "pbpal.h"
sveljko 0:d13755cfb705 11
sveljko 0:d13755cfb705 12 #include <stdlib.h>
sveljko 0:d13755cfb705 13 #include <ctype.h>
sveljko 0:d13755cfb705 14
sveljko 0:d13755cfb705 15
sveljko 0:d13755cfb705 16 pubnub_t* pubnub_init(pubnub_t *p, const char *publish_key, const char *subscribe_key)
sveljko 0:d13755cfb705 17 {
sveljko 0:d13755cfb705 18 PUBNUB_ASSERT(pb_valid_ctx_ptr(p));
sveljko 0:d13755cfb705 19
sveljko 0:d13755cfb705 20 pubnub_mutex_init(p->monitor);
sveljko 0:d13755cfb705 21 pubnub_mutex_lock(p->monitor);
sveljko 0:d13755cfb705 22 pbcc_init(&p->core, publish_key, subscribe_key);
sveljko 0:d13755cfb705 23 if (PUBNUB_TIMERS_API) {
sveljko 0:d13755cfb705 24 p->transaction_timeout_ms = PUBNUB_DEFAULT_TRANSACTION_TIMER;
sveljko 0:d13755cfb705 25 #if defined(PUBNUB_CALLBACK_API)
sveljko 0:d13755cfb705 26 p->previous = p->next = NULL;
sveljko 0:d13755cfb705 27 #endif
sveljko 0:d13755cfb705 28 }
sveljko 0:d13755cfb705 29 #if defined(PUBNUB_CALLBACK_API)
sveljko 0:d13755cfb705 30 p->cb = NULL;
sveljko 0:d13755cfb705 31 p->user_data = NULL;
sveljko 0:d13755cfb705 32 #endif
sveljko 0:d13755cfb705 33 if (PUBNUB_ORIGIN_SETTABLE) {
sveljko 0:d13755cfb705 34 p->origin = PUBNUB_ORIGIN;
sveljko 0:d13755cfb705 35 }
sveljko 0:d13755cfb705 36
sveljko 0:d13755cfb705 37 p->state = PBS_IDLE;
sveljko 0:d13755cfb705 38 p->trans = PBTT_NONE;
sveljko 0:d13755cfb705 39 pbpal_init(p);
sveljko 0:d13755cfb705 40 pubnub_mutex_unlock(p->monitor);
sveljko 0:d13755cfb705 41
sveljko 0:d13755cfb705 42 #if PUBNUB_PROXY_API
sveljko 0:d13755cfb705 43 p->proxy_type = pbproxyNONE;
sveljko 0:d13755cfb705 44 p->proxy_hostname[0] = '\0';
sveljko 0:d13755cfb705 45 p->proxy_tunnel_established = false;
sveljko 0:d13755cfb705 46 p->proxy_port = 80;
sveljko 0:d13755cfb705 47 #endif
sveljko 0:d13755cfb705 48
sveljko 0:d13755cfb705 49 return p;
sveljko 0:d13755cfb705 50 }
sveljko 0:d13755cfb705 51
sveljko 0:d13755cfb705 52
sveljko 0:d13755cfb705 53 enum pubnub_res pubnub_publish(pubnub_t *pb, const char *channel, const char *message)
sveljko 0:d13755cfb705 54 {
sveljko 0:d13755cfb705 55 enum pubnub_res rslt;
sveljko 0:d13755cfb705 56
sveljko 0:d13755cfb705 57 PUBNUB_ASSERT(pb_valid_ctx_ptr(pb));
sveljko 0:d13755cfb705 58
sveljko 0:d13755cfb705 59 pubnub_mutex_lock(pb->monitor);
sveljko 0:d13755cfb705 60 if (pb->state != PBS_IDLE) {
sveljko 0:d13755cfb705 61 pubnub_mutex_unlock(pb->monitor);
sveljko 0:d13755cfb705 62 return PNR_IN_PROGRESS;
sveljko 0:d13755cfb705 63 }
sveljko 0:d13755cfb705 64
sveljko 0:d13755cfb705 65 rslt = pbcc_publish_prep(&pb->core, channel, message, true, false);
sveljko 0:d13755cfb705 66 if (PNR_STARTED == rslt) {
sveljko 0:d13755cfb705 67 pb->trans = PBTT_PUBLISH;
sveljko 0:d13755cfb705 68 pb->core.last_result = PNR_STARTED;
sveljko 0:d13755cfb705 69 pbnc_fsm(pb);
sveljko 0:d13755cfb705 70 rslt = pb->core.last_result;
sveljko 0:d13755cfb705 71 }
sveljko 0:d13755cfb705 72 pubnub_mutex_unlock(pb->monitor);
sveljko 0:d13755cfb705 73
sveljko 0:d13755cfb705 74 return rslt;
sveljko 0:d13755cfb705 75 }
sveljko 0:d13755cfb705 76
sveljko 0:d13755cfb705 77
sveljko 0:d13755cfb705 78 enum pubnub_res pubnub_publishv2(pubnub_t *pb, const char *channel, const char *message, bool store_in_history, bool eat_after_reading)
sveljko 0:d13755cfb705 79 {
sveljko 0:d13755cfb705 80 enum pubnub_res rslt;
sveljko 0:d13755cfb705 81
sveljko 0:d13755cfb705 82 PUBNUB_ASSERT(pb_valid_ctx_ptr(pb));
sveljko 0:d13755cfb705 83
sveljko 0:d13755cfb705 84 pubnub_mutex_lock(pb->monitor);
sveljko 0:d13755cfb705 85 if (pb->state != PBS_IDLE) {
sveljko 0:d13755cfb705 86 pubnub_mutex_unlock(pb->monitor);
sveljko 0:d13755cfb705 87 return PNR_IN_PROGRESS;
sveljko 0:d13755cfb705 88 }
sveljko 0:d13755cfb705 89
sveljko 0:d13755cfb705 90 rslt = pbcc_publish_prep(&pb->core, channel, message, store_in_history, eat_after_reading);
sveljko 0:d13755cfb705 91 if (PNR_STARTED == rslt) {
sveljko 0:d13755cfb705 92 pb->trans = PBTT_PUBLISH;
sveljko 0:d13755cfb705 93 pb->core.last_result = PNR_STARTED;
sveljko 0:d13755cfb705 94 pbnc_fsm(pb);
sveljko 0:d13755cfb705 95 rslt = pb->core.last_result;
sveljko 0:d13755cfb705 96 }
sveljko 0:d13755cfb705 97
sveljko 0:d13755cfb705 98 pubnub_mutex_unlock(pb->monitor);
sveljko 0:d13755cfb705 99 return rslt;
sveljko 0:d13755cfb705 100 }
sveljko 0:d13755cfb705 101
sveljko 0:d13755cfb705 102
sveljko 0:d13755cfb705 103 char const *pubnub_get(pubnub_t *pb)
sveljko 0:d13755cfb705 104 {
sveljko 0:d13755cfb705 105 char const *result;
sveljko 0:d13755cfb705 106 PUBNUB_ASSERT(pb_valid_ctx_ptr(pb));
sveljko 0:d13755cfb705 107
sveljko 0:d13755cfb705 108 pubnub_mutex_lock(pb->monitor);
sveljko 0:d13755cfb705 109 result = pbcc_get_msg(&pb->core);
sveljko 0:d13755cfb705 110 pubnub_mutex_unlock(pb->monitor);
sveljko 0:d13755cfb705 111
sveljko 0:d13755cfb705 112 return result;
sveljko 0:d13755cfb705 113 }
sveljko 0:d13755cfb705 114
sveljko 0:d13755cfb705 115
sveljko 0:d13755cfb705 116 char const *pubnub_get_channel(pubnub_t *pb)
sveljko 0:d13755cfb705 117 {
sveljko 0:d13755cfb705 118 char const *result;
sveljko 0:d13755cfb705 119 PUBNUB_ASSERT(pb_valid_ctx_ptr(pb));
sveljko 0:d13755cfb705 120
sveljko 0:d13755cfb705 121 pubnub_mutex_lock(pb->monitor);
sveljko 0:d13755cfb705 122 result = pbcc_get_channel(&pb->core);
sveljko 0:d13755cfb705 123 pubnub_mutex_unlock(pb->monitor);
sveljko 0:d13755cfb705 124
sveljko 0:d13755cfb705 125 return result;
sveljko 0:d13755cfb705 126 }
sveljko 0:d13755cfb705 127
sveljko 0:d13755cfb705 128
sveljko 0:d13755cfb705 129 enum pubnub_res pubnub_subscribe(pubnub_t *p, const char *channel, const char *channel_group)
sveljko 0:d13755cfb705 130 {
sveljko 0:d13755cfb705 131 enum pubnub_res rslt;
sveljko 0:d13755cfb705 132
sveljko 0:d13755cfb705 133 PUBNUB_ASSERT(pb_valid_ctx_ptr(p));
sveljko 0:d13755cfb705 134
sveljko 0:d13755cfb705 135 pubnub_mutex_lock(p->monitor);
sveljko 0:d13755cfb705 136 if (p->state != PBS_IDLE) {
sveljko 0:d13755cfb705 137 pubnub_mutex_unlock(p->monitor);
sveljko 0:d13755cfb705 138 return PNR_IN_PROGRESS;
sveljko 0:d13755cfb705 139 }
sveljko 0:d13755cfb705 140
sveljko 0:d13755cfb705 141 rslt = pbcc_subscribe_prep(&p->core, channel, channel_group, NULL);
sveljko 0:d13755cfb705 142 if (PNR_STARTED == rslt) {
sveljko 0:d13755cfb705 143 p->trans = PBTT_SUBSCRIBE;
sveljko 0:d13755cfb705 144 p->core.last_result = PNR_STARTED;
sveljko 0:d13755cfb705 145 pbnc_fsm(p);
sveljko 0:d13755cfb705 146 rslt = p->core.last_result;
sveljko 0:d13755cfb705 147 }
sveljko 0:d13755cfb705 148
sveljko 0:d13755cfb705 149 pubnub_mutex_unlock(p->monitor);
sveljko 0:d13755cfb705 150 return rslt;
sveljko 0:d13755cfb705 151 }
sveljko 0:d13755cfb705 152
sveljko 0:d13755cfb705 153
sveljko 0:d13755cfb705 154 enum pubnub_res pubnub_leave(pubnub_t *p, const char *channel, const char *channel_group)
sveljko 0:d13755cfb705 155 {
sveljko 0:d13755cfb705 156 enum pubnub_res rslt;
sveljko 0:d13755cfb705 157
sveljko 0:d13755cfb705 158 PUBNUB_ASSERT(pb_valid_ctx_ptr(p));
sveljko 0:d13755cfb705 159
sveljko 0:d13755cfb705 160 pubnub_mutex_lock(p->monitor);
sveljko 0:d13755cfb705 161 if (p->state != PBS_IDLE) {
sveljko 0:d13755cfb705 162 pubnub_mutex_unlock(p->monitor);
sveljko 0:d13755cfb705 163 return PNR_IN_PROGRESS;
sveljko 0:d13755cfb705 164 }
sveljko 0:d13755cfb705 165
sveljko 0:d13755cfb705 166 rslt = pbcc_leave_prep(&p->core, channel, channel_group);
sveljko 0:d13755cfb705 167 if (PNR_STARTED == rslt) {
sveljko 0:d13755cfb705 168 p->trans = PBTT_LEAVE;
sveljko 0:d13755cfb705 169 p->core.last_result = PNR_STARTED;
sveljko 0:d13755cfb705 170 pbnc_fsm(p);
sveljko 0:d13755cfb705 171 rslt = p->core.last_result;
sveljko 0:d13755cfb705 172 }
sveljko 0:d13755cfb705 173
sveljko 0:d13755cfb705 174 pubnub_mutex_unlock(p->monitor);
sveljko 0:d13755cfb705 175 return rslt;
sveljko 0:d13755cfb705 176 }
sveljko 0:d13755cfb705 177
sveljko 0:d13755cfb705 178
sveljko 0:d13755cfb705 179 enum pubnub_res pubnub_time(pubnub_t *p)
sveljko 0:d13755cfb705 180 {
sveljko 0:d13755cfb705 181 enum pubnub_res rslt;
sveljko 0:d13755cfb705 182
sveljko 0:d13755cfb705 183 PUBNUB_ASSERT(pb_valid_ctx_ptr(p));
sveljko 0:d13755cfb705 184
sveljko 0:d13755cfb705 185 pubnub_mutex_lock(p->monitor);
sveljko 0:d13755cfb705 186 if (p->state != PBS_IDLE) {
sveljko 0:d13755cfb705 187 pubnub_mutex_unlock(p->monitor);
sveljko 0:d13755cfb705 188 return PNR_IN_PROGRESS;
sveljko 0:d13755cfb705 189 }
sveljko 0:d13755cfb705 190
sveljko 0:d13755cfb705 191 rslt = pbcc_time_prep(&p->core);
sveljko 0:d13755cfb705 192 if (PNR_STARTED == rslt) {
sveljko 0:d13755cfb705 193 p->trans = PBTT_TIME;
sveljko 0:d13755cfb705 194 p->core.last_result = PNR_STARTED;
sveljko 0:d13755cfb705 195 pbnc_fsm(p);
sveljko 0:d13755cfb705 196 rslt = p->core.last_result;
sveljko 0:d13755cfb705 197 }
sveljko 0:d13755cfb705 198
sveljko 0:d13755cfb705 199 pubnub_mutex_unlock(p->monitor);
sveljko 0:d13755cfb705 200 return rslt;
sveljko 0:d13755cfb705 201 }
sveljko 0:d13755cfb705 202
sveljko 0:d13755cfb705 203
sveljko 0:d13755cfb705 204 enum pubnub_res pubnub_history(pubnub_t *pb, const char *channel, unsigned count, bool include_token)
sveljko 0:d13755cfb705 205 {
sveljko 0:d13755cfb705 206 enum pubnub_res rslt;
sveljko 0:d13755cfb705 207
sveljko 0:d13755cfb705 208 PUBNUB_ASSERT(pb_valid_ctx_ptr(pb));
sveljko 0:d13755cfb705 209
sveljko 0:d13755cfb705 210 pubnub_mutex_lock(pb->monitor);
sveljko 0:d13755cfb705 211 if (pb->state != PBS_IDLE) {
sveljko 0:d13755cfb705 212 pubnub_mutex_unlock(pb->monitor);
sveljko 0:d13755cfb705 213 return PNR_IN_PROGRESS;
sveljko 0:d13755cfb705 214 }
sveljko 0:d13755cfb705 215
sveljko 0:d13755cfb705 216 rslt = pbcc_history_prep(&pb->core, channel, count, include_token);
sveljko 0:d13755cfb705 217 if (PNR_STARTED == rslt) {
sveljko 0:d13755cfb705 218 pb->trans = PBTT_HISTORY;
sveljko 0:d13755cfb705 219 pb->core.last_result = PNR_STARTED;
sveljko 0:d13755cfb705 220 pbnc_fsm(pb);
sveljko 0:d13755cfb705 221 rslt = pb->core.last_result;
sveljko 0:d13755cfb705 222 }
sveljko 0:d13755cfb705 223
sveljko 0:d13755cfb705 224 pubnub_mutex_unlock(pb->monitor);
sveljko 0:d13755cfb705 225 return rslt;
sveljko 0:d13755cfb705 226 }
sveljko 0:d13755cfb705 227
sveljko 0:d13755cfb705 228
sveljko 0:d13755cfb705 229 enum pubnub_res pubnub_heartbeat(pubnub_t *pb, const char *channel, const char *channel_group)
sveljko 0:d13755cfb705 230 {
sveljko 0:d13755cfb705 231 enum pubnub_res rslt;
sveljko 0:d13755cfb705 232
sveljko 0:d13755cfb705 233 PUBNUB_ASSERT(pb_valid_ctx_ptr(pb));
sveljko 0:d13755cfb705 234
sveljko 0:d13755cfb705 235 pubnub_mutex_lock(pb->monitor);
sveljko 0:d13755cfb705 236 if (pb->state != PBS_IDLE) {
sveljko 0:d13755cfb705 237 pubnub_mutex_unlock(pb->monitor);
sveljko 0:d13755cfb705 238 return PNR_IN_PROGRESS;
sveljko 0:d13755cfb705 239 }
sveljko 0:d13755cfb705 240
sveljko 0:d13755cfb705 241 rslt = pbcc_heartbeat_prep(&pb->core, channel, channel_group);
sveljko 0:d13755cfb705 242 if (PNR_STARTED == rslt) {
sveljko 0:d13755cfb705 243 pb->trans = PBTT_HEARTBEAT;
sveljko 0:d13755cfb705 244 pb->core.last_result = PNR_STARTED;
sveljko 0:d13755cfb705 245 pbnc_fsm(pb);
sveljko 0:d13755cfb705 246 rslt = pb->core.last_result;
sveljko 0:d13755cfb705 247 }
sveljko 0:d13755cfb705 248
sveljko 0:d13755cfb705 249 pubnub_mutex_unlock(pb->monitor);
sveljko 0:d13755cfb705 250 return rslt;
sveljko 0:d13755cfb705 251 }
sveljko 0:d13755cfb705 252
sveljko 0:d13755cfb705 253
sveljko 0:d13755cfb705 254 enum pubnub_res pubnub_here_now(pubnub_t *pb, const char *channel, const char *channel_group)
sveljko 0:d13755cfb705 255 {
sveljko 0:d13755cfb705 256 enum pubnub_res rslt;
sveljko 0:d13755cfb705 257
sveljko 0:d13755cfb705 258 PUBNUB_ASSERT(pb_valid_ctx_ptr(pb));
sveljko 0:d13755cfb705 259
sveljko 0:d13755cfb705 260 pubnub_mutex_lock(pb->monitor);
sveljko 0:d13755cfb705 261 if (pb->state != PBS_IDLE) {
sveljko 0:d13755cfb705 262 pubnub_mutex_unlock(pb->monitor);
sveljko 0:d13755cfb705 263 return PNR_IN_PROGRESS;
sveljko 0:d13755cfb705 264 }
sveljko 0:d13755cfb705 265
sveljko 0:d13755cfb705 266 rslt = pbcc_here_now_prep(&pb->core, channel, channel_group, pbccNotSet, pbccNotSet);
sveljko 0:d13755cfb705 267 if (PNR_STARTED == rslt) {
sveljko 0:d13755cfb705 268 pb->trans = PBTT_HERENOW;
sveljko 0:d13755cfb705 269 pb->core.last_result = PNR_STARTED;
sveljko 0:d13755cfb705 270 pbnc_fsm(pb);
sveljko 0:d13755cfb705 271 rslt = pb->core.last_result;
sveljko 0:d13755cfb705 272 }
sveljko 0:d13755cfb705 273
sveljko 0:d13755cfb705 274 pubnub_mutex_unlock(pb->monitor);
sveljko 0:d13755cfb705 275 return rslt;
sveljko 0:d13755cfb705 276 }
sveljko 0:d13755cfb705 277
sveljko 0:d13755cfb705 278
sveljko 0:d13755cfb705 279 enum pubnub_res pubnub_global_here_now(pubnub_t *pb)
sveljko 0:d13755cfb705 280 {
sveljko 0:d13755cfb705 281 enum pubnub_res rslt;
sveljko 0:d13755cfb705 282
sveljko 0:d13755cfb705 283 PUBNUB_ASSERT(pb_valid_ctx_ptr(pb));
sveljko 0:d13755cfb705 284
sveljko 0:d13755cfb705 285 pubnub_mutex_lock(pb->monitor);
sveljko 0:d13755cfb705 286 if (pb->state != PBS_IDLE) {
sveljko 0:d13755cfb705 287 pubnub_mutex_unlock(pb->monitor);
sveljko 0:d13755cfb705 288 return PNR_IN_PROGRESS;
sveljko 0:d13755cfb705 289 }
sveljko 0:d13755cfb705 290
sveljko 0:d13755cfb705 291 rslt = pbcc_here_now_prep(&pb->core, NULL, NULL, pbccNotSet, pbccNotSet);
sveljko 0:d13755cfb705 292 if (PNR_STARTED == rslt) {
sveljko 0:d13755cfb705 293 pb->trans = PBTT_GLOBAL_HERENOW;
sveljko 0:d13755cfb705 294 pb->core.last_result = PNR_STARTED;
sveljko 0:d13755cfb705 295 pbnc_fsm(pb);
sveljko 0:d13755cfb705 296 rslt = pb->core.last_result;
sveljko 0:d13755cfb705 297 }
sveljko 0:d13755cfb705 298
sveljko 0:d13755cfb705 299 pubnub_mutex_unlock(pb->monitor);
sveljko 0:d13755cfb705 300 return rslt;
sveljko 0:d13755cfb705 301 }
sveljko 0:d13755cfb705 302
sveljko 0:d13755cfb705 303
sveljko 0:d13755cfb705 304 enum pubnub_res pubnub_where_now(pubnub_t *pb, const char *uuid)
sveljko 0:d13755cfb705 305 {
sveljko 0:d13755cfb705 306 enum pubnub_res rslt;
sveljko 0:d13755cfb705 307
sveljko 0:d13755cfb705 308 PUBNUB_ASSERT(pb_valid_ctx_ptr(pb));
sveljko 0:d13755cfb705 309
sveljko 0:d13755cfb705 310 pubnub_mutex_lock(pb->monitor);
sveljko 0:d13755cfb705 311 if (pb->state != PBS_IDLE) {
sveljko 0:d13755cfb705 312 pubnub_mutex_unlock(pb->monitor);
sveljko 0:d13755cfb705 313 return PNR_IN_PROGRESS;
sveljko 0:d13755cfb705 314 }
sveljko 0:d13755cfb705 315
sveljko 0:d13755cfb705 316 rslt = pbcc_where_now_prep(&pb->core, uuid ? uuid : pb->core.uuid);
sveljko 0:d13755cfb705 317 if (PNR_STARTED == rslt) {
sveljko 0:d13755cfb705 318 pb->trans = PBTT_WHERENOW;
sveljko 0:d13755cfb705 319 pb->core.last_result = PNR_STARTED;
sveljko 0:d13755cfb705 320 pbnc_fsm(pb);
sveljko 0:d13755cfb705 321 rslt = pb->core.last_result;
sveljko 0:d13755cfb705 322 }
sveljko 0:d13755cfb705 323
sveljko 0:d13755cfb705 324 pubnub_mutex_unlock(pb->monitor);
sveljko 0:d13755cfb705 325 return rslt;
sveljko 0:d13755cfb705 326 }
sveljko 0:d13755cfb705 327
sveljko 0:d13755cfb705 328
sveljko 0:d13755cfb705 329 enum pubnub_res pubnub_set_state(pubnub_t *pb, char const *channel, char const *channel_group, const char *uuid, char const *state)
sveljko 0:d13755cfb705 330 {
sveljko 0:d13755cfb705 331 enum pubnub_res rslt;
sveljko 0:d13755cfb705 332
sveljko 0:d13755cfb705 333 PUBNUB_ASSERT(pb_valid_ctx_ptr(pb));
sveljko 0:d13755cfb705 334
sveljko 0:d13755cfb705 335 pubnub_mutex_lock(pb->monitor);
sveljko 0:d13755cfb705 336 if (pb->state != PBS_IDLE) {
sveljko 0:d13755cfb705 337 pubnub_mutex_unlock(pb->monitor);
sveljko 0:d13755cfb705 338 return PNR_IN_PROGRESS;
sveljko 0:d13755cfb705 339 }
sveljko 0:d13755cfb705 340
sveljko 0:d13755cfb705 341 rslt = pbcc_set_state_prep(&pb->core, channel, channel_group, uuid ? uuid : pb->core.uuid, state);
sveljko 0:d13755cfb705 342 if (PNR_STARTED == rslt) {
sveljko 0:d13755cfb705 343 pb->trans = PBTT_SET_STATE;
sveljko 0:d13755cfb705 344 pb->core.last_result = PNR_STARTED;
sveljko 0:d13755cfb705 345 pbnc_fsm(pb);
sveljko 0:d13755cfb705 346 rslt = pb->core.last_result;
sveljko 0:d13755cfb705 347 }
sveljko 0:d13755cfb705 348
sveljko 0:d13755cfb705 349 pubnub_mutex_unlock(pb->monitor);
sveljko 0:d13755cfb705 350 return rslt;
sveljko 0:d13755cfb705 351 }
sveljko 0:d13755cfb705 352
sveljko 0:d13755cfb705 353
sveljko 0:d13755cfb705 354 enum pubnub_res pubnub_state_get(pubnub_t *pb, char const *channel, char const *channel_group, const char *uuid)
sveljko 0:d13755cfb705 355 {
sveljko 0:d13755cfb705 356 enum pubnub_res rslt;
sveljko 0:d13755cfb705 357
sveljko 0:d13755cfb705 358 PUBNUB_ASSERT(pb_valid_ctx_ptr(pb));
sveljko 0:d13755cfb705 359
sveljko 0:d13755cfb705 360 pubnub_mutex_lock(pb->monitor);
sveljko 0:d13755cfb705 361 if (pb->state != PBS_IDLE) {
sveljko 0:d13755cfb705 362 pubnub_mutex_unlock(pb->monitor);
sveljko 0:d13755cfb705 363 return PNR_IN_PROGRESS;
sveljko 0:d13755cfb705 364 }
sveljko 0:d13755cfb705 365
sveljko 0:d13755cfb705 366 rslt = pbcc_state_get_prep(&pb->core, channel, channel_group, uuid ? uuid : pb->core.uuid);
sveljko 0:d13755cfb705 367 if (PNR_STARTED == rslt) {
sveljko 0:d13755cfb705 368 pb->trans = PBTT_STATE_GET;
sveljko 0:d13755cfb705 369 pb->core.last_result = PNR_STARTED;
sveljko 0:d13755cfb705 370 pbnc_fsm(pb);
sveljko 0:d13755cfb705 371 rslt = pb->core.last_result;
sveljko 0:d13755cfb705 372 }
sveljko 0:d13755cfb705 373
sveljko 0:d13755cfb705 374 pubnub_mutex_unlock(pb->monitor);
sveljko 0:d13755cfb705 375 return rslt;
sveljko 0:d13755cfb705 376 }
sveljko 0:d13755cfb705 377
sveljko 0:d13755cfb705 378
sveljko 0:d13755cfb705 379 enum pubnub_res pubnub_remove_channel_group(pubnub_t *pb, char const *channel_group)
sveljko 0:d13755cfb705 380 {
sveljko 0:d13755cfb705 381 enum pubnub_res rslt;
sveljko 0:d13755cfb705 382
sveljko 0:d13755cfb705 383 PUBNUB_ASSERT(pb_valid_ctx_ptr(pb));
sveljko 0:d13755cfb705 384
sveljko 0:d13755cfb705 385 pubnub_mutex_lock(pb->monitor);
sveljko 0:d13755cfb705 386 if (pb->state != PBS_IDLE) {
sveljko 0:d13755cfb705 387 pubnub_mutex_unlock(pb->monitor);
sveljko 0:d13755cfb705 388 return PNR_IN_PROGRESS;
sveljko 0:d13755cfb705 389 }
sveljko 0:d13755cfb705 390
sveljko 0:d13755cfb705 391 rslt = pbcc_remove_channel_group_prep(&pb->core, channel_group);
sveljko 0:d13755cfb705 392 if (PNR_STARTED == rslt) {
sveljko 0:d13755cfb705 393 pb->trans = PBTT_REMOVE_CHANNEL_GROUP;
sveljko 0:d13755cfb705 394 pb->core.last_result = PNR_STARTED;
sveljko 0:d13755cfb705 395 pbnc_fsm(pb);
sveljko 0:d13755cfb705 396 rslt = pb->core.last_result;
sveljko 0:d13755cfb705 397 }
sveljko 0:d13755cfb705 398
sveljko 0:d13755cfb705 399 pubnub_mutex_unlock(pb->monitor);
sveljko 0:d13755cfb705 400 return rslt;
sveljko 0:d13755cfb705 401 }
sveljko 0:d13755cfb705 402
sveljko 0:d13755cfb705 403
sveljko 0:d13755cfb705 404 enum pubnub_res pubnub_remove_channel_from_group(pubnub_t *pb, char const *channel, char const *channel_group)
sveljko 0:d13755cfb705 405 {
sveljko 0:d13755cfb705 406 enum pubnub_res rslt;
sveljko 0:d13755cfb705 407
sveljko 0:d13755cfb705 408 PUBNUB_ASSERT(pb_valid_ctx_ptr(pb));
sveljko 0:d13755cfb705 409
sveljko 0:d13755cfb705 410 pubnub_mutex_lock(pb->monitor);
sveljko 0:d13755cfb705 411 if (pb->state != PBS_IDLE) {
sveljko 0:d13755cfb705 412 pubnub_mutex_unlock(pb->monitor);
sveljko 0:d13755cfb705 413 return PNR_IN_PROGRESS;
sveljko 0:d13755cfb705 414 }
sveljko 0:d13755cfb705 415
sveljko 0:d13755cfb705 416 rslt = pbcc_channel_registry_prep(&pb->core, channel_group, "remove", channel);
sveljko 0:d13755cfb705 417 if (PNR_STARTED == rslt) {
sveljko 0:d13755cfb705 418 pb->trans = PBTT_REMOVE_CHANNEL_FROM_GROUP;
sveljko 0:d13755cfb705 419 pb->core.last_result = PNR_STARTED;
sveljko 0:d13755cfb705 420 pbnc_fsm(pb);
sveljko 0:d13755cfb705 421 rslt = pb->core.last_result;
sveljko 0:d13755cfb705 422 }
sveljko 0:d13755cfb705 423
sveljko 0:d13755cfb705 424 pubnub_mutex_unlock(pb->monitor);
sveljko 0:d13755cfb705 425 return rslt;
sveljko 0:d13755cfb705 426 }
sveljko 0:d13755cfb705 427
sveljko 0:d13755cfb705 428
sveljko 0:d13755cfb705 429 enum pubnub_res pubnub_add_channel_to_group(pubnub_t *pb, char const *channel, char const *channel_group)
sveljko 0:d13755cfb705 430 {
sveljko 0:d13755cfb705 431 enum pubnub_res rslt;
sveljko 0:d13755cfb705 432
sveljko 0:d13755cfb705 433 PUBNUB_ASSERT(pb_valid_ctx_ptr(pb));
sveljko 0:d13755cfb705 434
sveljko 0:d13755cfb705 435 pubnub_mutex_lock(pb->monitor);
sveljko 0:d13755cfb705 436 if (pb->state != PBS_IDLE) {
sveljko 0:d13755cfb705 437 pubnub_mutex_unlock(pb->monitor);
sveljko 0:d13755cfb705 438 return PNR_IN_PROGRESS;
sveljko 0:d13755cfb705 439 }
sveljko 0:d13755cfb705 440
sveljko 0:d13755cfb705 441 rslt = pbcc_channel_registry_prep(&pb->core, channel_group, "add", channel);
sveljko 0:d13755cfb705 442 if (PNR_STARTED == rslt) {
sveljko 0:d13755cfb705 443 pb->trans = PBTT_ADD_CHANNEL_TO_GROUP;
sveljko 0:d13755cfb705 444 pb->core.last_result = PNR_STARTED;
sveljko 0:d13755cfb705 445 pbnc_fsm(pb);
sveljko 0:d13755cfb705 446 rslt = pb->core.last_result;
sveljko 0:d13755cfb705 447 }
sveljko 0:d13755cfb705 448
sveljko 0:d13755cfb705 449 pubnub_mutex_unlock(pb->monitor);
sveljko 0:d13755cfb705 450 return rslt;
sveljko 0:d13755cfb705 451 }
sveljko 0:d13755cfb705 452
sveljko 0:d13755cfb705 453
sveljko 0:d13755cfb705 454 enum pubnub_res pubnub_list_channel_group(pubnub_t *pb, char const *channel_group)
sveljko 0:d13755cfb705 455 {
sveljko 0:d13755cfb705 456 enum pubnub_res rslt;
sveljko 0:d13755cfb705 457
sveljko 0:d13755cfb705 458 PUBNUB_ASSERT(pb_valid_ctx_ptr(pb));
sveljko 0:d13755cfb705 459
sveljko 0:d13755cfb705 460 pubnub_mutex_lock(pb->monitor);
sveljko 0:d13755cfb705 461 if (pb->state != PBS_IDLE) {
sveljko 0:d13755cfb705 462 pubnub_mutex_unlock(pb->monitor);
sveljko 0:d13755cfb705 463 return PNR_IN_PROGRESS;
sveljko 0:d13755cfb705 464 }
sveljko 0:d13755cfb705 465
sveljko 0:d13755cfb705 466 rslt = pbcc_channel_registry_prep(&pb->core, channel_group, NULL, NULL);
sveljko 0:d13755cfb705 467 if (PNR_STARTED == rslt) {
sveljko 0:d13755cfb705 468 pb->trans = PBTT_LIST_CHANNEL_GROUP;
sveljko 0:d13755cfb705 469 pb->core.last_result = PNR_STARTED;
sveljko 0:d13755cfb705 470 pbnc_fsm(pb);
sveljko 0:d13755cfb705 471 rslt = pb->core.last_result;
sveljko 0:d13755cfb705 472 }
sveljko 0:d13755cfb705 473
sveljko 0:d13755cfb705 474 pubnub_mutex_unlock(pb->monitor);
sveljko 0:d13755cfb705 475 return rslt;
sveljko 0:d13755cfb705 476 }
sveljko 0:d13755cfb705 477
sveljko 0:d13755cfb705 478
sveljko 0:d13755cfb705 479 void pubnub_cancel(pubnub_t *pb)
sveljko 0:d13755cfb705 480 {
sveljko 0:d13755cfb705 481 PUBNUB_ASSERT(pb_valid_ctx_ptr(pb));
sveljko 0:d13755cfb705 482
sveljko 0:d13755cfb705 483 pubnub_mutex_lock(pb->monitor);
sveljko 0:d13755cfb705 484 pbnc_stop(pb, PNR_CANCELLED);
sveljko 0:d13755cfb705 485 pubnub_mutex_unlock(pb->monitor);
sveljko 0:d13755cfb705 486 }
sveljko 0:d13755cfb705 487
sveljko 0:d13755cfb705 488
sveljko 0:d13755cfb705 489 void pubnub_set_uuid(pubnub_t *pb, const char *uuid)
sveljko 0:d13755cfb705 490 {
sveljko 0:d13755cfb705 491 PUBNUB_ASSERT(pb_valid_ctx_ptr(pb));
sveljko 0:d13755cfb705 492 pubnub_mutex_lock(pb->monitor);
sveljko 0:d13755cfb705 493 pbcc_set_uuid(&pb->core, uuid);
sveljko 0:d13755cfb705 494 pubnub_mutex_unlock(pb->monitor);
sveljko 0:d13755cfb705 495 }
sveljko 0:d13755cfb705 496
sveljko 0:d13755cfb705 497
sveljko 0:d13755cfb705 498 char const *pubnub_uuid_get(pubnub_t *pb)
sveljko 0:d13755cfb705 499 {
sveljko 0:d13755cfb705 500 char const *result;
sveljko 0:d13755cfb705 501 PUBNUB_ASSERT(pb_valid_ctx_ptr(pb));
sveljko 0:d13755cfb705 502
sveljko 0:d13755cfb705 503 pubnub_mutex_lock(pb->monitor);
sveljko 0:d13755cfb705 504 result = pb->core.uuid;
sveljko 0:d13755cfb705 505 pubnub_mutex_unlock(pb->monitor);
sveljko 0:d13755cfb705 506
sveljko 0:d13755cfb705 507 return result;
sveljko 0:d13755cfb705 508 }
sveljko 0:d13755cfb705 509
sveljko 0:d13755cfb705 510
sveljko 0:d13755cfb705 511 void pubnub_set_auth(pubnub_t *pb, const char *auth)
sveljko 0:d13755cfb705 512 {
sveljko 0:d13755cfb705 513 PUBNUB_ASSERT(pb_valid_ctx_ptr(pb));
sveljko 0:d13755cfb705 514 pubnub_mutex_lock(pb->monitor);
sveljko 0:d13755cfb705 515 pbcc_set_auth(&pb->core, auth);
sveljko 0:d13755cfb705 516 pubnub_mutex_unlock(pb->monitor);
sveljko 0:d13755cfb705 517 }
sveljko 0:d13755cfb705 518
sveljko 0:d13755cfb705 519
sveljko 0:d13755cfb705 520 char const *pubnub_auth_get(pubnub_t *pb)
sveljko 0:d13755cfb705 521 {
sveljko 0:d13755cfb705 522 char const *result;
sveljko 0:d13755cfb705 523 PUBNUB_ASSERT(pb_valid_ctx_ptr(pb));
sveljko 0:d13755cfb705 524
sveljko 0:d13755cfb705 525 pubnub_mutex_lock(pb->monitor);
sveljko 0:d13755cfb705 526 result = pb->core.auth;
sveljko 0:d13755cfb705 527 pubnub_mutex_unlock(pb->monitor);
sveljko 0:d13755cfb705 528
sveljko 0:d13755cfb705 529 return result;
sveljko 0:d13755cfb705 530 }
sveljko 0:d13755cfb705 531
sveljko 0:d13755cfb705 532
sveljko 0:d13755cfb705 533 int pubnub_last_http_code(pubnub_t *pb)
sveljko 0:d13755cfb705 534 {
sveljko 0:d13755cfb705 535 int result;
sveljko 0:d13755cfb705 536 PUBNUB_ASSERT(pb_valid_ctx_ptr(pb));
sveljko 0:d13755cfb705 537 pubnub_mutex_lock(pb->monitor);
sveljko 0:d13755cfb705 538 result = pb->http_code;
sveljko 0:d13755cfb705 539 pubnub_mutex_unlock(pb->monitor);
sveljko 0:d13755cfb705 540 return result;
sveljko 0:d13755cfb705 541 }
sveljko 0:d13755cfb705 542
sveljko 0:d13755cfb705 543
sveljko 0:d13755cfb705 544 char const *pubnub_last_time_token(pubnub_t *pb)
sveljko 0:d13755cfb705 545 {
sveljko 0:d13755cfb705 546 char const *result;
sveljko 0:d13755cfb705 547 PUBNUB_ASSERT(pb_valid_ctx_ptr(pb));
sveljko 0:d13755cfb705 548
sveljko 0:d13755cfb705 549 pubnub_mutex_lock(pb->monitor);
sveljko 0:d13755cfb705 550 result = pb->core.timetoken;
sveljko 0:d13755cfb705 551 pubnub_mutex_unlock(pb->monitor);
sveljko 0:d13755cfb705 552
sveljko 0:d13755cfb705 553 return result;
sveljko 0:d13755cfb705 554 }
sveljko 0:d13755cfb705 555
sveljko 0:d13755cfb705 556
sveljko 0:d13755cfb705 557 char const *pubnub_last_publish_result(pubnub_t *pb)
sveljko 0:d13755cfb705 558 {
sveljko 0:d13755cfb705 559 char *end;
sveljko 0:d13755cfb705 560
sveljko 0:d13755cfb705 561 PUBNUB_ASSERT(pb_valid_ctx_ptr(pb));
sveljko 0:d13755cfb705 562
sveljko 0:d13755cfb705 563 pubnub_mutex_lock(pb->monitor);
sveljko 0:d13755cfb705 564 if (PUBNUB_DYNAMIC_REPLY_BUFFER && (NULL == pb->core.http_reply)) {
sveljko 0:d13755cfb705 565 pubnub_mutex_unlock(pb->monitor);
sveljko 0:d13755cfb705 566 return "";
sveljko 0:d13755cfb705 567 }
sveljko 0:d13755cfb705 568 if ((pb->trans != PBTT_PUBLISH) || (pb->core.http_reply[0] == '\0')) {
sveljko 0:d13755cfb705 569 pubnub_mutex_unlock(pb->monitor);
sveljko 0:d13755cfb705 570 return "";
sveljko 0:d13755cfb705 571 }
sveljko 0:d13755cfb705 572 for (end = pb->core.http_reply + 1; isdigit((unsigned)*end); ++end) {
sveljko 0:d13755cfb705 573 continue;
sveljko 0:d13755cfb705 574 }
sveljko 0:d13755cfb705 575 pubnub_mutex_unlock(pb->monitor);
sveljko 0:d13755cfb705 576
sveljko 0:d13755cfb705 577 return end + 1;
sveljko 0:d13755cfb705 578 }
sveljko 0:d13755cfb705 579
sveljko 0:d13755cfb705 580
sveljko 0:d13755cfb705 581 char const *pubnub_get_origin(pubnub_t *pb)
sveljko 0:d13755cfb705 582 {
sveljko 0:d13755cfb705 583 PUBNUB_ASSERT(pb_valid_ctx_ptr(pb));
sveljko 0:d13755cfb705 584 if (PUBNUB_ORIGIN_SETTABLE) {
sveljko 0:d13755cfb705 585 char const *result;
sveljko 0:d13755cfb705 586
sveljko 0:d13755cfb705 587 pubnub_mutex_lock(pb->monitor);
sveljko 0:d13755cfb705 588 result = pb->origin;
sveljko 0:d13755cfb705 589 pubnub_mutex_unlock(pb->monitor);
sveljko 0:d13755cfb705 590
sveljko 0:d13755cfb705 591 return result;
sveljko 0:d13755cfb705 592 }
sveljko 0:d13755cfb705 593 return PUBNUB_ORIGIN;
sveljko 0:d13755cfb705 594 }
sveljko 0:d13755cfb705 595
sveljko 0:d13755cfb705 596
sveljko 0:d13755cfb705 597 int pubnub_origin_set(pubnub_t *pb, char const *origin)
sveljko 0:d13755cfb705 598 {
sveljko 0:d13755cfb705 599 PUBNUB_ASSERT(pb_valid_ctx_ptr(pb));
sveljko 0:d13755cfb705 600 if (PUBNUB_ORIGIN_SETTABLE) {
sveljko 0:d13755cfb705 601 if (NULL == origin) {
sveljko 0:d13755cfb705 602 origin = PUBNUB_ORIGIN;
sveljko 0:d13755cfb705 603 }
sveljko 0:d13755cfb705 604
sveljko 0:d13755cfb705 605 pubnub_mutex_lock(pb->monitor);
sveljko 0:d13755cfb705 606 pb->origin = origin;
sveljko 0:d13755cfb705 607 pubnub_mutex_unlock(pb->monitor);
sveljko 0:d13755cfb705 608
sveljko 0:d13755cfb705 609 return 0;
sveljko 0:d13755cfb705 610 }
sveljko 0:d13755cfb705 611 return -1;
sveljko 0:d13755cfb705 612 }