Mercurial > pidgin.yaz
annotate src/protocols/zephyr/zephyr.c @ 5234:890b29f00b68
[gaim-migrate @ 5604]
Chats in the buddy list!
You can now put chat rooms in your buddy list, and double-click them to join
them, instead of having to do all that typing. I'm eventually gonna add
auto-join support, so that ugly hack involving pouncing can go away.
Someone should make some new artwork so we don't have 2 + icons next to
each other in the menus.
This also has some fixes to let gaim compile again, after the renaming of
the buddy list files.
This also fixes the problem with offline buddies not showing up in the list
sometimes for accounts that didn't log in at startup.
This probably fixes other stuff, but I can't remember any of it off the top
of my head.
I'm going to stop typing and let people play with this now.
committer: Tailor Script <tailor@pidgin.im>
author | Nathan Walp <nwalp@pidgin.im> |
---|---|
date | Sat, 26 Apr 2003 20:30:43 +0000 |
parents | fefad67de2c7 |
children | ad445074d239 |
rev | line source |
---|---|
2086 | 1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ |
2 /* | |
3 * gaim | |
4 * | |
5 * Copyright (C) 1998-2001, Mark Spencer <markster@marko.net> | |
6 * Some code borrowed from GtkZephyr, by | |
7 * Jag/Sean Dilda <agrajag@linuxpower.org>/<smdilda@unity.ncsu.edu> | |
8 * http://gtkzephyr.linuxpower.org/ | |
9 * | |
10 * This program is free software; you can redistribute it and/or modify | |
11 * it under the terms of the GNU General Public License as published by | |
12 * the Free Software Foundation; either version 2 of the License, or | |
13 * (at your option) any later version. | |
14 * | |
15 * This program is distributed in the hope that it will be useful, | |
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
18 * GNU General Public License for more details. | |
19 * | |
20 * You should have received a copy of the GNU General Public License | |
21 * along with this program; if not, write to the Free Software | |
22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
23 * | |
24 */ | |
25 | |
26 #ifdef HAVE_CONFIG_H | |
27 #include "config.h" | |
28 #endif | |
29 | |
30 #include <string.h> | |
31 #include <stdlib.h> | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
32 #include <errno.h> |
2086 | 33 #include "gaim.h" |
34 #include "prpl.h" | |
35 #include "zephyr/zephyr.h" | |
36 | |
37 extern Code_t ZGetLocations(ZLocations_t *, int *); | |
38 extern Code_t ZSetLocation(char *); | |
39 extern Code_t ZUnsetLocation(); | |
40 | |
41 typedef struct _zframe zframe; | |
42 typedef struct _zephyr_triple zephyr_triple; | |
43 | |
44 /* struct I need for zephyr_to_html */ | |
45 struct _zframe { | |
46 /* true for everything but @color, since inside the parens of that one is | |
47 * the color. */ | |
48 gboolean has_closer; | |
49 /* </i>, </font>, </b>, etc. */ | |
50 char *closing; | |
51 /* text including the opening html thingie. */ | |
52 GString *text; | |
53 struct _zframe *enclosing; | |
54 }; | |
55 | |
56 struct _zephyr_triple { | |
57 char *class; | |
58 char *instance; | |
59 char *recipient; | |
60 char *name; | |
61 gboolean open; | |
62 int id; | |
63 }; | |
64 | |
65 #define z_call(func) if (func != ZERR_NONE)\ | |
66 return; | |
67 #define z_call_r(func) if (func != ZERR_NONE)\ | |
68 return TRUE; | |
69 #define z_call_s(func, err) if (func != ZERR_NONE) {\ | |
70 hide_login_progress(zgc, err);\ | |
71 signoff(zgc);\ | |
72 return;\ | |
73 } | |
74 | |
75 static char *zephyr_normalize(const char *); | |
76 | |
77 /* this is so bad, and if Zephyr weren't so fucked up to begin with I | |
78 * wouldn't do this. but it is so i will. */ | |
79 static guint32 nottimer = 0; | |
80 static guint32 loctimer = 0; | |
81 struct gaim_connection *zgc = NULL; | |
82 static GList *pending_zloc_names = NULL; | |
83 static GSList *subscrips = NULL; | |
84 static int last_id = 0; | |
85 | |
86 /* just for debugging | |
87 static void handle_unknown(ZNotice_t notice) | |
88 { | |
3630 | 89 debug_printf("z_packet: %s\n", notice.z_packet); |
90 debug_printf("z_version: %s\n", notice.z_version); | |
91 debug_printf("z_kind: %d\n", notice.z_kind); | |
92 debug_printf("z_class: %s\n", notice.z_class); | |
93 debug_printf("z_class_inst: %s\n", notice.z_class_inst); | |
94 debug_printf("z_opcode: %s\n", notice.z_opcode); | |
95 debug_printf("z_sender: %s\n", notice.z_sender); | |
96 debug_printf("z_recipient: %s\n", notice.z_recipient); | |
97 debug_printf("z_message: %s\n", notice.z_message); | |
98 debug_printf("z_message_len: %d\n", notice.z_message_len); | |
99 debug_printf("\n"); | |
2086 | 100 } |
101 */ | |
102 | |
103 static zephyr_triple *new_triple(const char *c, const char *i, const char *r) | |
104 { | |
105 zephyr_triple *zt; | |
106 zt = g_new0(zephyr_triple, 1); | |
107 zt->class = g_strdup(c); | |
108 zt->instance = g_strdup(i); | |
109 zt->recipient = g_strdup(r); | |
110 zt->name = g_strdup_printf("%s,%s,%s", c, i, r); | |
111 zt->id = ++last_id; | |
112 zt->open = FALSE; | |
113 return zt; | |
114 } | |
115 | |
116 static void free_triple(zephyr_triple *zt) | |
117 { | |
118 g_free(zt->class); | |
119 g_free(zt->instance); | |
120 g_free(zt->recipient); | |
121 g_free(zt->name); | |
122 g_free(zt); | |
123 } | |
124 | |
125 /* returns true if zt1 is a subset of zt2, i.e. zt2 has the same thing or | |
126 * wildcards in each field of zt1. */ | |
127 static gboolean triple_subset(zephyr_triple *zt1, zephyr_triple *zt2) | |
128 { | |
4793 | 129 if (g_ascii_strcasecmp(zt2->class, zt1->class) && |
130 g_ascii_strcasecmp(zt2->class, "*")) { | |
2086 | 131 return FALSE; |
132 } | |
4793 | 133 if (g_ascii_strcasecmp(zt2->instance, zt1->instance) && |
134 g_ascii_strcasecmp(zt2->instance, "*")) { | |
2086 | 135 return FALSE; |
136 } | |
4793 | 137 if (g_ascii_strcasecmp(zt2->recipient, zt1->recipient) && |
138 g_ascii_strcasecmp(zt2->recipient, "*")) { | |
2086 | 139 return FALSE; |
140 } | |
141 return TRUE; | |
142 } | |
143 | |
144 static zephyr_triple *find_sub_by_triple(zephyr_triple *zt) | |
145 { | |
146 zephyr_triple *curr_t; | |
147 GSList *curr = subscrips; | |
148 while (curr) { | |
149 curr_t = curr->data; | |
150 if (triple_subset(zt, curr_t)) | |
151 return curr_t; | |
152 curr = curr->next; | |
153 } | |
154 return NULL; | |
155 } | |
156 | |
157 static zephyr_triple *find_sub_by_id(int id) | |
158 { | |
159 zephyr_triple *zt; | |
160 GSList *curr = subscrips; | |
161 while (curr) { | |
162 zt = curr->data; | |
163 if (zt->id == id) | |
164 return zt; | |
165 curr = curr->next; | |
166 } | |
167 return NULL; | |
168 } | |
169 | |
170 /* utility macros that are useful for zephyr_to_html */ | |
171 | |
172 #define IS_OPENER(c) ((c == '{') || (c == '[') || (c == '(') || (c == '<')) | |
173 #define IS_CLOSER(c) ((c == '}') || (c == ']') || (c == ')') || (c == '>')) | |
174 | |
175 /* this parses zephyr formatting and converts it to html. For example, if | |
176 * you pass in "@{@color(blue)@i(hello)}" you should get out | |
177 * "<font color=blue><i>hello</i></font>". */ | |
178 static char *zephyr_to_html(char *message) | |
179 { | |
180 int len, cnt; | |
181 zframe *frames, *curr; | |
182 char *ret; | |
183 | |
184 frames = g_new(zframe, 1); | |
185 frames->text = g_string_new(""); | |
186 frames->enclosing = NULL; | |
187 frames->closing = ""; | |
188 frames->has_closer = FALSE; | |
189 | |
190 len = strlen(message); | |
191 cnt = 0; | |
192 while (cnt <= len) { | |
193 if (message[cnt] == '@') { | |
194 zframe *new_f; | |
195 char *buf; | |
196 int end; | |
197 for (end=1; (cnt+end) <= len && | |
198 !IS_OPENER(message[cnt+end]); end++); | |
199 buf = g_new0(char, end); | |
200 if (end) { | |
201 g_snprintf(buf, end, "%s", message+cnt+1); | |
202 } | |
4793 | 203 if (!g_ascii_strcasecmp(buf, "italic") || |
204 !g_ascii_strcasecmp(buf, "i")) { | |
2086 | 205 new_f = g_new(zframe, 1); |
206 new_f->enclosing = frames; | |
207 new_f->text = g_string_new("<i>"); | |
208 new_f->closing = "</i>"; | |
209 new_f->has_closer = TRUE; | |
210 frames = new_f; | |
211 cnt += end+1; /* cnt points to char after opener */ | |
4793 | 212 } else if (!g_ascii_strcasecmp(buf, "bold") |
213 || !g_ascii_strcasecmp(buf, "b")) { | |
2086 | 214 new_f = g_new(zframe, 1); |
215 new_f->enclosing = frames; | |
216 new_f->text = g_string_new("<b>"); | |
217 new_f->closing = "</b>"; | |
218 new_f->has_closer = TRUE; | |
219 frames = new_f; | |
220 cnt += end+1; | |
4793 | 221 } else if (!g_ascii_strcasecmp(buf, "color")) { |
2086 | 222 cnt += end+1; |
223 new_f = g_new(zframe, 1); | |
224 new_f->enclosing = frames; | |
225 new_f->text = g_string_new("<font color="); | |
226 for (; (cnt <= len) && !IS_CLOSER(message[cnt]); cnt++) { | |
227 g_string_append_c(new_f->text, message[cnt]); | |
228 } | |
229 cnt++; /* point to char after closer */ | |
230 g_string_append_c(new_f->text, '>'); | |
231 new_f->closing = "</font>"; | |
232 new_f->has_closer = FALSE; | |
233 frames = new_f; | |
4793 | 234 } else if (!g_ascii_strcasecmp(buf, "")) { |
2086 | 235 new_f = g_new(zframe, 1); |
236 new_f->enclosing = frames; | |
237 new_f->text = g_string_new(""); | |
238 new_f->closing = ""; | |
239 new_f->has_closer = TRUE; | |
240 frames = new_f; | |
241 cnt += end+1; /* cnt points to char after opener */ | |
242 } else { | |
243 if ((cnt+end) > len) { | |
244 g_string_append_c(frames->text, '@'); | |
245 cnt++; | |
246 } else { | |
247 /* unrecognized thingie. act like it's not there, but we | |
248 * still need to take care of the corresponding closer, | |
249 * make a frame that does nothing. */ | |
250 new_f = g_new(zframe, 1); | |
251 new_f->enclosing = frames; | |
252 new_f->text = g_string_new(""); | |
253 new_f->closing = ""; | |
254 new_f->has_closer = TRUE; | |
255 frames = new_f; | |
256 cnt += end+1; /* cnt points to char after opener */ | |
257 } | |
258 } | |
259 } else if (IS_CLOSER(message[cnt])) { | |
260 zframe *popped; | |
261 gboolean last_had_closer; | |
262 if (frames->enclosing) { | |
263 do { | |
264 popped = frames; | |
265 frames = frames->enclosing; | |
266 g_string_append(frames->text, popped->text->str); | |
267 g_string_append(frames->text, popped->closing); | |
268 g_string_free(popped->text, TRUE); | |
269 last_had_closer = popped->has_closer; | |
270 g_free(popped); | |
271 } while (frames && frames->enclosing && !last_had_closer); | |
272 } else { | |
273 g_string_append_c(frames->text, message[cnt]); | |
274 } | |
275 cnt++; | |
276 } else if (message[cnt] == '\n') { | |
277 g_string_append(frames->text, "<br>"); | |
278 cnt++; | |
279 } else { | |
280 g_string_append_c(frames->text, message[cnt++]); | |
281 } | |
282 } | |
283 /* go through all the stuff that they didn't close */ | |
284 while (frames->enclosing) { | |
285 curr = frames; | |
286 g_string_append(frames->enclosing->text, frames->text->str); | |
287 g_string_append(frames->enclosing->text, frames->closing); | |
288 g_string_free(frames->text, TRUE); | |
289 frames = frames->enclosing; | |
290 g_free(curr); | |
291 } | |
292 ret = frames->text->str; | |
293 g_string_free(frames->text, FALSE); | |
294 g_free(frames); | |
295 return ret; | |
296 } | |
297 | |
298 static gboolean pending_zloc(char *who) | |
299 { | |
300 GList *curr; | |
301 for (curr = pending_zloc_names; curr != NULL; curr = curr->next) { | |
4793 | 302 if (!g_ascii_strcasecmp(who, (char*)curr->data)) { |
2086 | 303 g_free((char*)curr->data); |
304 pending_zloc_names = g_list_remove(pending_zloc_names, curr->data); | |
305 return TRUE; | |
306 } | |
307 } | |
308 return FALSE; | |
309 } | |
310 | |
311 static void handle_message(ZNotice_t notice, struct sockaddr_in from) | |
312 { | |
4793 | 313 if (!g_ascii_strcasecmp(notice.z_class, LOGIN_CLASS)) { |
3277 | 314 /* well, we'll be updating in 20 seconds anyway, might as well ignore this. */ |
4793 | 315 } else if (!g_ascii_strcasecmp(notice.z_class, LOCATE_CLASS)) { |
316 if (!g_ascii_strcasecmp(notice.z_opcode, LOCATE_LOCATE)) { | |
2086 | 317 int nlocs; |
318 char *user; | |
319 struct buddy *b; | |
320 | |
321 if (ZParseLocations(¬ice, NULL, &nlocs, &user) != ZERR_NONE) | |
322 return; | |
4687 | 323 if ((b = gaim_find_buddy(zgc->account, user)) == NULL) { |
2086 | 324 char *e = strchr(user, '@'); |
325 if (e) *e = '\0'; | |
4687 | 326 b = gaim_find_buddy(zgc->account, user); |
2086 | 327 } |
328 if (!b) { | |
329 free(user); | |
330 return; | |
331 } | |
332 if (pending_zloc(b->name)) { | |
333 ZLocations_t locs; | |
334 int one = 1; | |
335 GString *str = g_string_new(""); | |
5132 | 336 g_string_append_printf(str, _("<b>User:</b> %s<br>"), b->name); |
337 if (b->alias) | |
338 g_string_append_printf(str, _("<b>Alias:</b> %s<br>"), b->alias); | |
2086 | 339 if (!nlocs) { |
5132 | 340 g_string_append_printf(str, _("<br>Hidden or not logged-in")); |
2086 | 341 } |
342 for (; nlocs > 0; nlocs--) { | |
343 ZGetLocations(&locs, &one); | |
5132 | 344 g_string_append_printf(str, _("<br>At %s since %s"), locs.host, |
2086 | 345 locs.time); |
346 } | |
2791
8f6365332a05
[gaim-migrate @ 2804]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2773
diff
changeset
|
347 g_show_info_text(NULL, NULL, 2, str->str, NULL); |
2086 | 348 g_string_free(str, TRUE); |
349 } else | |
4732 | 350 serv_got_update(zgc, b->name, nlocs, 0, 0, 0, 0); |
2086 | 351 |
352 free(user); | |
353 } | |
354 } else { | |
355 char *buf, *buf2; | |
2804
1648c703ddc2
[gaim-migrate @ 2817]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2791
diff
changeset
|
356 char *send_inst; |
3277 | 357 char *realmptr; |
358 char *sendertmp; | |
2086 | 359 char *ptr = notice.z_message + strlen(notice.z_message) + 1; |
360 int len = notice.z_message_len - (ptr - notice.z_message); | |
361 int away; | |
362 if (len > 0) { | |
363 buf = g_malloc(len + 1); | |
364 g_snprintf(buf, len + 1, "%s", ptr); | |
365 g_strchomp(buf); | |
366 buf2 = zephyr_to_html(buf); | |
367 g_free(buf); | |
4793 | 368 if (!g_ascii_strcasecmp(notice.z_class, "MESSAGE") && |
369 !g_ascii_strcasecmp(notice.z_class_inst, "PERSONAL")) { | |
370 if (!g_ascii_strcasecmp(notice.z_message, "Automated reply:")) | |
2086 | 371 away = TRUE; |
372 else | |
373 away = FALSE; | |
2856
b1e300a85678
[gaim-migrate @ 2869]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2804
diff
changeset
|
374 serv_got_im(zgc, notice.z_sender, buf2, 0, time(NULL), -1); |
2086 | 375 } else { |
376 zephyr_triple *zt1, *zt2; | |
377 zt1 = new_triple(notice.z_class, notice.z_class_inst, | |
4687 | 378 notice.z_recipient); |
2086 | 379 zt2 = find_sub_by_triple(zt1); |
380 if (!zt2) { | |
381 /* we shouldn't be subscribed to this message. ignore. */ | |
382 } else { | |
383 if (!zt2->open) { | |
384 zt2->open = TRUE; | |
385 serv_got_joined_chat(zgc, zt2->id, zt2->name); | |
386 } | |
3277 | 387 /* If the person is in the default Realm, then strip the |
388 Realm from the sender field */ | |
389 sendertmp = g_strdup_printf("%s",notice.z_sender); | |
4682 | 390 if ((realmptr = strchr(sendertmp,'@')) != NULL) { |
4588 | 391 realmptr++; |
4793 | 392 if (!g_ascii_strcasecmp(realmptr,ZGetRealm())) { |
4588 | 393 realmptr--; |
394 sprintf(realmptr,"%c",'\0'); | |
395 send_inst = g_strdup_printf("%s %s",sendertmp, | |
396 notice.z_class_inst); | |
397 } else { | |
398 send_inst = g_strdup_printf("%s %s",notice.z_sender, | |
399 notice.z_class_inst); | |
400 } | |
3277 | 401 } else { |
4588 | 402 send_inst = g_strdup_printf("%s %s",sendertmp,notice.z_class_inst); |
3277 | 403 } |
2804
1648c703ddc2
[gaim-migrate @ 2817]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2791
diff
changeset
|
404 serv_got_chat_in(zgc, zt2->id, send_inst, FALSE, |
4687 | 405 buf2, time(NULL)); |
3277 | 406 g_free(sendertmp); |
2804
1648c703ddc2
[gaim-migrate @ 2817]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2791
diff
changeset
|
407 g_free(send_inst); |
2086 | 408 } |
409 free_triple(zt1); | |
410 } | |
411 g_free(buf2); | |
412 } | |
413 } | |
414 } | |
415 | |
416 static gint check_notify(gpointer data) | |
417 { | |
418 while (ZPending()) { | |
419 ZNotice_t notice; | |
420 struct sockaddr_in from; | |
421 z_call_r(ZReceiveNotice(¬ice, &from)); | |
422 | |
423 switch (notice.z_kind) { | |
424 case UNSAFE: | |
425 case UNACKED: | |
426 case ACKED: | |
427 handle_message(notice, from); | |
428 break; | |
429 default: | |
430 /* we'll just ignore things for now */ | |
431 debug_printf("ZEPHYR: Unhandled Notice\n"); | |
432 break; | |
433 } | |
434 | |
435 ZFreeNotice(¬ice); | |
436 } | |
437 | |
438 return TRUE; | |
439 } | |
440 | |
441 static gint check_loc(gpointer data) | |
442 { | |
4785 | 443 GaimBlistNode *gnode,*bnode; |
2086 | 444 ZAsyncLocateData_t ald; |
445 | |
446 ald.user = NULL; | |
447 memset(&(ald.uid), 0, sizeof(ZUnique_Id_t)); | |
448 ald.version = NULL; | |
449 | |
4785 | 450 for(gnode = gaim_get_blist()->root; gnode; gnode = gnode->next) { |
451 if(!GAIM_BLIST_NODE_IS_GROUP(gnode)) | |
452 continue; | |
453 for(bnode = gnode->child; bnode; bnode = bnode->next) { | |
454 struct buddy *b = (struct buddy *)bnode; | |
455 if(!GAIM_BLIST_NODE_IS_BUDDY(bnode)) | |
456 continue; | |
4491 | 457 if(b->account->gc == zgc) { |
4349 | 458 char *chk; |
459 chk = zephyr_normalize(b->name); | |
460 /* doesn't matter if this fails or not; we'll just move on to the next one */ | |
461 ZRequestLocations(chk, &ald, UNACKED, ZAUTH); | |
462 free(ald.user); | |
463 free(ald.version); | |
464 } | |
2086 | 465 } |
466 } | |
467 | |
468 return TRUE; | |
469 } | |
470 | |
471 static char *get_exposure_level() | |
472 { | |
473 char *exposure = ZGetVariable("exposure"); | |
474 | |
475 if (!exposure) | |
476 return EXPOSE_REALMVIS; | |
4793 | 477 if (!g_ascii_strcasecmp(exposure, EXPOSE_NONE)) |
2086 | 478 return EXPOSE_NONE; |
4793 | 479 if (!g_ascii_strcasecmp(exposure, EXPOSE_OPSTAFF)) |
2086 | 480 return EXPOSE_OPSTAFF; |
4793 | 481 if (!g_ascii_strcasecmp(exposure, EXPOSE_REALMANN)) |
2086 | 482 return EXPOSE_REALMANN; |
4793 | 483 if (!g_ascii_strcasecmp(exposure, EXPOSE_NETVIS)) |
2086 | 484 return EXPOSE_NETVIS; |
4793 | 485 if (!g_ascii_strcasecmp(exposure, EXPOSE_NETANN)) |
2086 | 486 return EXPOSE_NETANN; |
487 return EXPOSE_REALMVIS; | |
488 } | |
489 | |
490 static void strip_comments(char *str) | |
491 { | |
492 char *tmp = strchr(str, '#'); | |
493 if (tmp) | |
494 *tmp = '\0'; | |
495 g_strchug(str); | |
496 g_strchomp(str); | |
497 } | |
498 | |
499 static void process_zsubs() | |
500 { | |
501 FILE *f; | |
502 gchar *fname; | |
503 gchar buff[BUFSIZ]; | |
504 | |
3630 | 505 fname = g_strdup_printf("%s/.zephyr.subs", gaim_home_dir()); |
2086 | 506 f = fopen(fname, "r"); |
507 if (f) { | |
508 char **triple; | |
509 ZSubscription_t sub; | |
510 char *recip; | |
511 while (fgets(buff, BUFSIZ, f)) { | |
512 strip_comments(buff); | |
513 if (buff[0]) { | |
514 triple = g_strsplit(buff, ",", 3); | |
3277 | 515 if (triple[0] && triple[1] ) { |
5132 | 516 /* char *tmp = g_strdup_printf("%s@%s", g_getenv("USER"), ZGetRealm()); */ |
4588 | 517 char *tmp = g_strdup_printf("%s",ZGetSender()); |
2804
1648c703ddc2
[gaim-migrate @ 2817]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2791
diff
changeset
|
518 char *atptr; |
2086 | 519 sub.zsub_class = triple[0]; |
520 sub.zsub_classinst = triple[1]; | |
3277 | 521 if(triple[2] == NULL) { |
522 recip = g_malloc0(1); | |
4793 | 523 } else if (!g_ascii_strcasecmp(triple[2], "%me%")) { |
4588 | 524 recip = g_strdup_printf("%s",ZGetSender()); |
4793 | 525 } else if (!g_ascii_strcasecmp(triple[2], "*")) { |
2804
1648c703ddc2
[gaim-migrate @ 2817]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2791
diff
changeset
|
526 /* wildcard |
1648c703ddc2
[gaim-migrate @ 2817]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2791
diff
changeset
|
527 * form of class,instance,* */ |
1648c703ddc2
[gaim-migrate @ 2817]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2791
diff
changeset
|
528 recip = g_malloc0(1); |
4793 | 529 } else if (!g_ascii_strcasecmp(triple[2], tmp)) { |
2804
1648c703ddc2
[gaim-migrate @ 2817]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2791
diff
changeset
|
530 /* form of class,instance,aatharuv@ATHENA.MIT.EDU */ |
1648c703ddc2
[gaim-migrate @ 2817]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2791
diff
changeset
|
531 recip = g_strdup(triple[2]); |
1648c703ddc2
[gaim-migrate @ 2817]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2791
diff
changeset
|
532 } else if ((atptr = strchr(triple[2], '@')) != NULL) { |
1648c703ddc2
[gaim-migrate @ 2817]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2791
diff
changeset
|
533 /* form of class,instance,*@ANDREW.CMU.EDU |
1648c703ddc2
[gaim-migrate @ 2817]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2791
diff
changeset
|
534 * class,instance,@ANDREW.CMU.EDU |
1648c703ddc2
[gaim-migrate @ 2817]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2791
diff
changeset
|
535 * If realm is local realm, blank recipient, else |
1648c703ddc2
[gaim-migrate @ 2817]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2791
diff
changeset
|
536 * @REALM-NAME |
1648c703ddc2
[gaim-migrate @ 2817]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2791
diff
changeset
|
537 */ |
1648c703ddc2
[gaim-migrate @ 2817]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2791
diff
changeset
|
538 char *realmat = g_strdup_printf("@%s", ZGetRealm()); |
4793 | 539 if (!g_ascii_strcasecmp(atptr, realmat)) |
2804
1648c703ddc2
[gaim-migrate @ 2817]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2791
diff
changeset
|
540 recip = g_malloc0(1); |
1648c703ddc2
[gaim-migrate @ 2817]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2791
diff
changeset
|
541 else |
1648c703ddc2
[gaim-migrate @ 2817]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2791
diff
changeset
|
542 recip = g_strdup(atptr); |
1648c703ddc2
[gaim-migrate @ 2817]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2791
diff
changeset
|
543 g_free(realmat); |
2086 | 544 } else { |
545 recip = g_strdup(triple[2]); | |
546 } | |
2804
1648c703ddc2
[gaim-migrate @ 2817]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2791
diff
changeset
|
547 g_free(tmp); |
2086 | 548 sub.zsub_recipient = recip; |
549 if (ZSubscribeTo(&sub, 1, 0) != ZERR_NONE) { | |
550 debug_printf("Zephyr: Couldn't subscribe to %s, %s, " | |
551 "%s\n", | |
552 sub.zsub_class, | |
553 sub.zsub_classinst, | |
554 sub.zsub_recipient); | |
555 } | |
556 subscrips = g_slist_append(subscrips, | |
557 new_triple(triple[0], triple[1], recip)); | |
558 g_free(recip); | |
559 } | |
560 g_strfreev(triple); | |
561 } | |
562 } | |
563 } | |
564 } | |
565 | |
566 static void process_anyone() | |
567 { | |
568 FILE *fd; | |
569 gchar buff[BUFSIZ], *filename; | |
4775 | 570 struct group *g; |
4687 | 571 struct buddy *b; |
4775 | 572 |
573 if (!(g = gaim_find_group(_("Anyone")))) { | |
574 g = gaim_group_new(_("Anyone")); | |
575 gaim_blist_add_group(g, NULL); | |
576 } | |
4687 | 577 |
3630 | 578 filename = g_strconcat(gaim_home_dir(), "/.anyone", NULL); |
2086 | 579 if ((fd = fopen(filename, "r")) != NULL) { |
580 while (fgets(buff, BUFSIZ, fd)) { | |
581 strip_comments(buff); | |
4687 | 582 if (buff[0]) { |
583 b = gaim_buddy_new(zgc->account, buff, NULL); | |
584 gaim_blist_add_buddy(b, g, NULL); | |
585 } | |
2086 | 586 } |
587 fclose(fd); | |
588 } | |
589 g_free(filename); | |
590 } | |
591 | |
4491 | 592 static void zephyr_login(struct gaim_account *account) |
2086 | 593 { |
594 ZSubscription_t sub; | |
595 | |
596 if (zgc) { | |
5132 | 597 do_error_dialog(_("Already logged in with Zephyr"), _("Because Zephyr uses your system username, you are unable to " |
598 "have multiple accounts on it when logged in as the same user."), GAIM_ERROR); | |
2086 | 599 return; |
600 } | |
601 | |
4491 | 602 zgc = new_gaim_conn(account); |
2086 | 603 |
604 z_call_s(ZInitialize(), "Couldn't initialize zephyr"); | |
605 z_call_s(ZOpenPort(NULL), "Couldn't open port"); | |
606 z_call_s(ZSetLocation(get_exposure_level()), "Couldn't set location"); | |
607 | |
608 sub.zsub_class = "MESSAGE"; | |
609 sub.zsub_classinst = "PERSONAL"; | |
610 sub.zsub_recipient = ZGetSender(); | |
611 | |
612 /* we don't care if this fails. i'm lying right now. */ | |
613 if (ZSubscribeTo(&sub, 1, 0) != ZERR_NONE) { | |
614 debug_printf("Zephyr: Couldn't subscribe to messages!\n"); | |
615 } | |
616 | |
617 account_online(zgc); | |
618 serv_finish_login(zgc); | |
619 | |
620 process_anyone(); | |
621 process_zsubs(); | |
622 | |
2131
acc11216ec5d
[gaim-migrate @ 2141]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2123
diff
changeset
|
623 nottimer = g_timeout_add(100, check_notify, NULL); |
2804
1648c703ddc2
[gaim-migrate @ 2817]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2791
diff
changeset
|
624 loctimer = g_timeout_add(20000, check_loc, NULL); |
2086 | 625 } |
626 | |
627 static void write_zsubs() | |
628 { | |
629 GSList *s = subscrips; | |
630 zephyr_triple *zt; | |
631 FILE *fd; | |
632 char *fname; | |
633 | |
3277 | 634 char** triple; |
3630 | 635 fname = g_strdup_printf("%s/.zephyr.subs", gaim_home_dir()); |
2086 | 636 fd = fopen(fname, "w"); |
637 | |
638 if (!fd) { | |
639 g_free(fname); | |
640 return; | |
641 } | |
642 | |
643 while (s) { | |
644 zt = s->data; | |
3277 | 645 triple = g_strsplit(zt->name,",",3); |
646 if (triple[2] != NULL) { | |
4793 | 647 if (!g_ascii_strcasecmp(triple[2], "")) { |
3277 | 648 fprintf(fd, "%s,%s,*\n", triple[0], triple[1]); |
4793 | 649 } else if (!g_ascii_strcasecmp(triple[2], ZGetSender())) { |
3277 | 650 fprintf(fd, "%s,%s,%%me%%\n",triple[0],triple[1]); |
651 } else { | |
652 fprintf(fd, "%s\n", zt->name); | |
653 } | |
654 } else { | |
655 fprintf(fd, "%s,%s,*\n",triple[0], triple[1]); | |
656 } | |
657 g_free(triple); | |
2086 | 658 s = s->next; |
659 } | |
660 g_free(fname); | |
661 fclose(fd); | |
662 } | |
663 | |
664 static void write_anyone() | |
665 { | |
4785 | 666 GaimBlistNode *gnode,*bnode; |
2086 | 667 struct buddy *b; |
3277 | 668 char *ptr, *fname, *ptr2; |
2086 | 669 FILE *fd; |
670 | |
3630 | 671 fname = g_strdup_printf("%s/.anyone", gaim_home_dir()); |
2086 | 672 fd = fopen(fname, "w"); |
673 if (!fd) { | |
674 g_free(fname); | |
675 return; | |
676 } | |
677 | |
4785 | 678 for(gnode = gaim_get_blist()->root; gnode; gnode = gnode->next) { |
679 if(!GAIM_BLIST_NODE_IS_GROUP(gnode)) | |
680 continue; | |
681 for(bnode = gnode->child; bnode; bnode = bnode->next) { | |
682 if(!GAIM_BLIST_NODE_IS_BUDDY(bnode)) | |
683 continue; | |
684 b = (struct buddy *)bnode; | |
4491 | 685 if(b->account->gc == zgc) { |
4349 | 686 if ((ptr = strchr(b->name, '@')) != NULL) { |
687 ptr2 = ptr + 1; | |
688 /* We should only strip the realm name if the principal | |
689 is in the user's realm | |
690 */ | |
4793 | 691 if (!g_ascii_strcasecmp(ptr2,ZGetRealm())) { |
4349 | 692 *ptr = '\0'; |
693 } | |
3277 | 694 } |
4349 | 695 fprintf(fd, "%s\n", b->name); |
696 if (ptr) | |
697 *ptr = '@'; | |
3277 | 698 } |
2086 | 699 } |
700 } | |
701 | |
702 fclose(fd); | |
703 g_free(fname); | |
704 } | |
705 | |
706 static void zephyr_close(struct gaim_connection *gc) | |
707 { | |
708 GList *l; | |
709 GSList *s; | |
710 l = pending_zloc_names; | |
711 while (l) { | |
712 g_free((char*)l->data); | |
713 l = l->next; | |
714 } | |
715 g_list_free(pending_zloc_names); | |
716 | |
717 write_anyone(); | |
718 write_zsubs(); | |
719 | |
720 s = subscrips; | |
721 while (s) { | |
722 free_triple((zephyr_triple*)s->data); | |
723 s = s->next; | |
724 } | |
725 g_slist_free(subscrips); | |
726 | |
727 if (nottimer) | |
2131
acc11216ec5d
[gaim-migrate @ 2141]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2123
diff
changeset
|
728 g_source_remove(nottimer); |
2086 | 729 nottimer = 0; |
730 if (loctimer) | |
2131
acc11216ec5d
[gaim-migrate @ 2141]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2123
diff
changeset
|
731 g_source_remove(loctimer); |
2086 | 732 loctimer = 0; |
733 zgc = NULL; | |
734 z_call(ZCancelSubscriptions(0)); | |
735 z_call(ZUnsetLocation()); | |
736 z_call(ZClosePort()); | |
737 } | |
738 | |
3466 | 739 static void zephyr_add_buddy(struct gaim_connection *gc, const char *buddy) { } |
2681
37d80035e77f
[gaim-migrate @ 2694]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2501
diff
changeset
|
740 static void zephyr_remove_buddy(struct gaim_connection *gc, char *buddy, char *group) { } |
2086 | 741 |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
742 static int zephyr_chat_send(struct gaim_connection *gc, int id, char *im) |
2086 | 743 { |
744 ZNotice_t notice; | |
745 zephyr_triple *zt; | |
746 char *buf; | |
747 const char *sig; | |
748 | |
749 zt = find_sub_by_id(id); | |
750 if (!zt) | |
751 /* this should never happen. */ | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
752 return -EINVAL; |
2086 | 753 |
754 sig = ZGetVariable("zwrite-signature"); | |
755 if (!sig) { | |
756 sig = g_get_real_name(); | |
757 } | |
758 buf = g_strdup_printf("%s%c%s", sig, '\0', im); | |
759 | |
760 bzero((char *)¬ice, sizeof(notice)); | |
761 notice.z_kind = ACKED; | |
762 notice.z_port = 0; | |
763 notice.z_opcode = ""; | |
764 notice.z_class = zt->class; | |
765 notice.z_class_inst = zt->instance; | |
4793 | 766 if (!g_ascii_strcasecmp(zt->recipient, "*")) |
2086 | 767 notice.z_recipient = zephyr_normalize(""); |
768 else | |
769 notice.z_recipient = zephyr_normalize(zt->recipient); | |
770 notice.z_sender = 0; | |
771 notice.z_default_format = | |
772 "Class $class, Instance $instance:\n" | |
773 "To: @bold($recipient) at $time $date\n" | |
774 "From: @bold($1) <$sender>\n\n$2"; | |
775 notice.z_message_len = strlen(im) + strlen(sig) + 4; | |
776 notice.z_message = buf; | |
777 ZSendNotice(¬ice, ZAUTH); | |
778 g_free(buf); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
779 return 0; |
2086 | 780 } |
781 | |
5136 | 782 static int zephyr_send_im(struct gaim_connection *gc, const char *who, const char *im, int len, int flags) { |
2086 | 783 ZNotice_t notice; |
784 char *buf; | |
785 const char *sig; | |
786 | |
2231
8c4ff1a368bd
[gaim-migrate @ 2241]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
787 if (flags & IM_FLAG_AWAY) |
2086 | 788 sig = "Automated reply:"; |
789 else { | |
790 sig = ZGetVariable("zwrite-signature"); | |
791 if (!sig) { | |
792 sig = g_get_real_name(); | |
793 } | |
794 } | |
795 buf = g_strdup_printf("%s%c%s", sig, '\0', im); | |
796 | |
797 bzero((char *)¬ice, sizeof(notice)); | |
798 notice.z_kind = ACKED; | |
799 notice.z_port = 0; | |
800 notice.z_opcode = ""; | |
801 notice.z_class = "MESSAGE"; | |
802 notice.z_class_inst = "PERSONAL"; | |
803 notice.z_sender = 0; | |
804 notice.z_recipient = who; | |
805 notice.z_default_format = | |
806 "Class $class, Instance $instance:\n" | |
807 "To: @bold($recipient) at $time $date\n" | |
808 "From: @bold($1) <$sender>\n\n$2"; | |
809 notice.z_message_len = strlen(im) + strlen(sig) + 4; | |
810 notice.z_message = buf; | |
811 g_free(buf); | |
2303
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2231
diff
changeset
|
812 return 1; |
2086 | 813 } |
814 | |
815 static char *zephyr_normalize(const char *orig) | |
816 { | |
817 static char buf[80]; | |
818 if (strchr(orig, '@')) { | |
819 g_snprintf(buf, 80, "%s", orig); | |
820 } else { | |
821 g_snprintf(buf, 80, "%s@%s", orig, ZGetRealm()); | |
822 } | |
823 return buf; | |
824 } | |
825 | |
5136 | 826 static void zephyr_zloc(struct gaim_connection *gc, const char *who) |
2086 | 827 { |
828 ZAsyncLocateData_t ald; | |
829 | |
830 if (ZRequestLocations(zephyr_normalize(who), &ald, UNACKED, ZAUTH) | |
831 != ZERR_NONE) { | |
832 return; | |
833 } | |
834 pending_zloc_names = g_list_append(pending_zloc_names, | |
835 g_strdup(zephyr_normalize(who))); | |
836 } | |
837 | |
5136 | 838 static GList *zephyr_buddy_menu(struct gaim_connection *gc, const char *who) |
2086 | 839 { |
2170
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
840 GList *m = NULL; |
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
841 struct proto_buddy_menu *pbm; |
2086 | 842 |
2170
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
843 pbm = g_new0(struct proto_buddy_menu, 1); |
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
844 pbm->label = _("ZLocate"); |
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
845 pbm->callback = zephyr_zloc; |
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
846 pbm->gc = gc; |
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
847 m = g_list_append(m, pbm); |
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
848 |
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
849 return m; |
2086 | 850 } |
851 | |
852 static void zephyr_set_away(struct gaim_connection *gc, char *state, char *msg) | |
853 { | |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
3867
diff
changeset
|
854 if (gc->away) { |
2086 | 855 g_free(gc->away); |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
3867
diff
changeset
|
856 gc->away = NULL; |
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
3867
diff
changeset
|
857 } |
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
3867
diff
changeset
|
858 |
5132 | 859 if (!g_ascii_strcasecmp(state, _("Hidden"))) { |
2086 | 860 ZSetLocation(EXPOSE_OPSTAFF); |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
3867
diff
changeset
|
861 gc->away = g_strdup(""); |
5132 | 862 } else if (!g_ascii_strcasecmp(state, _("Online"))) |
2086 | 863 ZSetLocation(get_exposure_level()); |
864 else /* state is GAIM_AWAY_CUSTOM */ if (msg) | |
865 gc->away = g_strdup(msg); | |
866 } | |
867 | |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2417
diff
changeset
|
868 static GList *zephyr_away_states(struct gaim_connection *gc) |
2086 | 869 { |
870 GList *m = NULL; | |
871 | |
5132 | 872 m = g_list_append(m, _("Online")); |
2086 | 873 m = g_list_append(m, GAIM_AWAY_CUSTOM); |
5132 | 874 m = g_list_append(m, _("Hidden")); |
2086 | 875 |
876 return m; | |
877 } | |
878 | |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
879 static GList *zephyr_chat_info(struct gaim_connection *gc) { |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
880 GList *m = NULL; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
881 struct proto_chat_entry *pce; |
2086 | 882 |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
883 pce = g_new0(struct proto_chat_entry, 1); |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
884 pce->label = _("Class:"); |
5234 | 885 pce->identifier = "class"; |
3158 | 886 m = g_list_append(m, pce); |
2086 | 887 |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
888 pce = g_new0(struct proto_chat_entry, 1); |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
889 pce->label = _("Instance:"); |
5234 | 890 pce->identifier = "instance"; |
3158 | 891 m = g_list_append(m, pce); |
2086 | 892 |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
893 pce = g_new0(struct proto_chat_entry, 1); |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
894 pce->label = _("Recipient:"); |
5234 | 895 pce->identifier = "recipient"; |
3158 | 896 m = g_list_append(m, pce); |
2086 | 897 |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
898 return m; |
2086 | 899 } |
900 | |
5234 | 901 static void zephyr_join_chat(struct gaim_connection *gc, GHashTable *data) |
2086 | 902 { |
903 ZSubscription_t sub; | |
904 zephyr_triple *zt1, *zt2; | |
905 const char *classname; | |
906 const char *instname; | |
907 const char *recip; | |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
908 |
5234 | 909 classname = g_hash_table_lookup(data, "class"); |
910 instname = g_hash_table_lookup(data, "instance"); | |
911 recip = g_hash_table_lookup(data, "recipient"); | |
912 | |
913 if (!classname || !instname || !recip) | |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
914 return; |
2086 | 915 |
4793 | 916 if (!g_ascii_strcasecmp(recip, "%me%")) |
4588 | 917 recip = ZGetSender(); |
2086 | 918 |
919 zt1 = new_triple(classname, instname, recip); | |
920 zt2 = find_sub_by_triple(zt1); | |
921 if (zt2) { | |
922 free_triple(zt1); | |
923 if (!zt2->open) | |
924 serv_got_joined_chat(gc, zt2->id, zt2->name); | |
925 return; | |
926 } | |
927 | |
928 sub.zsub_class = zt1->class; | |
929 sub.zsub_classinst = zt1->instance; | |
930 sub.zsub_recipient = zt1->recipient; | |
931 | |
932 if (ZSubscribeTo(&sub, 1, 0) != ZERR_NONE) { | |
933 free_triple(zt1); | |
934 return; | |
935 } | |
936 | |
937 subscrips = g_slist_append(subscrips, zt1); | |
938 zt1->open = TRUE; | |
939 serv_got_joined_chat(gc, zt1->id, zt1->name); | |
940 } | |
941 | |
942 static void zephyr_chat_leave(struct gaim_connection *gc, int id) | |
943 { | |
944 zephyr_triple *zt; | |
945 zt = find_sub_by_id(id); | |
946 if (zt) { | |
947 zt->open = FALSE; | |
948 zt->id = ++last_id; | |
949 } | |
950 } | |
951 | |
5202 | 952 static const char *zephyr_list_icon(struct gaim_account *a, struct buddy *b) |
953 { | |
954 return "zephyr"; | |
955 } | |
956 | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
957 static GaimPlugin *my_protocol = NULL; |
2086 | 958 |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
959 static GaimPluginProtocolInfo prpl_info = |
2086 | 960 { |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
961 GAIM_PROTO_ZEPHYR, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
962 OPT_PROTO_NO_PASSWORD, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
963 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
964 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
965 zephyr_list_icon, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
966 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
967 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
968 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
969 zephyr_away_states, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
970 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
971 zephyr_buddy_menu, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
972 zephyr_chat_info, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
973 zephyr_login, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
974 zephyr_close, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
975 zephyr_send_im, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
976 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
977 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
978 zephyr_zloc, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
979 zephyr_set_away, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
980 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
981 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
982 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
983 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
984 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
985 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
986 zephyr_add_buddy, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
987 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
988 zephyr_remove_buddy, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
989 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
990 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
991 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
992 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
993 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
994 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
995 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
996 zephyr_join_chat, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
997 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
998 zephyr_chat_leave, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
999 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
1000 zephyr_chat_send, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
1001 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
1002 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
1003 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
1004 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
1005 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
1006 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
1007 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
1008 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
1009 NULL, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
1010 zephyr_normalize |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
1011 }; |
2086 | 1012 |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
1013 static GaimPluginInfo info = |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
1014 { |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
1015 2, /**< api_version */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
1016 GAIM_PLUGIN_PROTOCOL, /**< type */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
1017 NULL, /**< ui_requirement */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
1018 0, /**< flags */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
1019 NULL, /**< dependencies */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
1020 GAIM_PRIORITY_DEFAULT, /**< priority */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
1021 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
1022 "prpl-zephyr", /**< id */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
1023 "Zephyr", /**< name */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
1024 VERSION, /**< version */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
1025 /** summary */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
1026 N_("Zephyr Protocol Plugin"), |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
1027 /** description */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
1028 N_("Zephyr Protocol Plugin"), |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
1029 NULL, /**< author */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
1030 WEBSITE, /**< homepage */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
1031 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
1032 NULL, /**< load */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
1033 NULL, /**< unload */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
1034 NULL, /**< destroy */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
1035 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
1036 NULL, /**< ui_info */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
1037 &prpl_info /**< extra_info */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
1038 }; |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
1039 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
1040 static void |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
1041 __init_plugin(GaimPlugin *plugin) |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
1042 { |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
1043 my_protocol = plugin; |
2086 | 1044 } |
1045 | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5202
diff
changeset
|
1046 GAIM_INIT_PLUGIN(zephyr, __init_plugin, info); |