Changeset dd43c62 for protocols/jabber
- Timestamp:
- 2015-05-28T05:26:24Z (10 years ago)
- Branches:
- master
- Children:
- faeb521
- Parents:
- 3d31618
- git-author:
- Artem Savkov <artem.savkov@…> (28-03-15 01:23:42)
- git-committer:
- dequis <dx@…> (28-05-15 05:26:24)
- Location:
- protocols/jabber
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
protocols/jabber/iq.c
r3d31618 rdd43c62 27 27 static xt_status jabber_parse_roster(struct im_connection *ic, struct xt_node *node, struct xt_node *orig); 28 28 static xt_status jabber_iq_display_vcard(struct im_connection *ic, struct xt_node *node, struct xt_node *orig); 29 static xt_status jabber_gmail_handle_new(struct im_connection *ic, struct xt_node *node); 29 30 30 31 xt_status jabber_pkt_iq(struct xt_node *node, gpointer data) … … 141 142 (strcmp(s, XMLNS_SI) == 0)) { 142 143 return jabber_si_handle_request(ic, node, c); 144 } else if ((c = xt_find_node(node->children, "new-mail")) && 145 (s = xt_find_attr(c, "xmlns")) && 146 (strcmp(s, XMLNS_GMAILNOTIFY) == 0)) { 147 return jabber_gmail_handle_new(ic, node); 143 148 } else if (!(c = xt_find_node(node->children, "query")) || 144 149 !(s = xt_find_attr(c, "xmlns"))) { … … 342 347 return XT_ABORT; 343 348 } 349 if (jd->flags & JFLAG_GMAILNOTIFY && node == NULL) { 350 jabber_iq_query_server(ic, jd->server, XMLNS_DISCO_INFO); 351 } 344 352 } else if ((jd->flags & (JFLAG_WANT_BIND | JFLAG_WANT_SESSION)) == 0) { 345 353 if (!jabber_get_roster(ic)) { … … 369 377 370 378 return st; 379 } 380 381 xt_status jabber_iq_query_gmail(struct im_connection *ic); 382 383 static xt_status jabber_gmail_handle_new(struct im_connection *ic, struct xt_node *node) 384 { 385 struct xt_node *response; 386 struct jabber_data *jd = ic->proto_data; 387 388 response = jabber_make_packet("iq", "result", g_strdup_printf("%s@%s", jd->username, jd->server), NULL); 389 390 jabber_cache_add(ic, response, NULL); 391 if (!jabber_write_packet(ic, response)) { 392 return XT_ABORT; 393 } 394 395 jabber_iq_query_gmail(ic); 396 397 return XT_HANDLED; 371 398 } 372 399 … … 710 737 } 711 738 739 xt_status jabber_iq_parse_gmail(struct im_connection *ic, struct xt_node *node, struct xt_node *orig); 740 741 xt_status jabber_iq_query_gmail(struct im_connection *ic) 742 { 743 struct xt_node *node, *query; 744 struct jabber_data *jd = ic->proto_data; 745 746 node = xt_new_node("query", NULL, NULL); 747 xt_add_attr(node, "xmlns", XMLNS_GMAILNOTIFY); 748 if (jd->gmail_time) { 749 char *formatted = g_strdup_printf("%" G_GUINT64_FORMAT, (jd->gmail_time + 1)); 750 xt_add_attr(node, "newer-than-time", formatted); 751 g_free(formatted); 752 } 753 if (jd->gmail_tid) { 754 xt_add_attr(node, "newer-than-tid", jd->gmail_tid); 755 } 756 757 if (!(query = jabber_make_packet("iq", "get", jd->me, node))) { 758 imcb_log(ic, "WARNING: Couldn't generate server query"); 759 xt_free_node(node); 760 } 761 762 jabber_cache_add(ic, query, jabber_iq_parse_gmail); 763 764 return jabber_write_packet(ic, query) ? XT_HANDLED : XT_ABORT; 765 } 766 712 767 xt_status jabber_iq_parse_server_features(struct im_connection *ic, struct xt_node *node, struct xt_node *orig); 713 768 … … 729 784 730 785 return jabber_write_packet(ic, query) ? XT_HANDLED : XT_ABORT; 786 } 787 788 xt_status jabber_iq_parse_gmail(struct im_connection *ic, struct xt_node *node, struct xt_node *orig) 789 { 790 struct xt_node *c; 791 struct jabber_data *jd = ic->proto_data; 792 char *xmlns, *from; 793 guint64 l_time = 0; 794 char *tid = NULL; 795 796 if (!(c = xt_find_node(node->children, "mailbox")) || 797 !(from = xt_find_attr(node, "from")) || 798 !(xmlns = xt_find_attr(c, "xmlns")) || 799 (g_strcmp0(xmlns, XMLNS_GMAILNOTIFY) != 0)) { 800 imcb_log(ic, "WARNING: Received incomplete mailbox packet for gmail notify"); 801 return XT_HANDLED; 802 } 803 804 c = c->children; 805 806 while ((c = xt_find_node(c, "mail-thread-info"))) { 807 struct xt_node *thread, *s; 808 char *subject = NULL; 809 char *snippet = NULL; 810 char *msg = NULL; 811 guint64 t_time; 812 813 t_time = g_ascii_strtoull(xt_find_attr(c, "date"), NULL, 10); 814 if (t_time && t_time > l_time) { 815 l_time = t_time; 816 tid = xt_find_attr(c, "tid"); 817 } 818 819 thread = c->children; 820 821 if ((s = xt_find_node(thread, "subject"))) { 822 subject = s->text; 823 } 824 825 if ((s = xt_find_node(thread, "snippet"))) { 826 snippet = s->text; 827 } 828 829 if (subject) { 830 msg = g_strdup_printf("New mail for %s. Subj: %s", from, subject); 831 } else { 832 msg = g_strdup_printf("New mail for %s.", from); 833 } 834 imcb_notify_email(ic, set_getstr(&ic->acc->set, "notify_handle"), msg, 0, 0); 835 836 if (snippet) { 837 imcb_notify_email(ic, set_getstr(&ic->acc->set, "notify_handle"), snippet, 0, 0); 838 } 839 840 c = c->next; 841 g_free(msg); 842 } 843 844 if (l_time && (!jd->gmail_time || l_time > jd->gmail_time)) { 845 jd->gmail_time = l_time; 846 if (tid) { 847 g_free(jd->gmail_tid); 848 jd->gmail_tid = g_strdup(tid); 849 } 850 } 851 852 return XT_HANDLED; 731 853 } 732 854 … … 781 903 c = c->next; 782 904 } 905 906 if (jd->flags & JFLAG_GMAILNOTIFY) { 907 /* search for gmail notification feature */ 908 c = xt_find_node(node->children, "query"); 909 c = c->children; 910 while ((c = xt_find_node(c, "feature"))) { 911 if (strcmp(xt_find_attr(c, "var"), XMLNS_GMAILNOTIFY) == 0) { 912 jabber_iq_query_gmail(ic); 913 } 914 c = c->next; 915 } 916 } 917 783 918 } else if (strcmp(xmlns, XMLNS_BYTESTREAMS) == 0) { 784 919 char *host, *jid, *port_s; -
protocols/jabber/jabber.c
r3d31618 rdd43c62 100 100 101 101 s = set_add(&acc->set, "xmlconsole", "false", set_eval_bool, acc); 102 103 s = set_add(&acc->set, "gmail_notifications", "false", set_eval_bool, acc); 102 104 s->flags |= ACC_SET_OFFLINE_ONLY; 105 106 s = set_add(&acc->set, "notify_handle", NULL, NULL, acc); 107 s->flags |= ACC_SET_OFFLINE_ONLY | SET_NULL_OK; 103 108 104 109 acc->flags |= ACC_FLAG_AWAY_MESSAGE | ACC_FLAG_STATUS_MESSAGE | … … 259 264 imcb_add_buddy(ic, JABBER_XMLCONSOLE_HANDLE, NULL); 260 265 } 266 if (set_getbool(&acc->set, "gmail_notifications")) { 267 jd->flags |= JFLAG_GMAILNOTIFY; 268 if (set_getstr(&acc->set, "notify_handle")) { 269 imcb_add_buddy(ic, set_getstr(&acc->set, "notify_handle"), NULL); 270 } 271 } 261 272 262 273 jabber_generate_id_hash(jd); … … 334 345 g_free(jd->away_message); 335 346 g_free(jd->internal_jid); 347 g_free(jd->gmail_tid); 336 348 g_free(jd->username); 337 349 g_free(jd->me); -
protocols/jabber/jabber.h
r3d31618 rdd43c62 46 46 JFLAG_XMLCONSOLE = 64, /* If the user added an xmlconsole buddy. */ 47 47 JFLAG_STARTTLS_DONE = 128, /* If a plaintext session was converted to TLS. */ 48 JFLAG_GMAILNOTIFY = 256, /* If gmail notification is enabled */ 48 49 49 50 JFLAG_GTALK = 0x100000, /* Is Google Talk, as confirmed by iq discovery */ … … 102 103 const struct jabber_away_state *away_state; 103 104 char *away_message; 105 guint64 gmail_time; 106 char *gmail_tid; 104 107 105 108 md5_state_t cached_id_prefix; … … 224 227 #define XMLNS_DELAY "urn:xmpp:delay" /* XEP-0203 */ 225 228 #define XMLNS_XDATA "jabber:x:data" /* XEP-0004 */ 229 #define XMLNS_GMAILNOTIFY "google:mail:notify" /* Not a XEP */ 226 230 #define XMLNS_CHATSTATES "http://jabber.org/protocol/chatstates" /* XEP-0085 */ 227 231 #define XMLNS_DISCO_INFO "http://jabber.org/protocol/disco#info" /* XEP-0030 */
Note: See TracChangeset
for help on using the changeset viewer.