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;