Mercurial > pidgin
annotate src/protocols/sametime/sametime.c @ 12744:fcd9477e4476
[gaim-migrate @ 15091]
" Adds an emblem to a buddy if they have a queued message
(hidden conversation). In the large buddy list it is
added in the northwest corner, sliding the existing
northwest emblem (if specified) to the northeast
position and discarding the northeast emblem. In the
small buddy list, the emblem is added to the southeast.
Attached is a patch and an emblem image to be dropped
in pixmaps/status/default/. The emblem image is a
scaled down version of the send-im.png image." -- Casey Harkins
as I asked for this patch, and since there don't seem to be objections to
it (yet), I'm going ahead and applying it.
committer: Tailor Script <tailor@pidgin.im>
| author | Luke Schierer <lschiere@pidgin.im> |
|---|---|
| date | Fri, 06 Jan 2006 04:46:00 +0000 |
| parents | 258871a62600 |
| children | 547c199072c8 |
| 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 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
69 /* project 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 */ | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
94 #define MW_CONNECT_STEPS 9 |
| 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; |
| 10977 | 1225 GaimBlistNodeAction *act; |
| 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)) { |
|
40724851e95e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
1241 act = gaim_blist_node_action_new(_("Invite Group to Conference..."), |
|
40724851e95e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
1242 blist_menu_group_invite, pd, NULL); |
|
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))) { |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1250 act = gaim_blist_node_action_new(_("Get Notes Address Book Info"), |
| 10977 | 1251 blist_menu_nab, pd, NULL); |
| 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 /* start watching for new conversations */ | |
| 1306 gaim_signal_connect(gaim_conversations_get_handle(), | |
| 1307 "conversation-created", gc, | |
| 1308 GAIM_CALLBACK(conversation_created_cb), pd); | |
| 1309 | |
| 1310 /* watch for group extended menu items */ | |
| 1311 gaim_signal_connect(gaim_blist_get_handle(), | |
| 1312 "blist-node-extended-menu", gc, | |
| 1313 GAIM_CALLBACK(blist_node_menu_cb), pd); | |
| 1314 | |
| 1315 /* find all the NAB groups and subscribe to them */ | |
| 1316 blist = gaim_get_blist(); | |
| 1317 for(l = blist->root; l; l = l->next) { | |
| 1318 GaimGroup *group = (GaimGroup *) l; | |
| 1319 enum mwSametimeGroupType gt; | |
| 1320 const char *owner; | |
| 1321 | |
| 1322 if(! GAIM_BLIST_NODE_IS_GROUP(l)) continue; | |
| 1323 | |
| 1324 /* if the group is ownerless, or has an owner and we're not it, | |
| 1325 skip it */ | |
| 1326 owner = gaim_blist_node_get_string(l, GROUP_KEY_OWNER); | |
| 1327 if(!owner || strcmp(owner, gaim_account_get_username(acct))) | |
| 1328 continue; | |
| 1329 | |
| 1330 gt = gaim_blist_node_get_int(l, GROUP_KEY_TYPE); | |
| 1331 if(gt == mwSametimeGroup_DYNAMIC) | |
| 1332 group_add(pd, group); | |
| 1333 } | |
| 1334 | |
| 1335 /* set the aware attributes */ | |
| 1336 /* indicate we understand what AV prefs are, but don't support any */ | |
| 1337 mwServiceAware_setAttributeBoolean(pd->srvc_aware, | |
| 1338 mwAttribute_AV_PREFS_SET, TRUE); | |
| 1339 mwServiceAware_unsetAttribute(pd->srvc_aware, mwAttribute_MICROPHONE); | |
| 1340 mwServiceAware_unsetAttribute(pd->srvc_aware, mwAttribute_SPEAKERS); | |
| 1341 mwServiceAware_unsetAttribute(pd->srvc_aware, mwAttribute_VIDEO_CAMERA); | |
| 1342 | |
| 1343 /* ... but we can do file transfers! */ | |
| 1344 mwServiceAware_setAttributeBoolean(pd->srvc_aware, | |
| 1345 mwAttribute_FILE_TRANSFER, TRUE); | |
|
12266
0e467757b57a
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1346 |
|
0e467757b57a
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1347 blist_init(acct); |
| 10977 | 1348 } |
| 1349 | |
| 1350 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1351 static void session_loginRedirect(struct mwSession *session, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1352 const char *host) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1353 struct mwGaimPluginData *pd; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1354 GaimConnection *gc; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1355 GaimAccount *account; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1356 guint port; |
|
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 pd = mwSession_getClientData(session); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1359 gc = pd->gc; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1360 account = gaim_connection_get_account(gc); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1361 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
|
1362 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1363 if(gaim_account_get_bool(account, MW_KEY_FORCE, FALSE) || |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1364 gaim_proxy_connect(account, host, port, connect_cb, pd)) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1365 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1366 mwSession_forceLogin(session); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1367 } |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1368 } |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1369 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1370 |
|
12266
0e467757b57a
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1371 static void mw_prpl_set_status(GaimAccount *acct, GaimStatus *status); |
|
0e467757b57a
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1372 |
|
0e467757b57a
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1373 |
| 10977 | 1374 /** called from mw_session_stateChange when the session's state is |
| 1375 mwSession_STARTED. Any finalizing of start-up stuff should go | |
| 1376 here */ | |
| 1377 static void session_started(struct mwGaimPluginData *pd) { | |
|
12266
0e467757b57a
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1378 GaimStatus *status; |
|
0e467757b57a
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1379 GaimAccount *acct; |
|
0e467757b57a
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1380 |
|
0e467757b57a
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1381 acct = gaim_connection_get_account(pd->gc); |
|
0e467757b57a
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1382 status = gaim_account_get_active_status(acct); |
|
0e467757b57a
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1383 mw_prpl_set_status(acct, status); |
| 10977 | 1384 |
| 1385 /* use our services to do neat things */ | |
| 1386 services_starting(pd); | |
| 1387 } | |
| 1388 | |
| 1389 | |
| 1390 static void mw_session_stateChange(struct mwSession *session, | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1391 enum mwSessionState state, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1392 gpointer info) { |
| 10977 | 1393 struct mwGaimPluginData *pd; |
| 1394 GaimConnection *gc; | |
| 1395 char *msg = NULL; | |
| 1396 | |
| 1397 pd = mwSession_getClientData(session); | |
| 1398 gc = pd->gc; | |
| 1399 | |
| 1400 switch(state) { | |
| 1401 case mwSession_STARTING: | |
| 1402 msg = _("Sending Handshake"); | |
| 1403 gaim_connection_update_progress(gc, msg, 2, MW_CONNECT_STEPS); | |
| 1404 break; | |
| 1405 | |
| 1406 case mwSession_HANDSHAKE: | |
| 1407 msg = _("Waiting for Handshake Acknowledgement"); | |
| 1408 gaim_connection_update_progress(gc, msg, 3, MW_CONNECT_STEPS); | |
| 1409 break; | |
| 1410 | |
| 1411 case mwSession_HANDSHAKE_ACK: | |
| 1412 msg = _("Handshake Acknowledged, Sending Login"); | |
| 1413 gaim_connection_update_progress(gc, msg, 4, MW_CONNECT_STEPS); | |
| 1414 break; | |
| 1415 | |
| 1416 case mwSession_LOGIN: | |
| 1417 msg = _("Waiting for Login Acknowledgement"); | |
| 1418 gaim_connection_update_progress(gc, msg, 5, MW_CONNECT_STEPS); | |
| 1419 break; | |
| 1420 | |
| 1421 case mwSession_LOGIN_REDIR: | |
| 1422 msg = _("Login Redirected"); | |
| 1423 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
|
1424 session_loginRedirect(session, info); |
| 10977 | 1425 break; |
| 1426 | |
|
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
1427 case mwSession_LOGIN_CONT: |
|
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
1428 msg = _("Forcing Login"); |
|
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
1429 gaim_connection_update_progress(gc, msg, 7, MW_CONNECT_STEPS); |
|
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
1430 |
| 10977 | 1431 case mwSession_LOGIN_ACK: |
| 1432 msg = _("Login Acknowledged"); | |
|
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
1433 gaim_connection_update_progress(gc, msg, 8, MW_CONNECT_STEPS); |
| 10977 | 1434 break; |
| 1435 | |
| 1436 case mwSession_STARTED: | |
| 1437 msg = _("Connected to Sametime Community Server"); | |
|
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
1438 gaim_connection_update_progress(gc, msg, 9, MW_CONNECT_STEPS); |
| 10977 | 1439 gaim_connection_set_state(gc, GAIM_CONNECTED); |
| 1440 | |
| 1441 session_started(pd); | |
| 1442 break; | |
| 1443 | |
| 1444 case mwSession_STOPPING: | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1445 if(GPOINTER_TO_UINT(info) & ERR_FAILURE) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1446 msg = mwError(GPOINTER_TO_UINT(info)); |
| 10977 | 1447 gaim_connection_error(gc, msg); |
| 1448 g_free(msg); | |
| 1449 } | |
| 1450 break; | |
| 1451 | |
| 1452 case mwSession_STOPPED: | |
| 1453 break; | |
| 1454 | |
| 1455 case mwSession_UNKNOWN: | |
| 1456 default: | |
| 1457 DEBUG_WARN("session in unknown state\n"); | |
| 1458 } | |
| 1459 } | |
| 1460 | |
| 1461 | |
| 1462 static void mw_session_setPrivacyInfo(struct mwSession *session) { | |
| 1463 struct mwGaimPluginData *pd; | |
| 1464 GaimConnection *gc; | |
| 1465 GaimAccount *acct; | |
| 1466 struct mwPrivacyInfo *privacy; | |
| 1467 GSList *l, **ll; | |
| 1468 guint count; | |
| 1469 | |
| 1470 DEBUG_INFO("privacy information set from server\n"); | |
| 1471 | |
| 1472 g_return_if_fail(session != NULL); | |
| 1473 | |
| 1474 pd = mwSession_getClientData(session); | |
| 1475 g_return_if_fail(pd != NULL); | |
| 1476 | |
| 1477 gc = pd->gc; | |
| 1478 g_return_if_fail(gc != NULL); | |
| 1479 | |
| 1480 acct = gaim_connection_get_account(gc); | |
| 1481 g_return_if_fail(acct != NULL); | |
| 1482 | |
| 1483 privacy = mwSession_getPrivacyInfo(session); | |
| 1484 count = privacy->count; | |
| 1485 | |
| 1486 ll = (privacy->deny)? &acct->deny: &acct->permit; | |
| 1487 for(l = *ll; l; l = l->next) g_free(l->data); | |
| 1488 g_slist_free(*ll); | |
| 1489 l = *ll = NULL; | |
| 1490 | |
| 1491 while(count--) { | |
| 1492 struct mwUserItem *u = privacy->users + count; | |
| 1493 l = g_slist_prepend(l, g_strdup(u->id)); | |
| 1494 } | |
| 1495 *ll = l; | |
| 1496 } | |
| 1497 | |
| 1498 | |
| 1499 static void mw_session_setUserStatus(struct mwSession *session) { | |
| 1500 struct mwGaimPluginData *pd; | |
| 1501 GaimConnection *gc; | |
| 1502 struct mwAwareIdBlock idb = { mwAware_USER, NULL, NULL }; | |
| 1503 struct mwUserStatus *stat; | |
| 1504 | |
| 1505 g_return_if_fail(session != NULL); | |
| 1506 | |
| 1507 pd = mwSession_getClientData(session); | |
| 1508 g_return_if_fail(pd != NULL); | |
| 1509 | |
| 1510 gc = pd->gc; | |
| 1511 g_return_if_fail(gc != NULL); | |
| 1512 | |
| 1513 idb.user = mwSession_getProperty(session, mwSession_AUTH_USER_ID); | |
| 1514 stat = mwSession_getUserStatus(session); | |
| 1515 | |
| 1516 /* trigger an update of our own status if we're in the buddy list */ | |
| 1517 mwServiceAware_setStatus(pd->srvc_aware, &idb, stat); | |
| 1518 } | |
| 1519 | |
| 1520 | |
| 1521 static void mw_session_admin(struct mwSession *session, | |
| 1522 const char *text) { | |
| 1523 | |
| 1524 GaimConnection *gc = session_to_gc(session); | |
| 1525 g_return_if_fail(gc != NULL); | |
| 1526 | |
| 1527 /** @todo Admin alerts should probably be in a conversation window | |
| 1528 rather than a gaim_notify_message. Or in some sort of updating | |
| 1529 dialog, or something. */ | |
| 1530 | |
| 1531 gaim_notify_message(gc, GAIM_NOTIFY_MSG_INFO, _("Admin Alert"), | |
| 1532 text, NULL, NULL, NULL); | |
| 1533 } | |
| 1534 | |
| 1535 | |
| 1536 /** called from read_cb, attempts to read available data from sock and | |
| 1537 pass it to the session, passing back the return code from the read | |
| 1538 call for handling in read_cb */ | |
| 1539 static int read_recv(struct mwSession *session, int sock) { | |
|
12311
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
1540 guchar buf[BUF_LEN]; |
| 10977 | 1541 int len; |
| 1542 | |
| 1543 len = read(sock, buf, BUF_LEN); | |
| 1544 if(len > 0) mwSession_recv(session, buf, len); | |
| 1545 | |
| 1546 return len; | |
| 1547 } | |
| 1548 | |
| 1549 | |
| 1550 /** callback triggered from gaim_input_add, watches the socked for | |
| 1551 available data to be processed by the session */ | |
| 1552 static void read_cb(gpointer data, gint source, | |
| 1553 GaimInputCondition cond) { | |
| 1554 | |
| 1555 struct mwGaimPluginData *pd = data; | |
| 1556 int ret = 0, err = 0; | |
| 1557 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1558 /* 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
|
1559 won't happen anymore. */ |
|
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
1560 if(! cond) return; |
|
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
1561 |
| 10977 | 1562 g_return_if_fail(pd != NULL); |
|
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
1563 g_return_if_fail(cond & GAIM_INPUT_READ); |
|
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
1564 |
|
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
1565 ret = read_recv(pd->session, pd->socket); |
| 10977 | 1566 |
| 1567 /* normal operation ends here */ | |
| 1568 if(ret > 0) return; | |
| 1569 | |
|
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
1570 /* fetch the global error value */ |
| 10977 | 1571 err = errno; |
| 1572 | |
| 1573 /* read problem occured if we're here, so we'll need to take care of | |
| 1574 it and clean up internal state */ | |
| 1575 | |
| 1576 if(pd->socket) { | |
| 1577 close(pd->socket); | |
| 1578 pd->socket = 0; | |
| 1579 } | |
| 1580 | |
| 1581 if(pd->gc->inpa) { | |
| 1582 gaim_input_remove(pd->gc->inpa); | |
| 1583 pd->gc->inpa = 0; | |
| 1584 } | |
| 1585 | |
| 1586 if(! ret) { | |
| 1587 DEBUG_INFO("connection reset\n"); | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1588 gaim_connection_error(pd->gc, _("Connection reset")); |
| 10977 | 1589 |
| 1590 } else if(ret < 0) { | |
| 1591 char *msg = strerror(err); | |
|
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
1592 |
| 10977 | 1593 DEBUG_INFO("error in read callback: %s\n", msg); |
| 1594 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1595 msg = g_strdup_printf(_("Error reading from socket: %s"), msg); |
| 10977 | 1596 gaim_connection_error(pd->gc, msg); |
| 1597 g_free(msg); | |
| 1598 } | |
| 1599 } | |
| 1600 | |
| 1601 | |
| 1602 /** Callback passed to gaim_proxy_connect when an account is logged | |
| 1603 in, and if the session logging in receives a redirect message */ | |
| 1604 static void connect_cb(gpointer data, gint source, | |
| 1605 GaimInputCondition cond) { | |
| 1606 | |
| 1607 struct mwGaimPluginData *pd = data; | |
| 1608 GaimConnection *gc = pd->gc; | |
| 1609 | |
| 1610 if(! g_list_find(gaim_connections_get_all(), pd->gc)) { | |
| 1611 close(source); | |
| 1612 g_return_if_reached(); | |
| 1613 } | |
| 1614 | |
| 1615 if(source < 0) { | |
| 1616 /* connection failed */ | |
| 1617 | |
| 1618 if(pd->socket) { | |
| 1619 /* this is a redirect connect, force login on existing socket */ | |
| 1620 mwSession_forceLogin(pd->session); | |
| 1621 | |
| 1622 } else { | |
| 1623 /* this is a regular connect, error out */ | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1624 gaim_connection_error(pd->gc, _("Unable to connect to host")); |
| 10977 | 1625 } |
| 1626 | |
| 1627 return; | |
| 1628 } | |
| 1629 | |
| 1630 if(pd->socket) { | |
| 1631 /* stop any existing login attempt */ | |
| 1632 mwSession_stop(pd->session, ERR_SUCCESS); | |
| 1633 } | |
| 1634 | |
| 1635 pd->socket = source; | |
| 1636 gc->inpa = gaim_input_add(source, GAIM_INPUT_READ, read_cb, pd); | |
| 1637 | |
| 1638 mwSession_start(pd->session); | |
| 1639 } | |
| 1640 | |
| 1641 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1642 static void mw_session_announce(struct mwSession *s, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1643 struct mwLoginInfo *from, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1644 gboolean may_reply, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1645 const char *text) { |
| 10977 | 1646 struct mwGaimPluginData *pd; |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1647 GaimAccount *acct; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1648 GaimConversation *conv; |
|
12126
35c4797c5c57
[gaim-migrate @ 14426]
Richard Laager <rlaager@wiktel.com>
parents:
12107
diff
changeset
|
1649 GaimBuddy *buddy; |
|
12263
8190a70d2c34
[gaim-migrate @ 14565]
Christopher O'Brien <siege@pidgin.im>
parents:
12216
diff
changeset
|
1650 char *who = from->user_id; |
|
8190a70d2c34
[gaim-migrate @ 14565]
Christopher O'Brien <siege@pidgin.im>
parents:
12216
diff
changeset
|
1651 char *msg; |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1652 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1653 pd = mwSession_getClientData(s); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1654 acct = gaim_connection_get_account(pd->gc); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1655 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
|
1656 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
|
1657 |
|
12126
35c4797c5c57
[gaim-migrate @ 14426]
Richard Laager <rlaager@wiktel.com>
parents:
12107
diff
changeset
|
1658 buddy = gaim_find_buddy(acct, who); |
|
12263
8190a70d2c34
[gaim-migrate @ 14565]
Christopher O'Brien <siege@pidgin.im>
parents:
12216
diff
changeset
|
1659 if(buddy) who = (char *) gaim_buddy_get_contact_alias(buddy); |
|
8190a70d2c34
[gaim-migrate @ 14565]
Christopher O'Brien <siege@pidgin.im>
parents:
12216
diff
changeset
|
1660 |
|
8190a70d2c34
[gaim-migrate @ 14565]
Christopher O'Brien <siege@pidgin.im>
parents:
12216
diff
changeset
|
1661 who = g_strdup_printf(_("Announcement from %s"), who); |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1662 msg = gaim_markup_linkify(text); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1663 |
|
12263
8190a70d2c34
[gaim-migrate @ 14565]
Christopher O'Brien <siege@pidgin.im>
parents:
12216
diff
changeset
|
1664 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
|
1665 g_free(who); |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1666 g_free(msg); |
| 10977 | 1667 } |
| 1668 | |
| 1669 | |
| 1670 static struct mwSessionHandler mw_session_handler = { | |
| 1671 .io_write = mw_session_io_write, | |
| 1672 .io_close = mw_session_io_close, | |
| 1673 .clear = mw_session_clear, | |
| 1674 .on_stateChange = mw_session_stateChange, | |
| 1675 .on_setPrivacyInfo = mw_session_setPrivacyInfo, | |
| 1676 .on_setUserStatus = mw_session_setUserStatus, | |
| 1677 .on_admin = mw_session_admin, | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1678 .on_announce = mw_session_announce, |
| 10977 | 1679 }; |
| 1680 | |
| 1681 | |
| 1682 static void mw_aware_on_attrib(struct mwServiceAware *srvc, | |
| 1683 struct mwAwareAttribute *attrib) { | |
| 1684 | |
| 1685 ; /** @todo handle server attributes. There may be some stuff we | |
| 1686 actually want to look for, but I'm not aware of anything right | |
| 1687 now.*/ | |
| 1688 } | |
| 1689 | |
| 1690 | |
| 1691 static void mw_aware_clear(struct mwServiceAware *srvc) { | |
| 1692 ; /* nothing for now */ | |
| 1693 } | |
| 1694 | |
| 1695 | |
| 1696 static struct mwAwareHandler mw_aware_handler = { | |
| 1697 .on_attrib = mw_aware_on_attrib, | |
| 1698 .clear = mw_aware_clear, | |
| 1699 }; | |
| 1700 | |
| 1701 | |
| 1702 static struct mwServiceAware *mw_srvc_aware_new(struct mwSession *s) { | |
| 1703 struct mwServiceAware *srvc; | |
| 1704 srvc = mwServiceAware_new(s, &mw_aware_handler); | |
| 1705 return srvc; | |
| 1706 }; | |
| 1707 | |
| 1708 | |
| 1709 static void mw_conf_invited(struct mwConference *conf, | |
| 1710 struct mwLoginInfo *inviter, | |
| 1711 const char *invitation) { | |
| 1712 | |
| 1713 struct mwServiceConference *srvc; | |
| 1714 struct mwSession *session; | |
| 1715 struct mwGaimPluginData *pd; | |
| 1716 GaimConnection *gc; | |
| 1717 | |
| 1718 char *c_inviter, *c_name, *c_topic, *c_invitation; | |
| 1719 GHashTable *ht; | |
| 1720 | |
| 1721 srvc = mwConference_getService(conf); | |
| 1722 session = mwService_getSession(MW_SERVICE(srvc)); | |
| 1723 pd = mwSession_getClientData(session); | |
| 1724 gc = pd->gc; | |
| 1725 | |
| 1726 ht = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, g_free); | |
| 1727 | |
| 1728 c_inviter = g_strdup(inviter->user_id); | |
| 1729 g_hash_table_insert(ht, CHAT_KEY_CREATOR, c_inviter); | |
| 1730 | |
| 1731 c_name = g_strdup(mwConference_getName(conf)); | |
| 1732 g_hash_table_insert(ht, CHAT_KEY_NAME, c_name); | |
| 1733 | |
| 1734 c_topic = g_strdup(mwConference_getTitle(conf)); | |
| 1735 g_hash_table_insert(ht, CHAT_KEY_TOPIC, c_topic); | |
| 1736 | |
| 1737 c_invitation = g_strdup(invitation); | |
| 1738 g_hash_table_insert(ht, CHAT_KEY_INVITE, c_invitation); | |
| 1739 | |
| 1740 DEBUG_INFO("received invitation from '%s' to join ('%s','%s'): '%s'\n", | |
| 1741 NSTR(c_inviter), NSTR(c_name), | |
| 1742 NSTR(c_topic), NSTR(c_invitation)); | |
| 1743 | |
|
12742
258871a62600
[gaim-migrate @ 15089]
Christopher O'Brien <siege@pidgin.im>
parents:
12735
diff
changeset
|
1744 if(! c_topic) c_topic = "(no title)"; |
|
258871a62600
[gaim-migrate @ 15089]
Christopher O'Brien <siege@pidgin.im>
parents:
12735
diff
changeset
|
1745 if(! c_invitation) c_invitation = "(no message)"; |
| 10977 | 1746 serv_got_chat_invite(gc, c_topic, c_inviter, c_invitation, ht); |
| 1747 } | |
| 1748 | |
| 1749 | |
| 1750 /* The following mess helps us relate a mwConference to a GaimConvChat | |
| 1751 in the various forms by which either may be indicated */ | |
| 1752 | |
| 1753 #define CONF_TO_ID(conf) (GPOINTER_TO_INT(conf)) | |
| 1754 #define ID_TO_CONF(pd, id) (conf_find_by_id((pd), (id))) | |
| 1755 | |
| 1756 #define CHAT_TO_ID(chat) (gaim_conv_chat_get_id(chat)) | |
| 1757 #define ID_TO_CHAT(id) (gaim_find_chat(id)) | |
| 1758 | |
|
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
1759 #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
|
1760 #define CONF_TO_CHAT(conf) (ID_TO_CHAT(CONF_TO_ID(conf))) |
| 10977 | 1761 |
| 1762 | |
| 1763 static struct mwConference * | |
| 1764 conf_find_by_id(struct mwGaimPluginData *pd, int id) { | |
| 1765 | |
| 1766 struct mwServiceConference *srvc = pd->srvc_conf; | |
| 1767 struct mwConference *conf = NULL; | |
| 1768 GList *l, *ll; | |
| 1769 | |
| 1770 ll = mwServiceConference_getConferences(srvc); | |
| 1771 for(l = ll; l; l = l->next) { | |
| 1772 struct mwConference *c = l->data; | |
| 1773 GaimConvChat *h = mwConference_getClientData(c); | |
| 1774 | |
| 1775 if(CHAT_TO_ID(h) == id) { | |
| 1776 conf = c; | |
| 1777 break; | |
| 1778 } | |
| 1779 } | |
| 1780 g_list_free(ll); | |
| 1781 | |
| 1782 return conf; | |
| 1783 } | |
| 1784 | |
| 1785 | |
| 1786 static void mw_conf_opened(struct mwConference *conf, GList *members) { | |
| 1787 struct mwServiceConference *srvc; | |
| 1788 struct mwSession *session; | |
| 1789 struct mwGaimPluginData *pd; | |
| 1790 GaimConnection *gc; | |
| 1791 GaimConversation *g_conf; | |
| 1792 | |
| 1793 const char *n = mwConference_getName(conf); | |
|
12742
258871a62600
[gaim-migrate @ 15089]
Christopher O'Brien <siege@pidgin.im>
parents:
12735
diff
changeset
|
1794 const char *t = mwConference_getTitle(conf); |
| 10977 | 1795 |
| 1796 DEBUG_INFO("conf %s opened, %u initial members\n", | |
| 1797 NSTR(n), g_list_length(members)); | |
| 1798 | |
| 1799 srvc = mwConference_getService(conf); | |
| 1800 session = mwService_getSession(MW_SERVICE(srvc)); | |
| 1801 pd = mwSession_getClientData(session); | |
| 1802 gc = pd->gc; | |
| 1803 | |
|
12742
258871a62600
[gaim-migrate @ 15089]
Christopher O'Brien <siege@pidgin.im>
parents:
12735
diff
changeset
|
1804 if(! t) t = "(no title)"; |
|
258871a62600
[gaim-migrate @ 15089]
Christopher O'Brien <siege@pidgin.im>
parents:
12735
diff
changeset
|
1805 g_conf = serv_got_joined_chat(gc, CONF_TO_ID(conf), t); |
| 10977 | 1806 |
| 1807 mwConference_setClientData(conf, GAIM_CONV_CHAT(g_conf), NULL); | |
| 1808 | |
| 1809 for(; members; members = members->next) { | |
| 1810 struct mwLoginInfo *peer = members->data; | |
| 1811 gaim_conv_chat_add_user(GAIM_CONV_CHAT(g_conf), peer->user_id, | |
| 1812 NULL, GAIM_CBFLAGS_NONE, FALSE); | |
| 1813 } | |
| 1814 } | |
| 1815 | |
| 1816 | |
| 1817 static void mw_conf_closed(struct mwConference *conf, guint32 reason) { | |
| 1818 struct mwServiceConference *srvc; | |
| 1819 struct mwSession *session; | |
| 1820 struct mwGaimPluginData *pd; | |
| 1821 GaimConnection *gc; | |
| 1822 | |
| 1823 const char *n = mwConference_getName(conf); | |
| 1824 char *msg = mwError(reason); | |
| 1825 | |
| 1826 DEBUG_INFO("conf %s closed, 0x%08x\n", NSTR(n), reason); | |
| 1827 | |
| 1828 srvc = mwConference_getService(conf); | |
| 1829 session = mwService_getSession(MW_SERVICE(srvc)); | |
| 1830 pd = mwSession_getClientData(session); | |
| 1831 gc = pd->gc; | |
| 1832 | |
| 1833 serv_got_chat_left(gc, CONF_TO_ID(conf)); | |
| 1834 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1835 gaim_notify_error(gc, _("Conference Closed"), NULL, msg); |
| 10977 | 1836 g_free(msg); |
| 1837 } | |
| 1838 | |
| 1839 | |
| 1840 static void mw_conf_peer_joined(struct mwConference *conf, | |
| 1841 struct mwLoginInfo *peer) { | |
| 1842 | |
| 1843 struct mwServiceConference *srvc; | |
| 1844 struct mwSession *session; | |
| 1845 struct mwGaimPluginData *pd; | |
| 1846 GaimConnection *gc; | |
| 1847 GaimConvChat *g_conf; | |
| 1848 | |
| 1849 const char *n = mwConference_getName(conf); | |
| 1850 | |
| 1851 DEBUG_INFO("%s joined conf %s\n", NSTR(peer->user_id), NSTR(n)); | |
| 1852 | |
| 1853 srvc = mwConference_getService(conf); | |
| 1854 session = mwService_getSession(MW_SERVICE(srvc)); | |
| 1855 pd = mwSession_getClientData(session); | |
| 1856 gc = pd->gc; | |
| 1857 | |
| 1858 g_conf = mwConference_getClientData(conf); | |
| 1859 g_return_if_fail(g_conf != NULL); | |
| 1860 | |
| 1861 gaim_conv_chat_add_user(g_conf, peer->user_id, | |
| 1862 NULL, GAIM_CBFLAGS_NONE, TRUE); | |
| 1863 } | |
| 1864 | |
| 1865 | |
| 1866 static void mw_conf_peer_parted(struct mwConference *conf, | |
| 1867 struct mwLoginInfo *peer) { | |
| 1868 | |
| 1869 struct mwServiceConference *srvc; | |
| 1870 struct mwSession *session; | |
| 1871 struct mwGaimPluginData *pd; | |
| 1872 GaimConnection *gc; | |
| 1873 GaimConvChat *g_conf; | |
| 1874 | |
| 1875 const char *n = mwConference_getName(conf); | |
| 1876 | |
| 1877 DEBUG_INFO("%s left conf %s\n", NSTR(peer->user_id), NSTR(n)); | |
| 1878 | |
| 1879 srvc = mwConference_getService(conf); | |
| 1880 session = mwService_getSession(MW_SERVICE(srvc)); | |
| 1881 pd = mwSession_getClientData(session); | |
| 1882 gc = pd->gc; | |
| 1883 | |
| 1884 g_conf = mwConference_getClientData(conf); | |
| 1885 g_return_if_fail(g_conf != NULL); | |
| 1886 | |
| 1887 gaim_conv_chat_remove_user(g_conf, peer->user_id, NULL); | |
| 1888 } | |
| 1889 | |
| 1890 | |
| 1891 static void mw_conf_text(struct mwConference *conf, | |
| 1892 struct mwLoginInfo *who, const char *text) { | |
| 1893 | |
| 1894 struct mwServiceConference *srvc; | |
| 1895 struct mwSession *session; | |
| 1896 struct mwGaimPluginData *pd; | |
| 1897 GaimConnection *gc; | |
| 1898 char *esc; | |
| 1899 | |
| 1900 srvc = mwConference_getService(conf); | |
| 1901 session = mwService_getSession(MW_SERVICE(srvc)); | |
| 1902 pd = mwSession_getClientData(session); | |
| 1903 gc = pd->gc; | |
| 1904 | |
| 1905 esc = g_markup_escape_text(text, -1); | |
| 1906 serv_got_chat_in(gc, CONF_TO_ID(conf), who->user_id, 0, esc, time(NULL)); | |
| 1907 g_free(esc); | |
| 1908 } | |
| 1909 | |
| 1910 | |
| 1911 static void mw_conf_typing(struct mwConference *conf, | |
| 1912 struct mwLoginInfo *who, gboolean typing) { | |
| 1913 | |
| 1914 /* gaim really has no good way to expose this to the user. */ | |
| 1915 | |
| 1916 const char *n = mwConference_getName(conf); | |
| 1917 const char *w = who->user_id; | |
| 1918 | |
| 1919 if(typing) { | |
| 1920 DEBUG_INFO("%s in conf %s: <typing>\n", NSTR(w), NSTR(n)); | |
| 1921 | |
| 1922 } else { | |
| 1923 DEBUG_INFO("%s in conf %s: <stopped typing>\n", NSTR(w), NSTR(n)); | |
| 1924 } | |
| 1925 } | |
| 1926 | |
| 1927 | |
| 1928 static void mw_conf_clear(struct mwServiceConference *srvc) { | |
| 1929 ; | |
| 1930 } | |
| 1931 | |
| 1932 | |
| 1933 static struct mwConferenceHandler mw_conference_handler = { | |
| 1934 .on_invited = mw_conf_invited, | |
| 1935 .conf_opened = mw_conf_opened, | |
| 1936 .conf_closed = mw_conf_closed, | |
| 1937 .on_peer_joined = mw_conf_peer_joined, | |
| 1938 .on_peer_parted = mw_conf_peer_parted, | |
| 1939 .on_text = mw_conf_text, | |
| 1940 .on_typing = mw_conf_typing, | |
| 1941 .clear = mw_conf_clear, | |
| 1942 }; | |
| 1943 | |
| 1944 | |
| 1945 static struct mwServiceConference *mw_srvc_conf_new(struct mwSession *s) { | |
| 1946 struct mwServiceConference *srvc; | |
| 1947 srvc = mwServiceConference_new(s, &mw_conference_handler); | |
| 1948 return srvc; | |
| 1949 } | |
| 1950 | |
| 1951 | |
| 1952 static void ft_incoming_cancel(GaimXfer *xfer) { | |
| 1953 /* incoming transfer rejected or canceled in-progress */ | |
| 1954 struct mwFileTransfer *ft = xfer->data; | |
| 1955 if(ft) mwFileTransfer_reject(ft); | |
| 1956 } | |
| 1957 | |
| 1958 | |
| 1959 static void ft_incoming_init(GaimXfer *xfer) { | |
| 1960 /* incoming transfer accepted */ | |
| 1961 | |
| 1962 /* - accept the mwFileTransfer | |
| 1963 - open/create the local FILE "wb" | |
| 1964 - stick the FILE's fp in xfer->dest_fp | |
| 1965 */ | |
| 1966 | |
| 1967 struct mwFileTransfer *ft; | |
| 1968 FILE *fp; | |
| 1969 | |
| 1970 ft = xfer->data; | |
| 1971 | |
| 1972 fp = g_fopen(xfer->local_filename, "wb"); | |
| 1973 if(! fp) { | |
| 1974 mwFileTransfer_cancel(ft); | |
| 1975 return; | |
| 1976 } | |
| 1977 | |
| 1978 xfer->dest_fp = fp; | |
| 1979 mwFileTransfer_accept(ft); | |
| 1980 } | |
| 1981 | |
| 1982 | |
| 1983 static void mw_ft_offered(struct mwFileTransfer *ft) { | |
| 1984 /* | |
| 1985 - create a gaim ft object | |
| 1986 - offer it | |
| 1987 */ | |
| 1988 | |
| 1989 struct mwServiceFileTransfer *srvc; | |
| 1990 struct mwSession *session; | |
| 1991 struct mwGaimPluginData *pd; | |
| 1992 GaimConnection *gc; | |
| 1993 GaimAccount *acct; | |
| 1994 const char *who; | |
| 1995 GaimXfer *xfer; | |
| 1996 | |
| 1997 /* @todo add some safety checks */ | |
| 1998 srvc = mwFileTransfer_getService(ft); | |
| 1999 session = mwService_getSession(MW_SERVICE(srvc)); | |
| 2000 pd = mwSession_getClientData(session); | |
| 2001 gc = pd->gc; | |
| 2002 acct = gaim_connection_get_account(gc); | |
| 2003 | |
| 2004 who = mwFileTransfer_getUser(ft)->user; | |
| 2005 | |
| 2006 DEBUG_INFO("file transfer %p offered\n", ft); | |
| 2007 DEBUG_INFO(" from: %s\n", NSTR(who)); | |
| 2008 DEBUG_INFO(" file: %s\n", NSTR(mwFileTransfer_getFileName(ft))); | |
| 2009 DEBUG_INFO(" size: %u\n", mwFileTransfer_getFileSize(ft)); | |
| 2010 DEBUG_INFO(" text: %s\n", NSTR(mwFileTransfer_getMessage(ft))); | |
| 2011 | |
| 2012 xfer = gaim_xfer_new(acct, GAIM_XFER_RECEIVE, who); | |
| 2013 | |
| 2014 gaim_xfer_ref(xfer); | |
| 2015 mwFileTransfer_setClientData(ft, xfer, (GDestroyNotify) gaim_xfer_unref); | |
| 2016 xfer->data = ft; | |
| 2017 | |
| 2018 gaim_xfer_set_init_fnc(xfer, ft_incoming_init); | |
| 2019 gaim_xfer_set_cancel_recv_fnc(xfer, ft_incoming_cancel); | |
| 2020 gaim_xfer_set_request_denied_fnc(xfer, ft_incoming_cancel); | |
| 2021 | |
| 2022 gaim_xfer_set_filename(xfer, mwFileTransfer_getFileName(ft)); | |
| 2023 gaim_xfer_set_size(xfer, mwFileTransfer_getFileSize(ft)); | |
| 2024 gaim_xfer_set_message(xfer, mwFileTransfer_getMessage(ft)); | |
| 2025 | |
| 2026 gaim_xfer_request(xfer); | |
| 2027 } | |
| 2028 | |
| 2029 | |
| 2030 static void ft_send(struct mwFileTransfer *ft, FILE *fp) { | |
|
12311
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
2031 guchar buf[BUF_LONG]; |
| 10977 | 2032 struct mwOpaque o = { .data = buf, .len = BUF_LONG }; |
| 2033 guint32 rem; | |
| 2034 GaimXfer *xfer; | |
| 2035 | |
| 2036 xfer = mwFileTransfer_getClientData(ft); | |
| 2037 | |
| 2038 rem = mwFileTransfer_getRemaining(ft); | |
| 2039 if(rem < BUF_LONG) o.len = rem; | |
| 2040 | |
| 2041 if(fread(buf, (size_t) o.len, 1, fp)) { | |
| 2042 | |
| 2043 /* calculate progress first. update is displayed upon ack */ | |
| 2044 xfer->bytes_sent += o.len; | |
| 2045 xfer->bytes_remaining -= o.len; | |
| 2046 | |
| 2047 /* ... send data second */ | |
| 2048 mwFileTransfer_send(ft, &o); | |
| 2049 | |
| 2050 } else { | |
| 2051 int err = errno; | |
| 2052 DEBUG_WARN("problem reading from file %s: %s", | |
| 2053 NSTR(mwFileTransfer_getFileName(ft)), strerror(err)); | |
| 2054 | |
| 2055 mwFileTransfer_cancel(ft); | |
| 2056 } | |
| 2057 } | |
| 2058 | |
| 2059 | |
| 2060 static gboolean ft_idle_cb(struct mwFileTransfer *ft) { | |
| 2061 GaimXfer *xfer = mwFileTransfer_getClientData(ft); | |
| 2062 g_return_val_if_fail(xfer != NULL, FALSE); | |
| 2063 | |
| 2064 xfer->watcher = 0; | |
| 2065 ft_send(ft, xfer->dest_fp); | |
| 2066 | |
| 2067 return FALSE; | |
| 2068 } | |
| 2069 | |
| 2070 | |
| 2071 static void mw_ft_opened(struct mwFileTransfer *ft) { | |
| 2072 /* | |
| 2073 - get gaim ft from client data in ft | |
| 2074 - set the state to active | |
| 2075 */ | |
| 2076 | |
| 2077 GaimXfer *xfer; | |
| 2078 | |
| 2079 xfer = mwFileTransfer_getClientData(ft); | |
| 2080 | |
| 2081 if(! xfer) { | |
| 2082 mwFileTransfer_cancel(ft); | |
| 2083 mwFileTransfer_free(ft); | |
| 2084 g_return_if_reached(); | |
| 2085 } | |
| 2086 | |
| 2087 gaim_xfer_update_progress(xfer); | |
| 2088 | |
| 2089 if(gaim_xfer_get_type(xfer) == GAIM_XFER_SEND) { | |
| 2090 xfer->watcher = g_idle_add((GSourceFunc)ft_idle_cb, ft); | |
| 2091 xfer->dest_fp = g_fopen(xfer->local_filename, "rb"); | |
| 2092 } | |
| 2093 } | |
| 2094 | |
| 2095 | |
| 2096 static void mw_ft_closed(struct mwFileTransfer *ft, guint32 code) { | |
| 2097 /* | |
| 2098 - get gaim ft from client data in ft | |
| 2099 - indicate rejection/cancelation/completion | |
| 2100 - free the file transfer itself | |
| 2101 */ | |
| 2102 | |
| 2103 GaimXfer *xfer; | |
| 2104 | |
| 2105 xfer = mwFileTransfer_getClientData(ft); | |
| 2106 if(xfer) { | |
| 2107 xfer->data = NULL; | |
| 2108 | |
| 2109 if(mwFileTransfer_isDone(ft)) { | |
| 2110 gaim_xfer_set_completed(xfer, TRUE); | |
| 2111 gaim_xfer_end(xfer); | |
| 2112 | |
| 2113 } else if(mwFileTransfer_isCancelLocal(ft)) { | |
| 2114 /* calling gaim_xfer_cancel_local is redundant, since that's | |
| 2115 probably what triggered this function to be called */ | |
| 2116 ; | |
| 2117 | |
| 2118 } else if(mwFileTransfer_isCancelRemote(ft)) { | |
| 2119 /* steal the reference for the xfer */ | |
| 2120 mwFileTransfer_setClientData(ft, NULL, NULL); | |
| 2121 gaim_xfer_cancel_remote(xfer); | |
| 2122 | |
| 2123 /* drop the stolen reference */ | |
| 2124 gaim_xfer_unref(xfer); | |
| 2125 return; | |
| 2126 } | |
| 2127 } | |
| 2128 | |
| 2129 mwFileTransfer_free(ft); | |
| 2130 } | |
| 2131 | |
| 2132 | |
| 2133 static void mw_ft_recv(struct mwFileTransfer *ft, | |
| 2134 struct mwOpaque *data) { | |
| 2135 /* | |
| 2136 - get gaim ft from client data in ft | |
| 2137 - update transfered percentage | |
| 2138 - if done, destroy the ft, disassociate from gaim ft | |
| 2139 */ | |
| 2140 | |
| 2141 GaimXfer *xfer; | |
| 2142 FILE *fp; | |
| 2143 | |
| 2144 xfer = mwFileTransfer_getClientData(ft); | |
| 2145 g_return_if_fail(xfer != NULL); | |
| 2146 | |
| 2147 fp = xfer->dest_fp; | |
| 2148 g_return_if_fail(fp != NULL); | |
| 2149 | |
| 2150 /* we must collect and save our precious data */ | |
| 2151 fwrite(data->data, 1, data->len, fp); | |
| 2152 | |
| 2153 /* update the progress */ | |
| 2154 xfer->bytes_sent += data->len; | |
| 2155 xfer->bytes_remaining -= data->len; | |
| 2156 gaim_xfer_update_progress(xfer); | |
| 2157 | |
| 2158 /* let the other side know we got it, and to send some more */ | |
| 2159 mwFileTransfer_ack(ft); | |
| 2160 } | |
| 2161 | |
| 2162 | |
| 2163 static void mw_ft_ack(struct mwFileTransfer *ft) { | |
| 2164 GaimXfer *xfer; | |
| 2165 | |
| 2166 xfer = mwFileTransfer_getClientData(ft); | |
| 2167 g_return_if_fail(xfer != NULL); | |
| 2168 g_return_if_fail(xfer->watcher == 0); | |
| 2169 | |
| 2170 gaim_xfer_update_progress(xfer); | |
| 2171 | |
| 2172 if(mwFileTransfer_isOpen(ft)) | |
| 2173 xfer->watcher = g_idle_add((GSourceFunc)ft_idle_cb, ft); | |
| 2174 } | |
| 2175 | |
| 2176 | |
| 2177 static void mw_ft_clear(struct mwServiceFileTransfer *srvc) { | |
| 2178 ; | |
| 2179 } | |
| 2180 | |
| 2181 | |
| 2182 static struct mwFileTransferHandler mw_ft_handler = { | |
| 2183 .ft_offered = mw_ft_offered, | |
| 2184 .ft_opened = mw_ft_opened, | |
| 2185 .ft_closed = mw_ft_closed, | |
| 2186 .ft_recv = mw_ft_recv, | |
| 2187 .ft_ack = mw_ft_ack, | |
| 2188 .clear = mw_ft_clear, | |
| 2189 }; | |
| 2190 | |
| 2191 | |
| 2192 static struct mwServiceFileTransfer *mw_srvc_ft_new(struct mwSession *s) { | |
| 2193 struct mwServiceFileTransfer *srvc; | |
| 2194 GHashTable *ft_map; | |
| 2195 | |
| 2196 ft_map = g_hash_table_new(g_direct_hash, g_direct_equal); | |
| 2197 | |
| 2198 srvc = mwServiceFileTransfer_new(s, &mw_ft_handler); | |
| 2199 mwService_setClientData(MW_SERVICE(srvc), ft_map, | |
| 2200 (GDestroyNotify) g_hash_table_destroy); | |
| 2201 | |
| 2202 return srvc; | |
| 2203 } | |
| 2204 | |
| 2205 | |
| 2206 static void convo_data_free(struct convo_data *cd) { | |
| 2207 GList *l; | |
| 2208 | |
| 2209 /* clean the queue */ | |
| 2210 for(l = cd->queue; l; l = g_list_delete_link(l, l)) { | |
| 2211 struct convo_msg *m = l->data; | |
| 2212 if(m->clear) m->clear(m->data); | |
| 2213 g_free(m); | |
| 2214 } | |
| 2215 | |
| 2216 g_free(cd); | |
| 2217 } | |
| 2218 | |
| 2219 | |
| 2220 /** allocates a convo_data structure and associates it with the | |
| 2221 conversation in the client data slot */ | |
| 2222 static void convo_data_new(struct mwConversation *conv) { | |
| 2223 struct convo_data *cd; | |
| 2224 | |
| 2225 g_return_if_fail(conv != NULL); | |
| 2226 | |
| 2227 if(mwConversation_getClientData(conv)) | |
| 2228 return; | |
| 2229 | |
| 2230 cd = g_new0(struct convo_data, 1); | |
| 2231 cd->conv = conv; | |
| 2232 | |
| 2233 mwConversation_setClientData(conv, cd, (GDestroyNotify) convo_data_free); | |
| 2234 } | |
| 2235 | |
| 2236 | |
| 2237 static GaimConversation *convo_get_gconv(struct mwConversation *conv) { | |
| 2238 struct mwServiceIm *srvc; | |
| 2239 struct mwSession *session; | |
| 2240 struct mwGaimPluginData *pd; | |
| 2241 GaimConnection *gc; | |
| 2242 GaimAccount *acct; | |
| 2243 | |
| 2244 struct mwIdBlock *idb; | |
| 2245 | |
| 2246 srvc = mwConversation_getService(conv); | |
| 2247 session = mwService_getSession(MW_SERVICE(srvc)); | |
| 2248 pd = mwSession_getClientData(session); | |
| 2249 gc = pd->gc; | |
| 2250 acct = gaim_connection_get_account(gc); | |
| 2251 | |
| 2252 idb = mwConversation_getTarget(conv); | |
| 2253 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2254 return gaim_find_conversation_with_account(GAIM_CONV_TYPE_IM, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2255 idb->user, acct); |
| 10977 | 2256 } |
| 2257 | |
| 2258 | |
| 2259 static void convo_queue(struct mwConversation *conv, | |
| 2260 enum mwImSendType type, gconstpointer data) { | |
| 2261 | |
| 2262 struct convo_data *cd; | |
| 2263 struct convo_msg *m; | |
| 2264 | |
| 2265 convo_data_new(conv); | |
| 2266 cd = mwConversation_getClientData(conv); | |
| 2267 | |
| 2268 m = g_new0(struct convo_msg, 1); | |
| 2269 m->type = type; | |
| 2270 | |
| 2271 switch(type) { | |
| 2272 case mwImSend_PLAIN: | |
| 2273 m->data = g_strdup(data); | |
| 2274 m->clear = g_free; | |
| 2275 break; | |
| 2276 | |
| 2277 case mwImSend_TYPING: | |
| 2278 default: | |
| 2279 m->data = (gpointer) data; | |
| 2280 m->clear = NULL; | |
| 2281 } | |
| 2282 | |
| 2283 cd->queue = g_list_append(cd->queue, m); | |
| 2284 } | |
| 2285 | |
| 2286 | |
| 2287 /* Does what it takes to get an error displayed for a conversation */ | |
| 2288 static void convo_error(struct mwConversation *conv, guint32 err) { | |
| 2289 GaimConversation *gconv; | |
| 2290 char *tmp, *text; | |
| 2291 struct mwIdBlock *idb; | |
| 2292 | |
| 2293 idb = mwConversation_getTarget(conv); | |
| 2294 | |
| 2295 tmp = mwError(err); | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2296 text = g_strconcat(_("Unable to send message: "), tmp, NULL); |
| 10977 | 2297 |
| 2298 gconv = convo_get_gconv(conv); | |
| 2299 if(gconv && !gaim_conv_present_error(idb->user, gconv->account, text)) { | |
| 2300 | |
| 2301 g_free(text); | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2302 text = g_strdup_printf(_("Unable to send message to %s:"), |
| 10977 | 2303 (idb->user)? idb->user: "(unknown)"); |
| 2304 gaim_notify_error(gaim_account_get_connection(gconv->account), | |
| 2305 NULL, text, tmp); | |
| 2306 } | |
| 2307 | |
| 2308 g_free(tmp); | |
| 2309 g_free(text); | |
| 2310 } | |
| 2311 | |
| 2312 | |
| 2313 static void convo_queue_send(struct mwConversation *conv) { | |
| 2314 struct convo_data *cd; | |
| 2315 GList *l; | |
| 2316 | |
| 2317 cd = mwConversation_getClientData(conv); | |
| 2318 | |
| 2319 for(l = cd->queue; l; l = g_list_delete_link(l, l)) { | |
| 2320 struct convo_msg *m = l->data; | |
| 2321 | |
| 2322 mwConversation_send(conv, m->type, m->data); | |
| 2323 | |
| 2324 if(m->clear) m->clear(m->data); | |
| 2325 g_free(m); | |
| 2326 } | |
| 2327 | |
| 2328 cd->queue = NULL; | |
| 2329 } | |
| 2330 | |
| 2331 | |
| 2332 /** called when a mw conversation leaves a gaim conversation to | |
| 2333 inform the gaim conversation that it's unsafe to offer any *cool* | |
| 2334 features. */ | |
| 2335 static void convo_nofeatures(struct mwConversation *conv) { | |
| 2336 GaimConversation *gconv; | |
| 2337 GaimConnection *gc; | |
| 2338 | |
| 2339 gconv = convo_get_gconv(conv); | |
| 2340 if(! gconv) return; | |
| 2341 | |
| 2342 gc = gaim_conversation_get_gc(gconv); | |
|
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
2343 if(! gc) return; |
|
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
2344 |
|
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
2345 gaim_conversation_set_features(gconv, gc->flags); |
| 10977 | 2346 } |
| 2347 | |
| 2348 | |
| 2349 /** called when a mw conversation and gaim conversation come together, | |
| 2350 to inform the gaim conversation of what features to offer the | |
| 2351 user */ | |
| 2352 static void convo_features(struct mwConversation *conv) { | |
| 2353 GaimConversation *gconv; | |
| 2354 GaimConnectionFlags feat; | |
| 2355 | |
| 2356 gconv = convo_get_gconv(conv); | |
| 2357 if(! gconv) return; | |
| 2358 | |
| 2359 feat = gaim_conversation_get_features(gconv); | |
| 2360 | |
| 2361 if(mwConversation_isOpen(conv)) { | |
| 2362 if(mwConversation_supports(conv, mwImSend_HTML)) { | |
| 2363 feat |= GAIM_CONNECTION_HTML; | |
| 2364 } else { | |
| 2365 feat &= ~GAIM_CONNECTION_HTML; | |
| 2366 } | |
| 2367 | |
| 2368 if(mwConversation_supports(conv, mwImSend_MIME)) { | |
| 2369 feat &= ~GAIM_CONNECTION_NO_IMAGES; | |
| 2370 } else { | |
| 2371 feat |= GAIM_CONNECTION_NO_IMAGES; | |
| 2372 } | |
| 2373 | |
| 2374 DEBUG_INFO("conversation features set to 0x%04x\n", feat); | |
| 2375 gaim_conversation_set_features(gconv, feat); | |
| 2376 | |
| 2377 } else { | |
| 2378 convo_nofeatures(conv); | |
| 2379 } | |
| 2380 } | |
| 2381 | |
| 2382 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2383 #if 0 |
| 10977 | 2384 /** triggered from mw_conversation_opened if the appropriate plugin |
| 2385 preference is set. This will open a window for the conversation | |
| 2386 before the first message is sent. */ | |
| 2387 static void convo_do_psychic(struct mwConversation *conv) { | |
| 2388 struct mwServiceIm *srvc; | |
| 2389 struct mwSession *session; | |
| 2390 struct mwGaimPluginData *pd; | |
| 2391 GaimConnection *gc; | |
| 2392 GaimAccount *acct; | |
| 2393 | |
| 2394 struct mwIdBlock *idb; | |
| 2395 | |
| 2396 GaimConversation *gconv; | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2397 GaimConvWindow *win; |
| 10977 | 2398 |
| 2399 srvc = mwConversation_getService(conv); | |
| 2400 session = mwService_getSession(MW_SERVICE(srvc)); | |
| 2401 pd = mwSession_getClientData(session); | |
| 2402 gc = pd->gc; | |
| 2403 acct = gaim_connection_get_account(gc); | |
| 2404 | |
| 2405 idb = mwConversation_getTarget(conv); | |
| 2406 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2407 gconv = gaim_find_conversation_with_account(GAIM_CONV_TYPE_IM, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2408 idb->user, acct); |
| 10977 | 2409 if(! gconv) { |
| 11338 | 2410 gconv = gaim_conversation_new(GAIM_CONV_TYPE_IM, acct, idb->user); |
| 10977 | 2411 } |
| 2412 | |
| 2413 g_return_if_fail(gconv != NULL); | |
| 2414 | |
| 2415 win = gaim_conversation_get_window(gconv); | |
| 2416 g_return_if_fail(win != NULL); | |
| 2417 | |
| 2418 gaim_conv_window_show(win); | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2419 } |
| 11547 | 2420 #endif |
| 10977 | 2421 |
| 2422 | |
| 2423 static void mw_conversation_opened(struct mwConversation *conv) { | |
| 2424 struct mwServiceIm *srvc; | |
| 2425 struct mwSession *session; | |
| 2426 struct mwGaimPluginData *pd; | |
| 2427 GaimConnection *gc; | |
| 2428 GaimAccount *acct; | |
| 2429 | |
| 2430 struct convo_dat *cd; | |
| 2431 | |
| 2432 srvc = mwConversation_getService(conv); | |
| 2433 session = mwService_getSession(MW_SERVICE(srvc)); | |
| 2434 pd = mwSession_getClientData(session); | |
| 2435 gc = pd->gc; | |
| 2436 acct = gaim_connection_get_account(gc); | |
| 2437 | |
| 2438 /* set up the queue */ | |
| 2439 cd = mwConversation_getClientData(conv); | |
| 2440 if(cd) { | |
| 2441 convo_queue_send(conv); | |
| 2442 | |
| 2443 if(! convo_get_gconv(conv)) { | |
| 2444 mwConversation_free(conv); | |
| 2445 return; | |
| 2446 } | |
| 2447 | |
| 2448 } else { | |
| 2449 convo_data_new(conv); | |
| 2450 } | |
| 2451 | |
| 2452 { /* record the client key for the buddy */ | |
| 2453 GaimBuddy *buddy; | |
| 2454 struct mwLoginInfo *info; | |
| 2455 info = mwConversation_getTargetInfo(conv); | |
| 2456 | |
| 2457 buddy = gaim_find_buddy(acct, info->user_id); | |
| 2458 if(buddy) { | |
| 2459 gaim_blist_node_set_int((GaimBlistNode *) buddy, | |
| 2460 BUDDY_KEY_CLIENT, info->type); | |
| 2461 } | |
| 2462 } | |
| 2463 | |
| 2464 convo_features(conv); | |
| 2465 } | |
| 2466 | |
| 2467 | |
| 2468 static void mw_conversation_closed(struct mwConversation *conv, | |
| 2469 guint32 reason) { | |
| 2470 | |
| 2471 struct convo_data *cd; | |
| 2472 | |
| 2473 g_return_if_fail(conv != NULL); | |
| 2474 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2475 /* 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
|
2476 print an error message to the conversation */ |
| 10977 | 2477 cd = mwConversation_getClientData(conv); |
| 2478 if(reason && cd && cd->queue) { | |
|
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
2479 GList *l; |
|
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
2480 for(l = cd->queue; l; l = l->next) { |
|
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
2481 struct convo_msg *m = l->data; |
|
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
2482 if(m->type != mwImSend_TYPING) { |
|
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
2483 convo_error(conv, reason); |
|
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
2484 break; |
|
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
2485 } |
|
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
2486 } |
| 10977 | 2487 } |
| 2488 | |
| 2489 #if 0 | |
| 2490 /* don't do this, to prevent the occasional weird sending of | |
| 2491 formatted messages as plaintext when the other end closes the | |
| 2492 conversation after we've begun composing the message */ | |
| 2493 convo_nofeatures(conv); | |
| 2494 #endif | |
| 2495 | |
| 2496 mwConversation_removeClientData(conv); | |
| 2497 } | |
| 2498 | |
| 2499 | |
| 2500 static void im_recv_text(struct mwConversation *conv, | |
| 2501 struct mwGaimPluginData *pd, | |
| 2502 const char *msg) { | |
| 2503 | |
| 2504 struct mwIdBlock *idb; | |
|
12524
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
2505 char *txt, *esc; |
|
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
2506 const char *t; |
| 10977 | 2507 |
| 2508 idb = mwConversation_getTarget(conv); | |
|
12524
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
2509 |
|
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
2510 txt = gaim_utf8_try_convert(msg); |
|
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
2511 t = txt? txt: msg; |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2512 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2513 esc = g_markup_escape_text(t, -1); |
| 10977 | 2514 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
|
2515 g_free(esc); |
| 10977 | 2516 |
| 2517 g_free(txt); | |
| 2518 } | |
| 2519 | |
| 2520 | |
| 2521 static void im_recv_typing(struct mwConversation *conv, | |
| 2522 struct mwGaimPluginData *pd, | |
| 2523 gboolean typing) { | |
| 2524 | |
| 2525 struct mwIdBlock *idb; | |
| 2526 idb = mwConversation_getTarget(conv); | |
| 2527 | |
| 2528 serv_got_typing(pd->gc, idb->user, 0, | |
| 2529 typing? GAIM_TYPING: GAIM_NOT_TYPING); | |
| 2530 } | |
| 2531 | |
| 2532 | |
| 2533 static void im_recv_html(struct mwConversation *conv, | |
| 2534 struct mwGaimPluginData *pd, | |
| 2535 const char *msg) { | |
| 2536 struct mwIdBlock *idb; | |
|
12524
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
2537 char *t1, *t2; |
|
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
2538 const char *t; |
| 10977 | 2539 |
| 2540 idb = mwConversation_getTarget(conv); | |
|
12524
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
2541 |
|
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
2542 /* ensure we're receiving UTF8 */ |
|
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
2543 t1 = gaim_utf8_try_convert(msg); |
|
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
2544 t = t1? t1: msg; |
|
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
2545 |
|
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
2546 /* convert entities to UTF8 so they'll log correctly */ |
|
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
2547 t2 = gaim_utf8_ncr_decode(t); |
|
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
2548 t = t2? t2: t; |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2549 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2550 serv_got_im(pd->gc, idb->user, t, 0, time(NULL)); |
| 10977 | 2551 |
|
12524
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
2552 g_free(t1); |
|
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
2553 g_free(t2); |
| 10977 | 2554 } |
| 2555 | |
| 2556 | |
| 2557 static void im_recv_subj(struct mwConversation *conv, | |
| 2558 struct mwGaimPluginData *pd, | |
| 2559 const char *subj) { | |
| 2560 | |
| 2561 /** @todo somehow indicate receipt of a conversation subject. It | |
| 2562 would also be nice if we added a /topic command for the | |
| 2563 protocol */ | |
| 2564 ; | |
| 2565 } | |
| 2566 | |
| 2567 | |
| 2568 /** generate "cid:908@20582notesbuddy" from "<908@20582notesbuddy>" */ | |
| 2569 static char *make_cid(const char *cid) { | |
| 2570 gsize n; | |
| 2571 char *c, *d; | |
| 2572 | |
| 2573 g_return_val_if_fail(cid != NULL, NULL); | |
| 2574 | |
| 2575 n = strlen(cid); | |
| 2576 g_return_val_if_fail(n > 2, NULL); | |
| 2577 | |
| 2578 c = g_strndup(cid+1, n-2); | |
| 2579 d = g_strdup_printf("cid:%s", c); | |
| 2580 | |
| 2581 g_free(c); | |
| 2582 return d; | |
| 2583 } | |
| 2584 | |
| 2585 | |
| 2586 static void im_recv_mime(struct mwConversation *conv, | |
| 2587 struct mwGaimPluginData *pd, | |
| 2588 const char *data) { | |
| 2589 | |
| 2590 struct mwIdBlock *idb; | |
| 2591 | |
| 2592 GHashTable *img_by_cid; | |
| 2593 GList *images; | |
| 2594 | |
| 2595 GString *str; | |
| 2596 | |
| 2597 GaimMimeDocument *doc; | |
| 2598 const GList *parts; | |
| 2599 | |
| 2600 idb = mwConversation_getTarget(conv); | |
| 2601 | |
| 2602 img_by_cid = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); | |
| 2603 images = NULL; | |
| 2604 | |
| 2605 /* don't want the contained string to ever be NULL */ | |
| 2606 str = g_string_new(""); | |
| 2607 | |
| 2608 doc = gaim_mime_document_parse(data); | |
| 2609 | |
| 2610 /* handle all the MIME parts */ | |
| 2611 parts = gaim_mime_document_get_parts(doc); | |
| 2612 for(; parts; parts = parts->next) { | |
| 2613 GaimMimePart *part = parts->data; | |
| 2614 const char *type; | |
| 2615 | |
| 2616 type = gaim_mime_part_get_field(part, "content-type"); | |
| 2617 DEBUG_INFO("MIME part Content-Type: %s\n", NSTR(type)); | |
| 2618 | |
| 2619 if(! type) { | |
| 2620 ; /* feh */ | |
| 2621 | |
| 12166 | 2622 } else if(gaim_str_has_prefix(type, "image")) { |
| 10977 | 2623 /* put images into the image store */ |
| 2624 | |
| 11183 | 2625 guchar *d_dat; |
| 10977 | 2626 gsize d_len; |
| 2627 char *cid; | |
| 2628 int img; | |
| 2629 | |
| 2630 /* obtain and unencode the data */ | |
| 2631 gaim_mime_part_get_data_decoded(part, &d_dat, &d_len); | |
| 2632 | |
| 2633 /* look up the content id */ | |
| 2634 cid = (char *) gaim_mime_part_get_field(part, "Content-ID"); | |
| 2635 cid = make_cid(cid); | |
| 2636 | |
| 2637 /* add image to the gaim image store */ | |
| 2638 img = gaim_imgstore_add(d_dat, d_len, cid); | |
|
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
2639 g_free(d_dat); |
| 10977 | 2640 |
| 2641 /* map the cid to the image store identifier */ | |
| 2642 g_hash_table_insert(img_by_cid, cid, GINT_TO_POINTER(img)); | |
| 2643 | |
| 2644 /* recall the image for dereferencing later */ | |
| 2645 images = g_list_append(images, GINT_TO_POINTER(img)); | |
| 2646 | |
| 12166 | 2647 } else if(gaim_str_has_prefix(type, "text")) { |
| 10977 | 2648 |
| 2649 /* concatenate all the text parts together */ | |
| 11183 | 2650 guchar *data; |
| 10977 | 2651 gsize len; |
| 2652 | |
| 2653 gaim_mime_part_get_data_decoded(part, &data, &len); | |
|
12524
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
2654 g_string_append(str, (const char *)data); |
|
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
2655 g_free(data); |
| 10977 | 2656 } |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2657 } |
| 10977 | 2658 |
| 2659 gaim_mime_document_free(doc); | |
| 2660 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2661 /* @todo should put this in its own function */ |
| 10977 | 2662 { /* replace each IMG tag's SRC attribute with an ID attribute. This |
| 2663 actually modifies the contents of str */ | |
| 2664 GData *attribs; | |
| 2665 char *start, *end; | |
| 2666 char *tmp = str->str; | |
| 2667 | |
| 2668 while(*tmp && gaim_markup_find_tag("img", tmp, (const char **) &start, | |
| 2669 (const char **) &end, &attribs)) { | |
| 2670 | |
| 2671 char *alt, *align, *border, *src; | |
| 2672 int img; | |
| 2673 | |
| 2674 alt = g_datalist_get_data(&attribs, "alt"); | |
| 2675 align = g_datalist_get_data(&attribs, "align"); | |
| 2676 border = g_datalist_get_data(&attribs, "border"); | |
| 2677 src = g_datalist_get_data(&attribs, "src"); | |
| 2678 | |
| 2679 img = GPOINTER_TO_INT(g_hash_table_lookup(img_by_cid, src)); | |
| 2680 if(img) { | |
| 2681 GString *atstr; | |
| 2682 gsize len = (end - start); | |
| 2683 gsize mov; | |
| 2684 | |
| 2685 atstr = g_string_new(""); | |
| 2686 if(alt) g_string_append_printf(atstr, " alt=\"%s\"", alt); | |
| 2687 if(align) g_string_append_printf(atstr, " align=\"%s\"", align); | |
| 2688 if(border) g_string_append_printf(atstr, " border=\"%s\"", border); | |
| 2689 | |
| 2690 mov = g_snprintf(start, len, "<img%s id=\"%i\"", atstr->str, img); | |
| 2691 while(mov < len) start[mov++] = ' '; | |
| 2692 | |
| 2693 g_string_free(atstr, TRUE); | |
| 2694 } | |
| 2695 | |
| 2696 g_datalist_clear(&attribs); | |
| 2697 tmp = end + 1; | |
| 2698 } | |
| 2699 } | |
| 2700 | |
|
12524
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
2701 im_recv_html(conv, pd, str->str); |
| 10977 | 2702 |
| 2703 g_string_free(str, TRUE); | |
| 2704 | |
| 2705 /* clean up the cid table */ | |
| 2706 g_hash_table_destroy(img_by_cid); | |
| 2707 | |
| 2708 /* dereference all the imgages */ | |
| 2709 while(images) { | |
| 2710 gaim_imgstore_unref(GPOINTER_TO_INT(images->data)); | |
| 2711 images = g_list_delete_link(images, images); | |
| 2712 } | |
| 2713 } | |
| 2714 | |
| 2715 | |
| 2716 static void mw_conversation_recv(struct mwConversation *conv, | |
| 2717 enum mwImSendType type, | |
| 2718 gconstpointer msg) { | |
| 2719 struct mwServiceIm *srvc; | |
| 2720 struct mwSession *session; | |
| 2721 struct mwGaimPluginData *pd; | |
| 2722 | |
| 2723 srvc = mwConversation_getService(conv); | |
| 2724 session = mwService_getSession(MW_SERVICE(srvc)); | |
| 2725 pd = mwSession_getClientData(session); | |
| 2726 | |
| 2727 switch(type) { | |
| 2728 case mwImSend_PLAIN: | |
| 2729 im_recv_text(conv, pd, msg); | |
| 2730 break; | |
| 2731 | |
| 2732 case mwImSend_TYPING: | |
| 2733 im_recv_typing(conv, pd, !! msg); | |
| 2734 break; | |
| 2735 | |
| 2736 case mwImSend_HTML: | |
| 2737 im_recv_html(conv, pd, msg); | |
| 2738 break; | |
| 2739 | |
| 2740 case mwImSend_SUBJECT: | |
| 2741 im_recv_subj(conv, pd, msg); | |
| 2742 break; | |
| 2743 | |
| 2744 case mwImSend_MIME: | |
| 2745 im_recv_mime(conv, pd, msg); | |
| 2746 break; | |
| 2747 | |
| 2748 default: | |
| 2749 DEBUG_INFO("conversation received strange type, 0x%04x\n", type); | |
| 2750 ; /* erm... */ | |
| 2751 } | |
| 2752 } | |
| 2753 | |
| 2754 | |
| 2755 static void mw_place_invite(struct mwConversation *conv, | |
| 2756 const char *message, | |
| 2757 const char *title, const char *name) { | |
| 2758 struct mwServiceIm *srvc; | |
| 2759 struct mwSession *session; | |
| 2760 struct mwGaimPluginData *pd; | |
| 2761 | |
| 2762 struct mwIdBlock *idb; | |
| 2763 GHashTable *ht; | |
| 2764 | |
| 2765 srvc = mwConversation_getService(conv); | |
| 2766 session = mwService_getSession(MW_SERVICE(srvc)); | |
| 2767 pd = mwSession_getClientData(session); | |
| 2768 | |
| 2769 idb = mwConversation_getTarget(conv); | |
| 2770 | |
| 2771 ht = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, g_free); | |
| 2772 g_hash_table_insert(ht, CHAT_KEY_CREATOR, g_strdup(idb->user)); | |
| 2773 g_hash_table_insert(ht, CHAT_KEY_NAME, g_strdup(name)); | |
| 2774 g_hash_table_insert(ht, CHAT_KEY_TOPIC, g_strdup(title)); | |
| 2775 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
|
2776 g_hash_table_insert(ht, CHAT_KEY_IS_PLACE, g_strdup("")); /* ugh */ |
| 10977 | 2777 |
|
12742
258871a62600
[gaim-migrate @ 15089]
Christopher O'Brien <siege@pidgin.im>
parents:
12735
diff
changeset
|
2778 if(! title) title = "(no title)"; |
|
258871a62600
[gaim-migrate @ 15089]
Christopher O'Brien <siege@pidgin.im>
parents:
12735
diff
changeset
|
2779 if(! message) message = "(no message)"; |
| 10977 | 2780 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
|
2781 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2782 mwConversation_close(conv, ERR_SUCCESS); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2783 mwConversation_free(conv); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2784 } |
| 10977 | 2785 |
| 2786 | |
| 2787 static void mw_im_clear(struct mwServiceIm *srvc) { | |
| 2788 ; | |
| 2789 } | |
| 2790 | |
| 2791 | |
| 2792 static struct mwImHandler mw_im_handler = { | |
| 2793 .conversation_opened = mw_conversation_opened, | |
| 2794 .conversation_closed = mw_conversation_closed, | |
| 2795 .conversation_recv = mw_conversation_recv, | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2796 .place_invite = mw_place_invite, |
| 10977 | 2797 .clear = mw_im_clear, |
| 2798 }; | |
| 2799 | |
| 2800 | |
| 2801 static struct mwServiceIm *mw_srvc_im_new(struct mwSession *s) { | |
| 2802 struct mwServiceIm *srvc; | |
| 2803 srvc = mwServiceIm_new(s, &mw_im_handler); | |
| 2804 mwServiceIm_setClientType(srvc, mwImClient_NOTESBUDDY); | |
| 2805 return srvc; | |
| 2806 } | |
| 2807 | |
| 2808 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2809 /* 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
|
2810 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
|
2811 the similar macros from the conference service above */ |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2812 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2813 #define PLACE_TO_ID(place) (GPOINTER_TO_INT(place)) |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2814 #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
|
2815 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2816 #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
|
2817 #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
|
2818 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2819 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2820 static struct mwPlace * |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2821 place_find_by_id(struct mwGaimPluginData *pd, int id) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2822 struct mwServicePlace *srvc = pd->srvc_place; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2823 struct mwPlace *place = NULL; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2824 GList *l; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2825 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2826 l = (GList *) mwServicePlace_getPlaces(srvc); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2827 for(; l; l = l->next) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2828 struct mwPlace *p = l->data; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2829 GaimConvChat *h = GAIM_CONV_CHAT(mwPlace_getClientData(p)); |
|
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 if(CHAT_TO_ID(h) == id) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2832 place = p; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2833 break; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2834 } |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2835 } |
|
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 return place; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2838 } |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2839 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2840 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2841 static void mw_place_opened(struct mwPlace *place) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2842 struct mwServicePlace *srvc; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2843 struct mwSession *session; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2844 struct mwGaimPluginData *pd; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2845 GaimConnection *gc; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2846 GaimConversation *gconf; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2847 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2848 GList *members, *l; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2849 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2850 const char *n = mwPlace_getName(place); |
|
12742
258871a62600
[gaim-migrate @ 15089]
Christopher O'Brien <siege@pidgin.im>
parents:
12735
diff
changeset
|
2851 const char *t = mwPlace_getTitle(place); |
|
11943
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 srvc = mwPlace_getService(place); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2854 session = mwService_getSession(MW_SERVICE(srvc)); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2855 pd = mwSession_getClientData(session); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2856 gc = pd->gc; |
|
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 members = mwPlace_getMembers(place); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2859 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2860 DEBUG_INFO("place %s opened, %u initial members\n", |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2861 NSTR(n), g_list_length(members)); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2862 |
|
12742
258871a62600
[gaim-migrate @ 15089]
Christopher O'Brien <siege@pidgin.im>
parents:
12735
diff
changeset
|
2863 if(! t) t = "(no title)"; |
|
258871a62600
[gaim-migrate @ 15089]
Christopher O'Brien <siege@pidgin.im>
parents:
12735
diff
changeset
|
2864 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
|
2865 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2866 mwPlace_setClientData(place, gconf, NULL); |
|
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 for(l = members; l; l = l->next) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2869 struct mwIdBlock *idb = l->data; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2870 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
|
2871 NULL, GAIM_CBFLAGS_NONE, FALSE); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2872 } |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2873 g_list_free(members); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2874 } |
|
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 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2877 static void mw_place_closed(struct mwPlace *place, guint32 code) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2878 struct mwServicePlace *srvc; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2879 struct mwSession *session; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2880 struct mwGaimPluginData *pd; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2881 GaimConnection *gc; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2882 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2883 const char *n = mwPlace_getName(place); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2884 char *msg = mwError(code); |
|
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 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
|
2887 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2888 srvc = mwPlace_getService(place); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2889 session = mwService_getSession(MW_SERVICE(srvc)); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2890 pd = mwSession_getClientData(session); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2891 gc = pd->gc; |
|
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 serv_got_chat_left(gc, PLACE_TO_ID(place)); |
|
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 gaim_notify_error(gc, _("Place Closed"), NULL, msg); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2896 g_free(msg); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2897 } |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2898 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2899 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2900 static void mw_place_peerJoined(struct mwPlace *place, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2901 const struct mwIdBlock *peer) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2902 struct mwServicePlace *srvc; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2903 struct mwSession *session; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2904 struct mwGaimPluginData *pd; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2905 GaimConnection *gc; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2906 GaimConversation *gconf; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2907 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2908 const char *n = mwPlace_getName(place); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2909 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2910 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
|
2911 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2912 srvc = mwPlace_getService(place); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2913 session = mwService_getSession(MW_SERVICE(srvc)); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2914 pd = mwSession_getClientData(session); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2915 gc = pd->gc; |
|
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 gconf = mwPlace_getClientData(place); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2918 g_return_if_fail(gconf != NULL); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2919 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2920 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
|
2921 NULL, GAIM_CBFLAGS_NONE, TRUE); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2922 } |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2923 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2924 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2925 static void mw_place_peerParted(struct mwPlace *place, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2926 const struct mwIdBlock *peer) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2927 struct mwServicePlace *srvc; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2928 struct mwSession *session; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2929 struct mwGaimPluginData *pd; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2930 GaimConnection *gc; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2931 GaimConversation *gconf; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2932 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2933 const char *n = mwPlace_getName(place); |
|
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 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
|
2936 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2937 srvc = mwPlace_getService(place); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2938 session = mwService_getSession(MW_SERVICE(srvc)); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2939 pd = mwSession_getClientData(session); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2940 gc = pd->gc; |
|
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 gconf = mwPlace_getClientData(place); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2943 g_return_if_fail(gconf != NULL); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2944 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2945 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
|
2946 } |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2947 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2948 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2949 static void mw_place_peerSetAttribute(struct mwPlace *place, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2950 const struct mwIdBlock *peer, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2951 guint32 attr, struct mwOpaque *o) { |
|
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 } |
|
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 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2956 static void mw_place_peerUnsetAttribute(struct mwPlace *place, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2957 const struct mwIdBlock *peer, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2958 guint32 attr) { |
|
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 } |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2961 |
|
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 static void mw_place_message(struct mwPlace *place, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2964 const struct mwIdBlock *who, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2965 const char *msg) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2966 struct mwServicePlace *srvc; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2967 struct mwSession *session; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2968 struct mwGaimPluginData *pd; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2969 GaimConnection *gc; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2970 char *esc; |
|
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 srvc = mwPlace_getService(place); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2973 session = mwService_getSession(MW_SERVICE(srvc)); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2974 pd = mwSession_getClientData(session); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2975 gc = pd->gc; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2976 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2977 esc = g_markup_escape_text(msg, -1); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2978 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
|
2979 g_free(esc); |
|
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 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2982 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2983 static void mw_place_clear(struct mwServicePlace *srvc) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2984 ; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2985 } |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2986 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2987 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2988 static struct mwPlaceHandler mw_place_handler = { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2989 .opened = mw_place_opened, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2990 .closed = mw_place_closed, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2991 .peerJoined = mw_place_peerJoined, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2992 .peerParted = mw_place_peerParted, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2993 .peerSetAttribute = mw_place_peerSetAttribute, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2994 .peerUnsetAttribute = mw_place_peerUnsetAttribute, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2995 .message = mw_place_message, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2996 .clear = mw_place_clear, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2997 }; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2998 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2999 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3000 static struct mwServicePlace *mw_srvc_place_new(struct mwSession *s) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3001 struct mwServicePlace *srvc; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3002 srvc = mwServicePlace_new(s, &mw_place_handler); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3003 return 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 |
| 10977 | 3007 static struct mwServiceResolve *mw_srvc_resolve_new(struct mwSession *s) { |
| 3008 struct mwServiceResolve *srvc; | |
| 3009 srvc = mwServiceResolve_new(s); | |
| 3010 return srvc; | |
| 3011 } | |
| 3012 | |
| 3013 | |
| 3014 static struct mwServiceStorage *mw_srvc_store_new(struct mwSession *s) { | |
| 3015 struct mwServiceStorage *srvc; | |
| 3016 srvc = mwServiceStorage_new(s); | |
| 3017 return srvc; | |
| 3018 } | |
| 3019 | |
| 3020 | |
| 3021 /** allocate and associate a mwGaimPluginData with a GaimConnection */ | |
| 3022 static struct mwGaimPluginData *mwGaimPluginData_new(GaimConnection *gc) { | |
| 3023 struct mwGaimPluginData *pd; | |
| 3024 | |
| 3025 g_return_val_if_fail(gc != NULL, NULL); | |
| 3026 | |
| 3027 pd = g_new0(struct mwGaimPluginData, 1); | |
| 3028 pd->gc = gc; | |
| 3029 pd->session = mwSession_new(&mw_session_handler); | |
| 3030 pd->srvc_aware = mw_srvc_aware_new(pd->session); | |
| 3031 pd->srvc_conf = mw_srvc_conf_new(pd->session); | |
| 3032 pd->srvc_ft = mw_srvc_ft_new(pd->session); | |
| 3033 pd->srvc_im = mw_srvc_im_new(pd->session); | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3034 pd->srvc_place = mw_srvc_place_new(pd->session); |
| 10977 | 3035 pd->srvc_resolve = mw_srvc_resolve_new(pd->session); |
| 3036 pd->srvc_store = mw_srvc_store_new(pd->session); | |
| 3037 pd->group_list_map = g_hash_table_new(g_direct_hash, g_direct_equal); | |
| 3038 | |
| 3039 mwSession_addService(pd->session, MW_SERVICE(pd->srvc_aware)); | |
| 3040 mwSession_addService(pd->session, MW_SERVICE(pd->srvc_conf)); | |
| 3041 mwSession_addService(pd->session, MW_SERVICE(pd->srvc_ft)); | |
| 3042 mwSession_addService(pd->session, MW_SERVICE(pd->srvc_im)); | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3043 mwSession_addService(pd->session, MW_SERVICE(pd->srvc_place)); |
| 10977 | 3044 mwSession_addService(pd->session, MW_SERVICE(pd->srvc_resolve)); |
| 3045 mwSession_addService(pd->session, MW_SERVICE(pd->srvc_store)); | |
| 3046 | |
| 3047 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
|
3048 mwSession_addCipher(pd->session, mwCipher_new_RC2_128(pd->session)); |
| 10977 | 3049 |
| 3050 mwSession_setClientData(pd->session, pd, NULL); | |
| 3051 gc->proto_data = pd; | |
| 3052 | |
| 3053 return pd; | |
| 3054 } | |
| 3055 | |
| 3056 | |
| 3057 static void mwGaimPluginData_free(struct mwGaimPluginData *pd) { | |
| 3058 g_return_if_fail(pd != NULL); | |
| 3059 | |
| 3060 pd->gc->proto_data = NULL; | |
| 3061 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3062 mwSession_removeService(pd->session, mwService_AWARE); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3063 mwSession_removeService(pd->session, mwService_CONFERENCE); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3064 mwSession_removeService(pd->session, mwService_FILE_TRANSFER); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3065 mwSession_removeService(pd->session, mwService_IM); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3066 mwSession_removeService(pd->session, mwService_PLACE); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3067 mwSession_removeService(pd->session, mwService_RESOLVE); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3068 mwSession_removeService(pd->session, mwService_STORAGE); |
| 10977 | 3069 |
| 3070 mwService_free(MW_SERVICE(pd->srvc_aware)); | |
| 3071 mwService_free(MW_SERVICE(pd->srvc_conf)); | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3072 mwService_free(MW_SERVICE(pd->srvc_ft)); |
| 10977 | 3073 mwService_free(MW_SERVICE(pd->srvc_im)); |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3074 mwService_free(MW_SERVICE(pd->srvc_place)); |
| 10977 | 3075 mwService_free(MW_SERVICE(pd->srvc_resolve)); |
| 3076 mwService_free(MW_SERVICE(pd->srvc_store)); | |
| 3077 | |
| 3078 mwCipher_free(mwSession_getCipher(pd->session, mwCipher_RC2_40)); | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3079 mwCipher_free(mwSession_getCipher(pd->session, mwCipher_RC2_128)); |
| 10977 | 3080 |
| 3081 mwSession_free(pd->session); | |
| 3082 | |
| 3083 g_hash_table_destroy(pd->group_list_map); | |
| 3084 | |
| 3085 g_free(pd); | |
| 3086 } | |
| 3087 | |
| 3088 | |
| 3089 static const char *mw_prpl_list_icon(GaimAccount *a, GaimBuddy *b) { | |
| 3090 /* my little green dude is a chopped up version of the aim running | |
| 3091 guy. First, cut off the head and store someplace safe. Then, | |
| 3092 take the left-half side of the body and throw it away. Make a | |
| 3093 copy of the remaining body, and flip it horizontally. Now attach | |
| 3094 the two pieces into an X shape, and drop the head back on the | |
| 3095 top, being careful to center it. Then, just change the color | |
| 3096 saturation to bring the red down a bit, and voila! */ | |
| 3097 | |
| 3098 /* then, throw all of that away and use sodipodi to make a new | |
| 3099 icon. You know, LIKE A REAL MAN. */ | |
| 3100 | |
| 3101 return "meanwhile"; | |
| 3102 } | |
| 3103 | |
| 3104 | |
| 3105 static void mw_prpl_list_emblems(GaimBuddy *b, | |
| 3106 const char **se, const char **sw, | |
| 3107 const char **nw, const char **ne) { | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3108 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3109 /* 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
|
3110 little example of what happens when I use Gimp */ |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3111 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3112 GaimPresence *presence; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3113 GaimStatus *status; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3114 const char *status_id; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3115 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3116 presence = gaim_buddy_get_presence(b); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3117 status = gaim_presence_get_active_status(presence); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3118 status_id = gaim_status_get_id(status); |
| 10977 | 3119 |
| 3120 if(! GAIM_BUDDY_IS_ONLINE(b)) { | |
| 3121 *se = "offline"; | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3122 } else if(!strcmp(status_id, MW_STATE_AWAY)) { |
| 10977 | 3123 *se = "away"; |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3124 } else if(!strcmp(status_id, MW_STATE_BUSY)) { |
| 10977 | 3125 *se = "dnd"; |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3126 } |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3127 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3128 if(buddy_is_external(b)) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3129 /* best assignment ever */ |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3130 *(*se?sw:se) = "external"; |
| 10977 | 3131 } |
| 3132 } | |
| 3133 | |
| 3134 | |
| 3135 static char *mw_prpl_status_text(GaimBuddy *b) { | |
| 3136 GaimConnection *gc; | |
| 3137 struct mwGaimPluginData *pd; | |
| 3138 struct mwAwareIdBlock t = { mwAware_USER, b->name, NULL }; | |
| 3139 const char *ret; | |
| 3140 | |
| 3141 gc = b->account->gc; | |
| 3142 pd = gc->proto_data; | |
| 3143 | |
| 3144 ret = mwServiceAware_getText(pd->srvc_aware, &t); | |
|
12496
f9d0ab1474ac
[gaim-migrate @ 14808]
Christopher O'Brien <siege@pidgin.im>
parents:
12489
diff
changeset
|
3145 return ret? g_markup_escape_text(ret, -1): NULL; |
| 10977 | 3146 } |
| 3147 | |
| 3148 | |
| 3149 static const char *status_text(GaimBuddy *b) { | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3150 GaimPresence *presence; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3151 GaimStatus *status; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3152 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3153 presence = gaim_buddy_get_presence(b); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3154 status = gaim_presence_get_active_status(presence); |
| 11536 | 3155 |
| 3156 return gaim_status_get_name(status); | |
| 10977 | 3157 } |
| 3158 | |
| 3159 | |
| 3160 static gboolean user_supports(struct mwServiceAware *srvc, | |
| 3161 const char *who, guint32 feature) { | |
| 3162 | |
| 3163 const struct mwAwareAttribute *attr; | |
| 3164 struct mwAwareIdBlock idb = { mwAware_USER, (char *) who, NULL }; | |
| 3165 | |
| 3166 attr = mwServiceAware_getAttribute(srvc, &idb, feature); | |
| 3167 return (attr != NULL) && mwAwareAttribute_asBoolean(attr); | |
| 3168 } | |
| 3169 | |
| 3170 | |
|
12422
fe42d9c111f9
[gaim-migrate @ 14729]
Richard Laager <rlaager@wiktel.com>
parents:
12312
diff
changeset
|
3171 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
|
3172 char *feat[] = {NULL, NULL, NULL, NULL, NULL}; |
|
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3173 char **f = feat; |
|
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3174 |
|
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3175 if(user_supports(srvc, who, mwAttribute_AV_PREFS_SET)) { |
|
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3176 gboolean mic, speak, video; |
|
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3177 |
|
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3178 mic = user_supports(srvc, who, mwAttribute_MICROPHONE); |
|
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3179 speak = user_supports(srvc, who, mwAttribute_SPEAKERS); |
|
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3180 video = user_supports(srvc, who, mwAttribute_VIDEO_CAMERA); |
|
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3181 |
|
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3182 if(mic) *f++ = _("Microphone"); |
|
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3183 if(speak) *f++ = _("Speakers"); |
|
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3184 if(video) *f++ = _("Video Camera"); |
|
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3185 } |
|
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3186 |
|
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3187 if(user_supports(srvc, who, mwAttribute_FILE_TRANSFER)) |
|
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3188 *f++ = _("File Transfer"); |
|
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3189 |
|
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3190 return (*feat)? g_strjoinv(", ", feat): NULL; |
|
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3191 /* jenni loves siege */ |
| 10977 | 3192 } |
| 3193 | |
| 3194 | |
| 3195 static char *mw_prpl_tooltip_text(GaimBuddy *b) { | |
| 3196 GaimConnection *gc; | |
| 3197 struct mwGaimPluginData *pd; | |
| 3198 struct mwAwareIdBlock idb = { mwAware_USER, b->name, NULL }; | |
| 3199 | |
| 3200 GString *str; | |
| 3201 const char *tmp; | |
| 3202 | |
| 3203 gc = b->account->gc; | |
| 3204 pd = gc->proto_data; | |
| 3205 | |
| 3206 str = g_string_new(NULL); | |
| 3207 | |
| 3208 tmp = status_text(b); | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3209 g_string_append_printf(str, _("\n<b>Status</b>: %s"), tmp); |
| 10977 | 3210 |
| 3211 tmp = mwServiceAware_getText(pd->srvc_aware, &idb); | |
|
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
3212 if(tmp) { |
|
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
3213 tmp = g_markup_escape_text(tmp, -1); |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3214 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
|
3215 g_free((char *) tmp); |
|
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
3216 } |
| 10977 | 3217 |
| 3218 tmp = user_supports_text(pd->srvc_aware, b->name); | |
| 3219 if(tmp) { | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3220 g_string_append_printf(str, _("\n<b>Supports</b>: %s"), tmp); |
| 10977 | 3221 g_free((char *) tmp); |
| 3222 } | |
| 3223 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3224 if(buddy_is_external(b)) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3225 g_string_append(str, _("\n<b>External User</b>")); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3226 } |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3227 |
| 10977 | 3228 tmp = str->str; |
| 3229 g_string_free(str, FALSE); | |
| 3230 return (char *) tmp; | |
| 3231 } | |
| 3232 | |
| 3233 | |
| 3234 static GList *mw_prpl_status_types(GaimAccount *acct) { | |
| 3235 GList *types = NULL; | |
| 3236 GaimStatusType *type; | |
| 3237 | |
| 3238 type = gaim_status_type_new(GAIM_STATUS_AVAILABLE, MW_STATE_ACTIVE, | |
| 3239 _("Active"), TRUE); | |
| 3240 gaim_status_type_add_attr(type, MW_STATE_MESSAGE, _("Message"), | |
| 3241 gaim_value_new(GAIM_TYPE_STRING)); | |
| 3242 types = g_list_append(types, type); | |
| 3243 | |
| 3244 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
|
3245 NULL, TRUE); |
| 10977 | 3246 gaim_status_type_add_attr(type, MW_STATE_MESSAGE, _("Message"), |
| 3247 gaim_value_new(GAIM_TYPE_STRING)); | |
| 3248 types = g_list_append(types, type); | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3249 |
| 10977 | 3250 type = gaim_status_type_new(GAIM_STATUS_UNAVAILABLE, MW_STATE_BUSY, |
| 3251 _("Do Not Disturb"), TRUE); | |
| 3252 gaim_status_type_add_attr(type, MW_STATE_MESSAGE, _("Message"), | |
| 3253 gaim_value_new(GAIM_TYPE_STRING)); | |
| 3254 types = g_list_append(types, type); | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3255 |
| 12658 | 3256 type = gaim_status_type_new(GAIM_STATUS_OFFLINE, MW_STATE_OFFLINE, |
| 3257 NULL, TRUE); | |
| 3258 types = g_list_append(types, type); | |
| 3259 | |
| 10977 | 3260 return types; |
| 3261 } | |
| 3262 | |
| 3263 | |
| 3264 static void conf_create_prompt_cancel(GaimBuddy *buddy, | |
| 3265 GaimRequestFields *fields) { | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3266 ; /* nothing to do */ |
| 10977 | 3267 } |
| 3268 | |
| 3269 | |
| 3270 static void conf_create_prompt_join(GaimBuddy *buddy, | |
| 3271 GaimRequestFields *fields) { | |
| 3272 GaimAccount *acct; | |
| 3273 GaimConnection *gc; | |
| 3274 struct mwGaimPluginData *pd; | |
| 3275 struct mwServiceConference *srvc; | |
| 3276 | |
| 3277 GaimRequestField *f; | |
| 3278 | |
| 3279 const char *topic, *invite; | |
| 3280 struct mwConference *conf; | |
| 3281 struct mwIdBlock idb = { NULL, NULL }; | |
| 3282 | |
| 3283 acct = buddy->account; | |
| 3284 gc = gaim_account_get_connection(acct); | |
| 3285 pd = gc->proto_data; | |
| 3286 srvc = pd->srvc_conf; | |
| 3287 | |
| 3288 f = gaim_request_fields_get_field(fields, CHAT_KEY_TOPIC); | |
| 3289 topic = gaim_request_field_string_get_value(f); | |
| 3290 | |
| 3291 f = gaim_request_fields_get_field(fields, CHAT_KEY_INVITE); | |
| 3292 invite = gaim_request_field_string_get_value(f); | |
| 3293 | |
| 3294 conf = mwConference_new(srvc, topic); | |
| 3295 mwConference_open(conf); | |
| 3296 | |
| 3297 idb.user = buddy->name; | |
| 3298 mwConference_invite(conf, &idb, invite); | |
| 3299 } | |
| 3300 | |
| 3301 | |
| 3302 static void blist_menu_conf_create(GaimBuddy *buddy, const char *msg) { | |
| 3303 | |
| 3304 GaimRequestFields *fields; | |
| 3305 GaimRequestFieldGroup *g; | |
| 3306 GaimRequestField *f; | |
| 3307 | |
| 3308 GaimAccount *acct; | |
| 3309 GaimConnection *gc; | |
| 3310 | |
| 3311 char *msgA, *msgB; | |
| 3312 | |
| 3313 g_return_if_fail(buddy != NULL); | |
| 3314 | |
| 3315 acct = buddy->account; | |
| 3316 g_return_if_fail(acct != NULL); | |
| 3317 | |
| 3318 gc = gaim_account_get_connection(acct); | |
| 3319 g_return_if_fail(gc != NULL); | |
| 3320 | |
| 3321 fields = gaim_request_fields_new(); | |
| 3322 | |
| 3323 g = gaim_request_field_group_new(NULL); | |
| 3324 gaim_request_fields_add_group(fields, g); | |
| 3325 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3326 f = gaim_request_field_string_new(CHAT_KEY_TOPIC, _("Topic"), NULL, FALSE); |
| 10977 | 3327 gaim_request_field_group_add_field(g, f); |
| 3328 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3329 f = gaim_request_field_string_new(CHAT_KEY_INVITE, _("Message"), msg, FALSE); |
| 10977 | 3330 gaim_request_field_group_add_field(g, f); |
| 3331 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3332 msgA = _("Create conference with user"); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3333 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
|
3334 " message to be sent to %s"); |
| 10977 | 3335 msgB = g_strdup_printf(msgB, buddy->name); |
| 3336 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3337 gaim_request_fields(gc, _("New Conference"), |
| 10977 | 3338 msgA, msgB, fields, |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3339 _("Create"), G_CALLBACK(conf_create_prompt_join), |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3340 _("Cancel"), G_CALLBACK(conf_create_prompt_cancel), |
| 10977 | 3341 buddy); |
| 3342 g_free(msgB); | |
| 3343 } | |
| 3344 | |
| 3345 | |
| 3346 static void conf_select_prompt_cancel(GaimBuddy *buddy, | |
| 3347 GaimRequestFields *fields) { | |
| 3348 ; | |
| 3349 } | |
| 3350 | |
| 3351 | |
| 3352 static void conf_select_prompt_invite(GaimBuddy *buddy, | |
| 3353 GaimRequestFields *fields) { | |
| 3354 GaimRequestField *f; | |
| 3355 const GList *l; | |
| 3356 const char *msg; | |
| 3357 | |
| 3358 f = gaim_request_fields_get_field(fields, CHAT_KEY_INVITE); | |
| 3359 msg = gaim_request_field_string_get_value(f); | |
| 3360 | |
| 3361 f = gaim_request_fields_get_field(fields, "conf"); | |
| 3362 l = gaim_request_field_list_get_selected(f); | |
| 3363 | |
| 3364 if(l) { | |
| 3365 gpointer d = gaim_request_field_list_get_data(f, l->data); | |
| 3366 | |
| 3367 if(GPOINTER_TO_INT(d) == 0x01) { | |
| 3368 blist_menu_conf_create(buddy, msg); | |
| 3369 | |
| 3370 } else { | |
| 3371 struct mwIdBlock idb = { buddy->name, NULL }; | |
| 3372 mwConference_invite(d, &idb, msg); | |
| 3373 } | |
| 3374 } | |
| 3375 } | |
| 3376 | |
| 3377 | |
| 3378 static void blist_menu_conf_list(GaimBuddy *buddy, | |
| 3379 GList *confs) { | |
| 3380 | |
| 3381 GaimRequestFields *fields; | |
| 3382 GaimRequestFieldGroup *g; | |
| 3383 GaimRequestField *f; | |
| 3384 | |
| 3385 GaimAccount *acct; | |
| 3386 GaimConnection *gc; | |
| 3387 | |
| 3388 char *msgA, *msgB; | |
| 3389 | |
| 3390 acct = buddy->account; | |
| 3391 g_return_if_fail(acct != NULL); | |
| 3392 | |
| 3393 gc = gaim_account_get_connection(acct); | |
| 3394 g_return_if_fail(gc != NULL); | |
| 3395 | |
| 3396 fields = gaim_request_fields_new(); | |
| 3397 | |
| 3398 g = gaim_request_field_group_new(NULL); | |
| 3399 gaim_request_fields_add_group(fields, g); | |
| 3400 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3401 f = gaim_request_field_list_new("conf", _("Available Conferences")); |
| 10977 | 3402 gaim_request_field_list_set_multi_select(f, FALSE); |
| 3403 for(; confs; confs = confs->next) { | |
| 3404 struct mwConference *c = confs->data; | |
| 3405 gaim_request_field_list_add(f, mwConference_getTitle(c), c); | |
| 3406 } | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3407 gaim_request_field_list_add(f, _("Create New Conference..."), |
| 10977 | 3408 GINT_TO_POINTER(0x01)); |
| 3409 gaim_request_field_group_add_field(g, f); | |
| 3410 | |
| 3411 f = gaim_request_field_string_new(CHAT_KEY_INVITE, "Message", NULL, FALSE); | |
| 3412 gaim_request_field_group_add_field(g, f); | |
| 3413 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3414 msgA = _("Invite user to a conference"); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3415 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
|
3416 " 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
|
3417 " create a new conference to invite this user to."); |
| 10977 | 3418 msgB = g_strdup_printf(msgB, buddy->name); |
| 3419 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3420 gaim_request_fields(gc, _("Invite to Conference"), |
| 10977 | 3421 msgA, msgB, fields, |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3422 _("Invite"), G_CALLBACK(conf_select_prompt_invite), |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3423 _("Cancel"), G_CALLBACK(conf_select_prompt_cancel), |
| 10977 | 3424 buddy); |
| 3425 g_free(msgB); | |
| 3426 } | |
| 3427 | |
| 3428 | |
| 3429 static void blist_menu_conf(GaimBlistNode *node, gpointer data) { | |
| 3430 GaimBuddy *buddy = (GaimBuddy *) node; | |
| 3431 GaimAccount *acct; | |
| 3432 GaimConnection *gc; | |
| 3433 struct mwGaimPluginData *pd; | |
| 3434 GList *l; | |
| 3435 | |
| 3436 g_return_if_fail(node != NULL); | |
| 3437 g_return_if_fail(GAIM_BLIST_NODE_IS_BUDDY(node)); | |
| 3438 | |
| 3439 acct = buddy->account; | |
| 3440 g_return_if_fail(acct != NULL); | |
| 3441 | |
| 3442 gc = gaim_account_get_connection(acct); | |
| 3443 g_return_if_fail(gc != NULL); | |
| 3444 | |
| 3445 pd = gc->proto_data; | |
| 3446 g_return_if_fail(pd != NULL); | |
| 3447 | |
|
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
3448 /* |
| 10977 | 3449 - get a list of all conferences on this session |
| 3450 - if none, prompt to create one, and invite buddy to it | |
| 3451 - else, prompt to select a conference or create one | |
| 3452 */ | |
| 3453 | |
| 3454 l = mwServiceConference_getConferences(pd->srvc_conf); | |
| 3455 if(l) { | |
| 3456 blist_menu_conf_list(buddy, l); | |
| 3457 g_list_free(l); | |
| 3458 | |
| 3459 } else { | |
| 3460 blist_menu_conf_create(buddy, NULL); | |
| 3461 } | |
| 3462 } | |
| 3463 | |
| 3464 | |
| 3465 static GList *mw_prpl_blist_node_menu(GaimBlistNode *node) { | |
| 3466 GList *l = NULL; | |
| 3467 GaimBlistNodeAction *act; | |
| 3468 | |
| 3469 if(! GAIM_BLIST_NODE_IS_BUDDY(node)) | |
| 3470 return l; | |
| 3471 | |
| 3472 l = g_list_append(l, NULL); | |
| 3473 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3474 act = gaim_blist_node_action_new(_("Invite to Conference..."), |
| 10977 | 3475 blist_menu_conf, NULL, NULL); |
| 3476 l = g_list_append(l, act); | |
| 3477 | |
| 3478 /** note: this never gets called for a GaimGroup, have to use the | |
| 3479 blist-node-extended-menu signal for that. The function | |
| 3480 blist_node_menu_cb is assigned to this signal in the function | |
| 3481 services_starting */ | |
| 3482 | |
| 3483 return l; | |
| 3484 } | |
| 3485 | |
| 3486 | |
| 3487 static GList *mw_prpl_chat_info(GaimConnection *gc) { | |
| 3488 GList *l = NULL; | |
| 3489 struct proto_chat_entry *pce; | |
| 3490 | |
| 3491 pce = g_new0(struct proto_chat_entry, 1); | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3492 pce->label = _("Topic:"); |
| 10977 | 3493 pce->identifier = CHAT_KEY_TOPIC; |
| 3494 l = g_list_append(l, pce); | |
| 3495 | |
| 3496 return l; | |
| 3497 } | |
| 3498 | |
| 3499 | |
| 3500 static GHashTable *mw_prpl_chat_info_defaults(GaimConnection *gc, | |
| 3501 const char *name) { | |
| 3502 GHashTable *table; | |
| 3503 | |
| 3504 g_return_val_if_fail(gc != NULL, NULL); | |
| 3505 | |
| 3506 table = g_hash_table_new_full(g_str_hash, g_str_equal, | |
| 3507 NULL, g_free); | |
| 3508 | |
| 3509 g_hash_table_insert(table, CHAT_KEY_NAME, g_strdup(name)); | |
| 3510 g_hash_table_insert(table, CHAT_KEY_INVITE, NULL); | |
| 3511 | |
| 3512 return table; | |
| 3513 } | |
| 3514 | |
| 3515 | |
| 11837 | 3516 static void mw_prpl_login(GaimAccount *acct); |
| 10977 | 3517 |
| 3518 | |
| 3519 static void prompt_host_cancel_cb(GaimConnection *gc) { | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3520 gaim_connection_error(gc, _("No Sametime Community Server specified")); |
| 10977 | 3521 } |
| 3522 | |
| 3523 | |
| 3524 static void prompt_host_ok_cb(GaimConnection *gc, const char *host) { | |
| 3525 if(host && *host) { | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3526 GaimAccount *acct = gaim_connection_get_account(gc); |
| 10977 | 3527 gaim_account_set_string(acct, MW_KEY_HOST, host); |
| 11837 | 3528 mw_prpl_login(acct); |
| 10977 | 3529 |
| 3530 } else { | |
| 3531 prompt_host_cancel_cb(gc); | |
| 3532 } | |
| 3533 } | |
| 3534 | |
| 3535 | |
| 3536 static void prompt_host(GaimConnection *gc) { | |
| 3537 GaimAccount *acct; | |
| 3538 char *msg; | |
| 3539 | |
| 3540 acct = gaim_connection_get_account(gc); | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3541 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
|
3542 " Meanwhile account %s. Please enter one below to" |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3543 " continue logging in."); |
| 10977 | 3544 msg = g_strdup_printf(msg, NSTR(gaim_account_get_username(acct))); |
| 3545 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3546 gaim_request_input(gc, _("Meanwhile Connection Setup"), |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3547 _("No Sametime Community Server Specified"), msg, |
| 10977 | 3548 MW_PLUGIN_DEFAULT_HOST, FALSE, FALSE, NULL, |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3549 _("Connect"), G_CALLBACK(prompt_host_ok_cb), |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3550 _("Cancel"), G_CALLBACK(prompt_host_cancel_cb), |
| 10977 | 3551 gc); |
| 3552 | |
| 3553 g_free(msg); | |
| 3554 } | |
| 3555 | |
| 3556 | |
| 11837 | 3557 static void mw_prpl_login(GaimAccount *account) { |
| 10977 | 3558 GaimConnection *gc; |
| 3559 struct mwGaimPluginData *pd; | |
| 3560 | |
| 3561 char *user, *pass, *host; | |
|
12311
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
3562 guint port, client; |
| 10977 | 3563 |
| 3564 gc = gaim_account_get_connection(account); | |
| 3565 pd = mwGaimPluginData_new(gc); | |
| 3566 | |
| 3567 /* while we do support images, the default is to not offer it */ | |
| 3568 gc->flags |= GAIM_CONNECTION_NO_IMAGES; | |
| 3569 | |
| 3570 user = g_strdup(gaim_account_get_username(account)); | |
|
12524
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3571 pass = g_strdup(gaim_account_get_password(account)); |
| 10977 | 3572 |
| 3573 host = strrchr(user, ':'); | |
| 3574 if(host) { | |
| 3575 /* annoying user split from 1.2.0, need to undo it */ | |
| 3576 *host++ = '\0'; | |
| 3577 gaim_account_set_string(account, MW_KEY_HOST, host); | |
| 3578 gaim_account_set_username(account, user); | |
| 3579 | |
| 3580 } else { | |
| 3581 host = (char *) gaim_account_get_string(account, MW_KEY_HOST, | |
| 3582 MW_PLUGIN_DEFAULT_HOST); | |
| 3583 } | |
| 3584 | |
| 3585 if(! host || ! *host) { | |
| 3586 /* somehow, we don't have a host to connect to. Well, we need one | |
| 3587 to actually continue, so let's ask the user directly. */ | |
| 3588 prompt_host(gc); | |
| 3589 return; | |
| 3590 } | |
| 3591 | |
| 3592 port = gaim_account_get_int(account, MW_KEY_PORT, MW_PLUGIN_DEFAULT_PORT); | |
| 3593 | |
| 3594 DEBUG_INFO("user: '%s'\n", user); | |
| 3595 DEBUG_INFO("host: '%s'\n", host); | |
| 3596 DEBUG_INFO("port: %u\n", port); | |
| 3597 | |
|
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
3598 mwSession_setProperty(pd->session, mwSession_NO_SECRET, |
| 10977 | 3599 (char *) no_secret, NULL); |
| 3600 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
|
3601 mwSession_setProperty(pd->session, mwSession_AUTH_PASSWORD, pass, g_free); |
|
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3602 |
|
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3603 client = mwLogin_MEANWHILE; |
|
12311
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
3604 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
|
3605 client = mwLogin_BINARY; |
|
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
3606 |
|
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
3607 DEBUG_INFO("client id: 0x%04x\n", client); |
|
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
3608 |
| 10977 | 3609 mwSession_setProperty(pd->session, mwSession_CLIENT_TYPE_ID, |
|
12311
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
3610 GUINT_TO_POINTER(client), NULL); |
| 10977 | 3611 |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3612 gaim_connection_update_progress(gc, _("Connecting"), 1, MW_CONNECT_STEPS); |
| 10977 | 3613 |
| 3614 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
|
3615 gaim_connection_error(gc, _("Unable to connect to host")); |
| 10977 | 3616 } |
| 3617 } | |
| 3618 | |
| 3619 | |
| 3620 static void mw_prpl_close(GaimConnection *gc) { | |
| 3621 struct mwGaimPluginData *pd; | |
| 3622 | |
| 3623 g_return_if_fail(gc != NULL); | |
| 3624 | |
| 3625 pd = gc->proto_data; | |
| 3626 g_return_if_fail(pd != NULL); | |
| 3627 | |
| 3628 /* get rid of the blist save timeout */ | |
| 3629 if(pd->save_event) { | |
| 3630 gaim_timeout_remove(pd->save_event); | |
| 3631 pd->save_event = 0; | |
| 3632 blist_store(pd); | |
| 3633 } | |
| 3634 | |
| 3635 /* stop the session */ | |
| 3636 mwSession_stop(pd->session, 0x00); | |
| 3637 | |
| 3638 /* no longer necessary */ | |
| 3639 gc->proto_data = NULL; | |
| 3640 | |
| 3641 /* stop watching the socket */ | |
| 3642 if(gc->inpa) { | |
| 3643 gaim_input_remove(gc->inpa); | |
| 3644 gc->inpa = 0; | |
| 3645 } | |
| 3646 | |
| 3647 /* clean up the rest */ | |
| 3648 mwGaimPluginData_free(pd); | |
| 3649 } | |
| 3650 | |
| 3651 | |
|
12735
da9fd490cef9
[gaim-migrate @ 15080]
Christopher O'Brien <siege@pidgin.im>
parents:
12658
diff
changeset
|
3652 static int mw_rand() { |
|
da9fd490cef9
[gaim-migrate @ 15080]
Christopher O'Brien <siege@pidgin.im>
parents:
12658
diff
changeset
|
3653 static int seed = 0; |
|
da9fd490cef9
[gaim-migrate @ 15080]
Christopher O'Brien <siege@pidgin.im>
parents:
12658
diff
changeset
|
3654 |
|
da9fd490cef9
[gaim-migrate @ 15080]
Christopher O'Brien <siege@pidgin.im>
parents:
12658
diff
changeset
|
3655 /* for diversity, not security. don't touch */ |
|
da9fd490cef9
[gaim-migrate @ 15080]
Christopher O'Brien <siege@pidgin.im>
parents:
12658
diff
changeset
|
3656 srand(time(NULL) ^ seed); |
|
da9fd490cef9
[gaim-migrate @ 15080]
Christopher O'Brien <siege@pidgin.im>
parents:
12658
diff
changeset
|
3657 seed = rand(); |
|
da9fd490cef9
[gaim-migrate @ 15080]
Christopher O'Brien <siege@pidgin.im>
parents:
12658
diff
changeset
|
3658 |
|
da9fd490cef9
[gaim-migrate @ 15080]
Christopher O'Brien <siege@pidgin.im>
parents:
12658
diff
changeset
|
3659 return seed; |
|
da9fd490cef9
[gaim-migrate @ 15080]
Christopher O'Brien <siege@pidgin.im>
parents:
12658
diff
changeset
|
3660 } |
|
da9fd490cef9
[gaim-migrate @ 15080]
Christopher O'Brien <siege@pidgin.im>
parents:
12658
diff
changeset
|
3661 |
|
da9fd490cef9
[gaim-migrate @ 15080]
Christopher O'Brien <siege@pidgin.im>
parents:
12658
diff
changeset
|
3662 |
|
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
3663 /** generates a random-ish content id string */ |
| 10977 | 3664 static char *im_mime_content_id() { |
|
12524
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3665 return g_strdup_printf("%03x@%05xmeanwhile", |
|
12735
da9fd490cef9
[gaim-migrate @ 15080]
Christopher O'Brien <siege@pidgin.im>
parents:
12658
diff
changeset
|
3666 mw_rand() & 0xfff, mw_rand() & 0xfffff); |
| 10977 | 3667 } |
| 3668 | |
| 3669 | |
|
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
3670 /** generates a multipart/related content type with a random-ish |
|
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
3671 boundary value */ |
| 10977 | 3672 static char *im_mime_content_type() { |
|
12422
fe42d9c111f9
[gaim-migrate @ 14729]
Richard Laager <rlaager@wiktel.com>
parents:
12312
diff
changeset
|
3673 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
|
3674 mw_rand() & 0xfff, mw_rand() & 0xffff); |
| 10977 | 3675 } |
| 3676 | |
| 3677 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3678 /** determine content type from extension. Not so happy about this, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3679 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
|
3680 static char *im_mime_img_content_type(GaimStoredImage *img) { |
| 10977 | 3681 const char *fn = gaim_imgstore_get_filename(img); |
|
12105
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3682 const char *ct = NULL; |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3683 |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3684 ct = strrchr(fn, '.'); |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3685 if(! ct) { |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3686 ct = "image"; |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3687 |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3688 } else if(! strcmp(".png", ct)) { |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3689 ct = "image/png"; |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3690 |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3691 } else if(! strcmp(".jpg", ct)) { |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3692 ct = "image/jpeg"; |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3693 |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3694 } else if(! strcmp(".jpeg", ct)) { |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3695 ct = "image/jpeg"; |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3696 |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3697 } else if(! strcmp(".gif", ct)) { |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3698 ct = "image/gif"; |
| 10977 | 3699 |
| 3700 } else { | |
|
12105
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3701 ct = "image"; |
| 10977 | 3702 } |
|
12105
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 return g_strdup_printf("%s; name=\"%s\"", ct, fn); |
| 10977 | 3705 } |
| 3706 | |
| 3707 | |
| 3708 static char *im_mime_img_content_disp(GaimStoredImage *img) { | |
| 3709 const char *fn = gaim_imgstore_get_filename(img); | |
| 3710 return g_strdup_printf("attachment; filename=\"%s\"", fn); | |
| 3711 } | |
| 3712 | |
| 3713 | |
|
12105
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3714 static char *nb_im_encode(GaimConnection *gc, const char *message) { |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3715 GaimAccount *acct; |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3716 const char *enc; |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3717 char *ret; |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3718 GError *error = NULL; |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3719 |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3720 acct = gaim_connection_get_account(gc); |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3721 g_return_val_if_fail(acct != NULL, NULL); |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3722 |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3723 enc = gaim_account_get_string(acct, MW_KEY_ENCODING, |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3724 MW_PLUGIN_DEFAULT_ENCODING); |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3725 g_return_val_if_fail(enc != NULL, NULL); |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3726 |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3727 ret = g_convert_with_fallback(message, strlen(message), |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3728 enc, "UTF-8", "?", |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3729 NULL, NULL, &error); |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3730 |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3731 if(error) { |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3732 DEBUG_INFO("problem converting to %s: %s\n", |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3733 enc, NSTR(error->message)); |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3734 g_error_free(error); |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3735 } |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3736 |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3737 /* something went so wrong that not even the fallback worked */ |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3738 if(! ret) ret = g_strdup(message); |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3739 |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3740 return ret; |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3741 } |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3742 |
|
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 static gboolean is_nb(struct mwConversation *conv) { |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3745 struct mwLoginInfo *info; |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3746 |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3747 info = mwConversation_getTargetInfo(conv); |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3748 if(! info) return FALSE; |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3749 |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3750 /* 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
|
3751 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
|
3752 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
|
3753 we can discount the real 0x1000 */ |
|
12105
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3754 /* 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
|
3755 really did. Oh well. CURSE YOU NOTESBUDDY */ |
|
12524
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3756 return ((info->type == 0x1000) || ((info->type & 0xff00) == 0x1400)); |
|
12105
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 |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3759 |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3760 /** 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
|
3761 static char *im_mime_convert(GaimConnection *gc, |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3762 struct mwConversation *conv, |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3763 const char *message) { |
| 10977 | 3764 GString *str; |
| 3765 GaimMimeDocument *doc; | |
| 3766 GaimMimePart *part; | |
| 3767 | |
| 3768 GData *attr; | |
| 3769 char *tmp, *start, *end; | |
| 3770 | |
| 3771 str = g_string_new(NULL); | |
| 3772 | |
| 3773 doc = gaim_mime_document_new(); | |
| 3774 | |
| 3775 gaim_mime_document_set_field(doc, "Mime-Version", "1.0"); | |
| 3776 gaim_mime_document_set_field(doc, "Content-Disposition", "inline"); | |
| 3777 | |
| 3778 tmp = im_mime_content_type(); | |
| 3779 gaim_mime_document_set_field(doc, "Content-Type", tmp); | |
| 3780 g_free(tmp); | |
| 3781 | |
| 3782 tmp = (char *) message; | |
| 3783 while(*tmp && gaim_markup_find_tag("img", tmp, (const char **) &start, | |
| 3784 (const char **) &end, &attr)) { | |
| 3785 char *id; | |
| 3786 GaimStoredImage *img = NULL; | |
| 3787 | |
| 3788 gsize len = (start - tmp); | |
| 3789 | |
| 3790 /* append the in-between-tags text */ | |
| 3791 if(len) g_string_append_len(str, tmp, len); | |
| 3792 | |
| 3793 /* find the imgstore data by the id tag */ | |
| 3794 id = g_datalist_get_data(&attr, "id"); | |
| 3795 if(id && *id) | |
| 3796 img = gaim_imgstore_get(atoi(id)); | |
| 3797 | |
| 3798 if(img) { | |
| 3799 char *cid; | |
| 3800 gpointer data; | |
| 3801 size_t size; | |
| 3802 | |
| 3803 part = gaim_mime_part_new(doc); | |
| 3804 | |
| 3805 data = im_mime_img_content_disp(img); | |
| 3806 gaim_mime_part_set_field(part, "Content-Disposition", data); | |
| 3807 g_free(data); | |
| 3808 | |
|
12105
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3809 data = im_mime_img_content_type(img); |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3810 gaim_mime_part_set_field(part, "Content-Type", data); |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3811 g_free(data); |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3812 |
| 10977 | 3813 cid = im_mime_content_id(); |
| 3814 data = g_strdup_printf("<%s>", cid); | |
| 3815 gaim_mime_part_set_field(part, "Content-ID", data); | |
| 3816 g_free(data); | |
| 3817 | |
| 3818 gaim_mime_part_set_field(part, "Content-transfer-encoding", "base64"); | |
| 3819 | |
| 3820 /* obtain and base64 encode the image data, and put it in the | |
| 3821 mime part */ | |
| 3822 data = gaim_imgstore_get_data(img); | |
| 3823 size = gaim_imgstore_get_size(img); | |
| 3824 data = gaim_base64_encode(data, (gsize) size); | |
| 3825 gaim_mime_part_set_data(part, data); | |
| 3826 g_free(data); | |
| 3827 | |
| 3828 /* append the modified tag */ | |
| 3829 g_string_append_printf(str, "<img src=\"cid:%s\">", cid); | |
| 3830 g_free(cid); | |
| 3831 | |
| 3832 } else { | |
| 3833 /* append the literal image tag, since we couldn't find a | |
| 3834 relative imgstore object */ | |
| 3835 gsize len = (end - start) + 1; | |
| 3836 g_string_append_len(str, start, len); | |
| 3837 } | |
| 3838 | |
| 3839 g_datalist_clear(&attr); | |
| 3840 tmp = end + 1; | |
| 3841 } | |
| 3842 | |
| 3843 /* append left-overs */ | |
| 3844 g_string_append(str, tmp); | |
| 3845 | |
|
12105
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3846 /* add the text/html part */ |
| 10977 | 3847 part = gaim_mime_part_new(doc); |
| 3848 gaim_mime_part_set_field(part, "Content-Disposition", "inline"); | |
|
12105
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3849 |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3850 if(is_nb(conv)) { |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3851 GaimAccount *acct = gaim_connection_get_account(gc); |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3852 |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3853 tmp = (char *) gaim_account_get_string(acct, MW_KEY_ENCODING, |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3854 MW_PLUGIN_DEFAULT_ENCODING); |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3855 tmp = g_strdup_printf("text/html; charset=\"%s\"", tmp); |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3856 gaim_mime_part_set_field(part, "Content-Type", tmp); |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3857 g_free(tmp); |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3858 |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3859 gaim_mime_part_set_field(part, "Content-Transfer-Encoding", "7bit"); |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3860 |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3861 tmp = nb_im_encode(gc, str->str); |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3862 gaim_mime_part_set_data(part, tmp); |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3863 g_free(tmp); |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3864 |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3865 } else { |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3866 gaim_mime_part_set_field(part, "Content-Type", "text/html"); |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3867 gaim_mime_part_set_field(part, "Content-Transfer-Encoding", "8bit"); |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3868 gaim_mime_part_set_data(part, str->str); |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3869 } |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3870 |
| 10977 | 3871 g_string_free(str, TRUE); |
| 3872 | |
| 3873 str = g_string_new(NULL); | |
| 3874 gaim_mime_document_write(doc, str); | |
| 3875 tmp = str->str; | |
| 3876 g_string_free(str, FALSE); | |
| 3877 | |
| 3878 return tmp; | |
| 3879 } | |
| 3880 | |
| 3881 | |
| 3882 static int mw_prpl_send_im(GaimConnection *gc, | |
| 3883 const char *name, | |
| 3884 const char *message, | |
| 12216 | 3885 GaimMessageFlags flags) { |
| 10977 | 3886 |
| 3887 struct mwGaimPluginData *pd; | |
| 3888 struct mwIdBlock who = { (char *) name, NULL }; | |
| 3889 struct mwConversation *conv; | |
| 3890 | |
| 3891 g_return_val_if_fail(gc != NULL, 0); | |
| 3892 pd = gc->proto_data; | |
| 3893 | |
| 3894 g_return_val_if_fail(pd != NULL, 0); | |
| 3895 | |
| 3896 conv = mwServiceIm_getConversation(pd->srvc_im, &who); | |
| 3897 | |
| 3898 /* this detection of features to determine how to send the message | |
| 3899 (plain, html, or mime) is flawed because the other end of the | |
| 3900 conversation could close their channel at any time, rendering any | |
| 3901 existing formatting in an outgoing message innapropriate. The end | |
| 3902 result is that it may be possible that the other side of the | |
| 3903 conversation will receive a plaintext message with html contents, | |
| 3904 which is bad. I'm not sure how to fix this correctly. */ | |
| 3905 | |
|
12105
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3906 if(strstr(message, "<img ") || strstr(message, "<IMG ")) |
| 12216 | 3907 flags |= GAIM_MESSAGE_IMAGES; |
| 10977 | 3908 |
| 3909 if(mwConversation_isOpen(conv)) { | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3910 char *tmp; |
| 10977 | 3911 int ret; |
| 3912 | |
| 12216 | 3913 if((flags & GAIM_MESSAGE_IMAGES) && |
| 10977 | 3914 mwConversation_supports(conv, mwImSend_MIME)) { |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3915 /* send a MIME message */ |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3916 |
|
12105
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3917 tmp = im_mime_convert(gc, conv, message); |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3918 ret = mwConversation_send(conv, mwImSend_MIME, tmp); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3919 g_free(tmp); |
| 10977 | 3920 |
| 3921 } else if(mwConversation_supports(conv, mwImSend_HTML)) { | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3922 /* send an HTML message */ |
| 10977 | 3923 |
|
12005
5b3368008513
[gaim-migrate @ 14298]
Christopher O'Brien <siege@pidgin.im>
parents:
11953
diff
changeset
|
3924 if(is_nb(conv)) { |
|
12105
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3925 |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3926 /* html messages need the notesbuddy hack */ |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3927 char *msg = nb_im_encode(gc, message); |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3928 tmp = gaim_strdup_withhtml(msg); |
|
12005
5b3368008513
[gaim-migrate @ 14298]
Christopher O'Brien <siege@pidgin.im>
parents:
11953
diff
changeset
|
3929 g_free(msg); |
|
12105
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3930 |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3931 } else { |
|
12524
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3932 /* 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
|
3933 tmp = gaim_strdup_withhtml(message); |
|
12005
5b3368008513
[gaim-migrate @ 14298]
Christopher O'Brien <siege@pidgin.im>
parents:
11953
diff
changeset
|
3934 } |
|
5b3368008513
[gaim-migrate @ 14298]
Christopher O'Brien <siege@pidgin.im>
parents:
11953
diff
changeset
|
3935 |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3936 ret = mwConversation_send(conv, mwImSend_HTML, tmp); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3937 g_free(tmp); |
| 10977 | 3938 |
| 3939 } else { | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3940 /* default to text */ |
|
12524
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3941 tmp = gaim_markup_strip_html(message); |
| 12216 | 3942 ret = mwConversation_send(conv, mwImSend_PLAIN, tmp); |
|
12524
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3943 g_free(tmp); |
| 10977 | 3944 } |
| 3945 | |
| 3946 return !ret; | |
|
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
3947 |
|
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
3948 } else { |
|
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
3949 |
|
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
3950 /* queue up the message safely as plain text */ |
|
12105
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3951 char *tmp = gaim_markup_strip_html(message); |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3952 convo_queue(conv, mwImSend_PLAIN, tmp); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3953 g_free(tmp); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3954 |
|
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
3955 if(! mwConversation_isPending(conv)) |
|
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
3956 mwConversation_open(conv); |
|
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
3957 |
|
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
3958 return 1; |
| 10977 | 3959 } |
| 3960 } | |
| 3961 | |
| 3962 | |
| 3963 static int mw_prpl_send_typing(GaimConnection *gc, const char *name, | |
| 3964 int typing) { | |
| 3965 | |
| 3966 struct mwGaimPluginData *pd; | |
| 3967 struct mwIdBlock who = { (char *) name, NULL }; | |
| 3968 struct mwConversation *conv; | |
| 3969 | |
| 3970 gpointer t = GINT_TO_POINTER(!! typing); | |
| 3971 | |
| 3972 g_return_val_if_fail(gc != NULL, 0); | |
| 3973 pd = gc->proto_data; | |
| 3974 | |
| 3975 g_return_val_if_fail(pd != NULL, 0); | |
| 3976 | |
| 3977 conv = mwServiceIm_getConversation(pd->srvc_im, &who); | |
| 3978 | |
| 3979 if(mwConversation_isOpen(conv)) | |
| 3980 return ! mwConversation_send(conv, mwImSend_TYPING, t); | |
| 3981 | |
| 3982 if(typing) { | |
| 3983 /* let's only open a channel for typing, not for not-typing. | |
| 3984 Otherwise two users in psychic mode will continually open | |
| 3985 conversations to each other, never able to get rid of them, as | |
| 3986 when the other person closes, it psychicaly opens again */ | |
| 3987 | |
| 3988 convo_queue(conv, mwImSend_TYPING, t); | |
| 3989 | |
| 3990 if(! mwConversation_isPending(conv)) | |
| 3991 mwConversation_open(conv); | |
| 3992 } | |
| 3993 | |
| 3994 return 1; | |
| 3995 } | |
| 3996 | |
| 3997 | |
|
12311
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
3998 static const char *mw_client_name(guint16 type) { |
|
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
3999 switch(type) { |
|
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4000 case mwLogin_LIB: |
|
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4001 return "Lotus Binary Library"; |
|
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4002 |
|
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4003 case mwLogin_JAVA_WEB: |
|
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4004 return "Lotus Java Client Applet"; |
|
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4005 |
|
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4006 case mwLogin_BINARY: |
|
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4007 return "Lotus Sametime Connect"; |
|
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4008 |
|
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4009 case mwLogin_JAVA_APP: |
|
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4010 return "Lotus Java Client Application"; |
|
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4011 |
|
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4012 case mwLogin_LINKS: |
|
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4013 return "Lotus Sametime Links"; |
|
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4014 |
|
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4015 case mwLogin_NOTES_6_5: |
|
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4016 case mwLogin_NOTES_6_5_3: |
|
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4017 case mwLogin_NOTES_7_0_beta: |
|
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4018 case mwLogin_NOTES_7_0: |
|
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4019 return "Lotus Notes Client"; |
|
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4020 |
|
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4021 case mwLogin_ICT: |
|
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4022 case mwLogin_ICT_1_7_8_2: |
|
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4023 case mwLogin_ICT_SIP: |
|
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4024 return "IBM Community Tools"; |
|
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4025 |
|
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4026 case mwLogin_NOTESBUDDY_4_14: |
|
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4027 case mwLogin_NOTESBUDDY_4_15: |
|
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4028 case mwLogin_NOTESBUDDY_4_16: |
|
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4029 return "Alphaworks NotesBuddy"; |
|
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4030 |
|
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4031 case mwLogin_SANITY: |
|
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4032 return "Sanity"; |
|
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4033 |
|
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4034 case mwLogin_ST_PERL: |
|
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4035 return "ST-Send-Message"; |
|
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4036 |
|
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4037 case mwLogin_TRILLIAN: |
|
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4038 case mwLogin_TRILLIAN_IBM: |
|
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4039 return "Trillian"; |
|
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4040 |
|
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4041 case mwLogin_MEANWHILE: |
|
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4042 return "Meanwhile"; |
|
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 default: |
|
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4045 return NULL; |
|
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 } |
|
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4048 |
|
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4049 |
| 10977 | 4050 static void mw_prpl_get_info(GaimConnection *gc, const char *who) { |
| 4051 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4052 struct mwAwareIdBlock idb = { mwAware_USER, (char *) who, NULL }; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4053 |
| 10977 | 4054 struct mwGaimPluginData *pd; |
| 4055 GaimAccount *acct; | |
| 4056 GaimBuddy *b; | |
| 4057 | |
| 4058 GString *str; | |
| 4059 const char *tmp; | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4060 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4061 g_return_if_fail(who != NULL); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4062 g_return_if_fail(*who != '\0'); |
| 10977 | 4063 |
| 4064 pd = gc->proto_data; | |
| 4065 | |
| 4066 acct = gaim_connection_get_account(gc); | |
| 4067 b = gaim_find_buddy(acct, who); | |
| 4068 | |
| 4069 str = g_string_new(NULL); | |
| 4070 | |
| 12166 | 4071 if(gaim_str_has_prefix(who, "@E ")) { |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4072 g_string_append(str, _("<b>External User</b><br>")); |
| 10977 | 4073 } |
| 4074 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4075 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
|
4076 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4077 if(b) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4078 guint32 type; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4079 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4080 if(b->server_alias) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4081 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
|
4082 b->server_alias); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4083 } |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4084 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4085 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
|
4086 if(type) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4087 g_string_append(str, _("<b>Last Known Client:</b> ")); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4088 |
|
12311
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4089 tmp = mw_client_name(type); |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4090 if(tmp) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4091 g_string_append(str, tmp); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4092 g_string_append(str, "<br>"); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4093 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4094 } else { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4095 g_string_append_printf(str, _("Unknown (0x%04x)<br>"), type); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4096 } |
| 10977 | 4097 } |
| 4098 } | |
| 4099 | |
| 4100 tmp = user_supports_text(pd->srvc_aware, who); | |
| 4101 if(tmp) { | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4102 g_string_append_printf(str, _("<b>Supports:</b> %s<br>"), tmp); |
| 10977 | 4103 g_free((char *) tmp); |
| 4104 } | |
| 4105 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4106 if(b) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4107 tmp = status_text(b); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4108 g_string_append_printf(str, _("<b>Status:</b> %s"), tmp); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4109 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4110 g_string_append(str, "<hr>"); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4111 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4112 tmp = mwServiceAware_getText(pd->srvc_aware, &idb); |
|
12496
f9d0ab1474ac
[gaim-migrate @ 14808]
Christopher O'Brien <siege@pidgin.im>
parents:
12489
diff
changeset
|
4113 if(tmp) { |
|
f9d0ab1474ac
[gaim-migrate @ 14808]
Christopher O'Brien <siege@pidgin.im>
parents:
12489
diff
changeset
|
4114 tmp = g_markup_escape_text(tmp, -1); |
|
f9d0ab1474ac
[gaim-migrate @ 14808]
Christopher O'Brien <siege@pidgin.im>
parents:
12489
diff
changeset
|
4115 g_string_append(str, tmp); |
|
f9d0ab1474ac
[gaim-migrate @ 14808]
Christopher O'Brien <siege@pidgin.im>
parents:
12489
diff
changeset
|
4116 g_free((char *) tmp); |
|
f9d0ab1474ac
[gaim-migrate @ 14808]
Christopher O'Brien <siege@pidgin.im>
parents:
12489
diff
changeset
|
4117 } |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4118 } |
| 10977 | 4119 |
| 4120 /* @todo emit a signal to allow a plugin to override the display of | |
| 4121 this notification, so that it can create its own */ | |
| 4122 | |
|
11533
c9b815aeddc1
[gaim-migrate @ 13782]
Richard Laager <rlaager@wiktel.com>
parents:
11531
diff
changeset
|
4123 gaim_notify_userinfo(gc, who, str->str, NULL, NULL); |
| 10977 | 4124 |
| 4125 g_string_free(str, TRUE); | |
| 4126 } | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4127 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4128 |
| 11638 | 4129 static void mw_prpl_set_status(GaimAccount *acct, GaimStatus *status) { |
| 4130 GaimConnection *gc; | |
| 4131 const char *state; | |
|
11641
925c1960af34
[gaim-migrate @ 13918]
Richard Laager <rlaager@wiktel.com>
parents:
11638
diff
changeset
|
4132 char *message = NULL; |
| 10977 | 4133 struct mwSession *session; |
| 4134 struct mwUserStatus stat; | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4135 |
| 10977 | 4136 g_return_if_fail(acct != NULL); |
| 11638 | 4137 gc = gaim_account_get_connection(acct); |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4138 |
| 11638 | 4139 state = gaim_status_get_id(status); |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4140 |
|
12105
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
4141 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
|
4142 |
| 11638 | 4143 g_return_if_fail(gc != NULL); |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4144 |
| 10977 | 4145 session = gc_to_session(gc); |
| 4146 g_return_if_fail(session != NULL); | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4147 |
| 10977 | 4148 /* get a working copy of the current status */ |
| 4149 mwUserStatus_clone(&stat, mwSession_getUserStatus(session)); | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4150 |
| 10977 | 4151 /* determine the state */ |
| 11638 | 4152 if(! strcmp(state, MW_STATE_ACTIVE)) { |
| 10977 | 4153 stat.status = mwStatus_ACTIVE; |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4154 |
| 11638 | 4155 } else if(! strcmp(state, MW_STATE_AWAY)) { |
| 4156 stat.status = mwStatus_AWAY; | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4157 |
| 11638 | 4158 } else if(! strcmp(state, MW_STATE_BUSY)) { |
| 4159 stat.status = mwStatus_BUSY; | |
| 10977 | 4160 } |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4161 |
| 10977 | 4162 /* determine the message */ |
|
12105
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
4163 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
|
4164 |
| 10977 | 4165 if(message) { |
| 4166 /* all the possible non-NULL values of message up to this point | |
| 4167 are const, so we don't need to free them */ | |
| 4168 message = gaim_markup_strip_html(message); | |
| 4169 } | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4170 |
| 10977 | 4171 /* out with the old */ |
| 4172 g_free(stat.desc); | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4173 |
| 10977 | 4174 /* in with the new */ |
| 4175 stat.desc = (char *) message; | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4176 |
| 10977 | 4177 mwSession_setUserStatus(session, &stat); |
| 11638 | 4178 mwUserStatus_clear(&stat); |
| 10977 | 4179 } |
| 4180 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4181 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4182 static void mw_prpl_set_idle(GaimConnection *gc, int t) { |
| 10977 | 4183 struct mwSession *session; |
| 4184 struct mwUserStatus stat; | |
|
12105
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
4185 |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
4186 |
| 10977 | 4187 session = gc_to_session(gc); |
| 4188 g_return_if_fail(session != NULL); | |
|
12105
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
4189 |
| 10977 | 4190 mwUserStatus_clone(&stat, mwSession_getUserStatus(session)); |
| 4191 | |
|
12105
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
4192 if(t) { |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
4193 time_t now = time(NULL); |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
4194 stat.time = now - t; |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
4195 |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
4196 } else { |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
4197 stat.time = 0; |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
4198 } |
|
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
4199 |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4200 if(t > 0 && stat.status == mwStatus_ACTIVE) { |
|
12105
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
4201 /* we were active and went idle, so change the status to IDLE. */ |
| 10977 | 4202 stat.status = mwStatus_IDLE; |
|
12105
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
4203 |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4204 } else if(t == 0 && stat.status == mwStatus_IDLE) { |
|
12105
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
4205 /* we only become idle automatically, so change back to ACTIVE */ |
| 10977 | 4206 stat.status = mwStatus_ACTIVE; |
| 4207 } | |
|
12105
d4cd7d443795
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
4208 |
| 10977 | 4209 mwSession_setUserStatus(session, &stat); |
| 4210 mwUserStatus_clear(&stat); | |
|
12624
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4211 } |
|
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4212 |
|
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4213 |
|
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4214 static void notify_im(GaimConnection *gc, GList *row) { |
| 10977 | 4215 GaimAccount *acct; |
|
12624
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4216 GaimConversation *conv; |
|
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4217 char *id; |
|
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4218 |
|
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4219 acct = gaim_connection_get_account(gc); |
|
12631
e8da8f12e694
[gaim-migrate @ 14967]
Christopher O'Brien <siege@pidgin.im>
parents:
12630
diff
changeset
|
4220 id = g_list_nth_data(row, 1); |
|
12624
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4221 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
|
4222 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
|
4223 gaim_conversation_present(conv); |
|
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4224 } |
|
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4225 |
|
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4226 |
|
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4227 static void notify_add(GaimConnection *gc, GList *row) { |
|
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4228 gaim_blist_request_add_buddy(gaim_connection_get_account(gc), |
|
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4229 g_list_nth_data(row, 1), NULL, |
|
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4230 g_list_nth_data(row, 0)); |
|
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4231 } |
|
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4232 |
|
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4233 |
|
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4234 static void notify_close(gpointer data) { |
|
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4235 ; |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4236 } |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4237 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4238 |
| 10977 | 4239 static void multi_resolved_query(struct mwResolveResult *result, |
|
12624
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4240 GaimConnection *gc) { |
| 10977 | 4241 GList *l; |
| 4242 char *msgA, *msgB; | |
| 4243 | |
|
12624
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4244 GaimNotifySearchResults *sres; |
|
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4245 GaimNotifySearchColumn *scol; |
|
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4246 |
|
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4247 sres = gaim_notify_searchresults_new(); |
|
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4248 |
|
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4249 scol = gaim_notify_searchresults_column_new(_("User Name")); |
|
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4250 gaim_notify_searchresults_column_add(sres, scol); |
|
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4251 |
|
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4252 scol = gaim_notify_searchresults_column_new(_("Sametime ID")); |
|
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4253 gaim_notify_searchresults_column_add(sres, scol); |
|
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 gaim_notify_searchresults_button_add(sres, GAIM_NOTIFY_BUTTON_IM, |
|
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4256 notify_im); |
|
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4257 |
|
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4258 gaim_notify_searchresults_button_add(sres, GAIM_NOTIFY_BUTTON_ADD, |
|
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4259 notify_add); |
|
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4260 |
| 10977 | 4261 for(l = result->matches; l; l = l->next) { |
| 4262 struct mwResolveMatch *match = l->data; | |
|
12624
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4263 GList *row = NULL; |
|
12524
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
4264 |
|
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
4265 DEBUG_INFO("multi resolve: %s, %s\n", |
|
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
4266 NSTR(match->id), NSTR(match->name)); |
|
977ebab0435f
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
4267 |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4268 if(!match->id || !match->name) |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4269 continue; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4270 |
|
12624
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4271 row = g_list_append(row, g_strdup(match->name)); |
|
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4272 row = g_list_append(row, g_strdup(match->id)); |
|
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4273 gaim_notify_searchresults_row_add(sres, row); |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4274 } |
| 10977 | 4275 |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4276 msgA = _("An ambiguous user ID was entered"); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4277 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
|
4278 " 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
|
4279 " add them to your buddy list."); |
| 10977 | 4280 msgB = g_strdup_printf(msgB, result->name); |
| 4281 | |
|
12624
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4282 gaim_notify_searchresults(gc, _("Select User"), |
|
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4283 msgA, msgB, sres, notify_close, NULL); |
|
12630
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
4284 |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
4285 g_free(msgB); |
| 10977 | 4286 } |
| 4287 | |
| 4288 | |
| 4289 static void add_buddy_resolved(struct mwServiceResolve *srvc, | |
| 4290 guint32 id, guint32 code, GList *results, | |
| 4291 gpointer b) { | |
| 4292 | |
| 4293 struct mwResolveResult *res = NULL; | |
| 4294 GaimBuddy *buddy = b; | |
| 4295 GaimConnection *gc; | |
| 4296 struct mwGaimPluginData *pd; | |
| 4297 | |
| 4298 gc = gaim_account_get_connection(buddy->account); | |
| 4299 pd = gc->proto_data; | |
| 4300 | |
| 4301 if(results) | |
| 4302 res = results->data; | |
| 4303 | |
| 4304 if(!code && res && res->matches) { | |
| 4305 if(g_list_length(res->matches) == 1) { | |
| 4306 struct mwResolveMatch *match = res->matches->data; | |
| 4307 | |
| 4308 /* only one? that might be the right one! */ | |
| 4309 if(strcmp(res->name, match->id)) { | |
| 4310 /* uh oh, the single result isn't identical to the search | |
| 4311 term, better safe then sorry, so let's make sure it's who | |
| 4312 the user meant to add */ | |
|
12624
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4313 gaim_blist_remove_buddy(buddy); |
|
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4314 multi_resolved_query(res, gc); |
| 10977 | 4315 |
| 4316 } else { | |
|
12624
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4317 /* same person, set the server alias */ |
|
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4318 gaim_blist_server_alias_buddy(buddy, match->name); |
|
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4319 gaim_blist_node_set_string((GaimBlistNode *) buddy, |
|
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4320 BUDDY_KEY_NAME, match->name); |
|
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4321 blist_schedule(pd); |
| 10977 | 4322 } |
| 4323 | |
| 4324 } else { | |
| 4325 /* prompt user if more than one match was returned */ | |
|
12624
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4326 gaim_blist_remove_buddy(buddy); |
|
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4327 multi_resolved_query(res, gc); |
| 10977 | 4328 } |
| 4329 | |
| 4330 return; | |
| 4331 } | |
| 4332 | |
| 4333 /* fall-through indicates that we couldn't find a matching user in | |
| 4334 the resolve service (ether error or zero results), so we remove | |
| 4335 this buddy */ | |
| 4336 | |
| 4337 DEBUG_INFO("no such buddy in community\n"); | |
| 4338 gaim_blist_remove_buddy(buddy); | |
| 4339 blist_schedule(pd); | |
| 4340 | |
| 4341 if(res && res->name) { | |
| 4342 /* compose and display an error message */ | |
| 4343 char *msgA, *msgB; | |
| 4344 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4345 msgA = _("Unable to add user: user not found"); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4346 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4347 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
|
4348 " Sametime community. This entry has been removed from" |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4349 " your buddy list."); |
| 10977 | 4350 msgB = g_strdup_printf(msgB, NSTR(res->name)); |
| 4351 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4352 gaim_notify_error(gc, _("Unable to add user"), msgA, msgB); |
| 10977 | 4353 |
| 4354 g_free(msgB); | |
| 4355 } | |
| 4356 } | |
| 4357 | |
| 4358 | |
| 4359 static void mw_prpl_add_buddy(GaimConnection *gc, | |
| 4360 GaimBuddy *buddy, | |
| 4361 GaimGroup *group) { | |
| 4362 | |
| 4363 struct mwGaimPluginData *pd; | |
| 4364 struct mwServiceResolve *srvc; | |
| 4365 GList *query; | |
| 4366 enum mwResolveFlag flags; | |
| 4367 guint32 req; | |
| 4368 | |
| 4369 pd = gc->proto_data; | |
| 4370 srvc = pd->srvc_resolve; | |
| 4371 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4372 /* 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
|
4373 if(buddy_is_external(buddy)) { |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4374 buddy_add(pd, buddy); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4375 return; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4376 } |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4377 |
| 10977 | 4378 query = g_list_prepend(NULL, buddy->name); |
| 4379 flags = mwResolveFlag_FIRST | mwResolveFlag_USERS; | |
| 4380 | |
| 4381 req = mwServiceResolve_resolve(srvc, query, flags, add_buddy_resolved, | |
| 4382 buddy, NULL); | |
| 4383 g_list_free(query); | |
| 4384 | |
| 4385 if(req == SEARCH_ERROR) { | |
| 4386 gaim_blist_remove_buddy(buddy); | |
| 4387 blist_schedule(pd); | |
| 4388 } | |
| 4389 } | |
| 4390 | |
| 4391 | |
| 4392 static void foreach_add_buddies(GaimGroup *group, GList *buddies, | |
| 4393 struct mwGaimPluginData *pd) { | |
| 4394 struct mwAwareList *list; | |
| 4395 | |
| 4396 list = list_ensure(pd, group); | |
| 4397 mwAwareList_addAware(list, buddies); | |
| 4398 g_list_free(buddies); | |
| 4399 } | |
| 4400 | |
| 4401 | |
| 4402 static void mw_prpl_add_buddies(GaimConnection *gc, | |
| 4403 GList *buddies, | |
| 4404 GList *groups) { | |
| 4405 | |
| 4406 struct mwGaimPluginData *pd; | |
| 4407 GHashTable *group_sets; | |
| 4408 struct mwAwareIdBlock *idbs, *idb; | |
| 4409 | |
| 4410 pd = gc->proto_data; | |
| 4411 | |
| 4412 /* map GaimGroup:GList of mwAwareIdBlock */ | |
| 4413 group_sets = g_hash_table_new(g_direct_hash, g_direct_equal); | |
| 4414 | |
| 4415 /* bunch of mwAwareIdBlock allocated at once, free'd at once */ | |
| 4416 idb = idbs = g_new(struct mwAwareIdBlock, g_list_length(buddies)); | |
| 4417 | |
| 4418 /* first pass collects mwAwareIdBlock lists for each group */ | |
| 4419 for(; buddies; buddies = buddies->next) { | |
| 4420 GaimBuddy *b = buddies->data; | |
| 4421 GaimGroup *g; | |
| 4422 const char *fn; | |
| 4423 GList *l; | |
| 4424 | |
| 4425 /* nab the saved server alias and stick it on the buddy */ | |
| 4426 fn = gaim_blist_node_get_string((GaimBlistNode *) b, BUDDY_KEY_NAME); | |
| 4427 gaim_blist_server_alias_buddy(b, fn); | |
| 4428 | |
| 4429 /* convert GaimBuddy into a mwAwareIdBlock */ | |
| 4430 idb->type = mwAware_USER; | |
| 4431 idb->user = (char *) b->name; | |
| 4432 idb->community = NULL; | |
| 4433 | |
| 4434 /* put idb into the list associated with the buddy's group */ | |
| 12088 | 4435 g = gaim_buddy_get_group(b); |
| 10977 | 4436 l = g_hash_table_lookup(group_sets, g); |
| 4437 l = g_list_prepend(l, idb++); | |
| 4438 g_hash_table_insert(group_sets, g, l); | |
| 4439 } | |
| 4440 | |
| 4441 /* each group's buddies get added in one shot, and schedule the blist | |
| 4442 for saving */ | |
| 4443 g_hash_table_foreach(group_sets, (GHFunc) foreach_add_buddies, pd); | |
| 4444 blist_schedule(pd); | |
| 4445 | |
| 4446 /* cleanup */ | |
| 4447 g_hash_table_destroy(group_sets); | |
| 4448 g_free(idbs); | |
| 4449 } | |
| 4450 | |
| 4451 | |
| 4452 static void mw_prpl_remove_buddy(GaimConnection *gc, | |
| 4453 GaimBuddy *buddy, GaimGroup *group) { | |
| 4454 | |
| 4455 struct mwGaimPluginData *pd; | |
| 4456 struct mwAwareIdBlock idb = { mwAware_USER, buddy->name, NULL }; | |
| 4457 struct mwAwareList *list; | |
| 4458 | |
| 4459 GList *rem = g_list_prepend(NULL, &idb); | |
| 4460 | |
| 4461 pd = gc->proto_data; | |
| 12088 | 4462 group = gaim_buddy_get_group(buddy); |
| 10977 | 4463 list = list_ensure(pd, group); |
| 4464 | |
| 4465 mwAwareList_removeAware(list, rem); | |
| 4466 blist_schedule(pd); | |
| 4467 | |
| 4468 g_list_free(rem); | |
| 4469 } | |
| 4470 | |
| 4471 | |
| 4472 static void privacy_fill(struct mwPrivacyInfo *priv, | |
| 4473 GSList *members) { | |
| 4474 | |
| 4475 struct mwUserItem *u; | |
| 4476 guint count; | |
| 4477 | |
| 4478 count = g_slist_length(members); | |
|
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
4479 DEBUG_INFO("privacy_fill: %u members\n", count); |
| 10977 | 4480 |
| 4481 priv->count = count; | |
| 4482 priv->users = g_new0(struct mwUserItem, count); | |
| 4483 | |
| 4484 while(count--) { | |
| 4485 u = priv->users + count; | |
| 4486 u->id = members->data; | |
| 4487 members = members->next; | |
| 4488 } | |
| 4489 } | |
| 4490 | |
| 4491 | |
| 4492 static void mw_prpl_set_permit_deny(GaimConnection *gc) { | |
| 4493 GaimAccount *acct; | |
| 4494 struct mwGaimPluginData *pd; | |
| 4495 struct mwSession *session; | |
| 4496 | |
| 4497 struct mwPrivacyInfo privacy = { | |
| 4498 .deny = FALSE, | |
| 4499 .count = 0, | |
| 4500 .users = NULL, | |
| 4501 }; | |
| 4502 | |
| 4503 g_return_if_fail(gc != NULL); | |
| 4504 | |
| 4505 acct = gaim_connection_get_account(gc); | |
| 4506 g_return_if_fail(acct != NULL); | |
| 4507 | |
| 4508 pd = gc->proto_data; | |
| 4509 g_return_if_fail(pd != NULL); | |
| 4510 | |
| 4511 session = pd->session; | |
| 4512 g_return_if_fail(session != NULL); | |
| 4513 | |
| 4514 switch(acct->perm_deny) { | |
| 4515 case GAIM_PRIVACY_DENY_USERS: | |
| 4516 DEBUG_INFO("GAIM_PRIVACY_DENY_USERS\n"); | |
| 4517 privacy_fill(&privacy, acct->deny); | |
|
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
4518 privacy.deny = TRUE; |
|
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
4519 break; |
| 10977 | 4520 |
| 4521 case GAIM_PRIVACY_ALLOW_ALL: | |
| 4522 DEBUG_INFO("GAIM_PRIVACY_ALLOW_ALL\n"); | |
| 4523 privacy.deny = TRUE; | |
| 4524 break; | |
| 4525 | |
| 4526 case GAIM_PRIVACY_ALLOW_USERS: | |
| 4527 DEBUG_INFO("GAIM_PRIVACY_ALLOW_USERS\n"); | |
| 4528 privacy_fill(&privacy, acct->permit); | |
|
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
4529 privacy.deny = FALSE; |
|
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
4530 break; |
| 10977 | 4531 |
| 4532 case GAIM_PRIVACY_DENY_ALL: | |
| 4533 DEBUG_INFO("GAIM_PRIVACY_DENY_ALL\n"); | |
| 4534 privacy.deny = FALSE; | |
| 4535 break; | |
| 4536 | |
| 4537 default: | |
| 4538 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
|
4539 return; |
| 10977 | 4540 } |
| 4541 | |
| 4542 mwSession_setPrivacyInfo(session, &privacy); | |
| 4543 g_free(privacy.users); | |
| 4544 } | |
| 4545 | |
| 4546 | |
| 4547 static void mw_prpl_add_permit(GaimConnection *gc, const char *name) { | |
| 4548 mw_prpl_set_permit_deny(gc); | |
| 4549 } | |
| 4550 | |
| 4551 | |
| 4552 static void mw_prpl_add_deny(GaimConnection *gc, const char *name) { | |
| 4553 mw_prpl_set_permit_deny(gc); | |
| 4554 } | |
| 4555 | |
| 4556 | |
| 4557 static void mw_prpl_rem_permit(GaimConnection *gc, const char *name) { | |
| 4558 mw_prpl_set_permit_deny(gc); | |
| 4559 } | |
| 4560 | |
| 4561 | |
| 4562 static void mw_prpl_rem_deny(GaimConnection *gc, const char *name) { | |
| 4563 mw_prpl_set_permit_deny(gc); | |
| 4564 } | |
| 4565 | |
| 4566 | |
| 4567 static struct mwConference *conf_find(struct mwServiceConference *srvc, | |
| 4568 const char *name) { | |
| 4569 GList *l, *ll; | |
| 4570 struct mwConference *conf = NULL; | |
| 4571 | |
| 4572 ll = mwServiceConference_getConferences(srvc); | |
| 4573 for(l = ll; l; l = l->next) { | |
| 4574 struct mwConference *c = l->data; | |
| 4575 if(! strcmp(name, mwConference_getName(c))) { | |
| 4576 conf = c; | |
| 4577 break; | |
| 4578 } | |
| 4579 } | |
| 4580 g_list_free(ll); | |
| 4581 | |
| 4582 return conf; | |
| 4583 } | |
| 4584 | |
| 4585 | |
| 4586 static void mw_prpl_join_chat(GaimConnection *gc, | |
| 4587 GHashTable *components) { | |
| 4588 | |
| 4589 struct mwGaimPluginData *pd; | |
| 4590 char *c, *t; | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4591 |
| 10977 | 4592 pd = gc->proto_data; |
| 4593 | |
| 4594 c = g_hash_table_lookup(components, CHAT_KEY_NAME); | |
| 4595 t = g_hash_table_lookup(components, CHAT_KEY_TOPIC); | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4596 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4597 if(g_hash_table_lookup(components, CHAT_KEY_IS_PLACE)) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4598 /* use place service */ |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4599 struct mwServicePlace *srvc; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4600 struct mwPlace *place = NULL; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4601 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4602 srvc = pd->srvc_place; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4603 place = mwPlace_new(srvc, c, t); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4604 mwPlace_open(place); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4605 |
| 10977 | 4606 } else { |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4607 /* use conference service */ |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4608 struct mwServiceConference *srvc; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4609 struct mwConference *conf = NULL; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4610 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4611 srvc = pd->srvc_conf; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4612 if(c) conf = conf_find(srvc, c); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4613 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4614 if(conf) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4615 DEBUG_INFO("accepting conference invitation\n"); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4616 mwConference_accept(conf); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4617 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4618 } else { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4619 DEBUG_INFO("creating new conference\n"); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4620 conf = mwConference_new(srvc, t); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4621 mwConference_open(conf); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4622 } |
| 10977 | 4623 } |
| 4624 } | |
| 4625 | |
| 4626 | |
| 4627 static void mw_prpl_reject_chat(GaimConnection *gc, | |
| 4628 GHashTable *components) { | |
| 4629 | |
| 4630 struct mwGaimPluginData *pd; | |
| 4631 struct mwServiceConference *srvc; | |
| 4632 char *c; | |
| 4633 | |
| 4634 pd = gc->proto_data; | |
| 4635 srvc = pd->srvc_conf; | |
| 4636 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4637 if(g_hash_table_lookup(components, CHAT_KEY_IS_PLACE)) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4638 ; /* nothing needs doing */ |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4639 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4640 } else { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4641 /* reject conference */ |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4642 c = g_hash_table_lookup(components, CHAT_KEY_NAME); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4643 if(c) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4644 struct mwConference *conf = conf_find(srvc, c); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4645 if(conf) mwConference_reject(conf, ERR_SUCCESS, "Declined"); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4646 } |
| 10977 | 4647 } |
| 4648 } | |
| 4649 | |
| 4650 | |
| 4651 static char *mw_prpl_get_chat_name(GHashTable *components) { | |
| 4652 return g_hash_table_lookup(components, CHAT_KEY_NAME); | |
| 4653 } | |
| 4654 | |
| 4655 | |
| 4656 static void mw_prpl_chat_invite(GaimConnection *gc, | |
| 4657 int id, | |
| 4658 const char *invitation, | |
| 4659 const char *who) { | |
| 4660 | |
| 4661 struct mwGaimPluginData *pd; | |
| 4662 struct mwConference *conf; | |
|
12107
40724851e95e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
4663 struct mwPlace *place; |
| 10977 | 4664 struct mwIdBlock idb = { (char *) who, NULL }; |
| 4665 | |
| 4666 pd = gc->proto_data; | |
| 4667 g_return_if_fail(pd != NULL); | |
|
12107
40724851e95e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
4668 |
| 10977 | 4669 conf = ID_TO_CONF(pd, id); |
| 4670 | |
|
12107
40724851e95e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
4671 if(conf) { |
|
40724851e95e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
4672 mwConference_invite(conf, &idb, invitation); |
|
40724851e95e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
4673 return; |
|
40724851e95e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
4674 } |
|
40724851e95e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
4675 |
|
40724851e95e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
4676 place = ID_TO_PLACE(pd, id); |
|
40724851e95e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
4677 g_return_if_fail(place != NULL); |
|
40724851e95e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
4678 |
|
40724851e95e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
4679 /* @todo: use the IM service for invitation */ |
|
40724851e95e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
4680 mwPlace_legacyInvite(place, &idb, invitation); |
| 10977 | 4681 } |
| 4682 | |
| 4683 | |
| 4684 static void mw_prpl_chat_leave(GaimConnection *gc, | |
| 4685 int id) { | |
| 4686 | |
| 4687 struct mwGaimPluginData *pd; | |
| 4688 struct mwConference *conf; | |
| 4689 | |
| 4690 pd = gc->proto_data; | |
| 4691 | |
| 4692 g_return_if_fail(pd != NULL); | |
| 4693 conf = ID_TO_CONF(pd, id); | |
| 4694 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4695 if(conf) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4696 mwConference_destroy(conf, ERR_SUCCESS, "Leaving"); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4697 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4698 } else { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4699 struct mwPlace *place = ID_TO_PLACE(pd, id); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4700 g_return_if_fail(place != NULL); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4701 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4702 mwPlace_destroy(place, ERR_SUCCESS); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4703 } |
| 10977 | 4704 } |
| 4705 | |
| 4706 | |
| 4707 static void mw_prpl_chat_whisper(GaimConnection *gc, | |
| 4708 int id, | |
| 4709 const char *who, | |
| 4710 const char *message) { | |
| 4711 | |
| 4712 mw_prpl_send_im(gc, who, message, 0); | |
| 4713 } | |
| 4714 | |
| 4715 | |
| 4716 static int mw_prpl_chat_send(GaimConnection *gc, | |
| 4717 int id, | |
| 12216 | 4718 const char *message, |
| 4719 GaimMessageFlags flags) { | |
| 10977 | 4720 |
| 4721 struct mwGaimPluginData *pd; | |
| 4722 struct mwConference *conf; | |
| 4723 | |
| 4724 pd = gc->proto_data; | |
| 4725 | |
| 4726 g_return_val_if_fail(pd != NULL, 0); | |
| 4727 conf = ID_TO_CONF(pd, id); | |
| 4728 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4729 if(conf) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4730 return ! mwConference_sendText(conf, message); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4731 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4732 } else { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4733 struct mwPlace *place = ID_TO_PLACE(pd, id); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4734 g_return_val_if_fail(place != NULL, 0); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4735 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4736 return ! mwPlace_sendText(place, message); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4737 } |
| 10977 | 4738 } |
| 4739 | |
| 4740 | |
| 4741 static void mw_prpl_keepalive(GaimConnection *gc) { | |
| 4742 struct mwSession *session; | |
| 4743 | |
| 4744 g_return_if_fail(gc != NULL); | |
| 4745 | |
| 4746 session = gc_to_session(gc); | |
| 4747 g_return_if_fail(session != NULL); | |
| 4748 | |
| 4749 mwSession_sendKeepalive(session); | |
| 4750 } | |
| 4751 | |
| 4752 | |
| 4753 static void mw_prpl_alias_buddy(GaimConnection *gc, | |
| 4754 const char *who, | |
| 4755 const char *alias) { | |
| 4756 | |
| 4757 struct mwGaimPluginData *pd = gc->proto_data; | |
| 4758 g_return_if_fail(pd != NULL); | |
| 4759 | |
| 4760 /* it's a change to the buddy list, so we've gotta reflect that in | |
| 4761 the server copy */ | |
| 4762 | |
| 4763 blist_schedule(pd); | |
| 4764 } | |
| 4765 | |
| 4766 | |
| 4767 static void mw_prpl_group_buddy(GaimConnection *gc, | |
| 4768 const char *who, | |
| 4769 const char *old_group, | |
| 4770 const char *new_group) { | |
| 4771 | |
| 4772 struct mwAwareIdBlock idb = { mwAware_USER, (char *) who, NULL }; | |
| 4773 GList *gl = g_list_prepend(NULL, &idb); | |
| 4774 | |
| 4775 struct mwGaimPluginData *pd = gc->proto_data; | |
| 4776 GaimGroup *group; | |
| 4777 struct mwAwareList *list; | |
| 4778 | |
| 4779 /* add who to new_group's aware list */ | |
| 4780 group = gaim_find_group(new_group); | |
| 4781 list = list_ensure(pd, group); | |
| 4782 mwAwareList_addAware(list, gl); | |
| 4783 | |
| 4784 /* remove who from old_group's aware list */ | |
| 4785 group = gaim_find_group(old_group); | |
| 4786 list = list_ensure(pd, group); | |
| 4787 mwAwareList_removeAware(list, gl); | |
| 4788 | |
| 4789 g_list_free(gl); | |
| 4790 | |
| 4791 /* schedule the changes to be saved */ | |
| 4792 blist_schedule(pd); | |
| 4793 } | |
| 4794 | |
| 4795 | |
| 4796 static void mw_prpl_rename_group(GaimConnection *gc, | |
| 4797 const char *old, | |
| 4798 GaimGroup *group, | |
| 4799 GList *buddies) { | |
| 4800 | |
| 4801 struct mwGaimPluginData *pd = gc->proto_data; | |
| 4802 g_return_if_fail(pd != NULL); | |
| 4803 | |
| 4804 /* it's a change in the buddy list, so we've gotta reflect that in | |
| 4805 the server copy. Also, having this function should prevent all | |
| 4806 those buddies from being removed and re-added. We don't really | |
| 4807 give a crap what the group is named in Gaim other than to record | |
| 4808 that as the group name/alias */ | |
| 4809 | |
| 4810 blist_schedule(pd); | |
| 4811 } | |
| 4812 | |
| 4813 | |
| 4814 static void mw_prpl_buddy_free(GaimBuddy *buddy) { | |
| 4815 /* I don't think we have any cleanup for buddies yet */ | |
| 4816 ; | |
| 4817 } | |
| 4818 | |
| 4819 | |
| 4820 static void mw_prpl_convo_closed(GaimConnection *gc, const char *who) { | |
| 4821 struct mwGaimPluginData *pd = gc->proto_data; | |
| 4822 struct mwServiceIm *srvc; | |
| 4823 struct mwConversation *conv; | |
| 4824 struct mwIdBlock idb = { (char *) who, NULL }; | |
| 4825 | |
| 4826 g_return_if_fail(pd != NULL); | |
| 4827 | |
| 4828 srvc = pd->srvc_im; | |
| 4829 g_return_if_fail(srvc != NULL); | |
| 4830 | |
| 4831 conv = mwServiceIm_findConversation(srvc, &idb); | |
| 4832 if(! conv) return; | |
| 4833 | |
| 4834 if(mwConversation_isOpen(conv)) | |
| 4835 mwConversation_free(conv); | |
| 4836 } | |
| 4837 | |
| 4838 | |
| 4839 static const char *mw_prpl_normalize(const GaimAccount *account, | |
| 4840 const char *id) { | |
| 4841 | |
| 4842 /* code elsewhere assumes that the return value points to different | |
| 4843 memory than the passed value, but it won't free the normalized | |
| 4844 data. wtf? */ | |
| 4845 | |
| 4846 static char buf[BUF_LEN]; | |
| 4847 strncpy(buf, id, sizeof(buf)); | |
| 4848 return buf; | |
| 4849 } | |
| 4850 | |
| 4851 | |
| 4852 static void mw_prpl_remove_group(GaimConnection *gc, GaimGroup *group) { | |
| 4853 struct mwGaimPluginData *pd; | |
| 4854 struct mwAwareList *list; | |
| 4855 | |
| 4856 pd = gc->proto_data; | |
| 4857 g_return_if_fail(pd != NULL); | |
| 4858 g_return_if_fail(pd->group_list_map != NULL); | |
| 4859 | |
| 4860 list = g_hash_table_lookup(pd->group_list_map, group); | |
| 4861 | |
| 4862 if(list) { | |
| 4863 g_hash_table_remove(pd->group_list_map, list); | |
| 4864 g_hash_table_remove(pd->group_list_map, group); | |
| 4865 mwAwareList_free(list); | |
| 4866 | |
| 4867 blist_schedule(pd); | |
| 4868 } | |
| 4869 } | |
| 4870 | |
| 4871 | |
| 4872 static gboolean mw_prpl_can_receive_file(GaimConnection *gc, | |
| 4873 const char *who) { | |
| 4874 struct mwGaimPluginData *pd; | |
| 4875 struct mwServiceAware *srvc; | |
| 4876 GaimAccount *acct; | |
| 4877 | |
| 4878 g_return_val_if_fail(gc != NULL, FALSE); | |
| 4879 | |
| 4880 pd = gc->proto_data; | |
| 4881 g_return_val_if_fail(pd != NULL, FALSE); | |
| 4882 | |
| 4883 srvc = pd->srvc_aware; | |
| 4884 g_return_val_if_fail(srvc != NULL, FALSE); | |
| 4885 | |
| 4886 acct = gaim_connection_get_account(gc); | |
| 4887 g_return_val_if_fail(acct != NULL, FALSE); | |
| 4888 | |
| 4889 return gaim_find_buddy(acct, who) && | |
| 4890 user_supports(srvc, who, mwAttribute_FILE_TRANSFER); | |
| 4891 } | |
| 4892 | |
| 4893 | |
| 4894 static void ft_outgoing_init(GaimXfer *xfer) { | |
| 4895 GaimAccount *acct; | |
| 4896 GaimConnection *gc; | |
| 4897 | |
| 4898 struct mwGaimPluginData *pd; | |
| 4899 struct mwServiceFileTransfer *srvc; | |
| 4900 struct mwFileTransfer *ft; | |
| 4901 | |
| 4902 const char *filename; | |
| 4903 gsize filesize; | |
| 4904 FILE *fp; | |
| 4905 | |
| 4906 struct mwIdBlock idb = { NULL, NULL }; | |
| 4907 | |
| 4908 DEBUG_INFO("ft_outgoing_init\n"); | |
| 4909 | |
| 4910 acct = gaim_xfer_get_account(xfer); | |
| 4911 gc = gaim_account_get_connection(acct); | |
| 4912 pd = gc->proto_data; | |
| 4913 srvc = pd->srvc_ft; | |
| 4914 | |
| 4915 filename = gaim_xfer_get_local_filename(xfer); | |
| 4916 filesize = gaim_xfer_get_size(xfer); | |
| 4917 idb.user = xfer->who; | |
| 4918 | |
| 4919 /* test that we can actually send the file */ | |
| 4920 fp = g_fopen(filename, "rb"); | |
| 4921 if(! fp) { | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4922 char *msg = g_strdup_printf(_("Error reading file %s: \n%s\n"), |
| 10977 | 4923 filename, strerror(errno)); |
| 4924 gaim_xfer_error(gaim_xfer_get_type(xfer), acct, xfer->who, msg); | |
| 4925 g_free(msg); | |
| 4926 return; | |
| 4927 } | |
| 4928 fclose(fp); | |
| 4929 | |
| 4930 { | |
| 4931 char *tmp = strrchr(filename, G_DIR_SEPARATOR); | |
| 4932 if(tmp++) filename = tmp; | |
| 4933 } | |
| 4934 | |
| 4935 ft = mwFileTransfer_new(srvc, &idb, NULL, filename, filesize); | |
| 4936 | |
| 4937 gaim_xfer_ref(xfer); | |
| 4938 mwFileTransfer_setClientData(ft, xfer, (GDestroyNotify) gaim_xfer_unref); | |
| 4939 xfer->data = ft; | |
| 4940 | |
| 4941 mwFileTransfer_offer(ft); | |
| 4942 } | |
| 4943 | |
| 4944 | |
| 4945 static void ft_outgoing_cancel(GaimXfer *xfer) { | |
| 4946 struct mwFileTransfer *ft = xfer->data; | |
| 4947 if(ft) mwFileTransfer_cancel(ft); | |
| 4948 } | |
| 4949 | |
| 4950 | |
| 12147 | 4951 static GaimXfer *mw_prpl_new_xfer(GaimConnection *gc, const char *who) { |
| 10977 | 4952 GaimAccount *acct; |
| 4953 GaimXfer *xfer; | |
| 4954 | |
| 4955 acct = gaim_connection_get_account(gc); | |
| 4956 | |
| 4957 xfer = gaim_xfer_new(acct, GAIM_XFER_SEND, who); | |
| 4958 gaim_xfer_set_init_fnc(xfer, ft_outgoing_init); | |
| 4959 gaim_xfer_set_cancel_send_fnc(xfer, ft_outgoing_cancel); | |
| 4960 | |
|
12143
cbebda5f019c
[gaim-migrate @ 14444]
Richard Laager <rlaager@wiktel.com>
parents:
12135
diff
changeset
|
4961 return xfer; |
|
cbebda5f019c
[gaim-migrate @ 14444]
Richard Laager <rlaager@wiktel.com>
parents:
12135
diff
changeset
|
4962 } |
|
cbebda5f019c
[gaim-migrate @ 14444]
Richard Laager <rlaager@wiktel.com>
parents:
12135
diff
changeset
|
4963 |
|
cbebda5f019c
[gaim-migrate @ 14444]
Richard Laager <rlaager@wiktel.com>
parents:
12135
diff
changeset
|
4964 static void mw_prpl_send_file(GaimConnection *gc, |
|
cbebda5f019c
[gaim-migrate @ 14444]
Richard Laager <rlaager@wiktel.com>
parents:
12135
diff
changeset
|
4965 const char *who, const char *file) { |
|
cbebda5f019c
[gaim-migrate @ 14444]
Richard Laager <rlaager@wiktel.com>
parents:
12135
diff
changeset
|
4966 |
|
cbebda5f019c
[gaim-migrate @ 14444]
Richard Laager <rlaager@wiktel.com>
parents:
12135
diff
changeset
|
4967 GaimXfer *xfer = mw_prpl_new_xfer(gc, who); |
|
cbebda5f019c
[gaim-migrate @ 14444]
Richard Laager <rlaager@wiktel.com>
parents:
12135
diff
changeset
|
4968 |
| 10977 | 4969 if(file) { |
| 4970 DEBUG_INFO("file != NULL\n"); | |
| 4971 gaim_xfer_request_accepted(xfer, file); | |
| 4972 | |
| 4973 } else { | |
| 4974 DEBUG_INFO("file == NULL\n"); | |
| 4975 gaim_xfer_request(xfer); | |
| 4976 } | |
| 4977 } | |
| 4978 | |
| 4979 | |
| 4980 static GaimPluginProtocolInfo mw_prpl_info = { | |
| 4981 .options = OPT_PROTO_IM_IMAGE, | |
| 4982 .user_splits = NULL, /*< set in mw_plugin_init */ | |
| 4983 .protocol_options = NULL, /*< set in mw_plugin_init */ | |
| 4984 .icon_spec = NO_BUDDY_ICONS, | |
| 4985 .list_icon = mw_prpl_list_icon, | |
| 4986 .list_emblems = mw_prpl_list_emblems, | |
| 4987 .status_text = mw_prpl_status_text, | |
| 4988 .tooltip_text = mw_prpl_tooltip_text, | |
| 4989 .status_types = mw_prpl_status_types, | |
| 4990 .blist_node_menu = mw_prpl_blist_node_menu, | |
| 4991 .chat_info = mw_prpl_chat_info, | |
| 4992 .chat_info_defaults = mw_prpl_chat_info_defaults, | |
| 4993 .login = mw_prpl_login, | |
| 4994 .close = mw_prpl_close, | |
| 4995 .send_im = mw_prpl_send_im, | |
| 4996 .set_info = NULL, | |
| 4997 .send_typing = mw_prpl_send_typing, | |
| 4998 .get_info = mw_prpl_get_info, | |
| 11638 | 4999 .set_status = mw_prpl_set_status, |
| 10977 | 5000 .set_idle = mw_prpl_set_idle, |
| 5001 .change_passwd = NULL, | |
| 5002 .add_buddy = mw_prpl_add_buddy, | |
| 5003 .add_buddies = mw_prpl_add_buddies, | |
| 5004 .remove_buddy = mw_prpl_remove_buddy, | |
| 5005 .remove_buddies = NULL, | |
| 5006 .add_permit = mw_prpl_add_permit, | |
| 5007 .add_deny = mw_prpl_add_deny, | |
| 5008 .rem_permit = mw_prpl_rem_permit, | |
| 5009 .rem_deny = mw_prpl_rem_deny, | |
| 5010 .set_permit_deny = mw_prpl_set_permit_deny, | |
| 5011 .join_chat = mw_prpl_join_chat, | |
| 5012 .reject_chat = mw_prpl_reject_chat, | |
| 5013 .get_chat_name = mw_prpl_get_chat_name, | |
| 5014 .chat_invite = mw_prpl_chat_invite, | |
| 5015 .chat_leave = mw_prpl_chat_leave, | |
| 5016 .chat_whisper = mw_prpl_chat_whisper, | |
| 5017 .chat_send = mw_prpl_chat_send, | |
| 5018 .keepalive = mw_prpl_keepalive, | |
| 5019 .register_user = NULL, | |
| 5020 .get_cb_info = NULL, | |
| 5021 .get_cb_away = NULL, | |
| 5022 .alias_buddy = mw_prpl_alias_buddy, | |
| 5023 .group_buddy = mw_prpl_group_buddy, | |
| 5024 .rename_group = mw_prpl_rename_group, | |
| 5025 .buddy_free = mw_prpl_buddy_free, | |
| 5026 .convo_closed = mw_prpl_convo_closed, | |
| 5027 .normalize = mw_prpl_normalize, | |
| 5028 .set_buddy_icon = NULL, | |
| 5029 .remove_group = mw_prpl_remove_group, | |
| 5030 .get_cb_real_name = NULL, | |
| 5031 .set_chat_topic = NULL, | |
| 5032 .find_blist_chat = NULL, | |
| 5033 .roomlist_get_list = NULL, | |
| 5034 .roomlist_expand_category = NULL, | |
| 5035 .can_receive_file = mw_prpl_can_receive_file, | |
| 5036 .send_file = mw_prpl_send_file, | |
|
12143
cbebda5f019c
[gaim-migrate @ 14444]
Richard Laager <rlaager@wiktel.com>
parents:
12135
diff
changeset
|
5037 .new_xfer = mw_prpl_new_xfer, |
| 12650 | 5038 .offline_message = NULL, |
| 5039 .whiteboard_prpl_ops = NULL, | |
| 5040 .media_prpl_ops = NULL, | |
| 10977 | 5041 }; |
| 5042 | |
| 5043 | |
| 5044 static GaimPluginPrefFrame * | |
| 5045 mw_plugin_get_plugin_pref_frame(GaimPlugin *plugin) { | |
| 5046 GaimPluginPrefFrame *frame; | |
| 5047 GaimPluginPref *pref; | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5048 |
| 10977 | 5049 frame = gaim_plugin_pref_frame_new(); |
| 5050 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5051 pref = gaim_plugin_pref_new_with_label(_("Remotely Stored Buddy List")); |
| 10977 | 5052 gaim_plugin_pref_frame_add(frame, pref); |
| 5053 | |
| 5054 | |
| 5055 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
|
5056 gaim_plugin_pref_set_label(pref, _("Buddy List Storage Mode")); |
| 10977 | 5057 |
| 5058 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
|
5059 gaim_plugin_pref_add_choice(pref, _("Local Buddy List Only"), |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5060 GINT_TO_POINTER(blist_choice_LOCAL)); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5061 gaim_plugin_pref_add_choice(pref, _("Merge List from Server"), |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5062 GINT_TO_POINTER(blist_choice_MERGE)); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5063 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
|
5064 GINT_TO_POINTER(blist_choice_STORE)); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5065 gaim_plugin_pref_add_choice(pref, _("Synchronize List with Server"), |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5066 GINT_TO_POINTER(blist_choice_SYNCH)); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5067 |
| 10977 | 5068 gaim_plugin_pref_frame_add(frame, pref); |
| 5069 | |
| 5070 return frame; | |
| 5071 } | |
| 5072 | |
| 5073 | |
| 5074 static GaimPluginUiInfo mw_plugin_ui_info = { | |
| 5075 .get_plugin_pref_frame = mw_plugin_get_plugin_pref_frame, | |
| 5076 }; | |
| 5077 | |
| 5078 | |
| 5079 static void st_import_action_cb(GaimConnection *gc, char *filename) { | |
| 5080 struct mwSametimeList *l; | |
| 5081 | |
| 5082 FILE *file; | |
| 5083 char buf[BUF_LEN]; | |
| 5084 size_t len; | |
| 5085 | |
| 5086 GString *str; | |
| 5087 | |
| 5088 file = fopen(filename, "r"); | |
| 5089 g_return_if_fail(file != NULL); | |
| 5090 | |
| 5091 str = g_string_new(NULL); | |
| 5092 while( (len = fread(buf, 1, BUF_LEN, file)) ) { | |
| 5093 g_string_append_len(str, buf, len); | |
| 5094 } | |
| 5095 | |
| 5096 fclose(file); | |
| 5097 | |
| 5098 l = mwSametimeList_load(str->str); | |
| 5099 g_string_free(str, TRUE); | |
| 5100 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5101 blist_merge(gc, l); |
| 10977 | 5102 mwSametimeList_free(l); |
| 5103 } | |
| 5104 | |
| 5105 | |
| 5106 /** prompts for a file to import blist from */ | |
| 5107 static void st_import_action(GaimPluginAction *act) { | |
| 5108 GaimConnection *gc; | |
| 5109 GaimAccount *account; | |
| 5110 char *title; | |
| 5111 | |
| 5112 gc = act->context; | |
| 5113 account = gaim_connection_get_account(gc); | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5114 title = g_strdup_printf(_("Import Sametime List for Account %s"), |
| 10977 | 5115 gaim_account_get_username(account)); |
| 5116 | |
| 5117 gaim_request_file(gc, title, NULL, FALSE, | |
| 5118 G_CALLBACK(st_import_action_cb), NULL, | |
| 5119 gc); | |
| 5120 | |
| 5121 g_free(title); | |
| 5122 } | |
| 5123 | |
| 5124 | |
| 5125 static void st_export_action_cb(GaimConnection *gc, char *filename) { | |
| 5126 struct mwSametimeList *l; | |
| 5127 char *str; | |
| 5128 FILE *file; | |
| 5129 | |
| 5130 file = fopen(filename, "w"); | |
| 5131 g_return_if_fail(file != NULL); | |
| 5132 | |
| 5133 l = mwSametimeList_new(); | |
| 5134 blist_export(gc, l); | |
| 5135 str = mwSametimeList_store(l); | |
| 5136 mwSametimeList_free(l); | |
| 5137 | |
| 5138 fprintf(file, "%s", str); | |
| 5139 fclose(file); | |
| 5140 | |
| 5141 g_free(str); | |
| 5142 } | |
| 5143 | |
| 5144 | |
| 5145 /** prompts for a file to export blist to */ | |
| 5146 static void st_export_action(GaimPluginAction *act) { | |
| 5147 GaimConnection *gc; | |
| 5148 GaimAccount *account; | |
| 5149 char *title; | |
| 5150 | |
| 5151 gc = act->context; | |
| 5152 account = gaim_connection_get_account(gc); | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5153 title = g_strdup_printf(_("Export Sametime List for Account %s"), |
| 10977 | 5154 gaim_account_get_username(account)); |
| 5155 | |
| 5156 gaim_request_file(gc, title, NULL, TRUE, | |
| 5157 G_CALLBACK(st_export_action_cb), NULL, | |
| 5158 gc); | |
| 5159 | |
| 5160 g_free(title); | |
| 5161 } | |
| 5162 | |
| 5163 | |
| 5164 static void remote_group_multi_cleanup(gpointer ignore, | |
| 5165 GaimRequestFields *fields) { | |
| 5166 | |
| 5167 GaimRequestField *f; | |
| 5168 const GList *l; | |
| 5169 | |
| 5170 f = gaim_request_fields_get_field(fields, "group"); | |
| 5171 l = gaim_request_field_list_get_items(f); | |
| 5172 | |
| 5173 for(; l; l = l->next) { | |
| 5174 const char *i = l->data; | |
|
12624
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
5175 struct named_id *res; |
| 10977 | 5176 |
| 5177 res = gaim_request_field_list_get_data(f, i); | |
| 5178 | |
| 5179 g_free(res->id); | |
| 5180 g_free(res->name); | |
| 5181 g_free(res); | |
| 5182 } | |
| 5183 } | |
| 5184 | |
| 5185 | |
| 5186 static void remote_group_done(struct mwGaimPluginData *pd, | |
| 5187 const char *id, const char *name) { | |
| 5188 GaimConnection *gc; | |
| 5189 GaimAccount *acct; | |
| 5190 GaimGroup *group; | |
| 5191 GaimBlistNode *gn; | |
| 5192 const char *owner; | |
| 5193 | |
| 5194 g_return_if_fail(pd != NULL); | |
| 5195 | |
| 5196 gc = pd->gc; | |
| 5197 acct = gaim_connection_get_account(gc); | |
| 5198 | |
| 5199 /* collision checking */ | |
| 5200 group = gaim_find_group(name); | |
| 5201 if(group) { | |
| 5202 char *msgA, *msgB; | |
| 5203 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5204 msgA = _("Unable to add group: group exists"); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5205 msgB = _("A group named '%s' already exists in your buddy list."); |
| 10977 | 5206 msgB = g_strdup_printf(msgB, name); |
| 5207 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5208 gaim_notify_error(gc, _("Unable to add group"), msgA, msgB); |
| 10977 | 5209 |
| 5210 g_free(msgB); | |
| 5211 return; | |
| 5212 } | |
| 5213 | |
| 5214 group = gaim_group_new(name); | |
| 5215 gn = (GaimBlistNode *) group; | |
| 5216 | |
| 5217 owner = gaim_account_get_username(acct); | |
| 5218 | |
| 5219 gaim_blist_node_set_string(gn, GROUP_KEY_NAME, id); | |
| 5220 gaim_blist_node_set_int(gn, GROUP_KEY_TYPE, mwSametimeGroup_DYNAMIC); | |
| 5221 gaim_blist_node_set_string(gn, GROUP_KEY_OWNER, owner); | |
| 5222 gaim_blist_add_group(group, NULL); | |
| 5223 | |
| 5224 group_add(pd, group); | |
| 5225 blist_schedule(pd); | |
| 5226 } | |
| 5227 | |
| 5228 | |
| 5229 static void remote_group_multi_cb(struct mwGaimPluginData *pd, | |
| 5230 GaimRequestFields *fields) { | |
| 5231 GaimRequestField *f; | |
| 5232 const GList *l; | |
| 5233 | |
| 5234 f = gaim_request_fields_get_field(fields, "group"); | |
| 5235 l = gaim_request_field_list_get_selected(f); | |
| 5236 | |
| 5237 if(l) { | |
| 5238 const char *i = l->data; | |
|
12624
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
5239 struct named_id *res; |
| 10977 | 5240 |
| 5241 res = gaim_request_field_list_get_data(f, i); | |
| 5242 remote_group_done(pd, res->id, res->name); | |
| 5243 } | |
| 5244 | |
| 5245 remote_group_multi_cleanup(NULL, fields); | |
| 5246 } | |
| 5247 | |
| 5248 | |
| 5249 static void remote_group_multi(struct mwResolveResult *result, | |
| 5250 struct mwGaimPluginData *pd) { | |
| 5251 | |
| 5252 GaimRequestFields *fields; | |
| 5253 GaimRequestFieldGroup *g; | |
| 5254 GaimRequestField *f; | |
| 5255 GList *l; | |
| 5256 char *msgA, *msgB; | |
| 5257 | |
| 5258 GaimConnection *gc = pd->gc; | |
| 5259 | |
| 5260 fields = gaim_request_fields_new(); | |
| 5261 | |
| 5262 g = gaim_request_field_group_new(NULL); | |
| 5263 gaim_request_fields_add_group(fields, g); | |
| 5264 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5265 f = gaim_request_field_list_new("group", _("Possible Matches")); |
| 10977 | 5266 gaim_request_field_list_set_multi_select(f, FALSE); |
| 5267 gaim_request_field_set_required(f, TRUE); | |
| 5268 | |
| 5269 for(l = result->matches; l; l = l->next) { | |
| 5270 struct mwResolveMatch *match = l->data; | |
|
12624
851b0bd7eb52
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
5271 struct named_id *res = g_new0(struct named_id, 1); |
| 10977 | 5272 |
| 5273 res->id = g_strdup(match->id); | |
| 5274 res->name = g_strdup(match->name); | |
| 5275 | |
| 5276 gaim_request_field_list_add(f, res->name, res); | |
| 5277 } | |
| 5278 | |
| 5279 gaim_request_field_group_add_field(g, f); | |
| 5280 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5281 msgA = _("Notes Address Book group results"); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5282 msgB = _("The identifier '%s' may possibly refer to any of the following" |
| 10977 | 5283 " Notes Address Book groups. Please select the correct group from" |
| 5284 " the list below to add it to your buddy list."); | |
| 5285 msgB = g_strdup_printf(msgB, result->name); | |
| 5286 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5287 gaim_request_fields(gc, _("Select Notes Address Book"), |
| 10977 | 5288 msgA, msgB, fields, |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5289 _("Add Group"), G_CALLBACK(remote_group_multi_cb), |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5290 _("Cancel"), G_CALLBACK(remote_group_multi_cleanup), |
| 10977 | 5291 pd); |
| 5292 | |
| 5293 g_free(msgB); | |
| 5294 } | |
| 5295 | |
| 5296 | |
| 5297 static void remote_group_resolved(struct mwServiceResolve *srvc, | |
| 5298 guint32 id, guint32 code, GList *results, | |
| 5299 gpointer b) { | |
|
11133
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
5300 |
|
1081735edc10
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
5301 struct mwResolveResult *res = NULL; |
| 10977 | 5302 struct mwSession *session; |
| 5303 struct mwGaimPluginData *pd; | |
| 5304 GaimConnection *gc; | |
| 5305 | |
| 5306 session = mwService_getSession(MW_SERVICE(srvc)); | |
| 5307 g_return_if_fail(session != NULL); | |
| 5308 | |
| 5309 pd = mwSession_getClientData(session); | |
| 5310 g_return_if_fail(pd != NULL); | |
| 5311 | |
| 5312 gc = pd->gc; | |
| 5313 g_return_if_fail(gc != NULL); | |
| 5314 | |
| 5315 if(!code && results) { | |
| 5316 res = results->data; | |
| 5317 | |
| 5318 if(res->matches) { | |
| 5319 remote_group_multi(res, pd); | |
| 5320 return; | |
| 5321 } | |
| 5322 } | |
| 5323 | |
| 5324 if(res && res->name) { | |
| 5325 char *msgA, *msgB; | |
| 5326 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5327 msgA = _("Unable to add group: group not found"); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5328 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5329 msgB = _("The identifier '%s' did not match any Notes Address Book" |
| 10977 | 5330 " groups in your Sametime community."); |
| 5331 msgB = g_strdup_printf(msgB, res->name); | |
| 5332 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5333 gaim_notify_error(gc, _("Unable to add group"), msgA, msgB); |
| 10977 | 5334 |
| 5335 g_free(msgB); | |
| 5336 } | |
| 5337 } | |
| 5338 | |
| 5339 | |
| 5340 static void remote_group_action_cb(GaimConnection *gc, const char *name) { | |
| 5341 struct mwGaimPluginData *pd; | |
| 5342 struct mwServiceResolve *srvc; | |
| 5343 GList *query; | |
| 5344 enum mwResolveFlag flags; | |
| 5345 guint32 req; | |
| 5346 | |
| 5347 pd = gc->proto_data; | |
| 5348 srvc = pd->srvc_resolve; | |
| 5349 | |
| 5350 query = g_list_prepend(NULL, (char *) name); | |
| 5351 flags = mwResolveFlag_FIRST | mwResolveFlag_GROUPS; | |
| 5352 | |
| 5353 req = mwServiceResolve_resolve(srvc, query, flags, remote_group_resolved, | |
| 5354 NULL, NULL); | |
| 5355 g_list_free(query); | |
| 5356 | |
| 5357 if(req == SEARCH_ERROR) { | |
| 5358 /** @todo display error */ | |
| 5359 } | |
| 5360 } | |
| 5361 | |
| 5362 | |
| 5363 static void remote_group_action(GaimPluginAction *act) { | |
| 5364 GaimConnection *gc; | |
| 5365 const char *msgA, *msgB; | |
| 5366 | |
| 5367 gc = act->context; | |
| 5368 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5369 msgA = _("Notes Address Book Group"); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5370 msgB = _("Enter the name of a Notes Address Book group in the field below" |
| 10977 | 5371 " to add the group and its members to your buddy list."); |
| 5372 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5373 gaim_request_input(gc, _("Add Group"), msgA, msgB, NULL, |
| 10977 | 5374 FALSE, FALSE, NULL, |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5375 _("Add"), G_CALLBACK(remote_group_action_cb), |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5376 _("Cancel"), NULL, |
| 10977 | 5377 gc); |
| 5378 } | |
| 5379 | |
| 5380 | |
|
12630
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5381 static void search_notify(struct mwResolveResult *result, |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5382 GaimConnection *gc) { |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5383 GList *l; |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5384 char *msgA, *msgB; |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5385 |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5386 GaimNotifySearchResults *sres; |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5387 GaimNotifySearchColumn *scol; |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5388 |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5389 sres = gaim_notify_searchresults_new(); |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5390 |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5391 scol = gaim_notify_searchresults_column_new(_("User Name")); |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5392 gaim_notify_searchresults_column_add(sres, scol); |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5393 |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5394 scol = gaim_notify_searchresults_column_new(_("Sametime ID")); |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5395 gaim_notify_searchresults_column_add(sres, scol); |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5396 |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5397 gaim_notify_searchresults_button_add(sres, GAIM_NOTIFY_BUTTON_IM, |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5398 notify_im); |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5399 |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5400 gaim_notify_searchresults_button_add(sres, GAIM_NOTIFY_BUTTON_ADD, |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5401 notify_add); |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5402 |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5403 for(l = result->matches; l; l = l->next) { |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5404 struct mwResolveMatch *match = l->data; |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5405 GList *row = NULL; |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5406 |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5407 if(!match->id || !match->name) |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5408 continue; |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5409 |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5410 row = g_list_append(row, g_strdup(match->name)); |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5411 row = g_list_append(row, g_strdup(match->id)); |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5412 gaim_notify_searchresults_row_add(sres, row); |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5413 } |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5414 |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5415 msgA = _("Search results for '%s'"); |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5416 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
|
5417 " 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
|
5418 " messages with the action buttons below."); |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5419 |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5420 msgA = g_strdup_printf(msgA, result->name); |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5421 msgB = g_strdup_printf(msgB, result->name); |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5422 |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5423 gaim_notify_searchresults(gc, _("Search Results"), |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5424 msgA, msgB, sres, notify_close, NULL); |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5425 |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5426 g_free(msgA); |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5427 g_free(msgB); |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5428 } |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5429 |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5430 |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5431 static void search_resolved(struct mwServiceResolve *srvc, |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5432 guint32 id, guint32 code, GList *results, |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5433 gpointer b) { |
|
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 GaimConnection *gc = b; |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5436 struct mwResolveResult *res = NULL; |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5437 |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5438 if(results) res = results->data; |
|
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 if(!code && res && res->matches) { |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5441 search_notify(res, gc); |
|
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 } else { |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5444 char *msgA, *msgB; |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5445 msgA = _("No matches"); |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5446 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
|
5447 " Sametime community."); |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5448 msgB = g_strdup_printf(msgB, NSTR(res->name)); |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5449 |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5450 gaim_notify_error(gc, _("No Matches"), msgA, msgB); |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5451 |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5452 g_free(msgB); |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5453 } |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5454 } |
|
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 |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5457 static void search_action_cb(GaimConnection *gc, const char *name) { |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5458 struct mwGaimPluginData *pd; |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5459 struct mwServiceResolve *srvc; |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5460 GList *query; |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5461 enum mwResolveFlag flags; |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5462 guint32 req; |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5463 |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5464 pd = gc->proto_data; |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5465 srvc = pd->srvc_resolve; |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5466 |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5467 query = g_list_prepend(NULL, (char *) name); |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5468 flags = mwResolveFlag_FIRST | mwResolveFlag_USERS; |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5469 |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5470 req = mwServiceResolve_resolve(srvc, query, flags, search_resolved, |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5471 gc, NULL); |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5472 g_list_free(query); |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5473 |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5474 if(req == SEARCH_ERROR) { |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5475 /** @todo display error */ |
|
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 } |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5478 |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5479 |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5480 static void search_action(GaimPluginAction *act) { |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5481 GaimConnection *gc; |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5482 const char *msgA, *msgB; |
|
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 gc = act->context; |
|
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 msgA = _("Search for a user"); |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5487 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
|
5488 " for matching users in your Sametime community."); |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5489 |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5490 gaim_request_input(gc, _("User Search"), msgA, msgB, NULL, |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5491 FALSE, FALSE, NULL, |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5492 _("Search"), G_CALLBACK(search_action_cb), |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5493 _("Cancel"), NULL, |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5494 gc); |
|
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 |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5497 |
| 10977 | 5498 static GList *mw_plugin_actions(GaimPlugin *plugin, gpointer context) { |
| 5499 GaimPluginAction *act; | |
| 5500 GList *l = NULL; | |
| 5501 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5502 act = gaim_plugin_action_new(_("Import Sametime List..."), |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5503 st_import_action); |
| 10977 | 5504 l = g_list_append(l, act); |
| 5505 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5506 act = gaim_plugin_action_new(_("Export Sametime List..."), |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5507 st_export_action); |
| 10977 | 5508 l = g_list_append(l, act); |
| 5509 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5510 act = gaim_plugin_action_new(_("Add Notes Address Book Group..."), |
| 10977 | 5511 remote_group_action); |
| 5512 l = g_list_append(l, act); | |
| 5513 | |
|
12630
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5514 act = gaim_plugin_action_new(_("User Search..."), |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5515 search_action); |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5516 l = g_list_append(l, act); |
|
97ec28aaae47
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5517 |
| 10977 | 5518 return l; |
| 5519 } | |
| 5520 | |
| 5521 | |
| 5522 static gboolean mw_plugin_load(GaimPlugin *plugin) { | |
| 5523 return TRUE; | |
| 5524 } | |
| 5525 | |
| 5526 | |
| 5527 static gboolean mw_plugin_unload(GaimPlugin *plugin) { | |
| 5528 return TRUE; | |
| 5529 } | |
| 5530 | |
| 5531 | |
| 5532 static void mw_plugin_destroy(GaimPlugin *plugin) { | |
| 5533 g_log_remove_handler(G_LOG_DOMAIN, log_handler[0]); | |
| 5534 g_log_remove_handler("meanwhile", log_handler[1]); | |
| 5535 } | |
| 5536 | |
| 5537 | |
| 5538 static GaimPluginInfo mw_plugin_info = { | |
| 5539 .magic = GAIM_PLUGIN_MAGIC, | |
| 5540 .major_version = GAIM_MAJOR_VERSION, | |
| 5541 .minor_version = GAIM_MINOR_VERSION, | |
| 5542 .type = GAIM_PLUGIN_PROTOCOL, | |
| 5543 .ui_requirement = NULL, | |
| 5544 .flags = 0, | |
| 5545 .dependencies = NULL, | |
| 5546 .priority = GAIM_PRIORITY_DEFAULT, | |
| 5547 .id = PLUGIN_ID, | |
| 5548 .name = PLUGIN_NAME, | |
| 5549 .version = VERSION, | |
| 5550 .summary = PLUGIN_SUMMARY, | |
| 5551 .description = PLUGIN_DESC, | |
| 5552 .author = PLUGIN_AUTHOR, | |
| 5553 .homepage = PLUGIN_HOMEPAGE, | |
| 5554 .load = mw_plugin_load, | |
| 5555 .unload = mw_plugin_unload, | |
| 5556 .destroy = mw_plugin_destroy, | |
| 5557 .ui_info = NULL, | |
| 5558 .extra_info = &mw_prpl_info, | |
| 5559 .prefs_info = &mw_plugin_ui_info, | |
| 5560 .actions = mw_plugin_actions, | |
| 5561 }; | |
| 5562 | |
| 5563 | |
| 5564 static void mw_log_handler(const gchar *domain, GLogLevelFlags flags, | |
| 5565 const gchar *msg, gpointer data) { | |
|
12005
5b3368008513
[gaim-migrate @ 14298]
Christopher O'Brien <siege@pidgin.im>
parents:
11953
diff
changeset
|
5566 |
|
5b3368008513
[gaim-migrate @ 14298]
Christopher O'Brien <siege@pidgin.im>
parents:
11953
diff
changeset
|
5567 if(! (msg && *msg)) return; |
| 10977 | 5568 |
| 5569 /* handle g_log requests via gaim's built-in debug logging */ | |
| 5570 if(flags & G_LOG_LEVEL_ERROR) { | |
|
12005
5b3368008513
[gaim-migrate @ 14298]
Christopher O'Brien <siege@pidgin.im>
parents:
11953
diff
changeset
|
5571 gaim_debug_error(domain, "%s\n", msg); |
| 10977 | 5572 |
| 5573 } else if(flags & G_LOG_LEVEL_WARNING) { | |
|
12005
5b3368008513
[gaim-migrate @ 14298]
Christopher O'Brien <siege@pidgin.im>
parents:
11953
diff
changeset
|
5574 gaim_debug_warning(domain, "%s\n", msg); |
| 10977 | 5575 |
| 5576 } else { | |
|
12005
5b3368008513
[gaim-migrate @ 14298]
Christopher O'Brien <siege@pidgin.im>
parents:
11953
diff
changeset
|
5577 gaim_debug_info(domain, "%s\n", msg); |
| 10977 | 5578 } |
| 5579 } | |
| 5580 | |
| 5581 | |
| 5582 static void mw_plugin_init(GaimPlugin *plugin) { | |
| 5583 GaimAccountOption *opt; | |
| 5584 GList *l = NULL; | |
| 5585 | |
| 5586 GLogLevelFlags logflags = | |
| 5587 G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION; | |
| 5588 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5589 /* set up the preferences */ |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5590 gaim_prefs_add_none(MW_PRPL_OPT_BASE); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5591 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
|
5592 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5593 /* remove dead preferences */ |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5594 gaim_prefs_remove(MW_PRPL_OPT_PSYCHIC); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5595 gaim_prefs_remove(MW_PRPL_OPT_SAVE_DYNAMIC); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5596 |
| 10977 | 5597 /* host to connect to */ |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5598 opt = gaim_account_option_string_new(_("Server"), MW_KEY_HOST, |
| 10977 | 5599 MW_PLUGIN_DEFAULT_HOST); |
| 5600 l = g_list_append(l, opt); | |
| 5601 | |
| 5602 /* port to connect to */ | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5603 opt = gaim_account_option_int_new(_("Port"), MW_KEY_PORT, |
| 10977 | 5604 MW_PLUGIN_DEFAULT_PORT); |
| 5605 l = g_list_append(l, opt); | |
| 5606 | |
|
12005
5b3368008513
[gaim-migrate @ 14298]
Christopher O'Brien <siege@pidgin.im>
parents:
11953
diff
changeset
|
5607 /* notesbuddy hack encoding */ |
| 12489 | 5608 opt = gaim_account_option_string_new(_("NotesBuddy encoding"), |
|
12005
5b3368008513
[gaim-migrate @ 14298]
Christopher O'Brien <siege@pidgin.im>
parents:
11953
diff
changeset
|
5609 MW_KEY_ENCODING, |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5610 MW_PLUGIN_DEFAULT_ENCODING); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5611 l = g_list_append(l, opt); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5612 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5613 { /* 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
|
5614 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
|
5615 than one account that wants to check for it. */ |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5616 gboolean b = FALSE; |
| 12489 | 5617 const char *label = _("Force login (ignore server redirects)"); |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5618 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5619 if(gaim_prefs_exists(MW_PRPL_OPT_FORCE_LOGIN)) |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5620 b = gaim_prefs_get_bool(MW_PRPL_OPT_FORCE_LOGIN); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5621 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5622 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
|
5623 l = g_list_append(l, opt); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5624 } |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5625 |
|
12311
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
5626 /* pretend to be Sametime Connect */ |
| 12489 | 5627 opt = gaim_account_option_bool_new(_("Hide client identity"), |
|
12311
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
5628 MW_KEY_FAKE_IT, FALSE); |
|
12312
1c8ea8f3b84e
[gaim-migrate @ 14616]
Christopher O'Brien <siege@pidgin.im>
parents:
12311
diff
changeset
|
5629 l = g_list_append(l, opt); |
|
12311
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
5630 |
| 10977 | 5631 mw_prpl_info.protocol_options = l; |
| 5632 l = NULL; | |
| 5633 | |
| 5634 /* forward all our g_log messages to gaim. Generally all the logging | |
| 5635 calls are using gaim_log directly, but the g_return macros will | |
| 5636 get caught here */ | |
| 5637 log_handler[0] = g_log_set_handler(G_LOG_DOMAIN, logflags, | |
| 5638 mw_log_handler, NULL); | |
| 5639 | |
| 5640 /* redirect meanwhile's logging to gaim's */ | |
| 5641 log_handler[1] = g_log_set_handler("meanwhile", logflags, | |
| 5642 mw_log_handler, NULL); | |
| 5643 } | |
| 5644 | |
| 5645 | |
|
11949
47e1723a89d7
[gaim-migrate @ 14240]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
5646 GAIM_INIT_PLUGIN(sametime, mw_plugin_init, mw_plugin_info); |
| 10977 | 5647 /* The End. */ |
| 5648 |
