Mon, 18 Jun 2007 12:37:29 +0000
Replaced a clean and simple API with a very weird hack due to vivid request on #pidgin by multiple devs. This avoids the change in PurplePluginProtocolInfo, but requires complicated change tracking in every prpl. The others prpl should add this change tracking, too (since otherwise the status gets changed even though nothing they care about changed), but that's not up to me.
| 10977 | 1 | |
| 2 | /* | |
| 15884 | 3 | Meanwhile Protocol Plugin for Purple |
| 4 | Adds Lotus Sametime support to Purple using the Meanwhile library | |
| 10977 | 5 | |
| 6 | Copyright (C) 2004 Christopher (siege) O'Brien <siege@preoccupied.net> | |
|
14170
f611621bc8a0
[gaim-migrate @ 16742]
Mark Doliner <markdoliner@pidgin.im>
parents:
14151
diff
changeset
|
7 | |
| 10977 | 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. | |
|
14170
f611621bc8a0
[gaim-migrate @ 16742]
Mark Doliner <markdoliner@pidgin.im>
parents:
14151
diff
changeset
|
12 | |
| 10977 | 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. | |
|
14170
f611621bc8a0
[gaim-migrate @ 16742]
Mark Doliner <markdoliner@pidgin.im>
parents:
14151
diff
changeset
|
17 | |
| 10977 | 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
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
24 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
25 | /* system includes */ |
| 10977 | 26 | #include <stdlib.h> |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
27 | #include <time.h> |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
28 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
29 | /* glib includes */ |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
30 | #include <glib.h> |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
31 | #include <glib/ghash.h> |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
32 | #include <glib/glist.h> |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
33 | |
| 15884 | 34 | /* purple includes */ |
|
14013
86dac5633bd9
[gaim-migrate @ 16496]
Mark Doliner <markdoliner@pidgin.im>
parents:
13844
diff
changeset
|
35 | #include "internal.h" |
|
86dac5633bd9
[gaim-migrate @ 16496]
Mark Doliner <markdoliner@pidgin.im>
parents:
13844
diff
changeset
|
36 | #include "config.h" |
|
86dac5633bd9
[gaim-migrate @ 16496]
Mark Doliner <markdoliner@pidgin.im>
parents:
13844
diff
changeset
|
37 | |
|
86dac5633bd9
[gaim-migrate @ 16496]
Mark Doliner <markdoliner@pidgin.im>
parents:
13844
diff
changeset
|
38 | #include "account.h" |
|
86dac5633bd9
[gaim-migrate @ 16496]
Mark Doliner <markdoliner@pidgin.im>
parents:
13844
diff
changeset
|
39 | #include "accountopt.h" |
|
86dac5633bd9
[gaim-migrate @ 16496]
Mark Doliner <markdoliner@pidgin.im>
parents:
13844
diff
changeset
|
40 | #include "circbuffer.h" |
|
86dac5633bd9
[gaim-migrate @ 16496]
Mark Doliner <markdoliner@pidgin.im>
parents:
13844
diff
changeset
|
41 | #include "conversation.h" |
|
86dac5633bd9
[gaim-migrate @ 16496]
Mark Doliner <markdoliner@pidgin.im>
parents:
13844
diff
changeset
|
42 | #include "debug.h" |
|
86dac5633bd9
[gaim-migrate @ 16496]
Mark Doliner <markdoliner@pidgin.im>
parents:
13844
diff
changeset
|
43 | #include "ft.h" |
|
86dac5633bd9
[gaim-migrate @ 16496]
Mark Doliner <markdoliner@pidgin.im>
parents:
13844
diff
changeset
|
44 | #include "imgstore.h" |
|
86dac5633bd9
[gaim-migrate @ 16496]
Mark Doliner <markdoliner@pidgin.im>
parents:
13844
diff
changeset
|
45 | #include "mime.h" |
|
86dac5633bd9
[gaim-migrate @ 16496]
Mark Doliner <markdoliner@pidgin.im>
parents:
13844
diff
changeset
|
46 | #include "notify.h" |
|
86dac5633bd9
[gaim-migrate @ 16496]
Mark Doliner <markdoliner@pidgin.im>
parents:
13844
diff
changeset
|
47 | #include "plugin.h" |
|
86dac5633bd9
[gaim-migrate @ 16496]
Mark Doliner <markdoliner@pidgin.im>
parents:
13844
diff
changeset
|
48 | #include "privacy.h" |
|
86dac5633bd9
[gaim-migrate @ 16496]
Mark Doliner <markdoliner@pidgin.im>
parents:
13844
diff
changeset
|
49 | #include "prpl.h" |
|
86dac5633bd9
[gaim-migrate @ 16496]
Mark Doliner <markdoliner@pidgin.im>
parents:
13844
diff
changeset
|
50 | #include "request.h" |
|
86dac5633bd9
[gaim-migrate @ 16496]
Mark Doliner <markdoliner@pidgin.im>
parents:
13844
diff
changeset
|
51 | #include "util.h" |
|
86dac5633bd9
[gaim-migrate @ 16496]
Mark Doliner <markdoliner@pidgin.im>
parents:
13844
diff
changeset
|
52 | #include "version.h" |
| 10977 | 53 | |
|
11943
81ee4bc13c28
[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
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
64 | #include <mw_srvc_place.h> |
| 10977 | 65 | #include <mw_srvc_resolve.h> |
| 66 | #include <mw_srvc_store.h> | |
| 67 | #include <mw_st_list.h> | |
| 68 | ||
|
12813
6f67cfa0e6a0
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
69 | /* plugin includes */ |
| 10977 | 70 | #include "sametime.h" |
| 71 | ||
| 72 | ||
| 73 | /* considering that there's no display of this information for prpls, | |
| 74 | I don't know why I even bother providing these. Oh valiant reader, | |
| 75 | I do it all for you. */ | |
| 76 | /* scratch that, I just added it to the prpl options panel */ | |
|
14052
861fddc53217
[gaim-migrate @ 16563]
Evan Schoenberg <evands@pidgin.im>
parents:
14032
diff
changeset
|
77 | #define PLUGIN_ID "prpl-meanwhile" |
| 10977 | 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 */ | |
|
13779
410869639392
[gaim-migrate @ 16189]
Christopher O'Brien <siege@pidgin.im>
parents:
13713
diff
changeset
|
94 | #define MW_CONNECT_STEPS 11 |
| 10977 | 95 | |
| 96 | ||
| 97 | /* stages of conciousness */ | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
98 | #define MW_STATE_OFFLINE "offline" |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
99 | #define MW_STATE_ACTIVE "active" |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
100 | #define MW_STATE_AWAY "away" |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
101 | #define MW_STATE_BUSY "dnd" |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
102 | #define MW_STATE_MESSAGE "message" |
|
81ee4bc13c28
[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
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
107 | #define CHAT_KEY_CREATOR "chat.creator" |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
108 | #define CHAT_KEY_NAME "chat.name" |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
109 | #define CHAT_KEY_TOPIC "chat.topic" |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
110 | #define CHAT_KEY_INVITE "chat.invite" |
|
81ee4bc13c28
[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
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
137 | /* verification replacement */ |
|
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
138 | #define mwSession_NO_SECRET "meanwhile.no_secret" |
| 10977 | 139 | |
| 140 | ||
| 15884 | 141 | /* keys to get/set purple plugin information */ |
| 10977 | 142 | #define MW_KEY_HOST "server" |
| 143 | #define MW_KEY_PORT "port" | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
144 | #define MW_KEY_FORCE "force_login" |
|
12311
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
145 | #define MW_KEY_FAKE_IT "fake_client_id" |
|
14975
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
146 | #define MW_KEY_CLIENT "client_id_val" |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
147 | #define MW_KEY_MAJOR "client_major" |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
148 | #define MW_KEY_MINOR "client_minor" |
| 10977 | 149 | |
| 150 | ||
| 151 | /** number of seconds from the first blist change before a save to the | |
| 152 | storage service occurs. */ | |
| 153 | #define BLIST_SAVE_SECONDS 15 | |
| 154 | ||
| 155 | ||
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
156 | /** the possible buddy list storage settings */ |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
157 | enum blist_choice { |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
158 | blist_choice_LOCAL = 1, /**< local only */ |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
159 | blist_choice_MERGE = 2, /**< merge from server */ |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
160 | blist_choice_STORE = 3, /**< merge from and save to server */ |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
161 | blist_choice_SYNCH = 4, /**< sync with server */ |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
162 | }; |
| 10977 | 163 | |
| 164 | ||
| 165 | /** the default blist storage option */ | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
166 | #define BLIST_CHOICE_DEFAULT blist_choice_SYNCH |
| 10977 | 167 | |
| 168 | ||
| 169 | /* testing for the above */ | |
| 15884 | 170 | #define BLIST_PREF_IS(n) (purple_prefs_get_int(MW_PRPL_OPT_BLIST_ACTION)==(n)) |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
171 | #define BLIST_PREF_IS_LOCAL() BLIST_PREF_IS(blist_choice_LOCAL) |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
172 | #define BLIST_PREF_IS_MERGE() BLIST_PREF_IS(blist_choice_MERGE) |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
173 | #define BLIST_PREF_IS_STORE() BLIST_PREF_IS(blist_choice_STORE) |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
174 | #define BLIST_PREF_IS_SYNCH() BLIST_PREF_IS(blist_choice_SYNCH) |
| 10977 | 175 | |
| 176 | ||
| 177 | /* debugging output */ | |
| 15884 | 178 | #define DEBUG_ERROR(a...) purple_debug_error(G_LOG_DOMAIN, a) |
| 179 | #define DEBUG_INFO(a...) purple_debug_info(G_LOG_DOMAIN, a) | |
| 180 | #define DEBUG_MISC(a...) purple_debug_misc(G_LOG_DOMAIN, a) | |
| 181 | #define DEBUG_WARN(a...) purple_debug_warning(G_LOG_DOMAIN, a) | |
| 10977 | 182 | |
| 183 | ||
| 184 | /** ensure non-null strings */ | |
| 185 | #ifndef NSTR | |
| 186 | # define NSTR(str) ((str)? (str): "(null)") | |
| 187 | #endif | |
| 188 | ||
| 189 | ||
| 190 | /** calibrates distinct secure channel nomenclature */ | |
| 191 | static const unsigned char no_secret[] = { | |
| 192 | 0x2d, 0x2d, 0x20, 0x73, 0x69, 0x65, 0x67, 0x65, | |
| 193 | 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x73, 0x20, 0x6a, | |
| 194 | 0x65, 0x6e, 0x6e, 0x69, 0x20, 0x61, 0x6e, 0x64, | |
| 195 | 0x20, 0x7a, 0x6f, 0x65, 0x20, 0x2d, 0x2d, 0x00, | |
| 196 | }; | |
| 197 | ||
| 198 | ||
| 199 | /** handler IDs from g_log_set_handler in mw_plugin_init */ | |
| 200 | static guint log_handler[2] = { 0, 0 }; | |
| 201 | ||
| 202 | ||
| 15884 | 203 | /** the purple plugin data. |
| 10977 | 204 | available as gc->proto_data and mwSession_getClientData */ |
| 15884 | 205 | struct mwPurplePluginData { |
| 10977 | 206 | struct mwSession *session; |
| 207 | ||
| 208 | struct mwServiceAware *srvc_aware; | |
| 209 | struct mwServiceConference *srvc_conf; | |
| 210 | struct mwServiceFileTransfer *srvc_ft; | |
| 211 | struct mwServiceIm *srvc_im; | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
212 | struct mwServicePlace *srvc_place; |
| 10977 | 213 | struct mwServiceResolve *srvc_resolve; |
| 214 | struct mwServiceStorage *srvc_store; | |
| 215 | ||
| 15884 | 216 | /** map of PurpleGroup:mwAwareList and mwAwareList:PurpleGroup */ |
| 10977 | 217 | GHashTable *group_list_map; |
| 218 | ||
| 219 | /** event id for the buddy list save callback */ | |
| 220 | guint save_event; | |
| 221 | ||
| 222 | /** socket fd */ | |
| 223 | int socket; | |
|
13206
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
224 | gint outpa; /* like inpa, but the other way */ |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
225 | |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
226 | /** circular buffer for outgoing data */ |
| 15884 | 227 | PurpleCircBuffer *sock_buf; |
| 228 | ||
| 229 | PurpleConnection *gc; | |
| 10977 | 230 | }; |
| 231 | ||
| 232 | ||
|
14975
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
233 | typedef struct { |
| 15884 | 234 | PurpleBuddy *buddy; |
| 235 | PurpleGroup *group; | |
|
14975
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
236 | } BuddyAddData; |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
237 | |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
238 | |
| 10977 | 239 | /* blist and aware functions */ |
| 240 | ||
| 15884 | 241 | static void blist_export(PurpleConnection *gc, struct mwSametimeList *stlist); |
| 242 | ||
| 243 | static void blist_store(struct mwPurplePluginData *pd); | |
| 244 | ||
| 245 | static void blist_schedule(struct mwPurplePluginData *pd); | |
| 246 | ||
| 247 | static void blist_merge(PurpleConnection *gc, struct mwSametimeList *stlist); | |
| 248 | ||
| 249 | static void blist_sync(PurpleConnection *gc, struct mwSametimeList *stlist); | |
| 250 | ||
| 251 | static gboolean buddy_is_external(PurpleBuddy *b); | |
| 252 | ||
| 253 | static void buddy_add(struct mwPurplePluginData *pd, PurpleBuddy *buddy); | |
| 254 | ||
| 255 | static PurpleBuddy * | |
| 256 | buddy_ensure(PurpleConnection *gc, PurpleGroup *group, | |
| 10977 | 257 | struct mwSametimeUser *stuser); |
| 258 | ||
| 15884 | 259 | static void group_add(struct mwPurplePluginData *pd, PurpleGroup *group); |
| 260 | ||
| 261 | static PurpleGroup * | |
| 262 | group_ensure(PurpleConnection *gc, struct mwSametimeGroup *stgroup); | |
| 10977 | 263 | |
| 264 | static struct mwAwareList * | |
| 15884 | 265 | list_ensure(struct mwPurplePluginData *pd, PurpleGroup *group); |
| 10977 | 266 | |
| 267 | ||
| 268 | /* session functions */ | |
| 269 | ||
| 270 | static struct mwSession * | |
| 15884 | 271 | gc_to_session(PurpleConnection *gc); |
| 272 | ||
| 273 | static PurpleConnection *session_to_gc(struct mwSession *session); | |
| 10977 | 274 | |
| 275 | ||
| 276 | /* conference functions */ | |
| 277 | ||
| 278 | static struct mwConference * | |
| 15884 | 279 | conf_find_by_id(struct mwPurplePluginData *pd, int id); |
| 10977 | 280 | |
| 281 | ||
| 282 | /* conversation functions */ | |
| 283 | ||
| 284 | struct convo_msg { | |
| 285 | enum mwImSendType type; | |
| 286 | gpointer data; | |
| 287 | GDestroyNotify clear; | |
| 288 | }; | |
| 289 | ||
| 290 | ||
| 291 | struct convo_data { | |
| 292 | struct mwConversation *conv; | |
| 293 | GList *queue; /**< outgoing message queue, list of convo_msg */ | |
| 294 | }; | |
| 295 | ||
| 296 | static void convo_data_new(struct mwConversation *conv); | |
| 297 | ||
| 298 | static void convo_data_free(struct convo_data *conv); | |
| 299 | ||
| 300 | static void convo_features(struct mwConversation *conv); | |
| 301 | ||
| 15884 | 302 | static PurpleConversation *convo_get_gconv(struct mwConversation *conv); |
| 10977 | 303 | |
| 304 | ||
|
12629
14aae7d5da6b
[gaim-migrate @ 14965]
Richard Laager <rlaager@pidgin.im>
parents:
12624
diff
changeset
|
305 | /* name and id */ |
|
12624
c1c92f08976b
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
306 | |
|
c1c92f08976b
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
307 | struct named_id { |
| 10977 | 308 | char *id; |
| 309 | char *name; | |
| 310 | }; | |
| 311 | ||
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
312 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
313 | /* connection functions */ |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
314 | |
|
14178
d12b287697c9
[gaim-migrate @ 16750]
Mark Doliner <markdoliner@pidgin.im>
parents:
14170
diff
changeset
|
315 | static void connect_cb(gpointer data, gint source, const gchar *error_message); |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
316 | |
| 10977 | 317 | |
| 318 | /* ----- session ------ */ | |
| 319 | ||
| 320 | ||
| 15884 | 321 | /** resolves a mwSession from a PurpleConnection */ |
| 322 | static struct mwSession *gc_to_session(PurpleConnection *gc) { | |
| 323 | struct mwPurplePluginData *pd; | |
| 10977 | 324 | |
| 325 | g_return_val_if_fail(gc != NULL, NULL); | |
| 326 | ||
| 327 | pd = gc->proto_data; | |
| 328 | g_return_val_if_fail(pd != NULL, NULL); | |
| 329 | ||
| 330 | return pd->session; | |
| 331 | } | |
| 332 | ||
| 333 | ||
| 15884 | 334 | /** resolves a PurpleConnection from a mwSession */ |
| 335 | static PurpleConnection *session_to_gc(struct mwSession *session) { | |
| 336 | struct mwPurplePluginData *pd; | |
| 10977 | 337 | |
| 338 | g_return_val_if_fail(session != NULL, NULL); | |
| 339 | ||
| 340 | pd = mwSession_getClientData(session); | |
| 341 | g_return_val_if_fail(pd != NULL, NULL); | |
| 342 | ||
| 343 | return pd->gc; | |
| 344 | } | |
| 345 | ||
| 346 | ||
| 15884 | 347 | static void write_cb(gpointer data, gint source, PurpleInputCondition cond) { |
| 348 | struct mwPurplePluginData *pd = data; | |
| 349 | PurpleCircBuffer *circ = pd->sock_buf; | |
|
13206
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
350 | gsize avail; |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
351 | int ret; |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
352 | |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
353 | DEBUG_INFO("write_cb\n"); |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
354 | |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
355 | g_return_if_fail(circ != NULL); |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
356 | |
| 15884 | 357 | avail = purple_circ_buffer_get_max_read(circ); |
|
13206
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
358 | if(BUF_LONG < avail) avail = BUF_LONG; |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
359 | |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
360 | while(avail) { |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
361 | ret = write(pd->socket, circ->outptr, avail); |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
362 | |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
363 | if(ret <= 0) |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
364 | break; |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
365 | |
| 15884 | 366 | purple_circ_buffer_mark_read(circ, ret); |
| 367 | avail = purple_circ_buffer_get_max_read(circ); | |
|
13206
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
368 | if(BUF_LONG < avail) avail = BUF_LONG; |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
369 | } |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
370 | |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
371 | if(! avail) { |
| 15884 | 372 | purple_input_remove(pd->outpa); |
|
13206
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
373 | pd->outpa = 0; |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
374 | } |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
375 | } |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
376 | |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
377 | |
| 10977 | 378 | static int mw_session_io_write(struct mwSession *session, |
|
12311
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
379 | const guchar *buf, gsize len) { |
| 15884 | 380 | struct mwPurplePluginData *pd; |
| 10977 | 381 | int ret = 0; |
|
13206
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
382 | int err = 0; |
| 10977 | 383 | |
| 384 | pd = mwSession_getClientData(session); | |
| 385 | ||
| 386 | /* socket was already closed. */ | |
| 387 | if(pd->socket == 0) | |
| 388 | return 1; | |
| 389 | ||
|
13206
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
390 | if(pd->outpa) { |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
391 | DEBUG_INFO("already pending INPUT_WRITE, buffering\n"); |
| 15884 | 392 | purple_circ_buffer_append(pd->sock_buf, buf, len); |
|
13206
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
393 | return 0; |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
394 | } |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
395 | |
| 10977 | 396 | while(len) { |
|
13206
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
397 | ret = write(pd->socket, buf, (len > BUF_LEN)? BUF_LEN: len); |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
398 | |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
399 | if(ret <= 0) |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
400 | break; |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
401 | |
| 10977 | 402 | len -= ret; |
|
13206
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
403 | buf += ret; |
| 10977 | 404 | } |
| 405 | ||
|
13206
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
406 | if(ret <= 0) |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
407 | err = errno; |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
408 | |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
409 | if(err == EAGAIN) { |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
410 | /* append remainder to circular buffer */ |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
411 | DEBUG_INFO("EAGAIN\n"); |
| 15884 | 412 | purple_circ_buffer_append(pd->sock_buf, buf, len); |
| 413 | pd->outpa = purple_input_add(pd->socket, PURPLE_INPUT_WRITE, write_cb, pd); | |
|
13206
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
414 | |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
415 | } else if(len > 0) { |
| 10977 | 416 | DEBUG_ERROR("write returned %i, %i bytes left unwritten\n", ret, len); |
| 15884 | 417 | purple_connection_error(pd->gc, _("Connection closed (writing)")); |
|
11133
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
418 | |
|
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
419 | #if 0 |
| 10977 | 420 | close(pd->socket); |
| 421 | pd->socket = 0; | |
|
11133
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
422 | #endif |
|
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
423 | |
| 10977 | 424 | return -1; |
| 425 | } | |
| 426 | ||
| 427 | return 0; | |
| 428 | } | |
| 429 | ||
| 430 | ||
| 431 | static void mw_session_io_close(struct mwSession *session) { | |
| 15884 | 432 | struct mwPurplePluginData *pd; |
| 433 | PurpleConnection *gc; | |
| 10977 | 434 | |
| 435 | pd = mwSession_getClientData(session); | |
|
11133
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
436 | g_return_if_fail(pd != NULL); |
|
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
437 | |
|
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
438 | gc = pd->gc; |
|
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
439 | |
|
13206
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
440 | if(pd->outpa) { |
| 15884 | 441 | purple_input_remove(pd->outpa); |
|
13206
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
442 | pd->outpa = 0; |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
443 | } |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
444 | |
| 10977 | 445 | if(pd->socket) { |
| 446 | close(pd->socket); | |
| 447 | pd->socket = 0; | |
| 448 | } | |
|
13206
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
449 | |
|
11133
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
450 | if(gc->inpa) { |
| 15884 | 451 | purple_input_remove(gc->inpa); |
|
11133
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
452 | gc->inpa = 0; |
|
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
453 | } |
| 10977 | 454 | } |
| 455 | ||
| 456 | ||
| 457 | static void mw_session_clear(struct mwSession *session) { | |
| 458 | ; /* nothing for now */ | |
| 459 | } | |
| 460 | ||
| 461 | ||
| 462 | /* ----- aware list ----- */ | |
| 463 | ||
| 464 | ||
| 465 | static void blist_resolve_alias_cb(struct mwServiceResolve *srvc, | |
| 466 | guint32 id, guint32 code, GList *results, | |
| 467 | gpointer data) { | |
| 468 | struct mwResolveResult *result; | |
| 469 | struct mwResolveMatch *match; | |
| 470 | ||
| 471 | g_return_if_fail(results != NULL); | |
| 472 | ||
| 473 | result = results->data; | |
| 474 | g_return_if_fail(result != NULL); | |
| 475 | g_return_if_fail(result->matches != NULL); | |
| 476 | ||
| 477 | match = result->matches->data; | |
| 478 | g_return_if_fail(match != NULL); | |
| 479 | ||
| 15884 | 480 | purple_blist_server_alias_buddy(data, match->name); |
| 481 | purple_blist_node_set_string(data, BUDDY_KEY_NAME, match->name); | |
| 10977 | 482 | } |
| 483 | ||
| 484 | ||
| 485 | static void mw_aware_list_on_aware(struct mwAwareList *list, | |
| 486 | struct mwAwareSnapshot *aware) { | |
| 487 | ||
| 15884 | 488 | PurpleConnection *gc; |
| 489 | PurpleAccount *acct; | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
490 | |
| 15884 | 491 | struct mwPurplePluginData *pd; |
|
14975
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
492 | guint32 idle; |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
493 | guint stat; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
494 | const char *id; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
495 | const char *status = MW_STATE_ACTIVE; |
| 10977 | 496 | |
| 497 | gc = mwAwareList_getClientData(list); | |
| 15884 | 498 | acct = purple_connection_get_account(gc); |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
499 | |
| 10977 | 500 | pd = gc->proto_data; |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
501 | idle = aware->status.time; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
502 | stat = aware->status.status; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
503 | id = aware->id.user; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
504 | |
|
13588
c9a9f962837c
[gaim-migrate @ 15972]
Christopher O'Brien <siege@pidgin.im>
parents:
13580
diff
changeset
|
505 | if(idle) { |
|
14975
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
506 | guint32 idle_len; /*< how long a client has been idle */ |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
507 | guint32 ugly_idle_len; /*< how long a broken client has been idle */ |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
508 | |
|
13588
c9a9f962837c
[gaim-migrate @ 15972]
Christopher O'Brien <siege@pidgin.im>
parents:
13580
diff
changeset
|
509 | DEBUG_INFO("%s has idle value 0x%x\n", NSTR(id), idle); |
|
c9a9f962837c
[gaim-migrate @ 15972]
Christopher O'Brien <siege@pidgin.im>
parents:
13580
diff
changeset
|
510 | |
|
14975
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
511 | idle_len = time(NULL) - idle; |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
512 | ugly_idle_len = ((time(NULL) * 1000) - idle) / 1000; |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
513 | |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
514 | /* |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
515 | what's the deal here? Well, good clients are smart enough to |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
516 | publish their idle time by using an attribute to indicate that |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
517 | they went idle at some time UTC, in seconds since epoch. Bad |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
518 | clients use milliseconds since epoch. So we're going to compute |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
519 | the idle time for either method, then figure out the lower of |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
520 | the two and use that. Blame the ST 7.5 development team for |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
521 | this. |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
522 | */ |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
523 | |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
524 | DEBUG_INFO("idle time: %u, ugly idle time: %u\n", idle_len, ugly_idle_len); |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
525 | |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
526 | #if 1 |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
527 | if(idle_len <= ugly_idle_len) { |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
528 | ; /* DEBUG_INFO("sane idle value, let's use it\n"); */ |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
529 | } else { |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
530 | idle = time(NULL) - ugly_idle_len; |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
531 | } |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
532 | |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
533 | #else |
|
13588
c9a9f962837c
[gaim-migrate @ 15972]
Christopher O'Brien <siege@pidgin.im>
parents:
13580
diff
changeset
|
534 | if(idle < 0 || idle > time(NULL)) { |
|
c9a9f962837c
[gaim-migrate @ 15972]
Christopher O'Brien <siege@pidgin.im>
parents:
13580
diff
changeset
|
535 | DEBUG_INFO("hiding a messy idle value 0x%x\n", NSTR(id), idle); |
|
c9a9f962837c
[gaim-migrate @ 15972]
Christopher O'Brien <siege@pidgin.im>
parents:
13580
diff
changeset
|
536 | idle = -1; |
|
c9a9f962837c
[gaim-migrate @ 15972]
Christopher O'Brien <siege@pidgin.im>
parents:
13580
diff
changeset
|
537 | } |
|
14975
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
538 | #endif |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
539 | } |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
540 | |
| 10977 | 541 | switch(stat) { |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
542 | case mwStatus_ACTIVE: |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
543 | status = MW_STATE_ACTIVE; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
544 | idle = 0; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
545 | break; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
546 | |
| 10977 | 547 | case mwStatus_IDLE: |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
548 | if(! idle) idle = -1; |
| 10977 | 549 | break; |
| 550 | ||
| 551 | case mwStatus_AWAY: | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
552 | status = MW_STATE_AWAY; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
553 | break; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
554 | |
| 10977 | 555 | case mwStatus_BUSY: |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
556 | status = MW_STATE_BUSY; |
| 10977 | 557 | break; |
| 558 | } | |
| 559 | ||
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
560 | /* NAB group members */ |
| 10977 | 561 | if(aware->group) { |
| 15884 | 562 | PurpleGroup *group; |
| 563 | PurpleBuddy *buddy; | |
| 564 | PurpleBlistNode *bnode; | |
| 10977 | 565 | |
| 566 | group = g_hash_table_lookup(pd->group_list_map, list); | |
| 15884 | 567 | buddy = purple_find_buddy_in_group(acct, id, group); |
| 568 | bnode = (PurpleBlistNode *) buddy; | |
| 10977 | 569 | |
| 570 | if(! buddy) { | |
| 571 | struct mwServiceResolve *srvc; | |
| 572 | GList *query; | |
| 573 | ||
| 15884 | 574 | buddy = purple_buddy_new(acct, id, NULL); |
| 575 | purple_blist_add_buddy(buddy, NULL, group, NULL); | |
| 576 | ||
| 577 | bnode = (PurpleBlistNode *) buddy; | |
| 10977 | 578 | |
| 579 | srvc = pd->srvc_resolve; | |
| 580 | query = g_list_append(NULL, (char *) id); | |
| 581 | ||
| 582 | mwServiceResolve_resolve(srvc, query, mwResolveFlag_USERS, | |
| 583 | blist_resolve_alias_cb, buddy, NULL); | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
584 | g_list_free(query); |
| 10977 | 585 | } |
| 586 | ||
| 15884 | 587 | purple_blist_node_set_int(bnode, BUDDY_KEY_TYPE, mwSametimeUser_NORMAL); |
| 10977 | 588 | } |
| 589 | ||
|
12263
5f0ddc426a58
[gaim-migrate @ 14565]
Christopher O'Brien <siege@pidgin.im>
parents:
12216
diff
changeset
|
590 | if(aware->online) { |
| 15884 | 591 | purple_prpl_got_user_status(acct, id, status, NULL); |
| 592 | purple_prpl_got_user_idle(acct, id, !!idle, (time_t) idle); | |
|
12263
5f0ddc426a58
[gaim-migrate @ 14565]
Christopher O'Brien <siege@pidgin.im>
parents:
12216
diff
changeset
|
593 | |
|
5f0ddc426a58
[gaim-migrate @ 14565]
Christopher O'Brien <siege@pidgin.im>
parents:
12216
diff
changeset
|
594 | } else { |
| 15884 | 595 | purple_prpl_got_user_status(acct, id, MW_STATE_OFFLINE, NULL); |
|
12263
5f0ddc426a58
[gaim-migrate @ 14565]
Christopher O'Brien <siege@pidgin.im>
parents:
12216
diff
changeset
|
596 | } |
| 10977 | 597 | } |
| 598 | ||
| 599 | ||
| 600 | static void mw_aware_list_on_attrib(struct mwAwareList *list, | |
| 601 | struct mwAwareIdBlock *id, | |
| 602 | struct mwAwareAttribute *attrib) { | |
| 603 | ||
| 604 | ; /* nothing. We'll get attribute data as we need it */ | |
| 605 | } | |
| 606 | ||
| 607 | ||
| 608 | static void mw_aware_list_clear(struct mwAwareList *list) { | |
| 609 | ; /* nothing for now */ | |
| 610 | } | |
| 611 | ||
| 612 | ||
| 613 | static struct mwAwareListHandler mw_aware_list_handler = { | |
|
17157
dee69ceaf4d0
Another C99 struct falling.
Richard Laager <rlaager@pidgin.im>
parents:
17153
diff
changeset
|
614 | mw_aware_list_on_aware, |
|
dee69ceaf4d0
Another C99 struct falling.
Richard Laager <rlaager@pidgin.im>
parents:
17153
diff
changeset
|
615 | mw_aware_list_on_attrib, |
|
dee69ceaf4d0
Another C99 struct falling.
Richard Laager <rlaager@pidgin.im>
parents:
17153
diff
changeset
|
616 | mw_aware_list_clear, |
| 10977 | 617 | }; |
| 618 | ||
| 619 | ||
| 620 | /** Ensures that an Aware List is associated with the given group, and | |
| 621 | returns that list. */ | |
| 622 | static struct mwAwareList * | |
| 15884 | 623 | list_ensure(struct mwPurplePluginData *pd, PurpleGroup *group) { |
| 10977 | 624 | |
| 625 | struct mwAwareList *list; | |
| 626 | ||
| 627 | g_return_val_if_fail(pd != NULL, NULL); | |
| 628 | g_return_val_if_fail(group != NULL, NULL); | |
| 629 | ||
| 630 | list = g_hash_table_lookup(pd->group_list_map, group); | |
| 631 | if(! list) { | |
| 632 | list = mwAwareList_new(pd->srvc_aware, &mw_aware_list_handler); | |
| 633 | mwAwareList_setClientData(list, pd->gc, NULL); | |
| 634 | ||
| 635 | mwAwareList_watchAttributes(list, | |
| 636 | mwAttribute_AV_PREFS_SET, | |
| 637 | mwAttribute_MICROPHONE, | |
| 638 | mwAttribute_SPEAKERS, | |
| 639 | mwAttribute_VIDEO_CAMERA, | |
| 640 | mwAttribute_FILE_TRANSFER, | |
| 641 | NULL); | |
| 642 | ||
| 643 | g_hash_table_replace(pd->group_list_map, group, list); | |
| 644 | g_hash_table_insert(pd->group_list_map, list, group); | |
| 645 | } | |
| 646 | ||
| 647 | return list; | |
| 648 | } | |
| 649 | ||
| 650 | ||
| 15884 | 651 | static void blist_export(PurpleConnection *gc, struct mwSametimeList *stlist) { |
| 10977 | 652 | /* - find the account for this connection |
| 653 | - iterate through the buddy list | |
| 654 | - add each buddy matching this account to the stlist | |
| 655 | */ | |
| 656 | ||
| 15884 | 657 | PurpleAccount *acct; |
| 658 | PurpleBuddyList *blist; | |
| 659 | PurpleBlistNode *gn, *cn, *bn; | |
| 660 | PurpleGroup *grp; | |
| 661 | PurpleBuddy *bdy; | |
| 10977 | 662 | |
| 663 | struct mwSametimeGroup *stg = NULL; | |
| 664 | struct mwIdBlock idb = { NULL, NULL }; | |
| 665 | ||
| 15884 | 666 | acct = purple_connection_get_account(gc); |
| 10977 | 667 | g_return_if_fail(acct != NULL); |
| 668 | ||
| 15884 | 669 | blist = purple_get_blist(); |
| 10977 | 670 | g_return_if_fail(blist != NULL); |
| 671 | ||
| 672 | for(gn = blist->root; gn; gn = gn->next) { | |
| 673 | const char *owner; | |
| 674 | const char *gname; | |
| 675 | enum mwSametimeGroupType gtype; | |
| 676 | gboolean gopen; | |
| 677 | ||
| 15884 | 678 | if(! PURPLE_BLIST_NODE_IS_GROUP(gn)) continue; |
| 679 | grp = (PurpleGroup *) gn; | |
| 10977 | 680 | |
| 681 | /* the group's type (normal or dynamic) */ | |
| 15884 | 682 | gtype = purple_blist_node_get_int(gn, GROUP_KEY_TYPE); |
| 10977 | 683 | if(! gtype) gtype = mwSametimeGroup_NORMAL; |
| 684 | ||
| 685 | /* if it's a normal group with none of our people in it, skip it */ | |
| 15884 | 686 | if(gtype == mwSametimeGroup_NORMAL && !purple_group_on_account(grp, acct)) |
| 10977 | 687 | continue; |
| 688 | ||
| 689 | /* if the group has an owner and we're not it, skip it */ | |
| 15884 | 690 | owner = purple_blist_node_get_string(gn, GROUP_KEY_OWNER); |
| 691 | if(owner && strcmp(owner, purple_account_get_username(acct))) | |
| 10977 | 692 | continue; |
| 693 | ||
| 15884 | 694 | /* the group's actual name may be different from the purple group's |
| 10977 | 695 | name. Find whichever is there */ |
| 15884 | 696 | gname = purple_blist_node_get_string(gn, GROUP_KEY_NAME); |
| 10977 | 697 | if(! gname) gname = grp->name; |
| 698 | ||
| 699 | /* we save this, but never actually honor it */ | |
| 15884 | 700 | gopen = ! purple_blist_node_get_bool(gn, GROUP_KEY_COLLAPSED); |
| 10977 | 701 | |
| 702 | stg = mwSametimeGroup_new(stlist, gtype, gname); | |
| 703 | mwSametimeGroup_setAlias(stg, grp->name); | |
| 704 | mwSametimeGroup_setOpen(stg, gopen); | |
| 705 | ||
|
11133
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
706 | /* don't attempt to put buddies in a dynamic group, it breaks |
|
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
707 | other clients */ |
|
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
708 | if(gtype == mwSametimeGroup_DYNAMIC) |
|
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
709 | continue; |
|
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
710 | |
| 10977 | 711 | for(cn = gn->child; cn; cn = cn->next) { |
| 15884 | 712 | if(! PURPLE_BLIST_NODE_IS_CONTACT(cn)) continue; |
| 10977 | 713 | |
| 714 | for(bn = cn->child; bn; bn = bn->next) { | |
| 15884 | 715 | if(! PURPLE_BLIST_NODE_IS_BUDDY(bn)) continue; |
| 716 | if(! PURPLE_BLIST_NODE_SHOULD_SAVE(bn)) continue; | |
| 717 | ||
| 718 | bdy = (PurpleBuddy *) bn; | |
| 10977 | 719 | |
| 720 | if(bdy->account == acct) { | |
| 721 | struct mwSametimeUser *stu; | |
| 722 | enum mwSametimeUserType utype; | |
| 723 | ||
| 724 | idb.user = bdy->name; | |
| 725 | ||
| 15884 | 726 | utype = purple_blist_node_get_int(bn, BUDDY_KEY_TYPE); |
| 10977 | 727 | if(! utype) utype = mwSametimeUser_NORMAL; |
| 728 | ||
| 729 | stu = mwSametimeUser_new(stg, utype, &idb); | |
| 730 | mwSametimeUser_setShortName(stu, bdy->server_alias); | |
| 731 | mwSametimeUser_setAlias(stu, bdy->alias); | |
| 732 | } | |
| 733 | } | |
| 734 | } | |
| 735 | } | |
| 736 | } | |
| 737 | ||
| 738 | ||
| 15884 | 739 | static void blist_store(struct mwPurplePluginData *pd) { |
| 10977 | 740 | |
| 741 | struct mwSametimeList *stlist; | |
| 742 | struct mwServiceStorage *srvc; | |
| 743 | struct mwStorageUnit *unit; | |
| 744 | ||
| 15884 | 745 | PurpleConnection *gc; |
| 10977 | 746 | |
| 747 | struct mwPutBuffer *b; | |
| 748 | struct mwOpaque *o; | |
| 749 | ||
| 750 | g_return_if_fail(pd != NULL); | |
| 751 | ||
| 752 | srvc = pd->srvc_store; | |
| 753 | g_return_if_fail(srvc != NULL); | |
| 754 | ||
| 755 | gc = pd->gc; | |
| 756 | ||
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
757 | if(BLIST_PREF_IS_LOCAL() || BLIST_PREF_IS_MERGE()) { |
| 10977 | 758 | DEBUG_INFO("preferences indicate not to save remote blist\n"); |
| 759 | return; | |
| 760 | ||
| 761 | } else if(MW_SERVICE_IS_DEAD(srvc)) { | |
| 762 | DEBUG_INFO("aborting save of blist: storage service is not alive\n"); | |
| 763 | return; | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
764 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
765 | } else if(BLIST_PREF_IS_STORE() || BLIST_PREF_IS_SYNCH()) { |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
766 | DEBUG_INFO("saving remote blist\n"); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
767 | |
| 10977 | 768 | } else { |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
769 | g_return_if_reached(); |
| 10977 | 770 | } |
| 771 | ||
| 772 | /* create and export to a list object */ | |
| 773 | stlist = mwSametimeList_new(); | |
| 774 | blist_export(gc, stlist); | |
| 775 | ||
| 776 | /* write it to a buffer */ | |
| 777 | b = mwPutBuffer_new(); | |
| 778 | mwSametimeList_put(b, stlist); | |
| 779 | mwSametimeList_free(stlist); | |
| 780 | ||
| 781 | /* put the buffer contents into a storage unit */ | |
| 782 | unit = mwStorageUnit_new(mwStore_AWARE_LIST); | |
| 783 | o = mwStorageUnit_asOpaque(unit); | |
| 784 | mwPutBuffer_finalize(o, b); | |
| 785 | ||
| 786 | /* save the storage unit to the service */ | |
| 787 | mwServiceStorage_save(srvc, unit, NULL, NULL, NULL); | |
| 788 | } | |
| 789 | ||
| 790 | ||
| 791 | static gboolean blist_save_cb(gpointer data) { | |
| 15884 | 792 | struct mwPurplePluginData *pd = data; |
| 10977 | 793 | |
| 794 | blist_store(pd); | |
| 795 | pd->save_event = 0; | |
| 796 | return FALSE; | |
| 797 | } | |
| 798 | ||
| 799 | ||
| 800 | /** schedules the buddy list to be saved to the server */ | |
| 15884 | 801 | static void blist_schedule(struct mwPurplePluginData *pd) { |
| 10977 | 802 | if(pd->save_event) return; |
| 803 | ||
| 15884 | 804 | pd->save_event = purple_timeout_add(BLIST_SAVE_SECONDS * 1000, |
| 10977 | 805 | blist_save_cb, pd); |
| 806 | } | |
| 807 | ||
| 808 | ||
| 15884 | 809 | static gboolean buddy_is_external(PurpleBuddy *b) { |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
810 | g_return_val_if_fail(b != NULL, FALSE); |
| 15884 | 811 | return purple_str_has_prefix(b->name, "@E "); |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
812 | } |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
813 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
814 | |
| 10977 | 815 | /** Actually add a buddy to the aware service, and schedule the buddy |
| 816 | list to be saved to the server */ | |
| 15884 | 817 | static void buddy_add(struct mwPurplePluginData *pd, |
| 818 | PurpleBuddy *buddy) { | |
| 10977 | 819 | |
| 820 | struct mwAwareIdBlock idb = { mwAware_USER, (char *) buddy->name, NULL }; | |
| 821 | struct mwAwareList *list; | |
| 822 | ||
| 15884 | 823 | PurpleGroup *group; |
| 10977 | 824 | GList *add; |
| 825 | ||
| 826 | add = g_list_prepend(NULL, &idb); | |
| 827 | ||
| 15884 | 828 | group = purple_buddy_get_group(buddy); |
| 10977 | 829 | list = list_ensure(pd, group); |
| 830 | ||
| 831 | if(mwAwareList_addAware(list, add)) { | |
| 15884 | 832 | purple_blist_remove_buddy(buddy); |
| 10977 | 833 | } |
| 834 | ||
| 835 | blist_schedule(pd); | |
| 836 | ||
| 837 | g_list_free(add); | |
| 838 | } | |
| 839 | ||
| 840 | ||
| 15884 | 841 | /** ensure that a PurpleBuddy exists in the group with data |
| 10977 | 842 | appropriately matching the st user entry from the st list */ |
| 15884 | 843 | static PurpleBuddy *buddy_ensure(PurpleConnection *gc, PurpleGroup *group, |
| 10977 | 844 | struct mwSametimeUser *stuser) { |
| 845 | ||
| 15884 | 846 | struct mwPurplePluginData *pd = gc->proto_data; |
| 847 | PurpleBuddy *buddy; | |
| 848 | PurpleAccount *acct = purple_connection_get_account(gc); | |
| 10977 | 849 | |
| 850 | const char *id = mwSametimeUser_getUser(stuser); | |
| 851 | const char *name = mwSametimeUser_getShortName(stuser); | |
| 852 | const char *alias = mwSametimeUser_getAlias(stuser); | |
| 853 | enum mwSametimeUserType type = mwSametimeUser_getType(stuser); | |
| 854 | ||
| 855 | g_return_val_if_fail(id != NULL, NULL); | |
| 856 | g_return_val_if_fail(strlen(id) > 0, NULL); | |
| 857 | ||
| 15884 | 858 | buddy = purple_find_buddy_in_group(acct, id, group); |
| 10977 | 859 | if(! buddy) { |
| 15884 | 860 | buddy = purple_buddy_new(acct, id, alias); |
| 10977 | 861 | |
| 15884 | 862 | purple_blist_add_buddy(buddy, NULL, group, NULL); |
| 10977 | 863 | buddy_add(pd, buddy); |
| 864 | } | |
| 865 | ||
| 15884 | 866 | purple_blist_alias_buddy(buddy, alias); |
| 867 | purple_blist_server_alias_buddy(buddy, name); | |
| 868 | purple_blist_node_set_string((PurpleBlistNode *) buddy, BUDDY_KEY_NAME, name); | |
| 869 | purple_blist_node_set_int((PurpleBlistNode *) buddy, BUDDY_KEY_TYPE, type); | |
| 10977 | 870 | |
| 871 | return buddy; | |
| 872 | } | |
| 873 | ||
| 874 | ||
|
11133
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
875 | /** add aware watch for a dynamic group */ |
| 15884 | 876 | static void group_add(struct mwPurplePluginData *pd, |
| 877 | PurpleGroup *group) { | |
| 10977 | 878 | |
| 879 | struct mwAwareIdBlock idb = { mwAware_GROUP, NULL, NULL }; | |
| 880 | struct mwAwareList *list; | |
| 881 | const char *n; | |
| 882 | GList *add; | |
| 883 | ||
| 15884 | 884 | n = purple_blist_node_get_string((PurpleBlistNode *) group, GROUP_KEY_NAME); |
| 10977 | 885 | if(! n) n = group->name; |
| 886 | ||
| 887 | idb.user = (char *) n; | |
| 888 | add = g_list_prepend(NULL, &idb); | |
| 889 | ||
| 890 | list = list_ensure(pd, group); | |
| 891 | mwAwareList_addAware(list, add); | |
| 892 | g_list_free(add); | |
| 893 | } | |
| 894 | ||
| 895 | ||
| 15884 | 896 | /** ensure that a PurpleGroup exists in the blist with data |
| 10977 | 897 | appropriately matching the st group entry from the st list */ |
| 15884 | 898 | static PurpleGroup *group_ensure(PurpleConnection *gc, |
| 10977 | 899 | struct mwSametimeGroup *stgroup) { |
| 15884 | 900 | PurpleAccount *acct; |
| 901 | PurpleGroup *group = NULL; | |
| 902 | PurpleBuddyList *blist; | |
| 903 | PurpleBlistNode *gn; | |
|
11133
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
904 | const char *name, *alias, *owner; |
|
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
905 | enum mwSametimeGroupType type; |
| 10977 | 906 | |
| 15884 | 907 | acct = purple_connection_get_account(gc); |
| 908 | owner = purple_account_get_username(acct); | |
| 909 | ||
| 910 | blist = purple_get_blist(); | |
|
12005
0256aeef8411
[gaim-migrate @ 14298]
Christopher O'Brien <siege@pidgin.im>
parents:
11953
diff
changeset
|
911 | g_return_val_if_fail(blist != NULL, NULL); |
|
0256aeef8411
[gaim-migrate @ 14298]
Christopher O'Brien <siege@pidgin.im>
parents:
11953
diff
changeset
|
912 | |
|
11133
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
913 | name = mwSametimeGroup_getName(stgroup); |
|
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
914 | alias = mwSametimeGroup_getAlias(stgroup); |
|
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
915 | type = mwSametimeGroup_getType(stgroup); |
|
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
916 | |
|
12524
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
917 | DEBUG_INFO("attempting to ensure group %s, called %s\n", |
|
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
918 | NSTR(name), NSTR(alias)); |
|
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
919 | |
|
12005
0256aeef8411
[gaim-migrate @ 14298]
Christopher O'Brien <siege@pidgin.im>
parents:
11953
diff
changeset
|
920 | /* first attempt at finding the group, by the name key */ |
|
0256aeef8411
[gaim-migrate @ 14298]
Christopher O'Brien <siege@pidgin.im>
parents:
11953
diff
changeset
|
921 | for(gn = blist->root; gn; gn = gn->next) { |
|
12524
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
922 | const char *n, *o; |
| 15884 | 923 | if(! PURPLE_BLIST_NODE_IS_GROUP(gn)) continue; |
| 924 | n = purple_blist_node_get_string(gn, GROUP_KEY_NAME); | |
| 925 | o = purple_blist_node_get_string(gn, GROUP_KEY_OWNER); | |
|
12524
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
926 | |
|
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
927 | DEBUG_INFO("found group named %s, owned by %s\n", NSTR(n), NSTR(o)); |
|
12005
0256aeef8411
[gaim-migrate @ 14298]
Christopher O'Brien <siege@pidgin.im>
parents:
11953
diff
changeset
|
928 | |
|
0256aeef8411
[gaim-migrate @ 14298]
Christopher O'Brien <siege@pidgin.im>
parents:
11953
diff
changeset
|
929 | if(n && !strcmp(n, name)) { |
|
12524
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
930 | if(!o || !strcmp(o, owner)) { |
|
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
931 | DEBUG_INFO("that'll work\n"); |
| 15884 | 932 | group = (PurpleGroup *) gn; |
|
12524
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
933 | break; |
|
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
934 | } |
|
12005
0256aeef8411
[gaim-migrate @ 14298]
Christopher O'Brien <siege@pidgin.im>
parents:
11953
diff
changeset
|
935 | } |
|
12524
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
936 | } |
|
12005
0256aeef8411
[gaim-migrate @ 14298]
Christopher O'Brien <siege@pidgin.im>
parents:
11953
diff
changeset
|
937 | |
|
0256aeef8411
[gaim-migrate @ 14298]
Christopher O'Brien <siege@pidgin.im>
parents:
11953
diff
changeset
|
938 | /* try again, by alias */ |
|
12524
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
939 | if(! group) { |
|
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
940 | DEBUG_INFO("searching for group by alias %s\n", NSTR(alias)); |
| 15884 | 941 | group = purple_find_group(alias); |
|
12524
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
942 | } |
|
12005
0256aeef8411
[gaim-migrate @ 14298]
Christopher O'Brien <siege@pidgin.im>
parents:
11953
diff
changeset
|
943 | |
|
0256aeef8411
[gaim-migrate @ 14298]
Christopher O'Brien <siege@pidgin.im>
parents:
11953
diff
changeset
|
944 | /* oh well, no such group. Let's create it! */ |
| 10977 | 945 | if(! group) { |
|
12524
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
946 | DEBUG_INFO("creating group\n"); |
| 15884 | 947 | group = purple_group_new(alias); |
| 948 | purple_blist_add_group(group, NULL); | |
| 10977 | 949 | } |
| 950 | ||
| 15884 | 951 | gn = (PurpleBlistNode *) group; |
| 952 | purple_blist_node_set_string(gn, GROUP_KEY_NAME, name); | |
| 953 | purple_blist_node_set_int(gn, GROUP_KEY_TYPE, type); | |
| 10977 | 954 | |
| 955 | if(type == mwSametimeGroup_DYNAMIC) { | |
| 15884 | 956 | purple_blist_node_set_string(gn, GROUP_KEY_OWNER, owner); |
| 10977 | 957 | group_add(gc->proto_data, group); |
| 958 | } | |
| 959 | ||
| 960 | return group; | |
| 961 | } | |
| 962 | ||
| 963 | ||
| 15884 | 964 | /** merge the entries from a st list into the purple blist */ |
| 965 | static void blist_merge(PurpleConnection *gc, struct mwSametimeList *stlist) { | |
| 10977 | 966 | struct mwSametimeGroup *stgroup; |
| 967 | struct mwSametimeUser *stuser; | |
| 968 | ||
| 15884 | 969 | PurpleGroup *group; |
| 970 | PurpleBuddy *buddy; | |
| 10977 | 971 | |
| 972 | GList *gl, *gtl, *ul, *utl; | |
| 973 | ||
| 974 | gl = gtl = mwSametimeList_getGroups(stlist); | |
| 975 | for(; gl; gl = gl->next) { | |
| 976 | ||
| 977 | stgroup = (struct mwSametimeGroup *) gl->data; | |
| 978 | group = group_ensure(gc, stgroup); | |
| 979 | ||
| 980 | ul = utl = mwSametimeGroup_getUsers(stgroup); | |
| 981 | for(; ul; ul = ul->next) { | |
| 982 | ||
| 983 | stuser = (struct mwSametimeUser *) ul->data; | |
| 984 | buddy = buddy_ensure(gc, group, stuser); | |
| 985 | } | |
| 986 | g_list_free(utl); | |
| 987 | } | |
| 988 | g_list_free(gtl); | |
| 989 | } | |
| 990 | ||
| 991 | ||
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
992 | /** remove all buddies on account from group. If del is TRUE and group |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
993 | is left empty, remove group as well */ |
| 15884 | 994 | static void group_clear(PurpleGroup *group, PurpleAccount *acct, gboolean del) { |
| 995 | PurpleConnection *gc; | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
996 | GList *prune = NULL; |
| 15884 | 997 | PurpleBlistNode *gn, *cn, *bn; |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
998 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
999 | g_return_if_fail(group != NULL); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1000 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1001 | DEBUG_INFO("clearing members from pruned group %s\n", NSTR(group->name)); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1002 | |
| 15884 | 1003 | gc = purple_account_get_connection(acct); |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1004 | g_return_if_fail(gc != NULL); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1005 | |
| 15884 | 1006 | gn = (PurpleBlistNode *) group; |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1007 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1008 | for(cn = gn->child; cn; cn = cn->next) { |
| 15884 | 1009 | if(! PURPLE_BLIST_NODE_IS_CONTACT(cn)) continue; |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1010 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1011 | for(bn = cn->child; bn; bn = bn->next) { |
| 15884 | 1012 | PurpleBuddy *gb = (PurpleBuddy *) bn; |
| 1013 | ||
| 1014 | if(! PURPLE_BLIST_NODE_IS_BUDDY(bn)) continue; | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1015 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1016 | if(gb->account == acct) { |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1017 | DEBUG_INFO("clearing %s from group\n", NSTR(gb->name)); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1018 | prune = g_list_prepend(prune, gb); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1019 | } |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1020 | } |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1021 | } |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1022 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1023 | /* quickly unsubscribe from presence for the entire group */ |
| 15884 | 1024 | purple_account_remove_group(acct, group); |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1025 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1026 | /* remove blist entries that need to go */ |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1027 | while(prune) { |
| 15884 | 1028 | purple_blist_remove_buddy(prune->data); |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1029 | prune = g_list_delete_link(prune, prune); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1030 | } |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1031 | DEBUG_INFO("cleared buddies\n"); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1032 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1033 | /* optionally remove group from blist */ |
| 15884 | 1034 | if(del && !purple_blist_get_group_size(group, TRUE)) { |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1035 | DEBUG_INFO("removing empty group\n"); |
| 15884 | 1036 | purple_blist_remove_group(group); |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1037 | } |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1038 | } |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1039 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1040 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1041 | /** prune out group members that shouldn't be there */ |
| 15884 | 1042 | static void group_prune(PurpleConnection *gc, PurpleGroup *group, |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1043 | struct mwSametimeGroup *stgroup) { |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1044 | |
| 15884 | 1045 | PurpleAccount *acct; |
| 1046 | PurpleBlistNode *gn, *cn, *bn; | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1047 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1048 | GHashTable *stusers; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1049 | GList *prune = NULL; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1050 | GList *ul, *utl; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1051 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1052 | g_return_if_fail(group != NULL); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1053 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1054 | DEBUG_INFO("pruning membership of group %s\n", NSTR(group->name)); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1055 | |
| 15884 | 1056 | acct = purple_connection_get_account(gc); |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1057 | g_return_if_fail(acct != NULL); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1058 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1059 | stusers = g_hash_table_new(g_str_hash, g_str_equal); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1060 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1061 | /* build a hash table for quick lookup while pruning the group |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1062 | contents */ |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1063 | utl = mwSametimeGroup_getUsers(stgroup); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1064 | for(ul = utl; ul; ul = ul->next) { |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1065 | const char *id = mwSametimeUser_getUser(ul->data); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1066 | g_hash_table_insert(stusers, (char *) id, ul->data); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1067 | DEBUG_INFO("server copy has %s\n", NSTR(id)); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1068 | } |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1069 | g_list_free(utl); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1070 | |
| 15884 | 1071 | gn = (PurpleBlistNode *) group; |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1072 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1073 | for(cn = gn->child; cn; cn = cn->next) { |
| 15884 | 1074 | if(! PURPLE_BLIST_NODE_IS_CONTACT(cn)) continue; |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1075 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1076 | for(bn = cn->child; bn; bn = bn->next) { |
| 15884 | 1077 | PurpleBuddy *gb = (PurpleBuddy *) bn; |
| 1078 | ||
| 1079 | if(! PURPLE_BLIST_NODE_IS_BUDDY(bn)) continue; | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1080 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1081 | /* if the account is correct and they're not in our table, mark |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1082 | them for pruning */ |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1083 | if(gb->account == acct && !g_hash_table_lookup(stusers, gb->name)) { |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1084 | DEBUG_INFO("marking %s for pruning\n", NSTR(gb->name)); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1085 | prune = g_list_prepend(prune, gb); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1086 | } |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1087 | } |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1088 | } |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1089 | DEBUG_INFO("done marking\n"); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1090 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1091 | g_hash_table_destroy(stusers); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1092 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1093 | if(prune) { |
| 15884 | 1094 | purple_account_remove_buddies(acct, prune, NULL); |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1095 | while(prune) { |
| 15884 | 1096 | purple_blist_remove_buddy(prune->data); |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1097 | prune = g_list_delete_link(prune, prune); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1098 | } |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1099 | } |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1100 | } |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1101 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1102 | |
| 15884 | 1103 | /** synch the entries from a st list into the purple blist, removing any |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1104 | existing buddies that aren't in the st list */ |
| 15884 | 1105 | static void blist_sync(PurpleConnection *gc, struct mwSametimeList *stlist) { |
| 1106 | ||
| 1107 | PurpleAccount *acct; | |
| 1108 | PurpleBuddyList *blist; | |
| 1109 | PurpleBlistNode *gn; | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1110 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1111 | GHashTable *stgroups; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1112 | GList *g_prune = NULL; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1113 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1114 | GList *gl, *gtl; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1115 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1116 | const char *acct_n; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1117 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1118 | DEBUG_INFO("synchronizing local buddy list from server list\n"); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1119 | |
| 15884 | 1120 | acct = purple_connection_get_account(gc); |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1121 | g_return_if_fail(acct != NULL); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1122 | |
| 15884 | 1123 | acct_n = purple_account_get_username(acct); |
| 1124 | ||
| 1125 | blist = purple_get_blist(); | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1126 | g_return_if_fail(blist != NULL); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1127 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1128 | /* build a hash table for quick lookup while pruning the local |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1129 | list, mapping group name to group structure */ |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1130 | stgroups = g_hash_table_new(g_str_hash, g_str_equal); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1131 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1132 | gtl = mwSametimeList_getGroups(stlist); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1133 | for(gl = gtl; gl; gl = gl->next) { |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1134 | const char *name = mwSametimeGroup_getName(gl->data); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1135 | g_hash_table_insert(stgroups, (char *) name, gl->data); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1136 | } |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1137 | g_list_free(gtl); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1138 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1139 | /* find all groups which should be pruned from the local list */ |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1140 | for(gn = blist->root; gn; gn = gn->next) { |
| 15884 | 1141 | PurpleGroup *grp = (PurpleGroup *) gn; |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1142 | const char *gname, *owner; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1143 | struct mwSametimeGroup *stgrp; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1144 | |
| 15884 | 1145 | if(! PURPLE_BLIST_NODE_IS_GROUP(gn)) continue; |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1146 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1147 | /* group not belonging to this account */ |
| 15884 | 1148 | if(! purple_group_on_account(grp, acct)) |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1149 | continue; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1150 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1151 | /* dynamic group belonging to this account. don't prune contents */ |
| 15884 | 1152 | owner = purple_blist_node_get_string(gn, GROUP_KEY_OWNER); |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1153 | if(owner && !strcmp(owner, acct_n)) |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1154 | continue; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1155 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1156 | /* we actually are synching by this key as opposed to the group |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1157 | title, which can be different things in the st list */ |
| 15884 | 1158 | gname = purple_blist_node_get_string(gn, GROUP_KEY_NAME); |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1159 | if(! gname) gname = grp->name; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1160 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1161 | stgrp = g_hash_table_lookup(stgroups, gname); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1162 | if(! stgrp) { |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1163 | /* remove the whole group */ |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1164 | DEBUG_INFO("marking group %s for pruning\n", grp->name); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1165 | g_prune = g_list_prepend(g_prune, grp); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1166 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1167 | } else { |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1168 | /* synch the group contents */ |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1169 | group_prune(gc, grp, stgrp); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1170 | } |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1171 | } |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1172 | DEBUG_INFO("done marking groups\n"); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1173 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1174 | /* don't need this anymore */ |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1175 | g_hash_table_destroy(stgroups); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1176 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1177 | /* prune all marked groups */ |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1178 | while(g_prune) { |
| 15884 | 1179 | PurpleGroup *grp = g_prune->data; |
| 1180 | PurpleBlistNode *gn = (PurpleBlistNode *) grp; | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1181 | const char *owner; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1182 | gboolean del = TRUE; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1183 | |
| 15884 | 1184 | owner = purple_blist_node_get_string(gn, GROUP_KEY_OWNER); |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1185 | if(owner && strcmp(owner, acct_n)) { |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1186 | /* it's a specialty group belonging to another account with some |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1187 | of our members in it, so don't fully delete it */ |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1188 | del = FALSE; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1189 | } |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1190 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1191 | group_clear(g_prune->data, acct, del); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1192 | g_prune = g_list_delete_link(g_prune, g_prune); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1193 | } |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1194 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1195 | /* done with the pruning, let's merge in the additions */ |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1196 | blist_merge(gc, stlist); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1197 | } |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1198 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1199 | |
| 10977 | 1200 | /** callback passed to the storage service when it's told to load the |
| 1201 | st list */ | |
| 1202 | static void fetch_blist_cb(struct mwServiceStorage *srvc, | |
| 1203 | guint32 result, struct mwStorageUnit *item, | |
| 1204 | gpointer data) { | |
| 1205 | ||
| 15884 | 1206 | struct mwPurplePluginData *pd = data; |
| 10977 | 1207 | struct mwSametimeList *stlist; |
| 1208 | ||
| 1209 | struct mwGetBuffer *b; | |
| 1210 | ||
| 1211 | g_return_if_fail(result == ERR_SUCCESS); | |
| 1212 | ||
| 1213 | /* check our preferences for loading */ | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1214 | if(BLIST_PREF_IS_LOCAL()) { |
| 10977 | 1215 | DEBUG_INFO("preferences indicate not to load remote buddy list\n"); |
| 1216 | return; | |
| 1217 | } | |
| 1218 | ||
| 1219 | b = mwGetBuffer_wrap(mwStorageUnit_asOpaque(item)); | |
| 1220 | ||
| 1221 | stlist = mwSametimeList_new(); | |
| 1222 | mwSametimeList_get(b, stlist); | |
| 1223 | ||
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1224 | /* merge or synch depending on preferences */ |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1225 | if(BLIST_PREF_IS_MERGE() || BLIST_PREF_IS_STORE()) { |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1226 | blist_merge(pd->gc, stlist); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1227 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1228 | } else if(BLIST_PREF_IS_SYNCH()) { |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1229 | blist_sync(pd->gc, stlist); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1230 | } |
| 10977 | 1231 | |
| 1232 | mwSametimeList_free(stlist); | |
| 1233 | } | |
| 1234 | ||
| 1235 | ||
| 15884 | 1236 | /** signal triggered when a conversation is opened in Purple */ |
| 1237 | static void conversation_created_cb(PurpleConversation *g_conv, | |
| 1238 | struct mwPurplePluginData *pd) { | |
| 10977 | 1239 | |
| 1240 | /* we need to tell the IM service to negotiate features for the | |
| 1241 | conversation right away, otherwise it'll wait until the first | |
| 1242 | message is sent before offering NotesBuddy features. Therefore | |
| 15884 | 1243 | whenever Purple creates a conversation, we'll immediately open the |
| 10977 | 1244 | channel to the other side and figure out what the target can |
| 1245 | handle. Unfortunately, this makes us vulnerable to Psychic Mode, | |
| 1246 | whereas a more lazy negotiation based on the first message | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1247 | would not */ |
| 10977 | 1248 | |
| 15884 | 1249 | PurpleConnection *gc; |
| 10977 | 1250 | struct mwIdBlock who = { 0, 0 }; |
| 1251 | struct mwConversation *conv; | |
| 1252 | ||
| 15884 | 1253 | gc = purple_conversation_get_gc(g_conv); |
| 10977 | 1254 | if(pd->gc != gc) |
| 1255 | return; /* not ours */ | |
| 1256 | ||
| 15884 | 1257 | if(purple_conversation_get_type(g_conv) != PURPLE_CONV_TYPE_IM) |
| 10977 | 1258 | return; /* wrong type */ |
| 1259 | ||
| 15884 | 1260 | who.user = (char *) purple_conversation_get_name(g_conv); |
| 10977 | 1261 | conv = mwServiceIm_getConversation(pd->srvc_im, &who); |
| 1262 | ||
| 1263 | convo_features(conv); | |
| 1264 | ||
| 1265 | if(mwConversation_isClosed(conv)) | |
| 1266 | mwConversation_open(conv); | |
| 1267 | } | |
| 1268 | ||
| 1269 | ||
| 15884 | 1270 | static void blist_menu_nab(PurpleBlistNode *node, gpointer data) { |
| 1271 | struct mwPurplePluginData *pd = data; | |
| 1272 | PurpleConnection *gc; | |
| 1273 | ||
| 1274 | PurpleGroup *group = (PurpleGroup *) node; | |
| 10977 | 1275 | |
| 1276 | GString *str; | |
| 1277 | char *tmp; | |
| 1278 | ||
| 1279 | g_return_if_fail(pd != NULL); | |
| 1280 | ||
| 1281 | gc = pd->gc; | |
| 1282 | g_return_if_fail(gc != NULL); | |
| 1283 | ||
| 15884 | 1284 | g_return_if_fail(PURPLE_BLIST_NODE_IS_GROUP(node)); |
| 10977 | 1285 | |
| 1286 | str = g_string_new(NULL); | |
| 1287 | ||
| 15884 | 1288 | tmp = (char *) purple_blist_node_get_string(node, GROUP_KEY_NAME); |
| 10977 | 1289 | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1290 | g_string_append_printf(str, _("<b>Group Title:</b> %s<br>"), group->name); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1291 | g_string_append_printf(str, _("<b>Notes Group ID:</b> %s<br>"), tmp); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1292 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1293 | tmp = g_strdup_printf(_("Info for Group %s"), group->name); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1294 | |
| 15884 | 1295 | purple_notify_formatted(gc, tmp, _("Notes Address Book Information"), |
| 10977 | 1296 | NULL, str->str, NULL, NULL); |
| 1297 | ||
| 1298 | g_free(tmp); | |
| 1299 | g_string_free(str, TRUE); | |
| 1300 | } | |
| 1301 | ||
| 1302 | ||
| 1303 | /** The normal blist menu prpl function doesn't get called for groups, | |
| 1304 | so we use the blist-node-extended-menu signal to trigger this | |
| 1305 | handler */ | |
| 15884 | 1306 | static void blist_node_menu_cb(PurpleBlistNode *node, |
| 1307 | GList **menu, struct mwPurplePluginData *pd) { | |
|
12107
f14b83c0df1e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
1308 | const char *owner; |
| 15884 | 1309 | PurpleGroup *group; |
| 1310 | PurpleAccount *acct; | |
| 1311 | PurpleMenuAction *act; | |
| 10977 | 1312 | |
|
12107
f14b83c0df1e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
1313 | /* we only want groups */ |
| 15884 | 1314 | if(! PURPLE_BLIST_NODE_IS_GROUP(node)) return; |
| 1315 | group = (PurpleGroup *) node; | |
| 1316 | ||
| 1317 | acct = purple_connection_get_account(pd->gc); | |
|
12107
f14b83c0df1e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
1318 | g_return_if_fail(acct != NULL); |
|
f14b83c0df1e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
1319 | |
|
f14b83c0df1e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
1320 | /* better make sure we're connected */ |
| 15884 | 1321 | if(! purple_account_is_connected(acct)) return; |
|
12107
f14b83c0df1e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
1322 | |
|
f14b83c0df1e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
1323 | #if 0 |
|
f14b83c0df1e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
1324 | /* if there's anyone in the group for this acct, offer to invite |
|
f14b83c0df1e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
1325 | them all to a conference */ |
| 15884 | 1326 | if(purple_group_on_account(group, acct)) { |
| 1327 | act = purple_menu_action_new(_("Invite Group to Conference..."), | |
| 1328 | PURPLE_CALLBACK(blist_menu_group_invite), | |
| 13021 | 1329 | pd, NULL); |
|
12107
f14b83c0df1e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
1330 | *menu = g_list_append(*menu, NULL); |
|
f14b83c0df1e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
1331 | } |
|
f14b83c0df1e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
1332 | #endif |
|
f14b83c0df1e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
1333 | |
|
f14b83c0df1e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
1334 | /* check if it's a NAB group for this account */ |
| 15884 | 1335 | owner = purple_blist_node_get_string(node, GROUP_KEY_OWNER); |
| 1336 | if(owner && !strcmp(owner, purple_account_get_username(acct))) { | |
| 1337 | act = purple_menu_action_new(_("Get Notes Address Book Info"), | |
| 1338 | PURPLE_CALLBACK(blist_menu_nab), pd, NULL); | |
| 10977 | 1339 | *menu = g_list_append(*menu, act); |
| 1340 | } | |
| 1341 | } | |
| 1342 | ||
| 1343 | ||
|
12266
d61e488f64d6
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1344 | /* lifted this from oldstatus, since HEAD doesn't do this at login |
|
d61e488f64d6
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1345 | anymore. */ |
| 15884 | 1346 | static void blist_init(PurpleAccount *acct) { |
| 1347 | PurpleBlistNode *gnode, *cnode, *bnode; | |
|
12266
d61e488f64d6
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1348 | GList *add_buds = NULL; |
|
d61e488f64d6
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1349 | |
| 15884 | 1350 | for(gnode = purple_get_blist()->root; gnode; gnode = gnode->next) { |
| 1351 | if(! PURPLE_BLIST_NODE_IS_GROUP(gnode)) continue; | |
|
12266
d61e488f64d6
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1352 | |
|
d61e488f64d6
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1353 | for(cnode = gnode->child; cnode; cnode = cnode->next) { |
| 15884 | 1354 | if(! PURPLE_BLIST_NODE_IS_CONTACT(cnode)) |
|
12266
d61e488f64d6
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1355 | continue; |
|
d61e488f64d6
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1356 | for(bnode = cnode->child; bnode; bnode = bnode->next) { |
| 15884 | 1357 | PurpleBuddy *b; |
| 1358 | if(!PURPLE_BLIST_NODE_IS_BUDDY(bnode)) | |
|
12266
d61e488f64d6
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1359 | continue; |
|
d61e488f64d6
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1360 | |
| 15884 | 1361 | b = (PurpleBuddy *)bnode; |
|
12266
d61e488f64d6
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1362 | if(b->account == acct) { |
|
d61e488f64d6
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1363 | add_buds = g_list_append(add_buds, b); |
|
d61e488f64d6
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1364 | } |
|
d61e488f64d6
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1365 | } |
|
d61e488f64d6
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1366 | } |
|
d61e488f64d6
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1367 | } |
|
d61e488f64d6
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1368 | |
|
d61e488f64d6
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1369 | if(add_buds) { |
| 15884 | 1370 | purple_account_add_buddies(acct, add_buds); |
|
12266
d61e488f64d6
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1371 | g_list_free(add_buds); |
|
d61e488f64d6
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1372 | } |
|
d61e488f64d6
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1373 | } |
|
d61e488f64d6
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1374 | |
|
d61e488f64d6
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1375 | |
| 10977 | 1376 | /** Last thing to happen from a started session */ |
| 15884 | 1377 | static void services_starting(struct mwPurplePluginData *pd) { |
| 1378 | ||
| 1379 | PurpleConnection *gc; | |
| 1380 | PurpleAccount *acct; | |
| 10977 | 1381 | struct mwStorageUnit *unit; |
| 15884 | 1382 | PurpleBuddyList *blist; |
| 1383 | PurpleBlistNode *l; | |
| 10977 | 1384 | |
| 1385 | gc = pd->gc; | |
| 15884 | 1386 | acct = purple_connection_get_account(gc); |
| 10977 | 1387 | |
| 1388 | /* grab the buddy list from the server */ | |
| 1389 | unit = mwStorageUnit_new(mwStore_AWARE_LIST); | |
| 1390 | mwServiceStorage_load(pd->srvc_store, unit, fetch_blist_cb, pd, NULL); | |
| 1391 | ||
| 1392 | /* find all the NAB groups and subscribe to them */ | |
| 15884 | 1393 | blist = purple_get_blist(); |
| 10977 | 1394 | for(l = blist->root; l; l = l->next) { |
| 15884 | 1395 | PurpleGroup *group = (PurpleGroup *) l; |
| 10977 | 1396 | enum mwSametimeGroupType gt; |
| 1397 | const char *owner; | |
| 1398 | ||
| 15884 | 1399 | if(! PURPLE_BLIST_NODE_IS_GROUP(l)) continue; |
| 10977 | 1400 | |
| 1401 | /* if the group is ownerless, or has an owner and we're not it, | |
| 1402 | skip it */ | |
| 15884 | 1403 | owner = purple_blist_node_get_string(l, GROUP_KEY_OWNER); |
| 1404 | if(!owner || strcmp(owner, purple_account_get_username(acct))) | |
| 10977 | 1405 | continue; |
| 1406 | ||
| 15884 | 1407 | gt = purple_blist_node_get_int(l, GROUP_KEY_TYPE); |
| 10977 | 1408 | if(gt == mwSametimeGroup_DYNAMIC) |
| 1409 | group_add(pd, group); | |
| 1410 | } | |
| 1411 | ||
| 1412 | /* set the aware attributes */ | |
| 1413 | /* indicate we understand what AV prefs are, but don't support any */ | |
| 1414 | mwServiceAware_setAttributeBoolean(pd->srvc_aware, | |
| 1415 | mwAttribute_AV_PREFS_SET, TRUE); | |
| 1416 | mwServiceAware_unsetAttribute(pd->srvc_aware, mwAttribute_MICROPHONE); | |
| 1417 | mwServiceAware_unsetAttribute(pd->srvc_aware, mwAttribute_SPEAKERS); | |
| 1418 | mwServiceAware_unsetAttribute(pd->srvc_aware, mwAttribute_VIDEO_CAMERA); | |
| 1419 | ||
| 1420 | /* ... but we can do file transfers! */ | |
| 1421 | mwServiceAware_setAttributeBoolean(pd->srvc_aware, | |
| 1422 | mwAttribute_FILE_TRANSFER, TRUE); | |
|
12266
d61e488f64d6
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1423 | |
|
d61e488f64d6
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1424 | blist_init(acct); |
| 10977 | 1425 | } |
| 1426 | ||
| 1427 | ||
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1428 | static void session_loginRedirect(struct mwSession *session, |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1429 | const char *host) { |
| 15884 | 1430 | struct mwPurplePluginData *pd; |
| 1431 | PurpleConnection *gc; | |
| 1432 | PurpleAccount *account; | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1433 | guint port; |
|
14975
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
1434 | const char *current_host; |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1435 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1436 | pd = mwSession_getClientData(session); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1437 | gc = pd->gc; |
| 15884 | 1438 | account = purple_connection_get_account(gc); |
| 1439 | port = purple_account_get_int(account, MW_KEY_PORT, MW_PLUGIN_DEFAULT_PORT); | |
| 1440 | current_host = purple_account_get_string(account, MW_KEY_HOST, | |
|
14975
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
1441 | MW_PLUGIN_DEFAULT_HOST); |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1442 | |
| 15884 | 1443 | if(purple_account_get_bool(account, MW_KEY_FORCE, FALSE) || |
|
14975
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
1444 | (! strcmp(current_host, host)) || |
| 15884 | 1445 | (purple_proxy_connect(NULL, account, host, port, connect_cb, pd) == NULL)) { |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1446 | |
|
14975
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
1447 | /* if we're configured to force logins, or if we're being |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
1448 | redirected to the already configured host, or if we couldn't |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
1449 | connect to the new host, we'll force the login instead */ |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
1450 | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1451 | mwSession_forceLogin(session); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1452 | } |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1453 | } |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1454 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1455 | |
| 15884 | 1456 | static void mw_prpl_set_status(PurpleAccount *acct, PurpleStatus *status); |
|
12266
d61e488f64d6
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1457 | |
|
d61e488f64d6
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1458 | |
| 10977 | 1459 | /** called from mw_session_stateChange when the session's state is |
| 1460 | mwSession_STARTED. Any finalizing of start-up stuff should go | |
| 1461 | here */ | |
| 15884 | 1462 | static void session_started(struct mwPurplePluginData *pd) { |
| 1463 | PurpleStatus *status; | |
| 1464 | PurpleAccount *acct; | |
|
12266
d61e488f64d6
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1465 | |
|
12813
6f67cfa0e6a0
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1466 | /* set out initial status */ |
| 15884 | 1467 | acct = purple_connection_get_account(pd->gc); |
| 1468 | status = purple_account_get_active_status(acct); | |
|
12266
d61e488f64d6
[gaim-migrate @ 14568]
Christopher O'Brien <siege@pidgin.im>
parents:
12263
diff
changeset
|
1469 | mw_prpl_set_status(acct, status); |
|
12813
6f67cfa0e6a0
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1470 | |
|
6f67cfa0e6a0
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1471 | /* start watching for new conversations */ |
| 15884 | 1472 | purple_signal_connect(purple_conversations_get_handle(), |
|
15426
def1a5724556
[gaim-migrate @ 18157]
Christopher O'Brien <siege@pidgin.im>
parents:
15345
diff
changeset
|
1473 | "conversation-created", pd, |
| 15884 | 1474 | PURPLE_CALLBACK(conversation_created_cb), pd); |
|
12813
6f67cfa0e6a0
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1475 | |
|
6f67cfa0e6a0
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1476 | /* watch for group extended menu items */ |
| 15884 | 1477 | purple_signal_connect(purple_blist_get_handle(), |
|
15426
def1a5724556
[gaim-migrate @ 18157]
Christopher O'Brien <siege@pidgin.im>
parents:
15345
diff
changeset
|
1478 | "blist-node-extended-menu", pd, |
| 15884 | 1479 | PURPLE_CALLBACK(blist_node_menu_cb), pd); |
|
15426
def1a5724556
[gaim-migrate @ 18157]
Christopher O'Brien <siege@pidgin.im>
parents:
15345
diff
changeset
|
1480 | |
| 10977 | 1481 | /* use our services to do neat things */ |
| 1482 | services_starting(pd); | |
| 1483 | } | |
| 1484 | ||
| 1485 | ||
| 15884 | 1486 | static void session_stopping(struct mwPurplePluginData *pd) { |
|
15426
def1a5724556
[gaim-migrate @ 18157]
Christopher O'Brien <siege@pidgin.im>
parents:
15345
diff
changeset
|
1487 | /* stop watching the signals from session_started */ |
| 15884 | 1488 | purple_signals_disconnect_by_handle(pd); |
|
15426
def1a5724556
[gaim-migrate @ 18157]
Christopher O'Brien <siege@pidgin.im>
parents:
15345
diff
changeset
|
1489 | } |
|
def1a5724556
[gaim-migrate @ 18157]
Christopher O'Brien <siege@pidgin.im>
parents:
15345
diff
changeset
|
1490 | |
|
def1a5724556
[gaim-migrate @ 18157]
Christopher O'Brien <siege@pidgin.im>
parents:
15345
diff
changeset
|
1491 | |
| 10977 | 1492 | static void mw_session_stateChange(struct mwSession *session, |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1493 | enum mwSessionState state, |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1494 | gpointer info) { |
| 15884 | 1495 | struct mwPurplePluginData *pd; |
| 1496 | PurpleConnection *gc; | |
|
13107
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
1497 | const char *msg = NULL; |
| 10977 | 1498 | |
| 1499 | pd = mwSession_getClientData(session); | |
| 1500 | gc = pd->gc; | |
| 1501 | ||
| 1502 | switch(state) { | |
| 1503 | case mwSession_STARTING: | |
| 1504 | msg = _("Sending Handshake"); | |
| 15884 | 1505 | purple_connection_update_progress(gc, msg, 2, MW_CONNECT_STEPS); |
| 10977 | 1506 | break; |
| 1507 | ||
| 1508 | case mwSession_HANDSHAKE: | |
| 1509 | msg = _("Waiting for Handshake Acknowledgement"); | |
| 15884 | 1510 | purple_connection_update_progress(gc, msg, 3, MW_CONNECT_STEPS); |
| 10977 | 1511 | break; |
| 1512 | ||
| 1513 | case mwSession_HANDSHAKE_ACK: | |
| 1514 | msg = _("Handshake Acknowledged, Sending Login"); | |
| 15884 | 1515 | purple_connection_update_progress(gc, msg, 4, MW_CONNECT_STEPS); |
| 10977 | 1516 | break; |
| 1517 | ||
| 1518 | case mwSession_LOGIN: | |
| 1519 | msg = _("Waiting for Login Acknowledgement"); | |
| 15884 | 1520 | purple_connection_update_progress(gc, msg, 5, MW_CONNECT_STEPS); |
| 10977 | 1521 | break; |
| 1522 | ||
| 1523 | case mwSession_LOGIN_REDIR: | |
| 1524 | msg = _("Login Redirected"); | |
| 15884 | 1525 | purple_connection_update_progress(gc, msg, 6, MW_CONNECT_STEPS); |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1526 | session_loginRedirect(session, info); |
| 10977 | 1527 | break; |
| 1528 | ||
|
11133
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
1529 | case mwSession_LOGIN_CONT: |
|
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
1530 | msg = _("Forcing Login"); |
| 15884 | 1531 | purple_connection_update_progress(gc, msg, 7, MW_CONNECT_STEPS); |
|
11133
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
1532 | |
| 10977 | 1533 | case mwSession_LOGIN_ACK: |
| 1534 | msg = _("Login Acknowledged"); | |
| 15884 | 1535 | purple_connection_update_progress(gc, msg, 8, MW_CONNECT_STEPS); |
| 10977 | 1536 | break; |
| 1537 | ||
| 1538 | case mwSession_STARTED: | |
|
12813
6f67cfa0e6a0
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1539 | msg = _("Starting Services"); |
| 15884 | 1540 | purple_connection_update_progress(gc, msg, 9, MW_CONNECT_STEPS); |
| 10977 | 1541 | |
| 1542 | session_started(pd); | |
|
12813
6f67cfa0e6a0
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1543 | |
|
6f67cfa0e6a0
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1544 | msg = _("Connected"); |
| 15884 | 1545 | purple_connection_update_progress(gc, msg, 10, MW_CONNECT_STEPS); |
| 1546 | purple_connection_set_state(gc, PURPLE_CONNECTED); | |
| 10977 | 1547 | break; |
| 1548 | ||
| 1549 | case mwSession_STOPPING: | |
|
15426
def1a5724556
[gaim-migrate @ 18157]
Christopher O'Brien <siege@pidgin.im>
parents:
15345
diff
changeset
|
1550 | |
|
def1a5724556
[gaim-migrate @ 18157]
Christopher O'Brien <siege@pidgin.im>
parents:
15345
diff
changeset
|
1551 | session_stopping(pd); |
|
def1a5724556
[gaim-migrate @ 18157]
Christopher O'Brien <siege@pidgin.im>
parents:
15345
diff
changeset
|
1552 | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1553 | if(GPOINTER_TO_UINT(info) & ERR_FAILURE) { |
|
13107
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
1554 | char *err = mwError(GPOINTER_TO_UINT(info)); |
| 15884 | 1555 | purple_connection_error(gc, err); |
|
13107
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
1556 | g_free(err); |
| 10977 | 1557 | } |
| 1558 | break; | |
| 1559 | ||
| 1560 | case mwSession_STOPPED: | |
| 1561 | break; | |
| 1562 | ||
| 1563 | case mwSession_UNKNOWN: | |
| 1564 | default: | |
| 1565 | DEBUG_WARN("session in unknown state\n"); | |
| 1566 | } | |
| 1567 | } | |
| 1568 | ||
| 1569 | ||
| 1570 | static void mw_session_setPrivacyInfo(struct mwSession *session) { | |
| 15884 | 1571 | struct mwPurplePluginData *pd; |
| 1572 | PurpleConnection *gc; | |
| 1573 | PurpleAccount *acct; | |
| 10977 | 1574 | struct mwPrivacyInfo *privacy; |
| 1575 | GSList *l, **ll; | |
| 1576 | guint count; | |
| 1577 | ||
| 1578 | DEBUG_INFO("privacy information set from server\n"); | |
| 1579 | ||
| 1580 | g_return_if_fail(session != NULL); | |
| 1581 | ||
| 1582 | pd = mwSession_getClientData(session); | |
| 1583 | g_return_if_fail(pd != NULL); | |
| 1584 | ||
| 1585 | gc = pd->gc; | |
| 1586 | g_return_if_fail(gc != NULL); | |
| 1587 | ||
| 15884 | 1588 | acct = purple_connection_get_account(gc); |
| 10977 | 1589 | g_return_if_fail(acct != NULL); |
| 1590 | ||
| 1591 | privacy = mwSession_getPrivacyInfo(session); | |
| 1592 | count = privacy->count; | |
| 1593 | ||
| 1594 | ll = (privacy->deny)? &acct->deny: &acct->permit; | |
| 1595 | for(l = *ll; l; l = l->next) g_free(l->data); | |
| 1596 | g_slist_free(*ll); | |
| 1597 | l = *ll = NULL; | |
| 1598 | ||
| 1599 | while(count--) { | |
| 1600 | struct mwUserItem *u = privacy->users + count; | |
| 1601 | l = g_slist_prepend(l, g_strdup(u->id)); | |
| 1602 | } | |
| 1603 | *ll = l; | |
| 1604 | } | |
| 1605 | ||
| 1606 | ||
| 1607 | static void mw_session_setUserStatus(struct mwSession *session) { | |
| 15884 | 1608 | struct mwPurplePluginData *pd; |
| 1609 | PurpleConnection *gc; | |
| 10977 | 1610 | struct mwAwareIdBlock idb = { mwAware_USER, NULL, NULL }; |
| 1611 | struct mwUserStatus *stat; | |
| 1612 | ||
| 1613 | g_return_if_fail(session != NULL); | |
| 1614 | ||
| 1615 | pd = mwSession_getClientData(session); | |
| 1616 | g_return_if_fail(pd != NULL); | |
| 1617 | ||
| 1618 | gc = pd->gc; | |
| 1619 | g_return_if_fail(gc != NULL); | |
| 1620 | ||
| 1621 | idb.user = mwSession_getProperty(session, mwSession_AUTH_USER_ID); | |
| 1622 | stat = mwSession_getUserStatus(session); | |
| 1623 | ||
| 1624 | /* trigger an update of our own status if we're in the buddy list */ | |
| 1625 | mwServiceAware_setStatus(pd->srvc_aware, &idb, stat); | |
| 1626 | } | |
| 1627 | ||
| 1628 | ||
| 1629 | static void mw_session_admin(struct mwSession *session, | |
| 1630 | const char *text) { | |
| 15884 | 1631 | PurpleConnection *gc; |
| 1632 | PurpleAccount *acct; | |
|
12813
6f67cfa0e6a0
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1633 | const char *host; |
|
13107
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
1634 | const char *msg; |
|
12813
6f67cfa0e6a0
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1635 | char *prim; |
|
6f67cfa0e6a0
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1636 | |
|
6f67cfa0e6a0
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1637 | gc = session_to_gc(session); |
| 10977 | 1638 | g_return_if_fail(gc != NULL); |
| 1639 | ||
| 15884 | 1640 | acct = purple_connection_get_account(gc); |
|
12813
6f67cfa0e6a0
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1641 | g_return_if_fail(acct != NULL); |
|
6f67cfa0e6a0
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1642 | |
| 15884 | 1643 | host = purple_account_get_string(acct, MW_KEY_HOST, NULL); |
|
12813
6f67cfa0e6a0
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1644 | |
|
13107
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
1645 | msg = _("A Sametime administrator has issued the following announcement" |
|
12813
6f67cfa0e6a0
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1646 | " on server %s"); |
|
13107
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
1647 | prim = g_strdup_printf(msg, NSTR(host)); |
|
12813
6f67cfa0e6a0
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1648 | |
| 15884 | 1649 | purple_notify_message(gc, PURPLE_NOTIFY_MSG_INFO, |
|
12813
6f67cfa0e6a0
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1650 | _("Sametime Administrator Announcement"), |
|
6f67cfa0e6a0
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1651 | prim, text, NULL, NULL); |
|
6f67cfa0e6a0
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1652 | |
|
6f67cfa0e6a0
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
1653 | g_free(prim); |
| 10977 | 1654 | } |
| 1655 | ||
| 1656 | ||
| 1657 | /** called from read_cb, attempts to read available data from sock and | |
| 1658 | pass it to the session, passing back the return code from the read | |
| 1659 | call for handling in read_cb */ | |
| 1660 | static int read_recv(struct mwSession *session, int sock) { | |
|
12311
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
1661 | guchar buf[BUF_LEN]; |
| 10977 | 1662 | int len; |
| 1663 | ||
| 1664 | len = read(sock, buf, BUF_LEN); | |
| 1665 | if(len > 0) mwSession_recv(session, buf, len); | |
| 1666 | ||
| 1667 | return len; | |
| 1668 | } | |
| 1669 | ||
| 1670 | ||
| 15884 | 1671 | /** callback triggered from purple_input_add, watches the socked for |
| 10977 | 1672 | available data to be processed by the session */ |
| 15884 | 1673 | static void read_cb(gpointer data, gint source, PurpleInputCondition cond) { |
| 1674 | struct mwPurplePluginData *pd = data; | |
| 10977 | 1675 | int ret = 0, err = 0; |
| 1676 | ||
| 1677 | g_return_if_fail(pd != NULL); | |
|
13206
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
1678 | |
|
11133
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
1679 | ret = read_recv(pd->session, pd->socket); |
| 10977 | 1680 | |
| 1681 | /* normal operation ends here */ | |
| 1682 | if(ret > 0) return; | |
| 1683 | ||
|
11133
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
1684 | /* fetch the global error value */ |
| 10977 | 1685 | err = errno; |
| 1686 | ||
| 14754 | 1687 | /* read problem occurred if we're here, so we'll need to take care of |
| 10977 | 1688 | it and clean up internal state */ |
| 1689 | ||
| 1690 | if(pd->socket) { | |
| 1691 | close(pd->socket); | |
| 1692 | pd->socket = 0; | |
| 1693 | } | |
| 1694 | ||
| 1695 | if(pd->gc->inpa) { | |
| 15884 | 1696 | purple_input_remove(pd->gc->inpa); |
| 10977 | 1697 | pd->gc->inpa = 0; |
| 1698 | } | |
| 1699 | ||
| 1700 | if(! ret) { | |
| 1701 | DEBUG_INFO("connection reset\n"); | |
| 15884 | 1702 | purple_connection_error(pd->gc, _("Connection reset")); |
| 10977 | 1703 | |
| 1704 | } else if(ret < 0) { | |
| 1705 | char *msg = strerror(err); | |
|
11133
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
1706 | |
| 10977 | 1707 | DEBUG_INFO("error in read callback: %s\n", msg); |
| 1708 | ||
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1709 | msg = g_strdup_printf(_("Error reading from socket: %s"), msg); |
| 15884 | 1710 | purple_connection_error(pd->gc, msg); |
| 10977 | 1711 | g_free(msg); |
| 1712 | } | |
| 1713 | } | |
| 1714 | ||
| 1715 | ||
| 15884 | 1716 | /** Callback passed to purple_proxy_connect when an account is logged |
| 10977 | 1717 | in, and if the session logging in receives a redirect message */ |
|
14178
d12b287697c9
[gaim-migrate @ 16750]
Mark Doliner <markdoliner@pidgin.im>
parents:
14170
diff
changeset
|
1718 | static void connect_cb(gpointer data, gint source, const gchar *error_message) { |
| 10977 | 1719 | |
| 15884 | 1720 | struct mwPurplePluginData *pd = data; |
| 1721 | PurpleConnection *gc = pd->gc; | |
| 10977 | 1722 | |
| 1723 | if(source < 0) { | |
| 1724 | /* connection failed */ | |
| 1725 | ||
| 1726 | if(pd->socket) { | |
| 1727 | /* this is a redirect connect, force login on existing socket */ | |
| 1728 | mwSession_forceLogin(pd->session); | |
| 1729 | ||
| 1730 | } else { | |
| 1731 | /* this is a regular connect, error out */ | |
| 15884 | 1732 | purple_connection_error(pd->gc, _("Unable to connect to host")); |
| 10977 | 1733 | } |
| 1734 | ||
| 1735 | return; | |
| 1736 | } | |
| 1737 | ||
| 1738 | if(pd->socket) { | |
| 1739 | /* stop any existing login attempt */ | |
| 1740 | mwSession_stop(pd->session, ERR_SUCCESS); | |
| 1741 | } | |
| 1742 | ||
| 1743 | pd->socket = source; | |
| 15884 | 1744 | gc->inpa = purple_input_add(source, PURPLE_INPUT_READ, |
|
13206
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
1745 | read_cb, pd); |
| 10977 | 1746 | |
| 1747 | mwSession_start(pd->session); | |
| 1748 | } | |
| 1749 | ||
| 1750 | ||
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1751 | static void mw_session_announce(struct mwSession *s, |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1752 | struct mwLoginInfo *from, |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1753 | gboolean may_reply, |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1754 | const char *text) { |
| 15884 | 1755 | struct mwPurplePluginData *pd; |
| 1756 | PurpleAccount *acct; | |
| 1757 | PurpleConversation *conv; | |
| 1758 | PurpleBuddy *buddy; | |
|
12263
5f0ddc426a58
[gaim-migrate @ 14565]
Christopher O'Brien <siege@pidgin.im>
parents:
12216
diff
changeset
|
1759 | char *who = from->user_id; |
|
5f0ddc426a58
[gaim-migrate @ 14565]
Christopher O'Brien <siege@pidgin.im>
parents:
12216
diff
changeset
|
1760 | char *msg; |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1761 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1762 | pd = mwSession_getClientData(s); |
| 15884 | 1763 | acct = purple_connection_get_account(pd->gc); |
| 1764 | conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, who, acct); | |
| 1765 | if(! conv) conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, acct, who); | |
| 1766 | ||
| 1767 | buddy = purple_find_buddy(acct, who); | |
| 1768 | if(buddy) who = (char *) purple_buddy_get_contact_alias(buddy); | |
|
12263
5f0ddc426a58
[gaim-migrate @ 14565]
Christopher O'Brien <siege@pidgin.im>
parents:
12216
diff
changeset
|
1769 | |
|
5f0ddc426a58
[gaim-migrate @ 14565]
Christopher O'Brien <siege@pidgin.im>
parents:
12216
diff
changeset
|
1770 | who = g_strdup_printf(_("Announcement from %s"), who); |
| 15884 | 1771 | msg = purple_markup_linkify(text); |
| 1772 | ||
| 1773 | purple_conversation_write(conv, who, msg, PURPLE_MESSAGE_RECV, time(NULL)); | |
|
12263
5f0ddc426a58
[gaim-migrate @ 14565]
Christopher O'Brien <siege@pidgin.im>
parents:
12216
diff
changeset
|
1774 | g_free(who); |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
1775 | g_free(msg); |
| 10977 | 1776 | } |
| 1777 | ||
| 1778 | ||
| 1779 | static struct mwSessionHandler mw_session_handler = { | |
|
17153
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
1780 | mw_session_io_write, |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
1781 | mw_session_io_close, |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
1782 | mw_session_clear, |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
1783 | mw_session_stateChange, |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
1784 | mw_session_setPrivacyInfo, |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
1785 | mw_session_setUserStatus, |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
1786 | mw_session_admin, |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
1787 | mw_session_announce, |
| 10977 | 1788 | }; |
| 1789 | ||
| 1790 | ||
| 1791 | static void mw_aware_on_attrib(struct mwServiceAware *srvc, | |
| 1792 | struct mwAwareAttribute *attrib) { | |
| 1793 | ||
| 1794 | ; /** @todo handle server attributes. There may be some stuff we | |
| 1795 | actually want to look for, but I'm not aware of anything right | |
| 1796 | now.*/ | |
| 1797 | } | |
| 1798 | ||
| 1799 | ||
| 1800 | static void mw_aware_clear(struct mwServiceAware *srvc) { | |
| 1801 | ; /* nothing for now */ | |
| 1802 | } | |
| 1803 | ||
| 1804 | ||
| 1805 | static struct mwAwareHandler mw_aware_handler = { | |
|
17153
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
1806 | mw_aware_on_attrib, |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
1807 | mw_aware_clear, |
| 10977 | 1808 | }; |
| 1809 | ||
| 1810 | ||
| 1811 | static struct mwServiceAware *mw_srvc_aware_new(struct mwSession *s) { | |
| 1812 | struct mwServiceAware *srvc; | |
| 1813 | srvc = mwServiceAware_new(s, &mw_aware_handler); | |
| 1814 | return srvc; | |
| 1815 | }; | |
| 1816 | ||
| 1817 | ||
| 1818 | static void mw_conf_invited(struct mwConference *conf, | |
| 1819 | struct mwLoginInfo *inviter, | |
| 1820 | const char *invitation) { | |
| 1821 | ||
| 1822 | struct mwServiceConference *srvc; | |
| 1823 | struct mwSession *session; | |
| 15884 | 1824 | struct mwPurplePluginData *pd; |
| 1825 | PurpleConnection *gc; | |
| 10977 | 1826 | |
| 1827 | char *c_inviter, *c_name, *c_topic, *c_invitation; | |
| 1828 | GHashTable *ht; | |
| 1829 | ||
| 1830 | srvc = mwConference_getService(conf); | |
| 1831 | session = mwService_getSession(MW_SERVICE(srvc)); | |
| 1832 | pd = mwSession_getClientData(session); | |
| 1833 | gc = pd->gc; | |
| 1834 | ||
| 1835 | ht = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, g_free); | |
| 1836 | ||
| 1837 | c_inviter = g_strdup(inviter->user_id); | |
| 1838 | g_hash_table_insert(ht, CHAT_KEY_CREATOR, c_inviter); | |
| 1839 | ||
| 1840 | c_name = g_strdup(mwConference_getName(conf)); | |
| 1841 | g_hash_table_insert(ht, CHAT_KEY_NAME, c_name); | |
| 1842 | ||
| 1843 | c_topic = g_strdup(mwConference_getTitle(conf)); | |
| 1844 | g_hash_table_insert(ht, CHAT_KEY_TOPIC, c_topic); | |
| 1845 | ||
| 1846 | c_invitation = g_strdup(invitation); | |
| 1847 | g_hash_table_insert(ht, CHAT_KEY_INVITE, c_invitation); | |
| 1848 | ||
| 1849 | DEBUG_INFO("received invitation from '%s' to join ('%s','%s'): '%s'\n", | |
| 1850 | NSTR(c_inviter), NSTR(c_name), | |
| 1851 | NSTR(c_topic), NSTR(c_invitation)); | |
| 1852 | ||
|
12742
88e624a344cb
[gaim-migrate @ 15089]
Christopher O'Brien <siege@pidgin.im>
parents:
12735
diff
changeset
|
1853 | if(! c_topic) c_topic = "(no title)"; |
|
88e624a344cb
[gaim-migrate @ 15089]
Christopher O'Brien <siege@pidgin.im>
parents:
12735
diff
changeset
|
1854 | if(! c_invitation) c_invitation = "(no message)"; |
| 10977 | 1855 | serv_got_chat_invite(gc, c_topic, c_inviter, c_invitation, ht); |
| 1856 | } | |
| 1857 | ||
| 1858 | ||
| 15884 | 1859 | /* The following mess helps us relate a mwConference to a PurpleConvChat |
| 10977 | 1860 | in the various forms by which either may be indicated */ |
| 1861 | ||
| 1862 | #define CONF_TO_ID(conf) (GPOINTER_TO_INT(conf)) | |
| 1863 | #define ID_TO_CONF(pd, id) (conf_find_by_id((pd), (id))) | |
| 1864 | ||
| 15884 | 1865 | #define CHAT_TO_ID(chat) (purple_conv_chat_get_id(chat)) |
| 1866 | #define ID_TO_CHAT(id) (purple_find_chat(id)) | |
| 10977 | 1867 | |
|
11133
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
1868 | #define CHAT_TO_CONF(pd, chat) (ID_TO_CONF((pd), CHAT_TO_ID(chat))) |
|
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
1869 | #define CONF_TO_CHAT(conf) (ID_TO_CHAT(CONF_TO_ID(conf))) |
| 10977 | 1870 | |
| 1871 | ||
| 1872 | static struct mwConference * | |
| 15884 | 1873 | conf_find_by_id(struct mwPurplePluginData *pd, int id) { |
| 10977 | 1874 | |
| 1875 | struct mwServiceConference *srvc = pd->srvc_conf; | |
| 1876 | struct mwConference *conf = NULL; | |
| 1877 | GList *l, *ll; | |
| 1878 | ||
| 1879 | ll = mwServiceConference_getConferences(srvc); | |
| 1880 | for(l = ll; l; l = l->next) { | |
| 1881 | struct mwConference *c = l->data; | |
| 15884 | 1882 | PurpleConvChat *h = mwConference_getClientData(c); |
| 10977 | 1883 | |
| 1884 | if(CHAT_TO_ID(h) == id) { | |
| 1885 | conf = c; | |
| 1886 | break; | |
| 1887 | } | |
| 1888 | } | |
| 1889 | g_list_free(ll); | |
| 1890 | ||
| 1891 | return conf; | |
| 1892 | } | |
| 1893 | ||
| 1894 | ||
| 1895 | static void mw_conf_opened(struct mwConference *conf, GList *members) { | |
| 1896 | struct mwServiceConference *srvc; | |
| 1897 | struct mwSession *session; | |
| 15884 | 1898 | struct mwPurplePluginData *pd; |
| 1899 | PurpleConnection *gc; | |
| 1900 | PurpleConversation *g_conf; | |
| 10977 | 1901 | |
| 1902 | const char *n = mwConference_getName(conf); | |
|
12742
88e624a344cb
[gaim-migrate @ 15089]
Christopher O'Brien <siege@pidgin.im>
parents:
12735
diff
changeset
|
1903 | const char *t = mwConference_getTitle(conf); |
| 10977 | 1904 | |
| 1905 | DEBUG_INFO("conf %s opened, %u initial members\n", | |
| 1906 | NSTR(n), g_list_length(members)); | |
| 1907 | ||
| 1908 | srvc = mwConference_getService(conf); | |
| 1909 | session = mwService_getSession(MW_SERVICE(srvc)); | |
| 1910 | pd = mwSession_getClientData(session); | |
| 1911 | gc = pd->gc; | |
| 1912 | ||
|
12742
88e624a344cb
[gaim-migrate @ 15089]
Christopher O'Brien <siege@pidgin.im>
parents:
12735
diff
changeset
|
1913 | if(! t) t = "(no title)"; |
|
88e624a344cb
[gaim-migrate @ 15089]
Christopher O'Brien <siege@pidgin.im>
parents:
12735
diff
changeset
|
1914 | g_conf = serv_got_joined_chat(gc, CONF_TO_ID(conf), t); |
| 10977 | 1915 | |
| 15884 | 1916 | mwConference_setClientData(conf, PURPLE_CONV_CHAT(g_conf), NULL); |
| 10977 | 1917 | |
| 1918 | for(; members; members = members->next) { | |
| 1919 | struct mwLoginInfo *peer = members->data; | |
| 15884 | 1920 | purple_conv_chat_add_user(PURPLE_CONV_CHAT(g_conf), peer->user_id, |
| 1921 | NULL, PURPLE_CBFLAGS_NONE, FALSE); | |
| 10977 | 1922 | } |
| 1923 | } | |
| 1924 | ||
| 1925 | ||
| 1926 | static void mw_conf_closed(struct mwConference *conf, guint32 reason) { | |
| 1927 | struct mwServiceConference *srvc; | |
| 1928 | struct mwSession *session; | |
| 15884 | 1929 | struct mwPurplePluginData *pd; |
| 1930 | PurpleConnection *gc; | |
| 10977 | 1931 | |
| 1932 | const char *n = mwConference_getName(conf); | |
| 1933 | char *msg = mwError(reason); | |
| 1934 | ||
| 1935 | DEBUG_INFO("conf %s closed, 0x%08x\n", NSTR(n), reason); | |
| 1936 | ||
| 1937 | srvc = mwConference_getService(conf); | |
| 1938 | session = mwService_getSession(MW_SERVICE(srvc)); | |
| 1939 | pd = mwSession_getClientData(session); | |
| 1940 | gc = pd->gc; | |
| 1941 | ||
| 1942 | serv_got_chat_left(gc, CONF_TO_ID(conf)); | |
| 1943 | ||
| 15884 | 1944 | purple_notify_error(gc, _("Conference Closed"), NULL, msg); |
| 10977 | 1945 | g_free(msg); |
| 1946 | } | |
| 1947 | ||
| 1948 | ||
| 1949 | static void mw_conf_peer_joined(struct mwConference *conf, | |
| 1950 | struct mwLoginInfo *peer) { | |
| 1951 | ||
| 1952 | struct mwServiceConference *srvc; | |
| 1953 | struct mwSession *session; | |
| 15884 | 1954 | struct mwPurplePluginData *pd; |
| 1955 | PurpleConnection *gc; | |
| 1956 | PurpleConvChat *g_conf; | |
| 10977 | 1957 | |
| 1958 | const char *n = mwConference_getName(conf); | |
| 1959 | ||
| 1960 | DEBUG_INFO("%s joined conf %s\n", NSTR(peer->user_id), NSTR(n)); | |
| 1961 | ||
| 1962 | srvc = mwConference_getService(conf); | |
| 1963 | session = mwService_getSession(MW_SERVICE(srvc)); | |
| 1964 | pd = mwSession_getClientData(session); | |
| 1965 | gc = pd->gc; | |
| 1966 | ||
| 1967 | g_conf = mwConference_getClientData(conf); | |
| 1968 | g_return_if_fail(g_conf != NULL); | |
| 1969 | ||
| 15884 | 1970 | purple_conv_chat_add_user(g_conf, peer->user_id, |
| 1971 | NULL, PURPLE_CBFLAGS_NONE, TRUE); | |
| 10977 | 1972 | } |
| 1973 | ||
| 1974 | ||
| 1975 | static void mw_conf_peer_parted(struct mwConference *conf, | |
| 1976 | struct mwLoginInfo *peer) { | |
| 1977 | ||
| 1978 | struct mwServiceConference *srvc; | |
| 1979 | struct mwSession *session; | |
| 15884 | 1980 | struct mwPurplePluginData *pd; |
| 1981 | PurpleConnection *gc; | |
| 1982 | PurpleConvChat *g_conf; | |
| 10977 | 1983 | |
| 1984 | const char *n = mwConference_getName(conf); | |
| 1985 | ||
| 1986 | DEBUG_INFO("%s left conf %s\n", NSTR(peer->user_id), NSTR(n)); | |
| 1987 | ||
| 1988 | srvc = mwConference_getService(conf); | |
| 1989 | session = mwService_getSession(MW_SERVICE(srvc)); | |
| 1990 | pd = mwSession_getClientData(session); | |
| 1991 | gc = pd->gc; | |
| 1992 | ||
| 1993 | g_conf = mwConference_getClientData(conf); | |
| 1994 | g_return_if_fail(g_conf != NULL); | |
| 1995 | ||
| 15884 | 1996 | purple_conv_chat_remove_user(g_conf, peer->user_id, NULL); |
| 10977 | 1997 | } |
| 1998 | ||
| 1999 | ||
| 2000 | static void mw_conf_text(struct mwConference *conf, | |
| 2001 | struct mwLoginInfo *who, const char *text) { | |
| 2002 | ||
| 2003 | struct mwServiceConference *srvc; | |
| 2004 | struct mwSession *session; | |
| 15884 | 2005 | struct mwPurplePluginData *pd; |
| 2006 | PurpleConnection *gc; | |
| 10977 | 2007 | char *esc; |
| 2008 | ||
|
12863
535f2e11db82
[gaim-migrate @ 15214]
Christopher O'Brien <siege@pidgin.im>
parents:
12830
diff
changeset
|
2009 | if(! text) return; |
|
535f2e11db82
[gaim-migrate @ 15214]
Christopher O'Brien <siege@pidgin.im>
parents:
12830
diff
changeset
|
2010 | |
| 10977 | 2011 | srvc = mwConference_getService(conf); |
| 2012 | session = mwService_getSession(MW_SERVICE(srvc)); | |
| 2013 | pd = mwSession_getClientData(session); | |
| 2014 | gc = pd->gc; | |
| 2015 | ||
|
12864
072fcb25d27b
[gaim-migrate @ 15215]
Christopher O'Brien <siege@pidgin.im>
parents:
12863
diff
changeset
|
2016 | esc = g_markup_escape_text(text, -1); |
| 10977 | 2017 | serv_got_chat_in(gc, CONF_TO_ID(conf), who->user_id, 0, esc, time(NULL)); |
| 2018 | g_free(esc); | |
| 2019 | } | |
| 2020 | ||
| 2021 | ||
| 2022 | static void mw_conf_typing(struct mwConference *conf, | |
| 2023 | struct mwLoginInfo *who, gboolean typing) { | |
| 2024 | ||
| 15884 | 2025 | /* purple really has no good way to expose this to the user. */ |
| 10977 | 2026 | |
| 2027 | const char *n = mwConference_getName(conf); | |
| 2028 | const char *w = who->user_id; | |
| 2029 | ||
| 2030 | if(typing) { | |
| 2031 | DEBUG_INFO("%s in conf %s: <typing>\n", NSTR(w), NSTR(n)); | |
| 2032 | ||
| 2033 | } else { | |
| 2034 | DEBUG_INFO("%s in conf %s: <stopped typing>\n", NSTR(w), NSTR(n)); | |
| 2035 | } | |
| 2036 | } | |
| 2037 | ||
| 2038 | ||
| 2039 | static void mw_conf_clear(struct mwServiceConference *srvc) { | |
| 2040 | ; | |
| 2041 | } | |
| 2042 | ||
| 2043 | ||
| 2044 | static struct mwConferenceHandler mw_conference_handler = { | |
|
17153
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
2045 | mw_conf_invited, |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
2046 | mw_conf_opened, |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
2047 | mw_conf_closed, |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
2048 | mw_conf_peer_joined, |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
2049 | mw_conf_peer_parted, |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
2050 | mw_conf_text, |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
2051 | mw_conf_typing, |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
2052 | mw_conf_clear, |
| 10977 | 2053 | }; |
| 2054 | ||
| 2055 | ||
| 2056 | static struct mwServiceConference *mw_srvc_conf_new(struct mwSession *s) { | |
| 2057 | struct mwServiceConference *srvc; | |
| 2058 | srvc = mwServiceConference_new(s, &mw_conference_handler); | |
| 2059 | return srvc; | |
| 2060 | } | |
| 2061 | ||
| 2062 | ||
|
13208
3e9365fcfd0e
[gaim-migrate @ 15571]
Christopher O'Brien <siege@pidgin.im>
parents:
13206
diff
changeset
|
2063 | /** size of an outgoing file transfer chunk */ |
|
3e9365fcfd0e
[gaim-migrate @ 15571]
Christopher O'Brien <siege@pidgin.im>
parents:
13206
diff
changeset
|
2064 | #define MW_FT_LEN (BUF_LONG * 2) |
|
3e9365fcfd0e
[gaim-migrate @ 15571]
Christopher O'Brien <siege@pidgin.im>
parents:
13206
diff
changeset
|
2065 | |
|
3e9365fcfd0e
[gaim-migrate @ 15571]
Christopher O'Brien <siege@pidgin.im>
parents:
13206
diff
changeset
|
2066 | |
| 15884 | 2067 | static void ft_incoming_cancel(PurpleXfer *xfer) { |
| 10977 | 2068 | /* incoming transfer rejected or canceled in-progress */ |
| 2069 | struct mwFileTransfer *ft = xfer->data; | |
| 2070 | if(ft) mwFileTransfer_reject(ft); | |
| 2071 | } | |
| 2072 | ||
| 2073 | ||
| 15884 | 2074 | static void ft_incoming_init(PurpleXfer *xfer) { |
| 10977 | 2075 | /* incoming transfer accepted */ |
| 2076 | ||
| 2077 | /* - accept the mwFileTransfer | |
| 2078 | - open/create the local FILE "wb" | |
| 2079 | - stick the FILE's fp in xfer->dest_fp | |
| 2080 | */ | |
| 2081 | ||
| 2082 | struct mwFileTransfer *ft; | |
| 2083 | FILE *fp; | |
| 2084 | ||
| 2085 | ft = xfer->data; | |
| 2086 | ||
| 2087 | fp = g_fopen(xfer->local_filename, "wb"); | |
| 2088 | if(! fp) { | |
| 2089 | mwFileTransfer_cancel(ft); | |
| 2090 | return; | |
| 2091 | } | |
| 2092 | ||
| 2093 | xfer->dest_fp = fp; | |
| 2094 | mwFileTransfer_accept(ft); | |
| 2095 | } | |
| 2096 | ||
| 2097 | ||
| 2098 | static void mw_ft_offered(struct mwFileTransfer *ft) { | |
| 2099 | /* | |
| 15884 | 2100 | - create a purple ft object |
| 10977 | 2101 | - offer it |
| 2102 | */ | |
| 2103 | ||
| 2104 | struct mwServiceFileTransfer *srvc; | |
| 2105 | struct mwSession *session; | |
| 15884 | 2106 | struct mwPurplePluginData *pd; |
| 2107 | PurpleConnection *gc; | |
| 2108 | PurpleAccount *acct; | |
| 10977 | 2109 | const char *who; |
| 15884 | 2110 | PurpleXfer *xfer; |
| 10977 | 2111 | |
| 2112 | /* @todo add some safety checks */ | |
| 2113 | srvc = mwFileTransfer_getService(ft); | |
| 2114 | session = mwService_getSession(MW_SERVICE(srvc)); | |
| 2115 | pd = mwSession_getClientData(session); | |
| 2116 | gc = pd->gc; | |
| 15884 | 2117 | acct = purple_connection_get_account(gc); |
| 10977 | 2118 | |
| 2119 | who = mwFileTransfer_getUser(ft)->user; | |
| 2120 | ||
| 2121 | DEBUG_INFO("file transfer %p offered\n", ft); | |
| 2122 | DEBUG_INFO(" from: %s\n", NSTR(who)); | |
| 2123 | DEBUG_INFO(" file: %s\n", NSTR(mwFileTransfer_getFileName(ft))); | |
| 2124 | DEBUG_INFO(" size: %u\n", mwFileTransfer_getFileSize(ft)); | |
| 2125 | DEBUG_INFO(" text: %s\n", NSTR(mwFileTransfer_getMessage(ft))); | |
| 2126 | ||
| 15884 | 2127 | xfer = purple_xfer_new(acct, PURPLE_XFER_RECEIVE, who); |
|
15345
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
15205
diff
changeset
|
2128 | if (xfer) |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
15205
diff
changeset
|
2129 | { |
| 15884 | 2130 | purple_xfer_ref(xfer); |
| 2131 | mwFileTransfer_setClientData(ft, xfer, (GDestroyNotify) purple_xfer_unref); | |
|
15345
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
15205
diff
changeset
|
2132 | xfer->data = ft; |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
15205
diff
changeset
|
2133 | |
| 15884 | 2134 | purple_xfer_set_init_fnc(xfer, ft_incoming_init); |
| 2135 | purple_xfer_set_cancel_recv_fnc(xfer, ft_incoming_cancel); | |
| 2136 | purple_xfer_set_request_denied_fnc(xfer, ft_incoming_cancel); | |
| 2137 | ||
| 2138 | purple_xfer_set_filename(xfer, mwFileTransfer_getFileName(ft)); | |
| 2139 | purple_xfer_set_size(xfer, mwFileTransfer_getFileSize(ft)); | |
| 2140 | purple_xfer_set_message(xfer, mwFileTransfer_getMessage(ft)); | |
| 2141 | ||
| 2142 | purple_xfer_request(xfer); | |
|
15345
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
15205
diff
changeset
|
2143 | } |
| 10977 | 2144 | } |
| 2145 | ||
| 2146 | ||
| 2147 | static void ft_send(struct mwFileTransfer *ft, FILE *fp) { | |
|
13208
3e9365fcfd0e
[gaim-migrate @ 15571]
Christopher O'Brien <siege@pidgin.im>
parents:
13206
diff
changeset
|
2148 | guchar buf[MW_FT_LEN]; |
|
3e9365fcfd0e
[gaim-migrate @ 15571]
Christopher O'Brien <siege@pidgin.im>
parents:
13206
diff
changeset
|
2149 | struct mwOpaque o = { .data = buf, .len = MW_FT_LEN }; |
| 10977 | 2150 | guint32 rem; |
| 15884 | 2151 | PurpleXfer *xfer; |
| 10977 | 2152 | |
| 2153 | xfer = mwFileTransfer_getClientData(ft); | |
| 2154 | ||
| 2155 | rem = mwFileTransfer_getRemaining(ft); | |
|
13208
3e9365fcfd0e
[gaim-migrate @ 15571]
Christopher O'Brien <siege@pidgin.im>
parents:
13206
diff
changeset
|
2156 | if(rem < MW_FT_LEN) o.len = rem; |
| 10977 | 2157 | |
| 2158 | if(fread(buf, (size_t) o.len, 1, fp)) { | |
| 2159 | ||
|
13208
3e9365fcfd0e
[gaim-migrate @ 15571]
Christopher O'Brien <siege@pidgin.im>
parents:
13206
diff
changeset
|
2160 | /* calculate progress and display it */ |
| 10977 | 2161 | xfer->bytes_sent += o.len; |
| 2162 | xfer->bytes_remaining -= o.len; | |
| 15884 | 2163 | purple_xfer_update_progress(xfer); |
|
13208
3e9365fcfd0e
[gaim-migrate @ 15571]
Christopher O'Brien <siege@pidgin.im>
parents:
13206
diff
changeset
|
2164 | |
| 10977 | 2165 | mwFileTransfer_send(ft, &o); |
| 2166 | ||
| 2167 | } else { | |
| 2168 | int err = errno; | |
|
13208
3e9365fcfd0e
[gaim-migrate @ 15571]
Christopher O'Brien <siege@pidgin.im>
parents:
13206
diff
changeset
|
2169 | DEBUG_WARN("problem reading from file %s: %s\n", |
| 10977 | 2170 | NSTR(mwFileTransfer_getFileName(ft)), strerror(err)); |
| 2171 | ||
| 2172 | mwFileTransfer_cancel(ft); | |
| 2173 | } | |
| 2174 | } | |
| 2175 | ||
| 2176 | ||
| 2177 | static void mw_ft_opened(struct mwFileTransfer *ft) { | |
| 2178 | /* | |
| 15884 | 2179 | - get purple ft from client data in ft |
| 10977 | 2180 | - set the state to active |
| 2181 | */ | |
| 2182 | ||
| 15884 | 2183 | PurpleXfer *xfer; |
| 10977 | 2184 | |
| 2185 | xfer = mwFileTransfer_getClientData(ft); | |
| 2186 | ||
| 2187 | if(! xfer) { | |
| 2188 | mwFileTransfer_cancel(ft); | |
| 2189 | mwFileTransfer_free(ft); | |
| 2190 | g_return_if_reached(); | |
| 2191 | } | |
| 2192 | ||
| 15884 | 2193 | if(purple_xfer_get_type(xfer) == PURPLE_XFER_SEND) { |
| 10977 | 2194 | xfer->dest_fp = g_fopen(xfer->local_filename, "rb"); |
|
13208
3e9365fcfd0e
[gaim-migrate @ 15571]
Christopher O'Brien <siege@pidgin.im>
parents:
13206
diff
changeset
|
2195 | ft_send(ft, xfer->dest_fp); |
| 10977 | 2196 | } |
| 2197 | } | |
| 2198 | ||
| 2199 | ||
| 2200 | static void mw_ft_closed(struct mwFileTransfer *ft, guint32 code) { | |
| 2201 | /* | |
| 15884 | 2202 | - get purple ft from client data in ft |
| 10977 | 2203 | - indicate rejection/cancelation/completion |
| 2204 | - free the file transfer itself | |
| 2205 | */ | |
| 2206 | ||
| 15884 | 2207 | PurpleXfer *xfer; |
| 10977 | 2208 | |
| 2209 | xfer = mwFileTransfer_getClientData(ft); | |
| 2210 | if(xfer) { | |
| 2211 | xfer->data = NULL; | |
| 2212 | ||
|
13208
3e9365fcfd0e
[gaim-migrate @ 15571]
Christopher O'Brien <siege@pidgin.im>
parents:
13206
diff
changeset
|
2213 | if(! mwFileTransfer_getRemaining(ft)) { |
| 15884 | 2214 | purple_xfer_set_completed(xfer, TRUE); |
| 2215 | purple_xfer_end(xfer); | |
| 10977 | 2216 | |
| 2217 | } else if(mwFileTransfer_isCancelLocal(ft)) { | |
| 15884 | 2218 | /* calling purple_xfer_cancel_local is redundant, since that's |
| 10977 | 2219 | probably what triggered this function to be called */ |
| 2220 | ; | |
| 2221 | ||
| 2222 | } else if(mwFileTransfer_isCancelRemote(ft)) { | |
| 2223 | /* steal the reference for the xfer */ | |
| 2224 | mwFileTransfer_setClientData(ft, NULL, NULL); | |
| 15884 | 2225 | purple_xfer_cancel_remote(xfer); |
| 10977 | 2226 | |
| 2227 | /* drop the stolen reference */ | |
| 15884 | 2228 | purple_xfer_unref(xfer); |
| 10977 | 2229 | return; |
| 2230 | } | |
| 2231 | } | |
| 2232 | ||
| 2233 | mwFileTransfer_free(ft); | |
| 2234 | } | |
| 2235 | ||
| 2236 | ||
| 2237 | static void mw_ft_recv(struct mwFileTransfer *ft, | |
| 2238 | struct mwOpaque *data) { | |
| 2239 | /* | |
| 15884 | 2240 | - get purple ft from client data in ft |
| 10977 | 2241 | - update transfered percentage |
| 15884 | 2242 | - if done, destroy the ft, disassociate from purple ft |
| 10977 | 2243 | */ |
| 2244 | ||
| 15884 | 2245 | PurpleXfer *xfer; |
| 10977 | 2246 | FILE *fp; |
| 2247 | ||
| 2248 | xfer = mwFileTransfer_getClientData(ft); | |
| 2249 | g_return_if_fail(xfer != NULL); | |
| 2250 | ||
| 2251 | fp = xfer->dest_fp; | |
| 2252 | g_return_if_fail(fp != NULL); | |
| 2253 | ||
| 2254 | /* we must collect and save our precious data */ | |
| 2255 | fwrite(data->data, 1, data->len, fp); | |
| 2256 | ||
| 2257 | /* update the progress */ | |
| 2258 | xfer->bytes_sent += data->len; | |
| 2259 | xfer->bytes_remaining -= data->len; | |
| 15884 | 2260 | purple_xfer_update_progress(xfer); |
| 10977 | 2261 | |
| 2262 | /* let the other side know we got it, and to send some more */ | |
| 2263 | mwFileTransfer_ack(ft); | |
| 2264 | } | |
| 2265 | ||
| 2266 | ||
| 2267 | static void mw_ft_ack(struct mwFileTransfer *ft) { | |
| 15884 | 2268 | PurpleXfer *xfer; |
| 10977 | 2269 | |
| 2270 | xfer = mwFileTransfer_getClientData(ft); | |
| 2271 | g_return_if_fail(xfer != NULL); | |
| 2272 | g_return_if_fail(xfer->watcher == 0); | |
| 2273 | ||
|
13208
3e9365fcfd0e
[gaim-migrate @ 15571]
Christopher O'Brien <siege@pidgin.im>
parents:
13206
diff
changeset
|
2274 | if(! mwFileTransfer_getRemaining(ft)) { |
| 15884 | 2275 | purple_xfer_set_completed(xfer, TRUE); |
| 2276 | purple_xfer_end(xfer); | |
|
13208
3e9365fcfd0e
[gaim-migrate @ 15571]
Christopher O'Brien <siege@pidgin.im>
parents:
13206
diff
changeset
|
2277 | |
|
3e9365fcfd0e
[gaim-migrate @ 15571]
Christopher O'Brien <siege@pidgin.im>
parents:
13206
diff
changeset
|
2278 | } else if(mwFileTransfer_isOpen(ft)) { |
|
3e9365fcfd0e
[gaim-migrate @ 15571]
Christopher O'Brien <siege@pidgin.im>
parents:
13206
diff
changeset
|
2279 | ft_send(ft, xfer->dest_fp); |
|
3e9365fcfd0e
[gaim-migrate @ 15571]
Christopher O'Brien <siege@pidgin.im>
parents:
13206
diff
changeset
|
2280 | } |
| 10977 | 2281 | } |
| 2282 | ||
| 2283 | ||
| 2284 | static void mw_ft_clear(struct mwServiceFileTransfer *srvc) { | |
| 2285 | ; | |
| 2286 | } | |
| 2287 | ||
| 2288 | ||
| 2289 | static struct mwFileTransferHandler mw_ft_handler = { | |
|
17153
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
2290 | mw_ft_offered, |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
2291 | mw_ft_opened, |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
2292 | mw_ft_closed, |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
2293 | mw_ft_recv, |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
2294 | mw_ft_ack, |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
2295 | mw_ft_clear, |
| 10977 | 2296 | }; |
| 2297 | ||
| 2298 | ||
| 2299 | static struct mwServiceFileTransfer *mw_srvc_ft_new(struct mwSession *s) { | |
| 2300 | struct mwServiceFileTransfer *srvc; | |
| 2301 | GHashTable *ft_map; | |
| 2302 | ||
| 2303 | ft_map = g_hash_table_new(g_direct_hash, g_direct_equal); | |
| 2304 | ||
| 2305 | srvc = mwServiceFileTransfer_new(s, &mw_ft_handler); | |
| 2306 | mwService_setClientData(MW_SERVICE(srvc), ft_map, | |
| 2307 | (GDestroyNotify) g_hash_table_destroy); | |
| 2308 | ||
| 2309 | return srvc; | |
| 2310 | } | |
| 2311 | ||
| 2312 | ||
| 2313 | static void convo_data_free(struct convo_data *cd) { | |
| 2314 | GList *l; | |
| 2315 | ||
| 2316 | /* clean the queue */ | |
| 2317 | for(l = cd->queue; l; l = g_list_delete_link(l, l)) { | |
| 2318 | struct convo_msg *m = l->data; | |
| 2319 | if(m->clear) m->clear(m->data); | |
| 2320 | g_free(m); | |
| 2321 | } | |
| 2322 | ||
| 2323 | g_free(cd); | |
| 2324 | } | |
| 2325 | ||
| 2326 | ||
| 2327 | /** allocates a convo_data structure and associates it with the | |
| 2328 | conversation in the client data slot */ | |
| 2329 | static void convo_data_new(struct mwConversation *conv) { | |
| 2330 | struct convo_data *cd; | |
| 2331 | ||
| 2332 | g_return_if_fail(conv != NULL); | |
| 2333 | ||
| 2334 | if(mwConversation_getClientData(conv)) | |
| 2335 | return; | |
| 2336 | ||
| 2337 | cd = g_new0(struct convo_data, 1); | |
| 2338 | cd->conv = conv; | |
| 2339 | ||
| 2340 | mwConversation_setClientData(conv, cd, (GDestroyNotify) convo_data_free); | |
| 2341 | } | |
| 2342 | ||
| 2343 | ||
| 15884 | 2344 | static PurpleConversation *convo_get_gconv(struct mwConversation *conv) { |
| 10977 | 2345 | struct mwServiceIm *srvc; |
| 2346 | struct mwSession *session; | |
| 15884 | 2347 | struct mwPurplePluginData *pd; |
| 2348 | PurpleConnection *gc; | |
| 2349 | PurpleAccount *acct; | |
| 10977 | 2350 | |
| 2351 | struct mwIdBlock *idb; | |
| 2352 | ||
| 2353 | srvc = mwConversation_getService(conv); | |
| 2354 | session = mwService_getSession(MW_SERVICE(srvc)); | |
| 2355 | pd = mwSession_getClientData(session); | |
| 2356 | gc = pd->gc; | |
| 15884 | 2357 | acct = purple_connection_get_account(gc); |
| 10977 | 2358 | |
| 2359 | idb = mwConversation_getTarget(conv); | |
| 2360 | ||
| 15884 | 2361 | return purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2362 | idb->user, acct); |
| 10977 | 2363 | } |
| 2364 | ||
| 2365 | ||
| 2366 | static void convo_queue(struct mwConversation *conv, | |
| 2367 | enum mwImSendType type, gconstpointer data) { | |
| 2368 | ||
| 2369 | struct convo_data *cd; | |
| 2370 | struct convo_msg *m; | |
| 2371 | ||
| 2372 | convo_data_new(conv); | |
| 2373 | cd = mwConversation_getClientData(conv); | |
| 2374 | ||
| 2375 | m = g_new0(struct convo_msg, 1); | |
| 2376 | m->type = type; | |
| 2377 | ||
| 2378 | switch(type) { | |
| 2379 | case mwImSend_PLAIN: | |
| 2380 | m->data = g_strdup(data); | |
| 2381 | m->clear = g_free; | |
| 2382 | break; | |
| 2383 | ||
| 2384 | case mwImSend_TYPING: | |
| 2385 | default: | |
| 2386 | m->data = (gpointer) data; | |
| 2387 | m->clear = NULL; | |
| 2388 | } | |
| 2389 | ||
| 2390 | cd->queue = g_list_append(cd->queue, m); | |
| 2391 | } | |
| 2392 | ||
| 2393 | ||
| 2394 | /* Does what it takes to get an error displayed for a conversation */ | |
| 2395 | static void convo_error(struct mwConversation *conv, guint32 err) { | |
| 15884 | 2396 | PurpleConversation *gconv; |
| 10977 | 2397 | char *tmp, *text; |
| 2398 | struct mwIdBlock *idb; | |
| 2399 | ||
| 2400 | idb = mwConversation_getTarget(conv); | |
| 2401 | ||
| 2402 | tmp = mwError(err); | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2403 | text = g_strconcat(_("Unable to send message: "), tmp, NULL); |
| 10977 | 2404 | |
| 2405 | gconv = convo_get_gconv(conv); | |
| 15884 | 2406 | if(gconv && !purple_conv_present_error(idb->user, gconv->account, text)) { |
| 10977 | 2407 | |
| 2408 | g_free(text); | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2409 | text = g_strdup_printf(_("Unable to send message to %s:"), |
| 10977 | 2410 | (idb->user)? idb->user: "(unknown)"); |
| 15884 | 2411 | purple_notify_error(purple_account_get_connection(gconv->account), |
| 10977 | 2412 | NULL, text, tmp); |
| 2413 | } | |
| 2414 | ||
| 2415 | g_free(tmp); | |
| 2416 | g_free(text); | |
| 2417 | } | |
| 2418 | ||
| 2419 | ||
| 2420 | static void convo_queue_send(struct mwConversation *conv) { | |
| 2421 | struct convo_data *cd; | |
| 2422 | GList *l; | |
| 2423 | ||
| 2424 | cd = mwConversation_getClientData(conv); | |
| 2425 | ||
| 2426 | for(l = cd->queue; l; l = g_list_delete_link(l, l)) { | |
| 2427 | struct convo_msg *m = l->data; | |
| 2428 | ||
| 2429 | mwConversation_send(conv, m->type, m->data); | |
| 2430 | ||
| 2431 | if(m->clear) m->clear(m->data); | |
| 2432 | g_free(m); | |
| 2433 | } | |
| 2434 | ||
| 2435 | cd->queue = NULL; | |
| 2436 | } | |
| 2437 | ||
| 2438 | ||
| 15884 | 2439 | /** called when a mw conversation leaves a purple conversation to |
| 2440 | inform the purple conversation that it's unsafe to offer any *cool* | |
| 10977 | 2441 | features. */ |
| 2442 | static void convo_nofeatures(struct mwConversation *conv) { | |
| 15884 | 2443 | PurpleConversation *gconv; |
| 2444 | PurpleConnection *gc; | |
| 10977 | 2445 | |
| 2446 | gconv = convo_get_gconv(conv); | |
| 2447 | if(! gconv) return; | |
| 2448 | ||
| 15884 | 2449 | gc = purple_conversation_get_gc(gconv); |
|
11133
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
2450 | if(! gc) return; |
|
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
2451 | |
| 15884 | 2452 | purple_conversation_set_features(gconv, gc->flags); |
| 2453 | } | |
| 2454 | ||
| 2455 | ||
| 2456 | /** called when a mw conversation and purple conversation come together, | |
| 2457 | to inform the purple conversation of what features to offer the | |
| 10977 | 2458 | user */ |
| 2459 | static void convo_features(struct mwConversation *conv) { | |
| 15884 | 2460 | PurpleConversation *gconv; |
| 2461 | PurpleConnectionFlags feat; | |
| 10977 | 2462 | |
| 2463 | gconv = convo_get_gconv(conv); | |
| 2464 | if(! gconv) return; | |
| 2465 | ||
| 15884 | 2466 | feat = purple_conversation_get_features(gconv); |
| 10977 | 2467 | |
| 2468 | if(mwConversation_isOpen(conv)) { | |
| 2469 | if(mwConversation_supports(conv, mwImSend_HTML)) { | |
| 15884 | 2470 | feat |= PURPLE_CONNECTION_HTML; |
| 10977 | 2471 | } else { |
| 15884 | 2472 | feat &= ~PURPLE_CONNECTION_HTML; |
| 10977 | 2473 | } |
| 2474 | ||
| 2475 | if(mwConversation_supports(conv, mwImSend_MIME)) { | |
| 15884 | 2476 | feat &= ~PURPLE_CONNECTION_NO_IMAGES; |
| 10977 | 2477 | } else { |
| 15884 | 2478 | feat |= PURPLE_CONNECTION_NO_IMAGES; |
| 10977 | 2479 | } |
| 2480 | ||
| 2481 | DEBUG_INFO("conversation features set to 0x%04x\n", feat); | |
| 15884 | 2482 | purple_conversation_set_features(gconv, feat); |
| 10977 | 2483 | |
| 2484 | } else { | |
| 2485 | convo_nofeatures(conv); | |
| 2486 | } | |
| 2487 | } | |
| 2488 | ||
| 2489 | ||
| 2490 | static void mw_conversation_opened(struct mwConversation *conv) { | |
| 2491 | struct mwServiceIm *srvc; | |
| 2492 | struct mwSession *session; | |
| 15884 | 2493 | struct mwPurplePluginData *pd; |
| 2494 | PurpleConnection *gc; | |
| 2495 | PurpleAccount *acct; | |
| 10977 | 2496 | |
| 2497 | struct convo_dat *cd; | |
| 2498 | ||
| 2499 | srvc = mwConversation_getService(conv); | |
| 2500 | session = mwService_getSession(MW_SERVICE(srvc)); | |
| 2501 | pd = mwSession_getClientData(session); | |
| 2502 | gc = pd->gc; | |
| 15884 | 2503 | acct = purple_connection_get_account(gc); |
| 10977 | 2504 | |
| 2505 | /* set up the queue */ | |
| 2506 | cd = mwConversation_getClientData(conv); | |
| 2507 | if(cd) { | |
| 2508 | convo_queue_send(conv); | |
| 2509 | ||
| 2510 | if(! convo_get_gconv(conv)) { | |
| 2511 | mwConversation_free(conv); | |
| 2512 | return; | |
| 2513 | } | |
| 2514 | ||
| 2515 | } else { | |
| 2516 | convo_data_new(conv); | |
| 2517 | } | |
| 2518 | ||
| 2519 | { /* record the client key for the buddy */ | |
| 15884 | 2520 | PurpleBuddy *buddy; |
| 10977 | 2521 | struct mwLoginInfo *info; |
| 2522 | info = mwConversation_getTargetInfo(conv); | |
| 2523 | ||
| 15884 | 2524 | buddy = purple_find_buddy(acct, info->user_id); |
| 10977 | 2525 | if(buddy) { |
| 15884 | 2526 | purple_blist_node_set_int((PurpleBlistNode *) buddy, |
| 10977 | 2527 | BUDDY_KEY_CLIENT, info->type); |
| 2528 | } | |
| 2529 | } | |
| 2530 | ||
| 2531 | convo_features(conv); | |
| 2532 | } | |
| 2533 | ||
| 2534 | ||
| 2535 | static void mw_conversation_closed(struct mwConversation *conv, | |
| 2536 | guint32 reason) { | |
| 2537 | ||
| 2538 | struct convo_data *cd; | |
| 2539 | ||
| 2540 | g_return_if_fail(conv != NULL); | |
| 2541 | ||
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2542 | /* if there's an error code and a non-typing message in the queue, |
|
11133
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
2543 | print an error message to the conversation */ |
| 10977 | 2544 | cd = mwConversation_getClientData(conv); |
| 2545 | if(reason && cd && cd->queue) { | |
|
11133
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
2546 | GList *l; |
|
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
2547 | for(l = cd->queue; l; l = l->next) { |
|
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
2548 | struct convo_msg *m = l->data; |
|
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
2549 | if(m->type != mwImSend_TYPING) { |
|
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
2550 | convo_error(conv, reason); |
|
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
2551 | break; |
|
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
2552 | } |
|
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
2553 | } |
| 10977 | 2554 | } |
| 2555 | ||
| 2556 | #if 0 | |
| 2557 | /* don't do this, to prevent the occasional weird sending of | |
| 2558 | formatted messages as plaintext when the other end closes the | |
| 2559 | conversation after we've begun composing the message */ | |
| 2560 | convo_nofeatures(conv); | |
| 2561 | #endif | |
| 2562 | ||
| 2563 | mwConversation_removeClientData(conv); | |
| 2564 | } | |
| 2565 | ||
| 2566 | ||
| 2567 | static void im_recv_text(struct mwConversation *conv, | |
| 15884 | 2568 | struct mwPurplePluginData *pd, |
| 10977 | 2569 | const char *msg) { |
| 2570 | ||
| 2571 | struct mwIdBlock *idb; | |
|
12524
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
2572 | char *txt, *esc; |
|
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
2573 | const char *t; |
| 10977 | 2574 | |
| 2575 | idb = mwConversation_getTarget(conv); | |
|
12524
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
2576 | |
| 15884 | 2577 | txt = purple_utf8_try_convert(msg); |
|
12524
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
2578 | t = txt? txt: msg; |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2579 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2580 | esc = g_markup_escape_text(t, -1); |
| 10977 | 2581 | serv_got_im(pd->gc, idb->user, esc, 0, time(NULL)); |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2582 | g_free(esc); |
| 10977 | 2583 | |
| 2584 | g_free(txt); | |
| 2585 | } | |
| 2586 | ||
| 2587 | ||
| 2588 | static void im_recv_typing(struct mwConversation *conv, | |
| 15884 | 2589 | struct mwPurplePluginData *pd, |
| 10977 | 2590 | gboolean typing) { |
| 2591 | ||
| 2592 | struct mwIdBlock *idb; | |
| 2593 | idb = mwConversation_getTarget(conv); | |
| 2594 | ||
| 2595 | serv_got_typing(pd->gc, idb->user, 0, | |
| 15884 | 2596 | typing? PURPLE_TYPING: PURPLE_NOT_TYPING); |
| 10977 | 2597 | } |
| 2598 | ||
| 2599 | ||
| 2600 | static void im_recv_html(struct mwConversation *conv, | |
| 15884 | 2601 | struct mwPurplePluginData *pd, |
| 10977 | 2602 | const char *msg) { |
| 2603 | struct mwIdBlock *idb; | |
|
12524
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
2604 | char *t1, *t2; |
|
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
2605 | const char *t; |
| 10977 | 2606 | |
| 2607 | idb = mwConversation_getTarget(conv); | |
|
12524
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
2608 | |
|
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
2609 | /* ensure we're receiving UTF8 */ |
| 15884 | 2610 | t1 = purple_utf8_try_convert(msg); |
|
12524
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
2611 | t = t1? t1: msg; |
|
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
2612 | |
|
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
2613 | /* convert entities to UTF8 so they'll log correctly */ |
| 15884 | 2614 | t2 = purple_utf8_ncr_decode(t); |
|
12524
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
2615 | t = t2? t2: t; |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2616 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2617 | serv_got_im(pd->gc, idb->user, t, 0, time(NULL)); |
| 10977 | 2618 | |
|
12524
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
2619 | g_free(t1); |
|
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
2620 | g_free(t2); |
| 10977 | 2621 | } |
| 2622 | ||
| 2623 | ||
| 2624 | static void im_recv_subj(struct mwConversation *conv, | |
| 15884 | 2625 | struct mwPurplePluginData *pd, |
| 10977 | 2626 | const char *subj) { |
| 2627 | ||
| 2628 | /** @todo somehow indicate receipt of a conversation subject. It | |
| 2629 | would also be nice if we added a /topic command for the | |
| 2630 | protocol */ | |
| 2631 | ; | |
| 2632 | } | |
| 2633 | ||
| 2634 | ||
| 2635 | /** generate "cid:908@20582notesbuddy" from "<908@20582notesbuddy>" */ | |
| 2636 | static char *make_cid(const char *cid) { | |
| 2637 | gsize n; | |
| 2638 | char *c, *d; | |
| 2639 | ||
| 2640 | g_return_val_if_fail(cid != NULL, NULL); | |
| 2641 | ||
| 2642 | n = strlen(cid); | |
| 2643 | g_return_val_if_fail(n > 2, NULL); | |
| 2644 | ||
| 2645 | c = g_strndup(cid+1, n-2); | |
| 2646 | d = g_strdup_printf("cid:%s", c); | |
| 2647 | ||
| 2648 | g_free(c); | |
| 2649 | return d; | |
| 2650 | } | |
| 2651 | ||
| 2652 | ||
| 2653 | static void im_recv_mime(struct mwConversation *conv, | |
| 15884 | 2654 | struct mwPurplePluginData *pd, |
| 10977 | 2655 | const char *data) { |
| 2656 | ||
| 2657 | GHashTable *img_by_cid; | |
| 2658 | GList *images; | |
| 2659 | ||
| 2660 | GString *str; | |
| 2661 | ||
| 15884 | 2662 | PurpleMimeDocument *doc; |
| 10977 | 2663 | const GList *parts; |
| 2664 | ||
| 2665 | img_by_cid = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); | |
| 2666 | images = NULL; | |
| 2667 | ||
| 2668 | /* don't want the contained string to ever be NULL */ | |
| 2669 | str = g_string_new(""); | |
| 2670 | ||
| 15884 | 2671 | doc = purple_mime_document_parse(data); |
| 10977 | 2672 | |
| 2673 | /* handle all the MIME parts */ | |
| 15884 | 2674 | parts = purple_mime_document_get_parts(doc); |
| 10977 | 2675 | for(; parts; parts = parts->next) { |
| 15884 | 2676 | PurpleMimePart *part = parts->data; |
| 10977 | 2677 | const char *type; |
| 2678 | ||
| 15884 | 2679 | type = purple_mime_part_get_field(part, "content-type"); |
| 10977 | 2680 | DEBUG_INFO("MIME part Content-Type: %s\n", NSTR(type)); |
| 2681 | ||
| 2682 | if(! type) { | |
| 2683 | ; /* feh */ | |
| 2684 | ||
| 15884 | 2685 | } else if(purple_str_has_prefix(type, "image")) { |
| 10977 | 2686 | /* put images into the image store */ |
| 2687 | ||
|
11183
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11133
diff
changeset
|
2688 | guchar *d_dat; |
| 10977 | 2689 | gsize d_len; |
| 2690 | char *cid; | |
| 2691 | int img; | |
| 2692 | ||
| 2693 | /* obtain and unencode the data */ | |
| 15884 | 2694 | purple_mime_part_get_data_decoded(part, &d_dat, &d_len); |
| 10977 | 2695 | |
| 2696 | /* look up the content id */ | |
| 15884 | 2697 | cid = (char *) purple_mime_part_get_field(part, "Content-ID"); |
| 10977 | 2698 | cid = make_cid(cid); |
| 2699 | ||
| 15884 | 2700 | /* add image to the purple image store */ |
|
16437
7ff7c3405ea2
Rework the buddy icon subsystem to use the imgstore subsystem, and modify the
Richard Laager <rlaager@pidgin.im>
parents:
16121
diff
changeset
|
2701 | img = purple_imgstore_add_with_id(d_dat, d_len, cid); |
| 10977 | 2702 | |
| 2703 | /* map the cid to the image store identifier */ | |
| 2704 | g_hash_table_insert(img_by_cid, cid, GINT_TO_POINTER(img)); | |
| 2705 | ||
| 2706 | /* recall the image for dereferencing later */ | |
| 2707 | images = g_list_append(images, GINT_TO_POINTER(img)); | |
| 2708 | ||
| 15884 | 2709 | } else if(purple_str_has_prefix(type, "text")) { |
| 10977 | 2710 | |
| 2711 | /* concatenate all the text parts together */ | |
|
11183
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11133
diff
changeset
|
2712 | guchar *data; |
| 10977 | 2713 | gsize len; |
| 2714 | ||
| 15884 | 2715 | purple_mime_part_get_data_decoded(part, &data, &len); |
|
12524
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
2716 | g_string_append(str, (const char *)data); |
|
11133
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
2717 | g_free(data); |
| 10977 | 2718 | } |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2719 | } |
| 10977 | 2720 | |
| 15884 | 2721 | purple_mime_document_free(doc); |
| 10977 | 2722 | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2723 | /* @todo should put this in its own function */ |
| 10977 | 2724 | { /* replace each IMG tag's SRC attribute with an ID attribute. This |
| 2725 | actually modifies the contents of str */ | |
| 2726 | GData *attribs; | |
| 2727 | char *start, *end; | |
| 2728 | char *tmp = str->str; | |
| 2729 | ||
| 15884 | 2730 | while(*tmp && purple_markup_find_tag("img", tmp, (const char **) &start, |
| 10977 | 2731 | (const char **) &end, &attribs)) { |
| 2732 | ||
| 2733 | char *alt, *align, *border, *src; | |
|
13580
5cf462f3bae1
[gaim-migrate @ 15961]
Christopher O'Brien <siege@pidgin.im>
parents:
13296
diff
changeset
|
2734 | int img = 0; |
| 10977 | 2735 | |
| 2736 | alt = g_datalist_get_data(&attribs, "alt"); | |
| 2737 | align = g_datalist_get_data(&attribs, "align"); | |
| 2738 | border = g_datalist_get_data(&attribs, "border"); | |
| 2739 | src = g_datalist_get_data(&attribs, "src"); | |
| 2740 | ||
|
13580
5cf462f3bae1
[gaim-migrate @ 15961]
Christopher O'Brien <siege@pidgin.im>
parents:
13296
diff
changeset
|
2741 | if(src) |
|
5cf462f3bae1
[gaim-migrate @ 15961]
Christopher O'Brien <siege@pidgin.im>
parents:
13296
diff
changeset
|
2742 | img = GPOINTER_TO_INT(g_hash_table_lookup(img_by_cid, src)); |
|
5cf462f3bae1
[gaim-migrate @ 15961]
Christopher O'Brien <siege@pidgin.im>
parents:
13296
diff
changeset
|
2743 | |
| 10977 | 2744 | if(img) { |
| 2745 | GString *atstr; | |
| 2746 | gsize len = (end - start); | |
| 2747 | gsize mov; | |
| 2748 | ||
| 2749 | atstr = g_string_new(""); | |
| 2750 | if(alt) g_string_append_printf(atstr, " alt=\"%s\"", alt); | |
| 2751 | if(align) g_string_append_printf(atstr, " align=\"%s\"", align); | |
| 2752 | if(border) g_string_append_printf(atstr, " border=\"%s\"", border); | |
| 2753 | ||
| 2754 | mov = g_snprintf(start, len, "<img%s id=\"%i\"", atstr->str, img); | |
| 2755 | while(mov < len) start[mov++] = ' '; | |
| 2756 | ||
| 2757 | g_string_free(atstr, TRUE); | |
| 2758 | } | |
| 2759 | ||
| 2760 | g_datalist_clear(&attribs); | |
| 2761 | tmp = end + 1; | |
| 2762 | } | |
| 2763 | } | |
| 2764 | ||
|
12524
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
2765 | im_recv_html(conv, pd, str->str); |
| 10977 | 2766 | |
| 2767 | g_string_free(str, TRUE); | |
| 2768 | ||
| 2769 | /* clean up the cid table */ | |
| 2770 | g_hash_table_destroy(img_by_cid); | |
| 2771 | ||
| 2772 | /* dereference all the imgages */ | |
| 2773 | while(images) { | |
|
16437
7ff7c3405ea2
Rework the buddy icon subsystem to use the imgstore subsystem, and modify the
Richard Laager <rlaager@pidgin.im>
parents:
16121
diff
changeset
|
2774 | purple_imgstore_unref_by_id(GPOINTER_TO_INT(images->data)); |
| 10977 | 2775 | images = g_list_delete_link(images, images); |
| 2776 | } | |
| 2777 | } | |
| 2778 | ||
| 2779 | ||
| 2780 | static void mw_conversation_recv(struct mwConversation *conv, | |
| 2781 | enum mwImSendType type, | |
| 2782 | gconstpointer msg) { | |
| 2783 | struct mwServiceIm *srvc; | |
| 2784 | struct mwSession *session; | |
| 15884 | 2785 | struct mwPurplePluginData *pd; |
| 10977 | 2786 | |
| 2787 | srvc = mwConversation_getService(conv); | |
| 2788 | session = mwService_getSession(MW_SERVICE(srvc)); | |
| 2789 | pd = mwSession_getClientData(session); | |
| 2790 | ||
| 2791 | switch(type) { | |
| 2792 | case mwImSend_PLAIN: | |
| 2793 | im_recv_text(conv, pd, msg); | |
| 2794 | break; | |
| 2795 | ||
| 2796 | case mwImSend_TYPING: | |
| 2797 | im_recv_typing(conv, pd, !! msg); | |
| 2798 | break; | |
| 2799 | ||
| 2800 | case mwImSend_HTML: | |
| 2801 | im_recv_html(conv, pd, msg); | |
| 2802 | break; | |
| 2803 | ||
| 2804 | case mwImSend_SUBJECT: | |
| 2805 | im_recv_subj(conv, pd, msg); | |
| 2806 | break; | |
| 2807 | ||
| 2808 | case mwImSend_MIME: | |
| 2809 | im_recv_mime(conv, pd, msg); | |
| 2810 | break; | |
| 2811 | ||
| 2812 | default: | |
| 2813 | DEBUG_INFO("conversation received strange type, 0x%04x\n", type); | |
| 2814 | ; /* erm... */ | |
| 2815 | } | |
| 2816 | } | |
| 2817 | ||
| 2818 | ||
| 2819 | static void mw_place_invite(struct mwConversation *conv, | |
| 2820 | const char *message, | |
| 2821 | const char *title, const char *name) { | |
| 2822 | struct mwServiceIm *srvc; | |
| 2823 | struct mwSession *session; | |
| 15884 | 2824 | struct mwPurplePluginData *pd; |
| 10977 | 2825 | |
| 2826 | struct mwIdBlock *idb; | |
| 2827 | GHashTable *ht; | |
| 2828 | ||
| 2829 | srvc = mwConversation_getService(conv); | |
| 2830 | session = mwService_getSession(MW_SERVICE(srvc)); | |
| 2831 | pd = mwSession_getClientData(session); | |
| 2832 | ||
| 2833 | idb = mwConversation_getTarget(conv); | |
| 2834 | ||
| 2835 | ht = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, g_free); | |
| 2836 | g_hash_table_insert(ht, CHAT_KEY_CREATOR, g_strdup(idb->user)); | |
| 2837 | g_hash_table_insert(ht, CHAT_KEY_NAME, g_strdup(name)); | |
| 2838 | g_hash_table_insert(ht, CHAT_KEY_TOPIC, g_strdup(title)); | |
| 2839 | g_hash_table_insert(ht, CHAT_KEY_INVITE, g_strdup(message)); | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2840 | g_hash_table_insert(ht, CHAT_KEY_IS_PLACE, g_strdup("")); /* ugh */ |
| 10977 | 2841 | |
|
12742
88e624a344cb
[gaim-migrate @ 15089]
Christopher O'Brien <siege@pidgin.im>
parents:
12735
diff
changeset
|
2842 | if(! title) title = "(no title)"; |
|
88e624a344cb
[gaim-migrate @ 15089]
Christopher O'Brien <siege@pidgin.im>
parents:
12735
diff
changeset
|
2843 | if(! message) message = "(no message)"; |
| 10977 | 2844 | serv_got_chat_invite(pd->gc, title, idb->user, message, ht); |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2845 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2846 | mwConversation_close(conv, ERR_SUCCESS); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2847 | mwConversation_free(conv); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2848 | } |
| 10977 | 2849 | |
| 2850 | ||
| 2851 | static void mw_im_clear(struct mwServiceIm *srvc) { | |
| 2852 | ; | |
| 2853 | } | |
| 2854 | ||
| 2855 | ||
| 2856 | static struct mwImHandler mw_im_handler = { | |
|
17153
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
2857 | mw_conversation_opened, |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
2858 | mw_conversation_closed, |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
2859 | mw_conversation_recv, |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
2860 | mw_place_invite, |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
2861 | mw_im_clear, |
| 10977 | 2862 | }; |
| 2863 | ||
| 2864 | ||
| 2865 | static struct mwServiceIm *mw_srvc_im_new(struct mwSession *s) { | |
| 2866 | struct mwServiceIm *srvc; | |
| 2867 | srvc = mwServiceIm_new(s, &mw_im_handler); | |
| 2868 | mwServiceIm_setClientType(srvc, mwImClient_NOTESBUDDY); | |
| 2869 | return srvc; | |
| 2870 | } | |
| 2871 | ||
| 2872 | ||
| 15884 | 2873 | /* The following helps us relate a mwPlace to a PurpleConvChat in the |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2874 | various forms by which either may be indicated. Uses some of |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2875 | the similar macros from the conference service above */ |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2876 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2877 | #define PLACE_TO_ID(place) (GPOINTER_TO_INT(place)) |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2878 | #define ID_TO_PLACE(pd, id) (place_find_by_id((pd), (id))) |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2879 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2880 | #define CHAT_TO_PLACE(pd, chat) (ID_TO_PLACE((pd), CHAT_TO_ID(chat))) |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2881 | #define PLACE_TO_CHAT(place) (ID_TO_CHAT(PLACE_TO_ID(place))) |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2882 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2883 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2884 | static struct mwPlace * |
| 15884 | 2885 | place_find_by_id(struct mwPurplePluginData *pd, int id) { |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2886 | struct mwServicePlace *srvc = pd->srvc_place; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2887 | struct mwPlace *place = NULL; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2888 | GList *l; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2889 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2890 | l = (GList *) mwServicePlace_getPlaces(srvc); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2891 | for(; l; l = l->next) { |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2892 | struct mwPlace *p = l->data; |
| 15884 | 2893 | PurpleConvChat *h = PURPLE_CONV_CHAT(mwPlace_getClientData(p)); |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2894 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2895 | if(CHAT_TO_ID(h) == id) { |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2896 | place = p; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2897 | break; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2898 | } |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2899 | } |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2900 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2901 | return place; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2902 | } |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2903 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2904 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2905 | static void mw_place_opened(struct mwPlace *place) { |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2906 | struct mwServicePlace *srvc; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2907 | struct mwSession *session; |
| 15884 | 2908 | struct mwPurplePluginData *pd; |
| 2909 | PurpleConnection *gc; | |
| 2910 | PurpleConversation *gconf; | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2911 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2912 | GList *members, *l; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2913 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2914 | const char *n = mwPlace_getName(place); |
|
12742
88e624a344cb
[gaim-migrate @ 15089]
Christopher O'Brien <siege@pidgin.im>
parents:
12735
diff
changeset
|
2915 | const char *t = mwPlace_getTitle(place); |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2916 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2917 | srvc = mwPlace_getService(place); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2918 | session = mwService_getSession(MW_SERVICE(srvc)); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2919 | pd = mwSession_getClientData(session); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2920 | gc = pd->gc; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2921 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2922 | members = mwPlace_getMembers(place); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2923 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2924 | DEBUG_INFO("place %s opened, %u initial members\n", |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2925 | NSTR(n), g_list_length(members)); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2926 | |
|
12742
88e624a344cb
[gaim-migrate @ 15089]
Christopher O'Brien <siege@pidgin.im>
parents:
12735
diff
changeset
|
2927 | if(! t) t = "(no title)"; |
|
88e624a344cb
[gaim-migrate @ 15089]
Christopher O'Brien <siege@pidgin.im>
parents:
12735
diff
changeset
|
2928 | gconf = serv_got_joined_chat(gc, PLACE_TO_ID(place), t); |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2929 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2930 | mwPlace_setClientData(place, gconf, NULL); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2931 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2932 | for(l = members; l; l = l->next) { |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2933 | struct mwIdBlock *idb = l->data; |
| 15884 | 2934 | purple_conv_chat_add_user(PURPLE_CONV_CHAT(gconf), idb->user, |
| 2935 | NULL, PURPLE_CBFLAGS_NONE, FALSE); | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2936 | } |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2937 | g_list_free(members); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2938 | } |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2939 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2940 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2941 | static void mw_place_closed(struct mwPlace *place, guint32 code) { |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2942 | struct mwServicePlace *srvc; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2943 | struct mwSession *session; |
| 15884 | 2944 | struct mwPurplePluginData *pd; |
| 2945 | PurpleConnection *gc; | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2946 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2947 | const char *n = mwPlace_getName(place); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2948 | char *msg = mwError(code); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2949 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2950 | DEBUG_INFO("place %s closed, 0x%08x\n", NSTR(n), code); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2951 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2952 | srvc = mwPlace_getService(place); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2953 | session = mwService_getSession(MW_SERVICE(srvc)); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2954 | pd = mwSession_getClientData(session); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2955 | gc = pd->gc; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2956 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2957 | serv_got_chat_left(gc, PLACE_TO_ID(place)); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2958 | |
| 15884 | 2959 | purple_notify_error(gc, _("Place Closed"), NULL, msg); |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2960 | g_free(msg); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2961 | } |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2962 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2963 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2964 | static void mw_place_peerJoined(struct mwPlace *place, |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2965 | const struct mwIdBlock *peer) { |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2966 | struct mwServicePlace *srvc; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2967 | struct mwSession *session; |
| 15884 | 2968 | struct mwPurplePluginData *pd; |
| 2969 | PurpleConnection *gc; | |
| 2970 | PurpleConversation *gconf; | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2971 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2972 | const char *n = mwPlace_getName(place); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2973 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2974 | DEBUG_INFO("%s joined place %s\n", NSTR(peer->user), NSTR(n)); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2975 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2976 | srvc = mwPlace_getService(place); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2977 | session = mwService_getSession(MW_SERVICE(srvc)); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2978 | pd = mwSession_getClientData(session); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2979 | gc = pd->gc; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2980 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2981 | gconf = mwPlace_getClientData(place); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2982 | g_return_if_fail(gconf != NULL); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2983 | |
| 15884 | 2984 | purple_conv_chat_add_user(PURPLE_CONV_CHAT(gconf), peer->user, |
| 2985 | NULL, PURPLE_CBFLAGS_NONE, TRUE); | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2986 | } |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2987 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2988 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2989 | static void mw_place_peerParted(struct mwPlace *place, |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2990 | const struct mwIdBlock *peer) { |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2991 | struct mwServicePlace *srvc; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2992 | struct mwSession *session; |
| 15884 | 2993 | struct mwPurplePluginData *pd; |
| 2994 | PurpleConnection *gc; | |
| 2995 | PurpleConversation *gconf; | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2996 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2997 | const char *n = mwPlace_getName(place); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2998 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
2999 | DEBUG_INFO("%s left place %s\n", NSTR(peer->user), NSTR(n)); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3000 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3001 | srvc = mwPlace_getService(place); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3002 | session = mwService_getSession(MW_SERVICE(srvc)); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3003 | pd = mwSession_getClientData(session); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3004 | gc = pd->gc; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3005 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3006 | gconf = mwPlace_getClientData(place); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3007 | g_return_if_fail(gconf != NULL); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3008 | |
| 15884 | 3009 | purple_conv_chat_remove_user(PURPLE_CONV_CHAT(gconf), peer->user, NULL); |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3010 | } |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3011 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3012 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3013 | static void mw_place_peerSetAttribute(struct mwPlace *place, |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3014 | const struct mwIdBlock *peer, |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3015 | guint32 attr, struct mwOpaque *o) { |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3016 | ; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3017 | } |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3018 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3019 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3020 | static void mw_place_peerUnsetAttribute(struct mwPlace *place, |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3021 | const struct mwIdBlock *peer, |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3022 | guint32 attr) { |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3023 | ; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3024 | } |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3025 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3026 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3027 | static void mw_place_message(struct mwPlace *place, |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3028 | const struct mwIdBlock *who, |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3029 | const char *msg) { |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3030 | struct mwServicePlace *srvc; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3031 | struct mwSession *session; |
| 15884 | 3032 | struct mwPurplePluginData *pd; |
| 3033 | PurpleConnection *gc; | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3034 | char *esc; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3035 | |
|
12863
535f2e11db82
[gaim-migrate @ 15214]
Christopher O'Brien <siege@pidgin.im>
parents:
12830
diff
changeset
|
3036 | if(! msg) return; |
|
535f2e11db82
[gaim-migrate @ 15214]
Christopher O'Brien <siege@pidgin.im>
parents:
12830
diff
changeset
|
3037 | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3038 | srvc = mwPlace_getService(place); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3039 | session = mwService_getSession(MW_SERVICE(srvc)); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3040 | pd = mwSession_getClientData(session); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3041 | gc = pd->gc; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3042 | |
|
12864
072fcb25d27b
[gaim-migrate @ 15215]
Christopher O'Brien <siege@pidgin.im>
parents:
12863
diff
changeset
|
3043 | esc = g_markup_escape_text(msg, -1); |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3044 | serv_got_chat_in(gc, PLACE_TO_ID(place), who->user, 0, esc, time(NULL)); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3045 | g_free(esc); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3046 | } |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3047 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3048 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3049 | static void mw_place_clear(struct mwServicePlace *srvc) { |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3050 | ; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3051 | } |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3052 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3053 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3054 | static struct mwPlaceHandler mw_place_handler = { |
|
17153
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
3055 | mw_place_opened, |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
3056 | mw_place_closed, |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
3057 | mw_place_peerJoined, |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
3058 | mw_place_peerParted, |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
3059 | mw_place_peerSetAttribute, |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
3060 | mw_place_peerUnsetAttribute, |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
3061 | mw_place_message, |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
3062 | mw_place_clear, |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3063 | }; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3064 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3065 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3066 | static struct mwServicePlace *mw_srvc_place_new(struct mwSession *s) { |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3067 | struct mwServicePlace *srvc; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3068 | srvc = mwServicePlace_new(s, &mw_place_handler); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3069 | return srvc; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3070 | } |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3071 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3072 | |
| 10977 | 3073 | static struct mwServiceResolve *mw_srvc_resolve_new(struct mwSession *s) { |
| 3074 | struct mwServiceResolve *srvc; | |
| 3075 | srvc = mwServiceResolve_new(s); | |
| 3076 | return srvc; | |
| 3077 | } | |
| 3078 | ||
| 3079 | ||
| 3080 | static struct mwServiceStorage *mw_srvc_store_new(struct mwSession *s) { | |
| 3081 | struct mwServiceStorage *srvc; | |
| 3082 | srvc = mwServiceStorage_new(s); | |
| 3083 | return srvc; | |
| 3084 | } | |
| 3085 | ||
| 3086 | ||
| 15884 | 3087 | /** allocate and associate a mwPurplePluginData with a PurpleConnection */ |
| 3088 | static struct mwPurplePluginData *mwPurplePluginData_new(PurpleConnection *gc) { | |
| 3089 | struct mwPurplePluginData *pd; | |
| 10977 | 3090 | |
| 3091 | g_return_val_if_fail(gc != NULL, NULL); | |
| 3092 | ||
| 15884 | 3093 | pd = g_new0(struct mwPurplePluginData, 1); |
| 10977 | 3094 | pd->gc = gc; |
| 3095 | pd->session = mwSession_new(&mw_session_handler); | |
| 3096 | pd->srvc_aware = mw_srvc_aware_new(pd->session); | |
| 3097 | pd->srvc_conf = mw_srvc_conf_new(pd->session); | |
| 3098 | pd->srvc_ft = mw_srvc_ft_new(pd->session); | |
| 3099 | pd->srvc_im = mw_srvc_im_new(pd->session); | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3100 | pd->srvc_place = mw_srvc_place_new(pd->session); |
| 10977 | 3101 | pd->srvc_resolve = mw_srvc_resolve_new(pd->session); |
| 3102 | pd->srvc_store = mw_srvc_store_new(pd->session); | |
| 3103 | pd->group_list_map = g_hash_table_new(g_direct_hash, g_direct_equal); | |
| 15884 | 3104 | pd->sock_buf = purple_circ_buffer_new(0); |
| 10977 | 3105 | |
| 3106 | mwSession_addService(pd->session, MW_SERVICE(pd->srvc_aware)); | |
| 3107 | mwSession_addService(pd->session, MW_SERVICE(pd->srvc_conf)); | |
| 3108 | mwSession_addService(pd->session, MW_SERVICE(pd->srvc_ft)); | |
| 3109 | mwSession_addService(pd->session, MW_SERVICE(pd->srvc_im)); | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3110 | mwSession_addService(pd->session, MW_SERVICE(pd->srvc_place)); |
| 10977 | 3111 | mwSession_addService(pd->session, MW_SERVICE(pd->srvc_resolve)); |
| 3112 | mwSession_addService(pd->session, MW_SERVICE(pd->srvc_store)); | |
| 3113 | ||
| 3114 | mwSession_addCipher(pd->session, mwCipher_new_RC2_40(pd->session)); | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3115 | mwSession_addCipher(pd->session, mwCipher_new_RC2_128(pd->session)); |
| 10977 | 3116 | |
| 3117 | mwSession_setClientData(pd->session, pd, NULL); | |
| 3118 | gc->proto_data = pd; | |
| 3119 | ||
| 3120 | return pd; | |
| 3121 | } | |
| 3122 | ||
| 3123 | ||
| 15884 | 3124 | static void mwPurplePluginData_free(struct mwPurplePluginData *pd) { |
| 10977 | 3125 | g_return_if_fail(pd != NULL); |
| 3126 | ||
| 3127 | pd->gc->proto_data = NULL; | |
| 3128 | ||
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3129 | mwSession_removeService(pd->session, mwService_AWARE); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3130 | mwSession_removeService(pd->session, mwService_CONFERENCE); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3131 | mwSession_removeService(pd->session, mwService_FILE_TRANSFER); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3132 | mwSession_removeService(pd->session, mwService_IM); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3133 | mwSession_removeService(pd->session, mwService_PLACE); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3134 | mwSession_removeService(pd->session, mwService_RESOLVE); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3135 | mwSession_removeService(pd->session, mwService_STORAGE); |
| 10977 | 3136 | |
| 3137 | mwService_free(MW_SERVICE(pd->srvc_aware)); | |
| 3138 | mwService_free(MW_SERVICE(pd->srvc_conf)); | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3139 | mwService_free(MW_SERVICE(pd->srvc_ft)); |
| 10977 | 3140 | mwService_free(MW_SERVICE(pd->srvc_im)); |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3141 | mwService_free(MW_SERVICE(pd->srvc_place)); |
| 10977 | 3142 | mwService_free(MW_SERVICE(pd->srvc_resolve)); |
| 3143 | mwService_free(MW_SERVICE(pd->srvc_store)); | |
| 3144 | ||
| 3145 | mwCipher_free(mwSession_getCipher(pd->session, mwCipher_RC2_40)); | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3146 | mwCipher_free(mwSession_getCipher(pd->session, mwCipher_RC2_128)); |
| 10977 | 3147 | |
| 3148 | mwSession_free(pd->session); | |
| 3149 | ||
| 3150 | g_hash_table_destroy(pd->group_list_map); | |
| 15884 | 3151 | purple_circ_buffer_destroy(pd->sock_buf); |
| 10977 | 3152 | |
| 3153 | g_free(pd); | |
| 3154 | } | |
| 3155 | ||
| 3156 | ||
| 15884 | 3157 | static const char *mw_prpl_list_icon(PurpleAccount *a, PurpleBuddy *b) { |
| 10977 | 3158 | /* my little green dude is a chopped up version of the aim running |
| 3159 | guy. First, cut off the head and store someplace safe. Then, | |
| 3160 | take the left-half side of the body and throw it away. Make a | |
| 3161 | copy of the remaining body, and flip it horizontally. Now attach | |
| 3162 | the two pieces into an X shape, and drop the head back on the | |
| 3163 | top, being careful to center it. Then, just change the color | |
| 3164 | saturation to bring the red down a bit, and voila! */ | |
| 3165 | ||
| 3166 | /* then, throw all of that away and use sodipodi to make a new | |
| 3167 | icon. You know, LIKE A REAL MAN. */ | |
| 3168 | ||
| 3169 | return "meanwhile"; | |
| 3170 | } | |
| 3171 | ||
| 3172 | ||
| 15884 | 3173 | static const char* mw_prpl_list_emblem(PurpleBuddy *b) |
| 15524 | 3174 | { |
| 3175 | if(buddy_is_external(b)) | |
| 3176 | return "external"; | |
| 3177 | ||
| 3178 | return NULL; | |
| 10977 | 3179 | } |
| 3180 | ||
| 3181 | ||
| 15884 | 3182 | static char *mw_prpl_status_text(PurpleBuddy *b) { |
| 3183 | PurpleConnection *gc; | |
| 3184 | struct mwPurplePluginData *pd; | |
| 10977 | 3185 | struct mwAwareIdBlock t = { mwAware_USER, b->name, NULL }; |
| 3186 | const char *ret; | |
| 3187 | ||
| 3188 | gc = b->account->gc; | |
| 3189 | pd = gc->proto_data; | |
| 3190 | ||
| 3191 | ret = mwServiceAware_getText(pd->srvc_aware, &t); | |
|
12496
788b20ccec91
[gaim-migrate @ 14808]
Christopher O'Brien <siege@pidgin.im>
parents:
12489
diff
changeset
|
3192 | return ret? g_markup_escape_text(ret, -1): NULL; |
| 10977 | 3193 | } |
| 3194 | ||
| 3195 | ||
| 15884 | 3196 | static const char *status_text(PurpleBuddy *b) { |
| 3197 | PurplePresence *presence; | |
| 3198 | PurpleStatus *status; | |
| 3199 | ||
| 3200 | presence = purple_buddy_get_presence(b); | |
| 3201 | status = purple_presence_get_active_status(presence); | |
| 3202 | ||
| 3203 | return purple_status_get_name(status); | |
| 10977 | 3204 | } |
| 3205 | ||
| 3206 | ||
| 3207 | static gboolean user_supports(struct mwServiceAware *srvc, | |
| 3208 | const char *who, guint32 feature) { | |
| 3209 | ||
| 3210 | const struct mwAwareAttribute *attr; | |
| 3211 | struct mwAwareIdBlock idb = { mwAware_USER, (char *) who, NULL }; | |
| 3212 | ||
| 3213 | attr = mwServiceAware_getAttribute(srvc, &idb, feature); | |
| 3214 | return (attr != NULL) && mwAwareAttribute_asBoolean(attr); | |
| 3215 | } | |
| 3216 | ||
| 3217 | ||
|
12422
53fba178cadf
[gaim-migrate @ 14729]
Richard Laager <rlaager@pidgin.im>
parents:
12312
diff
changeset
|
3218 | static char *user_supports_text(struct mwServiceAware *srvc, const char *who) { |
|
13107
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
3219 | const char *feat[] = {NULL, NULL, NULL, NULL, NULL}; |
|
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
3220 | const char **f = feat; |
|
12524
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3221 | |
|
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3222 | if(user_supports(srvc, who, mwAttribute_AV_PREFS_SET)) { |
|
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3223 | gboolean mic, speak, video; |
|
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3224 | |
|
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3225 | mic = user_supports(srvc, who, mwAttribute_MICROPHONE); |
|
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3226 | speak = user_supports(srvc, who, mwAttribute_SPEAKERS); |
|
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3227 | video = user_supports(srvc, who, mwAttribute_VIDEO_CAMERA); |
|
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3228 | |
|
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3229 | if(mic) *f++ = _("Microphone"); |
|
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3230 | if(speak) *f++ = _("Speakers"); |
|
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3231 | if(video) *f++ = _("Video Camera"); |
|
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3232 | } |
|
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3233 | |
|
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3234 | if(user_supports(srvc, who, mwAttribute_FILE_TRANSFER)) |
|
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3235 | *f++ = _("File Transfer"); |
|
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3236 | |
|
13107
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
3237 | return (*feat)? g_strjoinv(", ", (char **)feat): NULL; |
|
12524
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3238 | /* jenni loves siege */ |
| 10977 | 3239 | } |
| 3240 | ||
| 3241 | ||
| 15884 | 3242 | static void mw_prpl_tooltip_text(PurpleBuddy *b, PurpleNotifyUserInfo *user_info, gboolean full) { |
| 3243 | PurpleConnection *gc; | |
| 3244 | struct mwPurplePluginData *pd; | |
| 10977 | 3245 | struct mwAwareIdBlock idb = { mwAware_USER, b->name, NULL }; |
| 3246 | ||
|
12953
cb41397f42d4
[gaim-migrate @ 15306]
Richard Laager <rlaager@pidgin.im>
parents:
12952
diff
changeset
|
3247 | const char *message; |
|
cb41397f42d4
[gaim-migrate @ 15306]
Richard Laager <rlaager@pidgin.im>
parents:
12952
diff
changeset
|
3248 | const char *status; |
|
12954
a0f02cc2e803
[gaim-migrate @ 15307]
Richard Laager <rlaager@pidgin.im>
parents:
12953
diff
changeset
|
3249 | char *tmp; |
| 10977 | 3250 | |
| 3251 | gc = b->account->gc; | |
| 3252 | pd = gc->proto_data; | |
| 3253 | ||
|
12953
cb41397f42d4
[gaim-migrate @ 15306]
Richard Laager <rlaager@pidgin.im>
parents:
12952
diff
changeset
|
3254 | message = mwServiceAware_getText(pd->srvc_aware, &idb); |
|
cb41397f42d4
[gaim-migrate @ 15306]
Richard Laager <rlaager@pidgin.im>
parents:
12952
diff
changeset
|
3255 | status = status_text(b); |
|
cb41397f42d4
[gaim-migrate @ 15306]
Richard Laager <rlaager@pidgin.im>
parents:
12952
diff
changeset
|
3256 | |
| 15884 | 3257 | if(message != NULL && purple_utf8_strcasecmp(status, message)) { |
|
12953
cb41397f42d4
[gaim-migrate @ 15306]
Richard Laager <rlaager@pidgin.im>
parents:
12952
diff
changeset
|
3258 | tmp = g_markup_escape_text(message, -1); |
| 15884 | 3259 | purple_notify_user_info_add_pair(user_info, status, tmp); |
|
12953
cb41397f42d4
[gaim-migrate @ 15306]
Richard Laager <rlaager@pidgin.im>
parents:
12952
diff
changeset
|
3260 | g_free(tmp); |
|
12954
a0f02cc2e803
[gaim-migrate @ 15307]
Richard Laager <rlaager@pidgin.im>
parents:
12953
diff
changeset
|
3261 | |
|
a0f02cc2e803
[gaim-migrate @ 15307]
Richard Laager <rlaager@pidgin.im>
parents:
12953
diff
changeset
|
3262 | } else { |
| 15884 | 3263 | purple_notify_user_info_add_pair(user_info, _("Status"), status); |
| 10977 | 3264 | } |
| 3265 | ||
|
12950
167358332f4b
[gaim-migrate @ 15303]
Christopher O'Brien <siege@pidgin.im>
parents:
12943
diff
changeset
|
3266 | if(full) { |
|
167358332f4b
[gaim-migrate @ 15303]
Christopher O'Brien <siege@pidgin.im>
parents:
12943
diff
changeset
|
3267 | tmp = user_supports_text(pd->srvc_aware, b->name); |
|
167358332f4b
[gaim-migrate @ 15303]
Christopher O'Brien <siege@pidgin.im>
parents:
12943
diff
changeset
|
3268 | if(tmp) { |
| 15884 | 3269 | purple_notify_user_info_add_pair(user_info, _("Supports"), tmp); |
|
12953
cb41397f42d4
[gaim-migrate @ 15306]
Richard Laager <rlaager@pidgin.im>
parents:
12952
diff
changeset
|
3270 | g_free(tmp); |
|
12950
167358332f4b
[gaim-migrate @ 15303]
Christopher O'Brien <siege@pidgin.im>
parents:
12943
diff
changeset
|
3271 | } |
|
167358332f4b
[gaim-migrate @ 15303]
Christopher O'Brien <siege@pidgin.im>
parents:
12943
diff
changeset
|
3272 | |
|
167358332f4b
[gaim-migrate @ 15303]
Christopher O'Brien <siege@pidgin.im>
parents:
12943
diff
changeset
|
3273 | if(buddy_is_external(b)) { |
| 15884 | 3274 | purple_notify_user_info_add_pair(user_info, NULL, _("External User")); |
|
12950
167358332f4b
[gaim-migrate @ 15303]
Christopher O'Brien <siege@pidgin.im>
parents:
12943
diff
changeset
|
3275 | } |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3276 | } |
| 10977 | 3277 | } |
| 3278 | ||
| 3279 | ||
| 15884 | 3280 | static GList *mw_prpl_status_types(PurpleAccount *acct) { |
| 10977 | 3281 | GList *types = NULL; |
| 15884 | 3282 | PurpleStatusType *type; |
| 3283 | ||
| 3284 | type = purple_status_type_new(PURPLE_STATUS_AVAILABLE, MW_STATE_ACTIVE, | |
|
12950
167358332f4b
[gaim-migrate @ 15303]
Christopher O'Brien <siege@pidgin.im>
parents:
12943
diff
changeset
|
3285 | NULL, TRUE); |
| 15884 | 3286 | purple_status_type_add_attr(type, MW_STATE_MESSAGE, _("Message"), |
| 3287 | purple_value_new(PURPLE_TYPE_STRING)); | |
| 10977 | 3288 | types = g_list_append(types, type); |
| 3289 | ||
| 15884 | 3290 | type = purple_status_type_new(PURPLE_STATUS_AWAY, MW_STATE_AWAY, |
|
12595
8108c22aa723
[gaim-migrate @ 14925]
Richard Laager <rlaager@pidgin.im>
parents:
12524
diff
changeset
|
3291 | NULL, TRUE); |
| 15884 | 3292 | purple_status_type_add_attr(type, MW_STATE_MESSAGE, _("Message"), |
| 3293 | purple_value_new(PURPLE_TYPE_STRING)); | |
| 10977 | 3294 | types = g_list_append(types, type); |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3295 | |
| 15884 | 3296 | type = purple_status_type_new(PURPLE_STATUS_UNAVAILABLE, MW_STATE_BUSY, |
| 10977 | 3297 | _("Do Not Disturb"), TRUE); |
| 15884 | 3298 | purple_status_type_add_attr(type, MW_STATE_MESSAGE, _("Message"), |
| 3299 | purple_value_new(PURPLE_TYPE_STRING)); | |
| 10977 | 3300 | types = g_list_append(types, type); |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3301 | |
| 15884 | 3302 | type = purple_status_type_new(PURPLE_STATUS_OFFLINE, MW_STATE_OFFLINE, |
|
12658
4aa7a873628d
[gaim-migrate @ 15001]
Mark Doliner <markdoliner@pidgin.im>
parents:
12650
diff
changeset
|
3303 | NULL, TRUE); |
|
4aa7a873628d
[gaim-migrate @ 15001]
Mark Doliner <markdoliner@pidgin.im>
parents:
12650
diff
changeset
|
3304 | types = g_list_append(types, type); |
|
4aa7a873628d
[gaim-migrate @ 15001]
Mark Doliner <markdoliner@pidgin.im>
parents:
12650
diff
changeset
|
3305 | |
| 10977 | 3306 | return types; |
| 3307 | } | |
| 3308 | ||
| 3309 | ||
| 15884 | 3310 | static void conf_create_prompt_cancel(PurpleBuddy *buddy, |
| 3311 | PurpleRequestFields *fields) { | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3312 | ; /* nothing to do */ |
| 10977 | 3313 | } |
| 3314 | ||
| 3315 | ||
| 15884 | 3316 | static void conf_create_prompt_join(PurpleBuddy *buddy, |
| 3317 | PurpleRequestFields *fields) { | |
| 3318 | PurpleAccount *acct; | |
| 3319 | PurpleConnection *gc; | |
| 3320 | struct mwPurplePluginData *pd; | |
| 10977 | 3321 | struct mwServiceConference *srvc; |
| 3322 | ||
| 15884 | 3323 | PurpleRequestField *f; |
| 10977 | 3324 | |
| 3325 | const char *topic, *invite; | |
| 3326 | struct mwConference *conf; | |
| 3327 | struct mwIdBlock idb = { NULL, NULL }; | |
| 3328 | ||
| 3329 | acct = buddy->account; | |
| 15884 | 3330 | gc = purple_account_get_connection(acct); |
| 10977 | 3331 | pd = gc->proto_data; |
| 3332 | srvc = pd->srvc_conf; | |
| 3333 | ||
| 15884 | 3334 | f = purple_request_fields_get_field(fields, CHAT_KEY_TOPIC); |
| 3335 | topic = purple_request_field_string_get_value(f); | |
| 3336 | ||
| 3337 | f = purple_request_fields_get_field(fields, CHAT_KEY_INVITE); | |
| 3338 | invite = purple_request_field_string_get_value(f); | |
| 10977 | 3339 | |
| 3340 | conf = mwConference_new(srvc, topic); | |
| 3341 | mwConference_open(conf); | |
| 3342 | ||
| 3343 | idb.user = buddy->name; | |
| 3344 | mwConference_invite(conf, &idb, invite); | |
| 3345 | } | |
| 3346 | ||
| 3347 | ||
| 15884 | 3348 | static void blist_menu_conf_create(PurpleBuddy *buddy, const char *msg) { |
| 3349 | ||
| 3350 | PurpleRequestFields *fields; | |
| 3351 | PurpleRequestFieldGroup *g; | |
| 3352 | PurpleRequestField *f; | |
| 3353 | ||
| 3354 | PurpleAccount *acct; | |
| 3355 | PurpleConnection *gc; | |
| 10977 | 3356 | |
|
13107
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
3357 | const char *msgA; |
|
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
3358 | const char *msgB; |
|
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
3359 | char *msg1; |
| 10977 | 3360 | |
| 3361 | g_return_if_fail(buddy != NULL); | |
| 3362 | ||
| 3363 | acct = buddy->account; | |
| 3364 | g_return_if_fail(acct != NULL); | |
| 3365 | ||
| 15884 | 3366 | gc = purple_account_get_connection(acct); |
| 10977 | 3367 | g_return_if_fail(gc != NULL); |
| 3368 | ||
| 15884 | 3369 | fields = purple_request_fields_new(); |
| 3370 | ||
| 3371 | g = purple_request_field_group_new(NULL); | |
| 3372 | purple_request_fields_add_group(fields, g); | |
| 10977 | 3373 | |
| 15884 | 3374 | f = purple_request_field_string_new(CHAT_KEY_TOPIC, _("Topic"), NULL, FALSE); |
| 3375 | purple_request_field_group_add_field(g, f); | |
| 3376 | ||
| 3377 | f = purple_request_field_string_new(CHAT_KEY_INVITE, _("Message"), msg, FALSE); | |
| 3378 | purple_request_field_group_add_field(g, f); | |
| 10977 | 3379 | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3380 | msgA = _("Create conference with user"); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3381 | msgB = _("Please enter a topic for the new conference, and an invitation" |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3382 | " message to be sent to %s"); |
|
13107
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
3383 | msg1 = g_strdup_printf(msgB, buddy->name); |
| 10977 | 3384 | |
| 15884 | 3385 | purple_request_fields(gc, _("New Conference"), |
|
13107
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
3386 | msgA, msg1, fields, |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3387 | _("Create"), G_CALLBACK(conf_create_prompt_join), |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3388 | _("Cancel"), G_CALLBACK(conf_create_prompt_cancel), |
|
16490
68c22924d66b
Added account, who, and conversation parameters to the request API calls, and updated all code to match. I can't compile the Perl module, so I'd appreciate it if someone who knows it would verify that this doesn't break Perl.
Evan Schoenberg <evands@pidgin.im>
parents:
16121
diff
changeset
|
3389 | acct, purple_buddy_get_name(buddy), NULL, |
| 10977 | 3390 | buddy); |
|
13107
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
3391 | g_free(msg1); |
| 10977 | 3392 | } |
| 3393 | ||
| 3394 | ||
| 15884 | 3395 | static void conf_select_prompt_cancel(PurpleBuddy *buddy, |
| 3396 | PurpleRequestFields *fields) { | |
| 10977 | 3397 | ; |
| 3398 | } | |
| 3399 | ||
| 3400 | ||
| 15884 | 3401 | static void conf_select_prompt_invite(PurpleBuddy *buddy, |
| 3402 | PurpleRequestFields *fields) { | |
| 3403 | PurpleRequestField *f; | |
| 10977 | 3404 | const GList *l; |
| 3405 | const char *msg; | |
| 3406 | ||
| 15884 | 3407 | f = purple_request_fields_get_field(fields, CHAT_KEY_INVITE); |
| 3408 | msg = purple_request_field_string_get_value(f); | |
| 3409 | ||
| 3410 | f = purple_request_fields_get_field(fields, "conf"); | |
| 3411 | l = purple_request_field_list_get_selected(f); | |
| 10977 | 3412 | |
| 3413 | if(l) { | |
| 15884 | 3414 | gpointer d = purple_request_field_list_get_data(f, l->data); |
| 10977 | 3415 | |
| 3416 | if(GPOINTER_TO_INT(d) == 0x01) { | |
| 3417 | blist_menu_conf_create(buddy, msg); | |
| 3418 | ||
| 3419 | } else { | |
| 3420 | struct mwIdBlock idb = { buddy->name, NULL }; | |
| 3421 | mwConference_invite(d, &idb, msg); | |
| 3422 | } | |
| 3423 | } | |
| 3424 | } | |
| 3425 | ||
| 3426 | ||
| 15884 | 3427 | static void blist_menu_conf_list(PurpleBuddy *buddy, |
| 10977 | 3428 | GList *confs) { |
| 3429 | ||
| 15884 | 3430 | PurpleRequestFields *fields; |
| 3431 | PurpleRequestFieldGroup *g; | |
| 3432 | PurpleRequestField *f; | |
| 3433 | ||
| 3434 | PurpleAccount *acct; | |
| 3435 | PurpleConnection *gc; | |
| 10977 | 3436 | |
|
13107
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
3437 | const char *msgA; |
|
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
3438 | const char *msgB; |
|
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
3439 | char *msg; |
| 10977 | 3440 | |
| 3441 | acct = buddy->account; | |
| 3442 | g_return_if_fail(acct != NULL); | |
| 3443 | ||
| 15884 | 3444 | gc = purple_account_get_connection(acct); |
| 10977 | 3445 | g_return_if_fail(gc != NULL); |
| 3446 | ||
| 15884 | 3447 | fields = purple_request_fields_new(); |
| 10977 | 3448 | |
| 15884 | 3449 | g = purple_request_field_group_new(NULL); |
| 3450 | purple_request_fields_add_group(fields, g); | |
| 3451 | ||
| 3452 | f = purple_request_field_list_new("conf", _("Available Conferences")); | |
| 3453 | purple_request_field_list_set_multi_select(f, FALSE); | |
| 10977 | 3454 | for(; confs; confs = confs->next) { |
| 3455 | struct mwConference *c = confs->data; | |
| 15884 | 3456 | purple_request_field_list_add(f, mwConference_getTitle(c), c); |
| 10977 | 3457 | } |
| 15884 | 3458 | purple_request_field_list_add(f, _("Create New Conference..."), |
| 10977 | 3459 | GINT_TO_POINTER(0x01)); |
| 15884 | 3460 | purple_request_field_group_add_field(g, f); |
| 10977 | 3461 | |
| 15884 | 3462 | f = purple_request_field_string_new(CHAT_KEY_INVITE, "Message", NULL, FALSE); |
| 3463 | purple_request_field_group_add_field(g, f); | |
| 10977 | 3464 | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3465 | msgA = _("Invite user to a conference"); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3466 | msgB = _("Select a conference from the list below to send an invite to" |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3467 | " user %s. Select \"Create New Conference\" if you'd like to" |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3468 | " create a new conference to invite this user to."); |
|
13107
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
3469 | msg = g_strdup_printf(msgB, buddy->name); |
| 10977 | 3470 | |
| 15884 | 3471 | purple_request_fields(gc, _("Invite to Conference"), |
|
13107
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
3472 | msgA, msg, fields, |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3473 | _("Invite"), G_CALLBACK(conf_select_prompt_invite), |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3474 | _("Cancel"), G_CALLBACK(conf_select_prompt_cancel), |
|
16490
68c22924d66b
Added account, who, and conversation parameters to the request API calls, and updated all code to match. I can't compile the Perl module, so I'd appreciate it if someone who knows it would verify that this doesn't break Perl.
Evan Schoenberg <evands@pidgin.im>
parents:
16121
diff
changeset
|
3475 | acct, purple_buddy_get_name(buddy), NULL, |
| 10977 | 3476 | buddy); |
|
13107
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
3477 | g_free(msg); |
| 10977 | 3478 | } |
| 3479 | ||
| 3480 | ||
| 15884 | 3481 | static void blist_menu_conf(PurpleBlistNode *node, gpointer data) { |
| 3482 | PurpleBuddy *buddy = (PurpleBuddy *) node; | |
| 3483 | PurpleAccount *acct; | |
| 3484 | PurpleConnection *gc; | |
| 3485 | struct mwPurplePluginData *pd; | |
| 10977 | 3486 | GList *l; |
| 3487 | ||
| 3488 | g_return_if_fail(node != NULL); | |
| 15884 | 3489 | g_return_if_fail(PURPLE_BLIST_NODE_IS_BUDDY(node)); |
| 10977 | 3490 | |
| 3491 | acct = buddy->account; | |
| 3492 | g_return_if_fail(acct != NULL); | |
| 3493 | ||
| 15884 | 3494 | gc = purple_account_get_connection(acct); |
| 10977 | 3495 | g_return_if_fail(gc != NULL); |
| 3496 | ||
| 3497 | pd = gc->proto_data; | |
| 3498 | g_return_if_fail(pd != NULL); | |
| 3499 | ||
|
11133
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
3500 | /* |
| 10977 | 3501 | - get a list of all conferences on this session |
| 3502 | - if none, prompt to create one, and invite buddy to it | |
| 3503 | - else, prompt to select a conference or create one | |
| 3504 | */ | |
| 3505 | ||
| 3506 | l = mwServiceConference_getConferences(pd->srvc_conf); | |
| 3507 | if(l) { | |
| 3508 | blist_menu_conf_list(buddy, l); | |
| 3509 | g_list_free(l); | |
| 3510 | ||
| 3511 | } else { | |
| 3512 | blist_menu_conf_create(buddy, NULL); | |
| 3513 | } | |
| 3514 | } | |
| 3515 | ||
| 3516 | ||
|
13206
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
3517 | #if 0 |
| 15884 | 3518 | static void blist_menu_announce(PurpleBlistNode *node, gpointer data) { |
| 3519 | PurpleBuddy *buddy = (PurpleBuddy *) node; | |
| 3520 | PurpleAccount *acct; | |
| 3521 | PurpleConnection *gc; | |
| 3522 | struct mwPurplePluginData *pd; | |
|
13206
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
3523 | struct mwSession *session; |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
3524 | char *rcpt_name; |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
3525 | GList *rcpt; |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
3526 | |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
3527 | g_return_if_fail(node != NULL); |
| 15884 | 3528 | g_return_if_fail(PURPLE_BLIST_NODE_IS_BUDDY(node)); |
|
13206
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
3529 | |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
3530 | acct = buddy->account; |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
3531 | g_return_if_fail(acct != NULL); |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
3532 | |
| 15884 | 3533 | gc = purple_account_get_connection(acct); |
|
13206
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
3534 | g_return_if_fail(gc != NULL); |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
3535 | |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
3536 | pd = gc->proto_data; |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
3537 | g_return_if_fail(pd != NULL); |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
3538 | |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
3539 | rcpt_name = g_strdup_printf("@U %s", buddy->name); |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
3540 | rcpt = g_list_prepend(NULL, rcpt_name); |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
3541 | |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
3542 | session = pd->session; |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
3543 | mwSession_sendAnnounce(session, FALSE, |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
3544 | "This is a TEST announcement. Please ignore.", |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
3545 | rcpt); |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
3546 | |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
3547 | g_list_free(rcpt); |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
3548 | g_free(rcpt_name); |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
3549 | } |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
3550 | #endif |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
3551 | |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
3552 | |
| 15884 | 3553 | static GList *mw_prpl_blist_node_menu(PurpleBlistNode *node) { |
| 10977 | 3554 | GList *l = NULL; |
| 15884 | 3555 | PurpleMenuAction *act; |
| 3556 | ||
| 3557 | if(! PURPLE_BLIST_NODE_IS_BUDDY(node)) | |
| 10977 | 3558 | return l; |
| 3559 | ||
| 3560 | l = g_list_append(l, NULL); | |
| 3561 | ||
| 15884 | 3562 | act = purple_menu_action_new(_("Invite to Conference..."), |
| 3563 | PURPLE_CALLBACK(blist_menu_conf), NULL, NULL); | |
| 10977 | 3564 | l = g_list_append(l, act); |
| 3565 | ||
|
13206
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
3566 | #if 0 |
| 15884 | 3567 | act = purple_menu_action_new(_("Send TEST Announcement"), |
| 3568 | PURPLE_CALLBACK(blist_menu_announce), NULL, NULL); | |
|
13206
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
3569 | l = g_list_append(l, act); |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
3570 | #endif |
|
fb1f9f01499c
[gaim-migrate @ 15568]
Christopher O'Brien <siege@pidgin.im>
parents:
13158
diff
changeset
|
3571 | |
| 15884 | 3572 | /** note: this never gets called for a PurpleGroup, have to use the |
| 10977 | 3573 | blist-node-extended-menu signal for that. The function |
| 3574 | blist_node_menu_cb is assigned to this signal in the function | |
| 3575 | services_starting */ | |
| 3576 | ||
| 3577 | return l; | |
| 3578 | } | |
| 3579 | ||
| 3580 | ||
| 15884 | 3581 | static GList *mw_prpl_chat_info(PurpleConnection *gc) { |
| 10977 | 3582 | GList *l = NULL; |
| 3583 | struct proto_chat_entry *pce; | |
| 3584 | ||
| 3585 | pce = g_new0(struct proto_chat_entry, 1); | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3586 | pce->label = _("Topic:"); |
| 10977 | 3587 | pce->identifier = CHAT_KEY_TOPIC; |
| 3588 | l = g_list_append(l, pce); | |
| 3589 | ||
| 3590 | return l; | |
| 3591 | } | |
| 3592 | ||
| 3593 | ||
| 15884 | 3594 | static GHashTable *mw_prpl_chat_info_defaults(PurpleConnection *gc, |
| 10977 | 3595 | const char *name) { |
| 3596 | GHashTable *table; | |
| 3597 | ||
| 3598 | g_return_val_if_fail(gc != NULL, NULL); | |
| 3599 | ||
| 3600 | table = g_hash_table_new_full(g_str_hash, g_str_equal, | |
| 3601 | NULL, g_free); | |
| 3602 | ||
| 3603 | g_hash_table_insert(table, CHAT_KEY_NAME, g_strdup(name)); | |
| 3604 | g_hash_table_insert(table, CHAT_KEY_INVITE, NULL); | |
| 3605 | ||
| 3606 | return table; | |
| 3607 | } | |
| 3608 | ||
| 3609 | ||
| 15884 | 3610 | static void mw_prpl_login(PurpleAccount *acct); |
| 3611 | ||
| 3612 | ||
| 3613 | static void prompt_host_cancel_cb(PurpleConnection *gc) { | |
| 3614 | purple_connection_error(gc, _("No Sametime Community Server specified")); | |
| 3615 | } | |
| 3616 | ||
| 3617 | ||
| 3618 | static void prompt_host_ok_cb(PurpleConnection *gc, const char *host) { | |
| 10977 | 3619 | if(host && *host) { |
| 15884 | 3620 | PurpleAccount *acct = purple_connection_get_account(gc); |
| 3621 | purple_account_set_string(acct, MW_KEY_HOST, host); | |
|
11837
2f1206084fef
[gaim-migrate @ 14128]
Mark Doliner <markdoliner@pidgin.im>
parents:
11718
diff
changeset
|
3622 | mw_prpl_login(acct); |
| 10977 | 3623 | |
| 3624 | } else { | |
| 3625 | prompt_host_cancel_cb(gc); | |
| 3626 | } | |
| 3627 | } | |
| 3628 | ||
| 3629 | ||
| 15884 | 3630 | static void prompt_host(PurpleConnection *gc) { |
| 3631 | PurpleAccount *acct; | |
|
13107
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
3632 | const char *msgA; |
| 10977 | 3633 | char *msg; |
| 3634 | ||
| 15884 | 3635 | acct = purple_connection_get_account(gc); |
|
13107
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
3636 | msgA = _("No host or IP address has been configured for the" |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3637 | " Meanwhile account %s. Please enter one below to" |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3638 | " continue logging in."); |
| 15884 | 3639 | msg = g_strdup_printf(msgA, NSTR(purple_account_get_username(acct))); |
| 10977 | 3640 | |
| 15884 | 3641 | purple_request_input(gc, _("Meanwhile Connection Setup"), |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3642 | _("No Sametime Community Server Specified"), msg, |
| 10977 | 3643 | MW_PLUGIN_DEFAULT_HOST, FALSE, FALSE, NULL, |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3644 | _("Connect"), G_CALLBACK(prompt_host_ok_cb), |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3645 | _("Cancel"), G_CALLBACK(prompt_host_cancel_cb), |
|
16490
68c22924d66b
Added account, who, and conversation parameters to the request API calls, and updated all code to match. I can't compile the Perl module, so I'd appreciate it if someone who knows it would verify that this doesn't break Perl.
Evan Schoenberg <evands@pidgin.im>
parents:
16121
diff
changeset
|
3646 | acct, NULL, NULL, |
| 10977 | 3647 | gc); |
| 3648 | ||
| 3649 | g_free(msg); | |
| 3650 | } | |
| 3651 | ||
| 3652 | ||
| 15884 | 3653 | static void mw_prpl_login(PurpleAccount *account) { |
| 3654 | PurpleConnection *gc; | |
| 3655 | struct mwPurplePluginData *pd; | |
| 10977 | 3656 | |
| 3657 | char *user, *pass, *host; | |
|
14975
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
3658 | guint port; |
| 10977 | 3659 | |
| 15884 | 3660 | gc = purple_account_get_connection(account); |
| 3661 | pd = mwPurplePluginData_new(gc); | |
| 10977 | 3662 | |
| 3663 | /* while we do support images, the default is to not offer it */ | |
| 15884 | 3664 | gc->flags |= PURPLE_CONNECTION_NO_IMAGES; |
| 3665 | ||
| 3666 | user = g_strdup(purple_account_get_username(account)); | |
| 3667 | pass = g_strdup(purple_account_get_password(account)); | |
| 10977 | 3668 | |
| 3669 | host = strrchr(user, ':'); | |
| 3670 | if(host) { | |
| 3671 | /* annoying user split from 1.2.0, need to undo it */ | |
| 3672 | *host++ = '\0'; | |
| 15884 | 3673 | purple_account_set_string(account, MW_KEY_HOST, host); |
| 3674 | purple_account_set_username(account, user); | |
| 10977 | 3675 | |
| 3676 | } else { | |
| 15884 | 3677 | host = (char *) purple_account_get_string(account, MW_KEY_HOST, |
| 10977 | 3678 | MW_PLUGIN_DEFAULT_HOST); |
| 3679 | } | |
| 3680 | ||
| 3681 | if(! host || ! *host) { | |
| 3682 | /* somehow, we don't have a host to connect to. Well, we need one | |
| 3683 | to actually continue, so let's ask the user directly. */ | |
| 3684 | prompt_host(gc); | |
| 3685 | return; | |
| 3686 | } | |
| 3687 | ||
| 15884 | 3688 | port = purple_account_get_int(account, MW_KEY_PORT, MW_PLUGIN_DEFAULT_PORT); |
| 10977 | 3689 | |
| 3690 | DEBUG_INFO("user: '%s'\n", user); | |
| 3691 | DEBUG_INFO("host: '%s'\n", host); | |
| 3692 | DEBUG_INFO("port: %u\n", port); | |
| 3693 | ||
|
11133
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
3694 | mwSession_setProperty(pd->session, mwSession_NO_SECRET, |
| 10977 | 3695 | (char *) no_secret, NULL); |
| 3696 | mwSession_setProperty(pd->session, mwSession_AUTH_USER_ID, user, g_free); | |
|
12524
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3697 | mwSession_setProperty(pd->session, mwSession_AUTH_PASSWORD, pass, g_free); |
|
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3698 | |
| 15884 | 3699 | if(purple_account_get_bool(account, MW_KEY_FAKE_IT, FALSE)) { |
|
14975
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
3700 | guint client, major, minor; |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
3701 | |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
3702 | /* if we're faking the login, let's also fake the version we're |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
3703 | reporting. Let's also allow the actual values to be specified */ |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
3704 | |
| 15884 | 3705 | client = purple_account_get_int(account, MW_KEY_CLIENT, mwLogin_BINARY); |
| 3706 | major = purple_account_get_int(account, MW_KEY_MAJOR, 0x001e); | |
| 3707 | minor = purple_account_get_int(account, MW_KEY_MINOR, 0x001d); | |
|
14975
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
3708 | |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
3709 | DEBUG_INFO("client id: 0x%04x\n", client); |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
3710 | DEBUG_INFO("client major: 0x%04x\n", major); |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
3711 | DEBUG_INFO("client minor: 0x%04x\n", minor); |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
3712 | |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
3713 | mwSession_setProperty(pd->session, mwSession_CLIENT_TYPE_ID, |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
3714 | GUINT_TO_POINTER(client), NULL); |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
3715 | |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
3716 | mwSession_setProperty(pd->session, mwSession_CLIENT_VER_MAJOR, |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
3717 | GUINT_TO_POINTER(major), NULL); |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
3718 | |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
3719 | mwSession_setProperty(pd->session, mwSession_CLIENT_VER_MINOR, |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
3720 | GUINT_TO_POINTER(minor), NULL); |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
3721 | } |
| 10977 | 3722 | |
| 15884 | 3723 | purple_connection_update_progress(gc, _("Connecting"), 1, MW_CONNECT_STEPS); |
| 3724 | ||
| 3725 | if (purple_proxy_connect(gc, account, host, port, connect_cb, pd) == NULL) { | |
| 3726 | purple_connection_error(gc, _("Unable to connect to host")); | |
| 10977 | 3727 | } |
| 3728 | } | |
| 3729 | ||
| 3730 | ||
| 15884 | 3731 | static void mw_prpl_close(PurpleConnection *gc) { |
| 3732 | struct mwPurplePluginData *pd; | |
| 10977 | 3733 | |
| 3734 | g_return_if_fail(gc != NULL); | |
| 3735 | ||
| 3736 | pd = gc->proto_data; | |
| 3737 | g_return_if_fail(pd != NULL); | |
| 3738 | ||
| 3739 | /* get rid of the blist save timeout */ | |
| 3740 | if(pd->save_event) { | |
| 15884 | 3741 | purple_timeout_remove(pd->save_event); |
| 10977 | 3742 | pd->save_event = 0; |
| 3743 | blist_store(pd); | |
| 3744 | } | |
| 3745 | ||
| 3746 | /* stop the session */ | |
| 3747 | mwSession_stop(pd->session, 0x00); | |
| 3748 | ||
| 3749 | /* no longer necessary */ | |
| 3750 | gc->proto_data = NULL; | |
| 3751 | ||
| 3752 | /* stop watching the socket */ | |
| 3753 | if(gc->inpa) { | |
| 15884 | 3754 | purple_input_remove(gc->inpa); |
| 10977 | 3755 | gc->inpa = 0; |
| 3756 | } | |
| 3757 | ||
| 3758 | /* clean up the rest */ | |
| 15884 | 3759 | mwPurplePluginData_free(pd); |
| 10977 | 3760 | } |
| 3761 | ||
| 3762 | ||
|
12735
daa5dfe5e65a
[gaim-migrate @ 15080]
Christopher O'Brien <siege@pidgin.im>
parents:
12658
diff
changeset
|
3763 | static int mw_rand() { |
|
daa5dfe5e65a
[gaim-migrate @ 15080]
Christopher O'Brien <siege@pidgin.im>
parents:
12658
diff
changeset
|
3764 | static int seed = 0; |
|
daa5dfe5e65a
[gaim-migrate @ 15080]
Christopher O'Brien <siege@pidgin.im>
parents:
12658
diff
changeset
|
3765 | |
|
daa5dfe5e65a
[gaim-migrate @ 15080]
Christopher O'Brien <siege@pidgin.im>
parents:
12658
diff
changeset
|
3766 | /* for diversity, not security. don't touch */ |
|
daa5dfe5e65a
[gaim-migrate @ 15080]
Christopher O'Brien <siege@pidgin.im>
parents:
12658
diff
changeset
|
3767 | srand(time(NULL) ^ seed); |
|
daa5dfe5e65a
[gaim-migrate @ 15080]
Christopher O'Brien <siege@pidgin.im>
parents:
12658
diff
changeset
|
3768 | seed = rand(); |
|
daa5dfe5e65a
[gaim-migrate @ 15080]
Christopher O'Brien <siege@pidgin.im>
parents:
12658
diff
changeset
|
3769 | |
|
daa5dfe5e65a
[gaim-migrate @ 15080]
Christopher O'Brien <siege@pidgin.im>
parents:
12658
diff
changeset
|
3770 | return seed; |
|
daa5dfe5e65a
[gaim-migrate @ 15080]
Christopher O'Brien <siege@pidgin.im>
parents:
12658
diff
changeset
|
3771 | } |
|
daa5dfe5e65a
[gaim-migrate @ 15080]
Christopher O'Brien <siege@pidgin.im>
parents:
12658
diff
changeset
|
3772 | |
|
daa5dfe5e65a
[gaim-migrate @ 15080]
Christopher O'Brien <siege@pidgin.im>
parents:
12658
diff
changeset
|
3773 | |
|
11133
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
3774 | /** generates a random-ish content id string */ |
| 10977 | 3775 | static char *im_mime_content_id() { |
|
12524
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3776 | return g_strdup_printf("%03x@%05xmeanwhile", |
|
12735
daa5dfe5e65a
[gaim-migrate @ 15080]
Christopher O'Brien <siege@pidgin.im>
parents:
12658
diff
changeset
|
3777 | mw_rand() & 0xfff, mw_rand() & 0xfffff); |
| 10977 | 3778 | } |
| 3779 | ||
| 3780 | ||
|
11133
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
3781 | /** generates a multipart/related content type with a random-ish |
|
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
3782 | boundary value */ |
| 10977 | 3783 | static char *im_mime_content_type() { |
|
12422
53fba178cadf
[gaim-migrate @ 14729]
Richard Laager <rlaager@pidgin.im>
parents:
12312
diff
changeset
|
3784 | return g_strdup_printf("multipart/related; boundary=related_MW%03x_%04x", |
|
12735
daa5dfe5e65a
[gaim-migrate @ 15080]
Christopher O'Brien <siege@pidgin.im>
parents:
12658
diff
changeset
|
3785 | mw_rand() & 0xfff, mw_rand() & 0xffff); |
| 10977 | 3786 | } |
| 3787 | ||
| 3788 | ||
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3789 | /** determine content type from extension. Not so happy about this, |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3790 | but I don't want to actually write image type detection */ |
| 15884 | 3791 | static char *im_mime_img_content_type(PurpleStoredImage *img) { |
| 3792 | const char *fn = purple_imgstore_get_filename(img); | |
|
12105
5ab1009c4164
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3793 | const char *ct = NULL; |
|
5ab1009c4164
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3794 | |
|
5ab1009c4164
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3795 | ct = strrchr(fn, '.'); |
|
5ab1009c4164
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3796 | if(! ct) { |
|
5ab1009c4164
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3797 | ct = "image"; |
|
5ab1009c4164
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3798 | |
|
5ab1009c4164
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3799 | } else if(! strcmp(".png", ct)) { |
|
5ab1009c4164
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3800 | ct = "image/png"; |
|
5ab1009c4164
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3801 | |
|
5ab1009c4164
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3802 | } else if(! strcmp(".jpg", ct)) { |
|
5ab1009c4164
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3803 | ct = "image/jpeg"; |
|
5ab1009c4164
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3804 | |
|
5ab1009c4164
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3805 | } else if(! strcmp(".jpeg", ct)) { |
|
5ab1009c4164
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3806 | ct = "image/jpeg"; |
|
5ab1009c4164
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3807 | |
|
5ab1009c4164
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3808 | } else if(! strcmp(".gif", ct)) { |
|
5ab1009c4164
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3809 | ct = "image/gif"; |
| 10977 | 3810 | |
| 3811 | } else { | |
|
12105
5ab1009c4164
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3812 | ct = "image"; |
| 10977 | 3813 | } |
|
12105
5ab1009c4164
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3814 | |
|
5ab1009c4164
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3815 | return g_strdup_printf("%s; name=\"%s\"", ct, fn); |
| 10977 | 3816 | } |
| 3817 | ||
| 3818 | ||
| 15884 | 3819 | static char *im_mime_img_content_disp(PurpleStoredImage *img) { |
| 3820 | const char *fn = purple_imgstore_get_filename(img); | |
| 10977 | 3821 | return g_strdup_printf("attachment; filename=\"%s\"", fn); |
| 3822 | } | |
| 3823 | ||
| 3824 | ||
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3825 | /** turn an IM with embedded images into a multi-part mime document */ |
| 15884 | 3826 | static char *im_mime_convert(PurpleConnection *gc, |
|
12105
5ab1009c4164
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3827 | struct mwConversation *conv, |
|
5ab1009c4164
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3828 | const char *message) { |
| 10977 | 3829 | GString *str; |
| 15884 | 3830 | PurpleMimeDocument *doc; |
| 3831 | PurpleMimePart *part; | |
| 10977 | 3832 | |
| 3833 | GData *attr; | |
| 3834 | char *tmp, *start, *end; | |
| 3835 | ||
| 3836 | str = g_string_new(NULL); | |
| 3837 | ||
| 15884 | 3838 | doc = purple_mime_document_new(); |
| 3839 | ||
| 3840 | purple_mime_document_set_field(doc, "Mime-Version", "1.0"); | |
| 3841 | purple_mime_document_set_field(doc, "Content-Disposition", "inline"); | |
| 10977 | 3842 | |
| 3843 | tmp = im_mime_content_type(); | |
| 15884 | 3844 | purple_mime_document_set_field(doc, "Content-Type", tmp); |
| 10977 | 3845 | g_free(tmp); |
| 3846 | ||
| 3847 | tmp = (char *) message; | |
| 15884 | 3848 | while(*tmp && purple_markup_find_tag("img", tmp, (const char **) &start, |
| 10977 | 3849 | (const char **) &end, &attr)) { |
| 3850 | char *id; | |
| 15884 | 3851 | PurpleStoredImage *img = NULL; |
| 10977 | 3852 | |
| 3853 | gsize len = (start - tmp); | |
| 3854 | ||
| 3855 | /* append the in-between-tags text */ | |
| 3856 | if(len) g_string_append_len(str, tmp, len); | |
| 3857 | ||
| 3858 | /* find the imgstore data by the id tag */ | |
| 3859 | id = g_datalist_get_data(&attr, "id"); | |
| 3860 | if(id && *id) | |
|
16437
7ff7c3405ea2
Rework the buddy icon subsystem to use the imgstore subsystem, and modify the
Richard Laager <rlaager@pidgin.im>
parents:
16121
diff
changeset
|
3861 | img = purple_imgstore_find_by_id(atoi(id)); |
| 10977 | 3862 | |
| 3863 | if(img) { | |
| 3864 | char *cid; | |
| 3865 | gpointer data; | |
| 3866 | size_t size; | |
| 3867 | ||
| 15884 | 3868 | part = purple_mime_part_new(doc); |
| 10977 | 3869 | |
| 3870 | data = im_mime_img_content_disp(img); | |
| 15884 | 3871 | purple_mime_part_set_field(part, "Content-Disposition", data); |
| 10977 | 3872 | g_free(data); |
| 3873 | ||
|
12105
5ab1009c4164
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3874 | data = im_mime_img_content_type(img); |
| 15884 | 3875 | purple_mime_part_set_field(part, "Content-Type", data); |
|
12105
5ab1009c4164
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3876 | g_free(data); |
|
5ab1009c4164
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3877 | |
| 10977 | 3878 | cid = im_mime_content_id(); |
| 3879 | data = g_strdup_printf("<%s>", cid); | |
| 15884 | 3880 | purple_mime_part_set_field(part, "Content-ID", data); |
| 10977 | 3881 | g_free(data); |
| 3882 | ||
| 15884 | 3883 | purple_mime_part_set_field(part, "Content-transfer-encoding", "base64"); |
| 10977 | 3884 | |
| 3885 | /* obtain and base64 encode the image data, and put it in the | |
| 3886 | mime part */ | |
| 15884 | 3887 | size = purple_imgstore_get_size(img); |
|
16437
7ff7c3405ea2
Rework the buddy icon subsystem to use the imgstore subsystem, and modify the
Richard Laager <rlaager@pidgin.im>
parents:
16121
diff
changeset
|
3888 | data = purple_base64_encode(purple_imgstore_get_data(img), (gsize) size); |
| 15884 | 3889 | purple_mime_part_set_data(part, data); |
| 10977 | 3890 | g_free(data); |
| 3891 | ||
| 3892 | /* append the modified tag */ | |
| 3893 | g_string_append_printf(str, "<img src=\"cid:%s\">", cid); | |
| 3894 | g_free(cid); | |
| 3895 | ||
| 3896 | } else { | |
| 3897 | /* append the literal image tag, since we couldn't find a | |
| 3898 | relative imgstore object */ | |
| 3899 | gsize len = (end - start) + 1; | |
| 3900 | g_string_append_len(str, start, len); | |
| 3901 | } | |
| 3902 | ||
| 3903 | g_datalist_clear(&attr); | |
| 3904 | tmp = end + 1; | |
| 3905 | } | |
| 3906 | ||
| 3907 | /* append left-overs */ | |
| 3908 | g_string_append(str, tmp); | |
| 3909 | ||
|
12105
5ab1009c4164
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3910 | /* add the text/html part */ |
| 15884 | 3911 | part = purple_mime_part_new(doc); |
| 3912 | purple_mime_part_set_field(part, "Content-Disposition", "inline"); | |
| 3913 | ||
| 3914 | tmp = purple_utf8_ncr_encode(str->str); | |
| 3915 | purple_mime_part_set_field(part, "Content-Type", "text/html"); | |
| 3916 | purple_mime_part_set_field(part, "Content-Transfer-Encoding", "7bit"); | |
| 3917 | purple_mime_part_set_data(part, tmp); | |
|
12813
6f67cfa0e6a0
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
3918 | g_free(tmp); |
|
6f67cfa0e6a0
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
3919 | |
| 10977 | 3920 | g_string_free(str, TRUE); |
| 3921 | ||
| 3922 | str = g_string_new(NULL); | |
| 15884 | 3923 | purple_mime_document_write(doc, str); |
| 10977 | 3924 | tmp = str->str; |
| 3925 | g_string_free(str, FALSE); | |
| 3926 | ||
| 3927 | return tmp; | |
| 3928 | } | |
| 3929 | ||
| 3930 | ||
| 15884 | 3931 | static int mw_prpl_send_im(PurpleConnection *gc, |
| 10977 | 3932 | const char *name, |
| 3933 | const char *message, | |
| 15884 | 3934 | PurpleMessageFlags flags) { |
| 3935 | ||
| 3936 | struct mwPurplePluginData *pd; | |
| 10977 | 3937 | struct mwIdBlock who = { (char *) name, NULL }; |
| 3938 | struct mwConversation *conv; | |
| 3939 | ||
| 3940 | g_return_val_if_fail(gc != NULL, 0); | |
| 3941 | pd = gc->proto_data; | |
| 3942 | ||
| 3943 | g_return_val_if_fail(pd != NULL, 0); | |
| 3944 | ||
| 3945 | conv = mwServiceIm_getConversation(pd->srvc_im, &who); | |
| 3946 | ||
| 3947 | /* this detection of features to determine how to send the message | |
| 3948 | (plain, html, or mime) is flawed because the other end of the | |
| 3949 | conversation could close their channel at any time, rendering any | |
| 3950 | existing formatting in an outgoing message innapropriate. The end | |
| 3951 | result is that it may be possible that the other side of the | |
| 3952 | conversation will receive a plaintext message with html contents, | |
| 3953 | which is bad. I'm not sure how to fix this correctly. */ | |
| 3954 | ||
|
12105
5ab1009c4164
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3955 | if(strstr(message, "<img ") || strstr(message, "<IMG ")) |
| 15884 | 3956 | flags |= PURPLE_MESSAGE_IMAGES; |
| 10977 | 3957 | |
| 3958 | if(mwConversation_isOpen(conv)) { | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3959 | char *tmp; |
| 10977 | 3960 | int ret; |
| 3961 | ||
| 15884 | 3962 | if((flags & PURPLE_MESSAGE_IMAGES) && |
| 10977 | 3963 | mwConversation_supports(conv, mwImSend_MIME)) { |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3964 | /* send a MIME message */ |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3965 | |
|
12105
5ab1009c4164
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
3966 | tmp = im_mime_convert(gc, conv, message); |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3967 | ret = mwConversation_send(conv, mwImSend_MIME, tmp); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3968 | g_free(tmp); |
| 10977 | 3969 | |
| 3970 | } else if(mwConversation_supports(conv, mwImSend_HTML)) { | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3971 | /* send an HTML message */ |
| 10977 | 3972 | |
|
12813
6f67cfa0e6a0
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
3973 | char *ncr; |
| 15884 | 3974 | ncr = purple_utf8_ncr_encode(message); |
| 3975 | tmp = purple_strdup_withhtml(ncr); | |
|
12813
6f67cfa0e6a0
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
3976 | g_free(ncr); |
|
6f67cfa0e6a0
[gaim-migrate @ 15161]
Christopher O'Brien <siege@pidgin.im>
parents:
12742
diff
changeset
|
3977 | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3978 | ret = mwConversation_send(conv, mwImSend_HTML, tmp); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3979 | g_free(tmp); |
| 10977 | 3980 | |
| 3981 | } else { | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3982 | /* default to text */ |
| 15884 | 3983 | tmp = purple_markup_strip_html(message); |
|
12216
d80739091a63
[gaim-migrate @ 14518]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
12166
diff
changeset
|
3984 | ret = mwConversation_send(conv, mwImSend_PLAIN, tmp); |
|
12524
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
3985 | g_free(tmp); |
| 10977 | 3986 | } |
| 3987 | ||
| 3988 | return !ret; | |
|
11133
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
3989 | |
|
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
3990 | } else { |
|
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
3991 | |
|
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
3992 | /* queue up the message safely as plain text */ |
| 15884 | 3993 | char *tmp = purple_markup_strip_html(message); |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3994 | convo_queue(conv, mwImSend_PLAIN, tmp); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3995 | g_free(tmp); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
3996 | |
|
11133
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
3997 | if(! mwConversation_isPending(conv)) |
|
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
3998 | mwConversation_open(conv); |
|
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
3999 | |
|
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
4000 | return 1; |
| 10977 | 4001 | } |
| 4002 | } | |
| 4003 | ||
| 4004 | ||
| 15884 | 4005 | static unsigned int mw_prpl_send_typing(PurpleConnection *gc, |
|
14975
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
4006 | const char *name, |
| 15884 | 4007 | PurpleTypingState state) { |
| 10977 | 4008 | |
| 15884 | 4009 | struct mwPurplePluginData *pd; |
| 10977 | 4010 | struct mwIdBlock who = { (char *) name, NULL }; |
| 4011 | struct mwConversation *conv; | |
| 4012 | ||
|
13844
835b8f7b3d1d
[gaim-migrate @ 16295]
Mark Doliner <markdoliner@pidgin.im>
parents:
13779
diff
changeset
|
4013 | gpointer t = GINT_TO_POINTER(!! state); |
| 10977 | 4014 | |
| 4015 | g_return_val_if_fail(gc != NULL, 0); | |
| 4016 | pd = gc->proto_data; | |
| 4017 | ||
| 4018 | g_return_val_if_fail(pd != NULL, 0); | |
| 4019 | ||
| 4020 | conv = mwServiceIm_getConversation(pd->srvc_im, &who); | |
| 4021 | ||
|
14975
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
4022 | if(mwConversation_isOpen(conv)) { |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
4023 | mwConversation_send(conv, mwImSend_TYPING, t); |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
4024 | |
| 15884 | 4025 | } else if((state == PURPLE_TYPING) || (state == PURPLE_TYPED)) { |
|
14975
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
4026 | /* only open a channel for sending typing notification, not for |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
4027 | when typing has stopped. There's no point in re-opening a |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
4028 | channel just to tell someone that this side isn't typing. */ |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
4029 | |
| 10977 | 4030 | convo_queue(conv, mwImSend_TYPING, t); |
|
14975
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
4031 | |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
4032 | if(! mwConversation_isPending(conv)) { |
| 10977 | 4033 | mwConversation_open(conv); |
|
14975
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
4034 | } |
| 10977 | 4035 | } |
| 4036 | ||
|
14975
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
4037 | return 0; |
| 10977 | 4038 | } |
| 4039 | ||
| 4040 | ||
|
12311
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4041 | static const char *mw_client_name(guint16 type) { |
|
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4042 | switch(type) { |
|
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4043 | case mwLogin_LIB: |
|
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4044 | return "Lotus Binary Library"; |
|
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4045 | |
|
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4046 | case mwLogin_JAVA_WEB: |
|
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4047 | return "Lotus Java Client Applet"; |
|
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4048 | |
|
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4049 | case mwLogin_BINARY: |
|
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4050 | return "Lotus Sametime Connect"; |
|
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4051 | |
|
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4052 | case mwLogin_JAVA_APP: |
|
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4053 | return "Lotus Java Client Application"; |
|
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4054 | |
|
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4055 | case mwLogin_LINKS: |
|
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4056 | return "Lotus Sametime Links"; |
|
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4057 | |
|
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4058 | case mwLogin_NOTES_6_5: |
|
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4059 | case mwLogin_NOTES_6_5_3: |
|
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4060 | case mwLogin_NOTES_7_0_beta: |
|
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4061 | case mwLogin_NOTES_7_0: |
|
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4062 | return "Lotus Notes Client"; |
|
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4063 | |
|
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4064 | case mwLogin_ICT: |
|
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4065 | case mwLogin_ICT_1_7_8_2: |
|
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4066 | case mwLogin_ICT_SIP: |
|
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4067 | return "IBM Community Tools"; |
|
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4068 | |
|
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4069 | case mwLogin_NOTESBUDDY_4_14: |
|
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4070 | case mwLogin_NOTESBUDDY_4_15: |
|
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4071 | case mwLogin_NOTESBUDDY_4_16: |
|
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4072 | return "Alphaworks NotesBuddy"; |
|
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4073 | |
|
14975
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
4074 | case 0x1305: |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
4075 | case 0x1306: |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
4076 | case 0x1307: |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
4077 | return "Lotus Sametime Connect 7.5"; |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
4078 | |
|
12311
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4079 | case mwLogin_SANITY: |
|
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4080 | return "Sanity"; |
|
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4081 | |
|
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4082 | case mwLogin_ST_PERL: |
|
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4083 | return "ST-Send-Message"; |
|
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4084 | |
|
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4085 | case mwLogin_TRILLIAN: |
|
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4086 | case mwLogin_TRILLIAN_IBM: |
|
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4087 | return "Trillian"; |
|
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4088 | |
|
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4089 | case mwLogin_MEANWHILE: |
|
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4090 | return "Meanwhile"; |
|
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4091 | |
|
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4092 | default: |
|
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4093 | return NULL; |
|
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4094 | } |
|
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4095 | } |
|
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4096 | |
|
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
4097 | |
| 15884 | 4098 | static void mw_prpl_get_info(PurpleConnection *gc, const char *who) { |
| 10977 | 4099 | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4100 | struct mwAwareIdBlock idb = { mwAware_USER, (char *) who, NULL }; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4101 | |
| 15884 | 4102 | struct mwPurplePluginData *pd; |
| 4103 | PurpleAccount *acct; | |
| 4104 | PurpleBuddy *b; | |
| 4105 | PurpleNotifyUserInfo *user_info; | |
|
15205
f642029b2f97
[gaim-migrate @ 17929]
Evan Schoenberg <evands@pidgin.im>
parents:
14976
diff
changeset
|
4106 | char *tmp; |
|
f642029b2f97
[gaim-migrate @ 17929]
Evan Schoenberg <evands@pidgin.im>
parents:
14976
diff
changeset
|
4107 | const char *tmp2; |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4108 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4109 | g_return_if_fail(who != NULL); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4110 | g_return_if_fail(*who != '\0'); |
| 10977 | 4111 | |
| 4112 | pd = gc->proto_data; | |
| 4113 | ||
| 15884 | 4114 | acct = purple_connection_get_account(gc); |
| 4115 | b = purple_find_buddy(acct, who); | |
| 4116 | user_info = purple_notify_user_info_new(); | |
| 4117 | ||
| 4118 | if(purple_str_has_prefix(who, "@E ")) { | |
| 4119 | purple_notify_user_info_add_pair(user_info, _("External User"), NULL); | |
| 10977 | 4120 | } |
| 4121 | ||
| 15884 | 4122 | purple_notify_user_info_add_pair(user_info, _("User ID"), who); |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4123 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4124 | if(b) { |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4125 | guint32 type; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4126 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4127 | if(b->server_alias) { |
| 15884 | 4128 | purple_notify_user_info_add_pair(user_info, _("Full Name"), b->server_alias); |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4129 | } |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4130 | |
| 15884 | 4131 | type = purple_blist_node_get_int((PurpleBlistNode *) b, BUDDY_KEY_CLIENT); |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4132 | if(type) { |
|
15205
f642029b2f97
[gaim-migrate @ 17929]
Evan Schoenberg <evands@pidgin.im>
parents:
14976
diff
changeset
|
4133 | tmp = g_strdup(mw_client_name(type)); |
|
f642029b2f97
[gaim-migrate @ 17929]
Evan Schoenberg <evands@pidgin.im>
parents:
14976
diff
changeset
|
4134 | if (!tmp) |
|
f642029b2f97
[gaim-migrate @ 17929]
Evan Schoenberg <evands@pidgin.im>
parents:
14976
diff
changeset
|
4135 | tmp = g_strdup_printf(_("Unknown (0x%04x)<br>"), type); |
|
f642029b2f97
[gaim-migrate @ 17929]
Evan Schoenberg <evands@pidgin.im>
parents:
14976
diff
changeset
|
4136 | |
| 15884 | 4137 | purple_notify_user_info_add_pair(user_info, _("Last Known Client"), tmp); |
|
15205
f642029b2f97
[gaim-migrate @ 17929]
Evan Schoenberg <evands@pidgin.im>
parents:
14976
diff
changeset
|
4138 | |
|
f642029b2f97
[gaim-migrate @ 17929]
Evan Schoenberg <evands@pidgin.im>
parents:
14976
diff
changeset
|
4139 | g_free(tmp); |
| 10977 | 4140 | } |
| 4141 | } | |
|
15205
f642029b2f97
[gaim-migrate @ 17929]
Evan Schoenberg <evands@pidgin.im>
parents:
14976
diff
changeset
|
4142 | |
| 10977 | 4143 | tmp = user_supports_text(pd->srvc_aware, who); |
| 4144 | if(tmp) { | |
| 15884 | 4145 | purple_notify_user_info_add_pair(user_info, _("Supports"), tmp); |
|
15205
f642029b2f97
[gaim-migrate @ 17929]
Evan Schoenberg <evands@pidgin.im>
parents:
14976
diff
changeset
|
4146 | g_free(tmp); |
| 10977 | 4147 | } |
| 4148 | ||
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4149 | if(b) { |
| 15884 | 4150 | purple_notify_user_info_add_pair(user_info, _("Status"), status_text(b)); |
|
15205
f642029b2f97
[gaim-migrate @ 17929]
Evan Schoenberg <evands@pidgin.im>
parents:
14976
diff
changeset
|
4151 | |
|
f642029b2f97
[gaim-migrate @ 17929]
Evan Schoenberg <evands@pidgin.im>
parents:
14976
diff
changeset
|
4152 | /* XXX Is this adding a status message in its own section rather than with the "Status" label? */ |
|
f642029b2f97
[gaim-migrate @ 17929]
Evan Schoenberg <evands@pidgin.im>
parents:
14976
diff
changeset
|
4153 | tmp2 = mwServiceAware_getText(pd->srvc_aware, &idb); |
|
f642029b2f97
[gaim-migrate @ 17929]
Evan Schoenberg <evands@pidgin.im>
parents:
14976
diff
changeset
|
4154 | if(tmp2) { |
|
f642029b2f97
[gaim-migrate @ 17929]
Evan Schoenberg <evands@pidgin.im>
parents:
14976
diff
changeset
|
4155 | tmp = g_markup_escape_text(tmp2, -1); |
| 15884 | 4156 | purple_notify_user_info_add_section_break(user_info); |
| 4157 | purple_notify_user_info_add_pair(user_info, NULL, tmp); | |
|
15205
f642029b2f97
[gaim-migrate @ 17929]
Evan Schoenberg <evands@pidgin.im>
parents:
14976
diff
changeset
|
4158 | g_free(tmp); |
|
12496
788b20ccec91
[gaim-migrate @ 14808]
Christopher O'Brien <siege@pidgin.im>
parents:
12489
diff
changeset
|
4159 | } |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4160 | } |
| 10977 | 4161 | |
| 4162 | /* @todo emit a signal to allow a plugin to override the display of | |
| 4163 | this notification, so that it can create its own */ | |
| 4164 | ||
| 15884 | 4165 | purple_notify_userinfo(gc, who, user_info, NULL, NULL); |
| 4166 | purple_notify_user_info_destroy(user_info); | |
| 10977 | 4167 | } |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4168 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4169 | |
| 15884 | 4170 | static void mw_prpl_set_status(PurpleAccount *acct, PurpleStatus *status) { |
| 4171 | PurpleConnection *gc; | |
|
11638
1821b40269a3
[gaim-migrate @ 13914]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
11547
diff
changeset
|
4172 | const char *state; |
|
11641
554274717c25
[gaim-migrate @ 13918]
Richard Laager <rlaager@pidgin.im>
parents:
11638
diff
changeset
|
4173 | char *message = NULL; |
| 10977 | 4174 | struct mwSession *session; |
| 4175 | struct mwUserStatus stat; | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4176 | |
| 10977 | 4177 | g_return_if_fail(acct != NULL); |
| 15884 | 4178 | gc = purple_account_get_connection(acct); |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4179 | |
| 15884 | 4180 | state = purple_status_get_id(status); |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4181 | |
| 15884 | 4182 | DEBUG_INFO("Set status to %s\n", purple_status_get_name(status)); |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4183 | |
|
11638
1821b40269a3
[gaim-migrate @ 13914]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
11547
diff
changeset
|
4184 | g_return_if_fail(gc != NULL); |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4185 | |
| 10977 | 4186 | session = gc_to_session(gc); |
| 4187 | g_return_if_fail(session != NULL); | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4188 | |
| 10977 | 4189 | /* get a working copy of the current status */ |
| 4190 | mwUserStatus_clone(&stat, mwSession_getUserStatus(session)); | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4191 | |
| 10977 | 4192 | /* determine the state */ |
|
11638
1821b40269a3
[gaim-migrate @ 13914]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
11547
diff
changeset
|
4193 | if(! strcmp(state, MW_STATE_ACTIVE)) { |
| 10977 | 4194 | stat.status = mwStatus_ACTIVE; |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4195 | |
|
11638
1821b40269a3
[gaim-migrate @ 13914]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
11547
diff
changeset
|
4196 | } else if(! strcmp(state, MW_STATE_AWAY)) { |
|
1821b40269a3
[gaim-migrate @ 13914]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
11547
diff
changeset
|
4197 | stat.status = mwStatus_AWAY; |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4198 | |
|
11638
1821b40269a3
[gaim-migrate @ 13914]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
11547
diff
changeset
|
4199 | } else if(! strcmp(state, MW_STATE_BUSY)) { |
|
1821b40269a3
[gaim-migrate @ 13914]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
11547
diff
changeset
|
4200 | stat.status = mwStatus_BUSY; |
| 10977 | 4201 | } |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4202 | |
| 10977 | 4203 | /* determine the message */ |
| 15884 | 4204 | message = (char *) purple_status_get_attr_string(status, MW_STATE_MESSAGE); |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4205 | |
| 10977 | 4206 | if(message) { |
| 4207 | /* all the possible non-NULL values of message up to this point | |
| 4208 | are const, so we don't need to free them */ | |
| 15884 | 4209 | message = purple_markup_strip_html(message); |
| 10977 | 4210 | } |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4211 | |
| 10977 | 4212 | /* out with the old */ |
| 4213 | g_free(stat.desc); | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4214 | |
| 10977 | 4215 | /* in with the new */ |
| 4216 | stat.desc = (char *) message; | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4217 | |
| 10977 | 4218 | mwSession_setUserStatus(session, &stat); |
|
11638
1821b40269a3
[gaim-migrate @ 13914]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
11547
diff
changeset
|
4219 | mwUserStatus_clear(&stat); |
| 10977 | 4220 | } |
| 4221 | ||
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4222 | |
| 15884 | 4223 | static void mw_prpl_set_idle(PurpleConnection *gc, int t) { |
| 10977 | 4224 | struct mwSession *session; |
| 4225 | struct mwUserStatus stat; | |
|
12105
5ab1009c4164
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
4226 | |
|
5ab1009c4164
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
4227 | |
| 10977 | 4228 | session = gc_to_session(gc); |
| 4229 | g_return_if_fail(session != NULL); | |
|
12105
5ab1009c4164
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
4230 | |
| 10977 | 4231 | mwUserStatus_clone(&stat, mwSession_getUserStatus(session)); |
| 4232 | ||
|
12105
5ab1009c4164
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
4233 | if(t) { |
|
5ab1009c4164
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
4234 | time_t now = time(NULL); |
|
5ab1009c4164
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
4235 | stat.time = now - t; |
|
5ab1009c4164
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
4236 | |
|
5ab1009c4164
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
4237 | } else { |
|
5ab1009c4164
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
4238 | stat.time = 0; |
|
5ab1009c4164
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
4239 | } |
|
5ab1009c4164
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
4240 | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4241 | if(t > 0 && stat.status == mwStatus_ACTIVE) { |
|
12105
5ab1009c4164
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
4242 | /* we were active and went idle, so change the status to IDLE. */ |
| 10977 | 4243 | stat.status = mwStatus_IDLE; |
|
12105
5ab1009c4164
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
4244 | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4245 | } else if(t == 0 && stat.status == mwStatus_IDLE) { |
|
12105
5ab1009c4164
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
4246 | /* we only become idle automatically, so change back to ACTIVE */ |
| 10977 | 4247 | stat.status = mwStatus_ACTIVE; |
| 4248 | } | |
|
12105
5ab1009c4164
[gaim-migrate @ 14402]
Christopher O'Brien <siege@pidgin.im>
parents:
12088
diff
changeset
|
4249 | |
| 10977 | 4250 | mwSession_setUserStatus(session, &stat); |
| 4251 | mwUserStatus_clear(&stat); | |
|
12624
c1c92f08976b
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4252 | } |
|
c1c92f08976b
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4253 | |
|
c1c92f08976b
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4254 | |
| 15884 | 4255 | static void notify_im(PurpleConnection *gc, GList *row, void *user_data) { |
| 4256 | PurpleAccount *acct; | |
| 4257 | PurpleConversation *conv; | |
|
12624
c1c92f08976b
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4258 | char *id; |
|
c1c92f08976b
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4259 | |
| 15884 | 4260 | acct = purple_connection_get_account(gc); |
|
12631
b0e5f1ab374e
[gaim-migrate @ 14967]
Christopher O'Brien <siege@pidgin.im>
parents:
12630
diff
changeset
|
4261 | id = g_list_nth_data(row, 1); |
| 15884 | 4262 | conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, id, acct); |
| 4263 | if(! conv) conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, acct, id); | |
| 4264 | purple_conversation_present(conv); | |
| 4265 | } | |
| 4266 | ||
| 4267 | ||
| 4268 | static void notify_add(PurpleConnection *gc, GList *row, void *user_data) { | |
|
14975
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
4269 | BuddyAddData *data = user_data; |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
4270 | char *group_name = NULL; |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
4271 | |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
4272 | if (data && data->group) { |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
4273 | group_name = data->group->name; |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
4274 | } |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
4275 | |
| 15884 | 4276 | purple_blist_request_add_buddy(purple_connection_get_account(gc), |
|
14975
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
4277 | g_list_nth_data(row, 1), group_name, |
|
12624
c1c92f08976b
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4278 | g_list_nth_data(row, 0)); |
|
c1c92f08976b
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4279 | } |
|
c1c92f08976b
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4280 | |
|
c1c92f08976b
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4281 | |
|
c1c92f08976b
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4282 | static void notify_close(gpointer data) { |
|
14975
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
4283 | if (data) { |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
4284 | g_free(data); |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
4285 | } |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4286 | } |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4287 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4288 | |
| 10977 | 4289 | static void multi_resolved_query(struct mwResolveResult *result, |
| 15884 | 4290 | PurpleConnection *gc, gpointer data) { |
| 10977 | 4291 | GList *l; |
|
13107
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
4292 | const char *msgA; |
|
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
4293 | const char *msgB; |
|
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
4294 | char *msg; |
| 10977 | 4295 | |
| 15884 | 4296 | PurpleNotifySearchResults *sres; |
| 4297 | PurpleNotifySearchColumn *scol; | |
| 4298 | ||
| 4299 | sres = purple_notify_searchresults_new(); | |
| 4300 | ||
| 4301 | scol = purple_notify_searchresults_column_new(_("User Name")); | |
| 4302 | purple_notify_searchresults_column_add(sres, scol); | |
| 4303 | ||
| 4304 | scol = purple_notify_searchresults_column_new(_("Sametime ID")); | |
| 4305 | purple_notify_searchresults_column_add(sres, scol); | |
| 4306 | ||
| 4307 | purple_notify_searchresults_button_add(sres, PURPLE_NOTIFY_BUTTON_IM, | |
|
12624
c1c92f08976b
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4308 | notify_im); |
|
c1c92f08976b
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4309 | |
| 15884 | 4310 | purple_notify_searchresults_button_add(sres, PURPLE_NOTIFY_BUTTON_ADD, |
|
12624
c1c92f08976b
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4311 | notify_add); |
|
c1c92f08976b
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4312 | |
| 10977 | 4313 | for(l = result->matches; l; l = l->next) { |
| 4314 | struct mwResolveMatch *match = l->data; | |
|
12624
c1c92f08976b
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4315 | GList *row = NULL; |
|
12524
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
4316 | |
|
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
4317 | DEBUG_INFO("multi resolve: %s, %s\n", |
|
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
4318 | NSTR(match->id), NSTR(match->name)); |
|
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
4319 | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4320 | if(!match->id || !match->name) |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4321 | continue; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4322 | |
|
12624
c1c92f08976b
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4323 | row = g_list_append(row, g_strdup(match->name)); |
|
c1c92f08976b
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4324 | row = g_list_append(row, g_strdup(match->id)); |
| 15884 | 4325 | purple_notify_searchresults_row_add(sres, row); |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4326 | } |
| 10977 | 4327 | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4328 | msgA = _("An ambiguous user ID was entered"); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4329 | msgB = _("The identifier '%s' may possibly refer to any of the following" |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4330 | " users. Please select the correct user from the list below to" |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4331 | " add them to your buddy list."); |
|
13107
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
4332 | msg = g_strdup_printf(msgB, result->name); |
| 10977 | 4333 | |
| 15884 | 4334 | purple_notify_searchresults(gc, _("Select User"), |
|
14975
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
4335 | msgA, msg, sres, notify_close, data); |
|
13107
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
4336 | |
|
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
4337 | g_free(msg); |
| 10977 | 4338 | } |
| 4339 | ||
| 4340 | ||
| 4341 | static void add_buddy_resolved(struct mwServiceResolve *srvc, | |
| 4342 | guint32 id, guint32 code, GList *results, | |
| 4343 | gpointer b) { | |
| 4344 | ||
| 4345 | struct mwResolveResult *res = NULL; | |
|
14975
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
4346 | BuddyAddData *data = b; |
| 15884 | 4347 | PurpleBuddy *buddy = NULL; |
| 4348 | PurpleConnection *gc; | |
| 4349 | struct mwPurplePluginData *pd; | |
| 10977 | 4350 | |
|
16121
e5ad074a5f05
Avoid a possible NULL pointer dereference
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
15884
diff
changeset
|
4351 | g_return_if_fail(data != NULL); |
|
e5ad074a5f05
Avoid a possible NULL pointer dereference
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
15884
diff
changeset
|
4352 | |
|
e5ad074a5f05
Avoid a possible NULL pointer dereference
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
15884
diff
changeset
|
4353 | buddy = data->buddy; |
|
14975
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
4354 | |
| 15884 | 4355 | gc = purple_account_get_connection(buddy->account); |
| 10977 | 4356 | pd = gc->proto_data; |
| 4357 | ||
| 4358 | if(results) | |
| 4359 | res = results->data; | |
| 4360 | ||
| 4361 | if(!code && res && res->matches) { | |
| 4362 | if(g_list_length(res->matches) == 1) { | |
| 4363 | struct mwResolveMatch *match = res->matches->data; | |
| 4364 | ||
| 4365 | /* only one? that might be the right one! */ | |
| 4366 | if(strcmp(res->name, match->id)) { | |
| 4367 | /* uh oh, the single result isn't identical to the search | |
| 4368 | term, better safe then sorry, so let's make sure it's who | |
| 4369 | the user meant to add */ | |
| 15884 | 4370 | purple_blist_remove_buddy(buddy); |
|
14975
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
4371 | multi_resolved_query(res, gc, data); |
| 10977 | 4372 | |
| 4373 | } else { | |
|
12829
c7c8fa0b90db
[gaim-migrate @ 15177]
Christopher O'Brien <siege@pidgin.im>
parents:
12821
diff
changeset
|
4374 | |
|
12624
c1c92f08976b
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4375 | /* same person, set the server alias */ |
| 15884 | 4376 | purple_blist_server_alias_buddy(buddy, match->name); |
| 4377 | purple_blist_node_set_string((PurpleBlistNode *) buddy, | |
|
12624
c1c92f08976b
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4378 | BUDDY_KEY_NAME, match->name); |
|
12829
c7c8fa0b90db
[gaim-migrate @ 15177]
Christopher O'Brien <siege@pidgin.im>
parents:
12821
diff
changeset
|
4379 | |
|
c7c8fa0b90db
[gaim-migrate @ 15177]
Christopher O'Brien <siege@pidgin.im>
parents:
12821
diff
changeset
|
4380 | /* subscribe to awareness */ |
|
c7c8fa0b90db
[gaim-migrate @ 15177]
Christopher O'Brien <siege@pidgin.im>
parents:
12821
diff
changeset
|
4381 | buddy_add(pd, buddy); |
|
c7c8fa0b90db
[gaim-migrate @ 15177]
Christopher O'Brien <siege@pidgin.im>
parents:
12821
diff
changeset
|
4382 | |
|
12624
c1c92f08976b
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
4383 | blist_schedule(pd); |
|
14975
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
4384 | |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
4385 | g_free(data); |
| 10977 | 4386 | } |
| 4387 | ||
| 4388 | } else { | |
| 4389 | /* prompt user if more than one match was returned */ | |
| 15884 | 4390 | purple_blist_remove_buddy(buddy); |
|
14975
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
4391 | multi_resolved_query(res, gc, data); |
| 10977 | 4392 | } |
| 4393 | ||
| 4394 | return; | |
| 4395 | } | |
| 4396 | ||
|
14976
3f4e883a2766
[gaim-migrate @ 17686]
Christopher O'Brien <siege@pidgin.im>
parents:
14975
diff
changeset
|
4397 | #if 0 |
| 10977 | 4398 | /* fall-through indicates that we couldn't find a matching user in |
| 4399 | the resolve service (ether error or zero results), so we remove | |
| 4400 | this buddy */ | |
| 4401 | ||
|
14976
3f4e883a2766
[gaim-migrate @ 17686]
Christopher O'Brien <siege@pidgin.im>
parents:
14975
diff
changeset
|
4402 | /* note: I can't really think of a good reason to alter the buddy |
|
3f4e883a2766
[gaim-migrate @ 17686]
Christopher O'Brien <siege@pidgin.im>
parents:
14975
diff
changeset
|
4403 | list in any way. There has been at least one report where the |
|
3f4e883a2766
[gaim-migrate @ 17686]
Christopher O'Brien <siege@pidgin.im>
parents:
14975
diff
changeset
|
4404 | resolve service isn't returning correct results anyway, so let's |
|
3f4e883a2766
[gaim-migrate @ 17686]
Christopher O'Brien <siege@pidgin.im>
parents:
14975
diff
changeset
|
4405 | just leave them in the list. I'm just going to if0 this section |
|
3f4e883a2766
[gaim-migrate @ 17686]
Christopher O'Brien <siege@pidgin.im>
parents:
14975
diff
changeset
|
4406 | out unless I can think of a very good reason to do this. -siege */ |
|
3f4e883a2766
[gaim-migrate @ 17686]
Christopher O'Brien <siege@pidgin.im>
parents:
14975
diff
changeset
|
4407 | |
| 10977 | 4408 | DEBUG_INFO("no such buddy in community\n"); |
| 15884 | 4409 | purple_blist_remove_buddy(buddy); |
| 10977 | 4410 | blist_schedule(pd); |
| 4411 | ||
| 4412 | if(res && res->name) { | |
| 4413 | /* compose and display an error message */ | |
|
13107
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
4414 | const char *msgA; |
|
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
4415 | const char *msgB; |
|
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
4416 | char *msg; |
| 10977 | 4417 | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4418 | msgA = _("Unable to add user: user not found"); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4419 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4420 | msgB = _("The identifier '%s' did not match any users in your" |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4421 | " Sametime community. This entry has been removed from" |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4422 | " your buddy list."); |
|
13107
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
4423 | msg = g_strdup_printf(msgB, NSTR(res->name)); |
|
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
4424 | |
| 15884 | 4425 | purple_notify_error(gc, _("Unable to add user"), msgA, msg); |
|
13107
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
4426 | |
|
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
4427 | g_free(msg); |
| 10977 | 4428 | } |
|
14976
3f4e883a2766
[gaim-migrate @ 17686]
Christopher O'Brien <siege@pidgin.im>
parents:
14975
diff
changeset
|
4429 | #endif |
| 10977 | 4430 | } |
| 4431 | ||
| 4432 | ||
| 15884 | 4433 | static void mw_prpl_add_buddy(PurpleConnection *gc, |
| 4434 | PurpleBuddy *buddy, | |
| 4435 | PurpleGroup *group) { | |
| 4436 | ||
| 4437 | struct mwPurplePluginData *pd; | |
| 10977 | 4438 | struct mwServiceResolve *srvc; |
| 4439 | GList *query; | |
| 4440 | enum mwResolveFlag flags; | |
| 4441 | guint32 req; | |
| 4442 | ||
|
14975
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
4443 | BuddyAddData *data; |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
4444 | |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
4445 | data = g_new0(BuddyAddData, 1); |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
4446 | data->buddy = buddy; |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
4447 | data->group = group; |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
4448 | |
| 10977 | 4449 | pd = gc->proto_data; |
| 4450 | srvc = pd->srvc_resolve; | |
| 4451 | ||
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4452 | /* catch external buddies. They won't be in the resolve service */ |
|
12524
e9bf565601ad
[gaim-migrate @ 14836]
Christopher O'Brien <siege@pidgin.im>
parents:
12496
diff
changeset
|
4453 | if(buddy_is_external(buddy)) { |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4454 | buddy_add(pd, buddy); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4455 | return; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4456 | } |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4457 | |
| 10977 | 4458 | query = g_list_prepend(NULL, buddy->name); |
| 4459 | flags = mwResolveFlag_FIRST | mwResolveFlag_USERS; | |
| 4460 | ||
| 4461 | req = mwServiceResolve_resolve(srvc, query, flags, add_buddy_resolved, | |
|
14975
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
4462 | data, NULL); |
| 10977 | 4463 | g_list_free(query); |
| 4464 | ||
| 4465 | if(req == SEARCH_ERROR) { | |
| 15884 | 4466 | purple_blist_remove_buddy(buddy); |
| 10977 | 4467 | blist_schedule(pd); |
| 4468 | } | |
| 4469 | } | |
| 4470 | ||
| 4471 | ||
| 15884 | 4472 | static void foreach_add_buddies(PurpleGroup *group, GList *buddies, |
| 4473 | struct mwPurplePluginData *pd) { | |
| 10977 | 4474 | struct mwAwareList *list; |
| 4475 | ||
| 4476 | list = list_ensure(pd, group); | |
| 4477 | mwAwareList_addAware(list, buddies); | |
| 4478 | g_list_free(buddies); | |
| 4479 | } | |
| 4480 | ||
| 4481 | ||
| 15884 | 4482 | static void mw_prpl_add_buddies(PurpleConnection *gc, |
| 10977 | 4483 | GList *buddies, |
| 4484 | GList *groups) { | |
| 4485 | ||
| 15884 | 4486 | struct mwPurplePluginData *pd; |
| 10977 | 4487 | GHashTable *group_sets; |
| 4488 | struct mwAwareIdBlock *idbs, *idb; | |
| 4489 | ||
| 4490 | pd = gc->proto_data; | |
| 4491 | ||
| 15884 | 4492 | /* map PurpleGroup:GList of mwAwareIdBlock */ |
| 10977 | 4493 | group_sets = g_hash_table_new(g_direct_hash, g_direct_equal); |
| 4494 | ||
| 4495 | /* bunch of mwAwareIdBlock allocated at once, free'd at once */ | |
| 4496 | idb = idbs = g_new(struct mwAwareIdBlock, g_list_length(buddies)); | |
| 4497 | ||
| 4498 | /* first pass collects mwAwareIdBlock lists for each group */ | |
| 4499 | for(; buddies; buddies = buddies->next) { | |
| 15884 | 4500 | PurpleBuddy *b = buddies->data; |
| 4501 | PurpleGroup *g; | |
| 10977 | 4502 | const char *fn; |
| 4503 | GList *l; | |
| 4504 | ||
| 4505 | /* nab the saved server alias and stick it on the buddy */ | |
| 15884 | 4506 | fn = purple_blist_node_get_string((PurpleBlistNode *) b, BUDDY_KEY_NAME); |
| 4507 | purple_blist_server_alias_buddy(b, fn); | |
| 4508 | ||
| 4509 | /* convert PurpleBuddy into a mwAwareIdBlock */ | |
| 10977 | 4510 | idb->type = mwAware_USER; |
| 4511 | idb->user = (char *) b->name; | |
| 4512 | idb->community = NULL; | |
| 4513 | ||
| 4514 | /* put idb into the list associated with the buddy's group */ | |
| 15884 | 4515 | g = purple_buddy_get_group(b); |
| 10977 | 4516 | l = g_hash_table_lookup(group_sets, g); |
| 4517 | l = g_list_prepend(l, idb++); | |
| 4518 | g_hash_table_insert(group_sets, g, l); | |
| 4519 | } | |
| 4520 | ||
| 4521 | /* each group's buddies get added in one shot, and schedule the blist | |
| 4522 | for saving */ | |
| 4523 | g_hash_table_foreach(group_sets, (GHFunc) foreach_add_buddies, pd); | |
| 4524 | blist_schedule(pd); | |
| 4525 | ||
| 4526 | /* cleanup */ | |
| 4527 | g_hash_table_destroy(group_sets); | |
| 4528 | g_free(idbs); | |
| 4529 | } | |
| 4530 | ||
| 4531 | ||
| 15884 | 4532 | static void mw_prpl_remove_buddy(PurpleConnection *gc, |
| 4533 | PurpleBuddy *buddy, PurpleGroup *group) { | |
| 4534 | ||
| 4535 | struct mwPurplePluginData *pd; | |
| 10977 | 4536 | struct mwAwareIdBlock idb = { mwAware_USER, buddy->name, NULL }; |
| 4537 | struct mwAwareList *list; | |
| 4538 | ||
| 4539 | GList *rem = g_list_prepend(NULL, &idb); | |
| 4540 | ||
| 4541 | pd = gc->proto_data; | |
| 15884 | 4542 | group = purple_buddy_get_group(buddy); |
| 10977 | 4543 | list = list_ensure(pd, group); |
| 4544 | ||
| 4545 | mwAwareList_removeAware(list, rem); | |
| 4546 | blist_schedule(pd); | |
| 4547 | ||
| 4548 | g_list_free(rem); | |
| 4549 | } | |
| 4550 | ||
| 4551 | ||
| 4552 | static void privacy_fill(struct mwPrivacyInfo *priv, | |
| 4553 | GSList *members) { | |
| 4554 | ||
| 4555 | struct mwUserItem *u; | |
| 4556 | guint count; | |
| 4557 | ||
| 4558 | count = g_slist_length(members); | |
|
11133
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
4559 | DEBUG_INFO("privacy_fill: %u members\n", count); |
| 10977 | 4560 | |
| 4561 | priv->count = count; | |
| 4562 | priv->users = g_new0(struct mwUserItem, count); | |
| 4563 | ||
| 4564 | while(count--) { | |
| 4565 | u = priv->users + count; | |
| 4566 | u->id = members->data; | |
| 4567 | members = members->next; | |
| 4568 | } | |
| 4569 | } | |
| 4570 | ||
| 4571 | ||
| 15884 | 4572 | static void mw_prpl_set_permit_deny(PurpleConnection *gc) { |
| 4573 | PurpleAccount *acct; | |
| 4574 | struct mwPurplePluginData *pd; | |
| 10977 | 4575 | struct mwSession *session; |
| 4576 | ||
| 4577 | struct mwPrivacyInfo privacy = { | |
|
17153
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
4578 | FALSE, /* deny */ |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
4579 | 0, /* count */ |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
4580 | NULL, /* users */ |
| 10977 | 4581 | }; |
| 4582 | ||
| 4583 | g_return_if_fail(gc != NULL); | |
| 4584 | ||
| 15884 | 4585 | acct = purple_connection_get_account(gc); |
| 10977 | 4586 | g_return_if_fail(acct != NULL); |
| 4587 | ||
| 4588 | pd = gc->proto_data; | |
| 4589 | g_return_if_fail(pd != NULL); | |
| 4590 | ||
| 4591 | session = pd->session; | |
| 4592 | g_return_if_fail(session != NULL); | |
| 4593 | ||
| 4594 | switch(acct->perm_deny) { | |
| 15884 | 4595 | case PURPLE_PRIVACY_DENY_USERS: |
| 4596 | DEBUG_INFO("PURPLE_PRIVACY_DENY_USERS\n"); | |
| 10977 | 4597 | privacy_fill(&privacy, acct->deny); |
|
11133
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
4598 | privacy.deny = TRUE; |
|
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
4599 | break; |
| 10977 | 4600 | |
| 15884 | 4601 | case PURPLE_PRIVACY_ALLOW_ALL: |
| 4602 | DEBUG_INFO("PURPLE_PRIVACY_ALLOW_ALL\n"); | |
| 10977 | 4603 | privacy.deny = TRUE; |
| 4604 | break; | |
| 4605 | ||
| 15884 | 4606 | case PURPLE_PRIVACY_ALLOW_USERS: |
| 4607 | DEBUG_INFO("PURPLE_PRIVACY_ALLOW_USERS\n"); | |
| 10977 | 4608 | privacy_fill(&privacy, acct->permit); |
|
11133
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
4609 | privacy.deny = FALSE; |
|
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
4610 | break; |
| 10977 | 4611 | |
| 15884 | 4612 | case PURPLE_PRIVACY_DENY_ALL: |
| 4613 | DEBUG_INFO("PURPLE_PRIVACY_DENY_ALL\n"); | |
| 10977 | 4614 | privacy.deny = FALSE; |
| 4615 | break; | |
| 4616 | ||
| 4617 | default: | |
| 4618 | DEBUG_INFO("acct->perm_deny is 0x%x\n", acct->perm_deny); | |
|
11133
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
4619 | return; |
| 10977 | 4620 | } |
| 4621 | ||
| 4622 | mwSession_setPrivacyInfo(session, &privacy); | |
| 4623 | g_free(privacy.users); | |
| 4624 | } | |
| 4625 | ||
| 4626 | ||
| 15884 | 4627 | static void mw_prpl_add_permit(PurpleConnection *gc, const char *name) { |
| 10977 | 4628 | mw_prpl_set_permit_deny(gc); |
| 4629 | } | |
| 4630 | ||
| 4631 | ||
| 15884 | 4632 | static void mw_prpl_add_deny(PurpleConnection *gc, const char *name) { |
| 10977 | 4633 | mw_prpl_set_permit_deny(gc); |
| 4634 | } | |
| 4635 | ||
| 4636 | ||
| 15884 | 4637 | static void mw_prpl_rem_permit(PurpleConnection *gc, const char *name) { |
| 10977 | 4638 | mw_prpl_set_permit_deny(gc); |
| 4639 | } | |
| 4640 | ||
| 4641 | ||
| 15884 | 4642 | static void mw_prpl_rem_deny(PurpleConnection *gc, const char *name) { |
| 10977 | 4643 | mw_prpl_set_permit_deny(gc); |
| 4644 | } | |
| 4645 | ||
| 4646 | ||
| 4647 | static struct mwConference *conf_find(struct mwServiceConference *srvc, | |
| 4648 | const char *name) { | |
| 4649 | GList *l, *ll; | |
| 4650 | struct mwConference *conf = NULL; | |
| 4651 | ||
| 4652 | ll = mwServiceConference_getConferences(srvc); | |
| 4653 | for(l = ll; l; l = l->next) { | |
| 4654 | struct mwConference *c = l->data; | |
| 4655 | if(! strcmp(name, mwConference_getName(c))) { | |
| 4656 | conf = c; | |
| 4657 | break; | |
| 4658 | } | |
| 4659 | } | |
| 4660 | g_list_free(ll); | |
| 4661 | ||
| 4662 | return conf; | |
| 4663 | } | |
| 4664 | ||
| 4665 | ||
| 15884 | 4666 | static void mw_prpl_join_chat(PurpleConnection *gc, |
| 10977 | 4667 | GHashTable *components) { |
| 4668 | ||
| 15884 | 4669 | struct mwPurplePluginData *pd; |
| 10977 | 4670 | char *c, *t; |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4671 | |
| 10977 | 4672 | pd = gc->proto_data; |
| 4673 | ||
| 4674 | c = g_hash_table_lookup(components, CHAT_KEY_NAME); | |
| 4675 | t = g_hash_table_lookup(components, CHAT_KEY_TOPIC); | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4676 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4677 | if(g_hash_table_lookup(components, CHAT_KEY_IS_PLACE)) { |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4678 | /* use place service */ |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4679 | struct mwServicePlace *srvc; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4680 | struct mwPlace *place = NULL; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4681 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4682 | srvc = pd->srvc_place; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4683 | place = mwPlace_new(srvc, c, t); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4684 | mwPlace_open(place); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4685 | |
| 10977 | 4686 | } else { |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4687 | /* use conference service */ |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4688 | struct mwServiceConference *srvc; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4689 | struct mwConference *conf = NULL; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4690 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4691 | srvc = pd->srvc_conf; |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4692 | if(c) conf = conf_find(srvc, c); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4693 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4694 | if(conf) { |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4695 | DEBUG_INFO("accepting conference invitation\n"); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4696 | mwConference_accept(conf); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4697 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4698 | } else { |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4699 | DEBUG_INFO("creating new conference\n"); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4700 | conf = mwConference_new(srvc, t); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4701 | mwConference_open(conf); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4702 | } |
| 10977 | 4703 | } |
| 4704 | } | |
| 4705 | ||
| 4706 | ||
| 15884 | 4707 | static void mw_prpl_reject_chat(PurpleConnection *gc, |
| 10977 | 4708 | GHashTable *components) { |
| 4709 | ||
| 15884 | 4710 | struct mwPurplePluginData *pd; |
| 10977 | 4711 | struct mwServiceConference *srvc; |
| 4712 | char *c; | |
| 4713 | ||
| 4714 | pd = gc->proto_data; | |
| 4715 | srvc = pd->srvc_conf; | |
| 4716 | ||
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4717 | if(g_hash_table_lookup(components, CHAT_KEY_IS_PLACE)) { |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4718 | ; /* nothing needs doing */ |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4719 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4720 | } else { |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4721 | /* reject conference */ |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4722 | c = g_hash_table_lookup(components, CHAT_KEY_NAME); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4723 | if(c) { |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4724 | struct mwConference *conf = conf_find(srvc, c); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4725 | if(conf) mwConference_reject(conf, ERR_SUCCESS, "Declined"); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4726 | } |
| 10977 | 4727 | } |
| 4728 | } | |
| 4729 | ||
| 4730 | ||
| 4731 | static char *mw_prpl_get_chat_name(GHashTable *components) { | |
| 4732 | return g_hash_table_lookup(components, CHAT_KEY_NAME); | |
| 4733 | } | |
| 4734 | ||
| 4735 | ||
| 15884 | 4736 | static void mw_prpl_chat_invite(PurpleConnection *gc, |
| 10977 | 4737 | int id, |
| 4738 | const char *invitation, | |
| 4739 | const char *who) { | |
| 4740 | ||
| 15884 | 4741 | struct mwPurplePluginData *pd; |
| 10977 | 4742 | struct mwConference *conf; |
|
12107
f14b83c0df1e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
4743 | struct mwPlace *place; |
| 10977 | 4744 | struct mwIdBlock idb = { (char *) who, NULL }; |
| 4745 | ||
| 4746 | pd = gc->proto_data; | |
| 4747 | g_return_if_fail(pd != NULL); | |
|
12107
f14b83c0df1e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
4748 | |
| 10977 | 4749 | conf = ID_TO_CONF(pd, id); |
| 4750 | ||
|
12107
f14b83c0df1e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
4751 | if(conf) { |
|
f14b83c0df1e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
4752 | mwConference_invite(conf, &idb, invitation); |
|
f14b83c0df1e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
4753 | return; |
|
f14b83c0df1e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
4754 | } |
|
f14b83c0df1e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
4755 | |
|
f14b83c0df1e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
4756 | place = ID_TO_PLACE(pd, id); |
|
f14b83c0df1e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
4757 | g_return_if_fail(place != NULL); |
|
f14b83c0df1e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
4758 | |
|
f14b83c0df1e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
4759 | /* @todo: use the IM service for invitation */ |
|
f14b83c0df1e
[gaim-migrate @ 14405]
Christopher O'Brien <siege@pidgin.im>
parents:
12105
diff
changeset
|
4760 | mwPlace_legacyInvite(place, &idb, invitation); |
| 10977 | 4761 | } |
| 4762 | ||
| 4763 | ||
| 15884 | 4764 | static void mw_prpl_chat_leave(PurpleConnection *gc, |
| 10977 | 4765 | int id) { |
| 4766 | ||
| 15884 | 4767 | struct mwPurplePluginData *pd; |
| 10977 | 4768 | struct mwConference *conf; |
| 4769 | ||
| 4770 | pd = gc->proto_data; | |
| 4771 | ||
| 4772 | g_return_if_fail(pd != NULL); | |
| 4773 | conf = ID_TO_CONF(pd, id); | |
| 4774 | ||
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4775 | if(conf) { |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4776 | mwConference_destroy(conf, ERR_SUCCESS, "Leaving"); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4777 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4778 | } else { |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4779 | struct mwPlace *place = ID_TO_PLACE(pd, id); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4780 | g_return_if_fail(place != NULL); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4781 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4782 | mwPlace_destroy(place, ERR_SUCCESS); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4783 | } |
| 10977 | 4784 | } |
| 4785 | ||
| 4786 | ||
| 15884 | 4787 | static void mw_prpl_chat_whisper(PurpleConnection *gc, |
| 10977 | 4788 | int id, |
| 4789 | const char *who, | |
| 4790 | const char *message) { | |
| 4791 | ||
| 4792 | mw_prpl_send_im(gc, who, message, 0); | |
| 4793 | } | |
| 4794 | ||
| 4795 | ||
| 15884 | 4796 | static int mw_prpl_chat_send(PurpleConnection *gc, |
| 10977 | 4797 | int id, |
|
12216
d80739091a63
[gaim-migrate @ 14518]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
12166
diff
changeset
|
4798 | const char *message, |
| 15884 | 4799 | PurpleMessageFlags flags) { |
| 4800 | ||
| 4801 | struct mwPurplePluginData *pd; | |
| 10977 | 4802 | struct mwConference *conf; |
|
14975
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
4803 | char *msg; |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
4804 | int ret; |
| 10977 | 4805 | |
| 4806 | pd = gc->proto_data; | |
| 4807 | ||
| 4808 | g_return_val_if_fail(pd != NULL, 0); | |
| 4809 | conf = ID_TO_CONF(pd, id); | |
| 4810 | ||
| 15884 | 4811 | msg = purple_markup_strip_html(message); |
|
14975
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
4812 | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4813 | if(conf) { |
|
15772
8e23d860430a
sf patch #1655707, from David Everly
Mark Doliner <markdoliner@pidgin.im>
parents:
15524
diff
changeset
|
4814 | ret = ! mwConference_sendText(conf, msg); |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4815 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4816 | } else { |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4817 | struct mwPlace *place = ID_TO_PLACE(pd, id); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4818 | g_return_val_if_fail(place != NULL, 0); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4819 | |
|
15772
8e23d860430a
sf patch #1655707, from David Everly
Mark Doliner <markdoliner@pidgin.im>
parents:
15524
diff
changeset
|
4820 | ret = ! mwPlace_sendText(place, msg); |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
4821 | } |
|
14975
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
4822 | |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
4823 | g_free(msg); |
|
b177e7cbc8d8
[gaim-migrate @ 17685]
Christopher O'Brien <siege@pidgin.im>
parents:
14899
diff
changeset
|
4824 | return ret; |
| 10977 | 4825 | } |
| 4826 | ||
| 4827 | ||
| 15884 | 4828 | static void mw_prpl_keepalive(PurpleConnection *gc) { |
| 10977 | 4829 | struct mwSession *session; |
| 4830 | ||
| 4831 | g_return_if_fail(gc != NULL); | |
| 4832 | ||
| 4833 | session = gc_to_session(gc); | |
| 4834 | g_return_if_fail(session != NULL); | |
| 4835 | ||
| 4836 | mwSession_sendKeepalive(session); | |
| 4837 | } | |
| 4838 | ||
| 4839 | ||
| 15884 | 4840 | static void mw_prpl_alias_buddy(PurpleConnection *gc, |
| 10977 | 4841 | const char *who, |
| 4842 | const char *alias) { | |
| 4843 | ||
| 15884 | 4844 | struct mwPurplePluginData *pd = gc->proto_data; |
| 10977 | 4845 | g_return_if_fail(pd != NULL); |
| 4846 | ||
| 4847 | /* it's a change to the buddy list, so we've gotta reflect that in | |
| 4848 | the server copy */ | |
| 4849 | ||
| 4850 | blist_schedule(pd); | |
| 4851 | } | |
| 4852 | ||
| 4853 | ||
| 15884 | 4854 | static void mw_prpl_group_buddy(PurpleConnection *gc, |
| 10977 | 4855 | const char *who, |
| 4856 | const char *old_group, | |
| 4857 | const char *new_group) { | |
| 4858 | ||
| 4859 | struct mwAwareIdBlock idb = { mwAware_USER, (char *) who, NULL }; | |
| 4860 | GList *gl = g_list_prepend(NULL, &idb); | |
| 4861 | ||
| 15884 | 4862 | struct mwPurplePluginData *pd = gc->proto_data; |
| 4863 | PurpleGroup *group; | |
| 10977 | 4864 | struct mwAwareList *list; |
| 4865 | ||
| 4866 | /* add who to new_group's aware list */ | |
| 15884 | 4867 | group = purple_find_group(new_group); |
| 10977 | 4868 | list = list_ensure(pd, group); |
| 4869 | mwAwareList_addAware(list, gl); | |
| 4870 | ||
| 4871 | /* remove who from old_group's aware list */ | |
| 15884 | 4872 | group = purple_find_group(old_group); |
| 10977 | 4873 | list = list_ensure(pd, group); |
| 4874 | mwAwareList_removeAware(list, gl); | |
| 4875 | ||
| 4876 | g_list_free(gl); | |
| 4877 | ||
| 4878 | /* schedule the changes to be saved */ | |
| 4879 | blist_schedule(pd); | |
| 4880 | } | |
| 4881 | ||
| 4882 | ||
| 15884 | 4883 | static void mw_prpl_rename_group(PurpleConnection *gc, |
| 10977 | 4884 | const char *old, |
| 15884 | 4885 | PurpleGroup *group, |
| 10977 | 4886 | GList *buddies) { |
| 4887 | ||
| 15884 | 4888 | struct mwPurplePluginData *pd = gc->proto_data; |
| 10977 | 4889 | g_return_if_fail(pd != NULL); |
| 4890 | ||
| 4891 | /* it's a change in the buddy list, so we've gotta reflect that in | |
| 4892 | the server copy. Also, having this function should prevent all | |
| 4893 | those buddies from being removed and re-added. We don't really | |
| 15884 | 4894 | give a crap what the group is named in Purple other than to record |
| 10977 | 4895 | that as the group name/alias */ |
| 4896 | ||
| 4897 | blist_schedule(pd); | |
| 4898 | } | |
| 4899 | ||
| 4900 | ||
| 15884 | 4901 | static void mw_prpl_buddy_free(PurpleBuddy *buddy) { |
| 10977 | 4902 | /* I don't think we have any cleanup for buddies yet */ |
| 4903 | ; | |
| 4904 | } | |
| 4905 | ||
| 4906 | ||
| 15884 | 4907 | static void mw_prpl_convo_closed(PurpleConnection *gc, const char *who) { |
| 4908 | struct mwPurplePluginData *pd = gc->proto_data; | |
| 10977 | 4909 | struct mwServiceIm *srvc; |
| 4910 | struct mwConversation *conv; | |
| 4911 | struct mwIdBlock idb = { (char *) who, NULL }; | |
| 4912 | ||
| 4913 | g_return_if_fail(pd != NULL); | |
| 4914 | ||
| 4915 | srvc = pd->srvc_im; | |
| 4916 | g_return_if_fail(srvc != NULL); | |
| 4917 | ||
| 4918 | conv = mwServiceIm_findConversation(srvc, &idb); | |
| 4919 | if(! conv) return; | |
| 4920 | ||
| 4921 | if(mwConversation_isOpen(conv)) | |
| 4922 | mwConversation_free(conv); | |
| 4923 | } | |
| 4924 | ||
| 4925 | ||
| 15884 | 4926 | static const char *mw_prpl_normalize(const PurpleAccount *account, |
| 10977 | 4927 | const char *id) { |
| 4928 | ||
| 4929 | /* code elsewhere assumes that the return value points to different | |
| 4930 | memory than the passed value, but it won't free the normalized | |
| 4931 | data. wtf? */ | |
| 4932 | ||
| 4933 | static char buf[BUF_LEN]; | |
| 4934 | strncpy(buf, id, sizeof(buf)); | |
| 4935 | return buf; | |
| 4936 | } | |
| 4937 | ||
| 4938 | ||
| 15884 | 4939 | static void mw_prpl_remove_group(PurpleConnection *gc, PurpleGroup *group) { |
| 4940 | struct mwPurplePluginData *pd; | |
| 10977 | 4941 | struct mwAwareList *list; |
| 4942 | ||
| 4943 | pd = gc->proto_data; | |
| 4944 | g_return_if_fail(pd != NULL); | |
| 4945 | g_return_if_fail(pd->group_list_map != NULL); | |
| 4946 | ||
| 4947 | list = g_hash_table_lookup(pd->group_list_map, group); | |
| 4948 | ||
| 4949 | if(list) { | |
| 4950 | g_hash_table_remove(pd->group_list_map, list); | |
| 4951 | g_hash_table_remove(pd->group_list_map, group); | |
| 4952 | mwAwareList_free(list); | |
| 4953 | ||
| 4954 | blist_schedule(pd); | |
| 4955 | } | |
| 4956 | } | |
| 4957 | ||
| 4958 | ||
| 15884 | 4959 | static gboolean mw_prpl_can_receive_file(PurpleConnection *gc, |
| 10977 | 4960 | const char *who) { |
| 15884 | 4961 | struct mwPurplePluginData *pd; |
| 10977 | 4962 | struct mwServiceAware *srvc; |
| 15884 | 4963 | PurpleAccount *acct; |
| 10977 | 4964 | |
| 4965 | g_return_val_if_fail(gc != NULL, FALSE); | |
| 4966 | ||
| 4967 | pd = gc->proto_data; | |
| 4968 | g_return_val_if_fail(pd != NULL, FALSE); | |
| 4969 | ||
| 4970 | srvc = pd->srvc_aware; | |
| 4971 | g_return_val_if_fail(srvc != NULL, FALSE); | |
| 4972 | ||
| 15884 | 4973 | acct = purple_connection_get_account(gc); |
| 10977 | 4974 | g_return_val_if_fail(acct != NULL, FALSE); |
| 4975 | ||
| 15884 | 4976 | return purple_find_buddy(acct, who) && |
| 10977 | 4977 | user_supports(srvc, who, mwAttribute_FILE_TRANSFER); |
| 4978 | } | |
| 4979 | ||
| 4980 | ||
| 15884 | 4981 | static void ft_outgoing_init(PurpleXfer *xfer) { |
| 4982 | PurpleAccount *acct; | |
| 4983 | PurpleConnection *gc; | |
| 4984 | ||
| 4985 | struct mwPurplePluginData *pd; | |
| 10977 | 4986 | struct mwServiceFileTransfer *srvc; |
| 4987 | struct mwFileTransfer *ft; | |
| 4988 | ||
| 4989 | const char *filename; | |
| 4990 | gsize filesize; | |
| 4991 | FILE *fp; | |
| 4992 | ||
| 4993 | struct mwIdBlock idb = { NULL, NULL }; | |
| 4994 | ||
| 4995 | DEBUG_INFO("ft_outgoing_init\n"); | |
| 4996 | ||
| 15884 | 4997 | acct = purple_xfer_get_account(xfer); |
| 4998 | gc = purple_account_get_connection(acct); | |
| 10977 | 4999 | pd = gc->proto_data; |
| 5000 | srvc = pd->srvc_ft; | |
| 5001 | ||
| 15884 | 5002 | filename = purple_xfer_get_local_filename(xfer); |
| 5003 | filesize = purple_xfer_get_size(xfer); | |
| 10977 | 5004 | idb.user = xfer->who; |
| 5005 | ||
| 15884 | 5006 | purple_xfer_update_progress(xfer); |
|
13208
3e9365fcfd0e
[gaim-migrate @ 15571]
Christopher O'Brien <siege@pidgin.im>
parents:
13206
diff
changeset
|
5007 | |
| 10977 | 5008 | /* test that we can actually send the file */ |
| 5009 | fp = g_fopen(filename, "rb"); | |
| 5010 | if(! fp) { | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5011 | char *msg = g_strdup_printf(_("Error reading file %s: \n%s\n"), |
| 10977 | 5012 | filename, strerror(errno)); |
| 15884 | 5013 | purple_xfer_error(purple_xfer_get_type(xfer), acct, xfer->who, msg); |
| 10977 | 5014 | g_free(msg); |
| 5015 | return; | |
| 5016 | } | |
| 5017 | fclose(fp); | |
| 5018 | ||
| 5019 | { | |
| 5020 | char *tmp = strrchr(filename, G_DIR_SEPARATOR); | |
| 5021 | if(tmp++) filename = tmp; | |
| 5022 | } | |
| 5023 | ||
| 5024 | ft = mwFileTransfer_new(srvc, &idb, NULL, filename, filesize); | |
| 5025 | ||
| 15884 | 5026 | purple_xfer_ref(xfer); |
| 5027 | mwFileTransfer_setClientData(ft, xfer, (GDestroyNotify) purple_xfer_unref); | |
| 10977 | 5028 | xfer->data = ft; |
| 5029 | ||
| 5030 | mwFileTransfer_offer(ft); | |
| 5031 | } | |
| 5032 | ||
| 5033 | ||
| 15884 | 5034 | static void ft_outgoing_cancel(PurpleXfer *xfer) { |
| 10977 | 5035 | struct mwFileTransfer *ft = xfer->data; |
|
13208
3e9365fcfd0e
[gaim-migrate @ 15571]
Christopher O'Brien <siege@pidgin.im>
parents:
13206
diff
changeset
|
5036 | |
|
3e9365fcfd0e
[gaim-migrate @ 15571]
Christopher O'Brien <siege@pidgin.im>
parents:
13206
diff
changeset
|
5037 | DEBUG_INFO("ft_outgoing_cancel called\n"); |
|
3e9365fcfd0e
[gaim-migrate @ 15571]
Christopher O'Brien <siege@pidgin.im>
parents:
13206
diff
changeset
|
5038 | |
| 10977 | 5039 | if(ft) mwFileTransfer_cancel(ft); |
| 5040 | } | |
| 5041 | ||
| 5042 | ||
| 15884 | 5043 | static PurpleXfer *mw_prpl_new_xfer(PurpleConnection *gc, const char *who) { |
| 5044 | PurpleAccount *acct; | |
| 5045 | PurpleXfer *xfer; | |
| 5046 | ||
| 5047 | acct = purple_connection_get_account(gc); | |
| 5048 | ||
| 5049 | xfer = purple_xfer_new(acct, PURPLE_XFER_SEND, who); | |
|
15345
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
15205
diff
changeset
|
5050 | if (xfer) |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
15205
diff
changeset
|
5051 | { |
| 15884 | 5052 | purple_xfer_set_init_fnc(xfer, ft_outgoing_init); |
| 5053 | purple_xfer_set_cancel_send_fnc(xfer, ft_outgoing_cancel); | |
|
15345
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
15205
diff
changeset
|
5054 | } |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
15205
diff
changeset
|
5055 | |
|
12143
09f216663302
[gaim-migrate @ 14444]
Evan Schoenberg <evands@pidgin.im>
parents:
12135
diff
changeset
|
5056 | return xfer; |
|
09f216663302
[gaim-migrate @ 14444]
Evan Schoenberg <evands@pidgin.im>
parents:
12135
diff
changeset
|
5057 | } |
|
09f216663302
[gaim-migrate @ 14444]
Evan Schoenberg <evands@pidgin.im>
parents:
12135
diff
changeset
|
5058 | |
| 15884 | 5059 | static void mw_prpl_send_file(PurpleConnection *gc, |
|
12143
09f216663302
[gaim-migrate @ 14444]
Evan Schoenberg <evands@pidgin.im>
parents:
12135
diff
changeset
|
5060 | const char *who, const char *file) { |
|
09f216663302
[gaim-migrate @ 14444]
Evan Schoenberg <evands@pidgin.im>
parents:
12135
diff
changeset
|
5061 | |
| 15884 | 5062 | PurpleXfer *xfer = mw_prpl_new_xfer(gc, who); |
|
12143
09f216663302
[gaim-migrate @ 14444]
Evan Schoenberg <evands@pidgin.im>
parents:
12135
diff
changeset
|
5063 | |
| 10977 | 5064 | if(file) { |
| 5065 | DEBUG_INFO("file != NULL\n"); | |
| 15884 | 5066 | purple_xfer_request_accepted(xfer, file); |
| 10977 | 5067 | |
| 5068 | } else { | |
| 5069 | DEBUG_INFO("file == NULL\n"); | |
| 15884 | 5070 | purple_xfer_request(xfer); |
| 10977 | 5071 | } |
| 5072 | } | |
| 5073 | ||
| 5074 | ||
| 15884 | 5075 | static PurplePluginProtocolInfo mw_prpl_info = { |
| 10977 | 5076 | .options = OPT_PROTO_IM_IMAGE, |
| 5077 | .user_splits = NULL, /*< set in mw_plugin_init */ | |
| 5078 | .protocol_options = NULL, /*< set in mw_plugin_init */ | |
| 5079 | .icon_spec = NO_BUDDY_ICONS, | |
| 5080 | .list_icon = mw_prpl_list_icon, | |
| 15524 | 5081 | .list_emblem = mw_prpl_list_emblem, |
| 10977 | 5082 | .status_text = mw_prpl_status_text, |
| 5083 | .tooltip_text = mw_prpl_tooltip_text, | |
| 5084 | .status_types = mw_prpl_status_types, | |
| 5085 | .blist_node_menu = mw_prpl_blist_node_menu, | |
| 5086 | .chat_info = mw_prpl_chat_info, | |
| 5087 | .chat_info_defaults = mw_prpl_chat_info_defaults, | |
| 5088 | .login = mw_prpl_login, | |
| 5089 | .close = mw_prpl_close, | |
| 5090 | .send_im = mw_prpl_send_im, | |
| 5091 | .set_info = NULL, | |
| 5092 | .send_typing = mw_prpl_send_typing, | |
| 5093 | .get_info = mw_prpl_get_info, | |
|
11638
1821b40269a3
[gaim-migrate @ 13914]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
11547
diff
changeset
|
5094 | .set_status = mw_prpl_set_status, |
| 10977 | 5095 | .set_idle = mw_prpl_set_idle, |
| 5096 | .change_passwd = NULL, | |
| 5097 | .add_buddy = mw_prpl_add_buddy, | |
| 5098 | .add_buddies = mw_prpl_add_buddies, | |
| 5099 | .remove_buddy = mw_prpl_remove_buddy, | |
| 5100 | .remove_buddies = NULL, | |
| 5101 | .add_permit = mw_prpl_add_permit, | |
| 5102 | .add_deny = mw_prpl_add_deny, | |
| 5103 | .rem_permit = mw_prpl_rem_permit, | |
| 5104 | .rem_deny = mw_prpl_rem_deny, | |
| 5105 | .set_permit_deny = mw_prpl_set_permit_deny, | |
| 5106 | .join_chat = mw_prpl_join_chat, | |
| 5107 | .reject_chat = mw_prpl_reject_chat, | |
| 5108 | .get_chat_name = mw_prpl_get_chat_name, | |
| 5109 | .chat_invite = mw_prpl_chat_invite, | |
| 5110 | .chat_leave = mw_prpl_chat_leave, | |
| 5111 | .chat_whisper = mw_prpl_chat_whisper, | |
| 5112 | .chat_send = mw_prpl_chat_send, | |
| 5113 | .keepalive = mw_prpl_keepalive, | |
| 5114 | .register_user = NULL, | |
| 5115 | .get_cb_info = NULL, | |
| 5116 | .get_cb_away = NULL, | |
| 5117 | .alias_buddy = mw_prpl_alias_buddy, | |
| 5118 | .group_buddy = mw_prpl_group_buddy, | |
| 5119 | .rename_group = mw_prpl_rename_group, | |
| 5120 | .buddy_free = mw_prpl_buddy_free, | |
| 5121 | .convo_closed = mw_prpl_convo_closed, | |
| 5122 | .normalize = mw_prpl_normalize, | |
| 5123 | .set_buddy_icon = NULL, | |
| 5124 | .remove_group = mw_prpl_remove_group, | |
| 5125 | .get_cb_real_name = NULL, | |
| 5126 | .set_chat_topic = NULL, | |
| 5127 | .find_blist_chat = NULL, | |
| 5128 | .roomlist_get_list = NULL, | |
| 5129 | .roomlist_expand_category = NULL, | |
| 5130 | .can_receive_file = mw_prpl_can_receive_file, | |
| 5131 | .send_file = mw_prpl_send_file, | |
|
12143
09f216663302
[gaim-migrate @ 14444]
Evan Schoenberg <evands@pidgin.im>
parents:
12135
diff
changeset
|
5132 | .new_xfer = mw_prpl_new_xfer, |
|
12650
ca70a14f4994
[gaim-migrate @ 14988]
Mark Doliner <markdoliner@pidgin.im>
parents:
12631
diff
changeset
|
5133 | .offline_message = NULL, |
|
ca70a14f4994
[gaim-migrate @ 14988]
Mark Doliner <markdoliner@pidgin.im>
parents:
12631
diff
changeset
|
5134 | .whiteboard_prpl_ops = NULL, |
|
17800
39a0f9ed0e26
Replaced a clean and simple API with a very weird hack due to vivid request on #pidgin by multiple devs. This avoids the change in PurplePluginProtocolInfo, but requires complicated change tracking in every prpl. The others prpl should add this change tracking, too (since otherwise the status gets changed even though nothing they care about changed), but that's not up to me.
Andreas Monitzer <am@adiumx.com>
parents:
17791
diff
changeset
|
5135 | .send_raw = NULL |
| 10977 | 5136 | }; |
| 5137 | ||
| 5138 | ||
| 15884 | 5139 | static PurplePluginPrefFrame * |
| 5140 | mw_plugin_get_plugin_pref_frame(PurplePlugin *plugin) { | |
| 5141 | PurplePluginPrefFrame *frame; | |
| 5142 | PurplePluginPref *pref; | |
| 5143 | ||
| 5144 | frame = purple_plugin_pref_frame_new(); | |
| 10977 | 5145 | |
| 15884 | 5146 | pref = purple_plugin_pref_new_with_label(_("Remotely Stored Buddy List")); |
| 5147 | purple_plugin_pref_frame_add(frame, pref); | |
| 10977 | 5148 | |
| 5149 | ||
| 15884 | 5150 | pref = purple_plugin_pref_new_with_name(MW_PRPL_OPT_BLIST_ACTION); |
| 5151 | purple_plugin_pref_set_label(pref, _("Buddy List Storage Mode")); | |
| 5152 | ||
| 5153 | purple_plugin_pref_set_type(pref, PURPLE_PLUGIN_PREF_CHOICE); | |
| 5154 | purple_plugin_pref_add_choice(pref, _("Local Buddy List Only"), | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5155 | GINT_TO_POINTER(blist_choice_LOCAL)); |
| 15884 | 5156 | purple_plugin_pref_add_choice(pref, _("Merge List from Server"), |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5157 | GINT_TO_POINTER(blist_choice_MERGE)); |
| 15884 | 5158 | purple_plugin_pref_add_choice(pref, _("Merge and Save List to Server"), |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5159 | GINT_TO_POINTER(blist_choice_STORE)); |
| 15884 | 5160 | purple_plugin_pref_add_choice(pref, _("Synchronize List with Server"), |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5161 | GINT_TO_POINTER(blist_choice_SYNCH)); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5162 | |
| 15884 | 5163 | purple_plugin_pref_frame_add(frame, pref); |
| 10977 | 5164 | |
| 5165 | return frame; | |
| 5166 | } | |
| 5167 | ||
| 5168 | ||
| 15884 | 5169 | static PurplePluginUiInfo mw_plugin_ui_info = { |
|
17153
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
5170 | mw_plugin_get_plugin_pref_frame, |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
5171 | 0, /* page_num */ |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
5172 | NULL, /* frame */ |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
5173 | NULL, |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
5174 | NULL, |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
5175 | NULL, |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
5176 | NULL |
| 10977 | 5177 | }; |
| 5178 | ||
| 5179 | ||
| 15884 | 5180 | static void st_import_action_cb(PurpleConnection *gc, char *filename) { |
| 10977 | 5181 | struct mwSametimeList *l; |
| 5182 | ||
| 5183 | FILE *file; | |
| 5184 | char buf[BUF_LEN]; | |
| 5185 | size_t len; | |
| 5186 | ||
| 5187 | GString *str; | |
| 5188 | ||
|
13158
3b4295931fd6
[gaim-migrate @ 15520]
Richard Laager <rlaager@pidgin.im>
parents:
13107
diff
changeset
|
5189 | file = g_fopen(filename, "r"); |
| 10977 | 5190 | g_return_if_fail(file != NULL); |
| 5191 | ||
| 5192 | str = g_string_new(NULL); | |
| 5193 | while( (len = fread(buf, 1, BUF_LEN, file)) ) { | |
| 5194 | g_string_append_len(str, buf, len); | |
| 5195 | } | |
| 5196 | ||
| 5197 | fclose(file); | |
| 5198 | ||
| 5199 | l = mwSametimeList_load(str->str); | |
| 5200 | g_string_free(str, TRUE); | |
| 5201 | ||
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5202 | blist_merge(gc, l); |
| 10977 | 5203 | mwSametimeList_free(l); |
| 5204 | } | |
| 5205 | ||
| 5206 | ||
| 5207 | /** prompts for a file to import blist from */ | |
| 15884 | 5208 | static void st_import_action(PurplePluginAction *act) { |
| 5209 | PurpleConnection *gc; | |
| 5210 | PurpleAccount *account; | |
| 10977 | 5211 | char *title; |
| 5212 | ||
| 5213 | gc = act->context; | |
| 15884 | 5214 | account = purple_connection_get_account(gc); |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5215 | title = g_strdup_printf(_("Import Sametime List for Account %s"), |
| 15884 | 5216 | purple_account_get_username(account)); |
| 5217 | ||
| 5218 | purple_request_file(gc, title, NULL, FALSE, | |
| 10977 | 5219 | G_CALLBACK(st_import_action_cb), NULL, |
|
16490
68c22924d66b
Added account, who, and conversation parameters to the request API calls, and updated all code to match. I can't compile the Perl module, so I'd appreciate it if someone who knows it would verify that this doesn't break Perl.
Evan Schoenberg <evands@pidgin.im>
parents:
16121
diff
changeset
|
5220 | account, NULL, NULL, |
| 10977 | 5221 | gc); |
| 5222 | ||
| 5223 | g_free(title); | |
| 5224 | } | |
| 5225 | ||
| 5226 | ||
| 15884 | 5227 | static void st_export_action_cb(PurpleConnection *gc, char *filename) { |
| 10977 | 5228 | struct mwSametimeList *l; |
| 5229 | char *str; | |
| 5230 | FILE *file; | |
| 5231 | ||
|
13158
3b4295931fd6
[gaim-migrate @ 15520]
Richard Laager <rlaager@pidgin.im>
parents:
13107
diff
changeset
|
5232 | file = g_fopen(filename, "w"); |
| 10977 | 5233 | g_return_if_fail(file != NULL); |
| 5234 | ||
| 5235 | l = mwSametimeList_new(); | |
| 5236 | blist_export(gc, l); | |
| 5237 | str = mwSametimeList_store(l); | |
| 5238 | mwSametimeList_free(l); | |
| 5239 | ||
| 5240 | fprintf(file, "%s", str); | |
| 5241 | fclose(file); | |
| 5242 | ||
| 5243 | g_free(str); | |
| 5244 | } | |
| 5245 | ||
| 5246 | ||
| 5247 | /** prompts for a file to export blist to */ | |
| 15884 | 5248 | static void st_export_action(PurplePluginAction *act) { |
| 5249 | PurpleConnection *gc; | |
| 5250 | PurpleAccount *account; | |
| 10977 | 5251 | char *title; |
| 5252 | ||
| 5253 | gc = act->context; | |
| 15884 | 5254 | account = purple_connection_get_account(gc); |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5255 | title = g_strdup_printf(_("Export Sametime List for Account %s"), |
| 15884 | 5256 | purple_account_get_username(account)); |
| 5257 | ||
| 5258 | purple_request_file(gc, title, NULL, TRUE, | |
| 10977 | 5259 | G_CALLBACK(st_export_action_cb), NULL, |
|
16490
68c22924d66b
Added account, who, and conversation parameters to the request API calls, and updated all code to match. I can't compile the Perl module, so I'd appreciate it if someone who knows it would verify that this doesn't break Perl.
Evan Schoenberg <evands@pidgin.im>
parents:
16121
diff
changeset
|
5260 | account, NULL, NULL, |
| 10977 | 5261 | gc); |
| 5262 | ||
| 5263 | g_free(title); | |
| 5264 | } | |
| 5265 | ||
| 5266 | ||
| 5267 | static void remote_group_multi_cleanup(gpointer ignore, | |
| 15884 | 5268 | PurpleRequestFields *fields) { |
| 10977 | 5269 | |
| 15884 | 5270 | PurpleRequestField *f; |
| 10977 | 5271 | const GList *l; |
| 5272 | ||
| 15884 | 5273 | f = purple_request_fields_get_field(fields, "group"); |
| 5274 | l = purple_request_field_list_get_items(f); | |
| 10977 | 5275 | |
| 5276 | for(; l; l = l->next) { | |
| 5277 | const char *i = l->data; | |
|
12624
c1c92f08976b
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
5278 | struct named_id *res; |
| 10977 | 5279 | |
| 15884 | 5280 | res = purple_request_field_list_get_data(f, i); |
| 10977 | 5281 | |
| 5282 | g_free(res->id); | |
| 5283 | g_free(res->name); | |
| 5284 | g_free(res); | |
| 5285 | } | |
| 5286 | } | |
| 5287 | ||
| 5288 | ||
| 15884 | 5289 | static void remote_group_done(struct mwPurplePluginData *pd, |
| 10977 | 5290 | const char *id, const char *name) { |
| 15884 | 5291 | PurpleConnection *gc; |
| 5292 | PurpleAccount *acct; | |
| 5293 | PurpleGroup *group; | |
| 5294 | PurpleBlistNode *gn; | |
| 10977 | 5295 | const char *owner; |
| 5296 | ||
| 5297 | g_return_if_fail(pd != NULL); | |
| 5298 | ||
| 5299 | gc = pd->gc; | |
| 15884 | 5300 | acct = purple_connection_get_account(gc); |
| 10977 | 5301 | |
| 5302 | /* collision checking */ | |
| 15884 | 5303 | group = purple_find_group(name); |
| 10977 | 5304 | if(group) { |
|
13107
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
5305 | const char *msgA; |
|
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
5306 | const char *msgB; |
|
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
5307 | char *msg; |
| 10977 | 5308 | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5309 | msgA = _("Unable to add group: group exists"); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5310 | msgB = _("A group named '%s' already exists in your buddy list."); |
|
13107
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
5311 | msg = g_strdup_printf(msgB, name); |
|
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
5312 | |
| 15884 | 5313 | purple_notify_error(gc, _("Unable to add group"), msgA, msg); |
|
13107
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
5314 | |
|
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
5315 | g_free(msg); |
| 10977 | 5316 | return; |
| 5317 | } | |
| 5318 | ||
| 15884 | 5319 | group = purple_group_new(name); |
| 5320 | gn = (PurpleBlistNode *) group; | |
| 5321 | ||
| 5322 | owner = purple_account_get_username(acct); | |
| 5323 | ||
| 5324 | purple_blist_node_set_string(gn, GROUP_KEY_NAME, id); | |
| 5325 | purple_blist_node_set_int(gn, GROUP_KEY_TYPE, mwSametimeGroup_DYNAMIC); | |
| 5326 | purple_blist_node_set_string(gn, GROUP_KEY_OWNER, owner); | |
| 5327 | purple_blist_add_group(group, NULL); | |
| 10977 | 5328 | |
| 5329 | group_add(pd, group); | |
| 5330 | blist_schedule(pd); | |
| 5331 | } | |
| 5332 | ||
| 5333 | ||
| 15884 | 5334 | static void remote_group_multi_cb(struct mwPurplePluginData *pd, |
| 5335 | PurpleRequestFields *fields) { | |
| 5336 | PurpleRequestField *f; | |
| 10977 | 5337 | const GList *l; |
| 5338 | ||
| 15884 | 5339 | f = purple_request_fields_get_field(fields, "group"); |
| 5340 | l = purple_request_field_list_get_selected(f); | |
| 10977 | 5341 | |
| 5342 | if(l) { | |
| 5343 | const char *i = l->data; | |
|
12624
c1c92f08976b
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
5344 | struct named_id *res; |
| 10977 | 5345 | |
| 15884 | 5346 | res = purple_request_field_list_get_data(f, i); |
| 10977 | 5347 | remote_group_done(pd, res->id, res->name); |
| 5348 | } | |
| 5349 | ||
| 5350 | remote_group_multi_cleanup(NULL, fields); | |
| 5351 | } | |
| 5352 | ||
| 5353 | ||
| 5354 | static void remote_group_multi(struct mwResolveResult *result, | |
| 15884 | 5355 | struct mwPurplePluginData *pd) { |
| 5356 | ||
| 5357 | PurpleRequestFields *fields; | |
| 5358 | PurpleRequestFieldGroup *g; | |
| 5359 | PurpleRequestField *f; | |
| 10977 | 5360 | GList *l; |
|
13107
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
5361 | const char *msgA; |
|
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
5362 | const char *msgB; |
|
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
5363 | char *msg; |
| 10977 | 5364 | |
| 15884 | 5365 | PurpleConnection *gc = pd->gc; |
| 5366 | ||
| 5367 | fields = purple_request_fields_new(); | |
| 5368 | ||
| 5369 | g = purple_request_field_group_new(NULL); | |
| 5370 | purple_request_fields_add_group(fields, g); | |
| 5371 | ||
| 5372 | f = purple_request_field_list_new("group", _("Possible Matches")); | |
| 5373 | purple_request_field_list_set_multi_select(f, FALSE); | |
| 5374 | purple_request_field_set_required(f, TRUE); | |
| 10977 | 5375 | |
| 5376 | for(l = result->matches; l; l = l->next) { | |
| 5377 | struct mwResolveMatch *match = l->data; | |
|
12624
c1c92f08976b
[gaim-migrate @ 14960]
Christopher O'Brien <siege@pidgin.im>
parents:
12595
diff
changeset
|
5378 | struct named_id *res = g_new0(struct named_id, 1); |
| 10977 | 5379 | |
| 5380 | res->id = g_strdup(match->id); | |
| 5381 | res->name = g_strdup(match->name); | |
| 5382 | ||
| 15884 | 5383 | purple_request_field_list_add(f, res->name, res); |
| 10977 | 5384 | } |
| 5385 | ||
| 15884 | 5386 | purple_request_field_group_add_field(g, f); |
| 10977 | 5387 | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5388 | msgA = _("Notes Address Book group results"); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5389 | msgB = _("The identifier '%s' may possibly refer to any of the following" |
| 10977 | 5390 | " Notes Address Book groups. Please select the correct group from" |
| 5391 | " the list below to add it to your buddy list."); | |
|
13107
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
5392 | msg = g_strdup_printf(msgB, result->name); |
| 10977 | 5393 | |
| 15884 | 5394 | purple_request_fields(gc, _("Select Notes Address Book"), |
|
13107
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
5395 | msgA, msg, fields, |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5396 | _("Add Group"), G_CALLBACK(remote_group_multi_cb), |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5397 | _("Cancel"), G_CALLBACK(remote_group_multi_cleanup), |
|
16490
68c22924d66b
Added account, who, and conversation parameters to the request API calls, and updated all code to match. I can't compile the Perl module, so I'd appreciate it if someone who knows it would verify that this doesn't break Perl.
Evan Schoenberg <evands@pidgin.im>
parents:
16121
diff
changeset
|
5398 | purple_connection_get_account(gc), result->name, NULL, |
| 10977 | 5399 | pd); |
| 5400 | ||
|
13107
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
5401 | g_free(msg); |
| 10977 | 5402 | } |
| 5403 | ||
| 5404 | ||
| 5405 | static void remote_group_resolved(struct mwServiceResolve *srvc, | |
| 5406 | guint32 id, guint32 code, GList *results, | |
| 5407 | gpointer b) { | |
|
11133
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
5408 | |
|
9418ce240eca
[gaim-migrate @ 13192]
Christopher O'Brien <siege@pidgin.im>
parents:
11132
diff
changeset
|
5409 | struct mwResolveResult *res = NULL; |
| 10977 | 5410 | struct mwSession *session; |
| 15884 | 5411 | struct mwPurplePluginData *pd; |
| 5412 | PurpleConnection *gc; | |
| 10977 | 5413 | |
| 5414 | session = mwService_getSession(MW_SERVICE(srvc)); | |
| 5415 | g_return_if_fail(session != NULL); | |
| 5416 | ||
| 5417 | pd = mwSession_getClientData(session); | |
| 5418 | g_return_if_fail(pd != NULL); | |
| 5419 | ||
| 5420 | gc = pd->gc; | |
| 5421 | g_return_if_fail(gc != NULL); | |
| 5422 | ||
| 5423 | if(!code && results) { | |
| 5424 | res = results->data; | |
| 5425 | ||
| 5426 | if(res->matches) { | |
| 5427 | remote_group_multi(res, pd); | |
| 5428 | return; | |
| 5429 | } | |
| 5430 | } | |
| 5431 | ||
| 5432 | if(res && res->name) { | |
|
13107
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
5433 | const char *msgA; |
|
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
5434 | const char *msgB; |
|
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
5435 | char *msg; |
| 10977 | 5436 | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5437 | msgA = _("Unable to add group: group not found"); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5438 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5439 | msgB = _("The identifier '%s' did not match any Notes Address Book" |
| 10977 | 5440 | " groups in your Sametime community."); |
|
13107
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
5441 | msg = g_strdup_printf(msgB, res->name); |
|
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
5442 | |
| 15884 | 5443 | purple_notify_error(gc, _("Unable to add group"), msgA, msg); |
|
13107
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
5444 | |
|
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
5445 | g_free(msg); |
| 10977 | 5446 | } |
| 5447 | } | |
| 5448 | ||
| 5449 | ||
| 15884 | 5450 | static void remote_group_action_cb(PurpleConnection *gc, const char *name) { |
| 5451 | struct mwPurplePluginData *pd; | |
| 10977 | 5452 | struct mwServiceResolve *srvc; |
| 5453 | GList *query; | |
| 5454 | enum mwResolveFlag flags; | |
| 5455 | guint32 req; | |
| 5456 | ||
| 5457 | pd = gc->proto_data; | |
| 5458 | srvc = pd->srvc_resolve; | |
| 5459 | ||
| 5460 | query = g_list_prepend(NULL, (char *) name); | |
| 5461 | flags = mwResolveFlag_FIRST | mwResolveFlag_GROUPS; | |
| 5462 | ||
| 5463 | req = mwServiceResolve_resolve(srvc, query, flags, remote_group_resolved, | |
| 5464 | NULL, NULL); | |
| 5465 | g_list_free(query); | |
| 5466 | ||
| 5467 | if(req == SEARCH_ERROR) { | |
| 5468 | /** @todo display error */ | |
| 5469 | } | |
| 5470 | } | |
| 5471 | ||
| 5472 | ||
| 15884 | 5473 | static void remote_group_action(PurplePluginAction *act) { |
| 5474 | PurpleConnection *gc; | |
|
13107
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
5475 | const char *msgA; |
|
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
5476 | const char *msgB; |
| 10977 | 5477 | |
| 5478 | gc = act->context; | |
| 5479 | ||
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5480 | msgA = _("Notes Address Book Group"); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5481 | msgB = _("Enter the name of a Notes Address Book group in the field below" |
| 10977 | 5482 | " to add the group and its members to your buddy list."); |
| 5483 | ||
| 15884 | 5484 | purple_request_input(gc, _("Add Group"), msgA, msgB, NULL, |
| 10977 | 5485 | FALSE, FALSE, NULL, |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5486 | _("Add"), G_CALLBACK(remote_group_action_cb), |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5487 | _("Cancel"), NULL, |
|
16490
68c22924d66b
Added account, who, and conversation parameters to the request API calls, and updated all code to match. I can't compile the Perl module, so I'd appreciate it if someone who knows it would verify that this doesn't break Perl.
Evan Schoenberg <evands@pidgin.im>
parents:
16121
diff
changeset
|
5488 | purple_connection_get_account(gc), NULL, NULL, |
| 10977 | 5489 | gc); |
| 5490 | } | |
| 5491 | ||
| 5492 | ||
|
12630
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5493 | static void search_notify(struct mwResolveResult *result, |
| 15884 | 5494 | PurpleConnection *gc) { |
|
12630
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5495 | GList *l; |
|
13107
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
5496 | const char *msgA; |
|
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
5497 | const char *msgB; |
|
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
5498 | char *msg1; |
|
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
5499 | char *msg2; |
|
12630
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5500 | |
| 15884 | 5501 | PurpleNotifySearchResults *sres; |
| 5502 | PurpleNotifySearchColumn *scol; | |
| 5503 | ||
| 5504 | sres = purple_notify_searchresults_new(); | |
| 5505 | ||
| 5506 | scol = purple_notify_searchresults_column_new(_("User Name")); | |
| 5507 | purple_notify_searchresults_column_add(sres, scol); | |
| 5508 | ||
| 5509 | scol = purple_notify_searchresults_column_new(_("Sametime ID")); | |
| 5510 | purple_notify_searchresults_column_add(sres, scol); | |
| 5511 | ||
| 5512 | purple_notify_searchresults_button_add(sres, PURPLE_NOTIFY_BUTTON_IM, | |
|
12630
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5513 | notify_im); |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5514 | |
| 15884 | 5515 | purple_notify_searchresults_button_add(sres, PURPLE_NOTIFY_BUTTON_ADD, |
|
12630
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5516 | notify_add); |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5517 | |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5518 | for(l = result->matches; l; l = l->next) { |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5519 | struct mwResolveMatch *match = l->data; |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5520 | GList *row = NULL; |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5521 | |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5522 | if(!match->id || !match->name) |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5523 | continue; |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5524 | |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5525 | row = g_list_append(row, g_strdup(match->name)); |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5526 | row = g_list_append(row, g_strdup(match->id)); |
| 15884 | 5527 | purple_notify_searchresults_row_add(sres, row); |
|
12630
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5528 | } |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5529 | |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5530 | msgA = _("Search results for '%s'"); |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5531 | msgB = _("The identifier '%s' may possibly refer to any of the following" |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5532 | " users. You may add these users to your buddy list or send them" |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5533 | " messages with the action buttons below."); |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5534 | |
|
13107
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
5535 | msg1 = g_strdup_printf(msgA, result->name); |
|
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
5536 | msg2 = g_strdup_printf(msgB, result->name); |
|
12630
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5537 | |
| 15884 | 5538 | purple_notify_searchresults(gc, _("Search Results"), |
|
13107
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
5539 | msg1, msg2, sres, notify_close, NULL); |
|
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
5540 | |
|
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
5541 | g_free(msg1); |
|
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
5542 | g_free(msg2); |
|
12630
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5543 | } |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5544 | |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5545 | |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5546 | static void search_resolved(struct mwServiceResolve *srvc, |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5547 | guint32 id, guint32 code, GList *results, |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5548 | gpointer b) { |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5549 | |
| 15884 | 5550 | PurpleConnection *gc = b; |
|
12630
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5551 | struct mwResolveResult *res = NULL; |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5552 | |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5553 | if(results) res = results->data; |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5554 | |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5555 | if(!code && res && res->matches) { |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5556 | search_notify(res, gc); |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5557 | |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5558 | } else { |
|
13107
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
5559 | const char *msgA; |
|
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
5560 | const char *msgB; |
|
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
5561 | char *msg; |
|
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
5562 | |
|
12630
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5563 | msgA = _("No matches"); |
|
13287
18cc0c33773d
[gaim-migrate @ 15652]
Evan Schoenberg <evands@pidgin.im>
parents:
13211
diff
changeset
|
5564 | msgB = _("The identifier '%s' did not match any users in your" |
|
12630
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5565 | " Sametime community."); |
|
13107
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
5566 | msg = g_strdup_printf(msgB, NSTR(res->name)); |
|
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
5567 | |
| 15884 | 5568 | purple_notify_error(gc, _("No Matches"), msgA, msg); |
|
13107
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
5569 | |
|
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
5570 | g_free(msg); |
|
12630
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5571 | } |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5572 | } |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5573 | |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5574 | |
| 15884 | 5575 | static void search_action_cb(PurpleConnection *gc, const char *name) { |
| 5576 | struct mwPurplePluginData *pd; | |
|
12630
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5577 | struct mwServiceResolve *srvc; |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5578 | GList *query; |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5579 | enum mwResolveFlag flags; |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5580 | guint32 req; |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5581 | |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5582 | pd = gc->proto_data; |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5583 | srvc = pd->srvc_resolve; |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5584 | |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5585 | query = g_list_prepend(NULL, (char *) name); |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5586 | flags = mwResolveFlag_FIRST | mwResolveFlag_USERS; |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5587 | |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5588 | req = mwServiceResolve_resolve(srvc, query, flags, search_resolved, |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5589 | gc, NULL); |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5590 | g_list_free(query); |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5591 | |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5592 | if(req == SEARCH_ERROR) { |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5593 | /** @todo display error */ |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5594 | } |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5595 | } |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5596 | |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5597 | |
| 15884 | 5598 | static void search_action(PurplePluginAction *act) { |
| 5599 | PurpleConnection *gc; | |
|
13107
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
5600 | const char *msgA; |
|
704041197f4d
[gaim-migrate @ 15468]
Richard Laager <rlaager@pidgin.im>
parents:
13021
diff
changeset
|
5601 | const char *msgB; |
|
12630
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5602 | |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5603 | gc = act->context; |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5604 | |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5605 | msgA = _("Search for a user"); |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5606 | msgB = _("Enter a name or partial ID in the field below to search" |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5607 | " for matching users in your Sametime community."); |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5608 | |
| 15884 | 5609 | purple_request_input(gc, _("User Search"), msgA, msgB, NULL, |
|
12630
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5610 | FALSE, FALSE, NULL, |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5611 | _("Search"), G_CALLBACK(search_action_cb), |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5612 | _("Cancel"), NULL, |
|
16490
68c22924d66b
Added account, who, and conversation parameters to the request API calls, and updated all code to match. I can't compile the Perl module, so I'd appreciate it if someone who knows it would verify that this doesn't break Perl.
Evan Schoenberg <evands@pidgin.im>
parents:
16121
diff
changeset
|
5613 | purple_connection_get_account(gc), NULL, NULL, |
|
68c22924d66b
Added account, who, and conversation parameters to the request API calls, and updated all code to match. I can't compile the Perl module, so I'd appreciate it if someone who knows it would verify that this doesn't break Perl.
Evan Schoenberg <evands@pidgin.im>
parents:
16121
diff
changeset
|
5614 | gc); |
|
12630
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5615 | } |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5616 | |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5617 | |
| 15884 | 5618 | static GList *mw_plugin_actions(PurplePlugin *plugin, gpointer context) { |
| 5619 | PurplePluginAction *act; | |
| 10977 | 5620 | GList *l = NULL; |
| 5621 | ||
| 15884 | 5622 | act = purple_plugin_action_new(_("Import Sametime List..."), |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5623 | st_import_action); |
| 10977 | 5624 | l = g_list_append(l, act); |
| 5625 | ||
| 15884 | 5626 | act = purple_plugin_action_new(_("Export Sametime List..."), |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5627 | st_export_action); |
| 10977 | 5628 | l = g_list_append(l, act); |
| 5629 | ||
| 15884 | 5630 | act = purple_plugin_action_new(_("Add Notes Address Book Group..."), |
| 10977 | 5631 | remote_group_action); |
| 5632 | l = g_list_append(l, act); | |
| 5633 | ||
| 15884 | 5634 | act = purple_plugin_action_new(_("User Search..."), |
|
12630
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5635 | search_action); |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5636 | l = g_list_append(l, act); |
|
b0fad57c3fc0
[gaim-migrate @ 14966]
Christopher O'Brien <siege@pidgin.im>
parents:
12629
diff
changeset
|
5637 | |
| 10977 | 5638 | return l; |
| 5639 | } | |
| 5640 | ||
| 5641 | ||
| 15884 | 5642 | static gboolean mw_plugin_load(PurplePlugin *plugin) { |
| 10977 | 5643 | return TRUE; |
| 5644 | } | |
| 5645 | ||
| 5646 | ||
| 15884 | 5647 | static gboolean mw_plugin_unload(PurplePlugin *plugin) { |
| 10977 | 5648 | return TRUE; |
| 5649 | } | |
| 5650 | ||
| 5651 | ||
| 15884 | 5652 | static void mw_plugin_destroy(PurplePlugin *plugin) { |
| 10977 | 5653 | g_log_remove_handler(G_LOG_DOMAIN, log_handler[0]); |
| 5654 | g_log_remove_handler("meanwhile", log_handler[1]); | |
| 5655 | } | |
| 5656 | ||
|
17153
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
5657 | static PurplePluginInfo mw_plugin_info = |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
5658 | { |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
5659 | PURPLE_PLUGIN_MAGIC, |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
5660 | PURPLE_MAJOR_VERSION, |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
5661 | PURPLE_MINOR_VERSION, |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
5662 | PURPLE_PLUGIN_PROTOCOL, /**< type */ |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
5663 | NULL, /**< ui_requirement */ |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
5664 | 0, /**< flags */ |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
5665 | NULL, /**< dependencies */ |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
5666 | PURPLE_PRIORITY_DEFAULT, /**< priority */ |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
5667 | |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
5668 | PLUGIN_ID, /**< id */ |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
5669 | PLUGIN_NAME, /**< name */ |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
5670 | VERSION, /**< version */ |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
5671 | PLUGIN_SUMMARY, /**< summary */ |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
5672 | PLUGIN_DESC, /**< description */ |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
5673 | PLUGIN_AUTHOR, /**< author */ |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
5674 | PLUGIN_HOMEPAGE, /**< homepage */ |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
5675 | |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
5676 | mw_plugin_load, /**< load */ |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
5677 | mw_plugin_unload, /**< unload */ |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
5678 | mw_plugin_destroy, /**< destroy */ |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
5679 | |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
5680 | NULL, /**< ui_info */ |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
5681 | &mw_prpl_info, /**< extra_info */ |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
5682 | &mw_plugin_ui_info, /**< prefs_info */ |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
5683 | mw_plugin_actions, |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
5684 | |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
5685 | /* padding */ |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
5686 | NULL, |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
5687 | NULL, |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
5688 | NULL, |
|
7da4e85b6a05
Replace some C99 struct syntax.
Richard Laager <rlaager@pidgin.im>
parents:
16545
diff
changeset
|
5689 | NULL |
| 10977 | 5690 | }; |
| 5691 | ||
| 5692 | ||
| 5693 | static void mw_log_handler(const gchar *domain, GLogLevelFlags flags, | |
| 5694 | const gchar *msg, gpointer data) { | |
|
12005
0256aeef8411
[gaim-migrate @ 14298]
Christopher O'Brien <siege@pidgin.im>
parents:
11953
diff
changeset
|
5695 | |
|
0256aeef8411
[gaim-migrate @ 14298]
Christopher O'Brien <siege@pidgin.im>
parents:
11953
diff
changeset
|
5696 | if(! (msg && *msg)) return; |
| 10977 | 5697 | |
| 15884 | 5698 | /* handle g_log requests via purple's built-in debug logging */ |
| 10977 | 5699 | if(flags & G_LOG_LEVEL_ERROR) { |
| 15884 | 5700 | purple_debug_error(domain, "%s\n", msg); |
| 10977 | 5701 | |
| 5702 | } else if(flags & G_LOG_LEVEL_WARNING) { | |
| 15884 | 5703 | purple_debug_warning(domain, "%s\n", msg); |
| 10977 | 5704 | |
| 5705 | } else { | |
| 15884 | 5706 | purple_debug_info(domain, "%s\n", msg); |
| 10977 | 5707 | } |
| 5708 | } | |
| 5709 | ||
| 5710 | ||
| 15884 | 5711 | static void mw_plugin_init(PurplePlugin *plugin) { |
| 5712 | PurpleAccountOption *opt; | |
| 10977 | 5713 | GList *l = NULL; |
| 5714 | ||
| 5715 | GLogLevelFlags logflags = | |
| 5716 | G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION; | |
| 5717 | ||
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5718 | /* set up the preferences */ |
| 15884 | 5719 | purple_prefs_add_none(MW_PRPL_OPT_BASE); |
| 5720 | purple_prefs_add_int(MW_PRPL_OPT_BLIST_ACTION, BLIST_CHOICE_DEFAULT); | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5721 | |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5722 | /* remove dead preferences */ |
| 15884 | 5723 | purple_prefs_remove(MW_PRPL_OPT_PSYCHIC); |
| 5724 | purple_prefs_remove(MW_PRPL_OPT_SAVE_DYNAMIC); | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5725 | |
| 10977 | 5726 | /* host to connect to */ |
| 15884 | 5727 | opt = purple_account_option_string_new(_("Server"), MW_KEY_HOST, |
| 10977 | 5728 | MW_PLUGIN_DEFAULT_HOST); |
| 5729 | l = g_list_append(l, opt); | |
| 5730 | ||
| 5731 | /* port to connect to */ | |
| 15884 | 5732 | opt = purple_account_option_int_new(_("Port"), MW_KEY_PORT, |
| 10977 | 5733 | MW_PLUGIN_DEFAULT_PORT); |
| 5734 | l = g_list_append(l, opt); | |
| 5735 | ||
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5736 | { /* copy the old force login setting from prefs if it's |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5737 | there. Don't delete the preference, since there may be more |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5738 | than one account that wants to check for it. */ |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5739 | gboolean b = FALSE; |
|
12489
14274d68d499
[gaim-migrate @ 14801]
Björn Voigt <bjoern@cs.tu-berlin.de>
parents:
12422
diff
changeset
|
5740 | const char *label = _("Force login (ignore server redirects)"); |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5741 | |
| 15884 | 5742 | if(purple_prefs_exists(MW_PRPL_OPT_FORCE_LOGIN)) |
| 5743 | b = purple_prefs_get_bool(MW_PRPL_OPT_FORCE_LOGIN); | |
| 5744 | ||
| 5745 | opt = purple_account_option_bool_new(label, MW_KEY_FORCE, b); | |
|
11943
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5746 | l = g_list_append(l, opt); |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5747 | } |
|
81ee4bc13c28
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
11837
diff
changeset
|
5748 | |
|
12311
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
5749 | /* pretend to be Sametime Connect */ |
| 15884 | 5750 | opt = purple_account_option_bool_new(_("Hide client identity"), |
|
12311
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
5751 | MW_KEY_FAKE_IT, FALSE); |
|
12312
470a1452d009
[gaim-migrate @ 14616]
Christopher O'Brien <siege@pidgin.im>
parents:
12311
diff
changeset
|
5752 | l = g_list_append(l, opt); |
|
12311
ee0f62f4fcd4
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12266
diff
changeset
|
5753 | |
| 10977 | 5754 | mw_prpl_info.protocol_options = l; |
| 5755 | l = NULL; | |
| 5756 | ||
| 15884 | 5757 | /* forward all our g_log messages to purple. Generally all the logging |
| 5758 | calls are using purple_log directly, but the g_return macros will | |
| 10977 | 5759 | get caught here */ |
| 5760 | log_handler[0] = g_log_set_handler(G_LOG_DOMAIN, logflags, | |
| 5761 | mw_log_handler, NULL); | |
| 5762 | ||
| 15884 | 5763 | /* redirect meanwhile's logging to purple's */ |
| 10977 | 5764 | log_handler[1] = g_log_set_handler("meanwhile", logflags, |
| 5765 | mw_log_handler, NULL); | |
| 5766 | } | |
| 5767 | ||
| 5768 | ||
| 15884 | 5769 | PURPLE_INIT_PLUGIN(sametime, mw_plugin_init, mw_plugin_info); |
| 10977 | 5770 | /* The End. */ |
| 5771 |