Mercurial > pidgin.yaz
annotate src/protocols/sametime/sametime.c @ 12919:248b8b39c671
[gaim-migrate @ 15272]
Replace GaimBlistNodeAction with the more generic GaimMenuAction, this is in
preparation for letting the chat room user list have extensible menus like the
blist entries do. (I know it's not exactly the prettiest, and the callback
isn't exactly type-safe, when we eventually gobjectify everything we can get
some safety back by using (GObject, gpointer) but that's for later.)
I'm planning to look into merging GaimPluginActions into GaimMenuActions as
well.
committer: Tailor Script <tailor@pidgin.im>
author | Etan Reisner <pidgin@unreliablesource.net> |
---|---|
date | Tue, 17 Jan 2006 23:22:19 +0000 |
parents | 2c0f8815aa2e |
children | 66e424d4bc77 |
rev | line source |
---|---|
10977 | 1 |
2 /* | |
3 Meanwhile Protocol Plugin for Gaim | |
4 Adds Lotus Sametime support to Gaim using the Meanwhile library | |
5 | |
6 Copyright (C) 2004 Christopher (siege) O'Brien <siege@preoccupied.net> | |
7 | |
8 This program is free software; you can redistribute it and/or modify | |
9 it under the terms of the GNU General Public License as published by | |
10 the Free Software Foundation; either version 2 of the License, or (at | |
11 your option) any later version. | |
12 | |
13 This program is distributed in the hope that it will be useful, but | |
14 WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
16 General Public License for more details. | |
17 | |
18 You should have received a copy of the GNU General Public License | |
19 along with this program; if not, write to the Free Software | |
20 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | |
21 USA. | |
22 */ | |
23 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
24 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
25 /* system includes */ |
10977 | 26 #include <stdlib.h> |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
27 #include <time.h> |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
28 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
29 /* glib includes */ |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
30 #include <glib.h> |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
31 #include <glib/ghash.h> |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
32 #include <glib/glist.h> |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
33 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
34 /* gaim includes */ |
10977 | 35 #include <internal.h> |
36 #include <gaim.h> | |
37 #include <config.h> | |
38 | |
39 #include <account.h> | |
40 #include <accountopt.h> | |
41 #include <conversation.h> | |
42 #include <debug.h> | |
43 #include <ft.h> | |
44 #include <imgstore.h> | |
45 #include <mime.h> | |
46 #include <notify.h> | |
47 #include <plugin.h> | |
48 #include <privacy.h> | |
49 #include <prpl.h> | |
50 #include <request.h> | |
51 #include <util.h> | |
52 #include <version.h> | |
53 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
54 /* meanwhile includes */ |
10977 | 55 #include <mw_cipher.h> |
56 #include <mw_common.h> | |
57 #include <mw_error.h> | |
58 #include <mw_service.h> | |
59 #include <mw_session.h> | |
60 #include <mw_srvc_aware.h> | |
61 #include <mw_srvc_conf.h> | |
62 #include <mw_srvc_ft.h> | |
63 #include <mw_srvc_im.h> | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
64 #include <mw_srvc_place.h> |
10977 | 65 #include <mw_srvc_resolve.h> |
66 #include <mw_srvc_store.h> | |
67 #include <mw_st_list.h> | |
68 | |
12813
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
69 /* plugin includes */ |
10977 | 70 #include "sametime.h" |
71 | |
72 | |
73 /* considering that there's no display of this information for prpls, | |
74 I don't know why I even bother providing these. Oh valiant reader, | |
75 I do it all for you. */ | |
76 /* scratch that, I just added it to the prpl options panel */ | |
77 #define PLUGIN_ID "prpl-meanwhile" | |
78 #define PLUGIN_NAME "Sametime" | |
79 #define PLUGIN_SUMMARY "Sametime Protocol Plugin" | |
80 #define PLUGIN_DESC "Open implementation of a Lotus Sametime client" | |
81 #define PLUGIN_AUTHOR "Christopher (siege) O'Brien <siege@preoccupied.net>" | |
82 #define PLUGIN_HOMEPAGE "http://meanwhile.sourceforge.net/" | |
83 | |
84 | |
85 /* plugin preference names */ | |
86 #define MW_PRPL_OPT_BASE "/plugins/prpl/meanwhile" | |
87 #define MW_PRPL_OPT_BLIST_ACTION MW_PRPL_OPT_BASE "/blist_action" | |
88 #define MW_PRPL_OPT_PSYCHIC MW_PRPL_OPT_BASE "/psychic" | |
89 #define MW_PRPL_OPT_FORCE_LOGIN MW_PRPL_OPT_BASE "/force_login" | |
90 #define MW_PRPL_OPT_SAVE_DYNAMIC MW_PRPL_OPT_BASE "/save_dynamic" | |
91 | |
92 | |
93 /* stages of connecting-ness */ | |
12813
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
94 #define MW_CONNECT_STEPS 10 |
10977 | 95 |
96 | |
97 /* stages of conciousness */ | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
98 #define MW_STATE_OFFLINE "offline" |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
99 #define MW_STATE_ACTIVE "active" |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
100 #define MW_STATE_AWAY "away" |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
101 #define MW_STATE_BUSY "dnd" |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
102 #define MW_STATE_MESSAGE "message" |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
103 #define MW_STATE_ENLIGHTENED "buddha" |
10977 | 104 |
105 | |
106 /* keys to get/set chat information */ | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
107 #define CHAT_KEY_CREATOR "chat.creator" |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
108 #define CHAT_KEY_NAME "chat.name" |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
109 #define CHAT_KEY_TOPIC "chat.topic" |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
110 #define CHAT_KEY_INVITE "chat.invite" |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
111 #define CHAT_KEY_IS_PLACE "chat.is_place" |
10977 | 112 |
113 | |
114 /* key for associating a mwLoginType with a buddy */ | |
115 #define BUDDY_KEY_CLIENT "meanwhile.client" | |
116 | |
117 /* store the remote alias so that we can re-create it easily */ | |
118 #define BUDDY_KEY_NAME "meanwhile.shortname" | |
119 | |
120 /* enum mwSametimeUserType */ | |
121 #define BUDDY_KEY_TYPE "meanwhile.type" | |
122 | |
123 | |
124 /* key for the real group name for a meanwhile group */ | |
125 #define GROUP_KEY_NAME "meanwhile.group" | |
126 | |
127 /* enum mwSametimeGroupType */ | |
128 #define GROUP_KEY_TYPE "meanwhile.type" | |
129 | |
130 /* NAB group owning account */ | |
131 #define GROUP_KEY_OWNER "meanwhile.account" | |
132 | |
133 /* key gtk blist uses to indicate a collapsed group */ | |
134 #define GROUP_KEY_COLLAPSED "collapsed" | |
135 | |
136 | |
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
137 /* verification replacement */ |
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
138 #define mwSession_NO_SECRET "meanwhile.no_secret" |
10977 | 139 |
140 | |
141 /* keys to get/set gaim plugin information */ | |
142 #define MW_KEY_HOST "server" | |
143 #define MW_KEY_PORT "port" | |
144 #define MW_KEY_ACTIVE_MSG "active_msg" | |
145 #define MW_KEY_AWAY_MSG "away_msg" | |
146 #define MW_KEY_BUSY_MSG "busy_msg" | |
147 #define MW_KEY_MSG_PROMPT "msg_prompt" | |
148 #define MW_KEY_INVITE "conf_invite" | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
149 #define MW_KEY_ENCODING "encoding" |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
150 #define MW_KEY_FORCE "force_login" |
12311
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
151 #define MW_KEY_FAKE_IT "fake_client_id" |
10977 | 152 |
153 | |
154 /** number of seconds from the first blist change before a save to the | |
155 storage service occurs. */ | |
156 #define BLIST_SAVE_SECONDS 15 | |
157 | |
158 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
159 /** the possible buddy list storage settings */ |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
160 enum blist_choice { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
161 blist_choice_LOCAL = 1, /**< local only */ |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
162 blist_choice_MERGE = 2, /**< merge from server */ |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
163 blist_choice_STORE = 3, /**< merge from and save to server */ |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
164 blist_choice_SYNCH = 4, /**< sync with server */ |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
165 }; |
10977 | 166 |
167 | |
168 /** the default blist storage option */ | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
169 #define BLIST_CHOICE_DEFAULT blist_choice_SYNCH |
10977 | 170 |
171 | |
172 /* testing for the above */ | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
173 #define BLIST_PREF_IS(n) (gaim_prefs_get_int(MW_PRPL_OPT_BLIST_ACTION)==(n)) |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
174 #define BLIST_PREF_IS_LOCAL() BLIST_PREF_IS(blist_choice_LOCAL) |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
175 #define BLIST_PREF_IS_MERGE() BLIST_PREF_IS(blist_choice_MERGE) |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
176 #define BLIST_PREF_IS_STORE() BLIST_PREF_IS(blist_choice_STORE) |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
177 #define BLIST_PREF_IS_SYNCH() BLIST_PREF_IS(blist_choice_SYNCH) |
10977 | 178 |
179 | |
180 /* debugging output */ | |
181 #define DEBUG_ERROR(a...) gaim_debug_error(G_LOG_DOMAIN, a) | |
182 #define DEBUG_INFO(a...) gaim_debug_info(G_LOG_DOMAIN, a) | |
183 #define DEBUG_MISC(a...) gaim_debug_misc(G_LOG_DOMAIN, a) | |
184 #define DEBUG_WARN(a...) gaim_debug_warning(G_LOG_DOMAIN, a) | |
185 | |
186 | |
187 /** ensure non-null strings */ | |
188 #ifndef NSTR | |
189 # define NSTR(str) ((str)? (str): "(null)") | |
190 #endif | |
191 | |
192 | |
193 /** calibrates distinct secure channel nomenclature */ | |
194 static const unsigned char no_secret[] = { | |
195 0x2d, 0x2d, 0x20, 0x73, 0x69, 0x65, 0x67, 0x65, | |
196 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x73, 0x20, 0x6a, | |
197 0x65, 0x6e, 0x6e, 0x69, 0x20, 0x61, 0x6e, 0x64, | |
198 0x20, 0x7a, 0x6f, 0x65, 0x20, 0x2d, 0x2d, 0x00, | |
199 }; | |
200 | |
201 | |
202 /** handler IDs from g_log_set_handler in mw_plugin_init */ | |
203 static guint log_handler[2] = { 0, 0 }; | |
204 | |
205 | |
206 /** the gaim plugin data. | |
207 available as gc->proto_data and mwSession_getClientData */ | |
208 struct mwGaimPluginData { | |
209 struct mwSession *session; | |
210 | |
211 struct mwServiceAware *srvc_aware; | |
212 struct mwServiceConference *srvc_conf; | |
213 struct mwServiceFileTransfer *srvc_ft; | |
214 struct mwServiceIm *srvc_im; | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
215 struct mwServicePlace *srvc_place; |
10977 | 216 struct mwServiceResolve *srvc_resolve; |
217 struct mwServiceStorage *srvc_store; | |
218 | |
219 /** map of GaimGroup:mwAwareList and mwAwareList:GaimGroup */ | |
220 GHashTable *group_list_map; | |
221 | |
222 /** event id for the buddy list save callback */ | |
223 guint save_event; | |
224 | |
225 /** socket fd */ | |
226 int socket; | |
227 | |
228 GaimConnection *gc; | |
229 }; | |
230 | |
231 | |
232 /* blist and aware functions */ | |
233 | |
234 static void blist_export(GaimConnection *gc, struct mwSametimeList *stlist); | |
235 | |
236 static void blist_store(struct mwGaimPluginData *pd); | |
237 | |
238 static void blist_schedule(struct mwGaimPluginData *pd); | |
239 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
240 static void blist_merge(GaimConnection *gc, struct mwSametimeList *stlist); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
241 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
242 static void blist_sync(GaimConnection *gc, struct mwSametimeList *stlist); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
243 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
244 static gboolean buddy_is_external(GaimBuddy *b); |
10977 | 245 |
246 static void buddy_add(struct mwGaimPluginData *pd, GaimBuddy *buddy); | |
247 | |
248 static GaimBuddy * | |
249 buddy_ensure(GaimConnection *gc, GaimGroup *group, | |
250 struct mwSametimeUser *stuser); | |
251 | |
252 static void group_add(struct mwGaimPluginData *pd, GaimGroup *group); | |
253 | |
254 static GaimGroup * | |
255 group_ensure(GaimConnection *gc, struct mwSametimeGroup *stgroup); | |
256 | |
257 static struct mwAwareList * | |
258 list_ensure(struct mwGaimPluginData *pd, GaimGroup *group); | |
259 | |
260 | |
261 /* session functions */ | |
262 | |
263 static struct mwSession * | |
264 gc_to_session(GaimConnection *gc); | |
265 | |
266 static GaimConnection *session_to_gc(struct mwSession *session); | |
267 | |
268 | |
269 /* conference functions */ | |
270 | |
271 static struct mwConference * | |
272 conf_find_by_id(struct mwGaimPluginData *pd, int id); | |
273 | |
274 | |
275 /* conversation functions */ | |
276 | |
277 struct convo_msg { | |
278 enum mwImSendType type; | |
279 gpointer data; | |
280 GDestroyNotify clear; | |
281 }; | |
282 | |
283 | |
284 struct convo_data { | |
285 struct mwConversation *conv; | |
286 GList *queue; /**< outgoing message queue, list of convo_msg */ | |
287 }; | |
288 | |
289 static void convo_data_new(struct mwConversation *conv); | |
290 | |
291 static void convo_data_free(struct convo_data *conv); | |
292 | |
293 static void convo_features(struct mwConversation *conv); | |
294 | |
295 static GaimConversation *convo_get_gconv(struct mwConversation *conv); | |
296 | |
297 | |
12629
fee6a32644a4
[gaim-migrate @ 14965]
Richard Laager <rlaager@wiktel.com>
parents:
12624
diff
changeset
|
298 /* name and id */ |
12624
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
299 |
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
300 struct named_id { |
10977 | 301 char *id; |
302 char *name; | |
303 }; | |
304 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
305 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
306 /* connection functions */ |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
307 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
308 static void connect_cb(gpointer data, gint source, GaimInputCondition cond); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
309 |
10977 | 310 |
311 /* ----- session ------ */ | |
312 | |
313 | |
314 /** resolves a mwSession from a GaimConnection */ | |
315 static struct mwSession *gc_to_session(GaimConnection *gc) { | |
316 struct mwGaimPluginData *pd; | |
317 | |
318 g_return_val_if_fail(gc != NULL, NULL); | |
319 | |
320 pd = gc->proto_data; | |
321 g_return_val_if_fail(pd != NULL, NULL); | |
322 | |
323 return pd->session; | |
324 } | |
325 | |
326 | |
327 /** resolves a GaimConnection from a mwSession */ | |
328 static GaimConnection *session_to_gc(struct mwSession *session) { | |
329 struct mwGaimPluginData *pd; | |
330 | |
331 g_return_val_if_fail(session != NULL, NULL); | |
332 | |
333 pd = mwSession_getClientData(session); | |
334 g_return_val_if_fail(pd != NULL, NULL); | |
335 | |
336 return pd->gc; | |
337 } | |
338 | |
339 | |
340 static int mw_session_io_write(struct mwSession *session, | |
12311
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
341 const guchar *buf, gsize len) { |
10977 | 342 struct mwGaimPluginData *pd; |
343 int ret = 0; | |
344 | |
345 pd = mwSession_getClientData(session); | |
346 | |
347 /* socket was already closed. */ | |
348 if(pd->socket == 0) | |
349 return 1; | |
350 | |
351 while(len) { | |
352 ret = write(pd->socket, buf, len); | |
353 if(ret <= 0) break; | |
354 len -= ret; | |
355 } | |
356 | |
357 if(len > 0) { | |
358 DEBUG_ERROR("write returned %i, %i bytes left unwritten\n", ret, len); | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
359 gaim_connection_error(pd->gc, _("Connection closed (writing)")); |
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
360 |
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
361 #if 0 |
10977 | 362 close(pd->socket); |
363 pd->socket = 0; | |
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
364 #endif |
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
365 |
10977 | 366 return -1; |
367 } | |
368 | |
369 return 0; | |
370 } | |
371 | |
372 | |
373 static void mw_session_io_close(struct mwSession *session) { | |
374 struct mwGaimPluginData *pd; | |
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
375 GaimConnection *gc; |
10977 | 376 |
377 pd = mwSession_getClientData(session); | |
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
378 g_return_if_fail(pd != NULL); |
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
379 |
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
380 gc = pd->gc; |
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
381 |
10977 | 382 if(pd->socket) { |
383 close(pd->socket); | |
384 pd->socket = 0; | |
385 } | |
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
386 |
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
387 if(gc->inpa) { |
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
388 gaim_input_remove(gc->inpa); |
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
389 gc->inpa = 0; |
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
390 } |
10977 | 391 } |
392 | |
393 | |
394 static void mw_session_clear(struct mwSession *session) { | |
395 ; /* nothing for now */ | |
396 } | |
397 | |
398 | |
399 /* ----- aware list ----- */ | |
400 | |
401 | |
402 static void blist_resolve_alias_cb(struct mwServiceResolve *srvc, | |
403 guint32 id, guint32 code, GList *results, | |
404 gpointer data) { | |
405 struct mwResolveResult *result; | |
406 struct mwResolveMatch *match; | |
407 | |
408 g_return_if_fail(results != NULL); | |
409 | |
410 result = results->data; | |
411 g_return_if_fail(result != NULL); | |
412 g_return_if_fail(result->matches != NULL); | |
413 | |
414 match = result->matches->data; | |
415 g_return_if_fail(match != NULL); | |
416 | |
417 gaim_blist_server_alias_buddy(data, match->name); | |
418 gaim_blist_node_set_string(data, BUDDY_KEY_NAME, match->name); | |
419 } | |
420 | |
421 | |
422 static void mw_aware_list_on_aware(struct mwAwareList *list, | |
423 struct mwAwareSnapshot *aware) { | |
424 | |
425 GaimConnection *gc; | |
11638 | 426 GaimAccount *acct; |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
427 |
10977 | 428 struct mwGaimPluginData *pd; |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
429 time_t idle; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
430 guint stat; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
431 const char *id; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
432 const char *status = MW_STATE_ACTIVE; |
10977 | 433 |
434 gc = mwAwareList_getClientData(list); | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
435 acct = gaim_connection_get_account(gc); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
436 |
10977 | 437 pd = gc->proto_data; |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
438 idle = aware->status.time; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
439 stat = aware->status.status; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
440 id = aware->id.user; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
441 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
442 /* not sure which client sends this yet */ |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
443 if(idle == 0xdeadbeef) { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
444 /* knock knock! |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
445 who's there? |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
446 rude interrupting cow. |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
447 rude interr... |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
448 MOO! */ |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
449 idle = -1; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
450 } |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
451 |
10977 | 452 switch(stat) { |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
453 case mwStatus_ACTIVE: |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
454 status = MW_STATE_ACTIVE; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
455 idle = 0; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
456 break; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
457 |
10977 | 458 case mwStatus_IDLE: |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
459 if(! idle) idle = -1; |
10977 | 460 break; |
461 | |
462 case mwStatus_AWAY: | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
463 status = MW_STATE_AWAY; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
464 break; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
465 |
10977 | 466 case mwStatus_BUSY: |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
467 status = MW_STATE_BUSY; |
10977 | 468 break; |
469 } | |
470 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
471 /* NAB group members */ |
10977 | 472 if(aware->group) { |
473 GaimGroup *group; | |
474 GaimBuddy *buddy; | |
475 GaimBlistNode *bnode; | |
476 | |
477 group = g_hash_table_lookup(pd->group_list_map, list); | |
478 buddy = gaim_find_buddy_in_group(acct, id, group); | |
479 bnode = (GaimBlistNode *) buddy; | |
480 | |
481 if(! buddy) { | |
482 struct mwServiceResolve *srvc; | |
483 GList *query; | |
484 | |
485 buddy = gaim_buddy_new(acct, id, NULL); | |
486 gaim_blist_add_buddy(buddy, NULL, group, NULL); | |
487 | |
488 bnode = (GaimBlistNode *) buddy; | |
489 | |
490 srvc = pd->srvc_resolve; | |
491 query = g_list_append(NULL, (char *) id); | |
492 | |
493 mwServiceResolve_resolve(srvc, query, mwResolveFlag_USERS, | |
494 blist_resolve_alias_cb, buddy, NULL); | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
495 g_list_free(query); |
10977 | 496 } |
497 | |
498 gaim_blist_node_set_int(bnode, BUDDY_KEY_TYPE, mwSametimeUser_NORMAL); | |
499 } | |
500 | |
12263
8190a70d2c34
[gaim-migrate @ 14565]
Christopher O'Brien <siege@pidgin.im>
parents:
12216
diff
changeset
|
501 if(aware->online) { |
8190a70d2c34
[gaim-migrate @ 14565]
Christopher O'Brien <siege@pidgin.im>
parents:
12216
diff
changeset
|
502 gaim_prpl_got_user_status(acct, id, status, NULL); |
8190a70d2c34
[gaim-migrate @ 14565]
Christopher O'Brien <siege@pidgin.im>
parents:
12216
diff
changeset
|
503 gaim_prpl_got_user_idle(acct, id, !!idle, idle); |
8190a70d2c34
[gaim-migrate @ 14565]
Christopher O'Brien <siege@pidgin.im>
parents:
12216
diff
changeset
|
504 |
8190a70d2c34
[gaim-migrate @ 14565]
Christopher O'Brien <siege@pidgin.im>
parents:
12216
diff
changeset
|
505 } else { |
8190a70d2c34
[gaim-migrate @ 14565]
Christopher O'Brien <siege@pidgin.im>
parents:
12216
diff
changeset
|
506 gaim_prpl_got_user_status(acct, id, MW_STATE_OFFLINE, NULL); |
8190a70d2c34
[gaim-migrate @ 14565]
Christopher O'Brien <siege@pidgin.im>
parents:
12216
diff
changeset
|
507 } |
10977 | 508 } |
509 | |
510 | |
511 static void mw_aware_list_on_attrib(struct mwAwareList *list, | |
512 struct mwAwareIdBlock *id, | |
513 struct mwAwareAttribute *attrib) { | |
514 | |
515 ; /* nothing. We'll get attribute data as we need it */ | |
516 } | |
517 | |
518 | |
519 static void mw_aware_list_clear(struct mwAwareList *list) { | |
520 ; /* nothing for now */ | |
521 } | |
522 | |
523 | |
524 static struct mwAwareListHandler mw_aware_list_handler = { | |
525 .on_aware = mw_aware_list_on_aware, | |
526 .on_attrib = mw_aware_list_on_attrib, | |
527 .clear = mw_aware_list_clear, | |
528 }; | |
529 | |
530 | |
531 /** Ensures that an Aware List is associated with the given group, and | |
532 returns that list. */ | |
533 static struct mwAwareList * | |
534 list_ensure(struct mwGaimPluginData *pd, GaimGroup *group) { | |
535 | |
536 struct mwAwareList *list; | |
537 | |
538 g_return_val_if_fail(pd != NULL, NULL); | |
539 g_return_val_if_fail(group != NULL, NULL); | |
540 | |
541 list = g_hash_table_lookup(pd->group_list_map, group); | |
542 if(! list) { | |
543 list = mwAwareList_new(pd->srvc_aware, &mw_aware_list_handler); | |
544 mwAwareList_setClientData(list, pd->gc, NULL); | |
545 | |
546 mwAwareList_watchAttributes(list, | |
547 mwAttribute_AV_PREFS_SET, | |
548 mwAttribute_MICROPHONE, | |
549 mwAttribute_SPEAKERS, | |
550 mwAttribute_VIDEO_CAMERA, | |
551 mwAttribute_FILE_TRANSFER, | |
552 NULL); | |
553 | |
554 g_hash_table_replace(pd->group_list_map, group, list); | |
555 g_hash_table_insert(pd->group_list_map, list, group); | |
556 } | |
557 | |
558 return list; | |
559 } | |
560 | |
561 | |
562 static void blist_export(GaimConnection *gc, struct mwSametimeList *stlist) { | |
563 /* - find the account for this connection | |
564 - iterate through the buddy list | |
565 - add each buddy matching this account to the stlist | |
566 */ | |
567 | |
568 GaimAccount *acct; | |
569 GaimBuddyList *blist; | |
570 GaimBlistNode *gn, *cn, *bn; | |
571 GaimGroup *grp; | |
572 GaimBuddy *bdy; | |
573 | |
574 struct mwSametimeGroup *stg = NULL; | |
575 struct mwIdBlock idb = { NULL, NULL }; | |
576 | |
577 acct = gaim_connection_get_account(gc); | |
578 g_return_if_fail(acct != NULL); | |
579 | |
580 blist = gaim_get_blist(); | |
581 g_return_if_fail(blist != NULL); | |
582 | |
583 for(gn = blist->root; gn; gn = gn->next) { | |
584 const char *owner; | |
585 const char *gname; | |
586 enum mwSametimeGroupType gtype; | |
587 gboolean gopen; | |
588 | |
589 if(! GAIM_BLIST_NODE_IS_GROUP(gn)) continue; | |
590 grp = (GaimGroup *) gn; | |
591 | |
592 /* the group's type (normal or dynamic) */ | |
593 gtype = gaim_blist_node_get_int(gn, GROUP_KEY_TYPE); | |
594 if(! gtype) gtype = mwSametimeGroup_NORMAL; | |
595 | |
596 /* if it's a normal group with none of our people in it, skip it */ | |
597 if(gtype == mwSametimeGroup_NORMAL && !gaim_group_on_account(grp, acct)) | |
598 continue; | |
599 | |
600 /* if the group has an owner and we're not it, skip it */ | |
601 owner = gaim_blist_node_get_string(gn, GROUP_KEY_OWNER); | |
602 if(owner && strcmp(owner, gaim_account_get_username(acct))) | |
603 continue; | |
604 | |
605 /* the group's actual name may be different from the gaim group's | |
606 name. Find whichever is there */ | |
607 gname = gaim_blist_node_get_string(gn, GROUP_KEY_NAME); | |
608 if(! gname) gname = grp->name; | |
609 | |
610 /* we save this, but never actually honor it */ | |
611 gopen = ! gaim_blist_node_get_bool(gn, GROUP_KEY_COLLAPSED); | |
612 | |
613 stg = mwSametimeGroup_new(stlist, gtype, gname); | |
614 mwSametimeGroup_setAlias(stg, grp->name); | |
615 mwSametimeGroup_setOpen(stg, gopen); | |
616 | |
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
617 /* don't attempt to put buddies in a dynamic group, it breaks |
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
618 other clients */ |
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
619 if(gtype == mwSametimeGroup_DYNAMIC) |
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
620 continue; |
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
621 |
10977 | 622 for(cn = gn->child; cn; cn = cn->next) { |
623 if(! GAIM_BLIST_NODE_IS_CONTACT(cn)) continue; | |
624 | |
625 for(bn = cn->child; bn; bn = bn->next) { | |
626 if(! GAIM_BLIST_NODE_IS_BUDDY(bn)) continue; | |
627 if(! GAIM_BLIST_NODE_SHOULD_SAVE(bn)) continue; | |
628 | |
629 bdy = (GaimBuddy *) bn; | |
630 | |
631 if(bdy->account == acct) { | |
632 struct mwSametimeUser *stu; | |
633 enum mwSametimeUserType utype; | |
634 | |
635 idb.user = bdy->name; | |
636 | |
637 utype = gaim_blist_node_get_int(bn, BUDDY_KEY_TYPE); | |
638 if(! utype) utype = mwSametimeUser_NORMAL; | |
639 | |
640 stu = mwSametimeUser_new(stg, utype, &idb); | |
641 mwSametimeUser_setShortName(stu, bdy->server_alias); | |
642 mwSametimeUser_setAlias(stu, bdy->alias); | |
643 } | |
644 } | |
645 } | |
646 } | |
647 } | |
648 | |
649 | |
650 static void blist_store(struct mwGaimPluginData *pd) { | |
651 | |
652 struct mwSametimeList *stlist; | |
653 struct mwServiceStorage *srvc; | |
654 struct mwStorageUnit *unit; | |
655 | |
656 GaimConnection *gc; | |
657 | |
658 struct mwPutBuffer *b; | |
659 struct mwOpaque *o; | |
660 | |
661 g_return_if_fail(pd != NULL); | |
662 | |
663 srvc = pd->srvc_store; | |
664 g_return_if_fail(srvc != NULL); | |
665 | |
666 gc = pd->gc; | |
667 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
668 if(BLIST_PREF_IS_LOCAL() || BLIST_PREF_IS_MERGE()) { |
10977 | 669 DEBUG_INFO("preferences indicate not to save remote blist\n"); |
670 return; | |
671 | |
672 } else if(MW_SERVICE_IS_DEAD(srvc)) { | |
673 DEBUG_INFO("aborting save of blist: storage service is not alive\n"); | |
674 return; | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
675 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
676 } else if(BLIST_PREF_IS_STORE() || BLIST_PREF_IS_SYNCH()) { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
677 DEBUG_INFO("saving remote blist\n"); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
678 |
10977 | 679 } else { |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
680 g_return_if_reached(); |
10977 | 681 } |
682 | |
683 /* create and export to a list object */ | |
684 stlist = mwSametimeList_new(); | |
685 blist_export(gc, stlist); | |
686 | |
687 /* write it to a buffer */ | |
688 b = mwPutBuffer_new(); | |
689 mwSametimeList_put(b, stlist); | |
690 mwSametimeList_free(stlist); | |
691 | |
692 /* put the buffer contents into a storage unit */ | |
693 unit = mwStorageUnit_new(mwStore_AWARE_LIST); | |
694 o = mwStorageUnit_asOpaque(unit); | |
695 mwPutBuffer_finalize(o, b); | |
696 | |
697 /* save the storage unit to the service */ | |
698 mwServiceStorage_save(srvc, unit, NULL, NULL, NULL); | |
699 } | |
700 | |
701 | |
702 static gboolean blist_save_cb(gpointer data) { | |
703 struct mwGaimPluginData *pd = data; | |
704 | |
705 blist_store(pd); | |
706 pd->save_event = 0; | |
707 return FALSE; | |
708 } | |
709 | |
710 | |
711 /** schedules the buddy list to be saved to the server */ | |
712 static void blist_schedule(struct mwGaimPluginData *pd) { | |
713 if(pd->save_event) return; | |
714 | |
715 pd->save_event = gaim_timeout_add(BLIST_SAVE_SECONDS * 1000, | |
716 blist_save_cb, pd); | |
717 } | |
718 | |
719 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
720 static gboolean buddy_is_external(GaimBuddy *b) { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
721 g_return_val_if_fail(b != NULL, FALSE); |
12166 | 722 return gaim_str_has_prefix(b->name, "@E "); |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
723 } |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
724 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
725 |
10977 | 726 /** Actually add a buddy to the aware service, and schedule the buddy |
727 list to be saved to the server */ | |
728 static void buddy_add(struct mwGaimPluginData *pd, | |
729 GaimBuddy *buddy) { | |
730 | |
731 struct mwAwareIdBlock idb = { mwAware_USER, (char *) buddy->name, NULL }; | |
732 struct mwAwareList *list; | |
733 | |
734 GaimGroup *group; | |
735 GList *add; | |
736 | |
737 add = g_list_prepend(NULL, &idb); | |
738 | |
12088 | 739 group = gaim_buddy_get_group(buddy); |
10977 | 740 list = list_ensure(pd, group); |
741 | |
742 if(mwAwareList_addAware(list, add)) { | |
743 gaim_blist_remove_buddy(buddy); | |
744 } | |
745 | |
746 blist_schedule(pd); | |
747 | |
748 g_list_free(add); | |
749 } | |
750 | |
751 | |
752 /** ensure that a GaimBuddy exists in the group with data | |
753 appropriately matching the st user entry from the st list */ | |
754 static GaimBuddy *buddy_ensure(GaimConnection *gc, GaimGroup *group, | |
755 struct mwSametimeUser *stuser) { | |
756 | |
757 struct mwGaimPluginData *pd = gc->proto_data; | |
758 GaimBuddy *buddy; | |
759 GaimAccount *acct = gaim_connection_get_account(gc); | |
760 | |
761 const char *id = mwSametimeUser_getUser(stuser); | |
762 const char *name = mwSametimeUser_getShortName(stuser); | |
763 const char *alias = mwSametimeUser_getAlias(stuser); | |
764 enum mwSametimeUserType type = mwSametimeUser_getType(stuser); | |
765 | |
766 g_return_val_if_fail(id != NULL, NULL); | |
767 g_return_val_if_fail(strlen(id) > 0, NULL); | |
768 | |
769 buddy = gaim_find_buddy_in_group(acct, id, group); | |
770 if(! buddy) { | |
771 buddy = gaim_buddy_new(acct, id, alias); | |
772 | |
773 gaim_blist_add_buddy(buddy, NULL, group, NULL); | |
774 buddy_add(pd, buddy); | |
775 } | |
776 | |
777 gaim_blist_alias_buddy(buddy, alias); | |
778 gaim_blist_server_alias_buddy(buddy, name); | |
779 gaim_blist_node_set_string((GaimBlistNode *) buddy, BUDDY_KEY_NAME, name); | |
780 gaim_blist_node_set_int((GaimBlistNode *) buddy, BUDDY_KEY_TYPE, type); | |
781 | |
782 return buddy; | |
783 } | |
784 | |
785 | |
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
786 /** add aware watch for a dynamic group */ |
10977 | 787 static void group_add(struct mwGaimPluginData *pd, |
788 GaimGroup *group) { | |
789 | |
790 struct mwAwareIdBlock idb = { mwAware_GROUP, NULL, NULL }; | |
791 struct mwAwareList *list; | |
792 const char *n; | |
793 GList *add; | |
794 | |
795 n = gaim_blist_node_get_string((GaimBlistNode *) group, GROUP_KEY_NAME); | |
796 if(! n) n = group->name; | |
797 | |
798 idb.user = (char *) n; | |
799 add = g_list_prepend(NULL, &idb); | |
800 | |
801 list = list_ensure(pd, group); | |
802 mwAwareList_addAware(list, add); | |
803 g_list_free(add); | |
804 } | |
805 | |
806 | |
807 /** ensure that a GaimGroup exists in the blist with data | |
808 appropriately matching the st group entry from the st list */ | |
809 static GaimGroup *group_ensure(GaimConnection *gc, | |
810 struct mwSametimeGroup *stgroup) { | |
811 GaimAccount *acct; | |
12006
de25a063aebe
[gaim-migrate @ 14299]
Christopher O'Brien <siege@pidgin.im>
parents:
12005
diff
changeset
|
812 GaimGroup *group = NULL; |
12005
5b3368008513
[gaim-migrate @ 14298]
Christopher O'Brien <siege@pidgin.im>
parents:
11953
diff
changeset
|
813 GaimBuddyList *blist; |
10977 | 814 GaimBlistNode *gn; |
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
815 const char *name, *alias, *owner; |
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
816 enum mwSametimeGroupType type; |
10977 | 817 |
818 acct = gaim_connection_get_account(gc); | |
819 owner = gaim_account_get_username(acct); | |
820 | |
12005
5b3368008513
[gaim-migrate @ 14298]
Christopher O'Brien <siege@pidgin.im>
parents:
11953
diff
changeset
|
821 blist = gaim_get_blist(); |
5b3368008513
[gaim-migrate @ 14298]
Christopher O'Brien <siege@pidgin.im>
parents:
11953
diff
changeset
|
822 g_return_val_if_fail(blist != NULL, NULL); |
5b3368008513
[gaim-migrate @ 14298]
Christopher O'Brien <siege@pidgin.im>
parents:
11953
diff
changeset
|
823 |
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
824 name = mwSametimeGroup_getName(stgroup); |
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
825 alias = mwSametimeGroup_getAlias(stgroup); |
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
826 type = mwSametimeGroup_getType(stgroup); |
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
827 |
12524
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
828 DEBUG_INFO("attempting to ensure group %s, called %s\n", |
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
829 NSTR(name), NSTR(alias)); |
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
830 |
12005
5b3368008513
[gaim-migrate @ 14298]
Christopher O'Brien <siege@pidgin.im>
parents:
11953
diff
changeset
|
831 /* first attempt at finding the group, by the name key */ |
5b3368008513
[gaim-migrate @ 14298]
Christopher O'Brien <siege@pidgin.im>
parents:
11953
diff
changeset
|
832 for(gn = blist->root; gn; gn = gn->next) { |
12524
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
833 const char *n, *o; |
12005
5b3368008513
[gaim-migrate @ 14298]
Christopher O'Brien <siege@pidgin.im>
parents:
11953
diff
changeset
|
834 if(! GAIM_BLIST_NODE_IS_GROUP(gn)) continue; |
5b3368008513
[gaim-migrate @ 14298]
Christopher O'Brien <siege@pidgin.im>
parents:
11953
diff
changeset
|
835 n = gaim_blist_node_get_string(gn, GROUP_KEY_NAME); |
12524
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
836 o = gaim_blist_node_get_string(gn, GROUP_KEY_OWNER); |
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
837 |
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
838 DEBUG_INFO("found group named %s, owned by %s\n", NSTR(n), NSTR(o)); |
12005
5b3368008513
[gaim-migrate @ 14298]
Christopher O'Brien <siege@pidgin.im>
parents:
11953
diff
changeset
|
839 |
5b3368008513
[gaim-migrate @ 14298]
Christopher O'Brien <siege@pidgin.im>
parents:
11953
diff
changeset
|
840 if(n && !strcmp(n, name)) { |
12524
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
841 if(!o || !strcmp(o, owner)) { |
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
842 DEBUG_INFO("that'll work\n"); |
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
843 group = (GaimGroup *) gn; |
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
844 break; |
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
845 } |
12005
5b3368008513
[gaim-migrate @ 14298]
Christopher O'Brien <siege@pidgin.im>
parents:
11953
diff
changeset
|
846 } |
12524
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
847 } |
12005
5b3368008513
[gaim-migrate @ 14298]
Christopher O'Brien <siege@pidgin.im>
parents:
11953
diff
changeset
|
848 |
5b3368008513
[gaim-migrate @ 14298]
Christopher O'Brien <siege@pidgin.im>
parents:
11953
diff
changeset
|
849 /* try again, by alias */ |
12524
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
850 if(! group) { |
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
851 DEBUG_INFO("searching for group by alias %s\n", NSTR(alias)); |
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
852 group = gaim_find_group(alias); |
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
853 } |
12005
5b3368008513
[gaim-migrate @ 14298]
Christopher O'Brien <siege@pidgin.im>
parents:
11953
diff
changeset
|
854 |
5b3368008513
[gaim-migrate @ 14298]
Christopher O'Brien <siege@pidgin.im>
parents:
11953
diff
changeset
|
855 /* oh well, no such group. Let's create it! */ |
10977 | 856 if(! group) { |
12524
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
857 DEBUG_INFO("creating group\n"); |
10977 | 858 group = gaim_group_new(alias); |
859 gaim_blist_add_group(group, NULL); | |
860 } | |
861 | |
862 gn = (GaimBlistNode *) group; | |
863 gaim_blist_node_set_string(gn, GROUP_KEY_NAME, name); | |
864 gaim_blist_node_set_int(gn, GROUP_KEY_TYPE, type); | |
865 | |
866 if(type == mwSametimeGroup_DYNAMIC) { | |
867 gaim_blist_node_set_string(gn, GROUP_KEY_OWNER, owner); | |
868 group_add(gc->proto_data, group); | |
869 } | |
870 | |
871 return group; | |
872 } | |
873 | |
874 | |
875 /** merge the entries from a st list into the gaim blist */ | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
876 static void blist_merge(GaimConnection *gc, struct mwSametimeList *stlist) { |
10977 | 877 struct mwSametimeGroup *stgroup; |
878 struct mwSametimeUser *stuser; | |
879 | |
880 GaimGroup *group; | |
881 GaimBuddy *buddy; | |
882 | |
883 GList *gl, *gtl, *ul, *utl; | |
884 | |
885 gl = gtl = mwSametimeList_getGroups(stlist); | |
886 for(; gl; gl = gl->next) { | |
887 | |
888 stgroup = (struct mwSametimeGroup *) gl->data; | |
889 group = group_ensure(gc, stgroup); | |
890 | |
891 ul = utl = mwSametimeGroup_getUsers(stgroup); | |
892 for(; ul; ul = ul->next) { | |
893 | |
894 stuser = (struct mwSametimeUser *) ul->data; | |
895 buddy = buddy_ensure(gc, group, stuser); | |
896 } | |
897 g_list_free(utl); | |
898 } | |
899 g_list_free(gtl); | |
900 } | |
901 | |
902 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
903 /** remove all buddies on account from group. If del is TRUE and group |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
904 is left empty, remove group as well */ |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
905 static void group_clear(GaimGroup *group, GaimAccount *acct, gboolean del) { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
906 GaimConnection *gc; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
907 GList *prune = NULL; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
908 GaimBlistNode *gn, *cn, *bn; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
909 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
910 g_return_if_fail(group != NULL); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
911 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
912 DEBUG_INFO("clearing members from pruned group %s\n", NSTR(group->name)); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
913 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
914 gc = gaim_account_get_connection(acct); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
915 g_return_if_fail(gc != NULL); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
916 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
917 gn = (GaimBlistNode *) group; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
918 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
919 for(cn = gn->child; cn; cn = cn->next) { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
920 if(! GAIM_BLIST_NODE_IS_CONTACT(cn)) continue; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
921 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
922 for(bn = cn->child; bn; bn = bn->next) { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
923 GaimBuddy *gb = (GaimBuddy *) bn; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
924 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
925 if(! GAIM_BLIST_NODE_IS_BUDDY(bn)) continue; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
926 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
927 if(gb->account == acct) { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
928 DEBUG_INFO("clearing %s from group\n", NSTR(gb->name)); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
929 prune = g_list_prepend(prune, gb); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
930 } |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
931 } |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
932 } |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
933 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
934 /* quickly unsubscribe from presence for the entire group */ |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
935 gaim_account_remove_group(acct, group); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
936 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
937 /* remove blist entries that need to go */ |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
938 while(prune) { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
939 gaim_blist_remove_buddy(prune->data); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
940 prune = g_list_delete_link(prune, prune); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
941 } |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
942 DEBUG_INFO("cleared buddies\n"); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
943 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
944 /* optionally remove group from blist */ |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
945 if(del && !gaim_blist_get_group_size(group, TRUE)) { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
946 DEBUG_INFO("removing empty group\n"); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
947 gaim_blist_remove_group(group); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
948 } |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
949 } |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
950 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
951 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
952 /** prune out group members that shouldn't be there */ |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
953 static void group_prune(GaimConnection *gc, GaimGroup *group, |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
954 struct mwSametimeGroup *stgroup) { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
955 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
956 GaimAccount *acct; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
957 GaimBlistNode *gn, *cn, *bn; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
958 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
959 GHashTable *stusers; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
960 GList *prune = NULL; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
961 GList *ul, *utl; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
962 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
963 g_return_if_fail(group != NULL); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
964 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
965 DEBUG_INFO("pruning membership of group %s\n", NSTR(group->name)); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
966 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
967 acct = gaim_connection_get_account(gc); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
968 g_return_if_fail(acct != NULL); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
969 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
970 stusers = g_hash_table_new(g_str_hash, g_str_equal); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
971 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
972 /* build a hash table for quick lookup while pruning the group |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
973 contents */ |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
974 utl = mwSametimeGroup_getUsers(stgroup); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
975 for(ul = utl; ul; ul = ul->next) { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
976 const char *id = mwSametimeUser_getUser(ul->data); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
977 g_hash_table_insert(stusers, (char *) id, ul->data); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
978 DEBUG_INFO("server copy has %s\n", NSTR(id)); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
979 } |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
980 g_list_free(utl); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
981 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
982 gn = (GaimBlistNode *) group; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
983 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
984 for(cn = gn->child; cn; cn = cn->next) { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
985 if(! GAIM_BLIST_NODE_IS_CONTACT(cn)) continue; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
986 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
987 for(bn = cn->child; bn; bn = bn->next) { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
988 GaimBuddy *gb = (GaimBuddy *) bn; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
989 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
990 if(! GAIM_BLIST_NODE_IS_BUDDY(bn)) continue; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
991 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
992 /* if the account is correct and they're not in our table, mark |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
993 them for pruning */ |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
994 if(gb->account == acct && !g_hash_table_lookup(stusers, gb->name)) { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
995 DEBUG_INFO("marking %s for pruning\n", NSTR(gb->name)); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
996 prune = g_list_prepend(prune, gb); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
997 } |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
998 } |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
999 } |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1000 DEBUG_INFO("done marking\n"); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1001 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1002 g_hash_table_destroy(stusers); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1003 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1004 if(prune) { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1005 gaim_account_remove_buddies(acct, prune, NULL); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1006 while(prune) { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1007 gaim_blist_remove_buddy(prune->data); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1008 prune = g_list_delete_link(prune, prune); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1009 } |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1010 } |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1011 } |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1012 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1013 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1014 /** synch the entries from a st list into the gaim blist, removing any |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1015 existing buddies that aren't in the st list */ |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1016 static void blist_sync(GaimConnection *gc, struct mwSametimeList *stlist) { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1017 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1018 GaimAccount *acct; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1019 GaimBuddyList *blist; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1020 GaimBlistNode *gn; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1021 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1022 GHashTable *stgroups; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1023 GList *g_prune = NULL; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1024 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1025 GList *gl, *gtl; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1026 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1027 const char *acct_n; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1028 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1029 DEBUG_INFO("synchronizing local buddy list from server list\n"); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1030 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1031 acct = gaim_connection_get_account(gc); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1032 g_return_if_fail(acct != NULL); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1033 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1034 acct_n = gaim_account_get_username(acct); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1035 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1036 blist = gaim_get_blist(); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1037 g_return_if_fail(blist != NULL); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1038 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1039 /* build a hash table for quick lookup while pruning the local |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1040 list, mapping group name to group structure */ |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1041 stgroups = g_hash_table_new(g_str_hash, g_str_equal); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1042 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1043 gtl = mwSametimeList_getGroups(stlist); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1044 for(gl = gtl; gl; gl = gl->next) { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1045 const char *name = mwSametimeGroup_getName(gl->data); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1046 g_hash_table_insert(stgroups, (char *) name, gl->data); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1047 } |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1048 g_list_free(gtl); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1049 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1050 /* find all groups which should be pruned from the local list */ |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1051 for(gn = blist->root; gn; gn = gn->next) { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1052 GaimGroup *grp = (GaimGroup *) gn; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1053 const char *gname, *owner; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1054 struct mwSametimeGroup *stgrp; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1055 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1056 if(! GAIM_BLIST_NODE_IS_GROUP(gn)) continue; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1057 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1058 /* group not belonging to this account */ |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1059 if(! gaim_group_on_account(grp, acct)) |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1060 continue; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1061 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1062 /* dynamic group belonging to this account. don't prune contents */ |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1063 owner = gaim_blist_node_get_string(gn, GROUP_KEY_OWNER); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1064 if(owner && !strcmp(owner, acct_n)) |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1065 continue; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1066 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1067 /* we actually are synching by this key as opposed to the group |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1068 title, which can be different things in the st list */ |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1069 gname = gaim_blist_node_get_string(gn, GROUP_KEY_NAME); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1070 if(! gname) gname = grp->name; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1071 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1072 stgrp = g_hash_table_lookup(stgroups, gname); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1073 if(! stgrp) { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1074 /* remove the whole group */ |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1075 DEBUG_INFO("marking group %s for pruning\n", grp->name); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1076 g_prune = g_list_prepend(g_prune, grp); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1077 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1078 } else { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1079 /* synch the group contents */ |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1080 group_prune(gc, grp, stgrp); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1081 } |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1082 } |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1083 DEBUG_INFO("done marking groups\n"); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1084 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1085 /* don't need this anymore */ |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1086 g_hash_table_destroy(stgroups); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1087 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1088 /* prune all marked groups */ |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1089 while(g_prune) { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1090 GaimGroup *grp = g_prune->data; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1091 GaimBlistNode *gn = (GaimBlistNode *) grp; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1092 const char *owner; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1093 gboolean del = TRUE; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1094 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1095 owner = gaim_blist_node_get_string(gn, GROUP_KEY_OWNER); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1096 if(owner && strcmp(owner, acct_n)) { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1097 /* it's a specialty group belonging to another account with some |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1098 of our members in it, so don't fully delete it */ |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1099 del = FALSE; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1100 } |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1101 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1102 group_clear(g_prune->data, acct, del); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1103 g_prune = g_list_delete_link(g_prune, g_prune); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1104 } |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1105 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1106 /* done with the pruning, let's merge in the additions */ |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1107 blist_merge(gc, stlist); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1108 } |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1109 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1110 |
10977 | 1111 /** callback passed to the storage service when it's told to load the |
1112 st list */ | |
1113 static void fetch_blist_cb(struct mwServiceStorage *srvc, | |
1114 guint32 result, struct mwStorageUnit *item, | |
1115 gpointer data) { | |
1116 | |
1117 struct mwGaimPluginData *pd = data; | |
1118 struct mwSametimeList *stlist; | |
1119 struct mwSession *s; | |
1120 | |
1121 struct mwGetBuffer *b; | |
1122 | |
1123 g_return_if_fail(result == ERR_SUCCESS); | |
1124 | |
1125 /* check our preferences for loading */ | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1126 if(BLIST_PREF_IS_LOCAL()) { |
10977 | 1127 DEBUG_INFO("preferences indicate not to load remote buddy list\n"); |
1128 return; | |
1129 } | |
1130 | |
1131 b = mwGetBuffer_wrap(mwStorageUnit_asOpaque(item)); | |
1132 | |
1133 stlist = mwSametimeList_new(); | |
1134 mwSametimeList_get(b, stlist); | |
1135 | |
1136 s = mwService_getSession(MW_SERVICE(srvc)); | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1137 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1138 /* merge or synch depending on preferences */ |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1139 if(BLIST_PREF_IS_MERGE() || BLIST_PREF_IS_STORE()) { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1140 blist_merge(pd->gc, stlist); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1141 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1142 } else if(BLIST_PREF_IS_SYNCH()) { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1143 blist_sync(pd->gc, stlist); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1144 } |
10977 | 1145 |
1146 mwSametimeList_free(stlist); | |
1147 } | |
1148 | |
1149 | |
1150 /** signal triggered when a conversation is opened in Gaim */ | |
1151 static void conversation_created_cb(GaimConversation *g_conv, | |
1152 struct mwGaimPluginData *pd) { | |
1153 | |
1154 /* we need to tell the IM service to negotiate features for the | |
1155 conversation right away, otherwise it'll wait until the first | |
1156 message is sent before offering NotesBuddy features. Therefore | |
1157 whenever Gaim creates a conversation, we'll immediately open the | |
1158 channel to the other side and figure out what the target can | |
1159 handle. Unfortunately, this makes us vulnerable to Psychic Mode, | |
1160 whereas a more lazy negotiation based on the first message | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1161 would not */ |
10977 | 1162 |
1163 GaimConnection *gc; | |
1164 struct mwIdBlock who = { 0, 0 }; | |
1165 struct mwConversation *conv; | |
1166 | |
1167 gc = gaim_conversation_get_gc(g_conv); | |
1168 if(pd->gc != gc) | |
1169 return; /* not ours */ | |
1170 | |
11338 | 1171 if(gaim_conversation_get_type(g_conv) != GAIM_CONV_TYPE_IM) |
10977 | 1172 return; /* wrong type */ |
1173 | |
1174 who.user = (char *) gaim_conversation_get_name(g_conv); | |
1175 conv = mwServiceIm_getConversation(pd->srvc_im, &who); | |
1176 | |
1177 convo_features(conv); | |
1178 | |
1179 if(mwConversation_isClosed(conv)) | |
1180 mwConversation_open(conv); | |
1181 } | |
1182 | |
1183 | |
1184 static void blist_menu_nab(GaimBlistNode *node, gpointer data) { | |
1185 struct mwGaimPluginData *pd = data; | |
1186 GaimConnection *gc; | |
1187 | |
1188 GaimGroup *group = (GaimGroup *) node; | |
1189 | |
1190 GString *str; | |
1191 char *tmp; | |
1192 | |
1193 g_return_if_fail(pd != NULL); | |
1194 | |
1195 gc = pd->gc; | |
1196 g_return_if_fail(gc != NULL); | |
1197 | |
1198 g_return_if_fail(GAIM_BLIST_NODE_IS_GROUP(node)); | |
1199 | |
1200 str = g_string_new(NULL); | |
1201 | |
1202 tmp = (char *) gaim_blist_node_get_string(node, GROUP_KEY_NAME); | |
1203 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1204 g_string_append_printf(str, _("<b>Group Title:</b> %s<br>"), group->name); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1205 g_string_append_printf(str, _("<b>Notes Group ID:</b> %s<br>"), tmp); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1206 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1207 tmp = g_strdup_printf(_("Info for Group %s"), group->name); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1208 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1209 gaim_notify_formatted(gc, tmp, _("Notes Address Book Information"), |
10977 | 1210 NULL, str->str, NULL, NULL); |
1211 | |
1212 g_free(tmp); | |
1213 g_string_free(str, TRUE); | |
1214 } | |
1215 | |
1216 | |
1217 /** The normal blist menu prpl function doesn't get called for groups, | |
1218 so we use the blist-node-extended-menu signal to trigger this | |
1219 handler */ | |
1220 static void blist_node_menu_cb(GaimBlistNode *node, | |
1221 GList **menu, struct mwGaimPluginData *pd) { | |
12107
40724851e95e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
1222 const char *owner; |
40724851e95e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
1223 GaimGroup *group; |
40724851e95e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
1224 GaimAccount *acct; |
12919
248b8b39c671
[gaim-migrate @ 15272]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12864
diff
changeset
|
1225 GaimMenuAction *act; |
10977 | 1226 |
12107
40724851e95e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
1227 /* we only want groups */ |
40724851e95e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
1228 if(! GAIM_BLIST_NODE_IS_GROUP(node)) return; |
40724851e95e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
1229 group = (GaimGroup *) node; |
40724851e95e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
1230 |
40724851e95e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
1231 acct = gaim_connection_get_account(pd->gc); |
40724851e95e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
1232 g_return_if_fail(acct != NULL); |
40724851e95e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
1233 |
40724851e95e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
1234 /* better make sure we're connected */ |
40724851e95e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
1235 if(! gaim_account_is_connected(acct)) return; |
40724851e95e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
1236 |
40724851e95e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
1237 #if 0 |
40724851e95e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
1238 /* if there's anyone in the group for this acct, offer to invite |
40724851e95e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
1239 them all to a conference */ |
40724851e95e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
1240 if(gaim_group_on_account(group, acct)) { |
12919
248b8b39c671
[gaim-migrate @ 15272]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12864
diff
changeset
|
1241 act = gaim_menu_action_new(_("Invite Group to Conference..."), |
248b8b39c671
[gaim-migrate @ 15272]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12864
diff
changeset
|
1242 blist_menu_group_invite, pd, NULL); |
12107
40724851e95e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
1243 *menu = g_list_append(*menu, NULL); |
40724851e95e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
1244 } |
40724851e95e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
1245 #endif |
40724851e95e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
1246 |
40724851e95e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
1247 /* check if it's a NAB group for this account */ |
40724851e95e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
1248 owner = gaim_blist_node_get_string(node, GROUP_KEY_OWNER); |
40724851e95e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
1249 if(owner && !strcmp(owner, gaim_account_get_username(acct))) { |
12919
248b8b39c671
[gaim-migrate @ 15272]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12864
diff
changeset
|
1250 act = gaim_menu_action_new(_("Get Notes Address Book Info"), |
248b8b39c671
[gaim-migrate @ 15272]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12864
diff
changeset
|
1251 blist_menu_nab, pd, NULL); |
10977 | 1252 *menu = g_list_append(*menu, act); |
1253 } | |
1254 } | |
1255 | |
1256 | |
12266
0e467757b57a
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1257 /* lifted this from oldstatus, since HEAD doesn't do this at login |
0e467757b57a
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1258 anymore. */ |
0e467757b57a
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1259 static void blist_init(GaimAccount *acct) { |
0e467757b57a
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1260 GaimBlistNode *gnode, *cnode, *bnode; |
0e467757b57a
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1261 GList *add_buds = NULL; |
0e467757b57a
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1262 |
0e467757b57a
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1263 for(gnode = gaim_get_blist()->root; gnode; gnode = gnode->next) { |
0e467757b57a
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1264 if(! GAIM_BLIST_NODE_IS_GROUP(gnode)) continue; |
0e467757b57a
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1265 |
0e467757b57a
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1266 for(cnode = gnode->child; cnode; cnode = cnode->next) { |
0e467757b57a
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1267 if(! GAIM_BLIST_NODE_IS_CONTACT(cnode)) |
0e467757b57a
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1268 continue; |
0e467757b57a
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1269 for(bnode = cnode->child; bnode; bnode = bnode->next) { |
0e467757b57a
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1270 GaimBuddy *b; |
0e467757b57a
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1271 if(!GAIM_BLIST_NODE_IS_BUDDY(bnode)) |
0e467757b57a
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1272 continue; |
0e467757b57a
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1273 |
0e467757b57a
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1274 b = (GaimBuddy *)bnode; |
0e467757b57a
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1275 if(b->account == acct) { |
0e467757b57a
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1276 add_buds = g_list_append(add_buds, b); |
0e467757b57a
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1277 } |
0e467757b57a
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1278 } |
0e467757b57a
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1279 } |
0e467757b57a
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1280 } |
0e467757b57a
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1281 |
0e467757b57a
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1282 if(add_buds) { |
0e467757b57a
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1283 gaim_account_add_buddies(acct, add_buds); |
0e467757b57a
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1284 g_list_free(add_buds); |
0e467757b57a
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1285 } |
0e467757b57a
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1286 } |
0e467757b57a
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1287 |
0e467757b57a
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1288 |
10977 | 1289 /** Last thing to happen from a started session */ |
1290 static void services_starting(struct mwGaimPluginData *pd) { | |
1291 | |
1292 GaimConnection *gc; | |
1293 GaimAccount *acct; | |
1294 struct mwStorageUnit *unit; | |
1295 GaimBuddyList *blist; | |
1296 GaimBlistNode *l; | |
1297 | |
1298 gc = pd->gc; | |
1299 acct = gaim_connection_get_account(gc); | |
1300 | |
1301 /* grab the buddy list from the server */ | |
1302 unit = mwStorageUnit_new(mwStore_AWARE_LIST); | |
1303 mwServiceStorage_load(pd->srvc_store, unit, fetch_blist_cb, pd, NULL); | |
1304 | |
1305 /* find all the NAB groups and subscribe to them */ | |
1306 blist = gaim_get_blist(); | |
1307 for(l = blist->root; l; l = l->next) { | |
1308 GaimGroup *group = (GaimGroup *) l; | |
1309 enum mwSametimeGroupType gt; | |
1310 const char *owner; | |
1311 | |
1312 if(! GAIM_BLIST_NODE_IS_GROUP(l)) continue; | |
1313 | |
1314 /* if the group is ownerless, or has an owner and we're not it, | |
1315 skip it */ | |
1316 owner = gaim_blist_node_get_string(l, GROUP_KEY_OWNER); | |
1317 if(!owner || strcmp(owner, gaim_account_get_username(acct))) | |
1318 continue; | |
1319 | |
1320 gt = gaim_blist_node_get_int(l, GROUP_KEY_TYPE); | |
1321 if(gt == mwSametimeGroup_DYNAMIC) | |
1322 group_add(pd, group); | |
1323 } | |
1324 | |
1325 /* set the aware attributes */ | |
1326 /* indicate we understand what AV prefs are, but don't support any */ | |
1327 mwServiceAware_setAttributeBoolean(pd->srvc_aware, | |
1328 mwAttribute_AV_PREFS_SET, TRUE); | |
1329 mwServiceAware_unsetAttribute(pd->srvc_aware, mwAttribute_MICROPHONE); | |
1330 mwServiceAware_unsetAttribute(pd->srvc_aware, mwAttribute_SPEAKERS); | |
1331 mwServiceAware_unsetAttribute(pd->srvc_aware, mwAttribute_VIDEO_CAMERA); | |
1332 | |
1333 /* ... but we can do file transfers! */ | |
1334 mwServiceAware_setAttributeBoolean(pd->srvc_aware, | |
1335 mwAttribute_FILE_TRANSFER, TRUE); | |
12266
0e467757b57a
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1336 |
0e467757b57a
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1337 blist_init(acct); |
10977 | 1338 } |
1339 | |
1340 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1341 static void session_loginRedirect(struct mwSession *session, |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1342 const char *host) { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1343 struct mwGaimPluginData *pd; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1344 GaimConnection *gc; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1345 GaimAccount *account; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1346 guint port; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1347 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1348 pd = mwSession_getClientData(session); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1349 gc = pd->gc; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1350 account = gaim_connection_get_account(gc); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1351 port = gaim_account_get_int(account, MW_KEY_PORT, MW_PLUGIN_DEFAULT_PORT); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1352 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1353 if(gaim_account_get_bool(account, MW_KEY_FORCE, FALSE) || |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1354 gaim_proxy_connect(account, host, port, connect_cb, pd)) { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1355 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1356 mwSession_forceLogin(session); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1357 } |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1358 } |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1359 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1360 |
12266
0e467757b57a
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1361 static void mw_prpl_set_status(GaimAccount *acct, GaimStatus *status); |
0e467757b57a
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1362 |
0e467757b57a
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1363 |
10977 | 1364 /** called from mw_session_stateChange when the session's state is |
1365 mwSession_STARTED. Any finalizing of start-up stuff should go | |
1366 here */ | |
1367 static void session_started(struct mwGaimPluginData *pd) { | |
12266
0e467757b57a
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1368 GaimStatus *status; |
0e467757b57a
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1369 GaimAccount *acct; |
0e467757b57a
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1370 |
12813
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1371 /* set out initial status */ |
12266
0e467757b57a
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1372 acct = gaim_connection_get_account(pd->gc); |
0e467757b57a
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1373 status = gaim_account_get_active_status(acct); |
0e467757b57a
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1374 mw_prpl_set_status(acct, status); |
12813
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1375 |
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1376 /* start watching for new conversations */ |
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1377 gaim_signal_connect(gaim_conversations_get_handle(), |
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1378 "conversation-created", pd->gc, |
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1379 GAIM_CALLBACK(conversation_created_cb), pd); |
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1380 |
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1381 /* watch for group extended menu items */ |
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1382 gaim_signal_connect(gaim_blist_get_handle(), |
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1383 "blist-node-extended-menu", pd->gc, |
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1384 GAIM_CALLBACK(blist_node_menu_cb), pd); |
10977 | 1385 |
1386 /* use our services to do neat things */ | |
1387 services_starting(pd); | |
1388 } | |
1389 | |
1390 | |
1391 static void mw_session_stateChange(struct mwSession *session, | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1392 enum mwSessionState state, |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1393 gpointer info) { |
10977 | 1394 struct mwGaimPluginData *pd; |
1395 GaimConnection *gc; | |
1396 char *msg = NULL; | |
1397 | |
1398 pd = mwSession_getClientData(session); | |
1399 gc = pd->gc; | |
1400 | |
1401 switch(state) { | |
1402 case mwSession_STARTING: | |
1403 msg = _("Sending Handshake"); | |
1404 gaim_connection_update_progress(gc, msg, 2, MW_CONNECT_STEPS); | |
1405 break; | |
1406 | |
1407 case mwSession_HANDSHAKE: | |
1408 msg = _("Waiting for Handshake Acknowledgement"); | |
1409 gaim_connection_update_progress(gc, msg, 3, MW_CONNECT_STEPS); | |
1410 break; | |
1411 | |
1412 case mwSession_HANDSHAKE_ACK: | |
1413 msg = _("Handshake Acknowledged, Sending Login"); | |
1414 gaim_connection_update_progress(gc, msg, 4, MW_CONNECT_STEPS); | |
1415 break; | |
1416 | |
1417 case mwSession_LOGIN: | |
1418 msg = _("Waiting for Login Acknowledgement"); | |
1419 gaim_connection_update_progress(gc, msg, 5, MW_CONNECT_STEPS); | |
1420 break; | |
1421 | |
1422 case mwSession_LOGIN_REDIR: | |
1423 msg = _("Login Redirected"); | |
1424 gaim_connection_update_progress(gc, msg, 6, MW_CONNECT_STEPS); | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1425 session_loginRedirect(session, info); |
10977 | 1426 break; |
1427 | |
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
1428 case mwSession_LOGIN_CONT: |
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
1429 msg = _("Forcing Login"); |
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
1430 gaim_connection_update_progress(gc, msg, 7, MW_CONNECT_STEPS); |
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
1431 |
10977 | 1432 case mwSession_LOGIN_ACK: |
1433 msg = _("Login Acknowledged"); | |
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
1434 gaim_connection_update_progress(gc, msg, 8, MW_CONNECT_STEPS); |
10977 | 1435 break; |
1436 | |
1437 case mwSession_STARTED: | |
12813
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1438 msg = _("Starting Services"); |
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
1439 gaim_connection_update_progress(gc, msg, 9, MW_CONNECT_STEPS); |
10977 | 1440 |
1441 session_started(pd); | |
12813
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1442 |
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1443 msg = _("Connected"); |
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1444 gaim_connection_update_progress(gc, msg, 10, MW_CONNECT_STEPS); |
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1445 gaim_connection_set_state(gc, GAIM_CONNECTED); |
10977 | 1446 break; |
1447 | |
1448 case mwSession_STOPPING: | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1449 if(GPOINTER_TO_UINT(info) & ERR_FAILURE) { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1450 msg = mwError(GPOINTER_TO_UINT(info)); |
10977 | 1451 gaim_connection_error(gc, msg); |
1452 g_free(msg); | |
1453 } | |
1454 break; | |
1455 | |
1456 case mwSession_STOPPED: | |
1457 break; | |
1458 | |
1459 case mwSession_UNKNOWN: | |
1460 default: | |
1461 DEBUG_WARN("session in unknown state\n"); | |
1462 } | |
1463 } | |
1464 | |
1465 | |
1466 static void mw_session_setPrivacyInfo(struct mwSession *session) { | |
1467 struct mwGaimPluginData *pd; | |
1468 GaimConnection *gc; | |
1469 GaimAccount *acct; | |
1470 struct mwPrivacyInfo *privacy; | |
1471 GSList *l, **ll; | |
1472 guint count; | |
1473 | |
1474 DEBUG_INFO("privacy information set from server\n"); | |
1475 | |
1476 g_return_if_fail(session != NULL); | |
1477 | |
1478 pd = mwSession_getClientData(session); | |
1479 g_return_if_fail(pd != NULL); | |
1480 | |
1481 gc = pd->gc; | |
1482 g_return_if_fail(gc != NULL); | |
1483 | |
1484 acct = gaim_connection_get_account(gc); | |
1485 g_return_if_fail(acct != NULL); | |
1486 | |
1487 privacy = mwSession_getPrivacyInfo(session); | |
1488 count = privacy->count; | |
1489 | |
1490 ll = (privacy->deny)? &acct->deny: &acct->permit; | |
1491 for(l = *ll; l; l = l->next) g_free(l->data); | |
1492 g_slist_free(*ll); | |
1493 l = *ll = NULL; | |
1494 | |
1495 while(count--) { | |
1496 struct mwUserItem *u = privacy->users + count; | |
1497 l = g_slist_prepend(l, g_strdup(u->id)); | |
1498 } | |
1499 *ll = l; | |
1500 } | |
1501 | |
1502 | |
1503 static void mw_session_setUserStatus(struct mwSession *session) { | |
1504 struct mwGaimPluginData *pd; | |
1505 GaimConnection *gc; | |
1506 struct mwAwareIdBlock idb = { mwAware_USER, NULL, NULL }; | |
1507 struct mwUserStatus *stat; | |
1508 | |
1509 g_return_if_fail(session != NULL); | |
1510 | |
1511 pd = mwSession_getClientData(session); | |
1512 g_return_if_fail(pd != NULL); | |
1513 | |
1514 gc = pd->gc; | |
1515 g_return_if_fail(gc != NULL); | |
1516 | |
1517 idb.user = mwSession_getProperty(session, mwSession_AUTH_USER_ID); | |
1518 stat = mwSession_getUserStatus(session); | |
1519 | |
1520 /* trigger an update of our own status if we're in the buddy list */ | |
1521 mwServiceAware_setStatus(pd->srvc_aware, &idb, stat); | |
1522 } | |
1523 | |
1524 | |
1525 static void mw_session_admin(struct mwSession *session, | |
1526 const char *text) { | |
12813
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1527 GaimConnection *gc; |
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1528 GaimAccount *acct; |
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1529 const char *host; |
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1530 char *prim; |
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1531 |
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1532 gc = session_to_gc(session); |
10977 | 1533 g_return_if_fail(gc != NULL); |
1534 | |
12813
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1535 acct = gaim_connection_get_account(gc); |
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1536 g_return_if_fail(acct != NULL); |
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1537 |
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1538 host = gaim_account_get_string(acct, MW_KEY_HOST, NULL); |
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1539 |
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1540 prim = _("A Sametime administrator has issued the following announcement" |
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1541 " on server %s"); |
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1542 prim = g_strdup_printf(prim, NSTR(host)); |
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1543 |
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1544 gaim_notify_message(gc, GAIM_NOTIFY_MSG_INFO, |
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1545 _("Sametime Administrator Announcement"), |
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1546 prim, text, NULL, NULL); |
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1547 |
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1548 g_free(prim); |
10977 | 1549 } |
1550 | |
1551 | |
1552 /** called from read_cb, attempts to read available data from sock and | |
1553 pass it to the session, passing back the return code from the read | |
1554 call for handling in read_cb */ | |
1555 static int read_recv(struct mwSession *session, int sock) { | |
12311
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
1556 guchar buf[BUF_LEN]; |
10977 | 1557 int len; |
1558 | |
1559 len = read(sock, buf, BUF_LEN); | |
1560 if(len > 0) mwSession_recv(session, buf, len); | |
1561 | |
1562 return len; | |
1563 } | |
1564 | |
1565 | |
1566 /** callback triggered from gaim_input_add, watches the socked for | |
1567 available data to be processed by the session */ | |
1568 static void read_cb(gpointer data, gint source, | |
1569 GaimInputCondition cond) { | |
1570 | |
1571 struct mwGaimPluginData *pd = data; | |
1572 int ret = 0, err = 0; | |
1573 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1574 /* How the heck can this happen? Fix submitted to Gaim so that it |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1575 won't happen anymore. */ |
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
1576 if(! cond) return; |
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
1577 |
10977 | 1578 g_return_if_fail(pd != NULL); |
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
1579 g_return_if_fail(cond & GAIM_INPUT_READ); |
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
1580 |
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
1581 ret = read_recv(pd->session, pd->socket); |
10977 | 1582 |
1583 /* normal operation ends here */ | |
1584 if(ret > 0) return; | |
1585 | |
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
1586 /* fetch the global error value */ |
10977 | 1587 err = errno; |
1588 | |
1589 /* read problem occured if we're here, so we'll need to take care of | |
1590 it and clean up internal state */ | |
1591 | |
1592 if(pd->socket) { | |
1593 close(pd->socket); | |
1594 pd->socket = 0; | |
1595 } | |
1596 | |
1597 if(pd->gc->inpa) { | |
1598 gaim_input_remove(pd->gc->inpa); | |
1599 pd->gc->inpa = 0; | |
1600 } | |
1601 | |
1602 if(! ret) { | |
1603 DEBUG_INFO("connection reset\n"); | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1604 gaim_connection_error(pd->gc, _("Connection reset")); |
10977 | 1605 |
1606 } else if(ret < 0) { | |
1607 char *msg = strerror(err); | |
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
1608 |
10977 | 1609 DEBUG_INFO("error in read callback: %s\n", msg); |
1610 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1611 msg = g_strdup_printf(_("Error reading from socket: %s"), msg); |
10977 | 1612 gaim_connection_error(pd->gc, msg); |
1613 g_free(msg); | |
1614 } | |
1615 } | |
1616 | |
1617 | |
1618 /** Callback passed to gaim_proxy_connect when an account is logged | |
1619 in, and if the session logging in receives a redirect message */ | |
1620 static void connect_cb(gpointer data, gint source, | |
1621 GaimInputCondition cond) { | |
1622 | |
1623 struct mwGaimPluginData *pd = data; | |
1624 GaimConnection *gc = pd->gc; | |
1625 | |
1626 if(! g_list_find(gaim_connections_get_all(), pd->gc)) { | |
1627 close(source); | |
1628 g_return_if_reached(); | |
1629 } | |
1630 | |
1631 if(source < 0) { | |
1632 /* connection failed */ | |
1633 | |
1634 if(pd->socket) { | |
1635 /* this is a redirect connect, force login on existing socket */ | |
1636 mwSession_forceLogin(pd->session); | |
1637 | |
1638 } else { | |
1639 /* this is a regular connect, error out */ | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1640 gaim_connection_error(pd->gc, _("Unable to connect to host")); |
10977 | 1641 } |
1642 | |
1643 return; | |
1644 } | |
1645 | |
1646 if(pd->socket) { | |
1647 /* stop any existing login attempt */ | |
1648 mwSession_stop(pd->session, ERR_SUCCESS); | |
1649 } | |
1650 | |
1651 pd->socket = source; | |
1652 gc->inpa = gaim_input_add(source, GAIM_INPUT_READ, read_cb, pd); | |
1653 | |
1654 mwSession_start(pd->session); | |
1655 } | |
1656 | |
1657 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1658 static void mw_session_announce(struct mwSession *s, |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1659 struct mwLoginInfo *from, |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1660 gboolean may_reply, |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1661 const char *text) { |
10977 | 1662 struct mwGaimPluginData *pd; |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1663 GaimAccount *acct; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1664 GaimConversation *conv; |
12126
35c4797c5c57
[gaim-migrate @ 14426]
Richard Laager <rlaager@wiktel.com>
parents:
12107
diff
changeset
|
1665 GaimBuddy *buddy; |
12263
8190a70d2c34
[gaim-migrate @ 14565]
Christopher O'Brien <siege@pidgin.im>
parents:
12216
diff
changeset
|
1666 char *who = from->user_id; |
8190a70d2c34
[gaim-migrate @ 14565]
Christopher O'Brien <siege@pidgin.im>
parents:
12216
diff
changeset
|
1667 char *msg; |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1668 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1669 pd = mwSession_getClientData(s); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1670 acct = gaim_connection_get_account(pd->gc); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1671 conv = gaim_find_conversation_with_account(GAIM_CONV_TYPE_IM, who, acct); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1672 if(! conv) conv = gaim_conversation_new(GAIM_CONV_TYPE_IM, acct, who); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1673 |
12126
35c4797c5c57
[gaim-migrate @ 14426]
Richard Laager <rlaager@wiktel.com>
parents:
12107
diff
changeset
|
1674 buddy = gaim_find_buddy(acct, who); |
12263
8190a70d2c34
[gaim-migrate @ 14565]
Christopher O'Brien <siege@pidgin.im>
parents:
12216
diff
changeset
|
1675 if(buddy) who = (char *) gaim_buddy_get_contact_alias(buddy); |
8190a70d2c34
[gaim-migrate @ 14565]
Christopher O'Brien <siege@pidgin.im>
parents:
12216
diff
changeset
|
1676 |
8190a70d2c34
[gaim-migrate @ 14565]
Christopher O'Brien <siege@pidgin.im>
parents:
12216
diff
changeset
|
1677 who = g_strdup_printf(_("Announcement from %s"), who); |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1678 msg = gaim_markup_linkify(text); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1679 |
12263
8190a70d2c34
[gaim-migrate @ 14565]
Christopher O'Brien <siege@pidgin.im>
parents:
12216
diff
changeset
|
1680 gaim_conversation_write(conv, who, msg, GAIM_MESSAGE_RECV, time(NULL)); |
8190a70d2c34
[gaim-migrate @ 14565]
Christopher O'Brien <siege@pidgin.im>
parents:
12216
diff
changeset
|
1681 g_free(who); |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1682 g_free(msg); |
10977 | 1683 } |
1684 | |
1685 | |
1686 static struct mwSessionHandler mw_session_handler = { | |
1687 .io_write = mw_session_io_write, | |
1688 .io_close = mw_session_io_close, | |
1689 .clear = mw_session_clear, | |
1690 .on_stateChange = mw_session_stateChange, | |
1691 .on_setPrivacyInfo = mw_session_setPrivacyInfo, | |
1692 .on_setUserStatus = mw_session_setUserStatus, | |
1693 .on_admin = mw_session_admin, | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1694 .on_announce = mw_session_announce, |
10977 | 1695 }; |
1696 | |
1697 | |
1698 static void mw_aware_on_attrib(struct mwServiceAware *srvc, | |
1699 struct mwAwareAttribute *attrib) { | |
1700 | |
1701 ; /** @todo handle server attributes. There may be some stuff we | |
1702 actually want to look for, but I'm not aware of anything right | |
1703 now.*/ | |
1704 } | |
1705 | |
1706 | |
1707 static void mw_aware_clear(struct mwServiceAware *srvc) { | |
1708 ; /* nothing for now */ | |
1709 } | |
1710 | |
1711 | |
1712 static struct mwAwareHandler mw_aware_handler = { | |
1713 .on_attrib = mw_aware_on_attrib, | |
1714 .clear = mw_aware_clear, | |
1715 }; | |
1716 | |
1717 | |
1718 static struct mwServiceAware *mw_srvc_aware_new(struct mwSession *s) { | |
1719 struct mwServiceAware *srvc; | |
1720 srvc = mwServiceAware_new(s, &mw_aware_handler); | |
1721 return srvc; | |
1722 }; | |
1723 | |
1724 | |
1725 static void mw_conf_invited(struct mwConference *conf, | |
1726 struct mwLoginInfo *inviter, | |
1727 const char *invitation) { | |
1728 | |
1729 struct mwServiceConference *srvc; | |
1730 struct mwSession *session; | |
1731 struct mwGaimPluginData *pd; | |
1732 GaimConnection *gc; | |
1733 | |
1734 char *c_inviter, *c_name, *c_topic, *c_invitation; | |
1735 GHashTable *ht; | |
1736 | |
1737 srvc = mwConference_getService(conf); | |
1738 session = mwService_getSession(MW_SERVICE(srvc)); | |
1739 pd = mwSession_getClientData(session); | |
1740 gc = pd->gc; | |
1741 | |
1742 ht = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, g_free); | |
1743 | |
1744 c_inviter = g_strdup(inviter->user_id); | |
1745 g_hash_table_insert(ht, CHAT_KEY_CREATOR, c_inviter); | |
1746 | |
1747 c_name = g_strdup(mwConference_getName(conf)); | |
1748 g_hash_table_insert(ht, CHAT_KEY_NAME, c_name); | |
1749 | |
1750 c_topic = g_strdup(mwConference_getTitle(conf)); | |
1751 g_hash_table_insert(ht, CHAT_KEY_TOPIC, c_topic); | |
1752 | |
1753 c_invitation = g_strdup(invitation); | |
1754 g_hash_table_insert(ht, CHAT_KEY_INVITE, c_invitation); | |
1755 | |
1756 DEBUG_INFO("received invitation from '%s' to join ('%s','%s'): '%s'\n", | |
1757 NSTR(c_inviter), NSTR(c_name), | |
1758 NSTR(c_topic), NSTR(c_invitation)); | |
1759 | |
12742
258871a62600
[gaim-migrate @ 15089]
Christopher O'Brien <siege@pidgin.im>
parents:
12735
diff
changeset
|
1760 if(! c_topic) c_topic = "(no title)"; |
258871a62600
[gaim-migrate @ 15089]
Christopher O'Brien <siege@pidgin.im>
parents:
12735
diff
changeset
|
1761 if(! c_invitation) c_invitation = "(no message)"; |
10977 | 1762 serv_got_chat_invite(gc, c_topic, c_inviter, c_invitation, ht); |
1763 } | |
1764 | |
1765 | |
1766 /* The following mess helps us relate a mwConference to a GaimConvChat | |
1767 in the various forms by which either may be indicated */ | |
1768 | |
1769 #define CONF_TO_ID(conf) (GPOINTER_TO_INT(conf)) | |
1770 #define ID_TO_CONF(pd, id) (conf_find_by_id((pd), (id))) | |
1771 | |
1772 #define CHAT_TO_ID(chat) (gaim_conv_chat_get_id(chat)) | |
1773 #define ID_TO_CHAT(id) (gaim_find_chat(id)) | |
1774 | |
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
1775 #define CHAT_TO_CONF(pd, chat) (ID_TO_CONF((pd), CHAT_TO_ID(chat))) |
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
1776 #define CONF_TO_CHAT(conf) (ID_TO_CHAT(CONF_TO_ID(conf))) |
10977 | 1777 |
1778 | |
1779 static struct mwConference * | |
1780 conf_find_by_id(struct mwGaimPluginData *pd, int id) { | |
1781 | |
1782 struct mwServiceConference *srvc = pd->srvc_conf; | |
1783 struct mwConference *conf = NULL; | |
1784 GList *l, *ll; | |
1785 | |
1786 ll = mwServiceConference_getConferences(srvc); | |
1787 for(l = ll; l; l = l->next) { | |
1788 struct mwConference *c = l->data; | |
1789 GaimConvChat *h = mwConference_getClientData(c); | |
1790 | |
1791 if(CHAT_TO_ID(h) == id) { | |
1792 conf = c; | |
1793 break; | |
1794 } | |
1795 } | |
1796 g_list_free(ll); | |
1797 | |
1798 return conf; | |
1799 } | |
1800 | |
1801 | |
1802 static void mw_conf_opened(struct mwConference *conf, GList *members) { | |
1803 struct mwServiceConference *srvc; | |
1804 struct mwSession *session; | |
1805 struct mwGaimPluginData *pd; | |
1806 GaimConnection *gc; | |
1807 GaimConversation *g_conf; | |
1808 | |
1809 const char *n = mwConference_getName(conf); | |
12742
258871a62600
[gaim-migrate @ 15089]
Christopher O'Brien <siege@pidgin.im>
parents:
12735
diff
changeset
|
1810 const char *t = mwConference_getTitle(conf); |
10977 | 1811 |
1812 DEBUG_INFO("conf %s opened, %u initial members\n", | |
1813 NSTR(n), g_list_length(members)); | |
1814 | |
1815 srvc = mwConference_getService(conf); | |
1816 session = mwService_getSession(MW_SERVICE(srvc)); | |
1817 pd = mwSession_getClientData(session); | |
1818 gc = pd->gc; | |
1819 | |
12742
258871a62600
[gaim-migrate @ 15089]
Christopher O'Brien <siege@pidgin.im>
parents:
12735
diff
changeset
|
1820 if(! t) t = "(no title)"; |
258871a62600
[gaim-migrate @ 15089]
Christopher O'Brien <siege@pidgin.im>
parents:
12735
diff
changeset
|
1821 g_conf = serv_got_joined_chat(gc, CONF_TO_ID(conf), t); |
10977 | 1822 |
1823 mwConference_setClientData(conf, GAIM_CONV_CHAT(g_conf), NULL); | |
1824 | |
1825 for(; members; members = members->next) { | |
1826 struct mwLoginInfo *peer = members->data; | |
1827 gaim_conv_chat_add_user(GAIM_CONV_CHAT(g_conf), peer->user_id, | |
1828 NULL, GAIM_CBFLAGS_NONE, FALSE); | |
1829 } | |
1830 } | |
1831 | |
1832 | |
1833 static void mw_conf_closed(struct mwConference *conf, guint32 reason) { | |
1834 struct mwServiceConference *srvc; | |
1835 struct mwSession *session; | |
1836 struct mwGaimPluginData *pd; | |
1837 GaimConnection *gc; | |
1838 | |
1839 const char *n = mwConference_getName(conf); | |
1840 char *msg = mwError(reason); | |
1841 | |
1842 DEBUG_INFO("conf %s closed, 0x%08x\n", NSTR(n), reason); | |
1843 | |
1844 srvc = mwConference_getService(conf); | |
1845 session = mwService_getSession(MW_SERVICE(srvc)); | |
1846 pd = mwSession_getClientData(session); | |
1847 gc = pd->gc; | |
1848 | |
1849 serv_got_chat_left(gc, CONF_TO_ID(conf)); | |
1850 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1851 gaim_notify_error(gc, _("Conference Closed"), NULL, msg); |
10977 | 1852 g_free(msg); |
1853 } | |
1854 | |
1855 | |
1856 static void mw_conf_peer_joined(struct mwConference *conf, | |
1857 struct mwLoginInfo *peer) { | |
1858 | |
1859 struct mwServiceConference *srvc; | |
1860 struct mwSession *session; | |
1861 struct mwGaimPluginData *pd; | |
1862 GaimConnection *gc; | |
1863 GaimConvChat *g_conf; | |
1864 | |
1865 const char *n = mwConference_getName(conf); | |
1866 | |
1867 DEBUG_INFO("%s joined conf %s\n", NSTR(peer->user_id), NSTR(n)); | |
1868 | |
1869 srvc = mwConference_getService(conf); | |
1870 session = mwService_getSession(MW_SERVICE(srvc)); | |
1871 pd = mwSession_getClientData(session); | |
1872 gc = pd->gc; | |
1873 | |
1874 g_conf = mwConference_getClientData(conf); | |
1875 g_return_if_fail(g_conf != NULL); | |
1876 | |
1877 gaim_conv_chat_add_user(g_conf, peer->user_id, | |
1878 NULL, GAIM_CBFLAGS_NONE, TRUE); | |
1879 } | |
1880 | |
1881 | |
1882 static void mw_conf_peer_parted(struct mwConference *conf, | |
1883 struct mwLoginInfo *peer) { | |
1884 | |
1885 struct mwServiceConference *srvc; | |
1886 struct mwSession *session; | |
1887 struct mwGaimPluginData *pd; | |
1888 GaimConnection *gc; | |
1889 GaimConvChat *g_conf; | |
1890 | |
1891 const char *n = mwConference_getName(conf); | |
1892 | |
1893 DEBUG_INFO("%s left conf %s\n", NSTR(peer->user_id), NSTR(n)); | |
1894 | |
1895 srvc = mwConference_getService(conf); | |
1896 session = mwService_getSession(MW_SERVICE(srvc)); | |
1897 pd = mwSession_getClientData(session); | |
1898 gc = pd->gc; | |
1899 | |
1900 g_conf = mwConference_getClientData(conf); | |
1901 g_return_if_fail(g_conf != NULL); | |
1902 | |
1903 gaim_conv_chat_remove_user(g_conf, peer->user_id, NULL); | |
1904 } | |
1905 | |
1906 | |
1907 static void mw_conf_text(struct mwConference *conf, | |
1908 struct mwLoginInfo *who, const char *text) { | |
1909 | |
1910 struct mwServiceConference *srvc; | |
1911 struct mwSession *session; | |
1912 struct mwGaimPluginData *pd; | |
1913 GaimConnection *gc; | |
1914 char *esc; | |
1915 | |
12863
7a2169f04bdf
[gaim-migrate @ 15214]
Christopher O'Brien <siege@pidgin.im>
parents:
12830
diff
changeset
|
1916 if(! text) return; |
7a2169f04bdf
[gaim-migrate @ 15214]
Christopher O'Brien <siege@pidgin.im>
parents:
12830
diff
changeset
|
1917 |
10977 | 1918 srvc = mwConference_getService(conf); |
1919 session = mwService_getSession(MW_SERVICE(srvc)); | |
1920 pd = mwSession_getClientData(session); | |
1921 gc = pd->gc; | |
1922 | |
12864
2c0f8815aa2e
[gaim-migrate @ 15215]
Christopher O'Brien <siege@pidgin.im>
parents:
12863
diff
changeset
|
1923 esc = g_markup_escape_text(text, -1); |
10977 | 1924 serv_got_chat_in(gc, CONF_TO_ID(conf), who->user_id, 0, esc, time(NULL)); |
1925 g_free(esc); | |
1926 } | |
1927 | |
1928 | |
1929 static void mw_conf_typing(struct mwConference *conf, | |
1930 struct mwLoginInfo *who, gboolean typing) { | |
1931 | |
1932 /* gaim really has no good way to expose this to the user. */ | |
1933 | |
1934 const char *n = mwConference_getName(conf); | |
1935 const char *w = who->user_id; | |
1936 | |
1937 if(typing) { | |
1938 DEBUG_INFO("%s in conf %s: <typing>\n", NSTR(w), NSTR(n)); | |
1939 | |
1940 } else { | |
1941 DEBUG_INFO("%s in conf %s: <stopped typing>\n", NSTR(w), NSTR(n)); | |
1942 } | |
1943 } | |
1944 | |
1945 | |
1946 static void mw_conf_clear(struct mwServiceConference *srvc) { | |
1947 ; | |
1948 } | |
1949 | |
1950 | |
1951 static struct mwConferenceHandler mw_conference_handler = { | |
1952 .on_invited = mw_conf_invited, | |
1953 .conf_opened = mw_conf_opened, | |
1954 .conf_closed = mw_conf_closed, | |
1955 .on_peer_joined = mw_conf_peer_joined, | |
1956 .on_peer_parted = mw_conf_peer_parted, | |
1957 .on_text = mw_conf_text, | |
1958 .on_typing = mw_conf_typing, | |
1959 .clear = mw_conf_clear, | |
1960 }; | |
1961 | |
1962 | |
1963 static struct mwServiceConference *mw_srvc_conf_new(struct mwSession *s) { | |
1964 struct mwServiceConference *srvc; | |
1965 srvc = mwServiceConference_new(s, &mw_conference_handler); | |
1966 return srvc; | |
1967 } | |
1968 | |
1969 | |
1970 static void ft_incoming_cancel(GaimXfer *xfer) { | |
1971 /* incoming transfer rejected or canceled in-progress */ | |
1972 struct mwFileTransfer *ft = xfer->data; | |
1973 if(ft) mwFileTransfer_reject(ft); | |
1974 } | |
1975 | |
1976 | |
1977 static void ft_incoming_init(GaimXfer *xfer) { | |
1978 /* incoming transfer accepted */ | |
1979 | |
1980 /* - accept the mwFileTransfer | |
1981 - open/create the local FILE "wb" | |
1982 - stick the FILE's fp in xfer->dest_fp | |
1983 */ | |
1984 | |
1985 struct mwFileTransfer *ft; | |
1986 FILE *fp; | |
1987 | |
1988 ft = xfer->data; | |
1989 | |
1990 fp = g_fopen(xfer->local_filename, "wb"); | |
1991 if(! fp) { | |
1992 mwFileTransfer_cancel(ft); | |
1993 return; | |
1994 } | |
1995 | |
1996 xfer->dest_fp = fp; | |
1997 mwFileTransfer_accept(ft); | |
1998 } | |
1999 | |
2000 | |
2001 static void mw_ft_offered(struct mwFileTransfer *ft) { | |
2002 /* | |
2003 - create a gaim ft object | |
2004 - offer it | |
2005 */ | |
2006 | |
2007 struct mwServiceFileTransfer *srvc; | |
2008 struct mwSession *session; | |
2009 struct mwGaimPluginData *pd; | |
2010 GaimConnection *gc; | |
2011 GaimAccount *acct; | |
2012 const char *who; | |
2013 GaimXfer *xfer; | |
2014 | |
2015 /* @todo add some safety checks */ | |
2016 srvc = mwFileTransfer_getService(ft); | |
2017 session = mwService_getSession(MW_SERVICE(srvc)); | |
2018 pd = mwSession_getClientData(session); | |
2019 gc = pd->gc; | |
2020 acct = gaim_connection_get_account(gc); | |
2021 | |
2022 who = mwFileTransfer_getUser(ft)->user; | |
2023 | |
2024 DEBUG_INFO("file transfer %p offered\n", ft); | |
2025 DEBUG_INFO(" from: %s\n", NSTR(who)); | |
2026 DEBUG_INFO(" file: %s\n", NSTR(mwFileTransfer_getFileName(ft))); | |
2027 DEBUG_INFO(" size: %u\n", mwFileTransfer_getFileSize(ft)); | |
2028 DEBUG_INFO(" text: %s\n", NSTR(mwFileTransfer_getMessage(ft))); | |
2029 | |
2030 xfer = gaim_xfer_new(acct, GAIM_XFER_RECEIVE, who); | |
2031 | |
2032 gaim_xfer_ref(xfer); | |
2033 mwFileTransfer_setClientData(ft, xfer, (GDestroyNotify) gaim_xfer_unref); | |
2034 xfer->data = ft; | |
2035 | |
2036 gaim_xfer_set_init_fnc(xfer, ft_incoming_init); | |
2037 gaim_xfer_set_cancel_recv_fnc(xfer, ft_incoming_cancel); | |
2038 gaim_xfer_set_request_denied_fnc(xfer, ft_incoming_cancel); | |
2039 | |
2040 gaim_xfer_set_filename(xfer, mwFileTransfer_getFileName(ft)); | |
2041 gaim_xfer_set_size(xfer, mwFileTransfer_getFileSize(ft)); | |
2042 gaim_xfer_set_message(xfer, mwFileTransfer_getMessage(ft)); | |
2043 | |
2044 gaim_xfer_request(xfer); | |
2045 } | |
2046 | |
2047 | |
2048 static void ft_send(struct mwFileTransfer *ft, FILE *fp) { | |
12311
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
2049 guchar buf[BUF_LONG]; |
10977 | 2050 struct mwOpaque o = { .data = buf, .len = BUF_LONG }; |
2051 guint32 rem; | |
2052 GaimXfer *xfer; | |
2053 | |
2054 xfer = mwFileTransfer_getClientData(ft); | |
2055 | |
2056 rem = mwFileTransfer_getRemaining(ft); | |
2057 if(rem < BUF_LONG) o.len = rem; | |
2058 | |
2059 if(fread(buf, (size_t) o.len, 1, fp)) { | |
2060 | |
2061 /* calculate progress first. update is displayed upon ack */ | |
2062 xfer->bytes_sent += o.len; | |
2063 xfer->bytes_remaining -= o.len; | |
2064 | |
2065 /* ... send data second */ | |
2066 mwFileTransfer_send(ft, &o); | |
2067 | |
2068 } else { | |
2069 int err = errno; | |
2070 DEBUG_WARN("problem reading from file %s: %s", | |
2071 NSTR(mwFileTransfer_getFileName(ft)), strerror(err)); | |
2072 | |
2073 mwFileTransfer_cancel(ft); | |
2074 } | |
2075 } | |
2076 | |
2077 | |
2078 static gboolean ft_idle_cb(struct mwFileTransfer *ft) { | |
2079 GaimXfer *xfer = mwFileTransfer_getClientData(ft); | |
2080 g_return_val_if_fail(xfer != NULL, FALSE); | |
2081 | |
2082 xfer->watcher = 0; | |
2083 ft_send(ft, xfer->dest_fp); | |
2084 | |
2085 return FALSE; | |
2086 } | |
2087 | |
2088 | |
2089 static void mw_ft_opened(struct mwFileTransfer *ft) { | |
2090 /* | |
2091 - get gaim ft from client data in ft | |
2092 - set the state to active | |
2093 */ | |
2094 | |
2095 GaimXfer *xfer; | |
2096 | |
2097 xfer = mwFileTransfer_getClientData(ft); | |
2098 | |
2099 if(! xfer) { | |
2100 mwFileTransfer_cancel(ft); | |
2101 mwFileTransfer_free(ft); | |
2102 g_return_if_reached(); | |
2103 } | |
2104 | |
2105 gaim_xfer_update_progress(xfer); | |
2106 | |
2107 if(gaim_xfer_get_type(xfer) == GAIM_XFER_SEND) { | |
2108 xfer->watcher = g_idle_add((GSourceFunc)ft_idle_cb, ft); | |
2109 xfer->dest_fp = g_fopen(xfer->local_filename, "rb"); | |
2110 } | |
2111 } | |
2112 | |
2113 | |
2114 static void mw_ft_closed(struct mwFileTransfer *ft, guint32 code) { | |
2115 /* | |
2116 - get gaim ft from client data in ft | |
2117 - indicate rejection/cancelation/completion | |
2118 - free the file transfer itself | |
2119 */ | |
2120 | |
2121 GaimXfer *xfer; | |
2122 | |
2123 xfer = mwFileTransfer_getClientData(ft); | |
2124 if(xfer) { | |
2125 xfer->data = NULL; | |
2126 | |
2127 if(mwFileTransfer_isDone(ft)) { | |
2128 gaim_xfer_set_completed(xfer, TRUE); | |
2129 gaim_xfer_end(xfer); | |
2130 | |
2131 } else if(mwFileTransfer_isCancelLocal(ft)) { | |
2132 /* calling gaim_xfer_cancel_local is redundant, since that's | |
2133 probably what triggered this function to be called */ | |
2134 ; | |
2135 | |
2136 } else if(mwFileTransfer_isCancelRemote(ft)) { | |
2137 /* steal the reference for the xfer */ | |
2138 mwFileTransfer_setClientData(ft, NULL, NULL); | |
2139 gaim_xfer_cancel_remote(xfer); | |
2140 | |
2141 /* drop the stolen reference */ | |
2142 gaim_xfer_unref(xfer); | |
2143 return; | |
2144 } | |
2145 } | |
2146 | |
2147 mwFileTransfer_free(ft); | |
2148 } | |
2149 | |
2150 | |
2151 static void mw_ft_recv(struct mwFileTransfer *ft, | |
2152 struct mwOpaque *data) { | |
2153 /* | |
2154 - get gaim ft from client data in ft | |
2155 - update transfered percentage | |
2156 - if done, destroy the ft, disassociate from gaim ft | |
2157 */ | |
2158 | |
2159 GaimXfer *xfer; | |
2160 FILE *fp; | |
2161 | |
2162 xfer = mwFileTransfer_getClientData(ft); | |
2163 g_return_if_fail(xfer != NULL); | |
2164 | |
2165 fp = xfer->dest_fp; | |
2166 g_return_if_fail(fp != NULL); | |
2167 | |
2168 /* we must collect and save our precious data */ | |
2169 fwrite(data->data, 1, data->len, fp); | |
2170 | |
2171 /* update the progress */ | |
2172 xfer->bytes_sent += data->len; | |
2173 xfer->bytes_remaining -= data->len; | |
2174 gaim_xfer_update_progress(xfer); | |
2175 | |
2176 /* let the other side know we got it, and to send some more */ | |
2177 mwFileTransfer_ack(ft); | |
2178 } | |
2179 | |
2180 | |
2181 static void mw_ft_ack(struct mwFileTransfer *ft) { | |
2182 GaimXfer *xfer; | |
2183 | |
2184 xfer = mwFileTransfer_getClientData(ft); | |
2185 g_return_if_fail(xfer != NULL); | |
2186 g_return_if_fail(xfer->watcher == 0); | |
2187 | |
2188 gaim_xfer_update_progress(xfer); | |
2189 | |
2190 if(mwFileTransfer_isOpen(ft)) | |
2191 xfer->watcher = g_idle_add((GSourceFunc)ft_idle_cb, ft); | |
2192 } | |
2193 | |
2194 | |
2195 static void mw_ft_clear(struct mwServiceFileTransfer *srvc) { | |
2196 ; | |
2197 } | |
2198 | |
2199 | |
2200 static struct mwFileTransferHandler mw_ft_handler = { | |
2201 .ft_offered = mw_ft_offered, | |
2202 .ft_opened = mw_ft_opened, | |
2203 .ft_closed = mw_ft_closed, | |
2204 .ft_recv = mw_ft_recv, | |
2205 .ft_ack = mw_ft_ack, | |
2206 .clear = mw_ft_clear, | |
2207 }; | |
2208 | |
2209 | |
2210 static struct mwServiceFileTransfer *mw_srvc_ft_new(struct mwSession *s) { | |
2211 struct mwServiceFileTransfer *srvc; | |
2212 GHashTable *ft_map; | |
2213 | |
2214 ft_map = g_hash_table_new(g_direct_hash, g_direct_equal); | |
2215 | |
2216 srvc = mwServiceFileTransfer_new(s, &mw_ft_handler); | |
2217 mwService_setClientData(MW_SERVICE(srvc), ft_map, | |
2218 (GDestroyNotify) g_hash_table_destroy); | |
2219 | |
2220 return srvc; | |
2221 } | |
2222 | |
2223 | |
2224 static void convo_data_free(struct convo_data *cd) { | |
2225 GList *l; | |
2226 | |
2227 /* clean the queue */ | |
2228 for(l = cd->queue; l; l = g_list_delete_link(l, l)) { | |
2229 struct convo_msg *m = l->data; | |
2230 if(m->clear) m->clear(m->data); | |
2231 g_free(m); | |
2232 } | |
2233 | |
2234 g_free(cd); | |
2235 } | |
2236 | |
2237 | |
2238 /** allocates a convo_data structure and associates it with the | |
2239 conversation in the client data slot */ | |
2240 static void convo_data_new(struct mwConversation *conv) { | |
2241 struct convo_data *cd; | |
2242 | |
2243 g_return_if_fail(conv != NULL); | |
2244 | |
2245 if(mwConversation_getClientData(conv)) | |
2246 return; | |
2247 | |
2248 cd = g_new0(struct convo_data, 1); | |
2249 cd->conv = conv; | |
2250 | |
2251 mwConversation_setClientData(conv, cd, (GDestroyNotify) convo_data_free); | |
2252 } | |
2253 | |
2254 | |
2255 static GaimConversation *convo_get_gconv(struct mwConversation *conv) { | |
2256 struct mwServiceIm *srvc; | |
2257 struct mwSession *session; | |
2258 struct mwGaimPluginData *pd; | |
2259 GaimConnection *gc; | |
2260 GaimAccount *acct; | |
2261 | |
2262 struct mwIdBlock *idb; | |
2263 | |
2264 srvc = mwConversation_getService(conv); | |
2265 session = mwService_getSession(MW_SERVICE(srvc)); | |
2266 pd = mwSession_getClientData(session); | |
2267 gc = pd->gc; | |
2268 acct = gaim_connection_get_account(gc); | |
2269 | |
2270 idb = mwConversation_getTarget(conv); | |
2271 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2272 return gaim_find_conversation_with_account(GAIM_CONV_TYPE_IM, |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2273 idb->user, acct); |
10977 | 2274 } |
2275 | |
2276 | |
2277 static void convo_queue(struct mwConversation *conv, | |
2278 enum mwImSendType type, gconstpointer data) { | |
2279 | |
2280 struct convo_data *cd; | |
2281 struct convo_msg *m; | |
2282 | |
2283 convo_data_new(conv); | |
2284 cd = mwConversation_getClientData(conv); | |
2285 | |
2286 m = g_new0(struct convo_msg, 1); | |
2287 m->type = type; | |
2288 | |
2289 switch(type) { | |
2290 case mwImSend_PLAIN: | |
2291 m->data = g_strdup(data); | |
2292 m->clear = g_free; | |
2293 break; | |
2294 | |
2295 case mwImSend_TYPING: | |
2296 default: | |
2297 m->data = (gpointer) data; | |
2298 m->clear = NULL; | |
2299 } | |
2300 | |
2301 cd->queue = g_list_append(cd->queue, m); | |
2302 } | |
2303 | |
2304 | |
2305 /* Does what it takes to get an error displayed for a conversation */ | |
2306 static void convo_error(struct mwConversation *conv, guint32 err) { | |
2307 GaimConversation *gconv; | |
2308 char *tmp, *text; | |
2309 struct mwIdBlock *idb; | |
2310 | |
2311 idb = mwConversation_getTarget(conv); | |
2312 | |
2313 tmp = mwError(err); | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2314 text = g_strconcat(_("Unable to send message: "), tmp, NULL); |
10977 | 2315 |
2316 gconv = convo_get_gconv(conv); | |
2317 if(gconv && !gaim_conv_present_error(idb->user, gconv->account, text)) { | |
2318 | |
2319 g_free(text); | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2320 text = g_strdup_printf(_("Unable to send message to %s:"), |
10977 | 2321 (idb->user)? idb->user: "(unknown)"); |
2322 gaim_notify_error(gaim_account_get_connection(gconv->account), | |
2323 NULL, text, tmp); | |
2324 } | |
2325 | |
2326 g_free(tmp); | |
2327 g_free(text); | |
2328 } | |
2329 | |
2330 | |
2331 static void convo_queue_send(struct mwConversation *conv) { | |
2332 struct convo_data *cd; | |
2333 GList *l; | |
2334 | |
2335 cd = mwConversation_getClientData(conv); | |
2336 | |
2337 for(l = cd->queue; l; l = g_list_delete_link(l, l)) { | |
2338 struct convo_msg *m = l->data; | |
2339 | |
2340 mwConversation_send(conv, m->type, m->data); | |
2341 | |
2342 if(m->clear) m->clear(m->data); | |
2343 g_free(m); | |
2344 } | |
2345 | |
2346 cd->queue = NULL; | |
2347 } | |
2348 | |
2349 | |
2350 /** called when a mw conversation leaves a gaim conversation to | |
2351 inform the gaim conversation that it's unsafe to offer any *cool* | |
2352 features. */ | |
2353 static void convo_nofeatures(struct mwConversation *conv) { | |
2354 GaimConversation *gconv; | |
2355 GaimConnection *gc; | |
2356 | |
2357 gconv = convo_get_gconv(conv); | |
2358 if(! gconv) return; | |
2359 | |
2360 gc = gaim_conversation_get_gc(gconv); | |
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
2361 if(! gc) return; |
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
2362 |
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
2363 gaim_conversation_set_features(gconv, gc->flags); |
10977 | 2364 } |
2365 | |
2366 | |
2367 /** called when a mw conversation and gaim conversation come together, | |
2368 to inform the gaim conversation of what features to offer the | |
2369 user */ | |
2370 static void convo_features(struct mwConversation *conv) { | |
2371 GaimConversation *gconv; | |
2372 GaimConnectionFlags feat; | |
2373 | |
2374 gconv = convo_get_gconv(conv); | |
2375 if(! gconv) return; | |
2376 | |
2377 feat = gaim_conversation_get_features(gconv); | |
2378 | |
2379 if(mwConversation_isOpen(conv)) { | |
2380 if(mwConversation_supports(conv, mwImSend_HTML)) { | |
2381 feat |= GAIM_CONNECTION_HTML; | |
2382 } else { | |
2383 feat &= ~GAIM_CONNECTION_HTML; | |
2384 } | |
2385 | |
2386 if(mwConversation_supports(conv, mwImSend_MIME)) { | |
2387 feat &= ~GAIM_CONNECTION_NO_IMAGES; | |
2388 } else { | |
2389 feat |= GAIM_CONNECTION_NO_IMAGES; | |
2390 } | |
2391 | |
2392 DEBUG_INFO("conversation features set to 0x%04x\n", feat); | |
2393 gaim_conversation_set_features(gconv, feat); | |
2394 | |
2395 } else { | |
2396 convo_nofeatures(conv); | |
2397 } | |
2398 } | |
2399 | |
2400 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2401 #if 0 |
10977 | 2402 /** triggered from mw_conversation_opened if the appropriate plugin |
2403 preference is set. This will open a window for the conversation | |
2404 before the first message is sent. */ | |
2405 static void convo_do_psychic(struct mwConversation *conv) { | |
2406 struct mwServiceIm *srvc; | |
2407 struct mwSession *session; | |
2408 struct mwGaimPluginData *pd; | |
2409 GaimConnection *gc; | |
2410 GaimAccount *acct; | |
2411 | |
2412 struct mwIdBlock *idb; | |
2413 | |
2414 GaimConversation *gconv; | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2415 GaimConvWindow *win; |
10977 | 2416 |
2417 srvc = mwConversation_getService(conv); | |
2418 session = mwService_getSession(MW_SERVICE(srvc)); | |
2419 pd = mwSession_getClientData(session); | |
2420 gc = pd->gc; | |
2421 acct = gaim_connection_get_account(gc); | |
2422 | |
2423 idb = mwConversation_getTarget(conv); | |
2424 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2425 gconv = gaim_find_conversation_with_account(GAIM_CONV_TYPE_IM, |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2426 idb->user, acct); |
10977 | 2427 if(! gconv) { |
11338 | 2428 gconv = gaim_conversation_new(GAIM_CONV_TYPE_IM, acct, idb->user); |
10977 | 2429 } |
2430 | |
2431 g_return_if_fail(gconv != NULL); | |
2432 | |
2433 win = gaim_conversation_get_window(gconv); | |
2434 g_return_if_fail(win != NULL); | |
2435 | |
2436 gaim_conv_window_show(win); | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2437 } |
11547 | 2438 #endif |
10977 | 2439 |
2440 | |
2441 static void mw_conversation_opened(struct mwConversation *conv) { | |
2442 struct mwServiceIm *srvc; | |
2443 struct mwSession *session; | |
2444 struct mwGaimPluginData *pd; | |
2445 GaimConnection *gc; | |
2446 GaimAccount *acct; | |
2447 | |
2448 struct convo_dat *cd; | |
2449 | |
2450 srvc = mwConversation_getService(conv); | |
2451 session = mwService_getSession(MW_SERVICE(srvc)); | |
2452 pd = mwSession_getClientData(session); | |
2453 gc = pd->gc; | |
2454 acct = gaim_connection_get_account(gc); | |
2455 | |
2456 /* set up the queue */ | |
2457 cd = mwConversation_getClientData(conv); | |
2458 if(cd) { | |
2459 convo_queue_send(conv); | |
2460 | |
2461 if(! convo_get_gconv(conv)) { | |
2462 mwConversation_free(conv); | |
2463 return; | |
2464 } | |
2465 | |
2466 } else { | |
2467 convo_data_new(conv); | |
2468 } | |
2469 | |
2470 { /* record the client key for the buddy */ | |
2471 GaimBuddy *buddy; | |
2472 struct mwLoginInfo *info; | |
2473 info = mwConversation_getTargetInfo(conv); | |
2474 | |
2475 buddy = gaim_find_buddy(acct, info->user_id); | |
2476 if(buddy) { | |
2477 gaim_blist_node_set_int((GaimBlistNode *) buddy, | |
2478 BUDDY_KEY_CLIENT, info->type); | |
2479 } | |
2480 } | |
2481 | |
2482 convo_features(conv); | |
2483 } | |
2484 | |
2485 | |
2486 static void mw_conversation_closed(struct mwConversation *conv, | |
2487 guint32 reason) { | |
2488 | |
2489 struct convo_data *cd; | |
2490 | |
2491 g_return_if_fail(conv != NULL); | |
2492 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2493 /* if there's an error code and a non-typing message in the queue, |
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
2494 print an error message to the conversation */ |
10977 | 2495 cd = mwConversation_getClientData(conv); |
2496 if(reason && cd && cd->queue) { | |
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
2497 GList *l; |
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
2498 for(l = cd->queue; l; l = l->next) { |
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
2499 struct convo_msg *m = l->data; |
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
2500 if(m->type != mwImSend_TYPING) { |
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
2501 convo_error(conv, reason); |
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
2502 break; |
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
2503 } |
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
2504 } |
10977 | 2505 } |
2506 | |
2507 #if 0 | |
2508 /* don't do this, to prevent the occasional weird sending of | |
2509 formatted messages as plaintext when the other end closes the | |
2510 conversation after we've begun composing the message */ | |
2511 convo_nofeatures(conv); | |
2512 #endif | |
2513 | |
2514 mwConversation_removeClientData(conv); | |
2515 } | |
2516 | |
2517 | |
2518 static void im_recv_text(struct mwConversation *conv, | |
2519 struct mwGaimPluginData *pd, | |
2520 const char *msg) { | |
2521 | |
2522 struct mwIdBlock *idb; | |
12524
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
2523 char *txt, *esc; |
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
2524 const char *t; |
10977 | 2525 |
2526 idb = mwConversation_getTarget(conv); | |
12524
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
2527 |
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
2528 txt = gaim_utf8_try_convert(msg); |
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
2529 t = txt? txt: msg; |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2530 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2531 esc = g_markup_escape_text(t, -1); |
10977 | 2532 serv_got_im(pd->gc, idb->user, esc, 0, time(NULL)); |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2533 g_free(esc); |
10977 | 2534 |
2535 g_free(txt); | |
2536 } | |
2537 | |
2538 | |
2539 static void im_recv_typing(struct mwConversation *conv, | |
2540 struct mwGaimPluginData *pd, | |
2541 gboolean typing) { | |
2542 | |
2543 struct mwIdBlock *idb; | |
2544 idb = mwConversation_getTarget(conv); | |
2545 | |
2546 serv_got_typing(pd->gc, idb->user, 0, | |
2547 typing? GAIM_TYPING: GAIM_NOT_TYPING); | |
2548 } | |
2549 | |
2550 | |
2551 static void im_recv_html(struct mwConversation *conv, | |
2552 struct mwGaimPluginData *pd, | |
2553 const char *msg) { | |
2554 struct mwIdBlock *idb; | |
12524
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
2555 char *t1, *t2; |
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
2556 const char *t; |
10977 | 2557 |
2558 idb = mwConversation_getTarget(conv); | |
12524
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
2559 |
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
2560 /* ensure we're receiving UTF8 */ |
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
2561 t1 = gaim_utf8_try_convert(msg); |
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
2562 t = t1? t1: msg; |
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
2563 |
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
2564 /* convert entities to UTF8 so they'll log correctly */ |
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
2565 t2 = gaim_utf8_ncr_decode(t); |
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
2566 t = t2? t2: t; |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2567 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2568 serv_got_im(pd->gc, idb->user, t, 0, time(NULL)); |
10977 | 2569 |
12524
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
2570 g_free(t1); |
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
2571 g_free(t2); |
10977 | 2572 } |
2573 | |
2574 | |
2575 static void im_recv_subj(struct mwConversation *conv, | |
2576 struct mwGaimPluginData *pd, | |
2577 const char *subj) { | |
2578 | |
2579 /** @todo somehow indicate receipt of a conversation subject. It | |
2580 would also be nice if we added a /topic command for the | |
2581 protocol */ | |
2582 ; | |
2583 } | |
2584 | |
2585 | |
2586 /** generate "cid:908@20582notesbuddy" from "<908@20582notesbuddy>" */ | |
2587 static char *make_cid(const char *cid) { | |
2588 gsize n; | |
2589 char *c, *d; | |
2590 | |
2591 g_return_val_if_fail(cid != NULL, NULL); | |
2592 | |
2593 n = strlen(cid); | |
2594 g_return_val_if_fail(n > 2, NULL); | |
2595 | |
2596 c = g_strndup(cid+1, n-2); | |
2597 d = g_strdup_printf("cid:%s", c); | |
2598 | |
2599 g_free(c); | |
2600 return d; | |
2601 } | |
2602 | |
2603 | |
2604 static void im_recv_mime(struct mwConversation *conv, | |
2605 struct mwGaimPluginData *pd, | |
2606 const char *data) { | |
2607 | |
2608 struct mwIdBlock *idb; | |
2609 | |
2610 GHashTable *img_by_cid; | |
2611 GList *images; | |
2612 | |
2613 GString *str; | |
2614 | |
2615 GaimMimeDocument *doc; | |
2616 const GList *parts; | |
2617 | |
2618 idb = mwConversation_getTarget(conv); | |
2619 | |
2620 img_by_cid = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); | |
2621 images = NULL; | |
2622 | |
2623 /* don't want the contained string to ever be NULL */ | |
2624 str = g_string_new(""); | |
2625 | |
2626 doc = gaim_mime_document_parse(data); | |
2627 | |
2628 /* handle all the MIME parts */ | |
2629 parts = gaim_mime_document_get_parts(doc); | |
2630 for(; parts; parts = parts->next) { | |
2631 GaimMimePart *part = parts->data; | |
2632 const char *type; | |
2633 | |
2634 type = gaim_mime_part_get_field(part, "content-type"); | |
2635 DEBUG_INFO("MIME part Content-Type: %s\n", NSTR(type)); | |
2636 | |
2637 if(! type) { | |
2638 ; /* feh */ | |
2639 | |
12166 | 2640 } else if(gaim_str_has_prefix(type, "image")) { |
10977 | 2641 /* put images into the image store */ |
2642 | |
11183 | 2643 guchar *d_dat; |
10977 | 2644 gsize d_len; |
2645 char *cid; | |
2646 int img; | |
2647 | |
2648 /* obtain and unencode the data */ | |
2649 gaim_mime_part_get_data_decoded(part, &d_dat, &d_len); | |
2650 | |
2651 /* look up the content id */ | |
2652 cid = (char *) gaim_mime_part_get_field(part, "Content-ID"); | |
2653 cid = make_cid(cid); | |
2654 | |
2655 /* add image to the gaim image store */ | |
2656 img = gaim_imgstore_add(d_dat, d_len, cid); | |
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
2657 g_free(d_dat); |
10977 | 2658 |
2659 /* map the cid to the image store identifier */ | |
2660 g_hash_table_insert(img_by_cid, cid, GINT_TO_POINTER(img)); | |
2661 | |
2662 /* recall the image for dereferencing later */ | |
2663 images = g_list_append(images, GINT_TO_POINTER(img)); | |
2664 | |
12166 | 2665 } else if(gaim_str_has_prefix(type, "text")) { |
10977 | 2666 |
2667 /* concatenate all the text parts together */ | |
11183 | 2668 guchar *data; |
10977 | 2669 gsize len; |
2670 | |
2671 gaim_mime_part_get_data_decoded(part, &data, &len); | |
12524
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
2672 g_string_append(str, (const char *)data); |
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
2673 g_free(data); |
10977 | 2674 } |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2675 } |
10977 | 2676 |
2677 gaim_mime_document_free(doc); | |
2678 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2679 /* @todo should put this in its own function */ |
10977 | 2680 { /* replace each IMG tag's SRC attribute with an ID attribute. This |
2681 actually modifies the contents of str */ | |
2682 GData *attribs; | |
2683 char *start, *end; | |
2684 char *tmp = str->str; | |
2685 | |
2686 while(*tmp && gaim_markup_find_tag("img", tmp, (const char **) &start, | |
2687 (const char **) &end, &attribs)) { | |
2688 | |
2689 char *alt, *align, *border, *src; | |
2690 int img; | |
2691 | |
2692 alt = g_datalist_get_data(&attribs, "alt"); | |
2693 align = g_datalist_get_data(&attribs, "align"); | |
2694 border = g_datalist_get_data(&attribs, "border"); | |
2695 src = g_datalist_get_data(&attribs, "src"); | |
2696 | |
2697 img = GPOINTER_TO_INT(g_hash_table_lookup(img_by_cid, src)); | |
2698 if(img) { | |
2699 GString *atstr; | |
2700 gsize len = (end - start); | |
2701 gsize mov; | |
2702 | |
2703 atstr = g_string_new(""); | |
2704 if(alt) g_string_append_printf(atstr, " alt=\"%s\"", alt); | |
2705 if(align) g_string_append_printf(atstr, " align=\"%s\"", align); | |
2706 if(border) g_string_append_printf(atstr, " border=\"%s\"", border); | |
2707 | |
2708 mov = g_snprintf(start, len, "<img%s id=\"%i\"", atstr->str, img); | |
2709 while(mov < len) start[mov++] = ' '; | |
2710 | |
2711 g_string_free(atstr, TRUE); | |
2712 } | |
2713 | |
2714 g_datalist_clear(&attribs); | |
2715 tmp = end + 1; | |
2716 } | |
2717 } | |
2718 | |
12524
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
2719 im_recv_html(conv, pd, str->str); |
10977 | 2720 |
2721 g_string_free(str, TRUE); | |
2722 | |
2723 /* clean up the cid table */ | |
2724 g_hash_table_destroy(img_by_cid); | |
2725 | |
2726 /* dereference all the imgages */ | |
2727 while(images) { | |
2728 gaim_imgstore_unref(GPOINTER_TO_INT(images->data)); | |
2729 images = g_list_delete_link(images, images); | |
2730 } | |
2731 } | |
2732 | |
2733 | |
2734 static void mw_conversation_recv(struct mwConversation *conv, | |
2735 enum mwImSendType type, | |
2736 gconstpointer msg) { | |
2737 struct mwServiceIm *srvc; | |
2738 struct mwSession *session; | |
2739 struct mwGaimPluginData *pd; | |
2740 | |
2741 srvc = mwConversation_getService(conv); | |
2742 session = mwService_getSession(MW_SERVICE(srvc)); | |
2743 pd = mwSession_getClientData(session); | |
2744 | |
2745 switch(type) { | |
2746 case mwImSend_PLAIN: | |
2747 im_recv_text(conv, pd, msg); | |
2748 break; | |
2749 | |
2750 case mwImSend_TYPING: | |
2751 im_recv_typing(conv, pd, !! msg); | |
2752 break; | |
2753 | |
2754 case mwImSend_HTML: | |
2755 im_recv_html(conv, pd, msg); | |
2756 break; | |
2757 | |
2758 case mwImSend_SUBJECT: | |
2759 im_recv_subj(conv, pd, msg); | |
2760 break; | |
2761 | |
2762 case mwImSend_MIME: | |
2763 im_recv_mime(conv, pd, msg); | |
2764 break; | |
2765 | |
2766 default: | |
2767 DEBUG_INFO("conversation received strange type, 0x%04x\n", type); | |
2768 ; /* erm... */ | |
2769 } | |
2770 } | |
2771 | |
2772 | |
2773 static void mw_place_invite(struct mwConversation *conv, | |
2774 const char *message, | |
2775 const char *title, const char *name) { | |
2776 struct mwServiceIm *srvc; | |
2777 struct mwSession *session; | |
2778 struct mwGaimPluginData *pd; | |
2779 | |
2780 struct mwIdBlock *idb; | |
2781 GHashTable *ht; | |
2782 | |
2783 srvc = mwConversation_getService(conv); | |
2784 session = mwService_getSession(MW_SERVICE(srvc)); | |
2785 pd = mwSession_getClientData(session); | |
2786 | |
2787 idb = mwConversation_getTarget(conv); | |
2788 | |
2789 ht = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, g_free); | |
2790 g_hash_table_insert(ht, CHAT_KEY_CREATOR, g_strdup(idb->user)); | |
2791 g_hash_table_insert(ht, CHAT_KEY_NAME, g_strdup(name)); | |
2792 g_hash_table_insert(ht, CHAT_KEY_TOPIC, g_strdup(title)); | |
2793 g_hash_table_insert(ht, CHAT_KEY_INVITE, g_strdup(message)); | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2794 g_hash_table_insert(ht, CHAT_KEY_IS_PLACE, g_strdup("")); /* ugh */ |
10977 | 2795 |
12742
258871a62600
[gaim-migrate @ 15089]
Christopher O'Brien <siege@pidgin.im>
parents:
12735
diff
changeset
|
2796 if(! title) title = "(no title)"; |
258871a62600
[gaim-migrate @ 15089]
Christopher O'Brien <siege@pidgin.im>
parents:
12735
diff
changeset
|
2797 if(! message) message = "(no message)"; |
10977 | 2798 serv_got_chat_invite(pd->gc, title, idb->user, message, ht); |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2799 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2800 mwConversation_close(conv, ERR_SUCCESS); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2801 mwConversation_free(conv); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2802 } |
10977 | 2803 |
2804 | |
2805 static void mw_im_clear(struct mwServiceIm *srvc) { | |
2806 ; | |
2807 } | |
2808 | |
2809 | |
2810 static struct mwImHandler mw_im_handler = { | |
2811 .conversation_opened = mw_conversation_opened, | |
2812 .conversation_closed = mw_conversation_closed, | |
2813 .conversation_recv = mw_conversation_recv, | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2814 .place_invite = mw_place_invite, |
10977 | 2815 .clear = mw_im_clear, |
2816 }; | |
2817 | |
2818 | |
2819 static struct mwServiceIm *mw_srvc_im_new(struct mwSession *s) { | |
2820 struct mwServiceIm *srvc; | |
2821 srvc = mwServiceIm_new(s, &mw_im_handler); | |
2822 mwServiceIm_setClientType(srvc, mwImClient_NOTESBUDDY); | |
2823 return srvc; | |
2824 } | |
2825 | |
2826 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2827 /* The following helps us relate a mwPlace to a GaimConvChat in the |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2828 various forms by which either may be indicated. Uses some of |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2829 the similar macros from the conference service above */ |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2830 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2831 #define PLACE_TO_ID(place) (GPOINTER_TO_INT(place)) |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2832 #define ID_TO_PLACE(pd, id) (place_find_by_id((pd), (id))) |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2833 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2834 #define CHAT_TO_PLACE(pd, chat) (ID_TO_PLACE((pd), CHAT_TO_ID(chat))) |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2835 #define PLACE_TO_CHAT(place) (ID_TO_CHAT(PLACE_TO_ID(place))) |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2836 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2837 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2838 static struct mwPlace * |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2839 place_find_by_id(struct mwGaimPluginData *pd, int id) { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2840 struct mwServicePlace *srvc = pd->srvc_place; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2841 struct mwPlace *place = NULL; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2842 GList *l; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2843 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2844 l = (GList *) mwServicePlace_getPlaces(srvc); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2845 for(; l; l = l->next) { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2846 struct mwPlace *p = l->data; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2847 GaimConvChat *h = GAIM_CONV_CHAT(mwPlace_getClientData(p)); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2848 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2849 if(CHAT_TO_ID(h) == id) { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2850 place = p; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2851 break; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2852 } |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2853 } |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2854 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2855 return place; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2856 } |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2857 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2858 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2859 static void mw_place_opened(struct mwPlace *place) { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2860 struct mwServicePlace *srvc; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2861 struct mwSession *session; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2862 struct mwGaimPluginData *pd; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2863 GaimConnection *gc; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2864 GaimConversation *gconf; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2865 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2866 GList *members, *l; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2867 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2868 const char *n = mwPlace_getName(place); |
12742
258871a62600
[gaim-migrate @ 15089]
Christopher O'Brien <siege@pidgin.im>
parents:
12735
diff
changeset
|
2869 const char *t = mwPlace_getTitle(place); |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2870 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2871 srvc = mwPlace_getService(place); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2872 session = mwService_getSession(MW_SERVICE(srvc)); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2873 pd = mwSession_getClientData(session); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2874 gc = pd->gc; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2875 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2876 members = mwPlace_getMembers(place); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2877 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2878 DEBUG_INFO("place %s opened, %u initial members\n", |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2879 NSTR(n), g_list_length(members)); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2880 |
12742
258871a62600
[gaim-migrate @ 15089]
Christopher O'Brien <siege@pidgin.im>
parents:
12735
diff
changeset
|
2881 if(! t) t = "(no title)"; |
258871a62600
[gaim-migrate @ 15089]
Christopher O'Brien <siege@pidgin.im>
parents:
12735
diff
changeset
|
2882 gconf = serv_got_joined_chat(gc, PLACE_TO_ID(place), t); |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2883 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2884 mwPlace_setClientData(place, gconf, NULL); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2885 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2886 for(l = members; l; l = l->next) { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2887 struct mwIdBlock *idb = l->data; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2888 gaim_conv_chat_add_user(GAIM_CONV_CHAT(gconf), idb->user, |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2889 NULL, GAIM_CBFLAGS_NONE, FALSE); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2890 } |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2891 g_list_free(members); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2892 } |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2893 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2894 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2895 static void mw_place_closed(struct mwPlace *place, guint32 code) { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2896 struct mwServicePlace *srvc; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2897 struct mwSession *session; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2898 struct mwGaimPluginData *pd; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2899 GaimConnection *gc; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2900 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2901 const char *n = mwPlace_getName(place); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2902 char *msg = mwError(code); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2903 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2904 DEBUG_INFO("place %s closed, 0x%08x\n", NSTR(n), code); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2905 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2906 srvc = mwPlace_getService(place); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2907 session = mwService_getSession(MW_SERVICE(srvc)); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2908 pd = mwSession_getClientData(session); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2909 gc = pd->gc; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2910 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2911 serv_got_chat_left(gc, PLACE_TO_ID(place)); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2912 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2913 gaim_notify_error(gc, _("Place Closed"), NULL, msg); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2914 g_free(msg); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2915 } |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2916 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2917 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2918 static void mw_place_peerJoined(struct mwPlace *place, |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2919 const struct mwIdBlock *peer) { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2920 struct mwServicePlace *srvc; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2921 struct mwSession *session; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2922 struct mwGaimPluginData *pd; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2923 GaimConnection *gc; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2924 GaimConversation *gconf; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2925 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2926 const char *n = mwPlace_getName(place); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2927 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2928 DEBUG_INFO("%s joined place %s\n", NSTR(peer->user), NSTR(n)); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2929 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2930 srvc = mwPlace_getService(place); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2931 session = mwService_getSession(MW_SERVICE(srvc)); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2932 pd = mwSession_getClientData(session); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2933 gc = pd->gc; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2934 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2935 gconf = mwPlace_getClientData(place); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2936 g_return_if_fail(gconf != NULL); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2937 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2938 gaim_conv_chat_add_user(GAIM_CONV_CHAT(gconf), peer->user, |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2939 NULL, GAIM_CBFLAGS_NONE, TRUE); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2940 } |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2941 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2942 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2943 static void mw_place_peerParted(struct mwPlace *place, |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2944 const struct mwIdBlock *peer) { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2945 struct mwServicePlace *srvc; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2946 struct mwSession *session; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2947 struct mwGaimPluginData *pd; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2948 GaimConnection *gc; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2949 GaimConversation *gconf; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2950 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2951 const char *n = mwPlace_getName(place); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2952 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2953 DEBUG_INFO("%s left place %s\n", NSTR(peer->user), NSTR(n)); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2954 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2955 srvc = mwPlace_getService(place); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2956 session = mwService_getSession(MW_SERVICE(srvc)); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2957 pd = mwSession_getClientData(session); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2958 gc = pd->gc; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2959 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2960 gconf = mwPlace_getClientData(place); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2961 g_return_if_fail(gconf != NULL); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2962 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2963 gaim_conv_chat_remove_user(GAIM_CONV_CHAT(gconf), peer->user, NULL); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2964 } |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2965 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2966 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2967 static void mw_place_peerSetAttribute(struct mwPlace *place, |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2968 const struct mwIdBlock *peer, |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2969 guint32 attr, struct mwOpaque *o) { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2970 ; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2971 } |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2972 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2973 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2974 static void mw_place_peerUnsetAttribute(struct mwPlace *place, |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2975 const struct mwIdBlock *peer, |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2976 guint32 attr) { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2977 ; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2978 } |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2979 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2980 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2981 static void mw_place_message(struct mwPlace *place, |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2982 const struct mwIdBlock *who, |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2983 const char *msg) { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2984 struct mwServicePlace *srvc; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2985 struct mwSession *session; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2986 struct mwGaimPluginData *pd; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2987 GaimConnection *gc; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2988 char *esc; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2989 |
12863
7a2169f04bdf
[gaim-migrate @ 15214]
Christopher O'Brien <siege@pidgin.im>
parents:
12830
diff
changeset
|
2990 if(! msg) return; |
7a2169f04bdf
[gaim-migrate @ 15214]
Christopher O'Brien <siege@pidgin.im>
parents:
12830
diff
changeset
|
2991 |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2992 srvc = mwPlace_getService(place); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2993 session = mwService_getSession(MW_SERVICE(srvc)); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2994 pd = mwSession_getClientData(session); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2995 gc = pd->gc; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2996 |
12864
2c0f8815aa2e
[gaim-migrate @ 15215]
Christopher O'Brien <siege@pidgin.im>
parents:
12863
diff
changeset
|
2997 esc = g_markup_escape_text(msg, -1); |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2998 serv_got_chat_in(gc, PLACE_TO_ID(place), who->user, 0, esc, time(NULL)); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2999 g_free(esc); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3000 } |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3001 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3002 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3003 static void mw_place_clear(struct mwServicePlace *srvc) { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3004 ; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3005 } |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3006 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3007 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3008 static struct mwPlaceHandler mw_place_handler = { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3009 .opened = mw_place_opened, |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3010 .closed = mw_place_closed, |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3011 .peerJoined = mw_place_peerJoined, |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3012 .peerParted = mw_place_peerParted, |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3013 .peerSetAttribute = mw_place_peerSetAttribute, |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3014 .peerUnsetAttribute = mw_place_peerUnsetAttribute, |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3015 .message = mw_place_message, |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3016 .clear = mw_place_clear, |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3017 }; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3018 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3019 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3020 static struct mwServicePlace *mw_srvc_place_new(struct mwSession *s) { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3021 struct mwServicePlace *srvc; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3022 srvc = mwServicePlace_new(s, &mw_place_handler); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3023 return srvc; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3024 } |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3025 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3026 |
10977 | 3027 static struct mwServiceResolve *mw_srvc_resolve_new(struct mwSession *s) { |
3028 struct mwServiceResolve *srvc; | |
3029 srvc = mwServiceResolve_new(s); | |
3030 return srvc; | |
3031 } | |
3032 | |
3033 | |
3034 static struct mwServiceStorage *mw_srvc_store_new(struct mwSession *s) { | |
3035 struct mwServiceStorage *srvc; | |
3036 srvc = mwServiceStorage_new(s); | |
3037 return srvc; | |
3038 } | |
3039 | |
3040 | |
3041 /** allocate and associate a mwGaimPluginData with a GaimConnection */ | |
3042 static struct mwGaimPluginData *mwGaimPluginData_new(GaimConnection *gc) { | |
3043 struct mwGaimPluginData *pd; | |
3044 | |
3045 g_return_val_if_fail(gc != NULL, NULL); | |
3046 | |
3047 pd = g_new0(struct mwGaimPluginData, 1); | |
3048 pd->gc = gc; | |
3049 pd->session = mwSession_new(&mw_session_handler); | |
3050 pd->srvc_aware = mw_srvc_aware_new(pd->session); | |
3051 pd->srvc_conf = mw_srvc_conf_new(pd->session); | |
3052 pd->srvc_ft = mw_srvc_ft_new(pd->session); | |
3053 pd->srvc_im = mw_srvc_im_new(pd->session); | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3054 pd->srvc_place = mw_srvc_place_new(pd->session); |
10977 | 3055 pd->srvc_resolve = mw_srvc_resolve_new(pd->session); |
3056 pd->srvc_store = mw_srvc_store_new(pd->session); | |
3057 pd->group_list_map = g_hash_table_new(g_direct_hash, g_direct_equal); | |
3058 | |
3059 mwSession_addService(pd->session, MW_SERVICE(pd->srvc_aware)); | |
3060 mwSession_addService(pd->session, MW_SERVICE(pd->srvc_conf)); | |
3061 mwSession_addService(pd->session, MW_SERVICE(pd->srvc_ft)); | |
3062 mwSession_addService(pd->session, MW_SERVICE(pd->srvc_im)); | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3063 mwSession_addService(pd->session, MW_SERVICE(pd->srvc_place)); |
10977 | 3064 mwSession_addService(pd->session, MW_SERVICE(pd->srvc_resolve)); |
3065 mwSession_addService(pd->session, MW_SERVICE(pd->srvc_store)); | |
3066 | |
3067 mwSession_addCipher(pd->session, mwCipher_new_RC2_40(pd->session)); | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3068 mwSession_addCipher(pd->session, mwCipher_new_RC2_128(pd->session)); |
10977 | 3069 |
3070 mwSession_setClientData(pd->session, pd, NULL); | |
3071 gc->proto_data = pd; | |
3072 | |
3073 return pd; | |
3074 } | |
3075 | |
3076 | |
3077 static void mwGaimPluginData_free(struct mwGaimPluginData *pd) { | |
3078 g_return_if_fail(pd != NULL); | |
3079 | |
3080 pd->gc->proto_data = NULL; | |
3081 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3082 mwSession_removeService(pd->session, mwService_AWARE); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3083 mwSession_removeService(pd->session, mwService_CONFERENCE); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3084 mwSession_removeService(pd->session, mwService_FILE_TRANSFER); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3085 mwSession_removeService(pd->session, mwService_IM); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3086 mwSession_removeService(pd->session, mwService_PLACE); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3087 mwSession_removeService(pd->session, mwService_RESOLVE); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3088 mwSession_removeService(pd->session, mwService_STORAGE); |
10977 | 3089 |
3090 mwService_free(MW_SERVICE(pd->srvc_aware)); | |
3091 mwService_free(MW_SERVICE(pd->srvc_conf)); | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3092 mwService_free(MW_SERVICE(pd->srvc_ft)); |
10977 | 3093 mwService_free(MW_SERVICE(pd->srvc_im)); |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3094 mwService_free(MW_SERVICE(pd->srvc_place)); |
10977 | 3095 mwService_free(MW_SERVICE(pd->srvc_resolve)); |
3096 mwService_free(MW_SERVICE(pd->srvc_store)); | |
3097 | |
3098 mwCipher_free(mwSession_getCipher(pd->session, mwCipher_RC2_40)); | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3099 mwCipher_free(mwSession_getCipher(pd->session, mwCipher_RC2_128)); |
10977 | 3100 |
3101 mwSession_free(pd->session); | |
3102 | |
3103 g_hash_table_destroy(pd->group_list_map); | |
3104 | |
3105 g_free(pd); | |
3106 } | |
3107 | |
3108 | |
3109 static const char *mw_prpl_list_icon(GaimAccount *a, GaimBuddy *b) { | |
3110 /* my little green dude is a chopped up version of the aim running | |
3111 guy. First, cut off the head and store someplace safe. Then, | |
3112 take the left-half side of the body and throw it away. Make a | |
3113 copy of the remaining body, and flip it horizontally. Now attach | |
3114 the two pieces into an X shape, and drop the head back on the | |
3115 top, being careful to center it. Then, just change the color | |
3116 saturation to bring the red down a bit, and voila! */ | |
3117 | |
3118 /* then, throw all of that away and use sodipodi to make a new | |
3119 icon. You know, LIKE A REAL MAN. */ | |
3120 | |
3121 return "meanwhile"; | |
3122 } | |
3123 | |
3124 | |
3125 static void mw_prpl_list_emblems(GaimBuddy *b, | |
3126 const char **se, const char **sw, | |
3127 const char **nw, const char **ne) { | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3128 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3129 /* speaking of custom icons, the external icon here is an ugly |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3130 little example of what happens when I use Gimp */ |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3131 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3132 GaimPresence *presence; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3133 GaimStatus *status; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3134 const char *status_id; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3135 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3136 presence = gaim_buddy_get_presence(b); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3137 status = gaim_presence_get_active_status(presence); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3138 status_id = gaim_status_get_id(status); |
10977 | 3139 |
3140 if(! GAIM_BUDDY_IS_ONLINE(b)) { | |
3141 *se = "offline"; | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3142 } else if(!strcmp(status_id, MW_STATE_AWAY)) { |
10977 | 3143 *se = "away"; |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3144 } else if(!strcmp(status_id, MW_STATE_BUSY)) { |
10977 | 3145 *se = "dnd"; |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3146 } |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3147 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3148 if(buddy_is_external(b)) { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3149 /* best assignment ever */ |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3150 *(*se?sw:se) = "external"; |
10977 | 3151 } |
3152 } | |
3153 | |
3154 | |
3155 static char *mw_prpl_status_text(GaimBuddy *b) { | |
3156 GaimConnection *gc; | |
3157 struct mwGaimPluginData *pd; | |
3158 struct mwAwareIdBlock t = { mwAware_USER, b->name, NULL }; | |
3159 const char *ret; | |
3160 | |
3161 gc = b->account->gc; | |
3162 pd = gc->proto_data; | |
3163 | |
3164 ret = mwServiceAware_getText(pd->srvc_aware, &t); | |
12496
f9d0ab1474ac
[gaim-migrate @ 14808]
Christopher O'Brien <siege@pidgin.im>
parents:
12489
diff
changeset
|
3165 return ret? g_markup_escape_text(ret, -1): NULL; |
10977 | 3166 } |
3167 | |
3168 | |
3169 static const char *status_text(GaimBuddy *b) { | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3170 GaimPresence *presence; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3171 GaimStatus *status; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3172 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3173 presence = gaim_buddy_get_presence(b); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3174 status = gaim_presence_get_active_status(presence); |
11536 | 3175 |
3176 return gaim_status_get_name(status); | |
10977 | 3177 } |
3178 | |
3179 | |
3180 static gboolean user_supports(struct mwServiceAware *srvc, | |
3181 const char *who, guint32 feature) { | |
3182 | |
3183 const struct mwAwareAttribute *attr; | |
3184 struct mwAwareIdBlock idb = { mwAware_USER, (char *) who, NULL }; | |
3185 | |
3186 attr = mwServiceAware_getAttribute(srvc, &idb, feature); | |
3187 return (attr != NULL) && mwAwareAttribute_asBoolean(attr); | |
3188 } | |
3189 | |
3190 | |
12422
fe42d9c111f9
[gaim-migrate @ 14729]
Richard Laager <rlaager@wiktel.com>
parents:
12312
diff
changeset
|
3191 static char *user_supports_text(struct mwServiceAware *srvc, const char *who) { |
12524
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3192 char *feat[] = {NULL, NULL, NULL, NULL, NULL}; |
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3193 char **f = feat; |
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3194 |
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3195 if(user_supports(srvc, who, mwAttribute_AV_PREFS_SET)) { |
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3196 gboolean mic, speak, video; |
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3197 |
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3198 mic = user_supports(srvc, who, mwAttribute_MICROPHONE); |
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3199 speak = user_supports(srvc, who, mwAttribute_SPEAKERS); |
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3200 video = user_supports(srvc, who, mwAttribute_VIDEO_CAMERA); |
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3201 |
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3202 if(mic) *f++ = _("Microphone"); |
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3203 if(speak) *f++ = _("Speakers"); |
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3204 if(video) *f++ = _("Video Camera"); |
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3205 } |
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3206 |
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3207 if(user_supports(srvc, who, mwAttribute_FILE_TRANSFER)) |
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3208 *f++ = _("File Transfer"); |
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3209 |
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3210 return (*feat)? g_strjoinv(", ", feat): NULL; |
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3211 /* jenni loves siege */ |
10977 | 3212 } |
3213 | |
3214 | |
3215 static char *mw_prpl_tooltip_text(GaimBuddy *b) { | |
3216 GaimConnection *gc; | |
3217 struct mwGaimPluginData *pd; | |
3218 struct mwAwareIdBlock idb = { mwAware_USER, b->name, NULL }; | |
3219 | |
3220 GString *str; | |
3221 const char *tmp; | |
3222 | |
3223 gc = b->account->gc; | |
3224 pd = gc->proto_data; | |
3225 | |
3226 str = g_string_new(NULL); | |
3227 | |
3228 tmp = status_text(b); | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3229 g_string_append_printf(str, _("\n<b>Status</b>: %s"), tmp); |
10977 | 3230 |
3231 tmp = mwServiceAware_getText(pd->srvc_aware, &idb); | |
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
3232 if(tmp) { |
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
3233 tmp = g_markup_escape_text(tmp, -1); |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3234 g_string_append_printf(str, _("\n<b>Message</b>: %s"), tmp); |
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
3235 g_free((char *) tmp); |
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
3236 } |
10977 | 3237 |
3238 tmp = user_supports_text(pd->srvc_aware, b->name); | |
3239 if(tmp) { | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3240 g_string_append_printf(str, _("\n<b>Supports</b>: %s"), tmp); |
10977 | 3241 g_free((char *) tmp); |
3242 } | |
3243 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3244 if(buddy_is_external(b)) { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3245 g_string_append(str, _("\n<b>External User</b>")); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3246 } |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3247 |
10977 | 3248 tmp = str->str; |
3249 g_string_free(str, FALSE); | |
3250 return (char *) tmp; | |
3251 } | |
3252 | |
3253 | |
3254 static GList *mw_prpl_status_types(GaimAccount *acct) { | |
3255 GList *types = NULL; | |
3256 GaimStatusType *type; | |
3257 | |
3258 type = gaim_status_type_new(GAIM_STATUS_AVAILABLE, MW_STATE_ACTIVE, | |
12830
3b4a6e426b99
[gaim-migrate @ 15178]
Christopher O'Brien <siege@pidgin.im>
parents:
12829
diff
changeset
|
3259 _("Available"), TRUE); |
10977 | 3260 gaim_status_type_add_attr(type, MW_STATE_MESSAGE, _("Message"), |
3261 gaim_value_new(GAIM_TYPE_STRING)); | |
3262 types = g_list_append(types, type); | |
3263 | |
3264 type = gaim_status_type_new(GAIM_STATUS_AWAY, MW_STATE_AWAY, | |
12595
3169cd6727ad
[gaim-migrate @ 14925]
Richard Laager <rlaager@wiktel.com>
parents:
12524
diff
changeset
|
3265 NULL, TRUE); |
10977 | 3266 gaim_status_type_add_attr(type, MW_STATE_MESSAGE, _("Message"), |
3267 gaim_value_new(GAIM_TYPE_STRING)); | |
3268 types = g_list_append(types, type); | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3269 |
10977 | 3270 type = gaim_status_type_new(GAIM_STATUS_UNAVAILABLE, MW_STATE_BUSY, |
3271 _("Do Not Disturb"), TRUE); | |
3272 gaim_status_type_add_attr(type, MW_STATE_MESSAGE, _("Message"), | |
3273 gaim_value_new(GAIM_TYPE_STRING)); | |
3274 types = g_list_append(types, type); | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3275 |
12658 | 3276 type = gaim_status_type_new(GAIM_STATUS_OFFLINE, MW_STATE_OFFLINE, |
3277 NULL, TRUE); | |
3278 types = g_list_append(types, type); | |
3279 | |
10977 | 3280 return types; |
3281 } | |
3282 | |
3283 | |
3284 static void conf_create_prompt_cancel(GaimBuddy *buddy, | |
3285 GaimRequestFields *fields) { | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3286 ; /* nothing to do */ |
10977 | 3287 } |
3288 | |
3289 | |
3290 static void conf_create_prompt_join(GaimBuddy *buddy, | |
3291 GaimRequestFields *fields) { | |
3292 GaimAccount *acct; | |
3293 GaimConnection *gc; | |
3294 struct mwGaimPluginData *pd; | |
3295 struct mwServiceConference *srvc; | |
3296 | |
3297 GaimRequestField *f; | |
3298 | |
3299 const char *topic, *invite; | |
3300 struct mwConference *conf; | |
3301 struct mwIdBlock idb = { NULL, NULL }; | |
3302 | |
3303 acct = buddy->account; | |
3304 gc = gaim_account_get_connection(acct); | |
3305 pd = gc->proto_data; | |
3306 srvc = pd->srvc_conf; | |
3307 | |
3308 f = gaim_request_fields_get_field(fields, CHAT_KEY_TOPIC); | |
3309 topic = gaim_request_field_string_get_value(f); | |
3310 | |
3311 f = gaim_request_fields_get_field(fields, CHAT_KEY_INVITE); | |
3312 invite = gaim_request_field_string_get_value(f); | |
3313 | |
3314 conf = mwConference_new(srvc, topic); | |
3315 mwConference_open(conf); | |
3316 | |
3317 idb.user = buddy->name; | |
3318 mwConference_invite(conf, &idb, invite); | |
3319 } | |
3320 | |
3321 | |
3322 static void blist_menu_conf_create(GaimBuddy *buddy, const char *msg) { | |
3323 | |
3324 GaimRequestFields *fields; | |
3325 GaimRequestFieldGroup *g; | |
3326 GaimRequestField *f; | |
3327 | |
3328 GaimAccount *acct; | |
3329 GaimConnection *gc; | |
3330 | |
3331 char *msgA, *msgB; | |
3332 | |
3333 g_return_if_fail(buddy != NULL); | |
3334 | |
3335 acct = buddy->account; | |
3336 g_return_if_fail(acct != NULL); | |
3337 | |
3338 gc = gaim_account_get_connection(acct); | |
3339 g_return_if_fail(gc != NULL); | |
3340 | |
3341 fields = gaim_request_fields_new(); | |
3342 | |
3343 g = gaim_request_field_group_new(NULL); | |
3344 gaim_request_fields_add_group(fields, g); | |
3345 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3346 f = gaim_request_field_string_new(CHAT_KEY_TOPIC, _("Topic"), NULL, FALSE); |
10977 | 3347 gaim_request_field_group_add_field(g, f); |
3348 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3349 f = gaim_request_field_string_new(CHAT_KEY_INVITE, _("Message"), msg, FALSE); |
10977 | 3350 gaim_request_field_group_add_field(g, f); |
3351 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3352 msgA = _("Create conference with user"); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3353 msgB = _("Please enter a topic for the new conference, and an invitation" |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3354 " message to be sent to %s"); |
10977 | 3355 msgB = g_strdup_printf(msgB, buddy->name); |
3356 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3357 gaim_request_fields(gc, _("New Conference"), |
10977 | 3358 msgA, msgB, fields, |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3359 _("Create"), G_CALLBACK(conf_create_prompt_join), |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3360 _("Cancel"), G_CALLBACK(conf_create_prompt_cancel), |
10977 | 3361 buddy); |
3362 g_free(msgB); | |
3363 } | |
3364 | |
3365 | |
3366 static void conf_select_prompt_cancel(GaimBuddy *buddy, | |
3367 GaimRequestFields *fields) { | |
3368 ; | |
3369 } | |
3370 | |
3371 | |
3372 static void conf_select_prompt_invite(GaimBuddy *buddy, | |
3373 GaimRequestFields *fields) { | |
3374 GaimRequestField *f; | |
3375 const GList *l; | |
3376 const char *msg; | |
3377 | |
3378 f = gaim_request_fields_get_field(fields, CHAT_KEY_INVITE); | |
3379 msg = gaim_request_field_string_get_value(f); | |
3380 | |
3381 f = gaim_request_fields_get_field(fields, "conf"); | |
3382 l = gaim_request_field_list_get_selected(f); | |
3383 | |
3384 if(l) { | |
3385 gpointer d = gaim_request_field_list_get_data(f, l->data); | |
3386 | |
3387 if(GPOINTER_TO_INT(d) == 0x01) { | |
3388 blist_menu_conf_create(buddy, msg); | |
3389 | |
3390 } else { | |
3391 struct mwIdBlock idb = { buddy->name, NULL }; | |
3392 mwConference_invite(d, &idb, msg); | |
3393 } | |
3394 } | |
3395 } | |
3396 | |
3397 | |
3398 static void blist_menu_conf_list(GaimBuddy *buddy, | |
3399 GList *confs) { | |
3400 | |
3401 GaimRequestFields *fields; | |
3402 GaimRequestFieldGroup *g; | |
3403 GaimRequestField *f; | |
3404 | |
3405 GaimAccount *acct; | |
3406 GaimConnection *gc; | |
3407 | |
3408 char *msgA, *msgB; | |
3409 | |
3410 acct = buddy->account; | |
3411 g_return_if_fail(acct != NULL); | |
3412 | |
3413 gc = gaim_account_get_connection(acct); | |
3414 g_return_if_fail(gc != NULL); | |
3415 | |
3416 fields = gaim_request_fields_new(); | |
3417 | |
3418 g = gaim_request_field_group_new(NULL); | |
3419 gaim_request_fields_add_group(fields, g); | |
3420 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3421 f = gaim_request_field_list_new("conf", _("Available Conferences")); |
10977 | 3422 gaim_request_field_list_set_multi_select(f, FALSE); |
3423 for(; confs; confs = confs->next) { | |
3424 struct mwConference *c = confs->data; | |
3425 gaim_request_field_list_add(f, mwConference_getTitle(c), c); | |
3426 } | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3427 gaim_request_field_list_add(f, _("Create New Conference..."), |
10977 | 3428 GINT_TO_POINTER(0x01)); |
3429 gaim_request_field_group_add_field(g, f); | |
3430 | |
3431 f = gaim_request_field_string_new(CHAT_KEY_INVITE, "Message", NULL, FALSE); | |
3432 gaim_request_field_group_add_field(g, f); | |
3433 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3434 msgA = _("Invite user to a conference"); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3435 msgB = _("Select a conference from the list below to send an invite to" |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3436 " user %s. Select \"Create New Conference\" if you'd like to" |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3437 " create a new conference to invite this user to."); |
10977 | 3438 msgB = g_strdup_printf(msgB, buddy->name); |
3439 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3440 gaim_request_fields(gc, _("Invite to Conference"), |
10977 | 3441 msgA, msgB, fields, |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3442 _("Invite"), G_CALLBACK(conf_select_prompt_invite), |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3443 _("Cancel"), G_CALLBACK(conf_select_prompt_cancel), |
10977 | 3444 buddy); |
3445 g_free(msgB); | |
3446 } | |
3447 | |
3448 | |
3449 static void blist_menu_conf(GaimBlistNode *node, gpointer data) { | |
3450 GaimBuddy *buddy = (GaimBuddy *) node; | |
3451 GaimAccount *acct; | |
3452 GaimConnection *gc; | |
3453 struct mwGaimPluginData *pd; | |
3454 GList *l; | |
3455 | |
3456 g_return_if_fail(node != NULL); | |
3457 g_return_if_fail(GAIM_BLIST_NODE_IS_BUDDY(node)); | |
3458 | |
3459 acct = buddy->account; | |
3460 g_return_if_fail(acct != NULL); | |
3461 | |
3462 gc = gaim_account_get_connection(acct); | |
3463 g_return_if_fail(gc != NULL); | |
3464 | |
3465 pd = gc->proto_data; | |
3466 g_return_if_fail(pd != NULL); | |
3467 | |
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
3468 /* |
10977 | 3469 - get a list of all conferences on this session |
3470 - if none, prompt to create one, and invite buddy to it | |
3471 - else, prompt to select a conference or create one | |
3472 */ | |
3473 | |
3474 l = mwServiceConference_getConferences(pd->srvc_conf); | |
3475 if(l) { | |
3476 blist_menu_conf_list(buddy, l); | |
3477 g_list_free(l); | |
3478 | |
3479 } else { | |
3480 blist_menu_conf_create(buddy, NULL); | |
3481 } | |
3482 } | |
3483 | |
3484 | |
3485 static GList *mw_prpl_blist_node_menu(GaimBlistNode *node) { | |
3486 GList *l = NULL; | |
12919
248b8b39c671
[gaim-migrate @ 15272]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12864
diff
changeset
|
3487 GaimMenuAction *act; |
10977 | 3488 |
3489 if(! GAIM_BLIST_NODE_IS_BUDDY(node)) | |
3490 return l; | |
3491 | |
3492 l = g_list_append(l, NULL); | |
3493 | |
12919
248b8b39c671
[gaim-migrate @ 15272]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12864
diff
changeset
|
3494 act = gaim_menu_action_new(_("Invite to Conference..."), |
248b8b39c671
[gaim-migrate @ 15272]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12864
diff
changeset
|
3495 blist_menu_conf, NULL, NULL); |
10977 | 3496 l = g_list_append(l, act); |
3497 | |
3498 /** note: this never gets called for a GaimGroup, have to use the | |
3499 blist-node-extended-menu signal for that. The function | |
3500 blist_node_menu_cb is assigned to this signal in the function | |
3501 services_starting */ | |
3502 | |
3503 return l; | |
3504 } | |
3505 | |
3506 | |
3507 static GList *mw_prpl_chat_info(GaimConnection *gc) { | |
3508 GList *l = NULL; | |
3509 struct proto_chat_entry *pce; | |
3510 | |
3511 pce = g_new0(struct proto_chat_entry, 1); | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3512 pce->label = _("Topic:"); |
10977 | 3513 pce->identifier = CHAT_KEY_TOPIC; |
3514 l = g_list_append(l, pce); | |
3515 | |
3516 return l; | |
3517 } | |
3518 | |
3519 | |
3520 static GHashTable *mw_prpl_chat_info_defaults(GaimConnection *gc, | |
3521 const char *name) { | |
3522 GHashTable *table; | |
3523 | |
3524 g_return_val_if_fail(gc != NULL, NULL); | |
3525 | |
3526 table = g_hash_table_new_full(g_str_hash, g_str_equal, | |
3527 NULL, g_free); | |
3528 | |
3529 g_hash_table_insert(table, CHAT_KEY_NAME, g_strdup(name)); | |
3530 g_hash_table_insert(table, CHAT_KEY_INVITE, NULL); | |
3531 | |
3532 return table; | |
3533 } | |
3534 | |
3535 | |
11837 | 3536 static void mw_prpl_login(GaimAccount *acct); |
10977 | 3537 |
3538 | |
3539 static void prompt_host_cancel_cb(GaimConnection *gc) { | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3540 gaim_connection_error(gc, _("No Sametime Community Server specified")); |
10977 | 3541 } |
3542 | |
3543 | |
3544 static void prompt_host_ok_cb(GaimConnection *gc, const char *host) { | |
3545 if(host && *host) { | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3546 GaimAccount *acct = gaim_connection_get_account(gc); |
10977 | 3547 gaim_account_set_string(acct, MW_KEY_HOST, host); |
11837 | 3548 mw_prpl_login(acct); |
10977 | 3549 |
3550 } else { | |
3551 prompt_host_cancel_cb(gc); | |
3552 } | |
3553 } | |
3554 | |
3555 | |
3556 static void prompt_host(GaimConnection *gc) { | |
3557 GaimAccount *acct; | |
3558 char *msg; | |
3559 | |
3560 acct = gaim_connection_get_account(gc); | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3561 msg = _("No host or IP address has been configured for the" |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3562 " Meanwhile account %s. Please enter one below to" |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3563 " continue logging in."); |
10977 | 3564 msg = g_strdup_printf(msg, NSTR(gaim_account_get_username(acct))); |
3565 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3566 gaim_request_input(gc, _("Meanwhile Connection Setup"), |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3567 _("No Sametime Community Server Specified"), msg, |
10977 | 3568 MW_PLUGIN_DEFAULT_HOST, FALSE, FALSE, NULL, |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3569 _("Connect"), G_CALLBACK(prompt_host_ok_cb), |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3570 _("Cancel"), G_CALLBACK(prompt_host_cancel_cb), |
10977 | 3571 gc); |
3572 | |
3573 g_free(msg); | |
3574 } | |
3575 | |
3576 | |
11837 | 3577 static void mw_prpl_login(GaimAccount *account) { |
10977 | 3578 GaimConnection *gc; |
3579 struct mwGaimPluginData *pd; | |
3580 | |
3581 char *user, *pass, *host; | |
12311
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
3582 guint port, client; |
10977 | 3583 |
3584 gc = gaim_account_get_connection(account); | |
3585 pd = mwGaimPluginData_new(gc); | |
3586 | |
3587 /* while we do support images, the default is to not offer it */ | |
3588 gc->flags |= GAIM_CONNECTION_NO_IMAGES; | |
3589 | |
3590 user = g_strdup(gaim_account_get_username(account)); | |
12524
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3591 pass = g_strdup(gaim_account_get_password(account)); |
10977 | 3592 |
3593 host = strrchr(user, ':'); | |
3594 if(host) { | |
3595 /* annoying user split from 1.2.0, need to undo it */ | |
3596 *host++ = '\0'; | |
3597 gaim_account_set_string(account, MW_KEY_HOST, host); | |
3598 gaim_account_set_username(account, user); | |
3599 | |
3600 } else { | |
3601 host = (char *) gaim_account_get_string(account, MW_KEY_HOST, | |
3602 MW_PLUGIN_DEFAULT_HOST); | |
3603 } | |
3604 | |
3605 if(! host || ! *host) { | |
3606 /* somehow, we don't have a host to connect to. Well, we need one | |
3607 to actually continue, so let's ask the user directly. */ | |
3608 prompt_host(gc); | |
3609 return; | |
3610 } | |
3611 | |
3612 port = gaim_account_get_int(account, MW_KEY_PORT, MW_PLUGIN_DEFAULT_PORT); | |
3613 | |
3614 DEBUG_INFO("user: '%s'\n", user); | |
3615 DEBUG_INFO("host: '%s'\n", host); | |
3616 DEBUG_INFO("port: %u\n", port); | |
3617 | |
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
3618 mwSession_setProperty(pd->session, mwSession_NO_SECRET, |
10977 | 3619 (char *) no_secret, NULL); |
3620 mwSession_setProperty(pd->session, mwSession_AUTH_USER_ID, user, g_free); | |
12524
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3621 mwSession_setProperty(pd->session, mwSession_AUTH_PASSWORD, pass, g_free); |
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3622 |
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3623 client = mwLogin_MEANWHILE; |
12311
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
3624 if(gaim_account_get_bool(account, MW_KEY_FAKE_IT, FALSE)) |
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
3625 client = mwLogin_BINARY; |
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
3626 |
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
3627 DEBUG_INFO("client id: 0x%04x\n", client); |
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
3628 |
10977 | 3629 mwSession_setProperty(pd->session, mwSession_CLIENT_TYPE_ID, |
12311
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
3630 GUINT_TO_POINTER(client), NULL); |
10977 | 3631 |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3632 gaim_connection_update_progress(gc, _("Connecting"), 1, MW_CONNECT_STEPS); |
10977 | 3633 |
3634 if(gaim_proxy_connect(account, host, port, connect_cb, pd)) { | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3635 gaim_connection_error(gc, _("Unable to connect to host")); |
10977 | 3636 } |
3637 } | |
3638 | |
3639 | |
3640 static void mw_prpl_close(GaimConnection *gc) { | |
3641 struct mwGaimPluginData *pd; | |
3642 | |
3643 g_return_if_fail(gc != NULL); | |
3644 | |
3645 pd = gc->proto_data; | |
3646 g_return_if_fail(pd != NULL); | |
3647 | |
3648 /* get rid of the blist save timeout */ | |
3649 if(pd->save_event) { | |
3650 gaim_timeout_remove(pd->save_event); | |
3651 pd->save_event = 0; | |
3652 blist_store(pd); | |
3653 } | |
3654 | |
3655 /* stop the session */ | |
3656 mwSession_stop(pd->session, 0x00); | |
3657 | |
3658 /* no longer necessary */ | |
3659 gc->proto_data = NULL; | |
3660 | |
3661 /* stop watching the socket */ | |
3662 if(gc->inpa) { | |
3663 gaim_input_remove(gc->inpa); | |
3664 gc->inpa = 0; | |
3665 } | |
3666 | |
3667 /* clean up the rest */ | |
3668 mwGaimPluginData_free(pd); | |
3669 } | |
3670 | |
3671 | |
12735
da9fd490cef9
[gaim-migrate @ 15080]
Christopher O'Brien <siege@pidgin.im>
parents:
12658
diff
changeset
|
3672 static int mw_rand() { |
da9fd490cef9
[gaim-migrate @ 15080]
Christopher O'Brien <siege@pidgin.im>
parents:
12658
diff
changeset
|
3673 static int seed = 0; |
da9fd490cef9
[gaim-migrate @ 15080]
Christopher O'Brien <siege@pidgin.im>
parents:
12658
diff
changeset
|
3674 |
da9fd490cef9
[gaim-migrate @ 15080]
Christopher O'Brien <siege@pidgin.im>
parents:
12658
diff
changeset
|
3675 /* for diversity, not security. don't touch */ |
da9fd490cef9
[gaim-migrate @ 15080]
Christopher O'Brien <siege@pidgin.im>
parents:
12658
diff
changeset
|
3676 srand(time(NULL) ^ seed); |
da9fd490cef9
[gaim-migrate @ 15080]
Christopher O'Brien <siege@pidgin.im>
parents:
12658
diff
changeset
|
3677 seed = rand(); |
da9fd490cef9
[gaim-migrate @ 15080]
Christopher O'Brien <siege@pidgin.im>
parents:
12658
diff
changeset
|
3678 |
da9fd490cef9
[gaim-migrate @ 15080]
Christopher O'Brien <siege@pidgin.im>
parents:
12658
diff
changeset
|
3679 return seed; |
da9fd490cef9
[gaim-migrate @ 15080]
Christopher O'Brien <siege@pidgin.im>
parents:
12658
diff
changeset
|
3680 } |
da9fd490cef9
[gaim-migrate @ 15080]
Christopher O'Brien <siege@pidgin.im>
parents:
12658
diff
changeset
|
3681 |
da9fd490cef9
[gaim-migrate @ 15080]
Christopher O'Brien <siege@pidgin.im>
parents:
12658
diff
changeset
|
3682 |
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
3683 /** generates a random-ish content id string */ |
10977 | 3684 static char *im_mime_content_id() { |
12524
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3685 return g_strdup_printf("%03x@%05xmeanwhile", |
12735
da9fd490cef9
[gaim-migrate @ 15080]
Christopher O'Brien <siege@pidgin.im>
parents:
12658
diff
changeset
|
3686 mw_rand() & 0xfff, mw_rand() & 0xfffff); |
10977 | 3687 } |
3688 | |
3689 | |
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
3690 /** generates a multipart/related content type with a random-ish |
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
3691 boundary value */ |
10977 | 3692 static char *im_mime_content_type() { |
12422
fe42d9c111f9
[gaim-migrate @ 14729]
Richard Laager <rlaager@wiktel.com>
parents:
12312
diff
changeset
|
3693 return g_strdup_printf("multipart/related; boundary=related_MW%03x_%04x", |
12735
da9fd490cef9
[gaim-migrate @ 15080]
Christopher O'Brien <siege@pidgin.im>
parents:
12658
diff
changeset
|
3694 mw_rand() & 0xfff, mw_rand() & 0xffff); |
10977 | 3695 } |
3696 | |
3697 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3698 /** determine content type from extension. Not so happy about this, |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3699 but I don't want to actually write image type detection */ |
12105
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3700 static char *im_mime_img_content_type(GaimStoredImage *img) { |
10977 | 3701 const char *fn = gaim_imgstore_get_filename(img); |
12105
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3702 const char *ct = NULL; |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3703 |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3704 ct = strrchr(fn, '.'); |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3705 if(! ct) { |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3706 ct = "image"; |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3707 |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3708 } else if(! strcmp(".png", ct)) { |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3709 ct = "image/png"; |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3710 |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3711 } else if(! strcmp(".jpg", ct)) { |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3712 ct = "image/jpeg"; |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3713 |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3714 } else if(! strcmp(".jpeg", ct)) { |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3715 ct = "image/jpeg"; |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3716 |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3717 } else if(! strcmp(".gif", ct)) { |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3718 ct = "image/gif"; |
10977 | 3719 |
3720 } else { | |
12105
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3721 ct = "image"; |
10977 | 3722 } |
12105
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3723 |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3724 return g_strdup_printf("%s; name=\"%s\"", ct, fn); |
10977 | 3725 } |
3726 | |
3727 | |
3728 static char *im_mime_img_content_disp(GaimStoredImage *img) { | |
3729 const char *fn = gaim_imgstore_get_filename(img); | |
3730 return g_strdup_printf("attachment; filename=\"%s\"", fn); | |
3731 } | |
3732 | |
3733 | |
12813
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
3734 #if NB_HACK |
12105
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3735 static char *nb_im_encode(GaimConnection *gc, const char *message) { |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3736 GaimAccount *acct; |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3737 const char *enc; |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3738 char *ret; |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3739 GError *error = NULL; |
12813
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
3740 |
12105
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3741 acct = gaim_connection_get_account(gc); |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3742 g_return_val_if_fail(acct != NULL, NULL); |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3743 |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3744 enc = gaim_account_get_string(acct, MW_KEY_ENCODING, |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3745 MW_PLUGIN_DEFAULT_ENCODING); |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3746 g_return_val_if_fail(enc != NULL, NULL); |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3747 |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3748 ret = g_convert_with_fallback(message, strlen(message), |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3749 enc, "UTF-8", "?", |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3750 NULL, NULL, &error); |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3751 |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3752 if(error) { |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3753 DEBUG_INFO("problem converting to %s: %s\n", |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3754 enc, NSTR(error->message)); |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3755 g_error_free(error); |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3756 } |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3757 |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3758 /* something went so wrong that not even the fallback worked */ |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3759 if(! ret) ret = g_strdup(message); |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3760 |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3761 return ret; |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3762 } |
12813
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
3763 #endif |
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
3764 |
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
3765 |
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
3766 #if NB_HACK |
12105
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3767 static gboolean is_nb(struct mwConversation *conv) { |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3768 struct mwLoginInfo *info; |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3769 |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3770 info = mwConversation_getTargetInfo(conv); |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3771 if(! info) return FALSE; |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3772 |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3773 /* NotesBuddy can be at least three different type IDs (all in the |
12524
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3774 0x1400 range), or it can show up as 0x1000. However, if we're |
12105
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3775 calling this check, then we're already in HTML or MIME mode, so |
12524
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3776 we can discount the real 0x1000 */ |
12105
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3777 /* I tried to avoid having any client-type-dependant code in here, I |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3778 really did. Oh well. CURSE YOU NOTESBUDDY */ |
12524
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3779 return ((info->type == 0x1000) || ((info->type & 0xff00) == 0x1400)); |
12105
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3780 } |
12813
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
3781 #endif |
12105
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3782 |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3783 |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3784 /** turn an IM with embedded images into a multi-part mime document */ |
12105
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3785 static char *im_mime_convert(GaimConnection *gc, |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3786 struct mwConversation *conv, |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3787 const char *message) { |
10977 | 3788 GString *str; |
3789 GaimMimeDocument *doc; | |
3790 GaimMimePart *part; | |
3791 | |
3792 GData *attr; | |
3793 char *tmp, *start, *end; | |
3794 | |
3795 str = g_string_new(NULL); | |
3796 | |
3797 doc = gaim_mime_document_new(); | |
3798 | |
3799 gaim_mime_document_set_field(doc, "Mime-Version", "1.0"); | |
3800 gaim_mime_document_set_field(doc, "Content-Disposition", "inline"); | |
3801 | |
3802 tmp = im_mime_content_type(); | |
3803 gaim_mime_document_set_field(doc, "Content-Type", tmp); | |
3804 g_free(tmp); | |
3805 | |
3806 tmp = (char *) message; | |
3807 while(*tmp && gaim_markup_find_tag("img", tmp, (const char **) &start, | |
3808 (const char **) &end, &attr)) { | |
3809 char *id; | |
3810 GaimStoredImage *img = NULL; | |
3811 | |
3812 gsize len = (start - tmp); | |
3813 | |
3814 /* append the in-between-tags text */ | |
3815 if(len) g_string_append_len(str, tmp, len); | |
3816 | |
3817 /* find the imgstore data by the id tag */ | |
3818 id = g_datalist_get_data(&attr, "id"); | |
3819 if(id && *id) | |
3820 img = gaim_imgstore_get(atoi(id)); | |
3821 | |
3822 if(img) { | |
3823 char *cid; | |
3824 gpointer data; | |
3825 size_t size; | |
3826 | |
3827 part = gaim_mime_part_new(doc); | |
3828 | |
3829 data = im_mime_img_content_disp(img); | |
3830 gaim_mime_part_set_field(part, "Content-Disposition", data); | |
3831 g_free(data); | |
3832 | |
12105
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3833 data = im_mime_img_content_type(img); |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3834 gaim_mime_part_set_field(part, "Content-Type", data); |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3835 g_free(data); |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3836 |
10977 | 3837 cid = im_mime_content_id(); |
3838 data = g_strdup_printf("<%s>", cid); | |
3839 gaim_mime_part_set_field(part, "Content-ID", data); | |
3840 g_free(data); | |
3841 | |
3842 gaim_mime_part_set_field(part, "Content-transfer-encoding", "base64"); | |
3843 | |
3844 /* obtain and base64 encode the image data, and put it in the | |
3845 mime part */ | |
3846 data = gaim_imgstore_get_data(img); | |
3847 size = gaim_imgstore_get_size(img); | |
3848 data = gaim_base64_encode(data, (gsize) size); | |
3849 gaim_mime_part_set_data(part, data); | |
3850 g_free(data); | |
3851 | |
3852 /* append the modified tag */ | |
3853 g_string_append_printf(str, "<img src=\"cid:%s\">", cid); | |
3854 g_free(cid); | |
3855 | |
3856 } else { | |
3857 /* append the literal image tag, since we couldn't find a | |
3858 relative imgstore object */ | |
3859 gsize len = (end - start) + 1; | |
3860 g_string_append_len(str, start, len); | |
3861 } | |
3862 | |
3863 g_datalist_clear(&attr); | |
3864 tmp = end + 1; | |
3865 } | |
3866 | |
3867 /* append left-overs */ | |
3868 g_string_append(str, tmp); | |
3869 | |
12105
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3870 /* add the text/html part */ |
10977 | 3871 part = gaim_mime_part_new(doc); |
3872 gaim_mime_part_set_field(part, "Content-Disposition", "inline"); | |
12105
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3873 |
12813
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
3874 #if NB_HACK |
12105
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3875 if(is_nb(conv)) { |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3876 GaimAccount *acct = gaim_connection_get_account(gc); |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3877 |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3878 tmp = (char *) gaim_account_get_string(acct, MW_KEY_ENCODING, |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3879 MW_PLUGIN_DEFAULT_ENCODING); |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3880 tmp = g_strdup_printf("text/html; charset=\"%s\"", tmp); |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3881 gaim_mime_part_set_field(part, "Content-Type", tmp); |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3882 g_free(tmp); |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3883 |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3884 gaim_mime_part_set_field(part, "Content-Transfer-Encoding", "7bit"); |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3885 |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3886 tmp = nb_im_encode(gc, str->str); |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3887 gaim_mime_part_set_data(part, tmp); |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3888 g_free(tmp); |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3889 |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3890 } else { |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3891 gaim_mime_part_set_field(part, "Content-Type", "text/html"); |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3892 gaim_mime_part_set_field(part, "Content-Transfer-Encoding", "8bit"); |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3893 gaim_mime_part_set_data(part, str->str); |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3894 } |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3895 |
12813
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
3896 #else |
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
3897 tmp = gaim_utf8_ncr_encode(str->str); |
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
3898 gaim_mime_part_set_field(part, "Content-Type", "text/html"); |
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
3899 gaim_mime_part_set_field(part, "Content-Transfer-Encoding", "7bit"); |
12821
aacda65b3449
[gaim-migrate @ 15169]
Christopher O'Brien <siege@pidgin.im>
parents:
12813
diff
changeset
|
3900 gaim_mime_part_set_data(part, tmp); |
12813
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
3901 g_free(tmp); |
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
3902 #endif |
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
3903 |
10977 | 3904 g_string_free(str, TRUE); |
3905 | |
3906 str = g_string_new(NULL); | |
3907 gaim_mime_document_write(doc, str); | |
3908 tmp = str->str; | |
3909 g_string_free(str, FALSE); | |
3910 | |
3911 return tmp; | |
3912 } | |
3913 | |
3914 | |
3915 static int mw_prpl_send_im(GaimConnection *gc, | |
3916 const char *name, | |
3917 const char *message, | |
12216 | 3918 GaimMessageFlags flags) { |
10977 | 3919 |
3920 struct mwGaimPluginData *pd; | |
3921 struct mwIdBlock who = { (char *) name, NULL }; | |
3922 struct mwConversation *conv; | |
3923 | |
3924 g_return_val_if_fail(gc != NULL, 0); | |
3925 pd = gc->proto_data; | |
3926 | |
3927 g_return_val_if_fail(pd != NULL, 0); | |
3928 | |
3929 conv = mwServiceIm_getConversation(pd->srvc_im, &who); | |
3930 | |
3931 /* this detection of features to determine how to send the message | |
3932 (plain, html, or mime) is flawed because the other end of the | |
3933 conversation could close their channel at any time, rendering any | |
3934 existing formatting in an outgoing message innapropriate. The end | |
3935 result is that it may be possible that the other side of the | |
3936 conversation will receive a plaintext message with html contents, | |
3937 which is bad. I'm not sure how to fix this correctly. */ | |
3938 | |
12105
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3939 if(strstr(message, "<img ") || strstr(message, "<IMG ")) |
12216 | 3940 flags |= GAIM_MESSAGE_IMAGES; |
10977 | 3941 |
3942 if(mwConversation_isOpen(conv)) { | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3943 char *tmp; |
10977 | 3944 int ret; |
3945 | |
12216 | 3946 if((flags & GAIM_MESSAGE_IMAGES) && |
10977 | 3947 mwConversation_supports(conv, mwImSend_MIME)) { |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3948 /* send a MIME message */ |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3949 |
12105
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3950 tmp = im_mime_convert(gc, conv, message); |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3951 ret = mwConversation_send(conv, mwImSend_MIME, tmp); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3952 g_free(tmp); |
10977 | 3953 |
3954 } else if(mwConversation_supports(conv, mwImSend_HTML)) { | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3955 /* send an HTML message */ |
10977 | 3956 |
12813
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
3957 #if NB_HACK |
12005
5b3368008513
[gaim-migrate @ 14298]
Christopher O'Brien <siege@pidgin.im>
parents:
11953
diff
changeset
|
3958 if(is_nb(conv)) { |
12105
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3959 |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3960 /* html messages need the notesbuddy hack */ |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3961 char *msg = nb_im_encode(gc, message); |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3962 tmp = gaim_strdup_withhtml(msg); |
12005
5b3368008513
[gaim-migrate @ 14298]
Christopher O'Brien <siege@pidgin.im>
parents:
11953
diff
changeset
|
3963 g_free(msg); |
12105
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3964 |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3965 } else { |
12524
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3966 /* need to do this to get the \n to <br> conversion */ |
12105
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3967 tmp = gaim_strdup_withhtml(message); |
12005
5b3368008513
[gaim-migrate @ 14298]
Christopher O'Brien <siege@pidgin.im>
parents:
11953
diff
changeset
|
3968 } |
5b3368008513
[gaim-migrate @ 14298]
Christopher O'Brien <siege@pidgin.im>
parents:
11953
diff
changeset
|
3969 |
12813
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
3970 #else |
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
3971 char *ncr; |
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
3972 ncr = gaim_utf8_ncr_encode(message); |
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
3973 tmp = gaim_strdup_withhtml(ncr); |
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
3974 g_free(ncr); |
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
3975 #endif |
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
3976 |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3977 ret = mwConversation_send(conv, mwImSend_HTML, tmp); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3978 g_free(tmp); |
10977 | 3979 |
3980 } else { | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3981 /* default to text */ |
12524
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3982 tmp = gaim_markup_strip_html(message); |
12216 | 3983 ret = mwConversation_send(conv, mwImSend_PLAIN, tmp); |
12524
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3984 g_free(tmp); |
10977 | 3985 } |
3986 | |
3987 return !ret; | |
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
3988 |
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
3989 } else { |
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
3990 |
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
3991 /* queue up the message safely as plain text */ |
12105
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3992 char *tmp = gaim_markup_strip_html(message); |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3993 convo_queue(conv, mwImSend_PLAIN, tmp); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3994 g_free(tmp); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3995 |
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
3996 if(! mwConversation_isPending(conv)) |
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
3997 mwConversation_open(conv); |
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
3998 |
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
3999 return 1; |
10977 | 4000 } |
4001 } | |
4002 | |
4003 | |
4004 static int mw_prpl_send_typing(GaimConnection *gc, const char *name, | |
4005 int typing) { | |
4006 | |
4007 struct mwGaimPluginData *pd; | |
4008 struct mwIdBlock who = { (char *) name, NULL }; | |
4009 struct mwConversation *conv; | |
4010 | |
4011 gpointer t = GINT_TO_POINTER(!! typing); | |
4012 | |
4013 g_return_val_if_fail(gc != NULL, 0); | |
4014 pd = gc->proto_data; | |
4015 | |
4016 g_return_val_if_fail(pd != NULL, 0); | |
4017 | |
4018 conv = mwServiceIm_getConversation(pd->srvc_im, &who); | |
4019 | |
4020 if(mwConversation_isOpen(conv)) | |
4021 return ! mwConversation_send(conv, mwImSend_TYPING, t); | |
4022 | |
4023 if(typing) { | |
4024 /* let's only open a channel for typing, not for not-typing. | |
4025 Otherwise two users in psychic mode will continually open | |
4026 conversations to each other, never able to get rid of them, as | |
4027 when the other person closes, it psychicaly opens again */ | |
4028 | |
4029 convo_queue(conv, mwImSend_TYPING, t); | |
4030 | |
4031 if(! mwConversation_isPending(conv)) | |
4032 mwConversation_open(conv); | |
4033 } | |
4034 | |
4035 return 1; | |
4036 } | |
4037 | |
4038 | |
12311
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4039 static const char *mw_client_name(guint16 type) { |
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4040 switch(type) { |
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4041 case mwLogin_LIB: |
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4042 return "Lotus Binary Library"; |
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4043 |
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4044 case mwLogin_JAVA_WEB: |
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4045 return "Lotus Java Client Applet"; |
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4046 |
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4047 case mwLogin_BINARY: |
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4048 return "Lotus Sametime Connect"; |
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4049 |
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4050 case mwLogin_JAVA_APP: |
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4051 return "Lotus Java Client Application"; |
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4052 |
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4053 case mwLogin_LINKS: |
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4054 return "Lotus Sametime Links"; |
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4055 |
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4056 case mwLogin_NOTES_6_5: |
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4057 case mwLogin_NOTES_6_5_3: |
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4058 case mwLogin_NOTES_7_0_beta: |
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4059 case mwLogin_NOTES_7_0: |
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4060 return "Lotus Notes Client"; |
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4061 |
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4062 case mwLogin_ICT: |
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4063 case mwLogin_ICT_1_7_8_2: |
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4064 case mwLogin_ICT_SIP: |
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4065 return "IBM Community Tools"; |
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4066 |
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4067 case mwLogin_NOTESBUDDY_4_14: |
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4068 case mwLogin_NOTESBUDDY_4_15: |
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4069 case mwLogin_NOTESBUDDY_4_16: |
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4070 return "Alphaworks NotesBuddy"; |
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4071 |
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4072 case mwLogin_SANITY: |
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4073 return "Sanity"; |
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4074 |
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4075 case mwLogin_ST_PERL: |
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4076 return "ST-Send-Message"; |
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4077 |
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4078 case mwLogin_TRILLIAN: |
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4079 case mwLogin_TRILLIAN_IBM: |
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4080 return "Trillian"; |
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4081 |
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4082 case mwLogin_MEANWHILE: |
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4083 return "Meanwhile"; |
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4084 |
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4085 default: |
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4086 return NULL; |
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4087 } |
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4088 } |
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4089 |
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4090 |
10977 | 4091 static void mw_prpl_get_info(GaimConnection *gc, const char *who) { |
4092 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4093 struct mwAwareIdBlock idb = { mwAware_USER, (char *) who, NULL }; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4094 |
10977 | 4095 struct mwGaimPluginData *pd; |
4096 GaimAccount *acct; | |
4097 GaimBuddy *b; | |
4098 | |
4099 GString *str; | |
4100 const char *tmp; | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4101 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4102 g_return_if_fail(who != NULL); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4103 g_return_if_fail(*who != '\0'); |
10977 | 4104 |
4105 pd = gc->proto_data; | |
4106 | |
4107 acct = gaim_connection_get_account(gc); | |
4108 b = gaim_find_buddy(acct, who); | |
4109 | |
4110 str = g_string_new(NULL); | |
4111 | |
12166 | 4112 if(gaim_str_has_prefix(who, "@E ")) { |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4113 g_string_append(str, _("<b>External User</b><br>")); |
10977 | 4114 } |
4115 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4116 g_string_append_printf(str, _("<b>User ID:</b> %s<br>"), who); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4117 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4118 if(b) { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4119 guint32 type; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4120 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4121 if(b->server_alias) { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4122 g_string_append_printf(str, _("<b>Full Name:</b> %s<br>"), |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4123 b->server_alias); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4124 } |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4125 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4126 type = gaim_blist_node_get_int((GaimBlistNode *) b, BUDDY_KEY_CLIENT); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4127 if(type) { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4128 g_string_append(str, _("<b>Last Known Client:</b> ")); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4129 |
12311
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4130 tmp = mw_client_name(type); |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4131 if(tmp) { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4132 g_string_append(str, tmp); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4133 g_string_append(str, "<br>"); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4134 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4135 } else { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4136 g_string_append_printf(str, _("Unknown (0x%04x)<br>"), type); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4137 } |
10977 | 4138 } |
4139 } | |
4140 | |
4141 tmp = user_supports_text(pd->srvc_aware, who); | |
4142 if(tmp) { | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4143 g_string_append_printf(str, _("<b>Supports:</b> %s<br>"), tmp); |
10977 | 4144 g_free((char *) tmp); |
4145 } | |
4146 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4147 if(b) { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4148 tmp = status_text(b); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4149 g_string_append_printf(str, _("<b>Status:</b> %s"), tmp); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4150 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4151 g_string_append(str, "<hr>"); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4152 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4153 tmp = mwServiceAware_getText(pd->srvc_aware, &idb); |
12496
f9d0ab1474ac
[gaim-migrate @ 14808]
Christopher O'Brien <siege@pidgin.im>
parents:
12489
diff
changeset
|
4154 if(tmp) { |
f9d0ab1474ac
[gaim-migrate @ 14808]
Christopher O'Brien <siege@pidgin.im>
parents:
12489
diff
changeset
|
4155 tmp = g_markup_escape_text(tmp, -1); |
f9d0ab1474ac
[gaim-migrate @ 14808]
Christopher O'Brien <siege@pidgin.im>
parents:
12489
diff
changeset
|
4156 g_string_append(str, tmp); |
f9d0ab1474ac
[gaim-migrate @ 14808]
Christopher O'Brien <siege@pidgin.im>
parents:
12489
diff
changeset
|
4157 g_free((char *) tmp); |
f9d0ab1474ac
[gaim-migrate @ 14808]
Christopher O'Brien <siege@pidgin.im>
parents:
12489
diff
changeset
|
4158 } |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4159 } |
10977 | 4160 |
4161 /* @todo emit a signal to allow a plugin to override the display of | |
4162 this notification, so that it can create its own */ | |
4163 | |
11533
c9b815aeddc1
[gaim-migrate @ 13782]
Richard Laager <rlaager@wiktel.com>
parents:
11531
diff
changeset
|
4164 gaim_notify_userinfo(gc, who, str->str, NULL, NULL); |
10977 | 4165 |
4166 g_string_free(str, TRUE); | |
4167 } | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4168 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4169 |
11638 | 4170 static void mw_prpl_set_status(GaimAccount *acct, GaimStatus *status) { |
4171 GaimConnection *gc; | |
4172 const char *state; | |
11641
925c1960af34
[gaim-migrate @ 13918]
Richard Laager <rlaager@wiktel.com>
parents:
11638
diff
changeset
|
4173 char *message = NULL; |
10977 | 4174 struct mwSession *session; |
4175 struct mwUserStatus stat; | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4176 |
10977 | 4177 g_return_if_fail(acct != NULL); |
11638 | 4178 gc = gaim_account_get_connection(acct); |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4179 |
11638 | 4180 state = gaim_status_get_id(status); |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4181 |
12105
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
4182 DEBUG_INFO("Set status to %s\n", gaim_status_get_name(status)); |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4183 |
11638 | 4184 g_return_if_fail(gc != NULL); |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4185 |
10977 | 4186 session = gc_to_session(gc); |
4187 g_return_if_fail(session != NULL); | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4188 |
10977 | 4189 /* get a working copy of the current status */ |
4190 mwUserStatus_clone(&stat, mwSession_getUserStatus(session)); | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4191 |
10977 | 4192 /* determine the state */ |
11638 | 4193 if(! strcmp(state, MW_STATE_ACTIVE)) { |
10977 | 4194 stat.status = mwStatus_ACTIVE; |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4195 |
11638 | 4196 } else if(! strcmp(state, MW_STATE_AWAY)) { |
4197 stat.status = mwStatus_AWAY; | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4198 |
11638 | 4199 } else if(! strcmp(state, MW_STATE_BUSY)) { |
4200 stat.status = mwStatus_BUSY; | |
10977 | 4201 } |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4202 |
10977 | 4203 /* determine the message */ |
12105
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
4204 message = (char *) gaim_status_get_attr_string(status, MW_STATE_MESSAGE); |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4205 |
10977 | 4206 if(message) { |
4207 /* all the possible non-NULL values of message up to this point | |
4208 are const, so we don't need to free them */ | |
4209 message = gaim_markup_strip_html(message); | |
4210 } | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4211 |
10977 | 4212 /* out with the old */ |
4213 g_free(stat.desc); | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4214 |
10977 | 4215 /* in with the new */ |
4216 stat.desc = (char *) message; | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4217 |
10977 | 4218 mwSession_setUserStatus(session, &stat); |
11638 | 4219 mwUserStatus_clear(&stat); |
10977 | 4220 } |
4221 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4222 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4223 static void mw_prpl_set_idle(GaimConnection *gc, int t) { |
10977 | 4224 struct mwSession *session; |
4225 struct mwUserStatus stat; | |
12105
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
4226 |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
4227 |
10977 | 4228 session = gc_to_session(gc); |
4229 g_return_if_fail(session != NULL); | |
12105
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
4230 |
10977 | 4231 mwUserStatus_clone(&stat, mwSession_getUserStatus(session)); |
4232 | |
12105
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
4233 if(t) { |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
4234 time_t now = time(NULL); |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
4235 stat.time = now - t; |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
4236 |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
4237 } else { |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
4238 stat.time = 0; |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
4239 } |
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
4240 |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4241 if(t > 0 && stat.status == mwStatus_ACTIVE) { |
12105
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
4242 /* we were active and went idle, so change the status to IDLE. */ |
10977 | 4243 stat.status = mwStatus_IDLE; |
12105
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
4244 |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4245 } else if(t == 0 && stat.status == mwStatus_IDLE) { |
12105
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
4246 /* we only become idle automatically, so change back to ACTIVE */ |
10977 | 4247 stat.status = mwStatus_ACTIVE; |
4248 } | |
12105
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
4249 |
10977 | 4250 mwSession_setUserStatus(session, &stat); |
4251 mwUserStatus_clear(&stat); | |
12624
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4252 } |
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4253 |
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4254 |
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4255 static void notify_im(GaimConnection *gc, GList *row) { |
10977 | 4256 GaimAccount *acct; |
12624
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4257 GaimConversation *conv; |
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4258 char *id; |
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4259 |
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4260 acct = gaim_connection_get_account(gc); |
12631
e8da8f12e694
[gaim-migrate @ 14967]
Christopher O'Brien <siege@pidgin.im>
parents:
12630
diff
changeset
|
4261 id = g_list_nth_data(row, 1); |
12624
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4262 conv = gaim_find_conversation_with_account(GAIM_CONV_TYPE_IM, id, acct); |
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4263 if(! conv) conv = gaim_conversation_new(GAIM_CONV_TYPE_IM, acct, id); |
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4264 gaim_conversation_present(conv); |
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4265 } |
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4266 |
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4267 |
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4268 static void notify_add(GaimConnection *gc, GList *row) { |
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4269 gaim_blist_request_add_buddy(gaim_connection_get_account(gc), |
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4270 g_list_nth_data(row, 1), NULL, |
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4271 g_list_nth_data(row, 0)); |
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4272 } |
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4273 |
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4274 |
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4275 static void notify_close(gpointer data) { |
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4276 ; |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4277 } |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4278 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4279 |
10977 | 4280 static void multi_resolved_query(struct mwResolveResult *result, |
12624
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4281 GaimConnection *gc) { |
10977 | 4282 GList *l; |
4283 char *msgA, *msgB; | |
4284 | |
12624
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4285 GaimNotifySearchResults *sres; |
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4286 GaimNotifySearchColumn *scol; |
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4287 |
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4288 sres = gaim_notify_searchresults_new(); |
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4289 |
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4290 scol = gaim_notify_searchresults_column_new(_("User Name")); |
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4291 gaim_notify_searchresults_column_add(sres, scol); |
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4292 |
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4293 scol = gaim_notify_searchresults_column_new(_("Sametime ID")); |
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4294 gaim_notify_searchresults_column_add(sres, scol); |
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4295 |
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4296 gaim_notify_searchresults_button_add(sres, GAIM_NOTIFY_BUTTON_IM, |
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4297 notify_im); |
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4298 |
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4299 gaim_notify_searchresults_button_add(sres, GAIM_NOTIFY_BUTTON_ADD, |
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4300 notify_add); |
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4301 |
10977 | 4302 for(l = result->matches; l; l = l->next) { |
4303 struct mwResolveMatch *match = l->data; | |
12624
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4304 GList *row = NULL; |
12524
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
4305 |
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
4306 DEBUG_INFO("multi resolve: %s, %s\n", |
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
4307 NSTR(match->id), NSTR(match->name)); |
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
4308 |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4309 if(!match->id || !match->name) |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4310 continue; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4311 |
12624
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4312 row = g_list_append(row, g_strdup(match->name)); |
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4313 row = g_list_append(row, g_strdup(match->id)); |
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4314 gaim_notify_searchresults_row_add(sres, row); |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4315 } |
10977 | 4316 |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4317 msgA = _("An ambiguous user ID was entered"); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4318 msgB = _("The identifier '%s' may possibly refer to any of the following" |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4319 " users. Please select the correct user from the list below to" |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4320 " add them to your buddy list."); |
10977 | 4321 msgB = g_strdup_printf(msgB, result->name); |
4322 | |
12624
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4323 gaim_notify_searchresults(gc, _("Select User"), |
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4324 msgA, msgB, sres, notify_close, NULL); |
12630
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
4325 |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
4326 g_free(msgB); |
10977 | 4327 } |
4328 | |
4329 | |
4330 static void add_buddy_resolved(struct mwServiceResolve *srvc, | |
4331 guint32 id, guint32 code, GList *results, | |
4332 gpointer b) { | |
4333 | |
4334 struct mwResolveResult *res = NULL; | |
4335 GaimBuddy *buddy = b; | |
4336 GaimConnection *gc; | |
4337 struct mwGaimPluginData *pd; | |
4338 | |
4339 gc = gaim_account_get_connection(buddy->account); | |
4340 pd = gc->proto_data; | |
4341 | |
4342 if(results) | |
4343 res = results->data; | |
4344 | |
4345 if(!code && res && res->matches) { | |
4346 if(g_list_length(res->matches) == 1) { | |
4347 struct mwResolveMatch *match = res->matches->data; | |
4348 | |
4349 /* only one? that might be the right one! */ | |
4350 if(strcmp(res->name, match->id)) { | |
4351 /* uh oh, the single result isn't identical to the search | |
4352 term, better safe then sorry, so let's make sure it's who | |
4353 the user meant to add */ | |
12624
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4354 gaim_blist_remove_buddy(buddy); |
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4355 multi_resolved_query(res, gc); |
10977 | 4356 |
4357 } else { | |
12829
3848e5eb7962
[gaim-migrate @ 15177]
Christopher O'Brien <siege@pidgin.im>
parents:
12821
diff
changeset
|
4358 |
12624
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4359 /* same person, set the server alias */ |
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4360 gaim_blist_server_alias_buddy(buddy, match->name); |
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4361 gaim_blist_node_set_string((GaimBlistNode *) buddy, |
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4362 BUDDY_KEY_NAME, match->name); |
12829
3848e5eb7962
[gaim-migrate @ 15177]
Christopher O'Brien <siege@pidgin.im>
parents:
12821
diff
changeset
|
4363 |
3848e5eb7962
[gaim-migrate @ 15177]
Christopher O'Brien <siege@pidgin.im>
parents:
12821
diff
changeset
|
4364 /* subscribe to awareness */ |
3848e5eb7962
[gaim-migrate @ 15177]
Christopher O'Brien <siege@pidgin.im>
parents:
12821
diff
changeset
|
4365 buddy_add(pd, buddy); |
3848e5eb7962
[gaim-migrate @ 15177]
Christopher O'Brien <siege@pidgin.im>
parents:
12821
diff
changeset
|
4366 |
12624
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4367 blist_schedule(pd); |
10977 | 4368 } |
4369 | |
4370 } else { | |
4371 /* prompt user if more than one match was returned */ | |
12624
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4372 gaim_blist_remove_buddy(buddy); |
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4373 multi_resolved_query(res, gc); |
10977 | 4374 } |
4375 | |
4376 return; | |
4377 } | |
4378 | |
4379 /* fall-through indicates that we couldn't find a matching user in | |
4380 the resolve service (ether error or zero results), so we remove | |
4381 this buddy */ | |
4382 | |
4383 DEBUG_INFO("no such buddy in community\n"); | |
4384 gaim_blist_remove_buddy(buddy); | |
4385 blist_schedule(pd); | |
4386 | |
4387 if(res && res->name) { | |
4388 /* compose and display an error message */ | |
4389 char *msgA, *msgB; | |
4390 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4391 msgA = _("Unable to add user: user not found"); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4392 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4393 msgB = _("The identifier '%s' did not match any users in your" |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4394 " Sametime community. This entry has been removed from" |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4395 " your buddy list."); |
10977 | 4396 msgB = g_strdup_printf(msgB, NSTR(res->name)); |
4397 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4398 gaim_notify_error(gc, _("Unable to add user"), msgA, msgB); |
10977 | 4399 |
4400 g_free(msgB); | |
4401 } | |
4402 } | |
4403 | |
4404 | |
4405 static void mw_prpl_add_buddy(GaimConnection *gc, | |
4406 GaimBuddy *buddy, | |
4407 GaimGroup *group) { | |
4408 | |
4409 struct mwGaimPluginData *pd; | |
4410 struct mwServiceResolve *srvc; | |
4411 GList *query; | |
4412 enum mwResolveFlag flags; | |
4413 guint32 req; | |
4414 | |
4415 pd = gc->proto_data; | |
4416 srvc = pd->srvc_resolve; | |
4417 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4418 /* catch external buddies. They won't be in the resolve service */ |
12524
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
4419 if(buddy_is_external(buddy)) { |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4420 buddy_add(pd, buddy); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4421 return; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4422 } |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4423 |
10977 | 4424 query = g_list_prepend(NULL, buddy->name); |
4425 flags = mwResolveFlag_FIRST | mwResolveFlag_USERS; | |
4426 | |
4427 req = mwServiceResolve_resolve(srvc, query, flags, add_buddy_resolved, | |
4428 buddy, NULL); | |
4429 g_list_free(query); | |
4430 | |
4431 if(req == SEARCH_ERROR) { | |
4432 gaim_blist_remove_buddy(buddy); | |
4433 blist_schedule(pd); | |
4434 } | |
4435 } | |
4436 | |
4437 | |
4438 static void foreach_add_buddies(GaimGroup *group, GList *buddies, | |
4439 struct mwGaimPluginData *pd) { | |
4440 struct mwAwareList *list; | |
4441 | |
4442 list = list_ensure(pd, group); | |
4443 mwAwareList_addAware(list, buddies); | |
4444 g_list_free(buddies); | |
4445 } | |
4446 | |
4447 | |
4448 static void mw_prpl_add_buddies(GaimConnection *gc, | |
4449 GList *buddies, | |
4450 GList *groups) { | |
4451 | |
4452 struct mwGaimPluginData *pd; | |
4453 GHashTable *group_sets; | |
4454 struct mwAwareIdBlock *idbs, *idb; | |
4455 | |
4456 pd = gc->proto_data; | |
4457 | |
4458 /* map GaimGroup:GList of mwAwareIdBlock */ | |
4459 group_sets = g_hash_table_new(g_direct_hash, g_direct_equal); | |
4460 | |
4461 /* bunch of mwAwareIdBlock allocated at once, free'd at once */ | |
4462 idb = idbs = g_new(struct mwAwareIdBlock, g_list_length(buddies)); | |
4463 | |
4464 /* first pass collects mwAwareIdBlock lists for each group */ | |
4465 for(; buddies; buddies = buddies->next) { | |
4466 GaimBuddy *b = buddies->data; | |
4467 GaimGroup *g; | |
4468 const char *fn; | |
4469 GList *l; | |
4470 | |
4471 /* nab the saved server alias and stick it on the buddy */ | |
4472 fn = gaim_blist_node_get_string((GaimBlistNode *) b, BUDDY_KEY_NAME); | |
4473 gaim_blist_server_alias_buddy(b, fn); | |
4474 | |
4475 /* convert GaimBuddy into a mwAwareIdBlock */ | |
4476 idb->type = mwAware_USER; | |
4477 idb->user = (char *) b->name; | |
4478 idb->community = NULL; | |
4479 | |
4480 /* put idb into the list associated with the buddy's group */ | |
12088 | 4481 g = gaim_buddy_get_group(b); |
10977 | 4482 l = g_hash_table_lookup(group_sets, g); |
4483 l = g_list_prepend(l, idb++); | |
4484 g_hash_table_insert(group_sets, g, l); | |
4485 } | |
4486 | |
4487 /* each group's buddies get added in one shot, and schedule the blist | |
4488 for saving */ | |
4489 g_hash_table_foreach(group_sets, (GHFunc) foreach_add_buddies, pd); | |
4490 blist_schedule(pd); | |
4491 | |
4492 /* cleanup */ | |
4493 g_hash_table_destroy(group_sets); | |
4494 g_free(idbs); | |
4495 } | |
4496 | |
4497 | |
4498 static void mw_prpl_remove_buddy(GaimConnection *gc, | |
4499 GaimBuddy *buddy, GaimGroup *group) { | |
4500 | |
4501 struct mwGaimPluginData *pd; | |
4502 struct mwAwareIdBlock idb = { mwAware_USER, buddy->name, NULL }; | |
4503 struct mwAwareList *list; | |
4504 | |
4505 GList *rem = g_list_prepend(NULL, &idb); | |
4506 | |
4507 pd = gc->proto_data; | |
12088 | 4508 group = gaim_buddy_get_group(buddy); |
10977 | 4509 list = list_ensure(pd, group); |
4510 | |
4511 mwAwareList_removeAware(list, rem); | |
4512 blist_schedule(pd); | |
4513 | |
4514 g_list_free(rem); | |
4515 } | |
4516 | |
4517 | |
4518 static void privacy_fill(struct mwPrivacyInfo *priv, | |
4519 GSList *members) { | |
4520 | |
4521 struct mwUserItem *u; | |
4522 guint count; | |
4523 | |
4524 count = g_slist_length(members); | |
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
4525 DEBUG_INFO("privacy_fill: %u members\n", count); |
10977 | 4526 |
4527 priv->count = count; | |
4528 priv->users = g_new0(struct mwUserItem, count); | |
4529 | |
4530 while(count--) { | |
4531 u = priv->users + count; | |
4532 u->id = members->data; | |
4533 members = members->next; | |
4534 } | |
4535 } | |
4536 | |
4537 | |
4538 static void mw_prpl_set_permit_deny(GaimConnection *gc) { | |
4539 GaimAccount *acct; | |
4540 struct mwGaimPluginData *pd; | |
4541 struct mwSession *session; | |
4542 | |
4543 struct mwPrivacyInfo privacy = { | |
4544 .deny = FALSE, | |
4545 .count = 0, | |
4546 .users = NULL, | |
4547 }; | |
4548 | |
4549 g_return_if_fail(gc != NULL); | |
4550 | |
4551 acct = gaim_connection_get_account(gc); | |
4552 g_return_if_fail(acct != NULL); | |
4553 | |
4554 pd = gc->proto_data; | |
4555 g_return_if_fail(pd != NULL); | |
4556 | |
4557 session = pd->session; | |
4558 g_return_if_fail(session != NULL); | |
4559 | |
4560 switch(acct->perm_deny) { | |
4561 case GAIM_PRIVACY_DENY_USERS: | |
4562 DEBUG_INFO("GAIM_PRIVACY_DENY_USERS\n"); | |
4563 privacy_fill(&privacy, acct->deny); | |
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
4564 privacy.deny = TRUE; |
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
4565 break; |
10977 | 4566 |
4567 case GAIM_PRIVACY_ALLOW_ALL: | |
4568 DEBUG_INFO("GAIM_PRIVACY_ALLOW_ALL\n"); | |
4569 privacy.deny = TRUE; | |
4570 break; | |
4571 | |
4572 case GAIM_PRIVACY_ALLOW_USERS: | |
4573 DEBUG_INFO("GAIM_PRIVACY_ALLOW_USERS\n"); | |
4574 privacy_fill(&privacy, acct->permit); | |
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
4575 privacy.deny = FALSE; |
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
4576 break; |
10977 | 4577 |
4578 case GAIM_PRIVACY_DENY_ALL: | |
4579 DEBUG_INFO("GAIM_PRIVACY_DENY_ALL\n"); | |
4580 privacy.deny = FALSE; | |
4581 break; | |
4582 | |
4583 default: | |
4584 DEBUG_INFO("acct->perm_deny is 0x%x\n", acct->perm_deny); | |
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
4585 return; |
10977 | 4586 } |
4587 | |
4588 mwSession_setPrivacyInfo(session, &privacy); | |
4589 g_free(privacy.users); | |
4590 } | |
4591 | |
4592 | |
4593 static void mw_prpl_add_permit(GaimConnection *gc, const char *name) { | |
4594 mw_prpl_set_permit_deny(gc); | |
4595 } | |
4596 | |
4597 | |
4598 static void mw_prpl_add_deny(GaimConnection *gc, const char *name) { | |
4599 mw_prpl_set_permit_deny(gc); | |
4600 } | |
4601 | |
4602 | |
4603 static void mw_prpl_rem_permit(GaimConnection *gc, const char *name) { | |
4604 mw_prpl_set_permit_deny(gc); | |
4605 } | |
4606 | |
4607 | |
4608 static void mw_prpl_rem_deny(GaimConnection *gc, const char *name) { | |
4609 mw_prpl_set_permit_deny(gc); | |
4610 } | |
4611 | |
4612 | |
4613 static struct mwConference *conf_find(struct mwServiceConference *srvc, | |
4614 const char *name) { | |
4615 GList *l, *ll; | |
4616 struct mwConference *conf = NULL; | |
4617 | |
4618 ll = mwServiceConference_getConferences(srvc); | |
4619 for(l = ll; l; l = l->next) { | |
4620 struct mwConference *c = l->data; | |
4621 if(! strcmp(name, mwConference_getName(c))) { | |
4622 conf = c; | |
4623 break; | |
4624 } | |
4625 } | |
4626 g_list_free(ll); | |
4627 | |
4628 return conf; | |
4629 } | |
4630 | |
4631 | |
4632 static void mw_prpl_join_chat(GaimConnection *gc, | |
4633 GHashTable *components) { | |
4634 | |
4635 struct mwGaimPluginData *pd; | |
4636 char *c, *t; | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4637 |
10977 | 4638 pd = gc->proto_data; |
4639 | |
4640 c = g_hash_table_lookup(components, CHAT_KEY_NAME); | |
4641 t = g_hash_table_lookup(components, CHAT_KEY_TOPIC); | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4642 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4643 if(g_hash_table_lookup(components, CHAT_KEY_IS_PLACE)) { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4644 /* use place service */ |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4645 struct mwServicePlace *srvc; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4646 struct mwPlace *place = NULL; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4647 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4648 srvc = pd->srvc_place; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4649 place = mwPlace_new(srvc, c, t); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4650 mwPlace_open(place); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4651 |
10977 | 4652 } else { |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4653 /* use conference service */ |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4654 struct mwServiceConference *srvc; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4655 struct mwConference *conf = NULL; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4656 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4657 srvc = pd->srvc_conf; |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4658 if(c) conf = conf_find(srvc, c); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4659 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4660 if(conf) { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4661 DEBUG_INFO("accepting conference invitation\n"); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4662 mwConference_accept(conf); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4663 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4664 } else { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4665 DEBUG_INFO("creating new conference\n"); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4666 conf = mwConference_new(srvc, t); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4667 mwConference_open(conf); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4668 } |
10977 | 4669 } |
4670 } | |
4671 | |
4672 | |
4673 static void mw_prpl_reject_chat(GaimConnection *gc, | |
4674 GHashTable *components) { | |
4675 | |
4676 struct mwGaimPluginData *pd; | |
4677 struct mwServiceConference *srvc; | |
4678 char *c; | |
4679 | |
4680 pd = gc->proto_data; | |
4681 srvc = pd->srvc_conf; | |
4682 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4683 if(g_hash_table_lookup(components, CHAT_KEY_IS_PLACE)) { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4684 ; /* nothing needs doing */ |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4685 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4686 } else { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4687 /* reject conference */ |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4688 c = g_hash_table_lookup(components, CHAT_KEY_NAME); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4689 if(c) { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4690 struct mwConference *conf = conf_find(srvc, c); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4691 if(conf) mwConference_reject(conf, ERR_SUCCESS, "Declined"); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4692 } |
10977 | 4693 } |
4694 } | |
4695 | |
4696 | |
4697 static char *mw_prpl_get_chat_name(GHashTable *components) { | |
4698 return g_hash_table_lookup(components, CHAT_KEY_NAME); | |
4699 } | |
4700 | |
4701 | |
4702 static void mw_prpl_chat_invite(GaimConnection *gc, | |
4703 int id, | |
4704 const char *invitation, | |
4705 const char *who) { | |
4706 | |
4707 struct mwGaimPluginData *pd; | |
4708 struct mwConference *conf; | |
12107
40724851e95e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
4709 struct mwPlace *place; |
10977 | 4710 struct mwIdBlock idb = { (char *) who, NULL }; |
4711 | |
4712 pd = gc->proto_data; | |
4713 g_return_if_fail(pd != NULL); | |
12107
40724851e95e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
4714 |
10977 | 4715 conf = ID_TO_CONF(pd, id); |
4716 | |
12107
40724851e95e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
4717 if(conf) { |
40724851e95e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
4718 mwConference_invite(conf, &idb, invitation); |
40724851e95e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
4719 return; |
40724851e95e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
4720 } |
40724851e95e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
4721 |
40724851e95e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
4722 place = ID_TO_PLACE(pd, id); |
40724851e95e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
4723 g_return_if_fail(place != NULL); |
40724851e95e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
4724 |
40724851e95e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
4725 /* @todo: use the IM service for invitation */ |
40724851e95e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
4726 mwPlace_legacyInvite(place, &idb, invitation); |
10977 | 4727 } |
4728 | |
4729 | |
4730 static void mw_prpl_chat_leave(GaimConnection *gc, | |
4731 int id) { | |
4732 | |
4733 struct mwGaimPluginData *pd; | |
4734 struct mwConference *conf; | |
4735 | |
4736 pd = gc->proto_data; | |
4737 | |
4738 g_return_if_fail(pd != NULL); | |
4739 conf = ID_TO_CONF(pd, id); | |
4740 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4741 if(conf) { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4742 mwConference_destroy(conf, ERR_SUCCESS, "Leaving"); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4743 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4744 } else { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4745 struct mwPlace *place = ID_TO_PLACE(pd, id); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4746 g_return_if_fail(place != NULL); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4747 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4748 mwPlace_destroy(place, ERR_SUCCESS); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4749 } |
10977 | 4750 } |
4751 | |
4752 | |
4753 static void mw_prpl_chat_whisper(GaimConnection *gc, | |
4754 int id, | |
4755 const char *who, | |
4756 const char *message) { | |
4757 | |
4758 mw_prpl_send_im(gc, who, message, 0); | |
4759 } | |
4760 | |
4761 | |
4762 static int mw_prpl_chat_send(GaimConnection *gc, | |
4763 int id, | |
12216 | 4764 const char *message, |
4765 GaimMessageFlags flags) { | |
10977 | 4766 |
4767 struct mwGaimPluginData *pd; | |
4768 struct mwConference *conf; | |
4769 | |
4770 pd = gc->proto_data; | |
4771 | |
4772 g_return_val_if_fail(pd != NULL, 0); | |
4773 conf = ID_TO_CONF(pd, id); | |
4774 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4775 if(conf) { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4776 return ! mwConference_sendText(conf, message); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4777 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4778 } else { |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4779 struct mwPlace *place = ID_TO_PLACE(pd, id); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4780 g_return_val_if_fail(place != NULL, 0); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4781 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4782 return ! mwPlace_sendText(place, message); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4783 } |
10977 | 4784 } |
4785 | |
4786 | |
4787 static void mw_prpl_keepalive(GaimConnection *gc) { | |
4788 struct mwSession *session; | |
4789 | |
4790 g_return_if_fail(gc != NULL); | |
4791 | |
4792 session = gc_to_session(gc); | |
4793 g_return_if_fail(session != NULL); | |
4794 | |
4795 mwSession_sendKeepalive(session); | |
4796 } | |
4797 | |
4798 | |
4799 static void mw_prpl_alias_buddy(GaimConnection *gc, | |
4800 const char *who, | |
4801 const char *alias) { | |
4802 | |
4803 struct mwGaimPluginData *pd = gc->proto_data; | |
4804 g_return_if_fail(pd != NULL); | |
4805 | |
4806 /* it's a change to the buddy list, so we've gotta reflect that in | |
4807 the server copy */ | |
4808 | |
4809 blist_schedule(pd); | |
4810 } | |
4811 | |
4812 | |
4813 static void mw_prpl_group_buddy(GaimConnection *gc, | |
4814 const char *who, | |
4815 const char *old_group, | |
4816 const char *new_group) { | |
4817 | |
4818 struct mwAwareIdBlock idb = { mwAware_USER, (char *) who, NULL }; | |
4819 GList *gl = g_list_prepend(NULL, &idb); | |
4820 | |
4821 struct mwGaimPluginData *pd = gc->proto_data; | |
4822 GaimGroup *group; | |
4823 struct mwAwareList *list; | |
4824 | |
4825 /* add who to new_group's aware list */ | |
4826 group = gaim_find_group(new_group); | |
4827 list = list_ensure(pd, group); | |
4828 mwAwareList_addAware(list, gl); | |
4829 | |
4830 /* remove who from old_group's aware list */ | |
4831 group = gaim_find_group(old_group); | |
4832 list = list_ensure(pd, group); | |
4833 mwAwareList_removeAware(list, gl); | |
4834 | |
4835 g_list_free(gl); | |
4836 | |
4837 /* schedule the changes to be saved */ | |
4838 blist_schedule(pd); | |
4839 } | |
4840 | |
4841 | |
4842 static void mw_prpl_rename_group(GaimConnection *gc, | |
4843 const char *old, | |
4844 GaimGroup *group, | |
4845 GList *buddies) { | |
4846 | |
4847 struct mwGaimPluginData *pd = gc->proto_data; | |
4848 g_return_if_fail(pd != NULL); | |
4849 | |
4850 /* it's a change in the buddy list, so we've gotta reflect that in | |
4851 the server copy. Also, having this function should prevent all | |
4852 those buddies from being removed and re-added. We don't really | |
4853 give a crap what the group is named in Gaim other than to record | |
4854 that as the group name/alias */ | |
4855 | |
4856 blist_schedule(pd); | |
4857 } | |
4858 | |
4859 | |
4860 static void mw_prpl_buddy_free(GaimBuddy *buddy) { | |
4861 /* I don't think we have any cleanup for buddies yet */ | |
4862 ; | |
4863 } | |
4864 | |
4865 | |
4866 static void mw_prpl_convo_closed(GaimConnection *gc, const char *who) { | |
4867 struct mwGaimPluginData *pd = gc->proto_data; | |
4868 struct mwServiceIm *srvc; | |
4869 struct mwConversation *conv; | |
4870 struct mwIdBlock idb = { (char *) who, NULL }; | |
4871 | |
4872 g_return_if_fail(pd != NULL); | |
4873 | |
4874 srvc = pd->srvc_im; | |
4875 g_return_if_fail(srvc != NULL); | |
4876 | |
4877 conv = mwServiceIm_findConversation(srvc, &idb); | |
4878 if(! conv) return; | |
4879 | |
4880 if(mwConversation_isOpen(conv)) | |
4881 mwConversation_free(conv); | |
4882 } | |
4883 | |
4884 | |
4885 static const char *mw_prpl_normalize(const GaimAccount *account, | |
4886 const char *id) { | |
4887 | |
4888 /* code elsewhere assumes that the return value points to different | |
4889 memory than the passed value, but it won't free the normalized | |
4890 data. wtf? */ | |
4891 | |
4892 static char buf[BUF_LEN]; | |
4893 strncpy(buf, id, sizeof(buf)); | |
4894 return buf; | |
4895 } | |
4896 | |
4897 | |
4898 static void mw_prpl_remove_group(GaimConnection *gc, GaimGroup *group) { | |
4899 struct mwGaimPluginData *pd; | |
4900 struct mwAwareList *list; | |
4901 | |
4902 pd = gc->proto_data; | |
4903 g_return_if_fail(pd != NULL); | |
4904 g_return_if_fail(pd->group_list_map != NULL); | |
4905 | |
4906 list = g_hash_table_lookup(pd->group_list_map, group); | |
4907 | |
4908 if(list) { | |
4909 g_hash_table_remove(pd->group_list_map, list); | |
4910 g_hash_table_remove(pd->group_list_map, group); | |
4911 mwAwareList_free(list); | |
4912 | |
4913 blist_schedule(pd); | |
4914 } | |
4915 } | |
4916 | |
4917 | |
4918 static gboolean mw_prpl_can_receive_file(GaimConnection *gc, | |
4919 const char *who) { | |
4920 struct mwGaimPluginData *pd; | |
4921 struct mwServiceAware *srvc; | |
4922 GaimAccount *acct; | |
4923 | |
4924 g_return_val_if_fail(gc != NULL, FALSE); | |
4925 | |
4926 pd = gc->proto_data; | |
4927 g_return_val_if_fail(pd != NULL, FALSE); | |
4928 | |
4929 srvc = pd->srvc_aware; | |
4930 g_return_val_if_fail(srvc != NULL, FALSE); | |
4931 | |
4932 acct = gaim_connection_get_account(gc); | |
4933 g_return_val_if_fail(acct != NULL, FALSE); | |
4934 | |
4935 return gaim_find_buddy(acct, who) && | |
4936 user_supports(srvc, who, mwAttribute_FILE_TRANSFER); | |
4937 } | |
4938 | |
4939 | |
4940 static void ft_outgoing_init(GaimXfer *xfer) { | |
4941 GaimAccount *acct; | |
4942 GaimConnection *gc; | |
4943 | |
4944 struct mwGaimPluginData *pd; | |
4945 struct mwServiceFileTransfer *srvc; | |
4946 struct mwFileTransfer *ft; | |
4947 | |
4948 const char *filename; | |
4949 gsize filesize; | |
4950 FILE *fp; | |
4951 | |
4952 struct mwIdBlock idb = { NULL, NULL }; | |
4953 | |
4954 DEBUG_INFO("ft_outgoing_init\n"); | |
4955 | |
4956 acct = gaim_xfer_get_account(xfer); | |
4957 gc = gaim_account_get_connection(acct); | |
4958 pd = gc->proto_data; | |
4959 srvc = pd->srvc_ft; | |
4960 | |
4961 filename = gaim_xfer_get_local_filename(xfer); | |
4962 filesize = gaim_xfer_get_size(xfer); | |
4963 idb.user = xfer->who; | |
4964 | |
4965 /* test that we can actually send the file */ | |
4966 fp = g_fopen(filename, "rb"); | |
4967 if(! fp) { | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4968 char *msg = g_strdup_printf(_("Error reading file %s: \n%s\n"), |
10977 | 4969 filename, strerror(errno)); |
4970 gaim_xfer_error(gaim_xfer_get_type(xfer), acct, xfer->who, msg); | |
4971 g_free(msg); | |
4972 return; | |
4973 } | |
4974 fclose(fp); | |
4975 | |
4976 { | |
4977 char *tmp = strrchr(filename, G_DIR_SEPARATOR); | |
4978 if(tmp++) filename = tmp; | |
4979 } | |
4980 | |
4981 ft = mwFileTransfer_new(srvc, &idb, NULL, filename, filesize); | |
4982 | |
4983 gaim_xfer_ref(xfer); | |
4984 mwFileTransfer_setClientData(ft, xfer, (GDestroyNotify) gaim_xfer_unref); | |
4985 xfer->data = ft; | |
4986 | |
4987 mwFileTransfer_offer(ft); | |
4988 } | |
4989 | |
4990 | |
4991 static void ft_outgoing_cancel(GaimXfer *xfer) { | |
4992 struct mwFileTransfer *ft = xfer->data; | |
4993 if(ft) mwFileTransfer_cancel(ft); | |
4994 } | |
4995 | |
4996 | |
12147 | 4997 static GaimXfer *mw_prpl_new_xfer(GaimConnection *gc, const char *who) { |
10977 | 4998 GaimAccount *acct; |
4999 GaimXfer *xfer; | |
5000 | |
5001 acct = gaim_connection_get_account(gc); | |
5002 | |
5003 xfer = gaim_xfer_new(acct, GAIM_XFER_SEND, who); | |
5004 gaim_xfer_set_init_fnc(xfer, ft_outgoing_init); | |
5005 gaim_xfer_set_cancel_send_fnc(xfer, ft_outgoing_cancel); | |
5006 | |
12143
cbebda5f019c
[gaim-migrate @ 14444]
Richard Laager <rlaager@wiktel.com>
parents:
12135
diff
changeset
|
5007 return xfer; |
cbebda5f019c
[gaim-migrate @ 14444]
Richard Laager <rlaager@wiktel.com>
parents:
12135
diff
changeset
|
5008 } |
cbebda5f019c
[gaim-migrate @ 14444]
Richard Laager <rlaager@wiktel.com>
parents:
12135
diff
changeset
|
5009 |
cbebda5f019c
[gaim-migrate @ 14444]
Richard Laager <rlaager@wiktel.com>
parents:
12135
diff
changeset
|
5010 static void mw_prpl_send_file(GaimConnection *gc, |
cbebda5f019c
[gaim-migrate @ 14444]
Richard Laager <rlaager@wiktel.com>
parents:
12135
diff
changeset
|
5011 const char *who, const char *file) { |
cbebda5f019c
[gaim-migrate @ 14444]
Richard Laager <rlaager@wiktel.com>
parents:
12135
diff
changeset
|
5012 |
cbebda5f019c
[gaim-migrate @ 14444]
Richard Laager <rlaager@wiktel.com>
parents:
12135
diff
changeset
|
5013 GaimXfer *xfer = mw_prpl_new_xfer(gc, who); |
cbebda5f019c
[gaim-migrate @ 14444]
Richard Laager <rlaager@wiktel.com>
parents:
12135
diff
changeset
|
5014 |
10977 | 5015 if(file) { |
5016 DEBUG_INFO("file != NULL\n"); | |
5017 gaim_xfer_request_accepted(xfer, file); | |
5018 | |
5019 } else { | |
5020 DEBUG_INFO("file == NULL\n"); | |
5021 gaim_xfer_request(xfer); | |
5022 } | |
5023 } | |
5024 | |
5025 | |
5026 static GaimPluginProtocolInfo mw_prpl_info = { | |
5027 .options = OPT_PROTO_IM_IMAGE, | |
5028 .user_splits = NULL, /*< set in mw_plugin_init */ | |
5029 .protocol_options = NULL, /*< set in mw_plugin_init */ | |
5030 .icon_spec = NO_BUDDY_ICONS, | |
5031 .list_icon = mw_prpl_list_icon, | |
5032 .list_emblems = mw_prpl_list_emblems, | |
5033 .status_text = mw_prpl_status_text, | |
5034 .tooltip_text = mw_prpl_tooltip_text, | |
5035 .status_types = mw_prpl_status_types, | |
5036 .blist_node_menu = mw_prpl_blist_node_menu, | |
5037 .chat_info = mw_prpl_chat_info, | |
5038 .chat_info_defaults = mw_prpl_chat_info_defaults, | |
5039 .login = mw_prpl_login, | |
5040 .close = mw_prpl_close, | |
5041 .send_im = mw_prpl_send_im, | |
5042 .set_info = NULL, | |
5043 .send_typing = mw_prpl_send_typing, | |
5044 .get_info = mw_prpl_get_info, | |
11638 | 5045 .set_status = mw_prpl_set_status, |
10977 | 5046 .set_idle = mw_prpl_set_idle, |
5047 .change_passwd = NULL, | |
5048 .add_buddy = mw_prpl_add_buddy, | |
5049 .add_buddies = mw_prpl_add_buddies, | |
5050 .remove_buddy = mw_prpl_remove_buddy, | |
5051 .remove_buddies = NULL, | |
5052 .add_permit = mw_prpl_add_permit, | |
5053 .add_deny = mw_prpl_add_deny, | |
5054 .rem_permit = mw_prpl_rem_permit, | |
5055 .rem_deny = mw_prpl_rem_deny, | |
5056 .set_permit_deny = mw_prpl_set_permit_deny, | |
5057 .join_chat = mw_prpl_join_chat, | |
5058 .reject_chat = mw_prpl_reject_chat, | |
5059 .get_chat_name = mw_prpl_get_chat_name, | |
5060 .chat_invite = mw_prpl_chat_invite, | |
5061 .chat_leave = mw_prpl_chat_leave, | |
5062 .chat_whisper = mw_prpl_chat_whisper, | |
5063 .chat_send = mw_prpl_chat_send, | |
5064 .keepalive = mw_prpl_keepalive, | |
5065 .register_user = NULL, | |
5066 .get_cb_info = NULL, | |
5067 .get_cb_away = NULL, | |
5068 .alias_buddy = mw_prpl_alias_buddy, | |
5069 .group_buddy = mw_prpl_group_buddy, | |
5070 .rename_group = mw_prpl_rename_group, | |
5071 .buddy_free = mw_prpl_buddy_free, | |
5072 .convo_closed = mw_prpl_convo_closed, | |
5073 .normalize = mw_prpl_normalize, | |
5074 .set_buddy_icon = NULL, | |
5075 .remove_group = mw_prpl_remove_group, | |
5076 .get_cb_real_name = NULL, | |
5077 .set_chat_topic = NULL, | |
5078 .find_blist_chat = NULL, | |
5079 .roomlist_get_list = NULL, | |
5080 .roomlist_expand_category = NULL, | |
5081 .can_receive_file = mw_prpl_can_receive_file, | |
5082 .send_file = mw_prpl_send_file, | |
12143
cbebda5f019c
[gaim-migrate @ 14444]
Richard Laager <rlaager@wiktel.com>
parents:
12135
diff
changeset
|
5083 .new_xfer = mw_prpl_new_xfer, |
12650 | 5084 .offline_message = NULL, |
5085 .whiteboard_prpl_ops = NULL, | |
5086 .media_prpl_ops = NULL, | |
10977 | 5087 }; |
5088 | |
5089 | |
5090 static GaimPluginPrefFrame * | |
5091 mw_plugin_get_plugin_pref_frame(GaimPlugin *plugin) { | |
5092 GaimPluginPrefFrame *frame; | |
5093 GaimPluginPref *pref; | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5094 |
10977 | 5095 frame = gaim_plugin_pref_frame_new(); |
5096 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5097 pref = gaim_plugin_pref_new_with_label(_("Remotely Stored Buddy List")); |
10977 | 5098 gaim_plugin_pref_frame_add(frame, pref); |
5099 | |
5100 | |
5101 pref = gaim_plugin_pref_new_with_name(MW_PRPL_OPT_BLIST_ACTION); | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5102 gaim_plugin_pref_set_label(pref, _("Buddy List Storage Mode")); |
10977 | 5103 |
5104 gaim_plugin_pref_set_type(pref, GAIM_PLUGIN_PREF_CHOICE); | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5105 gaim_plugin_pref_add_choice(pref, _("Local Buddy List Only"), |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5106 GINT_TO_POINTER(blist_choice_LOCAL)); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5107 gaim_plugin_pref_add_choice(pref, _("Merge List from Server"), |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5108 GINT_TO_POINTER(blist_choice_MERGE)); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5109 gaim_plugin_pref_add_choice(pref, _("Merge and Save List to Server"), |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5110 GINT_TO_POINTER(blist_choice_STORE)); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5111 gaim_plugin_pref_add_choice(pref, _("Synchronize List with Server"), |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5112 GINT_TO_POINTER(blist_choice_SYNCH)); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5113 |
10977 | 5114 gaim_plugin_pref_frame_add(frame, pref); |
5115 | |
5116 return frame; | |
5117 } | |
5118 | |
5119 | |
5120 static GaimPluginUiInfo mw_plugin_ui_info = { | |
5121 .get_plugin_pref_frame = mw_plugin_get_plugin_pref_frame, | |
5122 }; | |
5123 | |
5124 | |
5125 static void st_import_action_cb(GaimConnection *gc, char *filename) { | |
5126 struct mwSametimeList *l; | |
5127 | |
5128 FILE *file; | |
5129 char buf[BUF_LEN]; | |
5130 size_t len; | |
5131 | |
5132 GString *str; | |
5133 | |
5134 file = fopen(filename, "r"); | |
5135 g_return_if_fail(file != NULL); | |
5136 | |
5137 str = g_string_new(NULL); | |
5138 while( (len = fread(buf, 1, BUF_LEN, file)) ) { | |
5139 g_string_append_len(str, buf, len); | |
5140 } | |
5141 | |
5142 fclose(file); | |
5143 | |
5144 l = mwSametimeList_load(str->str); | |
5145 g_string_free(str, TRUE); | |
5146 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5147 blist_merge(gc, l); |
10977 | 5148 mwSametimeList_free(l); |
5149 } | |
5150 | |
5151 | |
5152 /** prompts for a file to import blist from */ | |
5153 static void st_import_action(GaimPluginAction *act) { | |
5154 GaimConnection *gc; | |
5155 GaimAccount *account; | |
5156 char *title; | |
5157 | |
5158 gc = act->context; | |
5159 account = gaim_connection_get_account(gc); | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5160 title = g_strdup_printf(_("Import Sametime List for Account %s"), |
10977 | 5161 gaim_account_get_username(account)); |
5162 | |
5163 gaim_request_file(gc, title, NULL, FALSE, | |
5164 G_CALLBACK(st_import_action_cb), NULL, | |
5165 gc); | |
5166 | |
5167 g_free(title); | |
5168 } | |
5169 | |
5170 | |
5171 static void st_export_action_cb(GaimConnection *gc, char *filename) { | |
5172 struct mwSametimeList *l; | |
5173 char *str; | |
5174 FILE *file; | |
5175 | |
5176 file = fopen(filename, "w"); | |
5177 g_return_if_fail(file != NULL); | |
5178 | |
5179 l = mwSametimeList_new(); | |
5180 blist_export(gc, l); | |
5181 str = mwSametimeList_store(l); | |
5182 mwSametimeList_free(l); | |
5183 | |
5184 fprintf(file, "%s", str); | |
5185 fclose(file); | |
5186 | |
5187 g_free(str); | |
5188 } | |
5189 | |
5190 | |
5191 /** prompts for a file to export blist to */ | |
5192 static void st_export_action(GaimPluginAction *act) { | |
5193 GaimConnection *gc; | |
5194 GaimAccount *account; | |
5195 char *title; | |
5196 | |
5197 gc = act->context; | |
5198 account = gaim_connection_get_account(gc); | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5199 title = g_strdup_printf(_("Export Sametime List for Account %s"), |
10977 | 5200 gaim_account_get_username(account)); |
5201 | |
5202 gaim_request_file(gc, title, NULL, TRUE, | |
5203 G_CALLBACK(st_export_action_cb), NULL, | |
5204 gc); | |
5205 | |
5206 g_free(title); | |
5207 } | |
5208 | |
5209 | |
5210 static void remote_group_multi_cleanup(gpointer ignore, | |
5211 GaimRequestFields *fields) { | |
5212 | |
5213 GaimRequestField *f; | |
5214 const GList *l; | |
5215 | |
5216 f = gaim_request_fields_get_field(fields, "group"); | |
5217 l = gaim_request_field_list_get_items(f); | |
5218 | |
5219 for(; l; l = l->next) { | |
5220 const char *i = l->data; | |
12624
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
5221 struct named_id *res; |
10977 | 5222 |
5223 res = gaim_request_field_list_get_data(f, i); | |
5224 | |
5225 g_free(res->id); | |
5226 g_free(res->name); | |
5227 g_free(res); | |
5228 } | |
5229 } | |
5230 | |
5231 | |
5232 static void remote_group_done(struct mwGaimPluginData *pd, | |
5233 const char *id, const char *name) { | |
5234 GaimConnection *gc; | |
5235 GaimAccount *acct; | |
5236 GaimGroup *group; | |
5237 GaimBlistNode *gn; | |
5238 const char *owner; | |
5239 | |
5240 g_return_if_fail(pd != NULL); | |
5241 | |
5242 gc = pd->gc; | |
5243 acct = gaim_connection_get_account(gc); | |
5244 | |
5245 /* collision checking */ | |
5246 group = gaim_find_group(name); | |
5247 if(group) { | |
5248 char *msgA, *msgB; | |
5249 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5250 msgA = _("Unable to add group: group exists"); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5251 msgB = _("A group named '%s' already exists in your buddy list."); |
10977 | 5252 msgB = g_strdup_printf(msgB, name); |
5253 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5254 gaim_notify_error(gc, _("Unable to add group"), msgA, msgB); |
10977 | 5255 |
5256 g_free(msgB); | |
5257 return; | |
5258 } | |
5259 | |
5260 group = gaim_group_new(name); | |
5261 gn = (GaimBlistNode *) group; | |
5262 | |
5263 owner = gaim_account_get_username(acct); | |
5264 | |
5265 gaim_blist_node_set_string(gn, GROUP_KEY_NAME, id); | |
5266 gaim_blist_node_set_int(gn, GROUP_KEY_TYPE, mwSametimeGroup_DYNAMIC); | |
5267 gaim_blist_node_set_string(gn, GROUP_KEY_OWNER, owner); | |
5268 gaim_blist_add_group(group, NULL); | |
5269 | |
5270 group_add(pd, group); | |
5271 blist_schedule(pd); | |
5272 } | |
5273 | |
5274 | |
5275 static void remote_group_multi_cb(struct mwGaimPluginData *pd, | |
5276 GaimRequestFields *fields) { | |
5277 GaimRequestField *f; | |
5278 const GList *l; | |
5279 | |
5280 f = gaim_request_fields_get_field(fields, "group"); | |
5281 l = gaim_request_field_list_get_selected(f); | |
5282 | |
5283 if(l) { | |
5284 const char *i = l->data; | |
12624
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
5285 struct named_id *res; |
10977 | 5286 |
5287 res = gaim_request_field_list_get_data(f, i); | |
5288 remote_group_done(pd, res->id, res->name); | |
5289 } | |
5290 | |
5291 remote_group_multi_cleanup(NULL, fields); | |
5292 } | |
5293 | |
5294 | |
5295 static void remote_group_multi(struct mwResolveResult *result, | |
5296 struct mwGaimPluginData *pd) { | |
5297 | |
5298 GaimRequestFields *fields; | |
5299 GaimRequestFieldGroup *g; | |
5300 GaimRequestField *f; | |
5301 GList *l; | |
5302 char *msgA, *msgB; | |
5303 | |
5304 GaimConnection *gc = pd->gc; | |
5305 | |
5306 fields = gaim_request_fields_new(); | |
5307 | |
5308 g = gaim_request_field_group_new(NULL); | |
5309 gaim_request_fields_add_group(fields, g); | |
5310 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5311 f = gaim_request_field_list_new("group", _("Possible Matches")); |
10977 | 5312 gaim_request_field_list_set_multi_select(f, FALSE); |
5313 gaim_request_field_set_required(f, TRUE); | |
5314 | |
5315 for(l = result->matches; l; l = l->next) { | |
5316 struct mwResolveMatch *match = l->data; | |
12624
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
5317 struct named_id *res = g_new0(struct named_id, 1); |
10977 | 5318 |
5319 res->id = g_strdup(match->id); | |
5320 res->name = g_strdup(match->name); | |
5321 | |
5322 gaim_request_field_list_add(f, res->name, res); | |
5323 } | |
5324 | |
5325 gaim_request_field_group_add_field(g, f); | |
5326 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5327 msgA = _("Notes Address Book group results"); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5328 msgB = _("The identifier '%s' may possibly refer to any of the following" |
10977 | 5329 " Notes Address Book groups. Please select the correct group from" |
5330 " the list below to add it to your buddy list."); | |
5331 msgB = g_strdup_printf(msgB, result->name); | |
5332 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5333 gaim_request_fields(gc, _("Select Notes Address Book"), |
10977 | 5334 msgA, msgB, fields, |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5335 _("Add Group"), G_CALLBACK(remote_group_multi_cb), |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5336 _("Cancel"), G_CALLBACK(remote_group_multi_cleanup), |
10977 | 5337 pd); |
5338 | |
5339 g_free(msgB); | |
5340 } | |
5341 | |
5342 | |
5343 static void remote_group_resolved(struct mwServiceResolve *srvc, | |
5344 guint32 id, guint32 code, GList *results, | |
5345 gpointer b) { | |
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
5346 |
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
5347 struct mwResolveResult *res = NULL; |
10977 | 5348 struct mwSession *session; |
5349 struct mwGaimPluginData *pd; | |
5350 GaimConnection *gc; | |
5351 | |
5352 session = mwService_getSession(MW_SERVICE(srvc)); | |
5353 g_return_if_fail(session != NULL); | |
5354 | |
5355 pd = mwSession_getClientData(session); | |
5356 g_return_if_fail(pd != NULL); | |
5357 | |
5358 gc = pd->gc; | |
5359 g_return_if_fail(gc != NULL); | |
5360 | |
5361 if(!code && results) { | |
5362 res = results->data; | |
5363 | |
5364 if(res->matches) { | |
5365 remote_group_multi(res, pd); | |
5366 return; | |
5367 } | |
5368 } | |
5369 | |
5370 if(res && res->name) { | |
5371 char *msgA, *msgB; | |
5372 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5373 msgA = _("Unable to add group: group not found"); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5374 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5375 msgB = _("The identifier '%s' did not match any Notes Address Book" |
10977 | 5376 " groups in your Sametime community."); |
5377 msgB = g_strdup_printf(msgB, res->name); | |
5378 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5379 gaim_notify_error(gc, _("Unable to add group"), msgA, msgB); |
10977 | 5380 |
5381 g_free(msgB); | |
5382 } | |
5383 } | |
5384 | |
5385 | |
5386 static void remote_group_action_cb(GaimConnection *gc, const char *name) { | |
5387 struct mwGaimPluginData *pd; | |
5388 struct mwServiceResolve *srvc; | |
5389 GList *query; | |
5390 enum mwResolveFlag flags; | |
5391 guint32 req; | |
5392 | |
5393 pd = gc->proto_data; | |
5394 srvc = pd->srvc_resolve; | |
5395 | |
5396 query = g_list_prepend(NULL, (char *) name); | |
5397 flags = mwResolveFlag_FIRST | mwResolveFlag_GROUPS; | |
5398 | |
5399 req = mwServiceResolve_resolve(srvc, query, flags, remote_group_resolved, | |
5400 NULL, NULL); | |
5401 g_list_free(query); | |
5402 | |
5403 if(req == SEARCH_ERROR) { | |
5404 /** @todo display error */ | |
5405 } | |
5406 } | |
5407 | |
5408 | |
5409 static void remote_group_action(GaimPluginAction *act) { | |
5410 GaimConnection *gc; | |
5411 const char *msgA, *msgB; | |
5412 | |
5413 gc = act->context; | |
5414 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5415 msgA = _("Notes Address Book Group"); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5416 msgB = _("Enter the name of a Notes Address Book group in the field below" |
10977 | 5417 " to add the group and its members to your buddy list."); |
5418 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5419 gaim_request_input(gc, _("Add Group"), msgA, msgB, NULL, |
10977 | 5420 FALSE, FALSE, NULL, |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5421 _("Add"), G_CALLBACK(remote_group_action_cb), |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5422 _("Cancel"), NULL, |
10977 | 5423 gc); |
5424 } | |
5425 | |
5426 | |
12630
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5427 static void search_notify(struct mwResolveResult *result, |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5428 GaimConnection *gc) { |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5429 GList *l; |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5430 char *msgA, *msgB; |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5431 |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5432 GaimNotifySearchResults *sres; |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5433 GaimNotifySearchColumn *scol; |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5434 |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5435 sres = gaim_notify_searchresults_new(); |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5436 |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5437 scol = gaim_notify_searchresults_column_new(_("User Name")); |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5438 gaim_notify_searchresults_column_add(sres, scol); |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5439 |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5440 scol = gaim_notify_searchresults_column_new(_("Sametime ID")); |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5441 gaim_notify_searchresults_column_add(sres, scol); |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5442 |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5443 gaim_notify_searchresults_button_add(sres, GAIM_NOTIFY_BUTTON_IM, |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5444 notify_im); |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5445 |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5446 gaim_notify_searchresults_button_add(sres, GAIM_NOTIFY_BUTTON_ADD, |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5447 notify_add); |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5448 |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5449 for(l = result->matches; l; l = l->next) { |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5450 struct mwResolveMatch *match = l->data; |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5451 GList *row = NULL; |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5452 |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5453 if(!match->id || !match->name) |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5454 continue; |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5455 |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5456 row = g_list_append(row, g_strdup(match->name)); |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5457 row = g_list_append(row, g_strdup(match->id)); |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5458 gaim_notify_searchresults_row_add(sres, row); |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5459 } |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5460 |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5461 msgA = _("Search results for '%s'"); |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5462 msgB = _("The identifier '%s' may possibly refer to any of the following" |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5463 " users. You may add these users to your buddy list or send them" |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5464 " messages with the action buttons below."); |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5465 |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5466 msgA = g_strdup_printf(msgA, result->name); |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5467 msgB = g_strdup_printf(msgB, result->name); |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5468 |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5469 gaim_notify_searchresults(gc, _("Search Results"), |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5470 msgA, msgB, sres, notify_close, NULL); |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5471 |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5472 g_free(msgA); |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5473 g_free(msgB); |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5474 } |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5475 |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5476 |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5477 static void search_resolved(struct mwServiceResolve *srvc, |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5478 guint32 id, guint32 code, GList *results, |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5479 gpointer b) { |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5480 |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5481 GaimConnection *gc = b; |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5482 struct mwResolveResult *res = NULL; |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5483 |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5484 if(results) res = results->data; |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5485 |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5486 if(!code && res && res->matches) { |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5487 search_notify(res, gc); |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5488 |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5489 } else { |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5490 char *msgA, *msgB; |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5491 msgA = _("No matches"); |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5492 msgB = _("The identifier '%s' did not match and users in your" |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5493 " Sametime community."); |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5494 msgB = g_strdup_printf(msgB, NSTR(res->name)); |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5495 |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5496 gaim_notify_error(gc, _("No Matches"), msgA, msgB); |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5497 |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5498 g_free(msgB); |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5499 } |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5500 } |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5501 |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5502 |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5503 static void search_action_cb(GaimConnection *gc, const char *name) { |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5504 struct mwGaimPluginData *pd; |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5505 struct mwServiceResolve *srvc; |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5506 GList *query; |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5507 enum mwResolveFlag flags; |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5508 guint32 req; |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5509 |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5510 pd = gc->proto_data; |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5511 srvc = pd->srvc_resolve; |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5512 |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5513 query = g_list_prepend(NULL, (char *) name); |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5514 flags = mwResolveFlag_FIRST | mwResolveFlag_USERS; |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5515 |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5516 req = mwServiceResolve_resolve(srvc, query, flags, search_resolved, |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5517 gc, NULL); |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5518 g_list_free(query); |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5519 |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5520 if(req == SEARCH_ERROR) { |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5521 /** @todo display error */ |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5522 } |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5523 } |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5524 |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5525 |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5526 static void search_action(GaimPluginAction *act) { |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5527 GaimConnection *gc; |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5528 const char *msgA, *msgB; |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5529 |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5530 gc = act->context; |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5531 |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5532 msgA = _("Search for a user"); |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5533 msgB = _("Enter a name or partial ID in the field below to search" |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5534 " for matching users in your Sametime community."); |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5535 |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5536 gaim_request_input(gc, _("User Search"), msgA, msgB, NULL, |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5537 FALSE, FALSE, NULL, |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5538 _("Search"), G_CALLBACK(search_action_cb), |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5539 _("Cancel"), NULL, |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5540 gc); |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5541 } |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5542 |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5543 |
10977 | 5544 static GList *mw_plugin_actions(GaimPlugin *plugin, gpointer context) { |
5545 GaimPluginAction *act; | |
5546 GList *l = NULL; | |
5547 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5548 act = gaim_plugin_action_new(_("Import Sametime List..."), |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5549 st_import_action); |
10977 | 5550 l = g_list_append(l, act); |
5551 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5552 act = gaim_plugin_action_new(_("Export Sametime List..."), |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5553 st_export_action); |
10977 | 5554 l = g_list_append(l, act); |
5555 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5556 act = gaim_plugin_action_new(_("Add Notes Address Book Group..."), |
10977 | 5557 remote_group_action); |
5558 l = g_list_append(l, act); | |
5559 | |
12630
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5560 act = gaim_plugin_action_new(_("User Search..."), |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5561 search_action); |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5562 l = g_list_append(l, act); |
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5563 |
10977 | 5564 return l; |
5565 } | |
5566 | |
5567 | |
5568 static gboolean mw_plugin_load(GaimPlugin *plugin) { | |
5569 return TRUE; | |
5570 } | |
5571 | |
5572 | |
5573 static gboolean mw_plugin_unload(GaimPlugin *plugin) { | |
5574 return TRUE; | |
5575 } | |
5576 | |
5577 | |
5578 static void mw_plugin_destroy(GaimPlugin *plugin) { | |
5579 g_log_remove_handler(G_LOG_DOMAIN, log_handler[0]); | |
5580 g_log_remove_handler("meanwhile", log_handler[1]); | |
5581 } | |
5582 | |
5583 | |
5584 static GaimPluginInfo mw_plugin_info = { | |
5585 .magic = GAIM_PLUGIN_MAGIC, | |
5586 .major_version = GAIM_MAJOR_VERSION, | |
5587 .minor_version = GAIM_MINOR_VERSION, | |
5588 .type = GAIM_PLUGIN_PROTOCOL, | |
5589 .ui_requirement = NULL, | |
5590 .flags = 0, | |
5591 .dependencies = NULL, | |
5592 .priority = GAIM_PRIORITY_DEFAULT, | |
5593 .id = PLUGIN_ID, | |
5594 .name = PLUGIN_NAME, | |
5595 .version = VERSION, | |
5596 .summary = PLUGIN_SUMMARY, | |
5597 .description = PLUGIN_DESC, | |
5598 .author = PLUGIN_AUTHOR, | |
5599 .homepage = PLUGIN_HOMEPAGE, | |
5600 .load = mw_plugin_load, | |
5601 .unload = mw_plugin_unload, | |
5602 .destroy = mw_plugin_destroy, | |
5603 .ui_info = NULL, | |
5604 .extra_info = &mw_prpl_info, | |
5605 .prefs_info = &mw_plugin_ui_info, | |
5606 .actions = mw_plugin_actions, | |
5607 }; | |
5608 | |
5609 | |
5610 static void mw_log_handler(const gchar *domain, GLogLevelFlags flags, | |
5611 const gchar *msg, gpointer data) { | |
12005
5b3368008513
[gaim-migrate @ 14298]
Christopher O'Brien <siege@pidgin.im>
parents:
11953
diff
changeset
|
5612 |
5b3368008513
[gaim-migrate @ 14298]
Christopher O'Brien <siege@pidgin.im>
parents:
11953
diff
changeset
|
5613 if(! (msg && *msg)) return; |
10977 | 5614 |
5615 /* handle g_log requests via gaim's built-in debug logging */ | |
5616 if(flags & G_LOG_LEVEL_ERROR) { | |
12005
5b3368008513
[gaim-migrate @ 14298]
Christopher O'Brien <siege@pidgin.im>
parents:
11953
diff
changeset
|
5617 gaim_debug_error(domain, "%s\n", msg); |
10977 | 5618 |
5619 } else if(flags & G_LOG_LEVEL_WARNING) { | |
12005
5b3368008513
[gaim-migrate @ 14298]
Christopher O'Brien <siege@pidgin.im>
parents:
11953
diff
changeset
|
5620 gaim_debug_warning(domain, "%s\n", msg); |
10977 | 5621 |
5622 } else { | |
12005
5b3368008513
[gaim-migrate @ 14298]
Christopher O'Brien <siege@pidgin.im>
parents:
11953
diff
changeset
|
5623 gaim_debug_info(domain, "%s\n", msg); |
10977 | 5624 } |
5625 } | |
5626 | |
5627 | |
5628 static void mw_plugin_init(GaimPlugin *plugin) { | |
5629 GaimAccountOption *opt; | |
5630 GList *l = NULL; | |
5631 | |
5632 GLogLevelFlags logflags = | |
5633 G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION; | |
5634 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5635 /* set up the preferences */ |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5636 gaim_prefs_add_none(MW_PRPL_OPT_BASE); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5637 gaim_prefs_add_int(MW_PRPL_OPT_BLIST_ACTION, BLIST_CHOICE_DEFAULT); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5638 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5639 /* remove dead preferences */ |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5640 gaim_prefs_remove(MW_PRPL_OPT_PSYCHIC); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5641 gaim_prefs_remove(MW_PRPL_OPT_SAVE_DYNAMIC); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5642 |
10977 | 5643 /* host to connect to */ |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5644 opt = gaim_account_option_string_new(_("Server"), MW_KEY_HOST, |
10977 | 5645 MW_PLUGIN_DEFAULT_HOST); |
5646 l = g_list_append(l, opt); | |
5647 | |
5648 /* port to connect to */ | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5649 opt = gaim_account_option_int_new(_("Port"), MW_KEY_PORT, |
10977 | 5650 MW_PLUGIN_DEFAULT_PORT); |
5651 l = g_list_append(l, opt); | |
5652 | |
12813
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
5653 #if NB_HACK |
12005
5b3368008513
[gaim-migrate @ 14298]
Christopher O'Brien <siege@pidgin.im>
parents:
11953
diff
changeset
|
5654 /* notesbuddy hack encoding */ |
12489 | 5655 opt = gaim_account_option_string_new(_("NotesBuddy encoding"), |
12005
5b3368008513
[gaim-migrate @ 14298]
Christopher O'Brien <siege@pidgin.im>
parents:
11953
diff
changeset
|
5656 MW_KEY_ENCODING, |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5657 MW_PLUGIN_DEFAULT_ENCODING); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5658 l = g_list_append(l, opt); |
12813
547c199072c8
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
5659 #endif |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5660 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5661 { /* copy the old force login setting from prefs if it's |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5662 there. Don't delete the preference, since there may be more |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5663 than one account that wants to check for it. */ |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5664 gboolean b = FALSE; |
12489 | 5665 const char *label = _("Force login (ignore server redirects)"); |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5666 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5667 if(gaim_prefs_exists(MW_PRPL_OPT_FORCE_LOGIN)) |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5668 b = gaim_prefs_get_bool(MW_PRPL_OPT_FORCE_LOGIN); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5669 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5670 opt = gaim_account_option_bool_new(label, MW_KEY_FORCE, b); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5671 l = g_list_append(l, opt); |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5672 } |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5673 |
12311
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
5674 /* pretend to be Sametime Connect */ |
12489 | 5675 opt = gaim_account_option_bool_new(_("Hide client identity"), |
12311
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
5676 MW_KEY_FAKE_IT, FALSE); |
12312
1c8ea8f3b84e
[gaim-migrate @ 14616]
Christopher O'Brien <siege@pidgin.im>
parents:
12311
diff
changeset
|
5677 l = g_list_append(l, opt); |
12311
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
5678 |
10977 | 5679 mw_prpl_info.protocol_options = l; |
5680 l = NULL; | |
5681 | |
5682 /* forward all our g_log messages to gaim. Generally all the logging | |
5683 calls are using gaim_log directly, but the g_return macros will | |
5684 get caught here */ | |
5685 log_handler[0] = g_log_set_handler(G_LOG_DOMAIN, logflags, | |
5686 mw_log_handler, NULL); | |
5687 | |
5688 /* redirect meanwhile's logging to gaim's */ | |
5689 log_handler[1] = g_log_set_handler("meanwhile", logflags, | |
5690 mw_log_handler, NULL); | |
5691 } | |
5692 | |
5693 | |
11949
47e1723a89d7
[gaim-migrate @ 14240]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
5694 GAIM_INIT_PLUGIN(sametime, mw_plugin_init, mw_plugin_info); |
10977 | 5695 /* The End. */ |
5696 |