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