Mercurial > pidgin.yaz
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 } |