Mercurial > pidgin
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); |