Mercurial > pidgin.yaz
annotate src/protocols/zephyr/zephyr.c @ 4770:c4c28874ecd3
[gaim-migrate @ 5088]
I want to go to sleep. This is drag-n-drop moving of buddies in the list.
I think it works, but I didn't actually test it... I really should have though;
I can't imagine it working fine as-is. ;)
I'm holding off on the rest of my Edit Buddy List stuff for tomorrow... I love
last minute things, don't I?
Note: I created gaim_blist_members and gaim_blist_groups to reproduce the
effects of the old groups GSList and the members GSList of the group struct
that I removed. This is really sub-optimal and should be replaced to iterate
the Buddy List directly. If someone wants to do that, please do. Even if you
don't want to do that, just review the changes I made and make sure I didn't
do anything stupid. It is past 6am and I'm a bit tired and prone to mistake
making.
Thanks.
committer: Tailor Script <tailor@pidgin.im>
author | Sean Egan <seanegan@gmail.com> |
---|---|
date | Fri, 14 Mar 2003 11:38:21 +0000 |
parents | c15e0699acae |
children | 92ae181271e9 |
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 { | |
129 if (g_strcasecmp(zt2->class, zt1->class) && | |
130 g_strcasecmp(zt2->class, "*")) { | |
131 return FALSE; | |
132 } | |
133 if (g_strcasecmp(zt2->instance, zt1->instance) && | |
134 g_strcasecmp(zt2->instance, "*")) { | |
135 return FALSE; | |
136 } | |
137 if (g_strcasecmp(zt2->recipient, zt1->recipient) && | |
138 g_strcasecmp(zt2->recipient, "*")) { | |
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 } | |
203 if (!g_strcasecmp(buf, "italic") || | |
204 !g_strcasecmp(buf, "i")) { | |
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 */ | |
212 } else if (!g_strcasecmp(buf, "bold") | |
213 || !g_strcasecmp(buf, "b")) { | |
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; | |
221 } else if (!g_strcasecmp(buf, "color")) { | |
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; | |
234 } else if (!g_strcasecmp(buf, "")) { | |
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) { | |
302 if (!g_strcasecmp(who, (char*)curr->data)) { | |
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 { | |
313 if (!g_strcasecmp(notice.z_class, LOGIN_CLASS)) { | |
3277 | 314 /* well, we'll be updating in 20 seconds anyway, might as well ignore this. */ |
2086 | 315 } else if (!g_strcasecmp(notice.z_class, LOCATE_CLASS)) { |
316 if (!g_strcasecmp(notice.z_opcode, LOCATE_LOCATE)) { | |
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(""); | |
336 g_string_sprintfa(str, "<b>User:</b> %s<br>" | |
337 "<b>Alias:</b> %s<br>", | |
4227 | 338 b->name, b->alias); |
2086 | 339 if (!nlocs) { |
340 g_string_sprintfa(str, "<br>Hidden or not logged-in"); | |
341 } | |
342 for (; nlocs > 0; nlocs--) { | |
343 ZGetLocations(&locs, &one); | |
344 g_string_sprintfa(str, "<br>At %s since %s", locs.host, | |
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); | |
368 if (!g_strcasecmp(notice.z_class, "MESSAGE") && | |
4687 | 369 !g_strcasecmp(notice.z_class_inst, "PERSONAL")) { |
2086 | 370 if (!g_strcasecmp(notice.z_message, "Automated reply:")) |
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++; |
392 if (!g_strcasecmp(realmptr,ZGetRealm())) { | |
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 { | |
4770 | 443 GSList *gr, *gr1, *m, *m1; |
2086 | 444 ZAsyncLocateData_t ald; |
445 | |
446 ald.user = NULL; | |
447 memset(&(ald.uid), 0, sizeof(ZUnique_Id_t)); | |
448 ald.version = NULL; | |
449 | |
4770 | 450 gr = gaim_blist_groups(); |
451 gr1 = gr; | |
452 while (gr1) { | |
453 struct group *g = gr1->data; | |
454 m = gaim_blist_members(g); | |
455 m1 = m; | |
456 while (m1) { | |
457 struct buddy *b = m1->data; | |
4491 | 458 if(b->account->gc == zgc) { |
4349 | 459 char *chk; |
460 chk = zephyr_normalize(b->name); | |
461 /* doesn't matter if this fails or not; we'll just move on to the next one */ | |
462 ZRequestLocations(chk, &ald, UNACKED, ZAUTH); | |
463 free(ald.user); | |
464 free(ald.version); | |
465 } | |
4770 | 466 m1 = m1->next; |
2086 | 467 } |
4770 | 468 g_slist_free(m); |
469 gr1 = gr1->next; | |
2086 | 470 } |
4770 | 471 g_slist_free(gr1); |
2086 | 472 |
473 return TRUE; | |
474 } | |
475 | |
476 static char *get_exposure_level() | |
477 { | |
478 char *exposure = ZGetVariable("exposure"); | |
479 | |
480 if (!exposure) | |
481 return EXPOSE_REALMVIS; | |
482 if (!g_strcasecmp(exposure, EXPOSE_NONE)) | |
483 return EXPOSE_NONE; | |
484 if (!g_strcasecmp(exposure, EXPOSE_OPSTAFF)) | |
485 return EXPOSE_OPSTAFF; | |
486 if (!g_strcasecmp(exposure, EXPOSE_REALMANN)) | |
487 return EXPOSE_REALMANN; | |
488 if (!g_strcasecmp(exposure, EXPOSE_NETVIS)) | |
489 return EXPOSE_NETVIS; | |
490 if (!g_strcasecmp(exposure, EXPOSE_NETANN)) | |
491 return EXPOSE_NETANN; | |
492 return EXPOSE_REALMVIS; | |
493 } | |
494 | |
495 static void strip_comments(char *str) | |
496 { | |
497 char *tmp = strchr(str, '#'); | |
498 if (tmp) | |
499 *tmp = '\0'; | |
500 g_strchug(str); | |
501 g_strchomp(str); | |
502 } | |
503 | |
504 static void process_zsubs() | |
505 { | |
506 FILE *f; | |
507 gchar *fname; | |
508 gchar buff[BUFSIZ]; | |
509 | |
3630 | 510 fname = g_strdup_printf("%s/.zephyr.subs", gaim_home_dir()); |
2086 | 511 f = fopen(fname, "r"); |
512 if (f) { | |
513 char **triple; | |
514 ZSubscription_t sub; | |
515 char *recip; | |
516 while (fgets(buff, BUFSIZ, f)) { | |
517 strip_comments(buff); | |
518 if (buff[0]) { | |
519 triple = g_strsplit(buff, ",", 3); | |
3277 | 520 if (triple[0] && triple[1] ) { |
4588 | 521 /* char *tmp = g_strdup_printf("%s@%s", g_getenv("USER"), |
522 ZGetRealm());*/ | |
523 char *tmp = g_strdup_printf("%s",ZGetSender()); | |
2804
1648c703ddc2
[gaim-migrate @ 2817]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2791
diff
changeset
|
524 char *atptr; |
2086 | 525 sub.zsub_class = triple[0]; |
526 sub.zsub_classinst = triple[1]; | |
3277 | 527 if(triple[2] == NULL) { |
528 recip = g_malloc0(1); | |
529 } else if (!g_strcasecmp(triple[2], "%me%")) { | |
4588 | 530 recip = g_strdup_printf("%s",ZGetSender()); |
2086 | 531 } else if (!g_strcasecmp(triple[2], "*")) { |
2804
1648c703ddc2
[gaim-migrate @ 2817]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2791
diff
changeset
|
532 /* wildcard |
1648c703ddc2
[gaim-migrate @ 2817]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2791
diff
changeset
|
533 * form of class,instance,* */ |
1648c703ddc2
[gaim-migrate @ 2817]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2791
diff
changeset
|
534 recip = g_malloc0(1); |
1648c703ddc2
[gaim-migrate @ 2817]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2791
diff
changeset
|
535 } else if (!g_strcasecmp(triple[2], tmp)) { |
1648c703ddc2
[gaim-migrate @ 2817]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2791
diff
changeset
|
536 /* form of class,instance,aatharuv@ATHENA.MIT.EDU */ |
1648c703ddc2
[gaim-migrate @ 2817]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2791
diff
changeset
|
537 recip = g_strdup(triple[2]); |
1648c703ddc2
[gaim-migrate @ 2817]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2791
diff
changeset
|
538 } else if ((atptr = strchr(triple[2], '@')) != NULL) { |
1648c703ddc2
[gaim-migrate @ 2817]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2791
diff
changeset
|
539 /* form of class,instance,*@ANDREW.CMU.EDU |
1648c703ddc2
[gaim-migrate @ 2817]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2791
diff
changeset
|
540 * class,instance,@ANDREW.CMU.EDU |
1648c703ddc2
[gaim-migrate @ 2817]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2791
diff
changeset
|
541 * If realm is local realm, blank recipient, else |
1648c703ddc2
[gaim-migrate @ 2817]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2791
diff
changeset
|
542 * @REALM-NAME |
1648c703ddc2
[gaim-migrate @ 2817]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2791
diff
changeset
|
543 */ |
1648c703ddc2
[gaim-migrate @ 2817]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2791
diff
changeset
|
544 char *realmat = g_strdup_printf("@%s", ZGetRealm()); |
1648c703ddc2
[gaim-migrate @ 2817]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2791
diff
changeset
|
545 if (!g_strcasecmp(atptr, realmat)) |
1648c703ddc2
[gaim-migrate @ 2817]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2791
diff
changeset
|
546 recip = g_malloc0(1); |
1648c703ddc2
[gaim-migrate @ 2817]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2791
diff
changeset
|
547 else |
1648c703ddc2
[gaim-migrate @ 2817]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2791
diff
changeset
|
548 recip = g_strdup(atptr); |
1648c703ddc2
[gaim-migrate @ 2817]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2791
diff
changeset
|
549 g_free(realmat); |
2086 | 550 } else { |
551 recip = g_strdup(triple[2]); | |
552 } | |
2804
1648c703ddc2
[gaim-migrate @ 2817]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2791
diff
changeset
|
553 g_free(tmp); |
2086 | 554 sub.zsub_recipient = recip; |
555 if (ZSubscribeTo(&sub, 1, 0) != ZERR_NONE) { | |
556 debug_printf("Zephyr: Couldn't subscribe to %s, %s, " | |
557 "%s\n", | |
558 sub.zsub_class, | |
559 sub.zsub_classinst, | |
560 sub.zsub_recipient); | |
561 } | |
562 subscrips = g_slist_append(subscrips, | |
563 new_triple(triple[0], triple[1], recip)); | |
564 g_free(recip); | |
565 } | |
566 g_strfreev(triple); | |
567 } | |
568 } | |
569 } | |
570 } | |
571 | |
572 static void process_anyone() | |
573 { | |
574 FILE *fd; | |
575 gchar buff[BUFSIZ], *filename; | |
4687 | 576 struct group *g = gaim_group_new("Anyone"); |
577 struct buddy *b; | |
578 | |
3630 | 579 filename = g_strconcat(gaim_home_dir(), "/.anyone", NULL); |
2086 | 580 if ((fd = fopen(filename, "r")) != NULL) { |
581 while (fgets(buff, BUFSIZ, fd)) { | |
582 strip_comments(buff); | |
4687 | 583 if (buff[0]) { |
584 b = gaim_buddy_new(zgc->account, buff, NULL); | |
585 gaim_blist_add_buddy(b, g, NULL); | |
586 } | |
2086 | 587 } |
588 fclose(fd); | |
589 } | |
590 g_free(filename); | |
591 } | |
592 | |
4491 | 593 static void zephyr_login(struct gaim_account *account) |
2086 | 594 { |
595 ZSubscription_t sub; | |
596 | |
597 if (zgc) { | |
3427 | 598 do_error_dialog("Already logged in with Zephyr", "Because Zephyr uses your system username, you are unable to " |
4588 | 599 "have multiple accounts on it when logged in as the same user.", GAIM_ERROR); |
2086 | 600 return; |
601 } | |
602 | |
4491 | 603 zgc = new_gaim_conn(account); |
2086 | 604 |
605 z_call_s(ZInitialize(), "Couldn't initialize zephyr"); | |
606 z_call_s(ZOpenPort(NULL), "Couldn't open port"); | |
607 z_call_s(ZSetLocation(get_exposure_level()), "Couldn't set location"); | |
608 | |
609 sub.zsub_class = "MESSAGE"; | |
610 sub.zsub_classinst = "PERSONAL"; | |
611 sub.zsub_recipient = ZGetSender(); | |
612 | |
613 /* we don't care if this fails. i'm lying right now. */ | |
614 if (ZSubscribeTo(&sub, 1, 0) != ZERR_NONE) { | |
615 debug_printf("Zephyr: Couldn't subscribe to messages!\n"); | |
616 } | |
617 | |
618 account_online(zgc); | |
619 serv_finish_login(zgc); | |
620 | |
621 process_anyone(); | |
622 process_zsubs(); | |
623 | |
2131
acc11216ec5d
[gaim-migrate @ 2141]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2123
diff
changeset
|
624 nottimer = g_timeout_add(100, check_notify, NULL); |
2804
1648c703ddc2
[gaim-migrate @ 2817]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2791
diff
changeset
|
625 loctimer = g_timeout_add(20000, check_loc, NULL); |
2086 | 626 } |
627 | |
628 static void write_zsubs() | |
629 { | |
630 GSList *s = subscrips; | |
631 zephyr_triple *zt; | |
632 FILE *fd; | |
633 char *fname; | |
634 | |
3277 | 635 char** triple; |
3630 | 636 fname = g_strdup_printf("%s/.zephyr.subs", gaim_home_dir()); |
2086 | 637 fd = fopen(fname, "w"); |
638 | |
639 if (!fd) { | |
640 g_free(fname); | |
641 return; | |
642 } | |
643 | |
644 while (s) { | |
645 zt = s->data; | |
3277 | 646 triple = g_strsplit(zt->name,",",3); |
647 if (triple[2] != NULL) { | |
648 if (!g_strcasecmp(triple[2], "")) { | |
649 fprintf(fd, "%s,%s,*\n", triple[0], triple[1]); | |
650 } else if (!g_strcasecmp(triple[2], ZGetSender())) { | |
651 fprintf(fd, "%s,%s,%%me%%\n",triple[0],triple[1]); | |
652 } else { | |
653 fprintf(fd, "%s\n", zt->name); | |
654 } | |
655 } else { | |
656 fprintf(fd, "%s,%s,*\n",triple[0], triple[1]); | |
657 } | |
658 g_free(triple); | |
2086 | 659 s = s->next; |
660 } | |
661 g_free(fname); | |
662 fclose(fd); | |
663 } | |
664 | |
665 static void write_anyone() | |
666 { | |
4770 | 667 GSList *gr, *gr1, *m, *m1; |
2086 | 668 struct group *g; |
669 struct buddy *b; | |
3277 | 670 char *ptr, *fname, *ptr2; |
2086 | 671 FILE *fd; |
672 | |
3630 | 673 fname = g_strdup_printf("%s/.anyone", gaim_home_dir()); |
2086 | 674 fd = fopen(fname, "w"); |
675 if (!fd) { | |
676 g_free(fname); | |
677 return; | |
678 } | |
679 | |
4770 | 680 gr = gaim_blist_groups(); |
681 gr1 = gr; | |
682 while (gr1) { | |
683 g = gr1->data; | |
684 m = gaim_blist_members(g); | |
685 m1 = m; | |
686 while (m1) { | |
687 b = m1->data; | |
4491 | 688 if(b->account->gc == zgc) { |
4349 | 689 if ((ptr = strchr(b->name, '@')) != NULL) { |
690 ptr2 = ptr + 1; | |
691 /* We should only strip the realm name if the principal | |
692 is in the user's realm | |
693 */ | |
694 if (!g_strcasecmp(ptr2,ZGetRealm())) { | |
695 *ptr = '\0'; | |
696 } | |
3277 | 697 } |
4349 | 698 fprintf(fd, "%s\n", b->name); |
699 if (ptr) | |
700 *ptr = '@'; | |
3277 | 701 } |
4770 | 702 m1 = m1->next; |
2086 | 703 } |
4770 | 704 g_slist_free(m); |
705 gr1 = gr1->next; | |
2086 | 706 } |
4770 | 707 g_slist_free(gr); |
2086 | 708 |
709 fclose(fd); | |
710 g_free(fname); | |
711 } | |
712 | |
713 static void zephyr_close(struct gaim_connection *gc) | |
714 { | |
715 GList *l; | |
716 GSList *s; | |
717 l = pending_zloc_names; | |
718 while (l) { | |
719 g_free((char*)l->data); | |
720 l = l->next; | |
721 } | |
722 g_list_free(pending_zloc_names); | |
723 | |
724 write_anyone(); | |
725 write_zsubs(); | |
726 | |
727 s = subscrips; | |
728 while (s) { | |
729 free_triple((zephyr_triple*)s->data); | |
730 s = s->next; | |
731 } | |
732 g_slist_free(subscrips); | |
733 | |
734 if (nottimer) | |
2131
acc11216ec5d
[gaim-migrate @ 2141]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2123
diff
changeset
|
735 g_source_remove(nottimer); |
2086 | 736 nottimer = 0; |
737 if (loctimer) | |
2131
acc11216ec5d
[gaim-migrate @ 2141]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2123
diff
changeset
|
738 g_source_remove(loctimer); |
2086 | 739 loctimer = 0; |
740 zgc = NULL; | |
741 z_call(ZCancelSubscriptions(0)); | |
742 z_call(ZUnsetLocation()); | |
743 z_call(ZClosePort()); | |
744 } | |
745 | |
3466 | 746 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
|
747 static void zephyr_remove_buddy(struct gaim_connection *gc, char *buddy, char *group) { } |
2086 | 748 |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
749 static int zephyr_chat_send(struct gaim_connection *gc, int id, char *im) |
2086 | 750 { |
751 ZNotice_t notice; | |
752 zephyr_triple *zt; | |
753 char *buf; | |
754 const char *sig; | |
755 | |
756 zt = find_sub_by_id(id); | |
757 if (!zt) | |
758 /* this should never happen. */ | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
759 return -EINVAL; |
2086 | 760 |
761 sig = ZGetVariable("zwrite-signature"); | |
762 if (!sig) { | |
763 sig = g_get_real_name(); | |
764 } | |
765 buf = g_strdup_printf("%s%c%s", sig, '\0', im); | |
766 | |
767 bzero((char *)¬ice, sizeof(notice)); | |
768 notice.z_kind = ACKED; | |
769 notice.z_port = 0; | |
770 notice.z_opcode = ""; | |
771 notice.z_class = zt->class; | |
772 notice.z_class_inst = zt->instance; | |
773 if (!g_strcasecmp(zt->recipient, "*")) | |
774 notice.z_recipient = zephyr_normalize(""); | |
775 else | |
776 notice.z_recipient = zephyr_normalize(zt->recipient); | |
777 notice.z_sender = 0; | |
778 notice.z_default_format = | |
779 "Class $class, Instance $instance:\n" | |
780 "To: @bold($recipient) at $time $date\n" | |
781 "From: @bold($1) <$sender>\n\n$2"; | |
782 notice.z_message_len = strlen(im) + strlen(sig) + 4; | |
783 notice.z_message = buf; | |
784 ZSendNotice(¬ice, ZAUTH); | |
785 g_free(buf); | |
2167
edf8c5a70e5b
[gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2162
diff
changeset
|
786 return 0; |
2086 | 787 } |
788 | |
3033 | 789 static int zephyr_send_im(struct gaim_connection *gc, char *who, char *im, int len, int flags) { |
2086 | 790 ZNotice_t notice; |
791 char *buf; | |
792 const char *sig; | |
793 | |
2231
8c4ff1a368bd
[gaim-migrate @ 2241]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2205
diff
changeset
|
794 if (flags & IM_FLAG_AWAY) |
2086 | 795 sig = "Automated reply:"; |
796 else { | |
797 sig = ZGetVariable("zwrite-signature"); | |
798 if (!sig) { | |
799 sig = g_get_real_name(); | |
800 } | |
801 } | |
802 buf = g_strdup_printf("%s%c%s", sig, '\0', im); | |
803 | |
804 bzero((char *)¬ice, sizeof(notice)); | |
805 notice.z_kind = ACKED; | |
806 notice.z_port = 0; | |
807 notice.z_opcode = ""; | |
808 notice.z_class = "MESSAGE"; | |
809 notice.z_class_inst = "PERSONAL"; | |
810 notice.z_sender = 0; | |
811 notice.z_recipient = who; | |
812 notice.z_default_format = | |
813 "Class $class, Instance $instance:\n" | |
814 "To: @bold($recipient) at $time $date\n" | |
815 "From: @bold($1) <$sender>\n\n$2"; | |
816 notice.z_message_len = strlen(im) + strlen(sig) + 4; | |
817 notice.z_message = buf; | |
818 ZSendNotice(¬ice, ZAUTH); | |
819 g_free(buf); | |
2303
f5bf315e6104
[gaim-migrate @ 2313]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2231
diff
changeset
|
820 return 1; |
2086 | 821 } |
822 | |
823 static char *zephyr_normalize(const char *orig) | |
824 { | |
825 static char buf[80]; | |
826 if (strchr(orig, '@')) { | |
827 g_snprintf(buf, 80, "%s", orig); | |
828 } else { | |
829 g_snprintf(buf, 80, "%s@%s", orig, ZGetRealm()); | |
830 } | |
831 return buf; | |
832 } | |
833 | |
834 static void zephyr_zloc(struct gaim_connection *gc, char *who) | |
835 { | |
836 ZAsyncLocateData_t ald; | |
837 | |
838 if (ZRequestLocations(zephyr_normalize(who), &ald, UNACKED, ZAUTH) | |
839 != ZERR_NONE) { | |
840 return; | |
841 } | |
842 pending_zloc_names = g_list_append(pending_zloc_names, | |
843 g_strdup(zephyr_normalize(who))); | |
844 } | |
845 | |
2170
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
846 static GList *zephyr_buddy_menu(struct gaim_connection *gc, char *who) |
2086 | 847 { |
2170
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
848 GList *m = NULL; |
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
849 struct proto_buddy_menu *pbm; |
2086 | 850 |
2170
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
851 pbm = g_new0(struct proto_buddy_menu, 1); |
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
852 pbm->label = _("ZLocate"); |
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
853 pbm->callback = zephyr_zloc; |
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
854 pbm->gc = gc; |
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
855 m = g_list_append(m, pbm); |
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
856 |
c24595d3c364
[gaim-migrate @ 2180]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2167
diff
changeset
|
857 return m; |
2086 | 858 } |
859 | |
860 static void zephyr_set_away(struct gaim_connection *gc, char *state, char *msg) | |
861 { | |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
3867
diff
changeset
|
862 if (gc->away) { |
2086 | 863 g_free(gc->away); |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
3867
diff
changeset
|
864 gc->away = NULL; |
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
3867
diff
changeset
|
865 } |
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
3867
diff
changeset
|
866 |
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
3867
diff
changeset
|
867 if (!g_strcasecmp(state, "Hidden")) { |
2086 | 868 ZSetLocation(EXPOSE_OPSTAFF); |
4111
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
3867
diff
changeset
|
869 gc->away = g_strdup(""); |
ee884f1d7ae3
[gaim-migrate @ 4326]
Christian Hammond <chipx86@chipx86.com>
parents:
3867
diff
changeset
|
870 } else if (!g_strcasecmp(state, "Online")) |
2086 | 871 ZSetLocation(get_exposure_level()); |
872 else /* state is GAIM_AWAY_CUSTOM */ if (msg) | |
873 gc->away = g_strdup(msg); | |
874 } | |
875 | |
2501
227cc42ffa6e
[gaim-migrate @ 2514]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2417
diff
changeset
|
876 static GList *zephyr_away_states(struct gaim_connection *gc) |
2086 | 877 { |
878 GList *m = NULL; | |
879 | |
880 m = g_list_append(m, "Online"); | |
881 m = g_list_append(m, GAIM_AWAY_CUSTOM); | |
882 m = g_list_append(m, "Hidden"); | |
883 | |
884 return m; | |
885 } | |
886 | |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
887 static GList *zephyr_chat_info(struct gaim_connection *gc) { |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
888 GList *m = NULL; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
889 struct proto_chat_entry *pce; |
2086 | 890 |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
891 pce = g_new0(struct proto_chat_entry, 1); |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
892 pce->label = _("Class:"); |
3158 | 893 m = g_list_append(m, pce); |
2086 | 894 |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
895 pce = g_new0(struct proto_chat_entry, 1); |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
896 pce->label = _("Instance:"); |
3158 | 897 m = g_list_append(m, pce); |
2086 | 898 |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
899 pce = g_new0(struct proto_chat_entry, 1); |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
900 pce->label = _("Recipient:"); |
3158 | 901 m = g_list_append(m, pce); |
2086 | 902 |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
903 return m; |
2086 | 904 } |
905 | |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
906 static void zephyr_join_chat(struct gaim_connection *gc, GList *data) |
2086 | 907 { |
908 ZSubscription_t sub; | |
909 zephyr_triple *zt1, *zt2; | |
910 const char *classname; | |
911 const char *instname; | |
912 const char *recip; | |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
913 |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
914 if (!data || !data->next || !data->next->next) |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
915 return; |
2086 | 916 |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
917 classname = data->data; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
918 instname = data->next->data; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
919 recip = data->next->next->data; |
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
920 if (!g_strcasecmp(recip, "%me%")) |
4588 | 921 recip = ZGetSender(); |
2086 | 922 |
923 zt1 = new_triple(classname, instname, recip); | |
924 zt2 = find_sub_by_triple(zt1); | |
925 if (zt2) { | |
926 free_triple(zt1); | |
927 if (!zt2->open) | |
928 serv_got_joined_chat(gc, zt2->id, zt2->name); | |
929 return; | |
930 } | |
931 | |
932 sub.zsub_class = zt1->class; | |
933 sub.zsub_classinst = zt1->instance; | |
934 sub.zsub_recipient = zt1->recipient; | |
935 | |
936 if (ZSubscribeTo(&sub, 1, 0) != ZERR_NONE) { | |
937 free_triple(zt1); | |
938 return; | |
939 } | |
940 | |
941 subscrips = g_slist_append(subscrips, zt1); | |
942 zt1->open = TRUE; | |
943 serv_got_joined_chat(gc, zt1->id, zt1->name); | |
944 } | |
945 | |
946 static void zephyr_chat_leave(struct gaim_connection *gc, int id) | |
947 { | |
948 zephyr_triple *zt; | |
949 zt = find_sub_by_id(id); | |
950 if (zt) { | |
951 zt->open = FALSE; | |
952 zt->id = ++last_id; | |
953 } | |
954 } | |
955 | |
956 static struct prpl *my_protocol = NULL; | |
957 | |
958 void zephyr_init(struct prpl *ret) | |
959 { | |
960 ret->protocol = PROTO_ZEPHYR; | |
2100
a93aeb6f813d
[gaim-migrate @ 2110]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
961 ret->options = OPT_PROTO_NO_PASSWORD; |
3572 | 962 ret->name = g_strdup("Zephyr"); |
2086 | 963 ret->login = zephyr_login; |
964 ret->close = zephyr_close; | |
965 ret->add_buddy = zephyr_add_buddy; | |
966 ret->remove_buddy = zephyr_remove_buddy; | |
967 ret->send_im = zephyr_send_im; | |
968 ret->get_info = zephyr_zloc; | |
969 ret->normalize = zephyr_normalize; | |
970 ret->buddy_menu = zephyr_buddy_menu; | |
971 ret->away_states = zephyr_away_states; | |
972 ret->set_away = zephyr_set_away; | |
2205
cff4fbe01c7b
[gaim-migrate @ 2215]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2170
diff
changeset
|
973 ret->chat_info = zephyr_chat_info; |
2086 | 974 ret->join_chat = zephyr_join_chat; |
975 ret->chat_send = zephyr_chat_send; | |
976 ret->chat_leave = zephyr_chat_leave; | |
977 | |
978 my_protocol = ret; | |
979 } | |
980 | |
981 #ifndef STATIC | |
982 | |
3867 | 983 G_MODULE_EXPORT void gaim_prpl_init(struct prpl *prpl) |
2086 | 984 { |
3572 | 985 zephyr_init(prpl); |
986 prpl->plug->desc.api_version = PLUGIN_API_VERSION; | |
2086 | 987 } |
988 | |
989 | |
990 #endif |