Mercurial > pidgin
comparison src/protocols/oscar/oscar.c @ 3694:e941bfbacf7c
[gaim-migrate @ 3824]
Adds an option for unread mail notification for AIM over oscar. Yippy.
This involves making a connection to the email AIM servers (parallel to
chatnav, bos, auth, ads, etc.). Also added were functions n' stuff to
handle getting mail status updates.
AIM does this in a very silly way. They only tell you how many messages
you have when you sign on, so I had to change connection_has_mail so it
will just say "bleh has new mail," without saying the number of new
messages.
Also, I haven't really looked into having you auto-login to webmail,
though it is possible. This is good for now.
Oh, and since I'm sure people will ask... AIM screen names come with an
email account @netscape.net. You have to sign in to netscape.net to
activate it.
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Mon, 14 Oct 2002 07:47:51 +0000 |
parents | ae72be911db5 |
children | da6e3c984985 |
comparison
equal
deleted
inserted
replaced
3693:2d1b14529fa2 | 3694:e941bfbacf7c |
---|---|
106 aim_session_t *sess; | 106 aim_session_t *sess; |
107 aim_conn_t *conn; | 107 aim_conn_t *conn; |
108 | 108 |
109 guint cnpa; | 109 guint cnpa; |
110 guint paspa; | 110 guint paspa; |
111 guint emlpa; | |
111 | 112 |
112 GSList *create_rooms; | 113 GSList *create_rooms; |
113 | 114 |
114 gboolean conf; | 115 gboolean conf; |
115 gboolean reqemail; | 116 gboolean reqemail; |
342 static int gaim_chatnav_info (aim_session_t *, aim_frame_t *, ...); | 343 static int gaim_chatnav_info (aim_session_t *, aim_frame_t *, ...); |
343 static int gaim_chat_join (aim_session_t *, aim_frame_t *, ...); | 344 static int gaim_chat_join (aim_session_t *, aim_frame_t *, ...); |
344 static int gaim_chat_leave (aim_session_t *, aim_frame_t *, ...); | 345 static int gaim_chat_leave (aim_session_t *, aim_frame_t *, ...); |
345 static int gaim_chat_info_update (aim_session_t *, aim_frame_t *, ...); | 346 static int gaim_chat_info_update (aim_session_t *, aim_frame_t *, ...); |
346 static int gaim_chat_incoming_msg(aim_session_t *, aim_frame_t *, ...); | 347 static int gaim_chat_incoming_msg(aim_session_t *, aim_frame_t *, ...); |
348 static int gaim_email_parseupdate(aim_session_t *, aim_frame_t *, ...); | |
347 static int gaim_parse_msgack (aim_session_t *, aim_frame_t *, ...); | 349 static int gaim_parse_msgack (aim_session_t *, aim_frame_t *, ...); |
348 static int gaim_parse_ratechange (aim_session_t *, aim_frame_t *, ...); | 350 static int gaim_parse_ratechange (aim_session_t *, aim_frame_t *, ...); |
349 static int gaim_parse_evilnotify (aim_session_t *, aim_frame_t *, ...); | 351 static int gaim_parse_evilnotify (aim_session_t *, aim_frame_t *, ...); |
350 static int gaim_parse_searcherror(aim_session_t *, aim_frame_t *, ...); | 352 static int gaim_parse_searcherror(aim_session_t *, aim_frame_t *, ...); |
351 static int gaim_parse_searchreply(aim_session_t *, aim_frame_t *, ...); | 353 static int gaim_parse_searchreply(aim_session_t *, aim_frame_t *, ...); |
352 static int gaim_bosrights (aim_session_t *, aim_frame_t *, ...); | 354 static int gaim_bosrights (aim_session_t *, aim_frame_t *, ...); |
353 static int conninitdone_bos (aim_session_t *, aim_frame_t *, ...); | 355 static int conninitdone_bos (aim_session_t *, aim_frame_t *, ...); |
354 static int conninitdone_admin (aim_session_t *, aim_frame_t *, ...); | 356 static int conninitdone_admin (aim_session_t *, aim_frame_t *, ...); |
355 static int conninitdone_chat (aim_session_t *, aim_frame_t *, ...); | 357 static int conninitdone_chat (aim_session_t *, aim_frame_t *, ...); |
356 static int conninitdone_chatnav (aim_session_t *, aim_frame_t *, ...); | 358 static int conninitdone_chatnav (aim_session_t *, aim_frame_t *, ...); |
359 static int conninitdone_email (aim_session_t *, aim_frame_t *, ...); | |
357 static int gaim_parse_msgerr (aim_session_t *, aim_frame_t *, ...); | 360 static int gaim_parse_msgerr (aim_session_t *, aim_frame_t *, ...); |
358 static int gaim_parse_mtn (aim_session_t *, aim_frame_t *, ...); | 361 static int gaim_parse_mtn (aim_session_t *, aim_frame_t *, ...); |
359 static int gaim_parse_locaterights(aim_session_t *, aim_frame_t *, ...); | 362 static int gaim_parse_locaterights(aim_session_t *, aim_frame_t *, ...); |
360 static int gaim_parse_buddyrights(aim_session_t *, aim_frame_t *, ...); | 363 static int gaim_parse_buddyrights(aim_session_t *, aim_frame_t *, ...); |
361 static int gaim_parse_locerr (aim_session_t *, aim_frame_t *, ...); | 364 static int gaim_parse_locerr (aim_session_t *, aim_frame_t *, ...); |
533 if (odata->paspa > 0) | 536 if (odata->paspa > 0) |
534 gaim_input_remove(odata->paspa); | 537 gaim_input_remove(odata->paspa); |
535 odata->paspa = 0; | 538 odata->paspa = 0; |
536 debug_printf("removing authconn input watcher\n"); | 539 debug_printf("removing authconn input watcher\n"); |
537 aim_conn_kill(odata->sess, &conn); | 540 aim_conn_kill(odata->sess, &conn); |
541 } else if (conn->type == AIM_CONN_TYPE_EMAIL) { | |
542 if (odata->emlpa > 0) | |
543 gaim_input_remove(odata->emlpa); | |
544 odata->emlpa = 0; | |
545 debug_printf("removing email input watcher\n"); | |
546 aim_conn_kill(odata->sess, &conn); | |
538 } else if (conn->type == AIM_CONN_TYPE_RENDEZVOUS) { | 547 } else if (conn->type == AIM_CONN_TYPE_RENDEZVOUS) { |
539 if (conn->subtype == AIM_CONN_SUBTYPE_OFT_DIRECTIM) | 548 if (conn->subtype == AIM_CONN_SUBTYPE_OFT_DIRECTIM) |
540 gaim_directim_disconnect(odata->sess, conn); | 549 gaim_directim_disconnect(odata->sess, conn); |
541 else if (conn->subtype == AIM_CONN_SUBTYPE_OFT_SENDFILE) { | 550 else if (conn->subtype == AIM_CONN_SUBTYPE_OFT_SENDFILE) { |
542 struct oscar_file_transfer *oft = find_oft_by_conn(gc, conn); | 551 struct oscar_file_transfer *oft = find_oft_by_conn(gc, conn); |
717 gaim_input_remove(gc->inpa); | 726 gaim_input_remove(gc->inpa); |
718 if (odata->cnpa > 0) | 727 if (odata->cnpa > 0) |
719 gaim_input_remove(odata->cnpa); | 728 gaim_input_remove(odata->cnpa); |
720 if (odata->paspa > 0) | 729 if (odata->paspa > 0) |
721 gaim_input_remove(odata->paspa); | 730 gaim_input_remove(odata->paspa); |
731 if (odata->emlpa > 0) | |
732 gaim_input_remove(odata->emlpa); | |
722 aim_session_kill(odata->sess); | 733 aim_session_kill(odata->sess); |
723 g_free(odata->sess); | 734 g_free(odata->sess); |
724 odata->sess = NULL; | 735 odata->sess = NULL; |
725 g_free(gc->proto_data); | 736 g_free(gc->proto_data); |
726 gc->proto_data = NULL; | 737 gc->proto_data = NULL; |
1132 aim_chatnav_reqrights(sess, fr->conn); | 1143 aim_chatnav_reqrights(sess, fr->conn); |
1133 | 1144 |
1134 return 1; | 1145 return 1; |
1135 } | 1146 } |
1136 | 1147 |
1148 static int conninitdone_email(aim_session_t *sess, aim_frame_t *fr, ...) { | |
1149 | |
1150 aim_conn_addhandler(sess, fr->conn, 0x0018, 0x0001, gaim_parse_genericerr, 0); | |
1151 aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_EML, AIM_CB_EML_MAILSTATUS, gaim_email_parseupdate, 0); | |
1152 | |
1153 aim_email_sendcookies(sess, fr->conn); | |
1154 aim_email_activate(sess, fr->conn); | |
1155 aim_clientready(sess, fr->conn); | |
1156 | |
1157 return 1; | |
1158 } | |
1159 | |
1137 static void oscar_chatnav_connect(gpointer data, gint source, GaimInputCondition cond) { | 1160 static void oscar_chatnav_connect(gpointer data, gint source, GaimInputCondition cond) { |
1138 struct gaim_connection *gc = data; | 1161 struct gaim_connection *gc = data; |
1139 struct oscar_data *odata; | 1162 struct oscar_data *odata; |
1140 aim_session_t *sess; | 1163 aim_session_t *sess; |
1141 aim_conn_t *tstconn; | 1164 aim_conn_t *tstconn; |
1232 aim_conn_completeconnect(sess, ccon->conn); | 1255 aim_conn_completeconnect(sess, ccon->conn); |
1233 ccon->inpa = gaim_input_add(tstconn->fd, | 1256 ccon->inpa = gaim_input_add(tstconn->fd, |
1234 GAIM_INPUT_READ, | 1257 GAIM_INPUT_READ, |
1235 oscar_callback, tstconn); | 1258 oscar_callback, tstconn); |
1236 odata->oscar_chats = g_slist_append(odata->oscar_chats, ccon); | 1259 odata->oscar_chats = g_slist_append(odata->oscar_chats, ccon); |
1260 } | |
1261 | |
1262 static void oscar_email_connect(gpointer data, gint source, GaimInputCondition cond) { | |
1263 struct gaim_connection *gc = data; | |
1264 struct oscar_data *odata; | |
1265 aim_session_t *sess; | |
1266 aim_conn_t *tstconn; | |
1267 | |
1268 if (!g_slist_find(connections, gc)) { | |
1269 close(source); | |
1270 return; | |
1271 } | |
1272 | |
1273 odata = gc->proto_data; | |
1274 sess = odata->sess; | |
1275 tstconn = aim_getconn_type_all(sess, AIM_CONN_TYPE_EMAIL); | |
1276 | |
1277 if (source < 0) { | |
1278 aim_conn_kill(sess, &tstconn); | |
1279 debug_printf("unable to connect to email server\n"); | |
1280 return; | |
1281 } | |
1282 | |
1283 aim_conn_completeconnect(sess, tstconn); | |
1284 odata->emlpa = gaim_input_add(tstconn->fd, GAIM_INPUT_READ, oscar_callback, tstconn); | |
1285 debug_printf("email: connected\n"); | |
1237 } | 1286 } |
1238 | 1287 |
1239 /* Hrmph. I don't know how to make this look better. --mid */ | 1288 /* Hrmph. I don't know how to make this look better. --mid */ |
1240 static int gaim_handle_redirect(aim_session_t *sess, aim_frame_t *fr, ...) { | 1289 static int gaim_handle_redirect(aim_session_t *sess, aim_frame_t *fr, ...) { |
1241 va_list ap; | 1290 va_list ap; |
1340 } | 1389 } |
1341 aim_sendcookie(sess, tstconn, redir->cookie); | 1390 aim_sendcookie(sess, tstconn, redir->cookie); |
1342 debug_printf("Connected to chat room %s exchange %d\n", ccon->name, ccon->exchange); | 1391 debug_printf("Connected to chat room %s exchange %d\n", ccon->name, ccon->exchange); |
1343 } | 1392 } |
1344 break; | 1393 break; |
1394 | |
1395 case 0x0018: { /* email */ | |
1396 if (!(tstconn = aim_newconn(sess, AIM_CONN_TYPE_EMAIL, NULL))) { | |
1397 debug_printf("unable to connect to email server\n"); | |
1398 g_free(host); | |
1399 return 1; | |
1400 } | |
1401 aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNINITDONE, conninitdone_email, 0); | |
1402 | |
1403 tstconn->status |= AIM_CONN_STATUS_INPROGRESS; | |
1404 tstconn->fd = proxy_connect(host, port, oscar_email_connect, gc); | |
1405 if (tstconn->fd < 0) { | |
1406 aim_conn_kill(sess, &tstconn); | |
1407 debug_printf("unable to connect to email server\n"); | |
1408 g_free(host); | |
1409 return 1; | |
1410 } | |
1411 aim_sendcookie(sess, tstconn, redir->cookie); | |
1412 } break; | |
1413 | |
1345 default: /* huh? */ | 1414 default: /* huh? */ |
1346 debug_printf("got redirect for unknown service 0x%04x\n", redir->group); | 1415 debug_printf("got redirect for unknown service 0x%04x\n", redir->group); |
1347 break; | 1416 break; |
1348 } | 1417 } |
1349 | 1418 |
2763 g_free(tmp); | 2832 g_free(tmp); |
2764 | 2833 |
2765 return 1; | 2834 return 1; |
2766 } | 2835 } |
2767 | 2836 |
2837 static int gaim_email_parseupdate(aim_session_t *sess, aim_frame_t *fr, ...) { | |
2838 va_list ap; | |
2839 struct gaim_connection *gc = sess->aux_data; | |
2840 struct aim_emailinfo *emailinfo; | |
2841 | |
2842 va_start(ap, fr); | |
2843 emailinfo = va_arg(ap, struct aim_emailinfo *); | |
2844 va_end(ap); | |
2845 | |
2846 while (emailinfo) { | |
2847 debug_printf("Got email info. webmail address for screenname@%s is %s, new email: %hd, number new: %d, flag is %d\n", emailinfo->domain, emailinfo->url, emailinfo->unread, emailinfo->nummsgs, emailinfo->flag); | |
2848 if (emailinfo->unread) | |
2849 connection_has_mail(gc, emailinfo->nummsgs ? emailinfo->nummsgs : -1, NULL, NULL, emailinfo->url); | |
2850 else | |
2851 connection_has_mail(gc, 0, NULL, NULL, emailinfo->url); | |
2852 emailinfo = emailinfo->next; | |
2853 } | |
2854 | |
2855 return 1; | |
2856 } | |
2857 | |
2768 /* | 2858 /* |
2769 * Recieved in response to an IM sent with the AIM_IMFLAGS_ACK option. | 2859 * Recieved in response to an IM sent with the AIM_IMFLAGS_ACK option. |
2770 */ | 2860 */ |
2771 static int gaim_parse_msgack(aim_session_t *sess, aim_frame_t *fr, ...) { | 2861 static int gaim_parse_msgack(aim_session_t *sess, aim_frame_t *fr, ...) { |
2772 va_list ap; | 2862 va_list ap; |
3023 aim_clientready(sess, fr->conn); | 3113 aim_clientready(sess, fr->conn); |
3024 | 3114 |
3025 aim_icq_reqofflinemsgs(sess); | 3115 aim_icq_reqofflinemsgs(sess); |
3026 | 3116 |
3027 aim_reqservice(sess, fr->conn, AIM_CONN_TYPE_CHATNAV); | 3117 aim_reqservice(sess, fr->conn, AIM_CONN_TYPE_CHATNAV); |
3118 aim_reqservice(sess, fr->conn, AIM_CONN_TYPE_EMAIL); | |
3028 | 3119 |
3029 if (!odata->icq) { | 3120 if (!odata->icq) { |
3030 debug_printf("ssi: requesting ssi list\n"); | 3121 debug_printf("ssi: requesting ssi list\n"); |
3031 aim_ssi_reqrights(sess, fr->conn); | 3122 aim_ssi_reqrights(sess, fr->conn); |
3032 aim_ssi_reqdata(sess, fr->conn, sess->ssi.timestamp, sess->ssi.revision); | 3123 aim_ssi_reqdata(sess, fr->conn, sess->ssi.timestamp, sess->ssi.revision); |
4638 static struct prpl *my_protocol = NULL; | 4729 static struct prpl *my_protocol = NULL; |
4639 | 4730 |
4640 G_MODULE_EXPORT void oscar_init(struct prpl *ret) { | 4731 G_MODULE_EXPORT void oscar_init(struct prpl *ret) { |
4641 struct proto_user_opt *puo; | 4732 struct proto_user_opt *puo; |
4642 ret->protocol = PROTO_OSCAR; | 4733 ret->protocol = PROTO_OSCAR; |
4643 ret->options = OPT_PROTO_BUDDY_ICON | OPT_PROTO_IM_IMAGE; | 4734 ret->options = OPT_PROTO_MAIL_CHECK | OPT_PROTO_BUDDY_ICON | OPT_PROTO_IM_IMAGE; |
4644 ret->name = g_strdup("Oscar"); | 4735 ret->name = g_strdup("Oscar"); |
4645 ret->list_icon = oscar_list_icon; | 4736 ret->list_icon = oscar_list_icon; |
4646 ret->away_states = oscar_away_states; | 4737 ret->away_states = oscar_away_states; |
4647 ret->actions = oscar_actions; | 4738 ret->actions = oscar_actions; |
4648 ret->do_action = oscar_do_action; | 4739 ret->do_action = oscar_do_action; |