Mercurial > pidgin.yaz
comparison src/server.c @ 981:7e231bc0018a
[gaim-migrate @ 991]
I think I need a Pepsi.
committer: Tailor Script <tailor@pidgin.im>
author | Eric Warmenhoven <eric@warmenhoven.org> |
---|---|
date | Fri, 13 Oct 2000 07:24:40 +0000 |
parents | 82c5865f7cfe |
children | ca8f1d02630a |
comparison
equal
deleted
inserted
replaced
980:82c5865f7cfe | 981:7e231bc0018a |
---|---|
30 #include <sys/time.h> | 30 #include <sys/time.h> |
31 #include <unistd.h> | 31 #include <unistd.h> |
32 #include <gtk/gtk.h> | 32 #include <gtk/gtk.h> |
33 #include <aim.h> | 33 #include <aim.h> |
34 extern int gaim_caps; | 34 extern int gaim_caps; |
35 #include "prpl.h" | |
35 #include "multi.h" | 36 #include "multi.h" |
36 #include "gaim.h" | 37 #include "gaim.h" |
37 | 38 |
38 #include "pixmaps/ok.xpm" | 39 #include "pixmaps/ok.xpm" |
39 #include "pixmaps/cancel.xpm" | 40 #include "pixmaps/cancel.xpm" |
40 | 41 |
41 int correction_time = 0; | 42 int correction_time = 0; |
42 | 43 |
43 void serv_login(struct aim_user *user) | 44 void serv_login(struct aim_user *user) |
44 { | 45 { |
45 if (user->protocol == PROTO_TOC) { | 46 struct prpl *p = find_prpl(user->protocol); |
46 toc_login(user); | 47 if (p && p->login) { |
47 } else if (user->protocol == PROTO_OSCAR) { | 48 debug_printf("Logging in using %s\n", (*p->name)()); |
48 debug_print("Logging in using Oscar. Expect problems.\n"); | 49 (*p->login)(user); |
49 oscar_login(user); | |
50 } | 50 } |
51 } | 51 } |
52 | 52 |
53 void serv_close(struct gaim_connection *gc) | 53 void serv_close(struct gaim_connection *gc) |
54 { | 54 { |
55 if (gc->protocol == PROTO_TOC) | 55 if (gc->prpl && gc->prpl->close) |
56 toc_close(gc); | 56 (*gc->prpl->close)(gc); |
57 else if (gc->protocol == PROTO_OSCAR) | |
58 oscar_close(gc); | |
59 | 57 |
60 account_offline(gc); | 58 account_offline(gc); |
61 destroy_gaim_conn(gc); | 59 destroy_gaim_conn(gc); |
62 | 60 |
63 if (connections) return; | 61 if (connections) return; |
131 | 129 |
132 | 130 |
133 | 131 |
134 void serv_send_im(struct gaim_connection *gc, char *name, char *message, int away) | 132 void serv_send_im(struct gaim_connection *gc, char *name, char *message, int away) |
135 { | 133 { |
136 struct conversation *cnv = find_conversation(name); | 134 if (gc->prpl && gc->prpl->send_im) |
137 if (cnv && cnv->is_direct && (gc->protocol == PROTO_OSCAR)) { | 135 (*gc->prpl->send_im)(gc, name, message, away); |
138 debug_printf("Sending DirectIM to %s\n", name); | 136 |
139 aim_send_im_direct(gc->oscar_sess, cnv->conn, message); | |
140 } else { | |
141 if (gc->protocol == PROTO_TOC) { | |
142 char buf[MSG_LEN - 7]; | |
143 | |
144 escape_text(message); | |
145 g_snprintf(buf, MSG_LEN - 8, "toc_send_im %s \"%s\"%s", normalize(name), | |
146 message, ((away) ? " auto" : "")); | |
147 sflap_send(gc, buf, -1, TYPE_DATA); | |
148 } else if (gc->protocol == PROTO_OSCAR) { | |
149 if (away) | |
150 aim_send_im(gc->oscar_sess, gc->oscar_conn, | |
151 name, AIM_IMFLAGS_AWAY, message); | |
152 else | |
153 aim_send_im(gc->oscar_sess, gc->oscar_conn, | |
154 name, AIM_IMFLAGS_ACK, message); | |
155 } | |
156 } | |
157 if (!away) | 137 if (!away) |
158 serv_touch_idle(gc); | 138 serv_touch_idle(gc); |
159 } | 139 } |
160 | 140 |
161 void serv_get_info(char *name) | 141 void serv_get_info(char *name) |
162 { | 142 { |
163 /* FIXME: getting someone's info? how do you decide something like that? I think that | 143 /* FIXME: getting someone's info? how do you decide something like that? I think that |
164 * the buddy list/UI needs to be really changed before this gets fixed*/ | 144 * the buddy list/UI needs to be really changed before this gets fixed*/ |
165 struct gaim_connection *g = connections->data; | 145 struct gaim_connection *g = connections->data; |
166 if (g->protocol == PROTO_TOC) { | 146 |
167 char buf[MSG_LEN]; | 147 if (g->prpl && g->prpl->get_info) |
168 g_snprintf(buf, MSG_LEN, "toc_get_info %s", normalize(name)); | 148 (*g->prpl->get_info)(g, name); |
169 sflap_send(g, buf, -1, TYPE_DATA); | |
170 } else if (g->protocol == PROTO_OSCAR) { | |
171 aim_getinfo(g->oscar_sess, g->oscar_conn, name, AIM_GETINFO_GENERALINFO); | |
172 } | |
173 } | 149 } |
174 | 150 |
175 void serv_get_away_msg(char *name) | 151 void serv_get_away_msg(char *name) |
176 { | 152 { |
177 /* FIXME: see the serv_get_info comment above :-P */ | 153 /* FIXME: see the serv_get_info comment above :-P */ |
178 struct gaim_connection *g = connections->data; | 154 struct gaim_connection *g = connections->data; |
179 if (g->protocol == PROTO_TOC) { | 155 |
180 /* HAHA! TOC doesn't have this yet */ | 156 if (g->prpl && g->prpl->get_info) |
181 } else if (g->protocol == PROTO_OSCAR) { | 157 (*g->prpl->get_info)(g, name); |
182 aim_getinfo(g->oscar_sess, g->oscar_conn, name, AIM_GETINFO_AWAYMESSAGE); | |
183 } | |
184 } | 158 } |
185 | 159 |
186 void serv_get_dir(char *name) | 160 void serv_get_dir(char *name) |
187 { | 161 { |
188 /* FIXME: see the serv_get_info comment above :-P */ | 162 /* FIXME: see the serv_get_info comment above :-P */ |
189 struct gaim_connection *g = connections->data; | 163 struct gaim_connection *g = connections->data; |
190 if (g->protocol == PROTO_TOC) { | 164 |
191 char buf[MSG_LEN]; | 165 if (g->prpl && g->prpl->get_dir) |
192 g_snprintf(buf, MSG_LEN, "toc_get_dir %s", normalize(name)); | 166 (*g->prpl->get_dir)(g, name); |
193 sflap_send(g, buf, -1, TYPE_DATA); | |
194 } | |
195 } | 167 } |
196 | 168 |
197 void serv_set_dir(char *first, char *middle, char *last, char *maiden, | 169 void serv_set_dir(char *first, char *middle, char *last, char *maiden, |
198 char *city, char *state, char *country, int web) | 170 char *city, char *state, char *country, int web) |
199 { | 171 { |
200 /* FIXME */ | 172 /* FIXME */ |
201 struct gaim_connection *g = connections->data; | 173 struct gaim_connection *g = connections->data; |
202 if (g->protocol == PROTO_TOC) { | 174 |
203 char buf2[BUF_LEN*4], buf[BUF_LEN]; | 175 if (g->prpl && g->prpl->set_dir) |
204 g_snprintf(buf2, sizeof(buf2), "%s:%s:%s:%s:%s:%s:%s:%s", first, | 176 (*g->prpl->set_dir)(g, first, middle, last, maiden, city, state, country, web); |
205 middle, last, maiden, city, state, country, | |
206 (web == 1) ? "Y" : ""); | |
207 escape_text(buf2); | |
208 g_snprintf(buf, sizeof(buf), "toc_set_dir %s", buf2); | |
209 sflap_send(g, buf, -1, TYPE_DATA); | |
210 } else if (g->protocol == PROTO_OSCAR) { | |
211 /* FIXME : some of these things are wrong, but i'm lazy */ | |
212 aim_setdirectoryinfo(g->oscar_sess, g->oscar_conn, first, middle, last, | |
213 maiden, NULL, NULL, city, state, NULL, 0, web); | |
214 } | |
215 } | 177 } |
216 | 178 |
217 void serv_dir_search(char *first, char *middle, char *last, char *maiden, | 179 void serv_dir_search(char *first, char *middle, char *last, char *maiden, |
218 char *city, char *state, char *country, char *email) | 180 char *city, char *state, char *country, char *email) |
219 { | 181 { |
220 /* FIXME */ | 182 /* FIXME */ |
221 struct gaim_connection *g = connections->data; | 183 struct gaim_connection *g = connections->data; |
222 if (g->protocol == PROTO_TOC) { | 184 |
223 char buf[BUF_LONG]; | 185 if (g->prpl && g->prpl->dir_search) |
224 g_snprintf(buf, sizeof(buf)/2, "toc_dir_search %s:%s:%s:%s:%s:%s:%s:%s", first, middle, last, maiden, city, state, country, email); | 186 (*g->prpl->dir_search)(g, first, middle, last, maiden, city, state, country, email); |
225 sprintf(debug_buff,"Searching for: %s,%s,%s,%s,%s,%s,%s\n", first, middle, last, maiden, city, state, country); | |
226 debug_print(debug_buff); | |
227 sflap_send(g, buf, -1, TYPE_DATA); | |
228 } else if (g->protocol == PROTO_OSCAR) { | |
229 if (strlen(email)) | |
230 aim_usersearch_address(g->oscar_sess, g->oscar_conn, email); | |
231 } | |
232 } | 187 } |
233 | 188 |
234 | 189 |
235 void serv_set_away(char *message) | 190 void serv_set_away(char *message) |
236 { | 191 { |
238 GSList *c = connections; | 193 GSList *c = connections; |
239 struct gaim_connection *g; | 194 struct gaim_connection *g; |
240 | 195 |
241 while (c) { | 196 while (c) { |
242 g = (struct gaim_connection *)c->data; | 197 g = (struct gaim_connection *)c->data; |
243 if (g->protocol == PROTO_TOC) { | 198 if (g->prpl && g->prpl->set_away) |
244 char buf[MSG_LEN]; | 199 (*g->prpl->set_away)(g, message); |
245 if (message) { | |
246 escape_text(message); | |
247 g_snprintf(buf, MSG_LEN, "toc_set_away \"%s\"", message); | |
248 } else | |
249 g_snprintf(buf, MSG_LEN, "toc_set_away \"\""); | |
250 sflap_send(g, buf, -1, TYPE_DATA); | |
251 } else if (g->protocol == PROTO_OSCAR) { | |
252 aim_bos_setprofile(g->oscar_sess, g->oscar_conn, g->user_info, message, gaim_caps); | |
253 } | |
254 c = c->next; | 200 c = c->next; |
255 } | 201 } |
256 } | 202 } |
257 | 203 |
258 void serv_set_info(struct gaim_connection *g, char *info) | 204 void serv_set_info(struct gaim_connection *g, char *info) |
259 { | 205 { |
260 if (g->protocol == PROTO_TOC) { | 206 if (g->prpl && g->prpl->set_info) |
261 char buf[MSG_LEN]; | 207 (*g->prpl->set_info)(g, info); |
262 escape_text(info); | |
263 g_snprintf(buf, sizeof(buf), "toc_set_info \"%s\n\"", info); | |
264 sflap_send(g, buf, -1, TYPE_DATA); | |
265 } else if (g->protocol == PROTO_OSCAR) { | |
266 if (awaymessage) | |
267 aim_bos_setprofile(g->oscar_sess, g->oscar_conn, info, | |
268 awaymessage->message, gaim_caps); | |
269 else | |
270 aim_bos_setprofile(g->oscar_sess, g->oscar_conn, info, | |
271 NULL, gaim_caps); | |
272 } | |
273 } | 208 } |
274 | 209 |
275 void serv_change_passwd(struct gaim_connection *g, char *orig, char *new) { | 210 void serv_change_passwd(struct gaim_connection *g, char *orig, char *new) { |
276 if (g->protocol == PROTO_TOC) { | 211 if (g->prpl && g->prpl->change_passwd) |
277 char *buf = g_malloc(BUF_LONG); | 212 (*g->prpl->change_passwd)(g, orig, new); |
278 g_snprintf(buf, BUF_LONG, "toc_change_passwd %s %s", orig, new); | |
279 sflap_send(g, buf, strlen(buf), TYPE_DATA); | |
280 g_free(buf); | |
281 } else if (g->protocol == PROTO_OSCAR) { | |
282 /* Oscar change_passwd FIXME */ | |
283 } | |
284 } | 213 } |
285 | 214 |
286 void serv_add_buddy(char *name) | 215 void serv_add_buddy(char *name) |
287 { | 216 { |
288 /* FIXME: this will need to be changed. for now all buddies will be added to | 217 /* FIXME: this will need to be changed. for now all buddies will be added to |
290 GSList *c = connections; | 219 GSList *c = connections; |
291 struct gaim_connection *g; | 220 struct gaim_connection *g; |
292 | 221 |
293 while (c) { | 222 while (c) { |
294 g = (struct gaim_connection *)c->data; | 223 g = (struct gaim_connection *)c->data; |
295 if (g->protocol == PROTO_TOC) { | 224 if (g->prpl && g->prpl->add_buddy) |
296 char buf[1024]; | 225 (*g->prpl->add_buddy)(g, name); |
297 g_snprintf(buf, sizeof(buf), "toc_add_buddy %s", normalize(name)); | |
298 sflap_send(g, buf, -1, TYPE_DATA); | |
299 } else if (g->protocol == PROTO_OSCAR) { | |
300 aim_add_buddy(g->oscar_sess, g->oscar_conn, name); | |
301 } | |
302 c = c->next; | 226 c = c->next; |
303 } | 227 } |
304 } | 228 } |
305 | 229 |
306 void serv_add_buddies(GList *buddies) | 230 void serv_add_buddies(GList *buddies) |
309 GSList *c = connections; | 233 GSList *c = connections; |
310 struct gaim_connection *g; | 234 struct gaim_connection *g; |
311 | 235 |
312 while (c) { | 236 while (c) { |
313 g = (struct gaim_connection *)c->data; | 237 g = (struct gaim_connection *)c->data; |
314 if (g->protocol == PROTO_TOC) { | 238 if (g->prpl && g->prpl->add_buddies) |
315 char buf[MSG_LEN]; | 239 (*g->prpl->add_buddies)(g, buddies); |
316 int n, num = 0; | |
317 | |
318 n = g_snprintf(buf, sizeof(buf), "toc_add_buddy"); | |
319 while(buddies) { | |
320 /* i don't know why we choose 8, it just seems good */ | |
321 if (strlen(normalize(buddies->data)) > MSG_LEN - n - 8) { | |
322 sflap_send(g, buf, -1, TYPE_DATA); | |
323 n = g_snprintf(buf, sizeof(buf), "toc_add_buddy"); | |
324 num = 0; | |
325 } | |
326 ++num; | |
327 n += g_snprintf(buf + n, sizeof(buf)-n, " %s", normalize(buddies->data)); | |
328 buddies = buddies->next; | |
329 } | |
330 sflap_send(g, buf, -1, TYPE_DATA); | |
331 } else if (g->protocol == PROTO_OSCAR) { | |
332 char buf[MSG_LEN]; | |
333 int n = 0; | |
334 while(buddies) { | |
335 if (n > MSG_LEN - 18) { | |
336 aim_bos_setbuddylist(g->oscar_sess, g->oscar_conn, buf); | |
337 n = 0; | |
338 } | |
339 n += g_snprintf(buf + n, sizeof(buf) - n, "%s&", | |
340 (char *)buddies->data); | |
341 buddies = buddies->next; | |
342 } | |
343 aim_bos_setbuddylist(g->oscar_sess, g->oscar_conn, buf); | |
344 } | |
345 c = c->next; | 240 c = c->next; |
346 } | 241 } |
347 } | 242 } |
348 | 243 |
349 | 244 |
353 GSList *c = connections; | 248 GSList *c = connections; |
354 struct gaim_connection *g; | 249 struct gaim_connection *g; |
355 | 250 |
356 while (c) { | 251 while (c) { |
357 g = (struct gaim_connection *)c->data; | 252 g = (struct gaim_connection *)c->data; |
358 if (g->protocol == PROTO_TOC) { | 253 if (g->prpl && g->prpl->remove_buddy) |
359 char buf[1024]; | 254 (*g->prpl->remove_buddy)(g, name); |
360 g_snprintf(buf, sizeof(buf), "toc_remove_buddy %s", normalize(name)); | |
361 sflap_send(g, buf, -1, TYPE_DATA); | |
362 } else if (g->protocol == PROTO_OSCAR) { | |
363 aim_remove_buddy(g->oscar_sess, g->oscar_conn, name); | |
364 } | |
365 c = c->next; | 255 c = c->next; |
366 } | 256 } |
367 } | 257 } |
368 | 258 |
369 void serv_add_permit(char *name) | 259 void serv_add_permit(char *name) |
479 } | 369 } |
480 } | 370 } |
481 | 371 |
482 void serv_set_idle(struct gaim_connection *g, int time) | 372 void serv_set_idle(struct gaim_connection *g, int time) |
483 { | 373 { |
484 if (g->protocol == PROTO_TOC) { | 374 if (g->prpl && g->prpl->set_idle) |
485 char buf[256]; | 375 (*g->prpl->set_idle)(g, time); |
486 g_snprintf(buf, sizeof(buf), "toc_set_idle %d", time); | |
487 sflap_send(g, buf, -1, TYPE_DATA); | |
488 } else if (g->protocol == PROTO_OSCAR) { | |
489 aim_bos_setidle(g->oscar_sess, g->oscar_conn, time); | |
490 } | |
491 } | 376 } |
492 | 377 |
493 | 378 |
494 void serv_warn(struct gaim_connection *g, char *name, int anon) | 379 void serv_warn(struct gaim_connection *g, char *name, int anon) |
495 { | 380 { |
496 if (g->protocol == PROTO_TOC) { | 381 if (g->prpl && g->prpl->warn) |
497 char *send = g_malloc(256); | 382 (*g->prpl->warn)(g, name, anon); |
498 g_snprintf(send, 255, "toc_evil %s %s", name, | |
499 ((anon) ? "anon" : "norm")); | |
500 sflap_send(g, send, -1, TYPE_DATA); | |
501 g_free(send); | |
502 } else if (g->protocol == PROTO_OSCAR) { | |
503 aim_send_warning(g->oscar_sess, g->oscar_conn, name, anon); | |
504 } | |
505 } | 383 } |
506 | 384 |
507 void serv_build_config(char *buf, int len, gboolean show) { | 385 void serv_build_config(char *buf, int len, gboolean show) { |
508 toc_build_config(buf, len, show); | 386 toc_build_config(buf, len, show); |
509 } | 387 } |
525 } | 403 } |
526 | 404 |
527 | 405 |
528 void serv_accept_chat(struct gaim_connection *g, int i) | 406 void serv_accept_chat(struct gaim_connection *g, int i) |
529 { | 407 { |
530 if (g->protocol == PROTO_TOC) { | 408 if (g->prpl && g->prpl->accept_chat) |
531 char *buf = g_malloc(256); | 409 (*g->prpl->accept_chat)(g, i); |
532 g_snprintf(buf, 255, "toc_chat_accept %d", i); | |
533 sflap_send(g, buf, -1, TYPE_DATA); | |
534 g_free(buf); | |
535 } else if (g->protocol == PROTO_OSCAR) { | |
536 /* this should never get called because libfaim doesn't use the id | |
537 * (i'm not even sure Oscar does). go through serv_join_chat instead */ | |
538 } | |
539 } | 410 } |
540 | 411 |
541 void serv_join_chat(struct gaim_connection *g, int exchange, char *name) | 412 void serv_join_chat(struct gaim_connection *g, int exchange, char *name) |
542 { | 413 { |
543 if (g->protocol == PROTO_TOC) { | 414 if (g->prpl && g->prpl->join_chat) |
544 char buf[BUF_LONG]; | 415 (*g->prpl->join_chat)(g, exchange, name); |
545 g_snprintf(buf, sizeof(buf)/2, "toc_chat_join %d \"%s\"", exchange, name); | |
546 sflap_send(g, buf, -1, TYPE_DATA); | |
547 } else if (g->protocol == PROTO_OSCAR) { | |
548 struct aim_conn_t *cur = NULL; | |
549 sprintf(debug_buff, "Attempting to join chat room %s.\n", name); | |
550 debug_print(debug_buff); | |
551 if ((cur = aim_getconn_type(g->oscar_sess, AIM_CONN_TYPE_CHATNAV))) { | |
552 debug_print("chatnav exists, creating room\n"); | |
553 aim_chatnav_createroom(g->oscar_sess, cur, name, exchange); | |
554 } else { | |
555 /* this gets tricky */ | |
556 debug_print("chatnav does not exist, opening chatnav\n"); | |
557 g->create_exchange = exchange; | |
558 g->create_name = g_strdup(name); | |
559 aim_bos_reqservice(g->oscar_sess, g->oscar_conn, AIM_CONN_TYPE_CHATNAV); | |
560 } | |
561 } | |
562 } | 416 } |
563 | 417 |
564 void serv_chat_invite(struct gaim_connection *g, int id, char *message, char *name) | 418 void serv_chat_invite(struct gaim_connection *g, int id, char *message, char *name) |
565 { | 419 { |
566 if (g->protocol == PROTO_TOC) { | 420 if (g->prpl && g->prpl->chat_invite) |
567 char buf[BUF_LONG]; | 421 (*g->prpl->chat_invite)(g, id, message, name); |
568 g_snprintf(buf, sizeof(buf)/2, "toc_chat_invite %d \"%s\" %s", id, message, normalize(name)); | |
569 sflap_send(g, buf, -1, TYPE_DATA); | |
570 } else if (g->protocol == PROTO_OSCAR) { | |
571 GSList *bcs = g->buddy_chats; | |
572 struct conversation *b = NULL; | |
573 | |
574 while (bcs) { | |
575 b = (struct conversation *)bcs->data; | |
576 if (id == b->id) | |
577 break; | |
578 bcs = bcs->next; | |
579 b = NULL; | |
580 } | |
581 | |
582 if (!b) | |
583 return; | |
584 | |
585 aim_chat_invite(g->oscar_sess, g->oscar_conn, name, | |
586 message ? message : "", 0x4, b->name, 0x0); | |
587 } | |
588 } | 422 } |
589 | 423 |
590 void serv_chat_leave(struct gaim_connection *g, int id) | 424 void serv_chat_leave(struct gaim_connection *g, int id) |
591 { | 425 { |
592 if (g->protocol == PROTO_TOC) { | 426 if (g->prpl && g->prpl->chat_leave) |
593 char *buf = g_malloc(256); | 427 (*g->prpl->chat_leave)(g, id); |
594 g_snprintf(buf, 255, "toc_chat_leave %d", id); | |
595 sflap_send(g, buf, -1, TYPE_DATA); | |
596 g_free(buf); | |
597 } else if (g->protocol == PROTO_OSCAR) { | |
598 GSList *bcs = g->buddy_chats; | |
599 struct conversation *b = NULL; | |
600 struct chat_connection *c = NULL; | |
601 int count = 0; | |
602 | |
603 while (bcs) { | |
604 count++; | |
605 b = (struct conversation *)bcs->data; | |
606 if (id == b->id) | |
607 break; | |
608 bcs = bcs->next; | |
609 b = NULL; | |
610 } | |
611 | |
612 if (!b) | |
613 return; | |
614 | |
615 sprintf(debug_buff, "Attempting to leave room %s (currently in %d rooms)\n", | |
616 b->name, count); | |
617 debug_print(debug_buff); | |
618 | |
619 c = find_oscar_chat(g, b->name); | |
620 if (c != NULL) { | |
621 g->oscar_chats = g_slist_remove(g->oscar_chats, c); | |
622 gdk_input_remove(c->inpa); | |
623 if (g && g->oscar_sess) | |
624 aim_conn_kill(g->oscar_sess, &c->conn); | |
625 g_free(c->name); | |
626 g_free(c); | |
627 } | |
628 /* we do this because with Oscar it doesn't tell us we left */ | |
629 serv_got_chat_left(g, b->id); | |
630 } | |
631 } | 428 } |
632 | 429 |
633 void serv_chat_whisper(struct gaim_connection *g, int id, char *who, char *message) | 430 void serv_chat_whisper(struct gaim_connection *g, int id, char *who, char *message) |
634 { | 431 { |
635 if (g->protocol == PROTO_TOC) { | 432 if (g->prpl && g->prpl->chat_whisper) |
636 char buf2[MSG_LEN]; | 433 (*g->prpl->chat_whisper)(g, id, who, message); |
637 g_snprintf(buf2, sizeof(buf2), "toc_chat_whisper %d %s \"%s\"", id, who, message); | |
638 sflap_send(g, buf2, -1, TYPE_DATA); | |
639 } else if (g->protocol == PROTO_OSCAR) { | |
640 do_error_dialog("Sorry, Oscar doesn't whisper. Send an IM. (The last message was not received.)", | |
641 "Gaim - Chat"); | |
642 } | |
643 } | 434 } |
644 | 435 |
645 void serv_chat_send(struct gaim_connection *g, int id, char *message) | 436 void serv_chat_send(struct gaim_connection *g, int id, char *message) |
646 { | 437 { |
647 if (g->protocol == PROTO_TOC) { | 438 if (g->prpl && g->prpl->chat_send) |
648 char buf[MSG_LEN]; | 439 (*g->prpl->chat_send)(g, id, message); |
649 escape_text(message); | |
650 g_snprintf(buf, sizeof(buf), "toc_chat_send %d \"%s\"",id, message); | |
651 sflap_send(g, buf, -1, TYPE_DATA); | |
652 } else if (g->protocol == PROTO_OSCAR) { | |
653 struct aim_conn_t *cn; | |
654 GSList *bcs = g->buddy_chats; | |
655 struct conversation *b = NULL; | |
656 | |
657 while (bcs) { | |
658 b = (struct conversation *)bcs->data; | |
659 if (id == b->id) | |
660 break; | |
661 bcs = bcs->next; | |
662 b = NULL; | |
663 } | |
664 if (!b) | |
665 return; | |
666 | |
667 cn = aim_chat_getconn(g->oscar_sess, b->name); | |
668 aim_chat_send_im(g->oscar_sess, cn, message); | |
669 } | |
670 serv_touch_idle(g); | 440 serv_touch_idle(g); |
671 } | 441 } |
672 | 442 |
673 | 443 |
674 | 444 |
756 is_idle = -1; | 526 is_idle = -1; |
757 | 527 |
758 /* apply default fonts and colors */ | 528 /* apply default fonts and colors */ |
759 tmpmsg = stylize(awaymessage->message, MSG_LEN); | 529 tmpmsg = stylize(awaymessage->message, MSG_LEN); |
760 | 530 |
531 /* PRPL */ | |
761 if (gc->protocol == PROTO_TOC) { | 532 if (gc->protocol == PROTO_TOC) { |
762 escape_text(tmpmsg); | 533 escape_text(tmpmsg); |
763 escape_message(tmpmsg); | 534 escape_message(tmpmsg); |
764 } | 535 } |
765 serv_send_im(gc, name, away_subs(tmpmsg, alias), 1); | 536 serv_send_im(gc, name, away_subs(tmpmsg, alias), 1); |
1086 if (!cnv) cnv = new_conversation(name); | 857 if (!cnv) cnv = new_conversation(name); |
1087 | 858 |
1088 if (cnv->gc->protocol == PROTO_TOC) { | 859 if (cnv->gc->protocol == PROTO_TOC) { |
1089 /* Direct IM TOC FIXME */ | 860 /* Direct IM TOC FIXME */ |
1090 } else if (cnv->gc->protocol == PROTO_OSCAR) { | 861 } else if (cnv->gc->protocol == PROTO_OSCAR) { |
862 /* PRPL | |
1091 oscar_do_directim(cnv->gc, name); | 863 oscar_do_directim(cnv->gc, name); |
864 */ | |
1092 } | 865 } |
1093 } | 866 } |
1094 | 867 |
1095 void serv_got_imimage(struct gaim_connection *gc, char *name, char *cookie, char *ip, | 868 void serv_got_imimage(struct gaim_connection *gc, char *name, char *cookie, char *ip, |
1096 struct aim_conn_t *conn, int watcher) | 869 struct aim_conn_t *conn, int watcher) |
1101 struct conversation *cnv = find_conversation(name); | 874 struct conversation *cnv = find_conversation(name); |
1102 if (!cnv) cnv = new_conversation(name); | 875 if (!cnv) cnv = new_conversation(name); |
1103 make_direct(cnv, TRUE, conn, watcher); | 876 make_direct(cnv, TRUE, conn, watcher); |
1104 } | 877 } |
1105 } | 878 } |
879 | |
880 void send_keepalive(gpointer d) { | |
881 struct gaim_connection *gc = (struct gaim_connection *)d; | |
882 debug_print("sending oscar NOP\n"); | |
883 if (gc->prpl && gc->prpl->keepalive) | |
884 (*gc->prpl->keepalive)(gc); | |
885 } | |
886 | |
887 void update_keepalive(struct gaim_connection *gc, gboolean on) { | |
888 if (on && gc->keepalive < 0 && blist) { | |
889 debug_print("allowing NOP\n"); | |
890 gc->keepalive = gtk_timeout_add(60000, (GtkFunction)send_keepalive, gc); | |
891 } else if (!on && gc->keepalive > -1) { | |
892 debug_print("removing NOP\n"); | |
893 gtk_timeout_remove(gc->keepalive); | |
894 gc->keepalive = -1; | |
895 } | |
896 } |