Changes in / [7a9d968:4a9c6b0]
- Files:
-
- 4 added
- 7 deleted
- 16 edited
Legend:
- Unmodified
- Added
- Removed
-
.gitignore
r7a9d968 r4a9c6b0 32 32 bitlbee.service 33 33 bitlbee@.service 34 *.pyc -
configure
r7a9d968 r4a9c6b0 17 17 libdir='$prefix/lib/' 18 18 plugindir='$prefix/lib/bitlbee/' 19 rpcplugindir='$plugindir/rpc/'20 19 includedir='$prefix/include/bitlbee/' 21 20 systemdsystemunitdir='' … … 40 39 twitter=1 41 40 purple=0 42 rpc=143 41 44 42 verbose=0 … … 126 124 --datadir=... $datadir 127 125 --plugindir=... $plugindir 128 --rpcplugindir=... $rpcplugindir129 126 --systemdsystemunitdir=... $systemdsystemunitdir 130 127 --pidfile=... $pidfile … … 140 137 --purple=0/1 Disable/enable libpurple support $purple 141 138 (automatically disables other protocol modules) 142 --rpc=0/1 Disable/enable RPC plugin interface $rpc143 139 144 140 --pam=0/1 Disable/enable PAM authentication $pam … … 180 176 libdir=$(eval echo "$libdir/" | sed 's/\/\{1,\}/\//g') 181 177 plugindir=$(eval echo "$plugindir/" | sed 's/\/\{1,\}/\//g') 182 rpcplugindir=$(eval echo "$rpcplugindir/" | sed 's/\/\{1,\}/\//g')183 178 includedir=$(eval echo "$includedir"/ | sed 's/\/\{1,\}/\//g') 184 179 libevent=$(eval echo "$libevent"/ | sed 's/\/\{1,\}/\//g') … … 202 197 DATADIR=$datadir 203 198 PLUGINDIR=$plugindir 204 RPCPLUGINDIR=$rpcplugindir205 199 CONFIG=$config 206 200 LIBDIR=$libdir … … 253 247 #define VARDIR "$datadir" 254 248 #define PLUGINDIR "$plugindir" 255 #define RPCPLUGINDIR "$rpcplugindir"256 249 #define DATADIR "$datadir" 257 250 #define PIDFILE "$pidfile" … … 295 288 LDFLAGS="$LDFLAGS -fsanitize=address" 296 289 debug=1 297 fi298 299 if [ "$tsan" = "1" ]; then300 echo301 echo "Threaded BitlBee? Have a nice tall glass of http://imgur.com/gallery/tX4qxzS"302 echo "No need to sanitise threads in a single-threaded process!"303 290 fi 304 291 … … 743 730 fi 744 731 745 if [ "$rpc" = 0 ]; then746 # Somewhat pointless at this stage already but at least this keeps it747 # out of bitlbee.pc which is probably a good thing.748 rpcplugindir=""749 fi750 751 732 otrprefix="" 752 733 if [ "$otr" = "auto" ]; then … … 833 814 includedir=$includedir 834 815 plugindir=$plugindir 835 rpcplugindir=$rpcplugindir836 816 libdir=$libdir 837 817 datadir=$datadir … … 919 899 protocols=$protocols'twitter ' 920 900 protoobjs=$protoobjs'twitter_mod.o ' 921 fi922 923 if [ "$rpc" = 0 ]; then924 echo '#undef WITH_RPC' >> config.h925 else926 echo '#define WITH_RPC' >> config.h927 protocols=$protocols'rpc '928 protoobjs=$protoobjs'rpc_mod.o '929 901 fi 930 902 … … 1018 990 echo ' Using event handler: '$events 1019 991 echo ' Using SSL library: '$ssl 992 #echo ' Building with these storage backends: '$STORAGES 1020 993 1021 994 if [ -n "$protocols" ]; then -
irc_channel.c
r7a9d968 r4a9c6b0 757 757 } 758 758 759 if (!bu->ic->acc->prpl->add_buddy) {760 irc_send_num(ic->irc, 482, "%s :IM protocol does not support contact list modification", ic->name);761 return FALSE;762 }763 764 759 bu->ic->acc->prpl->add_buddy(bu->ic, bu->handle, 765 760 icc->group ? icc->group->name : NULL); … … 779 774 if (icc->type != IRC_CC_TYPE_GROUP) { 780 775 irc_send_num(ic->irc, 482, "%s :Kicks are only possible to fill_by=group channels", ic->name); 781 return;782 }783 784 if (!bu->ic->acc->prpl->remove_buddy) {785 irc_send_num(ic->irc, 482, "%s :IM protocol does not support contact list modification", ic->name);786 776 return; 787 777 } -
irc_commands.c
r7a9d968 r4a9c6b0 330 330 showed an error message, or is doing some work 331 331 before the join should be confirmed. (In the 332 latter case, the calle eshould take care of that332 latter case, the caller should take care of that 333 333 confirmation.) TRUE means all's good, let the 334 334 user join the channel right away. */ -
lib/Makefile
r7a9d968 r4a9c6b0 13 13 14 14 # [SH] Program variables 15 objects = arc.o base64.o canohost.o $(EVENT_HANDLER) ftutil.o http_client.o ini.o md5.o misc.o oauth.o oauth2.o parson.o proxy.o sha1.o $(SSL_CLIENT) url.o xmltree.o ns_parse.o15 objects = arc.o base64.o canohost.o $(EVENT_HANDLER) ftutil.o http_client.o ini.o json.o json_util.o md5.o misc.o oauth.o oauth2.o proxy.o sha1.o $(SSL_CLIENT) url.o xmltree.o ns_parse.o 16 16 17 17 LFLAGS += -r -
lib/misc.c
r7a9d968 r4a9c6b0 386 386 } 387 387 388 int is_bool(c onst char *value)388 int is_bool(char *value) 389 389 { 390 390 if (*value == 0) { … … 412 412 } 413 413 414 int bool2int(c onst char *value)414 int bool2int(char *value) 415 415 { 416 416 int i; -
lib/misc.h
r7a9d968 r4a9c6b0 135 135 G_MODULE_EXPORT void random_bytes(unsigned char *buf, int count); 136 136 137 G_MODULE_EXPORT int is_bool(c onst char *value);138 G_MODULE_EXPORT int bool2int(c onst char *value);137 G_MODULE_EXPORT int is_bool(char *value); 138 G_MODULE_EXPORT int bool2int(char *value); 139 139 140 140 G_MODULE_EXPORT struct ns_srv_reply **srv_lookup(char *service, char *protocol, char *domain); -
lib/oauth2.c
r7a9d968 r4a9c6b0 42 42 #include "oauth2.h" 43 43 #include "oauth.h" 44 #include "parson.h" 44 #include "json.h" 45 #include "json_util.h" 45 46 #include "url.h" 46 47 #define JSON_O_FOREACH(o, k, v) \48 const char *k; const JSON_Value *v; int __i; \49 for (__i = 0; json_object_get_tuple(o, __i, &k, &v); __i++)50 47 51 48 char *oauth2_url(const struct oauth2_service *sp) … … 116 113 } 117 114 118 static char* oauth2_parse_error( const JSON_Value *e)115 static char* oauth2_parse_error(json_value *e) 119 116 { 120 117 /* This does a reasonable job with some of the flavours of error 121 118 responses I've seen. Because apparently it's not standardised. */ 122 119 123 if ( json_type(e) == JSONObject) {120 if (e->type == json_object) { 124 121 /* Facebook style */ 125 const char *msg = json_object_get_string(json_object(e), "message"); 126 const char *type = json_object_get_string(json_object(e), "type"); 127 JSON_Value *code_o = json_object_get_value(json_object(e), "code"); 128 int code = json_value_get_integer(code_o); 122 const char *msg = json_o_str(e, "message"); 123 const char *type = json_o_str(e, "type"); 124 json_value *code_o = json_o_get(e, "code"); 125 int code = 0; 126 127 if (code_o && code_o->type == json_integer) { 128 code = code_o->u.integer; 129 } 130 129 131 return g_strdup_printf("Error %d: %s", code, msg ? msg : type ? type : "Unknown error"); 130 } else if ( json_type(e) == JSONString) {131 return g_strdup( json_string(e));132 } else if (e->type == json_string) { 133 return g_strdup(e->u.string.ptr); 132 134 } 133 135 return NULL; … … 154 156 if (content_type && (strstr(content_type, "application/json") || 155 157 strstr(content_type, "text/javascript"))) { 156 JSON_Value *js = json_parse_string(req->reply_body);157 if (js && js on_type(js) == JSONObject) {158 JSON_O_FOREACH(js on_object(js), k, v){158 json_value *js = json_parse(req->reply_body, req->body_size); 159 if (js && js->type == json_object) { 160 JSON_O_FOREACH(js, k, v){ 159 161 if (strcmp(k, "error") == 0) { 160 162 error = oauth2_parse_error(v); 161 163 } 162 if ( json_type(v) != JSONString) {164 if (v->type != json_string) { 163 165 continue; 164 166 } 165 167 if (strcmp(k, "access_token") == 0) { 166 atoken = g_strdup( json_string(v));168 atoken = g_strdup(v->u.string.ptr); 167 169 } 168 170 if (strcmp(k, "refresh_token") == 0) { 169 rtoken = g_strdup( json_string(v));171 rtoken = g_strdup(v->u.string.ptr); 170 172 } 171 173 } -
protocols/account.c
r7a9d968 r4a9c6b0 27 27 #include "bitlbee.h" 28 28 #include "account.h" 29 30 static const char* account_protocols_local[] = { 31 "gg", "whatsapp", NULL 32 }; 29 33 30 34 static char *set_eval_nick_source(set_t *set, char *value); … … 465 469 return a->auto_reconnect_delay; 466 470 } 471 472 int protocol_account_islocal(const char* protocol) 473 { 474 const char** p = account_protocols_local; 475 476 do { 477 if (strcmp(*p, protocol) == 0) { 478 return 1; 479 } 480 } while (*(++p)); 481 return 0; 482 } -
protocols/account.h
r7a9d968 r4a9c6b0 58 58 int account_reconnect_delay(account_t *a); 59 59 60 int protocol_account_islocal(const char* protocol); 61 60 62 typedef enum { 61 63 ACC_SET_OFFLINE_ONLY = 0x02, /* Allow changes only if the acct is offline. */ … … 68 70 ACC_FLAG_STATUS_MESSAGE = 0x02, /* Supports status messages (without being away). */ 69 71 ACC_FLAG_HANDLE_DOMAINS = 0x04, /* Contact handles need a domain portion. */ 70 ACC_FLAG_LOCAL _CONTACTS = 0x08,/* Contact list is local. */72 ACC_FLAG_LOCAL = 0x08, /* Contact list is local. */ 71 73 ACC_FLAG_LOCKED = 0x10, /* Account is locked (cannot be deleted, certain settings can't changed) */ 72 74 } account_flag_t; -
protocols/nogaim.c
r7a9d968 r4a9c6b0 259 259 extern void twitter_initmodule(); 260 260 extern void purple_initmodule(); 261 extern void rpc_initmodule();262 261 263 262 #ifdef WITH_MSN … … 279 278 #ifdef WITH_PURPLE 280 279 purple_initmodule(); 281 #endif282 283 #ifdef WITH_RPC284 rpc_initmodule();285 280 #endif 286 281 … … 448 443 } 449 444 450 if ((ic->acc->flags & ACC_FLAG_LOCAL_CONTACTS) && 451 !(ic->flags & OPT_LOCAL_CONTACTS_SENT) && 452 ic->acc->prpl->add_buddy) { 445 if (ic->acc->flags & ACC_FLAG_LOCAL) { 453 446 GHashTableIter nicks; 454 gpointer handle;447 gpointer k, v; 455 448 g_hash_table_iter_init(&nicks, ic->acc->nicks); 456 while (g_hash_table_iter_next(&nicks, & handle, NULL)) {457 ic->acc->prpl->add_buddy(ic, (char *) handle, NULL);449 while (g_hash_table_iter_next(&nicks, &k, &v)) { 450 ic->acc->prpl->add_buddy(ic, (char *) k, NULL); 458 451 } 459 452 } … … 550 543 query_del_by_conn((irc_t *) ic->bee->ui_data, ic); 551 544 552 /* Throw away groupchats owned by this account. Historically this was only553 ever done by IM modules which is a bug. But it gives them opportunity554 to clean up protocol-specific bits as well so keep it that way, just555 do another cleanup here as a fallback. Don't want to leave any dangling556 pointers! */557 while (ic->groupchats) {558 imcb_chat_free(ic->groupchats->data);559 }560 561 545 if (!a) { 562 546 /* Uhm... This is very sick. */ … … 657 641 } 658 642 659 /* Returns the local contacts for an IM account (based on assigned nicks).660 Linked list should be freed, the strings themselves not! So look at it661 like a GSList<const char*> I guess? Empty list means NULL retval (as662 always with GSList). */663 GSList *imcb_get_local_contacts(struct im_connection *ic)664 {665 GHashTableIter nicks;666 GSList *ret = NULL;667 668 if (!(ic->acc->flags & ACC_FLAG_LOCAL_CONTACTS)) {669 /* Only allow protocols that indicate local contact list670 support to use this function. */671 return ret;672 }673 674 g_hash_table_iter_init(&nicks, ic->acc->nicks);675 gpointer handle;676 while (g_hash_table_iter_next(&nicks, &handle, NULL)) {677 ret = g_slist_prepend(ret, (char *) handle);678 }679 680 /* If the protocol asked for the list, assume we won't have to send it681 anymore in imcb_connected(). */682 ic->flags |= OPT_LOCAL_CONTACTS_SENT;683 684 return ret;685 }686 687 688 643 struct imcb_ask_cb_data { 689 644 struct im_connection *ic; … … 743 698 struct imcb_ask_cb_data *cbd = data; 744 699 745 if (cbd->ic->acc->prpl->add_buddy) { 746 cbd->ic->acc->prpl->add_buddy(cbd->ic, cbd->handle, NULL); 747 } 700 cbd->ic->acc->prpl->add_buddy(cbd->ic, cbd->handle, NULL); 748 701 749 702 imcb_ask_cb_free(data); -
protocols/nogaim.h
r7a9d968 r4a9c6b0 57 57 58 58 /* Sharing flags between all kinds of things. I just hope I won't hit any 59 limits before 32-bit machines become extinct. ;-) 60 61 Argh! This needs to be renamed to be more clear which field they're used 62 for. As said it's currently mixed which is nonsense. Some are for the 63 im_connection flags field, some for imcb_buddy_status(), some for typing 64 notifications, and who knows what else... */ 59 limits before 32-bit machines become extinct. ;-) */ 65 60 #define OPT_LOGGED_IN 0x00000001 66 61 #define OPT_LOGGING_OUT 0x00000002 … … 75 70 #define OPT_PONGS 0x00010000 /* Service sends us keep-alives */ 76 71 #define OPT_PONGED 0x00020000 /* Received a keep-alive during last interval */ 77 #define OPT_LOCAL_CONTACTS_SENT 0x00040000 /* Protocol already requested local contact list, so don't send it after finishing login. */78 72 #define OPT_SELFMESSAGE 0x00080000 /* A message sent by self from another location */ 79 73 … … 378 372 G_MODULE_EXPORT void imcb_buddy_nick_change(struct im_connection *ic, const char *handle, const char *nick); 379 373 G_MODULE_EXPORT void imcb_buddy_action_response(bee_user_t *bu, const char *action, char * const args[], void *data); 380 G_MODULE_EXPORT GSList *imcb_get_local_contacts(struct im_connection *ic);381 374 382 375 G_MODULE_EXPORT void imcb_buddy_typing(struct im_connection *ic, const char *handle, guint32 flags); -
protocols/purple/purple.c
r7a9d968 r4a9c6b0 327 327 } 328 328 purple_accounts_remove(pa); 329 330 /* Last, some protocols want their contact lists locally. */331 if (strcmp(acc->prpl->name, "whatsapp") == 0 || strcmp(acc->prpl->name, "gg") == 0) {332 acc->flags |= ACC_FLAG_LOCAL_CONTACTS;333 }334 329 } 335 330 -
protocols/twitter/twitter_lib.c
r7a9d968 r4a9c6b0 36 36 #include "base64.h" 37 37 #include "twitter_lib.h" 38 #include " parson.h"38 #include "json_util.h" 39 39 #include <ctype.h> 40 40 #include <errno.h> … … 64 64 gboolean from_filter; 65 65 }; 66 67 #define JSON_O_FOREACH(o, k, v) \68 const char *k; const JSON_Value *v; int __i; \69 for (__i = 0; json_object_get_tuple(o, __i, &k, &v); __i++)70 66 71 67 /** … … 170 166 { 171 167 static char *ret = NULL; 172 JSON_Value *root, *err;168 json_value *root, *err; 173 169 174 170 g_free(ret); … … 176 172 177 173 if (req->body_size > 0) { 178 root = json_parse_string(req->reply_body); 179 err = json_object_get_value(json_object(root), "errors"); 180 if (err && json_type(err) == JSONArray && 181 (err = json_array_get_value(json_array(err), 0)) && 182 json_type(err) == JSONObject) { 183 const char *msg = json_object_get_string(json_object(err), "message"); 174 root = json_parse(req->reply_body, req->body_size); 175 err = json_o_get(root, "errors"); 176 if (err && err->type == json_array && (err = err->u.array.values[0]) && 177 err->type == json_object) { 178 const char *msg = json_o_str(err, "message"); 184 179 if (msg) { 185 180 ret = g_strdup_printf("%s (%s)", req->status_string, msg); … … 194 189 /* WATCH OUT: This function might or might not destroy your connection. 195 190 Sub-optimal indeed, but just be careful when this returns NULL! */ 196 static JSON_Value *twitter_parse_response(struct im_connection *ic, struct http_request *req)191 static json_value *twitter_parse_response(struct im_connection *ic, struct http_request *req) 197 192 { 198 193 gboolean logging_in = !(ic->flags & OPT_LOGGED_IN); 199 194 gboolean periodic; 200 195 struct twitter_data *td = ic->proto_data; 201 JSON_Value *ret;196 json_value *ret; 202 197 char path[64] = "", *s; 203 198 … … 237 232 } 238 233 239 if ((ret = json_parse _string(req->reply_body)) == NULL) {234 if ((ret = json_parse(req->reply_body, req->body_size)) == NULL) { 240 235 imcb_error(ic, "Could not retrieve %s: %s", 241 236 path, "JSON parse error"); … … 294 289 * Fill a list of ids. 295 290 */ 296 static gboolean twitter_xt_get_friends_id_list( JSON_Value *node, struct twitter_xml_list *txl)297 { 298 JSON_Array*c;291 static gboolean twitter_xt_get_friends_id_list(json_value *node, struct twitter_xml_list *txl) 292 { 293 json_value *c; 299 294 int i; 300 295 … … 302 297 txl->type = TXL_ID; 303 298 304 if (!(c = json_object_get_array(json_object(node), "ids"))) { 299 c = json_o_get(node, "ids"); 300 if (!c || c->type != json_array) { 305 301 return FALSE; 306 302 } 307 303 308 for (i = 0; i < json_array_get_count(c); i++) { 309 jint id = json_array_get_integer(c, i); 304 for (i = 0; i < c->u.array.length; i++) { 305 if (c->u.array.values[i]->type != json_integer) { 306 continue; 307 } 310 308 311 309 txl->list = g_slist_prepend(txl->list, 312 g_strdup_printf("%" PRI u64, id);313 } 314 315 JSON_Value *next = json_object_get_value(json_object(node), "next_cursor");316 if ( next && json_type(next) == JSONInteger) {317 txl->next_cursor = json_integer(next);310 g_strdup_printf("%" PRId64, c->u.array.values[i]->u.integer)); 311 } 312 313 c = json_o_get(node, "next_cursor"); 314 if (c && c->type == json_integer) { 315 txl->next_cursor = c->u.integer; 318 316 } else { 319 317 txl->next_cursor = -1; … … 331 329 { 332 330 struct im_connection *ic; 333 JSON_Value *parsed;331 json_value *parsed; 334 332 struct twitter_xml_list *txl; 335 333 struct twitter_data *td; … … 375 373 { 376 374 struct im_connection *ic = req->data; 377 JSON_Value *parsed;375 json_value *parsed; 378 376 struct twitter_xml_list *txl; 379 377 struct twitter_data *td; … … 420 418 { 421 419 struct im_connection *ic = req->data; 422 JSON_Value *parsed;420 json_value *parsed; 423 421 struct twitter_xml_list *txl; 424 422 struct twitter_data *td; … … 446 444 // Process the retweet ids 447 445 txl->type = TXL_ID; 448 if (json_type(parsed) == JSONArray) { 449 JSON_Array *arr = json_array(parsed); 446 if (parsed->type == json_array) { 450 447 unsigned int i; 451 for (i = 0; i < json_array_get_count(arr); i++) { 452 jint id = json_array_get_integer(arr, i); 448 for (i = 0; i < parsed->u.array.length; i++) { 449 json_value *c = parsed->u.array.values[i]; 450 if (c->type != json_integer) { 451 continue; 452 } 453 453 txl->list = g_slist_prepend(txl->list, 454 g_strdup_printf("%" PRId64, id));454 g_strdup_printf("%" PRId64, c->u.integer)); 455 455 } 456 456 } … … 463 463 } 464 464 465 static gboolean twitter_xt_get_users( JSON_Value *node, struct twitter_xml_list *txl);465 static gboolean twitter_xt_get_users(json_value *node, struct twitter_xml_list *txl); 466 466 static void twitter_http_get_users_lookup(struct http_request *req); 467 467 … … 504 504 { 505 505 struct im_connection *ic = req->data; 506 JSON_Value *parsed;506 json_value *parsed; 507 507 struct twitter_xml_list *txl; 508 508 GSList *l = NULL; … … 537 537 } 538 538 539 struct twitter_xml_user *twitter_xt_get_user(const JSON_Object*node)539 struct twitter_xml_user *twitter_xt_get_user(const json_value *node) 540 540 { 541 541 struct twitter_xml_user *txu; 542 543 if (!node) 544 return NULL; 542 json_value *jv; 545 543 546 544 txu = g_new0(struct twitter_xml_user, 1); 547 txu->name = g_strdup(json_object_get_string(node, "name")); 548 txu->screen_name = g_strdup(json_object_get_string(node, "screen_name")); 549 txu->uid = json_object_get_integer(node, "id"); 545 txu->name = g_strdup(json_o_str(node, "name")); 546 txu->screen_name = g_strdup(json_o_str(node, "screen_name")); 547 548 jv = json_o_get(node, "id"); 549 txu->uid = jv->u.integer; 550 550 551 551 return txu; … … 557 557 * - all <user>s from the <users> element. 558 558 */ 559 static gboolean twitter_xt_get_users( JSON_Value *node, struct twitter_xml_list *txl)559 static gboolean twitter_xt_get_users(json_value *node, struct twitter_xml_list *txl) 560 560 { 561 561 struct twitter_xml_user *txu; … … 565 565 txl->type = TXL_USER; 566 566 567 if ( json_type(node) != JSONArray) {567 if (!node || node->type != json_array) { 568 568 return FALSE; 569 569 } 570 570 571 571 // The root <users> node should hold the list of users <user> 572 572 // Walk over the nodes children. 573 JSON_Array *arr = json_array(node); 574 for (i = 0; i < json_array_get_count(arr); i++) { 575 JSON_Object *o = json_array_get_object(arr, i); 576 if (!o) 577 continue; 578 txu = twitter_xt_get_user(o); 573 for (i = 0; i < node->u.array.length; i++) { 574 txu = twitter_xt_get_user(node->u.array.values[i]); 579 575 if (txu) { 580 576 txl->list = g_slist_prepend(txl->list, txu); … … 591 587 #endif 592 588 593 static void expand_entities(char **text, const JSON_Object *node, const JSON_Object*extended_node);589 static void expand_entities(char **text, const json_value *node, const json_value *extended_node); 594 590 595 591 /** … … 601 597 * - the user in a twitter_xml_user struct. 602 598 */ 603 static struct twitter_xml_status *twitter_xt_get_status(const JSON_Object*node)599 static struct twitter_xml_status *twitter_xt_get_status(const json_value *node) 604 600 { 605 601 struct twitter_xml_status *txs = {0}; 606 const JSON_Object*rt = NULL;607 const JSON_Value *text_value = NULL;608 const JSON_Object*extended_node = NULL;609 610 if ( !node) {602 const json_value *rt = NULL; 603 const json_value *text_value = NULL; 604 const json_value *extended_node = NULL; 605 606 if (node->type != json_object) { 611 607 return FALSE; 612 608 } … … 614 610 615 611 JSON_O_FOREACH(node, k, v) { 616 if (strcmp("text", k) == 0 && json_type(v) == JSONString && text_value == NULL) {612 if (strcmp("text", k) == 0 && v->type == json_string && text_value == NULL) { 617 613 text_value = v; 618 } else if (strcmp("full_text", k) == 0 && json_type(v) == JSONString) {614 } else if (strcmp("full_text", k) == 0 && v->type == json_string) { 619 615 text_value = v; 620 } else if (strcmp("extended_tweet", k) == 0 && json_type(v) == JSONObject) {621 text_value = json_o bject_get_value(json_object(v), "full_text");622 extended_node = json_object(v);623 } else if (strcmp("retweeted_status", k) == 0 && (rt = json_object(v))) {624 // Handling below.625 } else if (strcmp("created_at", k) == 0 && json_type(v) == JSONString) {616 } else if (strcmp("extended_tweet", k) == 0 && v->type == json_object) { 617 text_value = json_o_get(v, "full_text"); 618 extended_node = v; 619 } else if (strcmp("retweeted_status", k) == 0 && v->type == json_object) { 620 rt = v; 621 } else if (strcmp("created_at", k) == 0 && v->type == json_string) { 626 622 struct tm parsed; 627 623 … … 629 625 this field. :-( Also assumes the timezone used 630 626 is UTC since C time handling functions suck. */ 631 if (strptime( json_string(v), TWITTER_TIME_FORMAT, &parsed) != NULL) {627 if (strptime(v->u.string.ptr, TWITTER_TIME_FORMAT, &parsed) != NULL) { 632 628 txs->created_at = mktime_utc(&parsed); 633 629 } 634 } else if (strcmp("user", k) == 0 && json_type(v) == JSONObject) {635 txs->user = twitter_xt_get_user( json_object(v));636 } else if (strcmp("id", k) == 0 && json_type(v) == JSONInteger) {637 txs->rt_id = txs->id = json_integer(v);638 } else if (strcmp("in_reply_to_status_id", k) == 0 && json_type(v) == JSONInteger) {639 txs->reply_to = json_integer(v);630 } else if (strcmp("user", k) == 0 && v->type == json_object) { 631 txs->user = twitter_xt_get_user(v); 632 } else if (strcmp("id", k) == 0 && v->type == json_integer) { 633 txs->rt_id = txs->id = v->u.integer; 634 } else if (strcmp("in_reply_to_status_id", k) == 0 && v->type == json_integer) { 635 txs->reply_to = v->u.integer; 640 636 } 641 637 } … … 650 646 txs_free(rtxs); 651 647 } 652 } else if (text_value && json_type(text_value) == JSONString) {653 txs->text = g_ strdup(json_string(text_value));648 } else if (text_value && text_value->type == json_string) { 649 txs->text = g_memdup(text_value->u.string.ptr, text_value->u.string.length + 1); 654 650 strip_html(txs->text); 655 651 expand_entities(&txs->text, node, extended_node); … … 667 663 * Function to fill a twitter_xml_status struct (DM variant). 668 664 */ 669 static struct twitter_xml_status *twitter_xt_get_dm(const JSON_Object*node)665 static struct twitter_xml_status *twitter_xt_get_dm(const json_value *node) 670 666 { 671 667 struct twitter_xml_status *txs; 672 668 673 if ( !node) {669 if (node->type != json_object) { 674 670 return FALSE; 675 671 } … … 677 673 678 674 JSON_O_FOREACH(node, k, v) { 679 if (strcmp("text", k) == 0 && (txs->text = g_strdup(json_string(v)))) { 675 if (strcmp("text", k) == 0 && v->type == json_string) { 676 txs->text = g_memdup(v->u.string.ptr, v->u.string.length + 1); 680 677 strip_html(txs->text); 681 } else if (strcmp("created_at", k) == 0 && json_type(v) == JSONString) {678 } else if (strcmp("created_at", k) == 0 && v->type == json_string) { 682 679 struct tm parsed; 683 680 … … 685 682 this field. :-( Also assumes the timezone used 686 683 is UTC since C time handling functions suck. */ 687 if (strptime( json_string(v), TWITTER_TIME_FORMAT, &parsed) != NULL) {684 if (strptime(v->u.string.ptr, TWITTER_TIME_FORMAT, &parsed) != NULL) { 688 685 txs->created_at = mktime_utc(&parsed); 689 686 } 690 } else if (strcmp("sender", k) == 0 && json_type(v) == JSONObject) {691 txs->user = twitter_xt_get_user( json_object(v));692 } else if (strcmp("id", k) == 0 && json_type(v) == JSONInteger) {693 txs->id = json_integer(v);687 } else if (strcmp("sender", k) == 0 && v->type == json_object) { 688 txs->user = twitter_xt_get_user(v); 689 } else if (strcmp("id", k) == 0 && v->type == json_integer) { 690 txs->id = v->u.integer; 694 691 } 695 692 } … … 705 702 } 706 703 707 static void expand_entities(char **text, const JSON_Object *node, const JSON_Object*extended_node)708 { 709 JSON_Object*entities, *extended_entities, *quoted;704 static void expand_entities(char **text, const json_value *node, const json_value *extended_node) 705 { 706 json_value *entities, *extended_entities, *quoted; 710 707 char *quote_url = NULL, *quote_text = NULL; 711 708 712 if (!( entities = json_object_get_object(node, "entities")))713 return; 714 if ((quoted = json_o bject_get_object(node, "quoted_status"))) {709 if (!((entities = json_o_get(node, "entities")) && entities->type == json_object)) 710 return; 711 if ((quoted = json_o_get(node, "quoted_status")) && quoted->type == json_object) { 715 712 /* New "retweets with comments" feature. Grab the 716 713 * full message and try to insert it when we run into the … … 725 722 726 723 if (extended_node) { 727 extended_entities = json_o bject_get_object(extended_node, "entities");728 if (extended_entities ) {724 extended_entities = json_o_get(extended_node, "entities"); 725 if (extended_entities && extended_entities->type == json_object) { 729 726 entities = extended_entities; 730 727 } … … 734 731 int i; 735 732 736 if ( json_type(v) != JSONArray) {733 if (v->type != json_array) { 737 734 continue; 738 735 } … … 741 738 } 742 739 743 for (i = 0; i < json_array_get_count(json_array(v)); i++) {740 for (i = 0; i < v->u.array.length; i++) { 744 741 const char *format = "%s%s <%s>%s"; 745 JSON_Object *r = json_array_get_object(json_array(v), i); 746 747 if (!r) { 742 743 if (v->u.array.values[i]->type != json_object) { 748 744 continue; 749 745 } 750 746 751 const char *kort = json_o bject_get_string(r, "url");752 const char *disp = json_o bject_get_string(r, "display_url");753 const char *full = json_o bject_get_string(r, "expanded_url");747 const char *kort = json_o_str(v->u.array.values[i], "url"); 748 const char *disp = json_o_str(v->u.array.values[i], "display_url"); 749 const char *full = json_o_str(v->u.array.values[i], "expanded_url"); 754 750 char *pos, *new; 755 751 … … 783 779 * - the next_cursor. 784 780 */ 785 static gboolean twitter_xt_get_status_list(struct im_connection *ic, const JSON_Value *node,781 static gboolean twitter_xt_get_status_list(struct im_connection *ic, const json_value *node, 786 782 struct twitter_xml_list *txl) 787 783 { … … 792 788 txl->type = TXL_STATUS; 793 789 794 if ( json_type(node) != JSONArray) {790 if (node->type != json_array) { 795 791 return FALSE; 796 792 } … … 798 794 // The root <statuses> node should hold the list of statuses <status> 799 795 // Walk over the nodes children. 800 for (i = 0; i < json_array_get_count(json_array(node)); i++) {801 txs = twitter_xt_get_status( json_array_get_object(json_array(node), i));796 for (i = 0; i < node->u.array.length; i++) { 797 txs = twitter_xt_get_status(node->u.array.values[i]); 802 798 if (!txs) { 803 799 continue; … … 1019 1015 } 1020 1016 1021 static gboolean twitter_stream_handle_object(struct im_connection *ic, JSON_Object*o, gboolean from_filter);1017 static gboolean twitter_stream_handle_object(struct im_connection *ic, json_value *o, gboolean from_filter); 1022 1018 1023 1019 static void twitter_http_stream(struct http_request *req) … … 1025 1021 struct im_connection *ic = req->data; 1026 1022 struct twitter_data *td; 1027 JSON_Value *parsed;1023 json_value *parsed; 1028 1024 int len = 0; 1029 1025 char c, *nl; … … 1066 1062 req->reply_body[len] = '\0'; 1067 1063 1068 if ((parsed = json_parse _string(req->reply_body))) {1064 if ((parsed = json_parse(req->reply_body, req->body_size))) { 1069 1065 from_filter = (req == td->filter_stream); 1070 twitter_stream_handle_object(ic, json_object(parsed), from_filter);1066 twitter_stream_handle_object(ic, parsed, from_filter); 1071 1067 } 1072 1068 json_value_free(parsed); … … 1082 1078 } 1083 1079 1084 static gboolean twitter_stream_handle_event(struct im_connection *ic, JSON_Object*o);1080 static gboolean twitter_stream_handle_event(struct im_connection *ic, json_value *o); 1085 1081 static gboolean twitter_stream_handle_status(struct im_connection *ic, struct twitter_xml_status *txs); 1086 1082 1087 static gboolean twitter_stream_handle_object(struct im_connection *ic, JSON_Object*o, gboolean from_filter)1083 static gboolean twitter_stream_handle_object(struct im_connection *ic, json_value *o, gboolean from_filter) 1088 1084 { 1089 1085 struct twitter_data *td = ic->proto_data; 1090 1086 struct twitter_xml_status *txs; 1091 JSON_Object*c;1087 json_value *c; 1092 1088 1093 1089 if ((txs = twitter_xt_get_status(o))) { … … 1096 1092 txs_free(txs); 1097 1093 return ret; 1098 } else if ((c = json_o bject_get_object(o, "direct_message")) &&1094 } else if ((c = json_o_get(o, "direct_message")) && 1099 1095 (txs = twitter_xt_get_dm(c))) { 1100 1096 if (g_strcasecmp(txs->user->screen_name, td->user) != 0) { … … 1104 1100 txs_free(txs); 1105 1101 return TRUE; 1106 } else if ( json_object_get_string(o, "event")) {1102 } else if ((c = json_o_get(o, "event")) && c->type == json_string) { 1107 1103 twitter_stream_handle_event(ic, o); 1108 1104 return TRUE; 1109 } else if ((c = json_o bject_get_object(o, "disconnect"))) {1105 } else if ((c = json_o_get(o, "disconnect")) && c->type == json_object) { 1110 1106 /* HACK: Because we're inside an event handler, we can't just 1111 1107 disconnect here. Instead, just change the HTTP status string 1112 1108 into a Twitter status string. */ 1113 char *reason = g_strdup(json_object_get_string(c, "reason"));1109 char *reason = json_o_strdup(c, "reason"); 1114 1110 if (reason) { 1115 1111 g_free(td->stream->status_string); … … 1150 1146 } 1151 1147 1152 static gboolean twitter_stream_handle_event(struct im_connection *ic, JSON_Object*o)1148 static gboolean twitter_stream_handle_event(struct im_connection *ic, json_value *o) 1153 1149 { 1154 1150 struct twitter_data *td = ic->proto_data; 1155 JSON_Object *source = json_object_get_object(o, "source");1156 JSON_Object *target = json_object_get_object(o, "target");1157 const char *type = json_o bject_get_string(o, "event");1151 json_value *source = json_o_get(o, "source"); 1152 json_value *target = json_o_get(o, "target"); 1153 const char *type = json_o_str(o, "event"); 1158 1154 struct twitter_xml_user *us = NULL; 1159 1155 struct twitter_xml_user *ut = NULL; 1160 1156 1161 if (!type || !source || !target) { 1157 if (!type || !source || source->type != json_object 1158 || !target || target->type != json_object) { 1162 1159 return FALSE; 1163 1160 } … … 1288 1285 struct twitter_filter *tf; 1289 1286 GList *users = NULL; 1290 JSON_Value *parsed; 1287 json_value *parsed; 1288 json_value *id; 1289 const char *name; 1291 1290 GString *fstr; 1292 1291 GSList *l; … … 1313 1312 } 1314 1313 1315 if ( json_type(parsed) != JSONArray) {1314 if (parsed->type != json_array) { 1316 1315 goto finish; 1317 1316 } 1318 1317 1319 for (i = 0; i < json_array_get_count(json_array(parsed)); i++) { 1320 JSON_Object *o = json_array_get_object(json_array(parsed), i); 1321 jint id = json_object_get_integer(o, "id"); 1322 const char *name = json_object_get_string(o, "screen_name"); 1323 1324 if (!name || !id) { 1318 for (i = 0; i < parsed->u.array.length; i++) { 1319 id = json_o_get(parsed->u.array.values[i], "id"); 1320 name = json_o_str(parsed->u.array.values[i], "screen_name"); 1321 1322 if (!name || !id || id->type != json_integer) { 1325 1323 continue; 1326 1324 } … … 1330 1328 1331 1329 if (g_strcasecmp(tf->text, name) == 0) { 1332 tf->uid = id ;1330 tf->uid = id->u.integer; 1333 1331 users = g_list_delete_link(users, u); 1334 1332 break; … … 1575 1573 struct im_connection *ic = req->data; 1576 1574 struct twitter_data *td; 1577 JSON_Value *parsed;1575 json_value *parsed; 1578 1576 struct twitter_xml_list *txl; 1579 1577 … … 1615 1613 struct im_connection *ic = req->data; 1616 1614 struct twitter_data *td; 1617 JSON_Value *parsed;1615 json_value *parsed; 1618 1616 struct twitter_xml_list *txl; 1619 1617 … … 1656 1654 struct im_connection *ic = req->data; 1657 1655 struct twitter_data *td; 1658 JSON_Value *parsed; 1659 jint id; 1656 json_value *parsed, *id; 1660 1657 1661 1658 // Check if the connection is still active. … … 1671 1668 } 1672 1669 1673 if ((id = json_o bject_get_integer(json_object(parsed), "id"))) {1674 td->last_status_id = id ;1670 if ((id = json_o_get(parsed, "id")) && id->type == json_integer) { 1671 td->last_status_id = id->u.integer; 1675 1672 } 1676 1673 … … 1800 1797 { 1801 1798 struct im_connection *ic = req->data; 1802 JSON_Value *parsed; 1803 uint64_t id; 1799 json_value *parsed, *id; 1804 1800 const char *name; 1805 1801 … … 1813 1809 } 1814 1810 1811 /* for the parson branch: 1815 1812 name = json_object_dotget_string(json_object(parsed), "user.screen_name"); 1816 1813 id = json_object_get_integer(json_object(parsed), "id"); 1817 1818 if (name && id) { 1819 twitter_log(ic, "https://twitter.com/%s/status/%" G_GUINT64_FORMAT, name, id); 1814 */ 1815 1816 name = json_o_str(json_o_get(parsed, "user"), "screen_name"); 1817 id = json_o_get(parsed, "id"); 1818 1819 if (name && id && id->type == json_integer) { 1820 twitter_log(ic, "https://twitter.com/%s/status/%" G_GUINT64_FORMAT, name, id->u.integer); 1820 1821 } else { 1821 1822 twitter_log(ic, "Error: could not fetch tweet url."); -
root_commands.c
r7a9d968 r4a9c6b0 509 509 con = ""; 510 510 } 511 511 512 if (a->prpl == &protocol_missing) { 512 513 protocol = g_strdup_printf("%s (missing!)", set_getstr(&a->set, "_protocol_name")); … … 700 701 irc_rootmsg(irc, "That account is not on-line"); 701 702 return; 702 } else if (add_on_server && !a->prpl->add_buddy) { 703 irc_rootmsg(irc, "IM protocol does not support contact list modification"); 704 return; 703 } 704 705 if (cmd[3]) { 706 if (!nick_ok(irc, cmd[3])) { 707 irc_rootmsg(irc, "The requested nick `%s' is invalid", cmd[3]); 708 return; 709 } else if (irc_user_by_name(irc, cmd[3])) { 710 irc_rootmsg(irc, "The requested nick `%s' already exists", cmd[3]); 711 return; 712 } else { 713 nick_set_raw(a, cmd[2], cmd[3]); 714 } 705 715 } 706 716 … … 718 728 } 719 729 720 if (cmd[3]) {721 if (!nick_ok(irc, cmd[3])) {722 irc_rootmsg(irc, "The requested nick `%s' is invalid", cmd[3]);723 return;724 } else if (irc_user_by_name(irc, cmd[3])) {725 irc_rootmsg(irc, "The requested nick `%s' already exists", cmd[3]);726 return;727 } else {728 nick_set_raw(a, cmd[2], cmd[3]);729 }730 }731 732 730 if (add_on_server) { 733 731 irc_channel_t *ic; … … 773 771 s = g_strdup(bu->handle); 774 772 775 if (bu->ic->acc->prpl->remove_buddy) { 776 bu->ic->acc->prpl->remove_buddy(bu->ic, bu->handle, NULL); 777 } else { 778 irc_rootmsg(irc, "IM protocol does not support contact list modification, " 779 "removal will likely not be permanent"); 780 } 781 773 bu->ic->acc->prpl->remove_buddy(bu->ic, bu->handle, NULL); 782 774 nick_del(bu); 783 775 if (g_slist_find(irc->users, iu)) { -
storage_xml.c
r7a9d968 r4a9c6b0 114 114 char *pass_b64 = NULL; 115 115 unsigned char *pass_cr = NULL; 116 int pass_len ;116 int pass_len, local = 0; 117 117 struct prpl *prpl = NULL; 118 118 account_t *acc; … … 133 133 prpl = (struct prpl*) &protocol_missing; 134 134 } 135 local = protocol_account_islocal(protocol); 135 136 } 136 137 … … 160 161 if (tag) { 161 162 set_setstr(&acc->set, "tag", tag); 163 } 164 if (local) { 165 acc->flags |= ACC_FLAG_LOCAL; 162 166 } 163 167 if (locked && !g_strcasecmp(locked, "true")) {
Note: See TracChangeset
for help on using the changeset viewer.