comparison libpurple/protocols/jabber/google.c @ 18161:3a1a9e8c1506

whitespace
author Nathan Walp <nwalp@pidgin.im>
date Sun, 17 Jun 2007 13:59:29 +0000
parents a7c07b57f3e4
children 8f172a8b8cce
comparison
equal deleted inserted replaced
18154:08e639dbac99 18161:3a1a9e8c1506
1
2 /** 1 /**
3 * Purple is the legal property of its developers, whose names are too numerous 2 * Purple is the legal property of its developers, whose names are too numerous
4 * to list here. Please refer to the COPYRIGHT file distributed with this 3 * to list here. Please refer to the COPYRIGHT file distributed with this
5 * source distribution. 4 * source distribution.
6 * 5 *
28 #include "google.h" 27 #include "google.h"
29 #include "jabber.h" 28 #include "jabber.h"
30 #include "presence.h" 29 #include "presence.h"
31 #include "iq.h" 30 #include "iq.h"
32 31
33 static void 32 static void
34 jabber_gmail_parse(JabberStream *js, xmlnode *packet, gpointer nul) 33 jabber_gmail_parse(JabberStream *js, xmlnode *packet, gpointer nul)
35 { 34 {
36 const char *type = xmlnode_get_attrib(packet, "type"); 35 const char *type = xmlnode_get_attrib(packet, "type");
37 xmlnode *child; 36 xmlnode *child;
38 xmlnode *message, *sender_node, *subject_node; 37 xmlnode *message, *sender_node, *subject_node;
39 const char *from, *to, *subject, *url, *tid; 38 const char *from, *to, *subject, *url, *tid;
40 const char *in_str; 39 const char *in_str;
41 char *to_name; 40 char *to_name;
42 int i, count = 1, returned_count; 41 int i, count = 1, returned_count;
43 42
44 const char **tos, **froms, **subjects, **urls; 43 const char **tos, **froms, **subjects, **urls;
45 44
46 if (strcmp(type, "result")) 45 if (strcmp(type, "result"))
47 return; 46 return;
48 47
49 child = xmlnode_get_child(packet, "mailbox"); 48 child = xmlnode_get_child(packet, "mailbox");
50 if (!child) 49 if (!child)
51 return; 50 return;
52 51
53 in_str = xmlnode_get_attrib(child, "total-matched"); 52 in_str = xmlnode_get_attrib(child, "total-matched");
54 if (in_str && *in_str) 53 if (in_str && *in_str)
55 count = atoi(in_str); 54 count = atoi(in_str);
56 55
57 if (count == 0) 56 if (count == 0)
58 return; 57 return;
59 58
60 message = xmlnode_get_child(child, "mail-thread-info"); 59 message = xmlnode_get_child(child, "mail-thread-info");
61 60
62 /* Loop once to see how many messages were returned so we can allocate arrays 61 /* Loop once to see how many messages were returned so we can allocate arrays
63 * accordingly */ 62 * accordingly */
64 if (!message) 63 if (!message)
65 return; 64 return;
66 for (returned_count = 0; message; returned_count++, message=xmlnode_get_next_twin(message)); 65 for (returned_count = 0; message; returned_count++, message=xmlnode_get_next_twin(message));
67 66
68 froms = g_new0(const char* , returned_count); 67 froms = g_new0(const char* , returned_count);
69 tos = g_new0(const char* , returned_count); 68 tos = g_new0(const char* , returned_count);
70 subjects = g_new0(const char* , returned_count); 69 subjects = g_new0(const char* , returned_count);
71 urls = g_new0(const char* , returned_count); 70 urls = g_new0(const char* , returned_count);
72 71
73 to = xmlnode_get_attrib(packet, "to"); 72 to = xmlnode_get_attrib(packet, "to");
74 to_name = jabber_get_bare_jid(to); 73 to_name = jabber_get_bare_jid(to);
75 url = xmlnode_get_attrib(child, "url"); 74 url = xmlnode_get_attrib(child, "url");
76 if (!url || !*url) 75 if (!url || !*url)
77 url = "http://www.gmail.com"; 76 url = "http://www.gmail.com";
78 77
79 message= xmlnode_get_child(child, "mail-thread-info"); 78 message= xmlnode_get_child(child, "mail-thread-info");
80 for (i=0; message; message = xmlnode_get_next_twin(message), i++) { 79 for (i=0; message; message = xmlnode_get_next_twin(message), i++) {
81 subject_node = xmlnode_get_child(message, "subject"); 80 subject_node = xmlnode_get_child(message, "subject");
82 sender_node = xmlnode_get_child(message, "senders"); 81 sender_node = xmlnode_get_child(message, "senders");
83 sender_node = xmlnode_get_child(sender_node, "sender"); 82 sender_node = xmlnode_get_child(sender_node, "sender");
84 83
85 while (sender_node && (!xmlnode_get_attrib(sender_node, "unread") || 84 while (sender_node && (!xmlnode_get_attrib(sender_node, "unread") ||
86 !strcmp(xmlnode_get_attrib(sender_node, "unread"),"0"))) 85 !strcmp(xmlnode_get_attrib(sender_node, "unread"),"0")))
87 sender_node = xmlnode_get_next_twin(sender_node); 86 sender_node = xmlnode_get_next_twin(sender_node);
88 87
89 if (!sender_node) { 88 if (!sender_node) {
90 i--; 89 i--;
91 continue; 90 continue;
92 } 91 }
93 92
94 from = xmlnode_get_attrib(sender_node, "name"); 93 from = xmlnode_get_attrib(sender_node, "name");
95 if (!from || !*from) 94 if (!from || !*from)
96 from = xmlnode_get_attrib(sender_node, "address"); 95 from = xmlnode_get_attrib(sender_node, "address");
97 subject = xmlnode_get_data(subject_node); 96 subject = xmlnode_get_data(subject_node);
98 /* 97 /*
100 */ 99 */
101 tos[i] = (to_name != NULL ? to_name : ""); 100 tos[i] = (to_name != NULL ? to_name : "");
102 froms[i] = (from != NULL ? from : ""); 101 froms[i] = (from != NULL ? from : "");
103 subjects[i] = (subject != NULL ? subject : ""); 102 subjects[i] = (subject != NULL ? subject : "");
104 urls[i] = (url != NULL ? url : ""); 103 urls[i] = (url != NULL ? url : "");
105 104
106 tid = xmlnode_get_attrib(message, "tid"); 105 tid = xmlnode_get_attrib(message, "tid");
107 if (tid && 106 if (tid &&
108 (js->gmail_last_tid == NULL || strcmp(tid, js->gmail_last_tid) > 0)) { 107 (js->gmail_last_tid == NULL || strcmp(tid, js->gmail_last_tid) > 0)) {
109 g_free(js->gmail_last_tid); 108 g_free(js->gmail_last_tid);
110 js->gmail_last_tid = g_strdup(tid); 109 js->gmail_last_tid = g_strdup(tid);
111 } 110 }
112 } 111 }
113 112
114 if (i>0) 113 if (i>0)
115 purple_notify_emails(js->gc, count, count == returned_count, subjects, froms, tos, 114 purple_notify_emails(js->gc, count, count == returned_count, subjects, froms, tos,
116 urls, NULL, NULL); 115 urls, NULL, NULL);
117 116
118 g_free(to_name); 117 g_free(to_name);
119 g_free(tos); 118 g_free(tos);
120 g_free(froms); 119 g_free(froms);
121 g_free(subjects); 120 g_free(subjects);
126 g_free(js->gmail_last_time); 125 g_free(js->gmail_last_time);
127 js->gmail_last_time = g_strdup(in_str); 126 js->gmail_last_time = g_strdup(in_str);
128 } 127 }
129 } 128 }
130 129
131 void 130 void
132 jabber_gmail_poke(JabberStream *js, xmlnode *packet) 131 jabber_gmail_poke(JabberStream *js, xmlnode *packet)
133 { 132 {
134 const char *type; 133 const char *type;
135 xmlnode *query; 134 xmlnode *query;
136 JabberIq *iq; 135 JabberIq *iq;
137 136
138 /* bail if the user isn't interested */ 137 /* bail if the user isn't interested */
139 if (!purple_account_get_check_mail(js->gc->account)) 138 if (!purple_account_get_check_mail(js->gc->account))
140 return; 139 return;
141 140
142 type = xmlnode_get_attrib(packet, "type"); 141 type = xmlnode_get_attrib(packet, "type");
143 142
144 143
145 /* Is this an initial incoming mail notification? If so, send a request for more info */ 144 /* Is this an initial incoming mail notification? If so, send a request for more info */
146 if (strcmp(type, "set") || !xmlnode_get_child(packet, "new-mail")) 145 if (strcmp(type, "set") || !xmlnode_get_child(packet, "new-mail"))
147 return; 146 return;
148 147
163 } 162 }
164 163
165 void jabber_gmail_init(JabberStream *js) { 164 void jabber_gmail_init(JabberStream *js) {
166 JabberIq *iq; 165 JabberIq *iq;
167 166
168 if (!purple_account_get_check_mail(js->gc->account)) 167 if (!purple_account_get_check_mail(js->gc->account))
169 return; 168 return;
170 169
171 iq = jabber_iq_new_query(js, JABBER_IQ_GET, "google:mail:notify"); 170 iq = jabber_iq_new_query(js, JABBER_IQ_GET, "google:mail:notify");
172 jabber_iq_set_callback(iq, jabber_gmail_parse, NULL); 171 jabber_iq_set_callback(iq, jabber_gmail_parse, NULL);
173 jabber_iq_send(iq); 172 jabber_iq_send(iq);
178 JabberIq *iq; 177 JabberIq *iq;
179 xmlnode *query; 178 xmlnode *query;
180 179
181 iq = jabber_iq_new_query(js, JABBER_IQ_GET, "jabber:iq:roster"); 180 iq = jabber_iq_new_query(js, JABBER_IQ_GET, "jabber:iq:roster");
182 query = xmlnode_get_child(iq->node, "query"); 181 query = xmlnode_get_child(iq->node, "query");
183 182
184 xmlnode_set_attrib(query, "xmlns:gr", "google:roster"); 183 xmlnode_set_attrib(query, "xmlns:gr", "google:roster");
185 xmlnode_set_attrib(query, "gr:ext", "2"); 184 xmlnode_set_attrib(query, "gr:ext", "2");
186 185
187 jabber_iq_send(iq); 186 jabber_iq_send(iq);
188 } 187 }
216 215
217 char *jid_norm = g_strdup(jabber_normalize(account, jid)); 216 char *jid_norm = g_strdup(jabber_normalize(account, jid));
218 217
219 const char *grt = xmlnode_get_attrib_with_namespace(item, "t", "google:roster"); 218 const char *grt = xmlnode_get_attrib_with_namespace(item, "t", "google:roster");
220 const char *subscription = xmlnode_get_attrib(item, "subscription"); 219 const char *subscription = xmlnode_get_attrib(item, "subscription");
221 220
222 if (!subscription || !strcmp(subscription, "none")) { 221 if (!subscription || !strcmp(subscription, "none")) {
223 /* The Google Talk servers will automatically add people from your Gmail address book 222 /* The Google Talk servers will automatically add people from your Gmail address book
224 * with subscription=none. If we see someone with subscription=none, ignore them. 223 * with subscription=none. If we see someone with subscription=none, ignore them.
225 */ 224 */
226 return FALSE; 225 return FALSE;
227 } 226 }
228 227
229 while (list) { 228 while (list) {
230 if (!strcmp(jid_norm, (char*)list->data)) { 229 if (!strcmp(jid_norm, (char*)list->data)) {
231 on_block_list = TRUE; 230 on_block_list = TRUE;
232 break; 231 break;
233 } 232 }
234 list = list->next; 233 list = list->next;
235 } 234 }
236 235
237 if (grt && (*grt == 'H' || *grt == 'h')) { 236 if (grt && (*grt == 'H' || *grt == 'h')) {
238 PurpleBuddy *buddy = purple_find_buddy(account, jid_norm); 237 PurpleBuddy *buddy = purple_find_buddy(account, jid_norm);
239 purple_blist_remove_buddy(buddy); 238 purple_blist_remove_buddy(buddy);
240 return FALSE; 239 return FALSE;
241 } 240 }
242 241
243 if (!on_block_list && (grt && (*grt == 'B' || *grt == 'b'))) { 242 if (!on_block_list && (grt && (*grt == 'B' || *grt == 'b'))) {
244 purple_debug_info("jabber", "Blocking %s\n", jid_norm); 243 purple_debug_info("jabber", "Blocking %s\n", jid_norm);
245 purple_privacy_deny_add(account, jid_norm, TRUE); 244 purple_privacy_deny_add(account, jid_norm, TRUE);
246 } else if (on_block_list && (!grt || (*grt != 'B' && *grt != 'b' ))){ 245 } else if (on_block_list && (!grt || (*grt != 'B' && *grt != 'b' ))){
247 purple_debug_info("jabber", "Unblocking %s\n", jid_norm); 246 purple_debug_info("jabber", "Unblocking %s\n", jid_norm);
248 purple_privacy_deny_remove(account, jid_norm, TRUE); 247 purple_privacy_deny_remove(account, jid_norm, TRUE);
249 } 248 }
250 return TRUE; 249 return TRUE;
251 } 250 }
252 251
253 void jabber_google_roster_add_deny(PurpleConnection *gc, const char *who) 252 void jabber_google_roster_add_deny(PurpleConnection *gc, const char *who)
254 { 253 {
255 JabberStream *js; 254 JabberStream *js;
256 GSList *buddies; 255 GSList *buddies;
257 JabberIq *iq; 256 JabberIq *iq;
258 xmlnode *query; 257 xmlnode *query;
260 xmlnode *group; 259 xmlnode *group;
261 PurpleBuddy *b; 260 PurpleBuddy *b;
262 JabberBuddy *jb; 261 JabberBuddy *jb;
263 262
264 js = (JabberStream*)(gc->proto_data); 263 js = (JabberStream*)(gc->proto_data);
265 264
266 if (!js || !js->server_caps & JABBER_CAP_GOOGLE_ROSTER) 265 if (!js || !js->server_caps & JABBER_CAP_GOOGLE_ROSTER)
267 return; 266 return;
268 267
269 jb = jabber_buddy_find(js, who, TRUE); 268 jb = jabber_buddy_find(js, who, TRUE);
270 269
271 buddies = purple_find_buddies(js->gc->account, who); 270 buddies = purple_find_buddies(js->gc->account, who);
272 if(!buddies) 271 if(!buddies)
273 return; 272 return;
274 273
275 b = buddies->data; 274 b = buddies->data;
276 275
277 iq = jabber_iq_new_query(js, JABBER_IQ_SET, "jabber:iq:roster"); 276 iq = jabber_iq_new_query(js, JABBER_IQ_SET, "jabber:iq:roster");
278 277
279 query = xmlnode_get_child(iq->node, "query"); 278 query = xmlnode_get_child(iq->node, "query");
280 item = xmlnode_new_child(query, "item"); 279 item = xmlnode_new_child(query, "item");
281 280
282 while(buddies) { 281 while(buddies) {
283 PurpleGroup *g; 282 PurpleGroup *g;
285 b = buddies->data; 284 b = buddies->data;
286 g = purple_buddy_get_group(b); 285 g = purple_buddy_get_group(b);
287 286
288 group = xmlnode_new_child(item, "group"); 287 group = xmlnode_new_child(item, "group");
289 xmlnode_insert_data(group, g->name, -1); 288 xmlnode_insert_data(group, g->name, -1);
290 289
291 buddies = buddies->next; 290 buddies = buddies->next;
292 } 291 }
293 292
294 iq = jabber_iq_new_query(js, JABBER_IQ_SET, "jabber:iq:roster"); 293 iq = jabber_iq_new_query(js, JABBER_IQ_SET, "jabber:iq:roster");
295 294
331 xmlnode *group; 330 xmlnode *group;
332 PurpleBuddy *b; 331 PurpleBuddy *b;
333 332
334 g_return_if_fail(gc != NULL); 333 g_return_if_fail(gc != NULL);
335 g_return_if_fail(who != NULL); 334 g_return_if_fail(who != NULL);
336 335
337 js = (JabberStream*)(gc->proto_data); 336 js = (JabberStream*)(gc->proto_data);
338 337
339 if (!js || !js->server_caps & JABBER_CAP_GOOGLE_ROSTER) 338 if (!js || !js->server_caps & JABBER_CAP_GOOGLE_ROSTER)
340 return; 339 return;
341 340
342 buddies = purple_find_buddies(js->gc->account, who); 341 buddies = purple_find_buddies(js->gc->account, who);
343 if(!buddies) 342 if(!buddies)
344 return; 343 return;
345 344
346 b = buddies->data; 345 b = buddies->data;
347 346
348 iq = jabber_iq_new_query(js, JABBER_IQ_SET, "jabber:iq:roster"); 347 iq = jabber_iq_new_query(js, JABBER_IQ_SET, "jabber:iq:roster");
349 348
350 query = xmlnode_get_child(iq->node, "query"); 349 query = xmlnode_get_child(iq->node, "query");
351 item = xmlnode_new_child(query, "item"); 350 item = xmlnode_new_child(query, "item");
352 351
353 while(buddies) { 352 while(buddies) {
354 PurpleGroup *g; 353 PurpleGroup *g;
356 b = buddies->data; 355 b = buddies->data;
357 g = purple_buddy_get_group(b); 356 g = purple_buddy_get_group(b);
358 357
359 group = xmlnode_new_child(item, "group"); 358 group = xmlnode_new_child(item, "group");
360 xmlnode_insert_data(group, g->name, -1); 359 xmlnode_insert_data(group, g->name, -1);
361 360
362 buddies = buddies->next; 361 buddies = buddies->next;
363 } 362 }
364 363
365 iq = jabber_iq_new_query(js, JABBER_IQ_SET, "jabber:iq:roster"); 364 iq = jabber_iq_new_query(js, JABBER_IQ_SET, "jabber:iq:roster");
366 365
438 in_bold = in_italic = in_tag = FALSE; 437 in_bold = in_italic = in_tag = FALSE;
439 preceding_space = TRUE; 438 preceding_space = TRUE;
440 439
441 for (p = text; *p != '\0'; p = g_utf8_next_char(p)) { 440 for (p = text; *p != '\0'; p = g_utf8_next_char(p)) {
442 gunichar c = g_utf8_get_char(p); 441 gunichar c = g_utf8_get_char(p);
443 442
444 if (bold_count < 2 && italic_count < 2 && !in_bold && !in_italic) { 443 if (bold_count < 2 && italic_count < 2 && !in_bold && !in_italic) {
445 g_string_append(str, p); 444 g_string_append(str, p);
446 return g_string_free(str, FALSE); 445 return g_string_free(str, FALSE);
447 } 446 }
448 447
449 448
450 if (c == '*' && !in_tag) { 449 if (c == '*' && !in_tag) {
451 if (in_bold && 450 if (in_bold &&
452 (g_unichar_isspace(*(p+1))||*(p+1)=='<')) { /* This is safe in UTF-8 */ 451 (g_unichar_isspace(*(p+1))||*(p+1)=='<')) { /* This is safe in UTF-8 */
453 str = g_string_append(str, "</b>"); 452 str = g_string_append(str, "</b>");
454 in_bold = FALSE; 453 in_bold = FALSE;
455 bold_count--; 454 bold_count--;
456 } else if (preceding_space && bold_count > 1 && !g_unichar_isspace(*(p+1))) { 455 } else if (preceding_space && bold_count > 1 && !g_unichar_isspace(*(p+1))) {
488 else 487 else
489 preceding_space = FALSE; 488 preceding_space = FALSE;
490 } else { 489 } else {
491 str = g_string_append_unichar(str, c); 490 str = g_string_append_unichar(str, c);
492 } 491 }
493 } 492 }
494 return g_string_free(str, FALSE); 493 return g_string_free(str, FALSE);
495 } 494 }