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