comparison libpurple/protocols/sametime/sametime.c @ 32724:44fc11beefab

propagate from branch 'im.pidgin.pidgin.2.x.y' (head b9c74c3f836a7a1a64710fc8244c9ec1f3f21b97) to branch 'im.pidgin.pidgin' (head fcd1b3766ec3998ed589bfddde2bffefd9d99e65)
author Mark Doliner <mark@kingant.net>
date Wed, 05 Oct 2011 07:33:20 +0000
parents 714e25ef2550 f75041cb3fec
children d9434361a5cb
comparison
equal deleted inserted replaced
32723:952120a8ee02 32724:44fc11beefab
195 /** handler IDs from g_log_set_handler in mw_plugin_init */ 195 /** handler IDs from g_log_set_handler in mw_plugin_init */
196 static guint log_handler[2] = { 0, 0 }; 196 static guint log_handler[2] = { 0, 0 };
197 197
198 198
199 /** the purple plugin data. 199 /** the purple plugin data.
200 available as gc->proto_data and mwSession_getClientData */ 200 available as purple_connection_get_protocol_data(gc) and mwSession_getClientData */
201 struct mwPurplePluginData { 201 struct mwPurplePluginData {
202 struct mwSession *session; 202 struct mwSession *session;
203 203
204 struct mwServiceAware *srvc_aware; 204 struct mwServiceAware *srvc_aware;
205 struct mwServiceConference *srvc_conf; 205 struct mwServiceConference *srvc_conf;
318 static struct mwSession *gc_to_session(PurpleConnection *gc) { 318 static struct mwSession *gc_to_session(PurpleConnection *gc) {
319 struct mwPurplePluginData *pd; 319 struct mwPurplePluginData *pd;
320 320
321 g_return_val_if_fail(gc != NULL, NULL); 321 g_return_val_if_fail(gc != NULL, NULL);
322 322
323 pd = gc->proto_data; 323 pd = purple_connection_get_protocol_data(gc);
324 g_return_val_if_fail(pd != NULL, NULL); 324 g_return_val_if_fail(pd != NULL, NULL);
325 325
326 return pd->session; 326 return pd->session;
327 } 327 }
328 328
411 } else if(len > 0) { 411 } else if(len > 0) {
412 gchar *tmp = g_strdup_printf(_("Lost connection with server: %s"), 412 gchar *tmp = g_strdup_printf(_("Lost connection with server: %s"),
413 g_strerror(errno)); 413 g_strerror(errno));
414 DEBUG_ERROR("write returned %" G_GSSIZE_FORMAT ", %" G_GSIZE_FORMAT 414 DEBUG_ERROR("write returned %" G_GSSIZE_FORMAT ", %" G_GSIZE_FORMAT
415 " bytes left unwritten\n", ret, len); 415 " bytes left unwritten\n", ret, len);
416 purple_connection_error_reason(pd->gc, 416 purple_connection_error(pd->gc,
417 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, 417 PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
418 tmp); 418 tmp);
419 g_free(tmp); 419 g_free(tmp);
420 420
421 #if 0 421 #if 0
497 const char *status = MW_STATE_ACTIVE; 497 const char *status = MW_STATE_ACTIVE;
498 498
499 gc = mwAwareList_getClientData(list); 499 gc = mwAwareList_getClientData(list);
500 acct = purple_connection_get_account(gc); 500 acct = purple_connection_get_account(gc);
501 501
502 pd = gc->proto_data; 502 pd = purple_connection_get_protocol_data(gc);
503 idle = aware->status.time; 503 idle = aware->status.time;
504 stat = aware->status.status; 504 stat = aware->status.status;
505 id = aware->id.user; 505 id = aware->id.user;
506 506
507 if(idle) { 507 if(idle) {
849 /** ensure that a PurpleBuddy exists in the group with data 849 /** ensure that a PurpleBuddy exists in the group with data
850 appropriately matching the st user entry from the st list */ 850 appropriately matching the st user entry from the st list */
851 static PurpleBuddy *buddy_ensure(PurpleConnection *gc, PurpleGroup *group, 851 static PurpleBuddy *buddy_ensure(PurpleConnection *gc, PurpleGroup *group,
852 struct mwSametimeUser *stuser) { 852 struct mwSametimeUser *stuser) {
853 853
854 struct mwPurplePluginData *pd = gc->proto_data; 854 struct mwPurplePluginData *pd = purple_connection_get_protocol_data(gc);
855 PurpleBuddy *buddy; 855 PurpleBuddy *buddy;
856 PurpleAccount *acct = purple_connection_get_account(gc); 856 PurpleAccount *acct = purple_connection_get_account(gc);
857 857
858 const char *id = mwSametimeUser_getUser(stuser); 858 const char *id = mwSametimeUser_getUser(stuser);
859 const char *name = mwSametimeUser_getShortName(stuser); 859 const char *name = mwSametimeUser_getShortName(stuser);
860 const char *alias = mwSametimeUser_getAlias(stuser); 860 const char *alias = mwSametimeUser_getAlias(stuser);
861 enum mwSametimeUserType type = mwSametimeUser_getType(stuser); 861 enum mwSametimeUserType type = mwSametimeUser_getType(stuser);
862 862
863 g_return_val_if_fail(id != NULL, NULL); 863 g_return_val_if_fail(id != NULL, NULL);
864 g_return_val_if_fail(strlen(id) > 0, NULL); 864 g_return_val_if_fail(*id, NULL);
865 865
866 buddy = purple_find_buddy_in_group(acct, id, group); 866 buddy = purple_find_buddy_in_group(acct, id, group);
867 if(! buddy) { 867 if(! buddy) {
868 buddy = purple_buddy_new(acct, id, alias); 868 buddy = purple_buddy_new(acct, id, alias);
869 869
971 purple_blist_node_set_string(gn, GROUP_KEY_NAME, name); 971 purple_blist_node_set_string(gn, GROUP_KEY_NAME, name);
972 purple_blist_node_set_int(gn, GROUP_KEY_TYPE, type); 972 purple_blist_node_set_int(gn, GROUP_KEY_TYPE, type);
973 973
974 if(type == mwSametimeGroup_DYNAMIC) { 974 if(type == mwSametimeGroup_DYNAMIC) {
975 purple_blist_node_set_string(gn, GROUP_KEY_OWNER, owner); 975 purple_blist_node_set_string(gn, GROUP_KEY_OWNER, owner);
976 group_add(gc->proto_data, group); 976 group_add(purple_connection_get_protocol_data(gc), group);
977 } 977 }
978 978
979 return group; 979 return group;
980 } 980 }
981 981
1401 } 1401 }
1402 } 1402 }
1403 } 1403 }
1404 1404
1405 if(add_buds) { 1405 if(add_buds) {
1406 purple_account_add_buddies(acct, add_buds); 1406 purple_account_add_buddies(acct, add_buds, NULL);
1407 g_list_free(add_buds); 1407 g_list_free(add_buds);
1408 } 1408 }
1409 } 1409 }
1410 1410
1411 1411
1616 break; 1616 break;
1617 1617
1618 default: 1618 default:
1619 reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR; 1619 reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR;
1620 } 1620 }
1621 purple_connection_error_reason(gc, reason, err); 1621 purple_connection_error(gc, reason, err);
1622 g_free(err); 1622 g_free(err);
1623 } 1623 }
1624 break; 1624 break;
1625 1625
1626 case mwSession_STOPPED: 1626 case mwSession_STOPPED:
1765 pd->gc->inpa = 0; 1765 pd->gc->inpa = 0;
1766 } 1766 }
1767 1767
1768 if(! ret) { 1768 if(! ret) {
1769 DEBUG_INFO("connection reset\n"); 1769 DEBUG_INFO("connection reset\n");
1770 purple_connection_error_reason(pd->gc, 1770 purple_connection_error(pd->gc,
1771 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, 1771 PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
1772 _("Server closed the connection")); 1772 _("Server closed the connection"));
1773 1773
1774 } else if(ret < 0) { 1774 } else if(ret < 0) {
1775 const gchar *err_str = g_strerror(err); 1775 const gchar *err_str = g_strerror(err);
1776 char *msg = NULL; 1776 char *msg = NULL;
1777 1777
1778 DEBUG_INFO("error in read callback: %s\n", err_str); 1778 DEBUG_INFO("error in read callback: %s\n", err_str);
1779 1779
1780 msg = g_strdup_printf(_("Lost connection with server: %s"), err_str); 1780 msg = g_strdup_printf(_("Lost connection with server: %s"), err_str);
1781 purple_connection_error_reason(pd->gc, 1781 purple_connection_error(pd->gc,
1782 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, 1782 PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
1783 msg); 1783 msg);
1784 g_free(msg); 1784 g_free(msg);
1785 } 1785 }
1786 } 1786 }
1802 1802
1803 } else { 1803 } else {
1804 /* this is a regular connect, error out */ 1804 /* this is a regular connect, error out */
1805 gchar *tmp = g_strdup_printf(_("Unable to connect: %s"), 1805 gchar *tmp = g_strdup_printf(_("Unable to connect: %s"),
1806 error_message); 1806 error_message);
1807 purple_connection_error_reason(pd->gc, 1807 purple_connection_error(pd->gc,
1808 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, 1808 PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
1809 tmp); 1809 tmp);
1810 g_free(tmp); 1810 g_free(tmp);
1811 } 1811 }
1812 1812
2142 #define MW_FT_LEN (BUF_LONG * 2) 2142 #define MW_FT_LEN (BUF_LONG * 2)
2143 2143
2144 2144
2145 static void ft_incoming_cancel(PurpleXfer *xfer) { 2145 static void ft_incoming_cancel(PurpleXfer *xfer) {
2146 /* incoming transfer rejected or cancelled in-progress */ 2146 /* incoming transfer rejected or cancelled in-progress */
2147 struct mwFileTransfer *ft = xfer->data; 2147 struct mwFileTransfer *ft = purple_xfer_get_protocol_data(xfer);
2148 if(ft) mwFileTransfer_reject(ft); 2148 if(ft) mwFileTransfer_reject(ft);
2149 } 2149 }
2150 2150
2151 2151
2152 static void ft_incoming_init(PurpleXfer *xfer) { 2152 static void ft_incoming_init(PurpleXfer *xfer) {
2158 */ 2158 */
2159 2159
2160 struct mwFileTransfer *ft; 2160 struct mwFileTransfer *ft;
2161 FILE *fp; 2161 FILE *fp;
2162 2162
2163 ft = xfer->data; 2163 ft = purple_xfer_get_protocol_data(xfer);
2164 2164
2165 fp = g_fopen(xfer->local_filename, "wb"); 2165 fp = g_fopen(purple_xfer_get_local_filename(xfer), "wb");
2166 if(! fp) { 2166 if(! fp) {
2167 mwFileTransfer_cancel(ft); 2167 mwFileTransfer_cancel(ft);
2168 return; 2168 return;
2169 } 2169 }
2170 2170
2205 xfer = purple_xfer_new(acct, PURPLE_XFER_RECEIVE, who); 2205 xfer = purple_xfer_new(acct, PURPLE_XFER_RECEIVE, who);
2206 if (xfer) 2206 if (xfer)
2207 { 2207 {
2208 purple_xfer_ref(xfer); 2208 purple_xfer_ref(xfer);
2209 mwFileTransfer_setClientData(ft, xfer, (GDestroyNotify) purple_xfer_unref); 2209 mwFileTransfer_setClientData(ft, xfer, (GDestroyNotify) purple_xfer_unref);
2210 xfer->data = ft; 2210 purple_xfer_set_protocol_data(xfer, ft);
2211 2211
2212 purple_xfer_set_init_fnc(xfer, ft_incoming_init); 2212 purple_xfer_set_init_fnc(xfer, ft_incoming_init);
2213 purple_xfer_set_cancel_recv_fnc(xfer, ft_incoming_cancel); 2213 purple_xfer_set_cancel_recv_fnc(xfer, ft_incoming_cancel);
2214 purple_xfer_set_request_denied_fnc(xfer, ft_incoming_cancel); 2214 purple_xfer_set_request_denied_fnc(xfer, ft_incoming_cancel);
2215 2215
2234 if(rem < MW_FT_LEN) o.len = rem; 2234 if(rem < MW_FT_LEN) o.len = rem;
2235 2235
2236 if(fread(buf, (size_t) o.len, 1, fp)) { 2236 if(fread(buf, (size_t) o.len, 1, fp)) {
2237 2237
2238 /* calculate progress and display it */ 2238 /* calculate progress and display it */
2239 xfer->bytes_sent += o.len; 2239 purple_xfer_set_bytes_sent(xfer, purple_xfer_get_bytes_sent(xfer) + o.len);
2240 xfer->bytes_remaining -= o.len;
2241 purple_xfer_update_progress(xfer); 2240 purple_xfer_update_progress(xfer);
2242 2241
2243 mwFileTransfer_send(ft, &o); 2242 mwFileTransfer_send(ft, &o);
2244 2243
2245 } else { 2244 } else {
2267 mwFileTransfer_free(ft); 2266 mwFileTransfer_free(ft);
2268 g_return_if_reached(); 2267 g_return_if_reached();
2269 } 2268 }
2270 2269
2271 if(purple_xfer_get_type(xfer) == PURPLE_XFER_SEND) { 2270 if(purple_xfer_get_type(xfer) == PURPLE_XFER_SEND) {
2272 xfer->dest_fp = g_fopen(xfer->local_filename, "rb"); 2271 xfer->dest_fp = g_fopen(purple_xfer_get_local_filename(xfer), "rb");
2273 ft_send(ft, xfer->dest_fp); 2272 ft_send(ft, xfer->dest_fp);
2274 } 2273 }
2275 } 2274 }
2276 2275
2277 2276
2284 2283
2285 PurpleXfer *xfer; 2284 PurpleXfer *xfer;
2286 2285
2287 xfer = mwFileTransfer_getClientData(ft); 2286 xfer = mwFileTransfer_getClientData(ft);
2288 if(xfer) { 2287 if(xfer) {
2289 xfer->data = NULL; 2288 purple_xfer_set_protocol_data(xfer, NULL);
2290 2289
2291 if(! mwFileTransfer_getRemaining(ft)) { 2290 if(! mwFileTransfer_getRemaining(ft)) {
2292 purple_xfer_set_completed(xfer, TRUE); 2291 purple_xfer_set_completed(xfer, TRUE);
2293 purple_xfer_end(xfer); 2292 purple_xfer_end(xfer);
2294 2293
2337 purple_xfer_cancel_local(xfer); 2336 purple_xfer_cancel_local(xfer);
2338 return; 2337 return;
2339 } 2338 }
2340 2339
2341 /* update the progress */ 2340 /* update the progress */
2342 xfer->bytes_sent += data->len; 2341 purple_xfer_set_bytes_sent(xfer, purple_xfer_get_bytes_sent(xfer) + data->len);
2343 xfer->bytes_remaining -= data->len;
2344 purple_xfer_update_progress(xfer); 2342 purple_xfer_update_progress(xfer);
2345 2343
2346 /* let the other side know we got it, and to send some more */ 2344 /* let the other side know we got it, and to send some more */
2347 mwFileTransfer_ack(ft); 2345 mwFileTransfer_ack(ft);
2348 } 2346 }
2485 2483
2486 tmp = mwError(err); 2484 tmp = mwError(err);
2487 text = g_strconcat(_("Unable to send message: "), tmp, NULL); 2485 text = g_strconcat(_("Unable to send message: "), tmp, NULL);
2488 2486
2489 gconv = convo_get_gconv(conv); 2487 gconv = convo_get_gconv(conv);
2490 if(gconv && !purple_conv_present_error(idb->user, gconv->account, text)) { 2488 if(gconv && !purple_conv_present_error(idb->user, purple_conversation_get_account(gconv), text)) {
2491 2489
2492 g_free(text); 2490 g_free(text);
2493 text = g_strdup_printf(_("Unable to send message to %s:"), 2491 text = g_strdup_printf(_("Unable to send message to %s:"),
2494 (idb->user)? idb->user: "(unknown)"); 2492 (idb->user)? idb->user: "(unknown)");
2495 purple_notify_error(purple_account_get_connection(gconv->account), 2493 purple_notify_error(purple_account_get_connection(purple_conversation_get_account(gconv)),
2496 NULL, text, tmp); 2494 NULL, text, tmp);
2497 } 2495 }
2498 2496
2499 g_free(tmp); 2497 g_free(tmp);
2500 g_free(text); 2498 g_free(text);
3197 3195
3198 mwSession_addCipher(pd->session, mwCipher_new_RC2_40(pd->session)); 3196 mwSession_addCipher(pd->session, mwCipher_new_RC2_40(pd->session));
3199 mwSession_addCipher(pd->session, mwCipher_new_RC2_128(pd->session)); 3197 mwSession_addCipher(pd->session, mwCipher_new_RC2_128(pd->session));
3200 3198
3201 mwSession_setClientData(pd->session, pd, NULL); 3199 mwSession_setClientData(pd->session, pd, NULL);
3202 gc->proto_data = pd; 3200 purple_connection_set_protocol_data(gc, pd);
3203 3201
3204 return pd; 3202 return pd;
3205 } 3203 }
3206 3204
3207 3205
3208 static void mwPurplePluginData_free(struct mwPurplePluginData *pd) { 3206 static void mwPurplePluginData_free(struct mwPurplePluginData *pd) {
3209 g_return_if_fail(pd != NULL); 3207 g_return_if_fail(pd != NULL);
3210 3208
3211 pd->gc->proto_data = NULL; 3209 purple_connection_set_protocol_data(pd->gc, NULL);
3212 3210
3213 mwSession_removeService(pd->session, mwService_AWARE); 3211 mwSession_removeService(pd->session, mwService_AWARE);
3214 mwSession_removeService(pd->session, mwService_CONFERENCE); 3212 mwSession_removeService(pd->session, mwService_CONFERENCE);
3215 mwSession_removeService(pd->session, mwService_FILE_TRANSFER); 3213 mwSession_removeService(pd->session, mwService_FILE_TRANSFER);
3216 mwSession_removeService(pd->session, mwService_IM); 3214 mwSession_removeService(pd->session, mwService_IM);
3268 struct mwPurplePluginData *pd; 3266 struct mwPurplePluginData *pd;
3269 struct mwAwareIdBlock t = { mwAware_USER, (char *)purple_buddy_get_name(b), NULL }; 3267 struct mwAwareIdBlock t = { mwAware_USER, (char *)purple_buddy_get_name(b), NULL };
3270 const char *ret = NULL; 3268 const char *ret = NULL;
3271 3269
3272 if ((gc = purple_account_get_connection(purple_buddy_get_account(b))) 3270 if ((gc = purple_account_get_connection(purple_buddy_get_account(b)))
3273 && (pd = gc->proto_data)) 3271 && (pd = purple_connection_get_protocol_data(gc)))
3274 ret = mwServiceAware_getText(pd->srvc_aware, &t); 3272 ret = mwServiceAware_getText(pd->srvc_aware, &t);
3275 3273
3276 return (ret && g_utf8_validate(ret, -1, NULL)) ? g_markup_escape_text(ret, -1): NULL; 3274 return (ret && g_utf8_validate(ret, -1, NULL)) ? g_markup_escape_text(ret, -1): NULL;
3277 } 3275 }
3278 3276
3331 const char *message = NULL; 3329 const char *message = NULL;
3332 const char *status; 3330 const char *status;
3333 char *tmp; 3331 char *tmp;
3334 3332
3335 if ((gc = purple_account_get_connection(purple_buddy_get_account(b))) 3333 if ((gc = purple_account_get_connection(purple_buddy_get_account(b)))
3336 && (pd = gc->proto_data)) 3334 && (pd = purple_connection_get_protocol_data(gc)))
3337 message = mwServiceAware_getText(pd->srvc_aware, &idb); 3335 message = mwServiceAware_getText(pd->srvc_aware, &idb);
3338 3336
3339 status = status_text(b); 3337 status = status_text(b);
3340 3338
3341 if(message != NULL && g_utf8_validate(message, -1, NULL) && purple_utf8_strcasecmp(status, message)) { 3339 if(message != NULL && g_utf8_validate(message, -1, NULL) && purple_utf8_strcasecmp(status, message)) {
3342 tmp = g_markup_escape_text(message, -1); 3340 purple_notify_user_info_add_pair_plaintext(user_info, status, message);
3343 purple_notify_user_info_add_pair(user_info, status, tmp);
3344 g_free(tmp);
3345 3341
3346 } else { 3342 } else {
3347 purple_notify_user_info_add_pair(user_info, _("Status"), status); 3343 purple_notify_user_info_add_pair_plaintext(user_info, _("Status"), status);
3348 } 3344 }
3349 3345
3350 if(full && pd != NULL) { 3346 if(full && pd != NULL) {
3351 tmp = user_supports_text(pd->srvc_aware, purple_buddy_get_name(b)); 3347 tmp = user_supports_text(pd->srvc_aware, purple_buddy_get_name(b));
3352 if(tmp) { 3348 if(tmp) {
3353 purple_notify_user_info_add_pair(user_info, _("Supports"), tmp); 3349 purple_notify_user_info_add_pair_plaintext(user_info, _("Supports"), tmp);
3354 g_free(tmp); 3350 g_free(tmp);
3355 } 3351 }
3356 3352
3357 if(buddy_is_external(b)) { 3353 if(buddy_is_external(b)) {
3358 purple_notify_user_info_add_pair(user_info, NULL, _("External User")); 3354 purple_notify_user_info_add_pair_plaintext(user_info, NULL, _("External User"));
3359 } 3355 }
3360 } 3356 }
3361 } 3357 }
3362 3358
3363 static GList *mw_prpl_status_types(PurpleAccount *acct) 3359 static GList *mw_prpl_status_types(PurpleAccount *acct)
3410 struct mwConference *conf; 3406 struct mwConference *conf;
3411 struct mwIdBlock idb = { NULL, NULL }; 3407 struct mwIdBlock idb = { NULL, NULL };
3412 3408
3413 acct = purple_buddy_get_account(buddy); 3409 acct = purple_buddy_get_account(buddy);
3414 gc = purple_account_get_connection(acct); 3410 gc = purple_account_get_connection(acct);
3415 pd = gc->proto_data; 3411 pd = purple_connection_get_protocol_data(gc);
3416 srvc = pd->srvc_conf; 3412 srvc = pd->srvc_conf;
3417 3413
3418 f = purple_request_fields_get_field(fields, CHAT_KEY_TOPIC); 3414 f = purple_request_fields_get_field(fields, CHAT_KEY_TOPIC);
3419 topic = purple_request_field_string_get_value(f); 3415 topic = purple_request_field_string_get_value(f);
3420 3416
3576 g_return_if_fail(acct != NULL); 3572 g_return_if_fail(acct != NULL);
3577 3573
3578 gc = purple_account_get_connection(acct); 3574 gc = purple_account_get_connection(acct);
3579 g_return_if_fail(gc != NULL); 3575 g_return_if_fail(gc != NULL);
3580 3576
3581 pd = gc->proto_data; 3577 pd = purple_connection_get_protocol_data(gc);
3582 g_return_if_fail(pd != NULL); 3578 g_return_if_fail(pd != NULL);
3583 3579
3584 /* 3580 /*
3585 - get a list of all conferences on this session 3581 - get a list of all conferences on this session
3586 - if none, prompt to create one, and invite buddy to it 3582 - if none, prompt to create one, and invite buddy to it
3615 g_return_if_fail(acct != NULL); 3611 g_return_if_fail(acct != NULL);
3616 3612
3617 gc = purple_account_get_connection(acct); 3613 gc = purple_account_get_connection(acct);
3618 g_return_if_fail(gc != NULL); 3614 g_return_if_fail(gc != NULL);
3619 3615
3620 pd = gc->proto_data; 3616 pd = purple_connection_get_protocol_data(gc);
3621 g_return_if_fail(pd != NULL); 3617 g_return_if_fail(pd != NULL);
3622 3618
3623 rcpt_name = g_strdup_printf("@U %s", buddy->name); 3619 rcpt_name = g_strdup_printf("@U %s", buddy->name);
3624 rcpt = g_list_prepend(NULL, rcpt_name); 3620 rcpt = g_list_prepend(NULL, rcpt_name);
3625 3621
3768 } 3764 }
3769 3765
3770 purple_connection_update_progress(gc, _("Connecting"), 1, MW_CONNECT_STEPS); 3766 purple_connection_update_progress(gc, _("Connecting"), 1, MW_CONNECT_STEPS);
3771 3767
3772 if (purple_proxy_connect(gc, account, host, port, connect_cb, pd) == NULL) { 3768 if (purple_proxy_connect(gc, account, host, port, connect_cb, pd) == NULL) {
3773 purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, 3769 purple_connection_error(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
3774 _("Unable to connect")); 3770 _("Unable to connect"));
3775 } 3771 }
3776 } 3772 }
3777 3773
3778 3774
3779 static void mw_prpl_close(PurpleConnection *gc) { 3775 static void mw_prpl_close(PurpleConnection *gc) {
3780 struct mwPurplePluginData *pd; 3776 struct mwPurplePluginData *pd;
3781 3777
3782 g_return_if_fail(gc != NULL); 3778 g_return_if_fail(gc != NULL);
3783 3779
3784 pd = gc->proto_data; 3780 pd = purple_connection_get_protocol_data(gc);
3785 g_return_if_fail(pd != NULL); 3781 g_return_if_fail(pd != NULL);
3786 3782
3787 /* get rid of the blist save timeout */ 3783 /* get rid of the blist save timeout */
3788 if(pd->save_event) { 3784 if(pd->save_event) {
3789 purple_timeout_remove(pd->save_event); 3785 purple_timeout_remove(pd->save_event);
3793 3789
3794 /* stop the session */ 3790 /* stop the session */
3795 mwSession_stop(pd->session, 0x00); 3791 mwSession_stop(pd->session, 0x00);
3796 3792
3797 /* no longer necessary */ 3793 /* no longer necessary */
3798 gc->proto_data = NULL; 3794 purple_connection_set_protocol_data(gc, NULL);
3799 3795
3800 /* stop watching the socket */ 3796 /* stop watching the socket */
3801 if(gc->inpa) { 3797 if(gc->inpa) {
3802 purple_input_remove(gc->inpa); 3798 purple_input_remove(gc->inpa);
3803 gc->inpa = 0; 3799 gc->inpa = 0;
3984 struct mwPurplePluginData *pd; 3980 struct mwPurplePluginData *pd;
3985 struct mwIdBlock who = { (char *) name, NULL }; 3981 struct mwIdBlock who = { (char *) name, NULL };
3986 struct mwConversation *conv; 3982 struct mwConversation *conv;
3987 3983
3988 g_return_val_if_fail(gc != NULL, 0); 3984 g_return_val_if_fail(gc != NULL, 0);
3989 pd = gc->proto_data; 3985 pd = purple_connection_get_protocol_data(gc);
3990 3986
3991 g_return_val_if_fail(pd != NULL, 0); 3987 g_return_val_if_fail(pd != NULL, 0);
3992 3988
3993 conv = mwServiceIm_getConversation(pd->srvc_im, &who); 3989 conv = mwServiceIm_getConversation(pd->srvc_im, &who);
3994 3990
4059 struct mwConversation *conv; 4055 struct mwConversation *conv;
4060 4056
4061 gpointer t = GINT_TO_POINTER(!! state); 4057 gpointer t = GINT_TO_POINTER(!! state);
4062 4058
4063 g_return_val_if_fail(gc != NULL, 0); 4059 g_return_val_if_fail(gc != NULL, 0);
4064 pd = gc->proto_data; 4060 pd = purple_connection_get_protocol_data(gc);
4065 4061
4066 g_return_val_if_fail(pd != NULL, 0); 4062 g_return_val_if_fail(pd != NULL, 0);
4067 4063
4068 conv = mwServiceIm_getConversation(pd->srvc_im, &who); 4064 conv = mwServiceIm_getConversation(pd->srvc_im, &who);
4069 4065
4155 const char *tmp2; 4151 const char *tmp2;
4156 4152
4157 g_return_if_fail(who != NULL); 4153 g_return_if_fail(who != NULL);
4158 g_return_if_fail(*who != '\0'); 4154 g_return_if_fail(*who != '\0');
4159 4155
4160 pd = gc->proto_data; 4156 pd = purple_connection_get_protocol_data(gc);
4161 4157
4162 acct = purple_connection_get_account(gc); 4158 acct = purple_connection_get_account(gc);
4163 b = purple_find_buddy(acct, who); 4159 b = purple_find_buddy(acct, who);
4164 user_info = purple_notify_user_info_new(); 4160 user_info = purple_notify_user_info_new();
4165 4161
4166 if(purple_str_has_prefix(who, "@E ")) { 4162 if(purple_str_has_prefix(who, "@E ")) {
4167 purple_notify_user_info_add_pair(user_info, _("External User"), NULL); 4163 purple_notify_user_info_add_pair_html(user_info, _("External User"), NULL);
4168 } 4164 }
4169 4165
4170 purple_notify_user_info_add_pair(user_info, _("User ID"), who); 4166 purple_notify_user_info_add_pair_plaintext(user_info, _("User ID"), who);
4171 4167
4172 if(b) { 4168 if(b) {
4173 guint32 type; 4169 guint32 type;
4174 4170
4175 if(purple_buddy_get_server_alias(b)) { 4171 if(purple_buddy_get_server_alias(b)) {
4176 purple_notify_user_info_add_pair(user_info, _("Full Name"), purple_buddy_get_server_alias(b)); 4172 /* TODO: Check whether it's correct to call add_pair_html,
4173 or if we should be using add_pair_plaintext */
4174 purple_notify_user_info_add_pair_html(user_info, _("Full Name"), purple_buddy_get_server_alias(b));
4177 } 4175 }
4178 4176
4179 type = purple_blist_node_get_int((PurpleBlistNode *) b, BUDDY_KEY_CLIENT); 4177 type = purple_blist_node_get_int((PurpleBlistNode *) b, BUDDY_KEY_CLIENT);
4180 if(type) { 4178 if(type) {
4181 tmp = g_strdup(mw_client_name(type)); 4179 tmp2 = mw_client_name(type);
4182 if (!tmp) 4180 if (tmp2) {
4181 purple_notify_user_info_add_pair_plaintext(user_info, _("Last Known Client"), tmp2);
4182 } else {
4183 tmp = g_strdup_printf(_("Unknown (0x%04x)<br>"), type); 4183 tmp = g_strdup_printf(_("Unknown (0x%04x)<br>"), type);
4184 4184 purple_notify_user_info_add_pair_html(user_info, _("Last Known Client"), tmp);
4185 purple_notify_user_info_add_pair(user_info, _("Last Known Client"), tmp); 4185 g_free(tmp);
4186 4186 }
4187 g_free(tmp);
4188 } 4187 }
4189 } 4188 }
4190 4189
4191 tmp = user_supports_text(pd->srvc_aware, who); 4190 tmp = user_supports_text(pd->srvc_aware, who);
4192 if(tmp) { 4191 if(tmp) {
4193 purple_notify_user_info_add_pair(user_info, _("Supports"), tmp); 4192 purple_notify_user_info_add_pair_plaintext(user_info, _("Supports"), tmp);
4194 g_free(tmp); 4193 g_free(tmp);
4195 } 4194 }
4196 4195
4197 if(b) { 4196 if(b) {
4198 purple_notify_user_info_add_pair(user_info, _("Status"), status_text(b)); 4197 purple_notify_user_info_add_pair_plaintext(user_info, _("Status"), status_text(b));
4199 4198
4200 /* XXX Is this adding a status message in its own section rather than with the "Status" label? */ 4199 /* XXX Is this adding a status message in its own section rather than with the "Status" label? */
4201 tmp2 = mwServiceAware_getText(pd->srvc_aware, &idb); 4200 tmp2 = mwServiceAware_getText(pd->srvc_aware, &idb);
4202 if(tmp2 && g_utf8_validate(tmp2, -1, NULL)) { 4201 if(tmp2 && g_utf8_validate(tmp2, -1, NULL)) {
4203 tmp = g_markup_escape_text(tmp2, -1);
4204 purple_notify_user_info_add_section_break(user_info); 4202 purple_notify_user_info_add_section_break(user_info);
4205 purple_notify_user_info_add_pair(user_info, NULL, tmp); 4203 purple_notify_user_info_add_pair_plaintext(user_info, NULL, tmp2);
4206 g_free(tmp);
4207 } 4204 }
4208 } 4205 }
4209 4206
4210 /* @todo emit a signal to allow a plugin to override the display of 4207 /* @todo emit a signal to allow a plugin to override the display of
4211 this notification, so that it can create its own */ 4208 this notification, so that it can create its own */
4399 g_return_if_fail(data != NULL); 4396 g_return_if_fail(data != NULL);
4400 4397
4401 buddy = data->buddy; 4398 buddy = data->buddy;
4402 4399
4403 gc = purple_account_get_connection(purple_buddy_get_account(buddy)); 4400 gc = purple_account_get_connection(purple_buddy_get_account(buddy));
4404 pd = gc->proto_data; 4401 pd = purple_connection_get_protocol_data(gc);
4405 4402
4406 if(results) 4403 if(results)
4407 res = results->data; 4404 res = results->data;
4408 4405
4409 if(!code && res && res->matches) { 4406 if(!code && res && res->matches) {
4478 } 4475 }
4479 4476
4480 4477
4481 static void mw_prpl_add_buddy(PurpleConnection *gc, 4478 static void mw_prpl_add_buddy(PurpleConnection *gc,
4482 PurpleBuddy *buddy, 4479 PurpleBuddy *buddy,
4483 PurpleGroup *group) { 4480 PurpleGroup *group,
4484 4481 const char *message) {
4485 struct mwPurplePluginData *pd = gc->proto_data; 4482
4483 struct mwPurplePluginData *pd = purple_connection_get_protocol_data(gc);
4486 struct mwServiceResolve *srvc; 4484 struct mwServiceResolve *srvc;
4487 GList *query; 4485 GList *query;
4488 enum mwResolveFlag flags; 4486 enum mwResolveFlag flags;
4489 guint32 req; 4487 guint32 req;
4490 BuddyAddData *data; 4488 BuddyAddData *data;
4525 } 4523 }
4526 4524
4527 4525
4528 static void mw_prpl_add_buddies(PurpleConnection *gc, 4526 static void mw_prpl_add_buddies(PurpleConnection *gc,
4529 GList *buddies, 4527 GList *buddies,
4530 GList *groups) { 4528 GList *groups,
4529 const char *message) {
4531 4530
4532 struct mwPurplePluginData *pd; 4531 struct mwPurplePluginData *pd;
4533 GHashTable *group_sets; 4532 GHashTable *group_sets;
4534 struct mwAwareIdBlock *idbs, *idb; 4533 struct mwAwareIdBlock *idbs, *idb;
4535 4534
4536 pd = gc->proto_data; 4535 pd = purple_connection_get_protocol_data(gc);
4537 4536
4538 /* map PurpleGroup:GList of mwAwareIdBlock */ 4537 /* map PurpleGroup:GList of mwAwareIdBlock */
4539 group_sets = g_hash_table_new(g_direct_hash, g_direct_equal); 4538 group_sets = g_hash_table_new(g_direct_hash, g_direct_equal);
4540 4539
4541 /* bunch of mwAwareIdBlock allocated at once, free'd at once */ 4540 /* bunch of mwAwareIdBlock allocated at once, free'd at once */
4582 struct mwAwareIdBlock idb = { mwAware_USER, (char *)purple_buddy_get_name(buddy), NULL }; 4581 struct mwAwareIdBlock idb = { mwAware_USER, (char *)purple_buddy_get_name(buddy), NULL };
4583 struct mwAwareList *list; 4582 struct mwAwareList *list;
4584 4583
4585 GList *rem = g_list_prepend(NULL, &idb); 4584 GList *rem = g_list_prepend(NULL, &idb);
4586 4585
4587 pd = gc->proto_data; 4586 pd = purple_connection_get_protocol_data(gc);
4588 group = purple_buddy_get_group(buddy); 4587 group = purple_buddy_get_group(buddy);
4589 list = list_ensure(pd, group); 4588 list = list_ensure(pd, group);
4590 4589
4591 mwAwareList_removeAware(list, rem); 4590 mwAwareList_removeAware(list, rem);
4592 blist_schedule(pd); 4591 blist_schedule(pd);
4629 g_return_if_fail(gc != NULL); 4628 g_return_if_fail(gc != NULL);
4630 4629
4631 acct = purple_connection_get_account(gc); 4630 acct = purple_connection_get_account(gc);
4632 g_return_if_fail(acct != NULL); 4631 g_return_if_fail(acct != NULL);
4633 4632
4634 pd = gc->proto_data; 4633 pd = purple_connection_get_protocol_data(gc);
4635 g_return_if_fail(pd != NULL); 4634 g_return_if_fail(pd != NULL);
4636 4635
4637 session = pd->session; 4636 session = pd->session;
4638 g_return_if_fail(session != NULL); 4637 g_return_if_fail(session != NULL);
4639 4638
4640 switch(acct->perm_deny) { 4639 switch(purple_account_get_privacy_type(acct)) {
4641 case PURPLE_PRIVACY_DENY_USERS: 4640 case PURPLE_PRIVACY_DENY_USERS:
4642 DEBUG_INFO("PURPLE_PRIVACY_DENY_USERS\n"); 4641 DEBUG_INFO("PURPLE_PRIVACY_DENY_USERS\n");
4643 privacy_fill(&privacy, acct->deny); 4642 privacy_fill(&privacy, acct->deny);
4644 privacy.deny = TRUE; 4643 privacy.deny = TRUE;
4645 break; 4644 break;
4659 DEBUG_INFO("PURPLE_PRIVACY_DENY_ALL\n"); 4658 DEBUG_INFO("PURPLE_PRIVACY_DENY_ALL\n");
4660 privacy.deny = FALSE; 4659 privacy.deny = FALSE;
4661 break; 4660 break;
4662 4661
4663 default: 4662 default:
4664 DEBUG_INFO("acct->perm_deny is 0x%x\n", acct->perm_deny); 4663 DEBUG_INFO("acct->perm_deny is 0x%x\n", purple_account_get_privacy_type(acct));
4665 return; 4664 return;
4666 } 4665 }
4667 4666
4668 mwSession_setPrivacyInfo(session, &privacy); 4667 mwSession_setPrivacyInfo(session, &privacy);
4669 g_free(privacy.users); 4668 g_free(privacy.users);
4713 GHashTable *components) { 4712 GHashTable *components) {
4714 4713
4715 struct mwPurplePluginData *pd; 4714 struct mwPurplePluginData *pd;
4716 char *c, *t; 4715 char *c, *t;
4717 4716
4718 pd = gc->proto_data; 4717 pd = purple_connection_get_protocol_data(gc);
4719 4718
4720 c = g_hash_table_lookup(components, CHAT_KEY_NAME); 4719 c = g_hash_table_lookup(components, CHAT_KEY_NAME);
4721 t = g_hash_table_lookup(components, CHAT_KEY_TOPIC); 4720 t = g_hash_table_lookup(components, CHAT_KEY_TOPIC);
4722 4721
4723 if(g_hash_table_lookup(components, CHAT_KEY_IS_PLACE)) { 4722 if(g_hash_table_lookup(components, CHAT_KEY_IS_PLACE)) {
4755 4754
4756 struct mwPurplePluginData *pd; 4755 struct mwPurplePluginData *pd;
4757 struct mwServiceConference *srvc; 4756 struct mwServiceConference *srvc;
4758 char *c; 4757 char *c;
4759 4758
4760 pd = gc->proto_data; 4759 pd = purple_connection_get_protocol_data(gc);
4761 srvc = pd->srvc_conf; 4760 srvc = pd->srvc_conf;
4762 4761
4763 if(g_hash_table_lookup(components, CHAT_KEY_IS_PLACE)) { 4762 if(g_hash_table_lookup(components, CHAT_KEY_IS_PLACE)) {
4764 ; /* nothing needs doing */ 4763 ; /* nothing needs doing */
4765 4764
4787 struct mwPurplePluginData *pd; 4786 struct mwPurplePluginData *pd;
4788 struct mwConference *conf; 4787 struct mwConference *conf;
4789 struct mwPlace *place; 4788 struct mwPlace *place;
4790 struct mwIdBlock idb = { (char *) who, NULL }; 4789 struct mwIdBlock idb = { (char *) who, NULL };
4791 4790
4792 pd = gc->proto_data; 4791 pd = purple_connection_get_protocol_data(gc);
4793 g_return_if_fail(pd != NULL); 4792 g_return_if_fail(pd != NULL);
4794 4793
4795 conf = ID_TO_CONF(pd, id); 4794 conf = ID_TO_CONF(pd, id);
4796 4795
4797 if(conf) { 4796 if(conf) {
4811 int id) { 4810 int id) {
4812 4811
4813 struct mwPurplePluginData *pd; 4812 struct mwPurplePluginData *pd;
4814 struct mwConference *conf; 4813 struct mwConference *conf;
4815 4814
4816 pd = gc->proto_data; 4815 pd = purple_connection_get_protocol_data(gc);
4817 4816
4818 g_return_if_fail(pd != NULL); 4817 g_return_if_fail(pd != NULL);
4819 conf = ID_TO_CONF(pd, id); 4818 conf = ID_TO_CONF(pd, id);
4820 4819
4821 if(conf) { 4820 if(conf) {
4847 struct mwPurplePluginData *pd; 4846 struct mwPurplePluginData *pd;
4848 struct mwConference *conf; 4847 struct mwConference *conf;
4849 char *msg; 4848 char *msg;
4850 int ret; 4849 int ret;
4851 4850
4852 pd = gc->proto_data; 4851 pd = purple_connection_get_protocol_data(gc);
4853 4852
4854 g_return_val_if_fail(pd != NULL, 0); 4853 g_return_val_if_fail(pd != NULL, 0);
4855 conf = ID_TO_CONF(pd, id); 4854 conf = ID_TO_CONF(pd, id);
4856 4855
4857 msg = purple_markup_strip_html(message); 4856 msg = purple_markup_strip_html(message);
4885 4884
4886 static void mw_prpl_alias_buddy(PurpleConnection *gc, 4885 static void mw_prpl_alias_buddy(PurpleConnection *gc,
4887 const char *who, 4886 const char *who,
4888 const char *alias) { 4887 const char *alias) {
4889 4888
4890 struct mwPurplePluginData *pd = gc->proto_data; 4889 struct mwPurplePluginData *pd = purple_connection_get_protocol_data(gc);
4891 g_return_if_fail(pd != NULL); 4890 g_return_if_fail(pd != NULL);
4892 4891
4893 /* it's a change to the buddy list, so we've gotta reflect that in 4892 /* it's a change to the buddy list, so we've gotta reflect that in
4894 the server copy */ 4893 the server copy */
4895 4894
4903 const char *new_group) { 4902 const char *new_group) {
4904 4903
4905 struct mwAwareIdBlock idb = { mwAware_USER, (char *) who, NULL }; 4904 struct mwAwareIdBlock idb = { mwAware_USER, (char *) who, NULL };
4906 GList *gl = g_list_prepend(NULL, &idb); 4905 GList *gl = g_list_prepend(NULL, &idb);
4907 4906
4908 struct mwPurplePluginData *pd = gc->proto_data; 4907 struct mwPurplePluginData *pd = purple_connection_get_protocol_data(gc);
4909 PurpleGroup *group; 4908 PurpleGroup *group;
4910 struct mwAwareList *list; 4909 struct mwAwareList *list;
4911 4910
4912 /* add who to new_group's aware list */ 4911 /* add who to new_group's aware list */
4913 group = purple_find_group(new_group); 4912 group = purple_find_group(new_group);
4929 static void mw_prpl_rename_group(PurpleConnection *gc, 4928 static void mw_prpl_rename_group(PurpleConnection *gc,
4930 const char *old, 4929 const char *old,
4931 PurpleGroup *group, 4930 PurpleGroup *group,
4932 GList *buddies) { 4931 GList *buddies) {
4933 4932
4934 struct mwPurplePluginData *pd = gc->proto_data; 4933 struct mwPurplePluginData *pd = purple_connection_get_protocol_data(gc);
4935 g_return_if_fail(pd != NULL); 4934 g_return_if_fail(pd != NULL);
4936 4935
4937 /* it's a change in the buddy list, so we've gotta reflect that in 4936 /* it's a change in the buddy list, so we've gotta reflect that in
4938 the server copy. Also, having this function should prevent all 4937 the server copy. Also, having this function should prevent all
4939 those buddies from being removed and re-added. We don't really 4938 those buddies from being removed and re-added. We don't really
4949 ; 4948 ;
4950 } 4949 }
4951 4950
4952 4951
4953 static void mw_prpl_convo_closed(PurpleConnection *gc, const char *who) { 4952 static void mw_prpl_convo_closed(PurpleConnection *gc, const char *who) {
4954 struct mwPurplePluginData *pd = gc->proto_data; 4953 struct mwPurplePluginData *pd = purple_connection_get_protocol_data(gc);
4955 struct mwServiceIm *srvc; 4954 struct mwServiceIm *srvc;
4956 struct mwConversation *conv; 4955 struct mwConversation *conv;
4957 struct mwIdBlock idb = { (char *) who, NULL }; 4956 struct mwIdBlock idb = { (char *) who, NULL };
4958 4957
4959 g_return_if_fail(pd != NULL); 4958 g_return_if_fail(pd != NULL);
4984 4983
4985 static void mw_prpl_remove_group(PurpleConnection *gc, PurpleGroup *group) { 4984 static void mw_prpl_remove_group(PurpleConnection *gc, PurpleGroup *group) {
4986 struct mwPurplePluginData *pd; 4985 struct mwPurplePluginData *pd;
4987 struct mwAwareList *list; 4986 struct mwAwareList *list;
4988 4987
4989 pd = gc->proto_data; 4988 pd = purple_connection_get_protocol_data(gc);
4990 g_return_if_fail(pd != NULL); 4989 g_return_if_fail(pd != NULL);
4991 g_return_if_fail(pd->group_list_map != NULL); 4990 g_return_if_fail(pd->group_list_map != NULL);
4992 4991
4993 list = g_hash_table_lookup(pd->group_list_map, group); 4992 list = g_hash_table_lookup(pd->group_list_map, group);
4994 4993
5008 struct mwServiceAware *srvc; 5007 struct mwServiceAware *srvc;
5009 PurpleAccount *acct; 5008 PurpleAccount *acct;
5010 5009
5011 g_return_val_if_fail(gc != NULL, FALSE); 5010 g_return_val_if_fail(gc != NULL, FALSE);
5012 5011
5013 pd = gc->proto_data; 5012 pd = purple_connection_get_protocol_data(gc);
5014 g_return_val_if_fail(pd != NULL, FALSE); 5013 g_return_val_if_fail(pd != NULL, FALSE);
5015 5014
5016 srvc = pd->srvc_aware; 5015 srvc = pd->srvc_aware;
5017 g_return_val_if_fail(srvc != NULL, FALSE); 5016 g_return_val_if_fail(srvc != NULL, FALSE);
5018 5017
5040 5039
5041 DEBUG_INFO("ft_outgoing_init\n"); 5040 DEBUG_INFO("ft_outgoing_init\n");
5042 5041
5043 acct = purple_xfer_get_account(xfer); 5042 acct = purple_xfer_get_account(xfer);
5044 gc = purple_account_get_connection(acct); 5043 gc = purple_account_get_connection(acct);
5045 pd = gc->proto_data; 5044 pd = purple_connection_get_protocol_data(gc);
5046 srvc = pd->srvc_ft; 5045 srvc = pd->srvc_ft;
5047 5046
5048 filename = purple_xfer_get_local_filename(xfer); 5047 filename = purple_xfer_get_local_filename(xfer);
5049 filesize = purple_xfer_get_size(xfer); 5048 filesize = purple_xfer_get_size(xfer);
5050 idb.user = xfer->who; 5049 idb.user = purple_xfer_get_remote_user(xfer);
5051 5050
5052 purple_xfer_update_progress(xfer); 5051 purple_xfer_update_progress(xfer);
5053 5052
5054 /* test that we can actually send the file */ 5053 /* test that we can actually send the file */
5055 fp = g_fopen(filename, "rb"); 5054 fp = g_fopen(filename, "rb");
5056 if(! fp) { 5055 if(! fp) {
5057 char *msg = g_strdup_printf(_("Error reading file %s: \n%s\n"), 5056 char *msg = g_strdup_printf(_("Error reading file %s: \n%s\n"),
5058 filename, g_strerror(errno)); 5057 filename, g_strerror(errno));
5059 purple_xfer_error(purple_xfer_get_type(xfer), acct, xfer->who, msg); 5058 purple_xfer_error(purple_xfer_get_type(xfer), acct, purple_xfer_get_remote_user(xfer), msg);
5060 g_free(msg); 5059 g_free(msg);
5061 return; 5060 return;
5062 } 5061 }
5063 fclose(fp); 5062 fclose(fp);
5064 5063
5069 5068
5070 ft = mwFileTransfer_new(srvc, &idb, NULL, filename, filesize); 5069 ft = mwFileTransfer_new(srvc, &idb, NULL, filename, filesize);
5071 5070
5072 purple_xfer_ref(xfer); 5071 purple_xfer_ref(xfer);
5073 mwFileTransfer_setClientData(ft, xfer, (GDestroyNotify) purple_xfer_unref); 5072 mwFileTransfer_setClientData(ft, xfer, (GDestroyNotify) purple_xfer_unref);
5074 xfer->data = ft; 5073 purple_xfer_set_protocol_data(xfer, ft);
5075 5074
5076 mwFileTransfer_offer(ft); 5075 mwFileTransfer_offer(ft);
5077 } 5076 }
5078 5077
5079 5078
5080 static void ft_outgoing_cancel(PurpleXfer *xfer) { 5079 static void ft_outgoing_cancel(PurpleXfer *xfer) {
5081 struct mwFileTransfer *ft = xfer->data; 5080 struct mwFileTransfer *ft = purple_xfer_get_protocol_data(xfer);
5082 5081
5083 DEBUG_INFO("ft_outgoing_cancel called\n"); 5082 DEBUG_INFO("ft_outgoing_cancel called\n");
5084 5083
5085 if(ft) mwFileTransfer_cancel(ft); 5084 if(ft) mwFileTransfer_cancel(ft);
5086 } 5085 }
5117 } 5116 }
5118 } 5117 }
5119 5118
5120 5119
5121 static PurplePluginProtocolInfo mw_prpl_info = { 5120 static PurplePluginProtocolInfo mw_prpl_info = {
5122 OPT_PROTO_IM_IMAGE, 5121 .struct_size = sizeof(PurplePluginProtocolInfo),
5123 NULL, /*< set in mw_plugin_init */ 5122 .options = OPT_PROTO_IM_IMAGE,
5124 NULL, /*< set in mw_plugin_init */ 5123 .user_splits = NULL, /*< set in mw_plugin_init */
5125 NO_BUDDY_ICONS, 5124 .protocol_options = NULL, /*< set in mw_plugin_init */
5126 mw_prpl_list_icon, 5125 .icon_spec = NO_BUDDY_ICONS,
5127 mw_prpl_list_emblem, 5126 .list_icon = mw_prpl_list_icon,
5128 mw_prpl_status_text, 5127 .list_emblem = mw_prpl_list_emblem,
5129 mw_prpl_tooltip_text, 5128 .status_text = mw_prpl_status_text,
5130 mw_prpl_status_types, 5129 .tooltip_text = mw_prpl_tooltip_text,
5131 mw_prpl_blist_node_menu, 5130 .status_types = mw_prpl_status_types,
5132 mw_prpl_chat_info, 5131 .blist_node_menu = mw_prpl_blist_node_menu,
5133 mw_prpl_chat_info_defaults, 5132 .chat_info = mw_prpl_chat_info,
5134 mw_prpl_login, 5133 .chat_info_defaults = mw_prpl_chat_info_defaults,
5135 mw_prpl_close, 5134 .login = mw_prpl_login,
5136 mw_prpl_send_im, 5135 .close = mw_prpl_close,
5137 NULL, 5136 .send_im = mw_prpl_send_im,
5138 mw_prpl_send_typing, 5137 .set_info = NULL,
5139 mw_prpl_get_info, 5138 .send_typing = mw_prpl_send_typing,
5140 mw_prpl_set_status, 5139 .get_info = mw_prpl_get_info,
5141 mw_prpl_set_idle, 5140 .set_status = mw_prpl_set_status,
5142 NULL, 5141 .set_idle = mw_prpl_set_idle,
5143 mw_prpl_add_buddy, 5142 .change_passwd = NULL,
5144 mw_prpl_add_buddies, 5143 .add_buddy = mw_prpl_add_buddy,
5145 mw_prpl_remove_buddy, 5144 .add_buddies = mw_prpl_add_buddies,
5146 NULL, 5145 .remove_buddy = mw_prpl_remove_buddy,
5147 mw_prpl_add_permit, 5146 .remove_buddies = NULL,
5148 mw_prpl_add_deny, 5147 .add_permit = mw_prpl_add_permit,
5149 mw_prpl_rem_permit, 5148 .add_deny = mw_prpl_add_deny,
5150 mw_prpl_rem_deny, 5149 .rem_permit = mw_prpl_rem_permit,
5151 mw_prpl_set_permit_deny, 5150 .rem_deny = mw_prpl_rem_deny,
5152 mw_prpl_join_chat, 5151 .set_permit_deny = mw_prpl_set_permit_deny,
5153 mw_prpl_reject_chat, 5152 .join_chat = mw_prpl_join_chat,
5154 mw_prpl_get_chat_name, 5153 .reject_chat = mw_prpl_reject_chat,
5155 mw_prpl_chat_invite, 5154 .get_chat_name = mw_prpl_get_chat_name,
5156 mw_prpl_chat_leave, 5155 .chat_invite = mw_prpl_chat_invite,
5157 mw_prpl_chat_whisper, 5156 .chat_leave = mw_prpl_chat_leave,
5158 mw_prpl_chat_send, 5157 .chat_whisper = mw_prpl_chat_whisper,
5159 mw_prpl_keepalive, 5158 .chat_send = mw_prpl_chat_send,
5160 NULL, 5159 .keepalive = mw_prpl_keepalive,
5161 NULL, 5160 .register_user = NULL,
5162 NULL, 5161 .get_cb_info = NULL,
5163 mw_prpl_alias_buddy, 5162 .alias_buddy = mw_prpl_alias_buddy,
5164 mw_prpl_group_buddy, 5163 .group_buddy = mw_prpl_group_buddy,
5165 mw_prpl_rename_group, 5164 .rename_group = mw_prpl_rename_group,
5166 mw_prpl_buddy_free, 5165 .buddy_free = mw_prpl_buddy_free,
5167 mw_prpl_convo_closed, 5166 .convo_closed = mw_prpl_convo_closed,
5168 mw_prpl_normalize, 5167 .normalize = mw_prpl_normalize,
5169 NULL, 5168 .set_buddy_icon = NULL,
5170 mw_prpl_remove_group, 5169 .remove_group = mw_prpl_remove_group,
5171 NULL, 5170 .get_cb_real_name = NULL,
5172 NULL, 5171 .set_chat_topic = NULL,
5173 NULL, 5172 .find_blist_chat = NULL,
5174 NULL, 5173 .roomlist_get_list = NULL,
5175 NULL, 5174 .roomlist_expand_category = NULL,
5176 NULL, 5175 .can_receive_file = mw_prpl_can_receive_file,
5177 mw_prpl_can_receive_file, 5176 .send_file = mw_prpl_send_file,
5178 mw_prpl_send_file, 5177 .new_xfer = mw_prpl_new_xfer,
5179 mw_prpl_new_xfer, 5178 .offline_message = NULL,
5180 NULL, 5179 .whiteboard_prpl_ops = NULL,
5181 NULL, 5180 .send_raw = NULL
5182 NULL,
5183 NULL,
5184 NULL,
5185 NULL,
5186 NULL,
5187 sizeof(PurplePluginProtocolInfo),
5188 NULL,
5189 NULL,
5190 NULL,
5191 NULL,
5192 NULL,
5193 NULL,
5194 NULL,
5195 NULL
5196 }; 5181 };
5197 5182
5198 5183
5199 static PurplePluginPrefFrame * 5184 static PurplePluginPrefFrame *
5200 mw_plugin_get_plugin_pref_frame(PurplePlugin *plugin) { 5185 mw_plugin_get_plugin_pref_frame(PurplePlugin *plugin) {
5512 struct mwServiceResolve *srvc; 5497 struct mwServiceResolve *srvc;
5513 GList *query; 5498 GList *query;
5514 enum mwResolveFlag flags; 5499 enum mwResolveFlag flags;
5515 guint32 req; 5500 guint32 req;
5516 5501
5517 pd = gc->proto_data; 5502 pd = purple_connection_get_protocol_data(gc);
5518 srvc = pd->srvc_resolve; 5503 srvc = pd->srvc_resolve;
5519 5504
5520 query = g_list_prepend(NULL, (char *) name); 5505 query = g_list_prepend(NULL, (char *) name);
5521 flags = mwResolveFlag_FIRST | mwResolveFlag_GROUPS; 5506 flags = mwResolveFlag_FIRST | mwResolveFlag_GROUPS;
5522 5507
5637 struct mwServiceResolve *srvc; 5622 struct mwServiceResolve *srvc;
5638 GList *query; 5623 GList *query;
5639 enum mwResolveFlag flags; 5624 enum mwResolveFlag flags;
5640 guint32 req; 5625 guint32 req;
5641 5626
5642 pd = gc->proto_data; 5627 pd = purple_connection_get_protocol_data(gc);
5643 srvc = pd->srvc_resolve; 5628 srvc = pd->srvc_resolve;
5644 5629
5645 query = g_list_prepend(NULL, (char *) name); 5630 query = g_list_prepend(NULL, (char *) name);
5646 flags = mwResolveFlag_FIRST | mwResolveFlag_USERS; 5631 flags = mwResolveFlag_FIRST | mwResolveFlag_USERS;
5647 5632