| 174 |
173 |
| 175 |
174 |
| 176 /* ok. this function used to take username/password, and return 0 on success. |
175 /* ok. this function used to take username/password, and return 0 on success. |
| 177 * now, it takes username/password, and returns NULL on error or a new gaim_connection |
176 * now, it takes username/password, and returns NULL on error or a new gaim_connection |
| 178 * on success. */ |
177 * on success. */ |
| 179 static void toc_login(struct gaim_account *account) |
178 static void toc_login(GaimAccount *account) |
| 180 { |
179 { |
| 181 struct gaim_connection *gc; |
180 GaimConnection *gc; |
| 182 struct toc_data *tdt; |
181 struct toc_data *tdt; |
| 183 char buf[80]; |
182 char buf[80]; |
| 184 |
183 |
| 185 gc = new_gaim_conn(account); |
184 gc = gaim_account_get_connection(account); |
| 186 gc->proto_data = tdt = g_new0(struct toc_data, 1); |
185 gc->proto_data = tdt = g_new0(struct toc_data, 1); |
| 187 gc->flags |= OPT_CONN_HTML; |
186 gc->flags |= OPT_CONN_HTML; |
| 188 gc->flags |= OPT_CONN_AUTO_RESP; |
187 gc->flags |= OPT_CONN_AUTO_RESP; |
| 189 |
188 |
| 190 g_snprintf(buf, sizeof buf, _("Looking up %s"), |
189 g_snprintf(buf, sizeof buf, _("Looking up %s"), |
| 191 account->proto_opt[USEROPT_AUTH][0] ? account->proto_opt[USEROPT_AUTH] : TOC_HOST); |
190 gaim_account_get_string(account, "server", TOC_HOST)); |
| 192 set_login_progress(gc, 1, buf); |
191 gaim_connection_update_progress(gc, buf, 1, TOC_CONNECT_STEPS); |
| 193 |
192 |
| 194 debug_printf("* Client connects to TOC\n"); |
193 debug_printf("* Client connects to TOC\n"); |
| 195 if (proxy_connect(account, account->proto_opt[USEROPT_AUTH][0] ? |
194 if (proxy_connect(account, |
| 196 account->proto_opt[USEROPT_AUTH] : TOC_HOST, |
195 gaim_account_get_string(account, "server", TOC_HOST), |
| 197 account->proto_opt[USEROPT_AUTHPORT][0] ? |
196 gaim_account_get_int(account, "port", TOC_PORT), |
| 198 atoi(account->proto_opt[USEROPT_AUTHPORT]) : TOC_PORT, |
|
| 199 toc_login_callback, gc) != 0 || !account->gc) { |
197 toc_login_callback, gc) != 0 || !account->gc) { |
| 200 g_snprintf(buf, sizeof(buf), "Connect to %s failed", account->proto_opt[USEROPT_AUTH]); |
198 g_snprintf(buf, sizeof(buf), "Connect to %s failed", |
| 201 hide_login_progress(gc, buf); |
199 gaim_account_get_string(account, "server", TOC_HOST)); |
| 202 signoff(gc); |
200 gaim_connection_error(gc, buf); |
| 203 return; |
201 return; |
| 204 } |
202 } |
| 205 } |
203 } |
| 206 |
204 |
| 207 static void toc_login_callback(gpointer data, gint source, GaimInputCondition cond) |
205 static void toc_login_callback(gpointer data, gint source, GaimInputCondition cond) |
| 208 { |
206 { |
| 209 struct gaim_connection *gc = data; |
207 GaimConnection *gc = data; |
| 210 struct toc_data *tdt; |
208 struct toc_data *tdt; |
| 211 char buf[80]; |
209 char buf[80]; |
| 212 struct sockaddr_in name; |
210 struct sockaddr_in name; |
| 213 socklen_t namelen; |
211 socklen_t namelen; |
| 214 |
212 |
| 215 if (!g_slist_find(connections, data)) { |
213 if (!g_list_find(gaim_connections_get_all(), data)) { |
| 216 toc_soc_close(source); |
214 toc_soc_close(source); |
| 217 return; |
215 return; |
| 218 } |
216 } |
| 219 |
217 |
| 220 tdt = gc->proto_data; |
218 tdt = gc->proto_data; |
| 221 |
219 |
| 222 if (source == -1) { |
220 if (source == -1) { |
| 223 /* we didn't successfully connect. tdt->toc_fd is valid here */ |
221 /* we didn't successfully connect. tdt->toc_fd is valid here */ |
| 224 hide_login_progress(gc, "Unable to connect."); |
222 gaim_connection_error(gc, "Unable to connect."); |
| 225 signoff(gc); |
|
| 226 return; |
223 return; |
| 227 } |
224 } |
| 228 tdt->toc_fd = source; |
225 tdt->toc_fd = source; |
| 229 |
226 |
| 230 /* |
227 /* |
| 232 * should open on the exact server we're connected to. toc.oscar.aol.com |
229 * should open on the exact server we're connected to. toc.oscar.aol.com |
| 233 * doesn't work because that hostname resolves to multiple IP addresses. |
230 * doesn't work because that hostname resolves to multiple IP addresses. |
| 234 */ |
231 */ |
| 235 if (getpeername(tdt->toc_fd, (struct sockaddr *)&name, &namelen) == 0) |
232 if (getpeername(tdt->toc_fd, (struct sockaddr *)&name, &namelen) == 0) |
| 236 strncpy(tdt->toc_ip, inet_ntoa(name.sin_addr), sizeof(tdt->toc_ip)); |
233 strncpy(tdt->toc_ip, inet_ntoa(name.sin_addr), sizeof(tdt->toc_ip)); |
| 237 else if (gc->account && gc->account->proto_opt[USEROPT_AUTH][0]) |
|
| 238 strncpy(tdt->toc_ip, gc->account->proto_opt[USEROPT_AUTH], sizeof(tdt->toc_ip)); |
|
| 239 else |
234 else |
| 240 strncpy(tdt->toc_ip, TOC_HOST, sizeof(tdt->toc_ip)); |
235 strncpy(tdt->toc_ip, gaim_account_get_string(gc->account, "server", TOC_HOST), sizeof(tdt->toc_ip)); |
| 241 |
236 |
| 242 debug_printf("* Client sends \"FLAPON\\r\\n\\r\\n\"\n"); |
237 debug_printf("* Client sends \"FLAPON\\r\\n\\r\\n\"\n"); |
| 243 if (toc_write(tdt->toc_fd, FLAPON, strlen(FLAPON)) < 0) { |
238 if (toc_write(tdt->toc_fd, FLAPON, strlen(FLAPON)) < 0) { |
| 244 hide_login_progress(gc, "Disconnected."); |
239 gaim_connection_error(gc, "Disconnected."); |
| 245 signoff(gc); |
|
| 246 return; |
240 return; |
| 247 } |
241 } |
| 248 tdt->state = STATE_FLAPON; |
242 tdt->state = STATE_FLAPON; |
| 249 |
243 |
| 250 /* i know a lot of people like to look at gaim to see how TOC works. so i'll comment |
244 /* i know a lot of people like to look at gaim to see how TOC works. so i'll comment |
| 251 * on what this does. it's really simple. when there's data ready to be read from the |
245 * on what this does. it's really simple. when there's data ready to be read from the |
| 252 * toc_fd file descriptor, toc_callback is called, with gc passed as its data arg. */ |
246 * toc_fd file descriptor, toc_callback is called, with gc passed as its data arg. */ |
| 253 gc->inpa = gaim_input_add(tdt->toc_fd, GAIM_INPUT_READ, toc_callback, gc); |
247 gc->inpa = gaim_input_add(tdt->toc_fd, GAIM_INPUT_READ, toc_callback, gc); |
| 254 |
248 |
| 255 g_snprintf(buf, sizeof(buf), _("Signon: %s"), gc->username); |
249 g_snprintf(buf, sizeof(buf), _("Signon: %s"), gaim_account_get_username(gc->account)); |
| 256 set_login_progress(gc, 2, buf); |
250 gaim_connection_update_progress(gc, buf, 2, TOC_CONNECT_STEPS); |
| 257 } |
251 } |
| 258 |
252 |
| 259 static void toc_close(struct gaim_connection *gc) |
253 static void toc_close(GaimConnection *gc) |
| 260 { |
254 { |
| 261 if (gc->inpa > 0) |
255 if (gc->inpa > 0) |
| 262 gaim_input_remove(gc->inpa); |
256 gaim_input_remove(gc->inpa); |
| 263 gc->inpa = 0; |
257 gc->inpa = 0; |
| 264 toc_soc_close(((struct toc_data *)gc->proto_data)->toc_fd); |
258 toc_soc_close(((struct toc_data *)gc->proto_data)->toc_fd); |
| 265 g_free(gc->proto_data); |
259 g_free(gc->proto_data); |
| 266 } |
260 } |
| 267 |
261 |
| 268 static void toc_build_config(struct gaim_account *account, char *s, int len, gboolean show) |
262 static void toc_build_config(GaimAccount *account, char *s, int len, gboolean show) |
| 269 { |
263 { |
| 270 GaimBlistNode *gnode,*bnode; |
264 GaimBlistNode *gnode,*bnode; |
| 271 struct group *g; |
265 struct group *g; |
| 272 struct buddy *b; |
266 struct buddy *b; |
| 273 GSList *plist = account->permit; |
267 GSList *plist = account->permit; |
| 274 GSList *dlist = account->deny; |
268 GSList *dlist = account->deny; |
| 275 |
269 |
| 276 int pos = 0; |
270 int pos = 0; |
| 277 |
271 |
| 278 if (!account->permdeny) |
272 if (!account->perm_deny) |
| 279 account->permdeny = 1; |
273 account->perm_deny = 1; |
| 280 |
274 |
| 281 pos += g_snprintf(&s[pos], len - pos, "m %d\n", account->permdeny); |
275 pos += g_snprintf(&s[pos], len - pos, "m %d\n", account->perm_deny); |
| 282 for(gnode = gaim_get_blist()->root; gnode && len > pos; gnode = gnode->next) { |
276 for(gnode = gaim_get_blist()->root; gnode && len > pos; gnode = gnode->next) { |
| 283 g = (struct group *)gnode; |
277 g = (struct group *)gnode; |
| 284 if(!GAIM_BLIST_NODE_IS_GROUP(gnode)) |
278 if(!GAIM_BLIST_NODE_IS_GROUP(gnode)) |
| 285 continue; |
279 continue; |
| 286 if(gaim_group_on_account(g, account)) { |
280 if(gaim_group_on_account(g, account)) { |
| 568 return buf; |
562 return buf; |
| 569 } |
563 } |
| 570 |
564 |
| 571 static void toc_callback(gpointer data, gint source, GaimInputCondition condition) |
565 static void toc_callback(gpointer data, gint source, GaimInputCondition condition) |
| 572 { |
566 { |
| 573 struct gaim_connection *gc = (struct gaim_connection *)data; |
567 GaimConnection *gc = (GaimConnection *)data; |
| 574 struct toc_data *tdt = (struct toc_data *)gc->proto_data; |
568 struct toc_data *tdt = (struct toc_data *)gc->proto_data; |
| 575 struct sflap_hdr *hdr; |
569 struct sflap_hdr *hdr; |
| 576 struct signon so; |
570 struct signon so; |
| 577 char buf[8 * 1024], *c; |
571 char buf[8 * 1024], *c; |
| 578 char snd[BUF_LEN * 2]; |
572 char snd[BUF_LEN * 2]; |
| 579 |
573 |
| |
574 const char *username = gaim_account_get_username(gc->account); |
| |
575 char *password; |
| |
576 |
| 580 /* there's data waiting to be read, so read it. */ |
577 /* there's data waiting to be read, so read it. */ |
| 581 if (wait_reply(gc, buf, 8 * 1024) <= 0) { |
578 if (wait_reply(gc, buf, 8 * 1024) <= 0) { |
| 582 hide_login_progress_error(gc, _("Connection Closed")); |
579 gaim_connection_error(gc, _("Connection Closed")); |
| 583 signoff(gc); |
|
| 584 return; |
580 return; |
| 585 } |
581 } |
| 586 |
582 |
| 587 if (tdt->state == STATE_FLAPON) { |
583 if (tdt->state == STATE_FLAPON) { |
| 588 hdr = (struct sflap_hdr *)buf; |
584 hdr = (struct sflap_hdr *)buf; |
| 592 debug_printf("* TOC sends Client FLAP SIGNON\n"); |
588 debug_printf("* TOC sends Client FLAP SIGNON\n"); |
| 593 tdt->seqno = ntohs(hdr->seqno); |
589 tdt->seqno = ntohs(hdr->seqno); |
| 594 tdt->state = STATE_SIGNON_REQUEST; |
590 tdt->state = STATE_SIGNON_REQUEST; |
| 595 |
591 |
| 596 debug_printf("* Client sends TOC FLAP SIGNON\n"); |
592 debug_printf("* Client sends TOC FLAP SIGNON\n"); |
| 597 g_snprintf(so.username, sizeof(so.username), "%s", gc->username); |
593 g_snprintf(so.username, sizeof(so.username), "%s", username); |
| 598 so.ver = htonl(1); |
594 so.ver = htonl(1); |
| 599 so.tag = htons(1); |
595 so.tag = htons(1); |
| 600 so.namelen = htons(strlen(so.username)); |
596 so.namelen = htons(strlen(so.username)); |
| 601 if (sflap_send(gc, (char *)&so, ntohs(so.namelen) + 8, TYPE_SIGNON) < 0) { |
597 if (sflap_send(gc, (char *)&so, ntohs(so.namelen) + 8, TYPE_SIGNON) < 0) { |
| 602 hide_login_progress(gc, _("Disconnected.")); |
598 gaim_connection_error(gc, _("Disconnected.")); |
| 603 signoff(gc); |
|
| 604 return; |
599 return; |
| 605 } |
600 } |
| 606 |
601 |
| 607 debug_printf("* Client sends TOC \"toc_signon\" message\n"); |
602 debug_printf("* Client sends TOC \"toc_signon\" message\n"); |
| 608 /* i hate icq. */ |
603 /* i hate icq. */ |
| 609 if (gc->username[0] >= '0' && gc->username[0] <= '9') |
604 if (username[0] >= '0' && username[0] <= '9') |
| 610 gc->password[9] = '\0'; |
605 password = g_strndup(gaim_account_get_password(gc->account), 8); |
| |
606 else |
| |
607 password = g_strdup(gaim_account_get_password(gc->account)); |
| 611 g_snprintf(snd, sizeof snd, "toc_signon %s %d %s %s %s \"%s\"", |
608 g_snprintf(snd, sizeof snd, "toc_signon %s %d %s %s %s \"%s\"", |
| 612 AUTH_HOST, AUTH_PORT, normalize(gc->username), |
609 AUTH_HOST, AUTH_PORT, normalize(username), |
| 613 roast_password(gc->password), LANGUAGE, REVISION); |
610 roast_password(password), LANGUAGE, REVISION); |
| |
611 g_free(password); |
| 614 if (sflap_send(gc, snd, -1, TYPE_DATA) < 0) { |
612 if (sflap_send(gc, snd, -1, TYPE_DATA) < 0) { |
| 615 hide_login_progress(gc, _("Disconnected.")); |
613 gaim_connection_error(gc, _("Disconnected.")); |
| 616 signoff(gc); |
|
| 617 return; |
614 return; |
| 618 } |
615 } |
| 619 |
616 |
| 620 set_login_progress(gc, 3, _("Waiting for reply...")); |
617 gaim_connection_update_progress(gc, _("Waiting for reply..."), 3, TOC_CONNECT_STEPS); |
| 621 return; |
618 return; |
| 622 } |
619 } |
| 623 |
620 |
| 624 if (tdt->state == STATE_SIGNON_REQUEST) { |
621 if (tdt->state == STATE_SIGNON_REQUEST) { |
| 625 debug_printf("* TOC sends client SIGN_ON reply\n"); |
622 debug_printf("* TOC sends client SIGN_ON reply\n"); |
| 626 if (g_ascii_strncasecmp(buf + sizeof(struct sflap_hdr), "SIGN_ON", strlen("SIGN_ON"))) { |
623 if (g_ascii_strncasecmp(buf + sizeof(struct sflap_hdr), "SIGN_ON", strlen("SIGN_ON"))) { |
| 627 debug_printf("Didn't get SIGN_ON! buf was: %s\n", |
624 debug_printf("Didn't get SIGN_ON! buf was: %s\n", |
| 628 buf + sizeof(struct sflap_hdr)); |
625 buf + sizeof(struct sflap_hdr)); |
| 629 if (!g_ascii_strncasecmp(buf + sizeof(struct sflap_hdr), "ERROR", 5)) { |
626 if (!g_ascii_strncasecmp(buf + sizeof(struct sflap_hdr), "ERROR", 5)) { |
| 630 strtok(buf + sizeof(struct sflap_hdr), ":"); |
627 strtok(buf + sizeof(struct sflap_hdr), ":"); |
| 631 hide_login_progress(gc, show_error_message()); |
628 gaim_connection_error(gc, show_error_message()); |
| 632 } else |
629 } else |
| 633 hide_login_progress(gc, _("Authentication Failed")); |
630 gaim_connection_error(gc, _("Authentication Failed")); |
| 634 signoff(gc); |
|
| 635 return; |
631 return; |
| 636 } |
632 } |
| 637 /* we're supposed to check that it's really TOC v1 here but we know it is ;) */ |
633 /* we're supposed to check that it's really TOC v1 here but we know it is ;) */ |
| 638 debug_printf("TOC version: %s\n", buf + sizeof(struct sflap_hdr) + 8); |
634 debug_printf("TOC version: %s\n", buf + sizeof(struct sflap_hdr) + 8); |
| 639 |
635 |
| 670 if (tdt->state != STATE_PAUSE) |
666 if (tdt->state != STATE_PAUSE) |
| 671 debug_printf("got SIGN_ON but not PAUSE!\n"); |
667 debug_printf("got SIGN_ON but not PAUSE!\n"); |
| 672 else { |
668 else { |
| 673 tdt->state = STATE_ONLINE; |
669 tdt->state = STATE_ONLINE; |
| 674 g_snprintf(snd, sizeof snd, "toc_signon %s %d %s %s %s \"%s\"", |
670 g_snprintf(snd, sizeof snd, "toc_signon %s %d %s %s %s \"%s\"", |
| 675 AUTH_HOST, AUTH_PORT, normalize(gc->username), |
671 AUTH_HOST, AUTH_PORT, |
| 676 roast_password(gc->password), LANGUAGE, REVISION); |
672 normalize(gaim_account_get_username(gc->account)), |
| |
673 roast_password(gaim_account_get_password(gc->account)), |
| |
674 LANGUAGE, REVISION); |
| 677 if (sflap_send(gc, snd, -1, TYPE_DATA) < 0) { |
675 if (sflap_send(gc, snd, -1, TYPE_DATA) < 0) { |
| 678 hide_login_progress(gc, _("Disconnected.")); |
676 gaim_connection_error(gc, _("Disconnected.")); |
| 679 signoff(gc); |
|
| 680 return; |
677 return; |
| 681 } |
678 } |
| 682 g_snprintf(snd, sizeof snd, "toc_init_done"); |
679 g_snprintf(snd, sizeof snd, "toc_init_done"); |
| 683 sflap_send(gc, snd, -1, TYPE_DATA); |
680 sflap_send(gc, snd, -1, TYPE_DATA); |
| 684 gaim_notify_info(gc, NULL, |
681 gaim_notify_info(gc, NULL, |
| 862 |
859 |
| 863 name = strtok(NULL, ":"); |
860 name = strtok(NULL, ":"); |
| 864 url = strtok(NULL, ":"); |
861 url = strtok(NULL, ":"); |
| 865 |
862 |
| 866 g_snprintf(tmp, sizeof(tmp), "http://%s:%d/%s", tdt->toc_ip, |
863 g_snprintf(tmp, sizeof(tmp), "http://%s:%d/%s", tdt->toc_ip, |
| 867 gc->account->proto_opt[USEROPT_AUTHPORT][0] ? |
864 gaim_account_get_int(gc->account, "port", TOC_PORT), |
| 868 atoi(gc->account->proto_opt[USEROPT_AUTHPORT]) : TOC_PORT, |
|
| 869 url); |
865 url); |
| 870 grab_url(tmp, FALSE, toc_got_info, NULL); |
866 grab_url(tmp, FALSE, toc_got_info, NULL); |
| 871 } else if (!g_ascii_strcasecmp(c, "DIR_STATUS")) { |
867 } else if (!g_ascii_strcasecmp(c, "DIR_STATUS")) { |
| 872 } else if (!g_ascii_strcasecmp(c, "ADMIN_NICK_STATUS")) { |
868 } else if (!g_ascii_strcasecmp(c, "ADMIN_NICK_STATUS")) { |
| 873 } else if (!g_ascii_strcasecmp(c, "ADMIN_PASSWD_STATUS")) { |
869 } else if (!g_ascii_strcasecmp(c, "ADMIN_PASSWD_STATUS")) { |
| 1039 |
1035 |
| 1040 g_free(tmp); |
1036 g_free(tmp); |
| 1041 return 1; |
1037 return 1; |
| 1042 } |
1038 } |
| 1043 |
1039 |
| 1044 static void toc_set_config(struct gaim_connection *gc) |
1040 static void toc_set_config(GaimConnection *gc) |
| 1045 { |
1041 { |
| 1046 char *buf = g_malloc(MSG_LEN), snd[BUF_LEN * 2]; |
1042 char *buf = g_malloc(MSG_LEN), snd[BUF_LEN * 2]; |
| 1047 toc_build_config(gc->account, buf, MSG_LEN - strlen("toc_set_config \\{\\}"), FALSE); |
1043 toc_build_config(gc->account, buf, MSG_LEN - strlen("toc_set_config \\{\\}"), FALSE); |
| 1048 g_snprintf(snd, MSG_LEN, "toc_set_config {%s}", buf); |
1044 g_snprintf(snd, MSG_LEN, "toc_set_config {%s}", buf); |
| 1049 sflap_send(gc, snd, -1, TYPE_DATA); |
1045 sflap_send(gc, snd, -1, TYPE_DATA); |
| 1050 g_free(buf); |
1046 g_free(buf); |
| 1051 } |
1047 } |
| 1052 |
1048 |
| 1053 static void toc_get_info(struct gaim_connection *g, const char *name) |
1049 static void toc_get_info(GaimConnection *g, const char *name) |
| 1054 { |
1050 { |
| 1055 char buf[BUF_LEN * 2]; |
1051 char buf[BUF_LEN * 2]; |
| 1056 g_snprintf(buf, MSG_LEN, "toc_get_info %s", normalize(name)); |
1052 g_snprintf(buf, MSG_LEN, "toc_get_info %s", normalize(name)); |
| 1057 sflap_send(g, buf, -1, TYPE_DATA); |
1053 sflap_send(g, buf, -1, TYPE_DATA); |
| 1058 } |
1054 } |
| 1059 |
1055 |
| 1060 static void toc_get_dir(struct gaim_connection *g, const char *name) |
1056 static void toc_get_dir(GaimConnection *g, const char *name) |
| 1061 { |
1057 { |
| 1062 char buf[BUF_LEN * 2]; |
1058 char buf[BUF_LEN * 2]; |
| 1063 g_snprintf(buf, MSG_LEN, "toc_get_dir %s", normalize(name)); |
1059 g_snprintf(buf, MSG_LEN, "toc_get_dir %s", normalize(name)); |
| 1064 sflap_send(g, buf, -1, TYPE_DATA); |
1060 sflap_send(g, buf, -1, TYPE_DATA); |
| 1065 } |
1061 } |
| 1066 |
1062 |
| 1067 static void toc_set_dir(struct gaim_connection *g, const char *first, const char *middle, const char *last, |
1063 static void toc_set_dir(GaimConnection *g, const char *first, const char *middle, const char *last, |
| 1068 const char *maiden, const char *city, const char *state, const char *country, int web) |
1064 const char *maiden, const char *city, const char *state, const char *country, int web) |
| 1069 { |
1065 { |
| 1070 char buf2[BUF_LEN * 4], buf[BUF_LEN]; |
1066 char buf2[BUF_LEN * 4], buf[BUF_LEN]; |
| 1071 g_snprintf(buf2, sizeof(buf2), "%s:%s:%s:%s:%s:%s:%s:%s", first, |
1067 g_snprintf(buf2, sizeof(buf2), "%s:%s:%s:%s:%s:%s:%s:%s", first, |
| 1072 middle, last, maiden, city, state, country, (web == 1) ? "Y" : ""); |
1068 middle, last, maiden, city, state, country, (web == 1) ? "Y" : ""); |
| 1073 escape_text(buf2); |
1069 escape_text(buf2); |
| 1074 g_snprintf(buf, sizeof(buf), "toc_set_dir %s", buf2); |
1070 g_snprintf(buf, sizeof(buf), "toc_set_dir %s", buf2); |
| 1075 sflap_send(g, buf, -1, TYPE_DATA); |
1071 sflap_send(g, buf, -1, TYPE_DATA); |
| 1076 } |
1072 } |
| 1077 |
1073 |
| 1078 static void toc_dir_search(struct gaim_connection *g, const char *first, const char *middle, const char *last, |
1074 static void toc_dir_search(GaimConnection *g, const char *first, const char *middle, const char *last, |
| 1079 const char *maiden, const char *city, const char *state, const char *country, const char *email) |
1075 const char *maiden, const char *city, const char *state, const char *country, const char *email) |
| 1080 { |
1076 { |
| 1081 char buf[BUF_LONG]; |
1077 char buf[BUF_LONG]; |
| 1082 g_snprintf(buf, sizeof(buf) / 2, "toc_dir_search %s:%s:%s:%s:%s:%s:%s:%s", first, middle, |
1078 g_snprintf(buf, sizeof(buf) / 2, "toc_dir_search %s:%s:%s:%s:%s:%s:%s:%s", first, middle, |
| 1083 last, maiden, city, state, country, email); |
1079 last, maiden, city, state, country, email); |
| 1084 debug_printf("Searching for: %s,%s,%s,%s,%s,%s,%s\n", first, middle, last, maiden, |
1080 debug_printf("Searching for: %s,%s,%s,%s,%s,%s,%s\n", first, middle, last, maiden, |
| 1085 city, state, country); |
1081 city, state, country); |
| 1086 sflap_send(g, buf, -1, TYPE_DATA); |
1082 sflap_send(g, buf, -1, TYPE_DATA); |
| 1087 } |
1083 } |
| 1088 |
1084 |
| 1089 static void toc_set_away(struct gaim_connection *g, char *state, char *message) |
1085 static void toc_set_away(GaimConnection *g, char *state, char *message) |
| 1090 { |
1086 { |
| 1091 char buf[BUF_LEN * 2]; |
1087 char buf[BUF_LEN * 2]; |
| 1092 if (g->away) { |
1088 if (g->away) { |
| 1093 g_free (g->away); |
1089 g_free (g->away); |
| 1094 g->away = NULL; |
1090 g->away = NULL; |
| 1103 } else |
1099 } else |
| 1104 g_snprintf(buf, MSG_LEN, "toc_set_away \"\""); |
1100 g_snprintf(buf, MSG_LEN, "toc_set_away \"\""); |
| 1105 sflap_send(g, buf, -1, TYPE_DATA); |
1101 sflap_send(g, buf, -1, TYPE_DATA); |
| 1106 } |
1102 } |
| 1107 |
1103 |
| 1108 static void toc_set_info(struct gaim_connection *g, char *info) |
1104 static void toc_set_info(GaimConnection *g, char *info) |
| 1109 { |
1105 { |
| 1110 char buf[BUF_LEN * 2], buf2[BUF_LEN * 2]; |
1106 char buf[BUF_LEN * 2], buf2[BUF_LEN * 2]; |
| 1111 g_snprintf(buf2, sizeof buf2, "%s", info); |
1107 g_snprintf(buf2, sizeof buf2, "%s", info); |
| 1112 escape_text(buf2); |
1108 escape_text(buf2); |
| 1113 g_snprintf(buf, sizeof(buf), "toc_set_info \"%s\n\"", buf2); |
1109 g_snprintf(buf, sizeof(buf), "toc_set_info \"%s\n\"", buf2); |
| 1114 sflap_send(g, buf, -1, TYPE_DATA); |
1110 sflap_send(g, buf, -1, TYPE_DATA); |
| 1115 } |
1111 } |
| 1116 |
1112 |
| 1117 static void toc_change_passwd(struct gaim_connection *g, const char *orig, const char *new) |
1113 static void toc_change_passwd(GaimConnection *g, const char *orig, const char *new) |
| 1118 { |
1114 { |
| 1119 char buf[BUF_LEN * 2]; |
1115 char buf[BUF_LEN * 2]; |
| 1120 g_snprintf(buf, BUF_LONG, "toc_change_passwd %s %s", orig, new); |
1116 g_snprintf(buf, BUF_LONG, "toc_change_passwd %s %s", orig, new); |
| 1121 sflap_send(g, buf, strlen(buf), TYPE_DATA); |
1117 sflap_send(g, buf, strlen(buf), TYPE_DATA); |
| 1122 } |
1118 } |
| 1123 |
1119 |
| 1124 static void toc_add_buddy(struct gaim_connection *g, const char *name) |
1120 static void toc_add_buddy(GaimConnection *g, const char *name) |
| 1125 { |
1121 { |
| 1126 char buf[BUF_LEN * 2]; |
1122 char buf[BUF_LEN * 2]; |
| 1127 g_snprintf(buf, sizeof(buf), "toc_add_buddy %s", normalize(name)); |
1123 g_snprintf(buf, sizeof(buf), "toc_add_buddy %s", normalize(name)); |
| 1128 sflap_send(g, buf, -1, TYPE_DATA); |
1124 sflap_send(g, buf, -1, TYPE_DATA); |
| 1129 toc_set_config(g); |
1125 toc_set_config(g); |
| 1130 } |
1126 } |
| 1131 |
1127 |
| 1132 static void toc_add_buddies(struct gaim_connection *g, GList *buddies) |
1128 static void toc_add_buddies(GaimConnection *g, GList *buddies) |
| 1133 { |
1129 { |
| 1134 char buf[BUF_LEN * 2]; |
1130 char buf[BUF_LEN * 2]; |
| 1135 int n; |
1131 int n; |
| 1136 |
1132 |
| 1137 n = g_snprintf(buf, sizeof(buf), "toc_add_buddy"); |
1133 n = g_snprintf(buf, sizeof(buf), "toc_add_buddy"); |
| 1144 buddies = buddies->next; |
1140 buddies = buddies->next; |
| 1145 } |
1141 } |
| 1146 sflap_send(g, buf, -1, TYPE_DATA); |
1142 sflap_send(g, buf, -1, TYPE_DATA); |
| 1147 } |
1143 } |
| 1148 |
1144 |
| 1149 static void toc_remove_buddy(struct gaim_connection *g, char *name, char *group) |
1145 static void toc_remove_buddy(GaimConnection *g, char *name, char *group) |
| 1150 { |
1146 { |
| 1151 char buf[BUF_LEN * 2]; |
1147 char buf[BUF_LEN * 2]; |
| 1152 g_snprintf(buf, sizeof(buf), "toc_remove_buddy %s", normalize(name)); |
1148 g_snprintf(buf, sizeof(buf), "toc_remove_buddy %s", normalize(name)); |
| 1153 sflap_send(g, buf, -1, TYPE_DATA); |
1149 sflap_send(g, buf, -1, TYPE_DATA); |
| 1154 toc_set_config(g); |
1150 toc_set_config(g); |
| 1155 } |
1151 } |
| 1156 |
1152 |
| 1157 static void toc_remove_buddies(struct gaim_connection *g, GList *buddies, const char *group) |
1153 static void toc_remove_buddies(GaimConnection *g, GList *buddies, const char *group) |
| 1158 { |
1154 { |
| 1159 char buf[BUF_LEN * 2]; |
1155 char buf[BUF_LEN * 2]; |
| 1160 int n; |
1156 int n; |
| 1161 |
1157 |
| 1162 n = g_snprintf(buf, sizeof(buf), "toc_remove_buddy"); |
1158 n = g_snprintf(buf, sizeof(buf), "toc_remove_buddy"); |
| 1170 } |
1166 } |
| 1171 sflap_send(g, buf, -1, TYPE_DATA); |
1167 sflap_send(g, buf, -1, TYPE_DATA); |
| 1172 toc_set_config(g); |
1168 toc_set_config(g); |
| 1173 } |
1169 } |
| 1174 |
1170 |
| 1175 static void toc_set_idle(struct gaim_connection *g, int time) |
1171 static void toc_set_idle(GaimConnection *g, int time) |
| 1176 { |
1172 { |
| 1177 char buf[BUF_LEN * 2]; |
1173 char buf[BUF_LEN * 2]; |
| 1178 g_snprintf(buf, sizeof(buf), "toc_set_idle %d", time); |
1174 g_snprintf(buf, sizeof(buf), "toc_set_idle %d", time); |
| 1179 sflap_send(g, buf, -1, TYPE_DATA); |
1175 sflap_send(g, buf, -1, TYPE_DATA); |
| 1180 } |
1176 } |
| 1181 |
1177 |
| 1182 static void toc_warn(struct gaim_connection *g, char *name, int anon) |
1178 static void toc_warn(GaimConnection *g, char *name, int anon) |
| 1183 { |
1179 { |
| 1184 char send[BUF_LEN * 2]; |
1180 char send[BUF_LEN * 2]; |
| 1185 g_snprintf(send, 255, "toc_evil %s %s", name, ((anon) ? "anon" : "norm")); |
1181 g_snprintf(send, 255, "toc_evil %s %s", name, ((anon) ? "anon" : "norm")); |
| 1186 sflap_send(g, send, -1, TYPE_DATA); |
1182 sflap_send(g, send, -1, TYPE_DATA); |
| 1187 } |
1183 } |
| 1188 |
1184 |
| 1189 static GList *toc_chat_info(struct gaim_connection *gc) |
1185 static GList *toc_chat_info(GaimConnection *gc) |
| 1190 { |
1186 { |
| 1191 GList *m = NULL; |
1187 GList *m = NULL; |
| 1192 struct proto_chat_entry *pce; |
1188 struct proto_chat_entry *pce; |
| 1193 |
1189 |
| 1194 pce = g_new0(struct proto_chat_entry, 1); |
1190 pce = g_new0(struct proto_chat_entry, 1); |
| 1224 } |
1220 } |
| 1225 |
1221 |
| 1226 sflap_send(g, buf, -1, TYPE_DATA); |
1222 sflap_send(g, buf, -1, TYPE_DATA); |
| 1227 } |
1223 } |
| 1228 |
1224 |
| 1229 static void toc_chat_invite(struct gaim_connection *g, int id, const char *message, const char *name) |
1225 static void toc_chat_invite(GaimConnection *g, int id, const char *message, const char *name) |
| 1230 { |
1226 { |
| 1231 char buf[BUF_LONG]; |
1227 char buf[BUF_LONG]; |
| 1232 g_snprintf(buf, sizeof(buf) / 2, "toc_chat_invite %d \"%s\" %s", id, |
1228 g_snprintf(buf, sizeof(buf) / 2, "toc_chat_invite %d \"%s\" %s", id, |
| 1233 message ? message : "", normalize(name)); |
1229 message ? message : "", normalize(name)); |
| 1234 sflap_send(g, buf, -1, TYPE_DATA); |
1230 sflap_send(g, buf, -1, TYPE_DATA); |
| 1235 } |
1231 } |
| 1236 |
1232 |
| 1237 static void toc_chat_leave(struct gaim_connection *g, int id) |
1233 static void toc_chat_leave(GaimConnection *g, int id) |
| 1238 { |
1234 { |
| 1239 GSList *bcs = g->buddy_chats; |
1235 GSList *bcs = g->buddy_chats; |
| 1240 struct gaim_conversation *b = NULL; |
1236 struct gaim_conversation *b = NULL; |
| 1241 char buf[BUF_LEN * 2]; |
1237 char buf[BUF_LEN * 2]; |
| 1242 |
1238 |
| 1259 g_snprintf(buf, 255, "toc_chat_leave %d", id); |
1255 g_snprintf(buf, 255, "toc_chat_leave %d", id); |
| 1260 sflap_send(g, buf, -1, TYPE_DATA); |
1256 sflap_send(g, buf, -1, TYPE_DATA); |
| 1261 } |
1257 } |
| 1262 } |
1258 } |
| 1263 |
1259 |
| 1264 static void toc_chat_whisper(struct gaim_connection *g, int id, char *who, char *message) |
1260 static void toc_chat_whisper(GaimConnection *g, int id, char *who, char *message) |
| 1265 { |
1261 { |
| 1266 char buf2[BUF_LEN * 2]; |
1262 char buf2[BUF_LEN * 2]; |
| 1267 escape_text(message); |
1263 escape_text(message); |
| 1268 g_snprintf(buf2, sizeof(buf2), "toc_chat_whisper %d %s \"%s\"", id, normalize(who), message); |
1264 g_snprintf(buf2, sizeof(buf2), "toc_chat_whisper %d %s \"%s\"", id, normalize(who), message); |
| 1269 sflap_send(g, buf2, -1, TYPE_DATA); |
1265 sflap_send(g, buf2, -1, TYPE_DATA); |
| 1270 } |
1266 } |
| 1271 |
1267 |
| 1272 static int toc_chat_send(struct gaim_connection *g, int id, char *message) |
1268 static int toc_chat_send(GaimConnection *g, int id, char *message) |
| 1273 { |
1269 { |
| 1274 char buf[BUF_LEN * 2]; |
1270 char buf[BUF_LEN * 2]; |
| 1275 escape_text(message); |
1271 escape_text(message); |
| 1276 if (strlen(message) > 2000) |
1272 if (strlen(message) > 2000) |
| 1277 return -E2BIG; |
1273 return -E2BIG; |
| 1278 g_snprintf(buf, sizeof(buf), "toc_chat_send %d \"%s\"", id, message); |
1274 g_snprintf(buf, sizeof(buf), "toc_chat_send %d \"%s\"", id, message); |
| 1279 sflap_send(g, buf, -1, TYPE_DATA); |
1275 sflap_send(g, buf, -1, TYPE_DATA); |
| 1280 return 0; |
1276 return 0; |
| 1281 } |
1277 } |
| 1282 |
1278 |
| 1283 static void toc_keepalive(struct gaim_connection *gc) |
1279 static void toc_keepalive(GaimConnection *gc) |
| 1284 { |
1280 { |
| 1285 sflap_send(gc, "", 0, TYPE_KEEPALIVE); |
1281 sflap_send(gc, "", 0, TYPE_KEEPALIVE); |
| 1286 } |
1282 } |
| 1287 |
1283 |
| 1288 static const char *toc_list_icon(struct gaim_account *a, struct buddy *b) |
1284 static const char *toc_list_icon(GaimAccount *a, struct buddy *b) |
| 1289 { |
1285 { |
| 1290 return "aim"; |
1286 return "aim"; |
| 1291 } |
1287 } |
| 1292 |
1288 |
| 1293 static void toc_list_emblems(struct buddy *b, char **se, char **sw, char **nw, char **ne) |
1289 static void toc_list_emblems(struct buddy *b, char **se, char **sw, char **nw, char **ne) |
| 1326 m = g_list_append(m, pbm); |
1322 m = g_list_append(m, pbm); |
| 1327 |
1323 |
| 1328 return m; |
1324 return m; |
| 1329 } |
1325 } |
| 1330 |
1326 |
| 1331 static void toc_add_permit(struct gaim_connection *gc, const char *who) |
1327 static void toc_add_permit(GaimConnection *gc, const char *who) |
| 1332 { |
1328 { |
| 1333 char buf2[BUF_LEN * 2]; |
1329 char buf2[BUF_LEN * 2]; |
| 1334 if (gc->account->permdeny != 3) |
1330 if (gc->account->perm_deny != 3) |
| 1335 return; |
1331 return; |
| 1336 g_snprintf(buf2, sizeof(buf2), "toc_add_permit %s", normalize(who)); |
1332 g_snprintf(buf2, sizeof(buf2), "toc_add_permit %s", normalize(who)); |
| 1337 sflap_send(gc, buf2, -1, TYPE_DATA); |
1333 sflap_send(gc, buf2, -1, TYPE_DATA); |
| 1338 toc_set_config(gc); |
1334 toc_set_config(gc); |
| 1339 } |
1335 } |
| 1340 |
1336 |
| 1341 static void toc_add_deny(struct gaim_connection *gc, const char *who) |
1337 static void toc_add_deny(GaimConnection *gc, const char *who) |
| 1342 { |
1338 { |
| 1343 char buf2[BUF_LEN * 2]; |
1339 char buf2[BUF_LEN * 2]; |
| 1344 if (gc->account->permdeny != 4) |
1340 if (gc->account->perm_deny != 4) |
| 1345 return; |
1341 return; |
| 1346 g_snprintf(buf2, sizeof(buf2), "toc_add_deny %s", normalize(who)); |
1342 g_snprintf(buf2, sizeof(buf2), "toc_add_deny %s", normalize(who)); |
| 1347 sflap_send(gc, buf2, -1, TYPE_DATA); |
1343 sflap_send(gc, buf2, -1, TYPE_DATA); |
| 1348 toc_set_config(gc); |
1344 toc_set_config(gc); |
| 1349 } |
1345 } |
| 1350 |
1346 |
| 1351 static void toc_set_permit_deny(struct gaim_connection *gc) |
1347 static void toc_set_permit_deny(GaimConnection *gc) |
| 1352 { |
1348 { |
| 1353 char buf2[BUF_LEN * 2]; |
1349 char buf2[BUF_LEN * 2]; |
| 1354 GSList *list; |
1350 GSList *list; |
| 1355 int at; |
1351 int at; |
| 1356 |
1352 |
| 1357 switch (gc->account->permdeny) { |
1353 switch (gc->account->perm_deny) { |
| 1358 case 1: |
1354 case 1: |
| 1359 /* permit all, deny none. to get here reliably we need to have been in permit |
1355 /* permit all, deny none. to get here reliably we need to have been in permit |
| 1360 * mode, and send an empty toc_add_deny message, which will switch us to deny none */ |
1356 * mode, and send an empty toc_add_deny message, which will switch us to deny none */ |
| 1361 g_snprintf(buf2, sizeof(buf2), "toc_add_permit "); |
1357 g_snprintf(buf2, sizeof(buf2), "toc_add_permit "); |
| 1362 sflap_send(gc, buf2, -1, TYPE_DATA); |
1358 sflap_send(gc, buf2, -1, TYPE_DATA); |
| 1980 g_snprintf(buf, sizeof(buf), |
1976 g_snprintf(buf, sizeof(buf), |
| 1981 ngettext( |
1977 ngettext( |
| 1982 "%s requests %s to accept %d file: %s (%.2f %s)%s%s", |
1978 "%s requests %s to accept %d file: %s (%.2f %s)%s%s", |
| 1983 "%s requests %s to accept %d files: %s (%.2f %s)%s%s", |
1979 "%s requests %s to accept %d files: %s (%.2f %s)%s%s", |
| 1984 ft->files), |
1980 ft->files), |
| 1985 ft->user, ft->gc->username, ft->files, |
1981 ft->user, gaim_account_get_username(ft->gc->account), ft->files, |
| 1986 ft->filename, size, sizes[index], (ft->message) ? "\n" : "", |
1982 ft->filename, size, sizes[index], (ft->message) ? "\n" : "", |
| 1987 (ft->message) ? ft->message : ""); |
1983 (ft->message) ? ft->message : ""); |
| 1988 } else { |
1984 } else { |
| 1989 g_snprintf(buf, sizeof(buf), _("%s requests you to send them a file"), ft->user); |
1985 g_snprintf(buf, sizeof(buf), _("%s requests you to send them a file"), ft->user); |
| 1990 } |
1986 } |