comparison libpurple/protocols/sametime/sametime.c @ 32672:3828a61c44da

A boring and large patch so I can merge heads.
author Elliott Sales de Andrade <qulogic@pidgin.im>
date Fri, 23 Dec 2011 08:21:58 +0000
parents 99ca503ea087
children
comparison
equal deleted inserted replaced
32671:0e69949b3e61 32672:3828a61c44da
169 #define BLIST_PREF_IS_STORE() BLIST_PREF_IS(blist_choice_STORE) 169 #define BLIST_PREF_IS_STORE() BLIST_PREF_IS(blist_choice_STORE)
170 #define BLIST_PREF_IS_SYNCH() BLIST_PREF_IS(blist_choice_SYNCH) 170 #define BLIST_PREF_IS_SYNCH() BLIST_PREF_IS(blist_choice_SYNCH)
171 171
172 172
173 /* debugging output */ 173 /* debugging output */
174 #define DEBUG_ERROR(a...) purple_debug_error(G_LOG_DOMAIN, a) 174 #define DEBUG_ERROR(...) purple_debug_error(G_LOG_DOMAIN, __VA_ARGS__)
175 #define DEBUG_INFO(a...) purple_debug_info(G_LOG_DOMAIN, a) 175 #define DEBUG_INFO(...) purple_debug_info(G_LOG_DOMAIN, __VA_ARGS__)
176 #define DEBUG_MISC(a...) purple_debug_misc(G_LOG_DOMAIN, a) 176 #define DEBUG_MISC(...) purple_debug_misc(G_LOG_DOMAIN, __VA_ARGS__)
177 #define DEBUG_WARN(a...) purple_debug_warning(G_LOG_DOMAIN, a) 177 #define DEBUG_WARN(...) purple_debug_warning(G_LOG_DOMAIN, __VA_ARGS__)
178 178
179 179
180 /** ensure non-null strings */ 180 /** ensure non-null strings */
181 #ifndef NSTR 181 #ifndef NSTR
182 # define NSTR(str) ((str)? (str): "(null)") 182 # define NSTR(str) ((str)? (str): "(null)")
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;
215 /** event id for the buddy list save callback */ 215 /** event id for the buddy list save callback */
216 guint save_event; 216 guint save_event;
217 217
218 /** socket fd */ 218 /** socket fd */
219 int socket; 219 int socket;
220 guint inpa; /* input watcher */
220 gint outpa; /* like inpa, but the other way */ 221 gint outpa; /* like inpa, but the other way */
221 222
222 /** circular buffer for outgoing data */ 223 /** circular buffer for outgoing data */
223 PurpleCircBuffer *sock_buf; 224 PurpleCircBuffer *sock_buf;
224 225
318 static struct mwSession *gc_to_session(PurpleConnection *gc) { 319 static struct mwSession *gc_to_session(PurpleConnection *gc) {
319 struct mwPurplePluginData *pd; 320 struct mwPurplePluginData *pd;
320 321
321 g_return_val_if_fail(gc != NULL, NULL); 322 g_return_val_if_fail(gc != NULL, NULL);
322 323
323 pd = gc->proto_data; 324 pd = purple_connection_get_protocol_data(gc);
324 g_return_val_if_fail(pd != NULL, NULL); 325 g_return_val_if_fail(pd != NULL, NULL);
325 326
326 return pd->session; 327 return pd->session;
327 } 328 }
328 329
447 if(pd->socket) { 448 if(pd->socket) {
448 close(pd->socket); 449 close(pd->socket);
449 pd->socket = 0; 450 pd->socket = 0;
450 } 451 }
451 452
452 if(gc->inpa) { 453 if(pd->inpa) {
453 purple_input_remove(gc->inpa); 454 purple_input_remove(pd->inpa);
454 gc->inpa = 0; 455 pd->inpa = 0;
455 } 456 }
456 } 457 }
457 458
458 459
459 static void mw_session_clear(struct mwSession *session) { 460 static void mw_session_clear(struct mwSession *session) {
497 const char *status = MW_STATE_ACTIVE; 498 const char *status = MW_STATE_ACTIVE;
498 499
499 gc = mwAwareList_getClientData(list); 500 gc = mwAwareList_getClientData(list);
500 acct = purple_connection_get_account(gc); 501 acct = purple_connection_get_account(gc);
501 502
502 pd = gc->proto_data; 503 pd = purple_connection_get_protocol_data(gc);
503 idle = aware->status.time; 504 idle = aware->status.time;
504 stat = aware->status.status; 505 stat = aware->status.status;
505 id = aware->id.user; 506 id = aware->id.user;
506 507
507 if(idle) { 508 if(idle) {
849 /** ensure that a PurpleBuddy exists in the group with data 850 /** ensure that a PurpleBuddy exists in the group with data
850 appropriately matching the st user entry from the st list */ 851 appropriately matching the st user entry from the st list */
851 static PurpleBuddy *buddy_ensure(PurpleConnection *gc, PurpleGroup *group, 852 static PurpleBuddy *buddy_ensure(PurpleConnection *gc, PurpleGroup *group,
852 struct mwSametimeUser *stuser) { 853 struct mwSametimeUser *stuser) {
853 854
854 struct mwPurplePluginData *pd = gc->proto_data; 855 struct mwPurplePluginData *pd = purple_connection_get_protocol_data(gc);
855 PurpleBuddy *buddy; 856 PurpleBuddy *buddy;
856 PurpleAccount *acct = purple_connection_get_account(gc); 857 PurpleAccount *acct = purple_connection_get_account(gc);
857 858
858 const char *id = mwSametimeUser_getUser(stuser); 859 const char *id = mwSametimeUser_getUser(stuser);
859 const char *name = mwSametimeUser_getShortName(stuser); 860 const char *name = mwSametimeUser_getShortName(stuser);
925 if (!name) { 926 if (!name) {
926 DEBUG_WARN("Can't ensure a null group\n"); 927 DEBUG_WARN("Can't ensure a null group\n");
927 return NULL; 928 return NULL;
928 } 929 }
929 930
931 if (!name) {
932 DEBUG_WARN("Can't ensure a null group\n");
933 return NULL;
934 }
935
930 DEBUG_INFO("attempting to ensure group %s, called %s\n", 936 DEBUG_INFO("attempting to ensure group %s, called %s\n",
931 NSTR(name), NSTR(alias)); 937 NSTR(name), NSTR(alias));
932 938
933 /* first attempt at finding the group, by the name key */ 939 /* first attempt at finding the group, by the name key */
934 for(gn = purple_blist_get_root(); gn; 940 for(gn = purple_blist_get_root(); gn;
966 purple_blist_node_set_string(gn, GROUP_KEY_NAME, name); 972 purple_blist_node_set_string(gn, GROUP_KEY_NAME, name);
967 purple_blist_node_set_int(gn, GROUP_KEY_TYPE, type); 973 purple_blist_node_set_int(gn, GROUP_KEY_TYPE, type);
968 974
969 if(type == mwSametimeGroup_DYNAMIC) { 975 if(type == mwSametimeGroup_DYNAMIC) {
970 purple_blist_node_set_string(gn, GROUP_KEY_OWNER, owner); 976 purple_blist_node_set_string(gn, GROUP_KEY_OWNER, owner);
971 group_add(gc->proto_data, group); 977 group_add(purple_connection_get_protocol_data(gc), group);
972 } 978 }
973 979
974 return group; 980 return group;
975 } 981 }
976 982
1272 1278
1273 PurpleConnection *gc; 1279 PurpleConnection *gc;
1274 struct mwIdBlock who = { 0, 0 }; 1280 struct mwIdBlock who = { 0, 0 };
1275 struct mwConversation *conv; 1281 struct mwConversation *conv;
1276 1282
1277 gc = purple_conversation_get_gc(g_conv); 1283 gc = purple_conversation_get_connection(g_conv);
1278 if(pd->gc != gc) 1284 if(pd->gc != gc)
1279 return; /* not ours */ 1285 return; /* not ours */
1280 1286
1281 if(purple_conversation_get_type(g_conv) != PURPLE_CONV_TYPE_IM) 1287 if(purple_conversation_get_type(g_conv) != PURPLE_CONV_TYPE_IM)
1282 return; /* wrong type */ 1288 return; /* wrong type */
1396 } 1402 }
1397 } 1403 }
1398 } 1404 }
1399 1405
1400 if(add_buds) { 1406 if(add_buds) {
1401 purple_account_add_buddies(acct, add_buds); 1407 purple_account_add_buddies(acct, add_buds, NULL);
1402 g_list_free(add_buds); 1408 g_list_free(add_buds);
1403 } 1409 }
1404 } 1410 }
1405 1411
1406 1412
1753 if(pd->socket) { 1759 if(pd->socket) {
1754 close(pd->socket); 1760 close(pd->socket);
1755 pd->socket = 0; 1761 pd->socket = 0;
1756 } 1762 }
1757 1763
1758 if(pd->gc->inpa) { 1764 if(pd->inpa) {
1759 purple_input_remove(pd->gc->inpa); 1765 purple_input_remove(pd->inpa);
1760 pd->gc->inpa = 0; 1766 pd->inpa = 0;
1761 } 1767 }
1762 1768
1763 if(! ret) { 1769 if(! ret) {
1764 DEBUG_INFO("connection reset\n"); 1770 DEBUG_INFO("connection reset\n");
1765 purple_connection_error(pd->gc, 1771 purple_connection_error(pd->gc,
1784 /** Callback passed to purple_proxy_connect when an account is logged 1790 /** Callback passed to purple_proxy_connect when an account is logged
1785 in, and if the session logging in receives a redirect message */ 1791 in, and if the session logging in receives a redirect message */
1786 static void connect_cb(gpointer data, gint source, const gchar *error_message) { 1792 static void connect_cb(gpointer data, gint source, const gchar *error_message) {
1787 1793
1788 struct mwPurplePluginData *pd = data; 1794 struct mwPurplePluginData *pd = data;
1789 PurpleConnection *gc = pd->gc;
1790 1795
1791 if(source < 0) { 1796 if(source < 0) {
1792 /* connection failed */ 1797 /* connection failed */
1793 1798
1794 if(pd->socket) { 1799 if(pd->socket) {
1812 /* stop any existing login attempt */ 1817 /* stop any existing login attempt */
1813 mwSession_stop(pd->session, ERR_SUCCESS); 1818 mwSession_stop(pd->session, ERR_SUCCESS);
1814 } 1819 }
1815 1820
1816 pd->socket = source; 1821 pd->socket = source;
1817 gc->inpa = purple_input_add(source, PURPLE_INPUT_READ, 1822 pd->inpa = purple_input_add(source, PURPLE_INPUT_READ,
1818 read_cb, pd); 1823 read_cb, pd);
1819 1824
1820 mwSession_start(pd->session); 1825 mwSession_start(pd->session);
1821 } 1826 }
1822 1827
2137 #define MW_FT_LEN (BUF_LONG * 2) 2142 #define MW_FT_LEN (BUF_LONG * 2)
2138 2143
2139 2144
2140 static void ft_incoming_cancel(PurpleXfer *xfer) { 2145 static void ft_incoming_cancel(PurpleXfer *xfer) {
2141 /* incoming transfer rejected or cancelled in-progress */ 2146 /* incoming transfer rejected or cancelled in-progress */
2142 struct mwFileTransfer *ft = xfer->data; 2147 struct mwFileTransfer *ft = purple_xfer_get_protocol_data(xfer);
2143 if(ft) mwFileTransfer_reject(ft); 2148 if(ft) mwFileTransfer_reject(ft);
2144 } 2149 }
2145 2150
2146 2151
2147 static void ft_incoming_init(PurpleXfer *xfer) { 2152 static void ft_incoming_init(PurpleXfer *xfer) {
2153 */ 2158 */
2154 2159
2155 struct mwFileTransfer *ft; 2160 struct mwFileTransfer *ft;
2156 FILE *fp; 2161 FILE *fp;
2157 2162
2158 ft = xfer->data; 2163 ft = purple_xfer_get_protocol_data(xfer);
2159 2164
2160 fp = g_fopen(xfer->local_filename, "wb"); 2165 fp = g_fopen(purple_xfer_get_local_filename(xfer), "wb");
2161 if(! fp) { 2166 if(! fp) {
2162 mwFileTransfer_cancel(ft); 2167 mwFileTransfer_cancel(ft);
2163 return; 2168 return;
2164 } 2169 }
2165 2170
2200 xfer = purple_xfer_new(acct, PURPLE_XFER_RECEIVE, who); 2205 xfer = purple_xfer_new(acct, PURPLE_XFER_RECEIVE, who);
2201 if (xfer) 2206 if (xfer)
2202 { 2207 {
2203 purple_xfer_ref(xfer); 2208 purple_xfer_ref(xfer);
2204 mwFileTransfer_setClientData(ft, xfer, (GDestroyNotify) purple_xfer_unref); 2209 mwFileTransfer_setClientData(ft, xfer, (GDestroyNotify) purple_xfer_unref);
2205 xfer->data = ft; 2210 purple_xfer_set_protocol_data(xfer, ft);
2206 2211
2207 purple_xfer_set_init_fnc(xfer, ft_incoming_init); 2212 purple_xfer_set_init_fnc(xfer, ft_incoming_init);
2208 purple_xfer_set_cancel_recv_fnc(xfer, ft_incoming_cancel); 2213 purple_xfer_set_cancel_recv_fnc(xfer, ft_incoming_cancel);
2209 purple_xfer_set_request_denied_fnc(xfer, ft_incoming_cancel); 2214 purple_xfer_set_request_denied_fnc(xfer, ft_incoming_cancel);
2210 2215
2217 } 2222 }
2218 2223
2219 2224
2220 static void ft_send(struct mwFileTransfer *ft, FILE *fp) { 2225 static void ft_send(struct mwFileTransfer *ft, FILE *fp) {
2221 guchar buf[MW_FT_LEN]; 2226 guchar buf[MW_FT_LEN];
2222 struct mwOpaque o = { .data = buf, .len = MW_FT_LEN }; 2227 struct mwOpaque o = { MW_FT_LEN, buf };
2223 guint32 rem; 2228 guint32 rem;
2224 PurpleXfer *xfer; 2229 PurpleXfer *xfer;
2225 2230
2226 xfer = mwFileTransfer_getClientData(ft); 2231 xfer = mwFileTransfer_getClientData(ft);
2227 2232
2229 if(rem < MW_FT_LEN) o.len = rem; 2234 if(rem < MW_FT_LEN) o.len = rem;
2230 2235
2231 if(fread(buf, (size_t) o.len, 1, fp)) { 2236 if(fread(buf, (size_t) o.len, 1, fp)) {
2232 2237
2233 /* calculate progress and display it */ 2238 /* calculate progress and display it */
2234 xfer->bytes_sent += o.len; 2239 purple_xfer_set_bytes_sent(xfer, purple_xfer_get_bytes_sent(xfer) + o.len);
2235 xfer->bytes_remaining -= o.len;
2236 purple_xfer_update_progress(xfer); 2240 purple_xfer_update_progress(xfer);
2237 2241
2238 mwFileTransfer_send(ft, &o); 2242 mwFileTransfer_send(ft, &o);
2239 2243
2240 } else { 2244 } else {
2262 mwFileTransfer_free(ft); 2266 mwFileTransfer_free(ft);
2263 g_return_if_reached(); 2267 g_return_if_reached();
2264 } 2268 }
2265 2269
2266 if(purple_xfer_get_type(xfer) == PURPLE_XFER_SEND) { 2270 if(purple_xfer_get_type(xfer) == PURPLE_XFER_SEND) {
2267 xfer->dest_fp = g_fopen(xfer->local_filename, "rb"); 2271 xfer->dest_fp = g_fopen(purple_xfer_get_local_filename(xfer), "rb");
2268 ft_send(ft, xfer->dest_fp); 2272 ft_send(ft, xfer->dest_fp);
2269 } 2273 }
2270 } 2274 }
2271 2275
2272 2276
2279 2283
2280 PurpleXfer *xfer; 2284 PurpleXfer *xfer;
2281 2285
2282 xfer = mwFileTransfer_getClientData(ft); 2286 xfer = mwFileTransfer_getClientData(ft);
2283 if(xfer) { 2287 if(xfer) {
2284 xfer->data = NULL; 2288 purple_xfer_set_protocol_data(xfer, NULL);
2285 2289
2286 if(! mwFileTransfer_getRemaining(ft)) { 2290 if(! mwFileTransfer_getRemaining(ft)) {
2287 purple_xfer_set_completed(xfer, TRUE); 2291 purple_xfer_set_completed(xfer, TRUE);
2288 purple_xfer_end(xfer); 2292 purple_xfer_end(xfer);
2289 2293
2332 purple_xfer_cancel_local(xfer); 2336 purple_xfer_cancel_local(xfer);
2333 return; 2337 return;
2334 } 2338 }
2335 2339
2336 /* update the progress */ 2340 /* update the progress */
2337 xfer->bytes_sent += data->len; 2341 purple_xfer_set_bytes_sent(xfer, purple_xfer_get_bytes_sent(xfer) + data->len);
2338 xfer->bytes_remaining -= data->len;
2339 purple_xfer_update_progress(xfer); 2342 purple_xfer_update_progress(xfer);
2340 2343
2341 /* 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 */
2342 mwFileTransfer_ack(ft); 2345 mwFileTransfer_ack(ft);
2343 } 2346 }
2346 static void mw_ft_ack(struct mwFileTransfer *ft) { 2349 static void mw_ft_ack(struct mwFileTransfer *ft) {
2347 PurpleXfer *xfer; 2350 PurpleXfer *xfer;
2348 2351
2349 xfer = mwFileTransfer_getClientData(ft); 2352 xfer = mwFileTransfer_getClientData(ft);
2350 g_return_if_fail(xfer != NULL); 2353 g_return_if_fail(xfer != NULL);
2351 g_return_if_fail(xfer->watcher == 0); 2354 g_return_if_fail(purple_xfer_get_watcher(xfer) == 0);
2352 2355
2353 if(! mwFileTransfer_getRemaining(ft)) { 2356 if(! mwFileTransfer_getRemaining(ft)) {
2354 purple_xfer_set_completed(xfer, TRUE); 2357 purple_xfer_set_completed(xfer, TRUE);
2355 purple_xfer_end(xfer); 2358 purple_xfer_end(xfer);
2356 2359
2480 2483
2481 tmp = mwError(err); 2484 tmp = mwError(err);
2482 text = g_strconcat(_("Unable to send message: "), tmp, NULL); 2485 text = g_strconcat(_("Unable to send message: "), tmp, NULL);
2483 2486
2484 gconv = convo_get_gconv(conv); 2487 gconv = convo_get_gconv(conv);
2485 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)) {
2486 2489
2487 g_free(text); 2490 g_free(text);
2488 text = g_strdup_printf(_("Unable to send message to %s:"), 2491 text = g_strdup_printf(_("Unable to send message to %s:"),
2489 (idb->user)? idb->user: "(unknown)"); 2492 (idb->user)? idb->user: "(unknown)");
2490 purple_notify_error(purple_account_get_connection(gconv->account), 2493 purple_notify_error(purple_account_get_connection(purple_conversation_get_account(gconv)),
2491 NULL, text, tmp); 2494 NULL, text, tmp);
2492 } 2495 }
2493 2496
2494 g_free(tmp); 2497 g_free(tmp);
2495 g_free(text); 2498 g_free(text);
2523 PurpleConnection *gc; 2526 PurpleConnection *gc;
2524 2527
2525 gconv = convo_get_gconv(conv); 2528 gconv = convo_get_gconv(conv);
2526 if(! gconv) return; 2529 if(! gconv) return;
2527 2530
2528 gc = purple_conversation_get_gc(gconv); 2531 gc = purple_conversation_get_connection(gconv);
2529 if(! gc) return; 2532 if(! gc) return;
2530 2533
2531 purple_conversation_set_features(gconv, gc->flags); 2534 purple_conversation_set_features(gconv, purple_connection_get_flags(gc));
2532 } 2535 }
2533 2536
2534 2537
2535 /** called when a mw conversation and purple conversation come together, 2538 /** called when a mw conversation and purple conversation come together,
2536 to inform the purple conversation of what features to offer the 2539 to inform the purple conversation of what features to offer the
3192 3195
3193 mwSession_addCipher(pd->session, mwCipher_new_RC2_40(pd->session)); 3196 mwSession_addCipher(pd->session, mwCipher_new_RC2_40(pd->session));
3194 mwSession_addCipher(pd->session, mwCipher_new_RC2_128(pd->session)); 3197 mwSession_addCipher(pd->session, mwCipher_new_RC2_128(pd->session));
3195 3198
3196 mwSession_setClientData(pd->session, pd, NULL); 3199 mwSession_setClientData(pd->session, pd, NULL);
3197 gc->proto_data = pd; 3200 purple_connection_set_protocol_data(gc, pd);
3198 3201
3199 return pd; 3202 return pd;
3200 } 3203 }
3201 3204
3202 3205
3203 static void mwPurplePluginData_free(struct mwPurplePluginData *pd) { 3206 static void mwPurplePluginData_free(struct mwPurplePluginData *pd) {
3204 g_return_if_fail(pd != NULL); 3207 g_return_if_fail(pd != NULL);
3205 3208
3206 pd->gc->proto_data = NULL; 3209 purple_connection_set_protocol_data(pd->gc, NULL);
3207 3210
3208 mwSession_removeService(pd->session, mwService_AWARE); 3211 mwSession_removeService(pd->session, mwService_AWARE);
3209 mwSession_removeService(pd->session, mwService_CONFERENCE); 3212 mwSession_removeService(pd->session, mwService_CONFERENCE);
3210 mwSession_removeService(pd->session, mwService_FILE_TRANSFER); 3213 mwSession_removeService(pd->session, mwService_FILE_TRANSFER);
3211 mwSession_removeService(pd->session, mwService_IM); 3214 mwSession_removeService(pd->session, mwService_IM);
3263 struct mwPurplePluginData *pd; 3266 struct mwPurplePluginData *pd;
3264 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 };
3265 const char *ret = NULL; 3268 const char *ret = NULL;
3266 3269
3267 if ((gc = purple_account_get_connection(purple_buddy_get_account(b))) 3270 if ((gc = purple_account_get_connection(purple_buddy_get_account(b)))
3268 && (pd = gc->proto_data)) 3271 && (pd = purple_connection_get_protocol_data(gc)))
3269 ret = mwServiceAware_getText(pd->srvc_aware, &t); 3272 ret = mwServiceAware_getText(pd->srvc_aware, &t);
3270 3273
3271 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;
3272 } 3275 }
3273 3276
3326 const char *message = NULL; 3329 const char *message = NULL;
3327 const char *status; 3330 const char *status;
3328 char *tmp; 3331 char *tmp;
3329 3332
3330 if ((gc = purple_account_get_connection(purple_buddy_get_account(b))) 3333 if ((gc = purple_account_get_connection(purple_buddy_get_account(b)))
3331 && (pd = gc->proto_data)) 3334 && (pd = purple_connection_get_protocol_data(gc)))
3332 message = mwServiceAware_getText(pd->srvc_aware, &idb); 3335 message = mwServiceAware_getText(pd->srvc_aware, &idb);
3333 3336
3334 status = status_text(b); 3337 status = status_text(b);
3335 3338
3336 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)) {
3403 struct mwConference *conf; 3406 struct mwConference *conf;
3404 struct mwIdBlock idb = { NULL, NULL }; 3407 struct mwIdBlock idb = { NULL, NULL };
3405 3408
3406 acct = purple_buddy_get_account(buddy); 3409 acct = purple_buddy_get_account(buddy);
3407 gc = purple_account_get_connection(acct); 3410 gc = purple_account_get_connection(acct);
3408 pd = gc->proto_data; 3411 pd = purple_connection_get_protocol_data(gc);
3409 srvc = pd->srvc_conf; 3412 srvc = pd->srvc_conf;
3410 3413
3411 f = purple_request_fields_get_field(fields, CHAT_KEY_TOPIC); 3414 f = purple_request_fields_get_field(fields, CHAT_KEY_TOPIC);
3412 topic = purple_request_field_string_get_value(f); 3415 topic = purple_request_field_string_get_value(f);
3413 3416
3569 g_return_if_fail(acct != NULL); 3572 g_return_if_fail(acct != NULL);
3570 3573
3571 gc = purple_account_get_connection(acct); 3574 gc = purple_account_get_connection(acct);
3572 g_return_if_fail(gc != NULL); 3575 g_return_if_fail(gc != NULL);
3573 3576
3574 pd = gc->proto_data; 3577 pd = purple_connection_get_protocol_data(gc);
3575 g_return_if_fail(pd != NULL); 3578 g_return_if_fail(pd != NULL);
3576 3579
3577 /* 3580 /*
3578 - get a list of all conferences on this session 3581 - get a list of all conferences on this session
3579 - if none, prompt to create one, and invite buddy to it 3582 - if none, prompt to create one, and invite buddy to it
3608 g_return_if_fail(acct != NULL); 3611 g_return_if_fail(acct != NULL);
3609 3612
3610 gc = purple_account_get_connection(acct); 3613 gc = purple_account_get_connection(acct);
3611 g_return_if_fail(gc != NULL); 3614 g_return_if_fail(gc != NULL);
3612 3615
3613 pd = gc->proto_data; 3616 pd = purple_connection_get_protocol_data(gc);
3614 g_return_if_fail(pd != NULL); 3617 g_return_if_fail(pd != NULL);
3615 3618
3616 rcpt_name = g_strdup_printf("@U %s", buddy->name); 3619 rcpt_name = g_strdup_printf("@U %s", buddy->name);
3617 rcpt = g_list_prepend(NULL, rcpt_name); 3620 rcpt = g_list_prepend(NULL, rcpt_name);
3618 3621
3685 3688
3686 3689
3687 static void mw_prpl_login(PurpleAccount *acct); 3690 static void mw_prpl_login(PurpleAccount *acct);
3688 3691
3689 3692
3690 static void prompt_host_cancel_cb(PurpleConnection *gc) {
3691 const char *msg = _("No Sametime Community Server specified");
3692 purple_connection_error(gc,
3693 PURPLE_CONNECTION_ERROR_INVALID_SETTINGS,
3694 msg);
3695 }
3696
3697
3698 static void prompt_host_ok_cb(PurpleConnection *gc, const char *host) {
3699 if(host && *host) {
3700 PurpleAccount *acct = purple_connection_get_account(gc);
3701 purple_account_set_string(acct, MW_KEY_HOST, host);
3702 mw_prpl_login(acct);
3703
3704 } else {
3705 prompt_host_cancel_cb(gc);
3706 }
3707 }
3708
3709
3710 static void prompt_host(PurpleConnection *gc) {
3711 PurpleAccount *acct;
3712 const char *msgA;
3713 char *msg;
3714
3715 acct = purple_connection_get_account(gc);
3716 msgA = _("No host or IP address has been configured for the"
3717 " Meanwhile account %s. Please enter one below to"
3718 " continue logging in.");
3719 msg = g_strdup_printf(msgA, NSTR(purple_account_get_username(acct)));
3720
3721 purple_request_input(gc, _("Meanwhile Connection Setup"),
3722 _("No Sametime Community Server Specified"), msg,
3723 MW_PLUGIN_DEFAULT_HOST, FALSE, FALSE, NULL,
3724 _("Connect"), G_CALLBACK(prompt_host_ok_cb),
3725 _("Cancel"), G_CALLBACK(prompt_host_cancel_cb),
3726 acct, NULL, NULL,
3727 gc);
3728
3729 g_free(msg);
3730 }
3731
3732
3733 static void mw_prpl_login(PurpleAccount *account) { 3693 static void mw_prpl_login(PurpleAccount *account) {
3734 PurpleConnection *gc; 3694 PurpleConnection *gc;
3735 struct mwPurplePluginData *pd; 3695 struct mwPurplePluginData *pd;
3736 3696
3737 char *user, *pass, *host; 3697 char *user, *pass, *host;
3739 3699
3740 gc = purple_account_get_connection(account); 3700 gc = purple_account_get_connection(account);
3741 pd = mwPurplePluginData_new(gc); 3701 pd = mwPurplePluginData_new(gc);
3742 3702
3743 /* while we do support images, the default is to not offer it */ 3703 /* while we do support images, the default is to not offer it */
3744 gc->flags |= PURPLE_CONNECTION_NO_IMAGES; 3704 purple_connection_set_flags(gc, PURPLE_CONNECTION_NO_IMAGES);
3745 3705
3746 user = g_strdup(purple_account_get_username(account)); 3706 user = g_strdup(purple_account_get_username(account));
3747 3707
3748 host = strrchr(user, ':'); 3708 host = strrchr(user, ':');
3749 if(host) { 3709 if(host) {
3759 3719
3760 if(! host || ! *host) { 3720 if(! host || ! *host) {
3761 /* somehow, we don't have a host to connect to. Well, we need one 3721 /* somehow, we don't have a host to connect to. Well, we need one
3762 to actually continue, so let's ask the user directly. */ 3722 to actually continue, so let's ask the user directly. */
3763 g_free(user); 3723 g_free(user);
3764 prompt_host(gc); 3724 purple_connection_error(gc,
3725 PURPLE_CONNECTION_ERROR_INVALID_SETTINGS,
3726 _("A server is required to connect this account"));
3765 return; 3727 return;
3766 } 3728 }
3767 3729
3768 pass = g_strdup(purple_account_get_password(account)); 3730 pass = g_strdup(purple_account_get_password(account));
3769 port = purple_account_get_int(account, MW_KEY_PORT, MW_PLUGIN_DEFAULT_PORT); 3731 port = purple_account_get_int(account, MW_KEY_PORT, MW_PLUGIN_DEFAULT_PORT);
3813 static void mw_prpl_close(PurpleConnection *gc) { 3775 static void mw_prpl_close(PurpleConnection *gc) {
3814 struct mwPurplePluginData *pd; 3776 struct mwPurplePluginData *pd;
3815 3777
3816 g_return_if_fail(gc != NULL); 3778 g_return_if_fail(gc != NULL);
3817 3779
3818 pd = gc->proto_data; 3780 pd = purple_connection_get_protocol_data(gc);
3819 g_return_if_fail(pd != NULL); 3781 g_return_if_fail(pd != NULL);
3820 3782
3821 /* get rid of the blist save timeout */ 3783 /* get rid of the blist save timeout */
3822 if(pd->save_event) { 3784 if(pd->save_event) {
3823 purple_timeout_remove(pd->save_event); 3785 purple_timeout_remove(pd->save_event);
3827 3789
3828 /* stop the session */ 3790 /* stop the session */
3829 mwSession_stop(pd->session, 0x00); 3791 mwSession_stop(pd->session, 0x00);
3830 3792
3831 /* no longer necessary */ 3793 /* no longer necessary */
3832 gc->proto_data = NULL; 3794 purple_connection_set_protocol_data(gc, NULL);
3833 3795
3834 /* stop watching the socket */ 3796 /* stop watching the socket */
3835 if(gc->inpa) { 3797 if(pd->inpa) {
3836 purple_input_remove(gc->inpa); 3798 purple_input_remove(pd->inpa);
3837 gc->inpa = 0; 3799 pd->inpa = 0;
3838 } 3800 }
3839 3801
3840 /* clean up the rest */ 3802 /* clean up the rest */
3841 mwPurplePluginData_free(pd); 3803 mwPurplePluginData_free(pd);
3842 } 3804 }
4018 struct mwPurplePluginData *pd; 3980 struct mwPurplePluginData *pd;
4019 struct mwIdBlock who = { (char *) name, NULL }; 3981 struct mwIdBlock who = { (char *) name, NULL };
4020 struct mwConversation *conv; 3982 struct mwConversation *conv;
4021 3983
4022 g_return_val_if_fail(gc != NULL, 0); 3984 g_return_val_if_fail(gc != NULL, 0);
4023 pd = gc->proto_data; 3985 pd = purple_connection_get_protocol_data(gc);
4024 3986
4025 g_return_val_if_fail(pd != NULL, 0); 3987 g_return_val_if_fail(pd != NULL, 0);
4026 3988
4027 conv = mwServiceIm_getConversation(pd->srvc_im, &who); 3989 conv = mwServiceIm_getConversation(pd->srvc_im, &who);
4028 3990
4093 struct mwConversation *conv; 4055 struct mwConversation *conv;
4094 4056
4095 gpointer t = GINT_TO_POINTER(!! state); 4057 gpointer t = GINT_TO_POINTER(!! state);
4096 4058
4097 g_return_val_if_fail(gc != NULL, 0); 4059 g_return_val_if_fail(gc != NULL, 0);
4098 pd = gc->proto_data; 4060 pd = purple_connection_get_protocol_data(gc);
4099 4061
4100 g_return_val_if_fail(pd != NULL, 0); 4062 g_return_val_if_fail(pd != NULL, 0);
4101 4063
4102 conv = mwServiceIm_getConversation(pd->srvc_im, &who); 4064 conv = mwServiceIm_getConversation(pd->srvc_im, &who);
4103 4065
4189 const char *tmp2; 4151 const char *tmp2;
4190 4152
4191 g_return_if_fail(who != NULL); 4153 g_return_if_fail(who != NULL);
4192 g_return_if_fail(*who != '\0'); 4154 g_return_if_fail(*who != '\0');
4193 4155
4194 pd = gc->proto_data; 4156 pd = purple_connection_get_protocol_data(gc);
4195 4157
4196 acct = purple_connection_get_account(gc); 4158 acct = purple_connection_get_account(gc);
4197 b = purple_find_buddy(acct, who); 4159 b = purple_find_buddy(acct, who);
4198 user_info = purple_notify_user_info_new(); 4160 user_info = purple_notify_user_info_new();
4199 4161
4434 g_return_if_fail(data != NULL); 4396 g_return_if_fail(data != NULL);
4435 4397
4436 buddy = data->buddy; 4398 buddy = data->buddy;
4437 4399
4438 gc = purple_account_get_connection(purple_buddy_get_account(buddy)); 4400 gc = purple_account_get_connection(purple_buddy_get_account(buddy));
4439 pd = gc->proto_data; 4401 pd = purple_connection_get_protocol_data(gc);
4440 4402
4441 if(results) 4403 if(results)
4442 res = results->data; 4404 res = results->data;
4443 4405
4444 if(!code && res && res->matches) { 4406 if(!code && res && res->matches) {
4513 } 4475 }
4514 4476
4515 4477
4516 static void mw_prpl_add_buddy(PurpleConnection *gc, 4478 static void mw_prpl_add_buddy(PurpleConnection *gc,
4517 PurpleBuddy *buddy, 4479 PurpleBuddy *buddy,
4518 PurpleGroup *group) { 4480 PurpleGroup *group,
4519 4481 const char *message) {
4520 struct mwPurplePluginData *pd = gc->proto_data; 4482
4483 struct mwPurplePluginData *pd = purple_connection_get_protocol_data(gc);
4521 struct mwServiceResolve *srvc; 4484 struct mwServiceResolve *srvc;
4522 GList *query; 4485 GList *query;
4523 enum mwResolveFlag flags; 4486 enum mwResolveFlag flags;
4524 guint32 req; 4487 guint32 req;
4525 BuddyAddData *data; 4488 BuddyAddData *data;
4560 } 4523 }
4561 4524
4562 4525
4563 static void mw_prpl_add_buddies(PurpleConnection *gc, 4526 static void mw_prpl_add_buddies(PurpleConnection *gc,
4564 GList *buddies, 4527 GList *buddies,
4565 GList *groups) { 4528 GList *groups,
4529 const char *message) {
4566 4530
4567 struct mwPurplePluginData *pd; 4531 struct mwPurplePluginData *pd;
4568 GHashTable *group_sets; 4532 GHashTable *group_sets;
4569 struct mwAwareIdBlock *idbs, *idb; 4533 struct mwAwareIdBlock *idbs, *idb;
4570 4534
4571 pd = gc->proto_data; 4535 pd = purple_connection_get_protocol_data(gc);
4572 4536
4573 /* map PurpleGroup:GList of mwAwareIdBlock */ 4537 /* map PurpleGroup:GList of mwAwareIdBlock */
4574 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);
4575 4539
4576 /* bunch of mwAwareIdBlock allocated at once, free'd at once */ 4540 /* bunch of mwAwareIdBlock allocated at once, free'd at once */
4617 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 };
4618 struct mwAwareList *list; 4582 struct mwAwareList *list;
4619 4583
4620 GList *rem = g_list_prepend(NULL, &idb); 4584 GList *rem = g_list_prepend(NULL, &idb);
4621 4585
4622 pd = gc->proto_data; 4586 pd = purple_connection_get_protocol_data(gc);
4623 group = purple_buddy_get_group(buddy); 4587 group = purple_buddy_get_group(buddy);
4624 list = list_ensure(pd, group); 4588 list = list_ensure(pd, group);
4625 4589
4626 mwAwareList_removeAware(list, rem); 4590 mwAwareList_removeAware(list, rem);
4627 blist_schedule(pd); 4591 blist_schedule(pd);
4664 g_return_if_fail(gc != NULL); 4628 g_return_if_fail(gc != NULL);
4665 4629
4666 acct = purple_connection_get_account(gc); 4630 acct = purple_connection_get_account(gc);
4667 g_return_if_fail(acct != NULL); 4631 g_return_if_fail(acct != NULL);
4668 4632
4669 pd = gc->proto_data; 4633 pd = purple_connection_get_protocol_data(gc);
4670 g_return_if_fail(pd != NULL); 4634 g_return_if_fail(pd != NULL);
4671 4635
4672 session = pd->session; 4636 session = pd->session;
4673 g_return_if_fail(session != NULL); 4637 g_return_if_fail(session != NULL);
4674 4638
4675 switch(acct->perm_deny) { 4639 switch(purple_account_get_privacy_type(acct)) {
4676 case PURPLE_PRIVACY_DENY_USERS: 4640 case PURPLE_PRIVACY_DENY_USERS:
4677 DEBUG_INFO("PURPLE_PRIVACY_DENY_USERS\n"); 4641 DEBUG_INFO("PURPLE_PRIVACY_DENY_USERS\n");
4678 privacy_fill(&privacy, acct->deny); 4642 privacy_fill(&privacy, acct->deny);
4679 privacy.deny = TRUE; 4643 privacy.deny = TRUE;
4680 break; 4644 break;
4694 DEBUG_INFO("PURPLE_PRIVACY_DENY_ALL\n"); 4658 DEBUG_INFO("PURPLE_PRIVACY_DENY_ALL\n");
4695 privacy.deny = FALSE; 4659 privacy.deny = FALSE;
4696 break; 4660 break;
4697 4661
4698 default: 4662 default:
4699 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));
4700 return; 4664 return;
4701 } 4665 }
4702 4666
4703 mwSession_setPrivacyInfo(session, &privacy); 4667 mwSession_setPrivacyInfo(session, &privacy);
4704 g_free(privacy.users); 4668 g_free(privacy.users);
4748 GHashTable *components) { 4712 GHashTable *components) {
4749 4713
4750 struct mwPurplePluginData *pd; 4714 struct mwPurplePluginData *pd;
4751 char *c, *t; 4715 char *c, *t;
4752 4716
4753 pd = gc->proto_data; 4717 pd = purple_connection_get_protocol_data(gc);
4754 4718
4755 c = g_hash_table_lookup(components, CHAT_KEY_NAME); 4719 c = g_hash_table_lookup(components, CHAT_KEY_NAME);
4756 t = g_hash_table_lookup(components, CHAT_KEY_TOPIC); 4720 t = g_hash_table_lookup(components, CHAT_KEY_TOPIC);
4757 4721
4758 if(g_hash_table_lookup(components, CHAT_KEY_IS_PLACE)) { 4722 if(g_hash_table_lookup(components, CHAT_KEY_IS_PLACE)) {
4790 4754
4791 struct mwPurplePluginData *pd; 4755 struct mwPurplePluginData *pd;
4792 struct mwServiceConference *srvc; 4756 struct mwServiceConference *srvc;
4793 char *c; 4757 char *c;
4794 4758
4795 pd = gc->proto_data; 4759 pd = purple_connection_get_protocol_data(gc);
4796 srvc = pd->srvc_conf; 4760 srvc = pd->srvc_conf;
4797 4761
4798 if(g_hash_table_lookup(components, CHAT_KEY_IS_PLACE)) { 4762 if(g_hash_table_lookup(components, CHAT_KEY_IS_PLACE)) {
4799 ; /* nothing needs doing */ 4763 ; /* nothing needs doing */
4800 4764
4822 struct mwPurplePluginData *pd; 4786 struct mwPurplePluginData *pd;
4823 struct mwConference *conf; 4787 struct mwConference *conf;
4824 struct mwPlace *place; 4788 struct mwPlace *place;
4825 struct mwIdBlock idb = { (char *) who, NULL }; 4789 struct mwIdBlock idb = { (char *) who, NULL };
4826 4790
4827 pd = gc->proto_data; 4791 pd = purple_connection_get_protocol_data(gc);
4828 g_return_if_fail(pd != NULL); 4792 g_return_if_fail(pd != NULL);
4829 4793
4830 conf = ID_TO_CONF(pd, id); 4794 conf = ID_TO_CONF(pd, id);
4831 4795
4832 if(conf) { 4796 if(conf) {
4846 int id) { 4810 int id) {
4847 4811
4848 struct mwPurplePluginData *pd; 4812 struct mwPurplePluginData *pd;
4849 struct mwConference *conf; 4813 struct mwConference *conf;
4850 4814
4851 pd = gc->proto_data; 4815 pd = purple_connection_get_protocol_data(gc);
4852 4816
4853 g_return_if_fail(pd != NULL); 4817 g_return_if_fail(pd != NULL);
4854 conf = ID_TO_CONF(pd, id); 4818 conf = ID_TO_CONF(pd, id);
4855 4819
4856 if(conf) { 4820 if(conf) {
4882 struct mwPurplePluginData *pd; 4846 struct mwPurplePluginData *pd;
4883 struct mwConference *conf; 4847 struct mwConference *conf;
4884 char *msg; 4848 char *msg;
4885 int ret; 4849 int ret;
4886 4850
4887 pd = gc->proto_data; 4851 pd = purple_connection_get_protocol_data(gc);
4888 4852
4889 g_return_val_if_fail(pd != NULL, 0); 4853 g_return_val_if_fail(pd != NULL, 0);
4890 conf = ID_TO_CONF(pd, id); 4854 conf = ID_TO_CONF(pd, id);
4891 4855
4892 msg = purple_markup_strip_html(message); 4856 msg = purple_markup_strip_html(message);
4920 4884
4921 static void mw_prpl_alias_buddy(PurpleConnection *gc, 4885 static void mw_prpl_alias_buddy(PurpleConnection *gc,
4922 const char *who, 4886 const char *who,
4923 const char *alias) { 4887 const char *alias) {
4924 4888
4925 struct mwPurplePluginData *pd = gc->proto_data; 4889 struct mwPurplePluginData *pd = purple_connection_get_protocol_data(gc);
4926 g_return_if_fail(pd != NULL); 4890 g_return_if_fail(pd != NULL);
4927 4891
4928 /* 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
4929 the server copy */ 4893 the server copy */
4930 4894
4938 const char *new_group) { 4902 const char *new_group) {
4939 4903
4940 struct mwAwareIdBlock idb = { mwAware_USER, (char *) who, NULL }; 4904 struct mwAwareIdBlock idb = { mwAware_USER, (char *) who, NULL };
4941 GList *gl = g_list_prepend(NULL, &idb); 4905 GList *gl = g_list_prepend(NULL, &idb);
4942 4906
4943 struct mwPurplePluginData *pd = gc->proto_data; 4907 struct mwPurplePluginData *pd = purple_connection_get_protocol_data(gc);
4944 PurpleGroup *group; 4908 PurpleGroup *group;
4945 struct mwAwareList *list; 4909 struct mwAwareList *list;
4946 4910
4947 /* add who to new_group's aware list */ 4911 /* add who to new_group's aware list */
4948 group = purple_find_group(new_group); 4912 group = purple_find_group(new_group);
4964 static void mw_prpl_rename_group(PurpleConnection *gc, 4928 static void mw_prpl_rename_group(PurpleConnection *gc,
4965 const char *old, 4929 const char *old,
4966 PurpleGroup *group, 4930 PurpleGroup *group,
4967 GList *buddies) { 4931 GList *buddies) {
4968 4932
4969 struct mwPurplePluginData *pd = gc->proto_data; 4933 struct mwPurplePluginData *pd = purple_connection_get_protocol_data(gc);
4970 g_return_if_fail(pd != NULL); 4934 g_return_if_fail(pd != NULL);
4971 4935
4972 /* 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
4973 the server copy. Also, having this function should prevent all 4937 the server copy. Also, having this function should prevent all
4974 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
4984 ; 4948 ;
4985 } 4949 }
4986 4950
4987 4951
4988 static void mw_prpl_convo_closed(PurpleConnection *gc, const char *who) { 4952 static void mw_prpl_convo_closed(PurpleConnection *gc, const char *who) {
4989 struct mwPurplePluginData *pd = gc->proto_data; 4953 struct mwPurplePluginData *pd = purple_connection_get_protocol_data(gc);
4990 struct mwServiceIm *srvc; 4954 struct mwServiceIm *srvc;
4991 struct mwConversation *conv; 4955 struct mwConversation *conv;
4992 struct mwIdBlock idb = { (char *) who, NULL }; 4956 struct mwIdBlock idb = { (char *) who, NULL };
4993 4957
4994 g_return_if_fail(pd != NULL); 4958 g_return_if_fail(pd != NULL);
5019 4983
5020 static void mw_prpl_remove_group(PurpleConnection *gc, PurpleGroup *group) { 4984 static void mw_prpl_remove_group(PurpleConnection *gc, PurpleGroup *group) {
5021 struct mwPurplePluginData *pd; 4985 struct mwPurplePluginData *pd;
5022 struct mwAwareList *list; 4986 struct mwAwareList *list;
5023 4987
5024 pd = gc->proto_data; 4988 pd = purple_connection_get_protocol_data(gc);
5025 g_return_if_fail(pd != NULL); 4989 g_return_if_fail(pd != NULL);
5026 g_return_if_fail(pd->group_list_map != NULL); 4990 g_return_if_fail(pd->group_list_map != NULL);
5027 4991
5028 list = g_hash_table_lookup(pd->group_list_map, group); 4992 list = g_hash_table_lookup(pd->group_list_map, group);
5029 4993
5043 struct mwServiceAware *srvc; 5007 struct mwServiceAware *srvc;
5044 PurpleAccount *acct; 5008 PurpleAccount *acct;
5045 5009
5046 g_return_val_if_fail(gc != NULL, FALSE); 5010 g_return_val_if_fail(gc != NULL, FALSE);
5047 5011
5048 pd = gc->proto_data; 5012 pd = purple_connection_get_protocol_data(gc);
5049 g_return_val_if_fail(pd != NULL, FALSE); 5013 g_return_val_if_fail(pd != NULL, FALSE);
5050 5014
5051 srvc = pd->srvc_aware; 5015 srvc = pd->srvc_aware;
5052 g_return_val_if_fail(srvc != NULL, FALSE); 5016 g_return_val_if_fail(srvc != NULL, FALSE);
5053 5017
5075 5039
5076 DEBUG_INFO("ft_outgoing_init\n"); 5040 DEBUG_INFO("ft_outgoing_init\n");
5077 5041
5078 acct = purple_xfer_get_account(xfer); 5042 acct = purple_xfer_get_account(xfer);
5079 gc = purple_account_get_connection(acct); 5043 gc = purple_account_get_connection(acct);
5080 pd = gc->proto_data; 5044 pd = purple_connection_get_protocol_data(gc);
5081 srvc = pd->srvc_ft; 5045 srvc = pd->srvc_ft;
5082 5046
5083 filename = purple_xfer_get_local_filename(xfer); 5047 filename = purple_xfer_get_local_filename(xfer);
5084 filesize = purple_xfer_get_size(xfer); 5048 filesize = purple_xfer_get_size(xfer);
5085 idb.user = xfer->who; 5049 idb.user = purple_xfer_get_remote_user(xfer);
5086 5050
5087 purple_xfer_update_progress(xfer); 5051 purple_xfer_update_progress(xfer);
5088 5052
5089 /* test that we can actually send the file */ 5053 /* test that we can actually send the file */
5090 fp = g_fopen(filename, "rb"); 5054 fp = g_fopen(filename, "rb");
5091 if(! fp) { 5055 if(! fp) {
5092 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"),
5093 filename, g_strerror(errno)); 5057 filename, g_strerror(errno));
5094 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);
5095 g_free(msg); 5059 g_free(msg);
5096 return; 5060 return;
5097 } 5061 }
5098 fclose(fp); 5062 fclose(fp);
5099 5063
5104 5068
5105 ft = mwFileTransfer_new(srvc, &idb, NULL, filename, filesize); 5069 ft = mwFileTransfer_new(srvc, &idb, NULL, filename, filesize);
5106 5070
5107 purple_xfer_ref(xfer); 5071 purple_xfer_ref(xfer);
5108 mwFileTransfer_setClientData(ft, xfer, (GDestroyNotify) purple_xfer_unref); 5072 mwFileTransfer_setClientData(ft, xfer, (GDestroyNotify) purple_xfer_unref);
5109 xfer->data = ft; 5073 purple_xfer_set_protocol_data(xfer, ft);
5110 5074
5111 mwFileTransfer_offer(ft); 5075 mwFileTransfer_offer(ft);
5112 } 5076 }
5113 5077
5114 5078
5115 static void ft_outgoing_cancel(PurpleXfer *xfer) { 5079 static void ft_outgoing_cancel(PurpleXfer *xfer) {
5116 struct mwFileTransfer *ft = xfer->data; 5080 struct mwFileTransfer *ft = purple_xfer_get_protocol_data(xfer);
5117 5081
5118 DEBUG_INFO("ft_outgoing_cancel called\n"); 5082 DEBUG_INFO("ft_outgoing_cancel called\n");
5119 5083
5120 if(ft) mwFileTransfer_cancel(ft); 5084 if(ft) mwFileTransfer_cancel(ft);
5121 } 5085 }
5152 } 5116 }
5153 } 5117 }
5154 5118
5155 5119
5156 static PurplePluginProtocolInfo mw_prpl_info = { 5120 static PurplePluginProtocolInfo mw_prpl_info = {
5157 .options = OPT_PROTO_IM_IMAGE, 5121 sizeof(PurplePluginProtocolInfo),
5158 .user_splits = NULL, /*< set in mw_plugin_init */ 5122 OPT_PROTO_IM_IMAGE,
5159 .protocol_options = NULL, /*< set in mw_plugin_init */ 5123 NULL, /*< set in mw_plugin_init */
5160 .icon_spec = NO_BUDDY_ICONS, 5124 NULL, /*< set in mw_plugin_init */
5161 .list_icon = mw_prpl_list_icon, 5125 NO_BUDDY_ICONS,
5162 .list_emblem = mw_prpl_list_emblem, 5126 mw_prpl_list_icon,
5163 .status_text = mw_prpl_status_text, 5127 mw_prpl_list_emblem,
5164 .tooltip_text = mw_prpl_tooltip_text, 5128 mw_prpl_status_text,
5165 .status_types = mw_prpl_status_types, 5129 mw_prpl_tooltip_text,
5166 .blist_node_menu = mw_prpl_blist_node_menu, 5130 mw_prpl_status_types,
5167 .chat_info = mw_prpl_chat_info, 5131 mw_prpl_blist_node_menu,
5168 .chat_info_defaults = mw_prpl_chat_info_defaults, 5132 mw_prpl_chat_info,
5169 .login = mw_prpl_login, 5133 mw_prpl_chat_info_defaults,
5170 .close = mw_prpl_close, 5134 mw_prpl_login,
5171 .send_im = mw_prpl_send_im, 5135 mw_prpl_close,
5172 .set_info = NULL, 5136 mw_prpl_send_im,
5173 .send_typing = mw_prpl_send_typing, 5137 NULL,
5174 .get_info = mw_prpl_get_info, 5138 mw_prpl_send_typing,
5175 .set_status = mw_prpl_set_status, 5139 mw_prpl_get_info,
5176 .set_idle = mw_prpl_set_idle, 5140 mw_prpl_set_status,
5177 .change_passwd = NULL, 5141 mw_prpl_set_idle,
5178 .add_buddy = mw_prpl_add_buddy, 5142 NULL,
5179 .add_buddies = mw_prpl_add_buddies, 5143 mw_prpl_add_buddy,
5180 .remove_buddy = mw_prpl_remove_buddy, 5144 mw_prpl_add_buddies,
5181 .remove_buddies = NULL, 5145 mw_prpl_remove_buddy,
5182 .add_permit = mw_prpl_add_permit, 5146 NULL,
5183 .add_deny = mw_prpl_add_deny, 5147 mw_prpl_add_permit,
5184 .rem_permit = mw_prpl_rem_permit, 5148 mw_prpl_add_deny,
5185 .rem_deny = mw_prpl_rem_deny, 5149 mw_prpl_rem_permit,
5186 .set_permit_deny = mw_prpl_set_permit_deny, 5150 mw_prpl_rem_deny,
5187 .join_chat = mw_prpl_join_chat, 5151 mw_prpl_set_permit_deny,
5188 .reject_chat = mw_prpl_reject_chat, 5152 mw_prpl_join_chat,
5189 .get_chat_name = mw_prpl_get_chat_name, 5153 mw_prpl_reject_chat,
5190 .chat_invite = mw_prpl_chat_invite, 5154 mw_prpl_get_chat_name,
5191 .chat_leave = mw_prpl_chat_leave, 5155 mw_prpl_chat_invite,
5192 .chat_whisper = mw_prpl_chat_whisper, 5156 mw_prpl_chat_leave,
5193 .chat_send = mw_prpl_chat_send, 5157 mw_prpl_chat_whisper,
5194 .keepalive = mw_prpl_keepalive, 5158 mw_prpl_chat_send,
5195 .register_user = NULL, 5159 mw_prpl_keepalive,
5196 .get_cb_info = NULL, 5160 NULL,
5197 .get_cb_away = NULL, 5161 NULL,
5198 .alias_buddy = mw_prpl_alias_buddy, 5162 mw_prpl_alias_buddy,
5199 .group_buddy = mw_prpl_group_buddy, 5163 mw_prpl_group_buddy,
5200 .rename_group = mw_prpl_rename_group, 5164 mw_prpl_rename_group,
5201 .buddy_free = mw_prpl_buddy_free, 5165 mw_prpl_buddy_free,
5202 .convo_closed = mw_prpl_convo_closed, 5166 mw_prpl_convo_closed,
5203 .normalize = mw_prpl_normalize, 5167 mw_prpl_normalize,
5204 .set_buddy_icon = NULL, 5168 NULL,
5205 .remove_group = mw_prpl_remove_group, 5169 mw_prpl_remove_group,
5206 .get_cb_real_name = NULL, 5170 NULL,
5207 .set_chat_topic = NULL, 5171 NULL,
5208 .find_blist_chat = NULL, 5172 NULL,
5209 .roomlist_get_list = NULL, 5173 NULL,
5210 .roomlist_expand_category = NULL, 5174 NULL,
5211 .can_receive_file = mw_prpl_can_receive_file, 5175 NULL,
5212 .send_file = mw_prpl_send_file, 5176 mw_prpl_can_receive_file,
5213 .new_xfer = mw_prpl_new_xfer, 5177 mw_prpl_send_file,
5214 .offline_message = NULL, 5178 mw_prpl_new_xfer,
5215 .whiteboard_prpl_ops = NULL, 5179 NULL,
5216 .send_raw = NULL, 5180 NULL,
5217 .struct_size = sizeof(PurplePluginProtocolInfo) 5181 NULL,
5182 NULL,
5183 NULL,
5184 NULL,
5185 NULL,
5186 NULL,
5187 NULL,
5188 NULL,
5189 NULL,
5190 NULL,
5191 NULL
5218 }; 5192 };
5219 5193
5220 5194
5221 static PurplePluginPrefFrame * 5195 static PurplePluginPrefFrame *
5222 mw_plugin_get_plugin_pref_frame(PurplePlugin *plugin) { 5196 mw_plugin_get_plugin_pref_frame(PurplePlugin *plugin) {
5534 struct mwServiceResolve *srvc; 5508 struct mwServiceResolve *srvc;
5535 GList *query; 5509 GList *query;
5536 enum mwResolveFlag flags; 5510 enum mwResolveFlag flags;
5537 guint32 req; 5511 guint32 req;
5538 5512
5539 pd = gc->proto_data; 5513 pd = purple_connection_get_protocol_data(gc);
5540 srvc = pd->srvc_resolve; 5514 srvc = pd->srvc_resolve;
5541 5515
5542 query = g_list_prepend(NULL, (char *) name); 5516 query = g_list_prepend(NULL, (char *) name);
5543 flags = mwResolveFlag_FIRST | mwResolveFlag_GROUPS; 5517 flags = mwResolveFlag_FIRST | mwResolveFlag_GROUPS;
5544 5518
5659 struct mwServiceResolve *srvc; 5633 struct mwServiceResolve *srvc;
5660 GList *query; 5634 GList *query;
5661 enum mwResolveFlag flags; 5635 enum mwResolveFlag flags;
5662 guint32 req; 5636 guint32 req;
5663 5637
5664 pd = gc->proto_data; 5638 pd = purple_connection_get_protocol_data(gc);
5665 srvc = pd->srvc_resolve; 5639 srvc = pd->srvc_resolve;
5666 5640
5667 query = g_list_prepend(NULL, (char *) name); 5641 query = g_list_prepend(NULL, (char *) name);
5668 flags = mwResolveFlag_FIRST | mwResolveFlag_USERS; 5642 flags = mwResolveFlag_FIRST | mwResolveFlag_USERS;
5669 5643
5789 } 5763 }
5790 } 5764 }
5791 5765
5792 5766
5793 static void mw_plugin_init(PurplePlugin *plugin) { 5767 static void mw_plugin_init(PurplePlugin *plugin) {
5768 PurpleAccountUserSplit *split;
5794 PurpleAccountOption *opt; 5769 PurpleAccountOption *opt;
5795 GList *l = NULL; 5770 GList *l = NULL;
5796 5771
5797 GLogLevelFlags logflags = 5772 GLogLevelFlags logflags =
5798 G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION; 5773 G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION;
5799 5774
5800 /* set up the preferences */ 5775 /* set up the preferences */
5801 purple_prefs_add_none(MW_PRPL_OPT_BASE); 5776 purple_prefs_add_none(MW_PRPL_OPT_BASE);
5802 purple_prefs_add_int(MW_PRPL_OPT_BLIST_ACTION, BLIST_CHOICE_DEFAULT); 5777 purple_prefs_add_int(MW_PRPL_OPT_BLIST_ACTION, BLIST_CHOICE_DEFAULT);
5803 5778
5779 /* set up account ID as user:server */
5780 split = purple_account_user_split_new(_("Server"),
5781 MW_PLUGIN_DEFAULT_HOST, ':');
5782 mw_prpl_info.user_splits = g_list_append(mw_prpl_info.user_splits, split);
5783
5804 /* remove dead preferences */ 5784 /* remove dead preferences */
5805 purple_prefs_remove(MW_PRPL_OPT_PSYCHIC); 5785 purple_prefs_remove(MW_PRPL_OPT_PSYCHIC);
5806 purple_prefs_remove(MW_PRPL_OPT_SAVE_DYNAMIC); 5786 purple_prefs_remove(MW_PRPL_OPT_SAVE_DYNAMIC);
5807
5808 /* host to connect to */
5809 opt = purple_account_option_string_new(_("Server"), MW_KEY_HOST,
5810 MW_PLUGIN_DEFAULT_HOST);
5811 l = g_list_append(l, opt);
5812 5787
5813 /* port to connect to */ 5788 /* port to connect to */
5814 opt = purple_account_option_int_new(_("Port"), MW_KEY_PORT, 5789 opt = purple_account_option_int_new(_("Port"), MW_KEY_PORT,
5815 MW_PLUGIN_DEFAULT_PORT); 5790 MW_PLUGIN_DEFAULT_PORT);
5816 l = g_list_append(l, opt); 5791 l = g_list_append(l, opt);