Sat, 26 Apr 2003 20:30:43 +0000
[gaim-migrate @ 5604]
Chats in the buddy list!
You can now put chat rooms in your buddy list, and double-click them to join
them, instead of having to do all that typing. I'm eventually gonna add
auto-join support, so that ugly hack involving pouncing can go away.
Someone should make some new artwork so we don't have 2 + icons next to
each other in the menus.
This also has some fixes to let gaim compile again, after the renaming of
the buddy list files.
This also fixes the problem with offline buddies not showing up in the list
sometimes for accounts that didn't log in at startup.
This probably fixes other stuff, but I can't remember any of it off the top
of my head.
I'm going to stop typing and let people play with this now.
| 2086 | 1 | /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ |
| 2 | /* | |
| 3 | * gaim | |
| 4 | * | |
| 5 | * Some code copyright (C) 1998-1999, Mark Spencer <markster@marko.net> | |
| 6 | * libfaim code copyright 1998, 1999 Adam Fritzler <afritz@auk.cx> | |
| 7 | * | |
| 8 | * This program is free software; you can redistribute it and/or modify | |
| 9 | * it under the terms of the GNU General Public License as published by | |
| 10 | * the Free Software Foundation; either version 2 of the License, or | |
| 11 | * (at your option) any later version. | |
| 12 | * This program is distributed in the hope that it will be useful, | |
| 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 15 | * GNU General Public License for more details. | |
| 16 | * | |
| 17 | * You should have received a copy of the GNU General Public License | |
| 18 | * along with this program; if not, write to the Free Software | |
| 19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
| 20 | * | |
| 21 | */ | |
| 22 | #ifdef HAVE_CONFIG_H | |
| 3630 | 23 | #include <config.h> |
| 2086 | 24 | #endif |
| 25 | ||
| 3664 | 26 | #include <sys/types.h> |
| 27 | /*this must happen before sys/socket.h or freebsd won't compile*/ | |
| 28 | ||
| 3630 | 29 | #ifndef _WIN32 |
| 2086 | 30 | #include <netdb.h> |
| 31 | #include <netinet/in.h> | |
| 32 | #include <arpa/inet.h> | |
| 3630 | 33 | #include <sys/socket.h> |
| 34 | #include <sys/utsname.h> | |
| 35 | #include <unistd.h> | |
| 36 | #else | |
| 37 | #include "utsname.h" | |
| 38 | #endif | |
| 39 | ||
| 40 | #include <errno.h> | |
| 2086 | 41 | #include <string.h> |
| 42 | #include <stdlib.h> | |
| 43 | #include <stdio.h> | |
| 44 | #include <time.h> | |
| 45 | #include <sys/stat.h> | |
| 4608 | 46 | #include "gaim.h" |
| 2086 | 47 | #include "multi.h" |
| 48 | #include "prpl.h" | |
|
2232
8af3b178de6b
[gaim-migrate @ 2242]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2231
diff
changeset
|
49 | #ifdef MAX |
|
8af3b178de6b
[gaim-migrate @ 2242]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2231
diff
changeset
|
50 | #undef MAX |
|
8af3b178de6b
[gaim-migrate @ 2242]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2231
diff
changeset
|
51 | #endif |
|
8af3b178de6b
[gaim-migrate @ 2242]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2231
diff
changeset
|
52 | #ifdef MIN |
|
8af3b178de6b
[gaim-migrate @ 2242]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2231
diff
changeset
|
53 | #undef MIN |
|
8af3b178de6b
[gaim-migrate @ 2242]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2231
diff
changeset
|
54 | #endif |
| 2086 | 55 | #include "jabber.h" |
| 56 | #include "proxy.h" | |
| 57 | ||
| 3630 | 58 | #ifdef _WIN32 |
| 59 | #include "win32dep.h" | |
| 60 | #endif | |
| 61 | ||
|
5205
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
62 | static GaimPlugin *my_protocol = NULL; |
|
4249
62583b5d3663
[gaim-migrate @ 4499]
Robert McQueen <robot101@debian.org>
parents:
4245
diff
changeset
|
63 | |
| 3630 | 64 | /* for win32 compatability */ |
| 65 | G_MODULE_IMPORT GSList *connections; | |
| 66 | ||
| 2086 | 67 | /* The priv member of gjconn's is a gaim_connection for now. */ |
| 68 | #define GJ_GC(x) ((struct gaim_connection *)(x)->priv) | |
|
4249
62583b5d3663
[gaim-migrate @ 4499]
Robert McQueen <robot101@debian.org>
parents:
4245
diff
changeset
|
69 | /* Confused? That makes three of us. -Robot101 */ |
|
62583b5d3663
[gaim-migrate @ 4499]
Robert McQueen <robot101@debian.org>
parents:
4245
diff
changeset
|
70 | #define GC_GJ(x) ((gjconn)((struct jabber_data *)(x)->proto_data)->gjc) |
| 2086 | 71 | |
| 72 | #define IQID_AUTH "__AUTH__" | |
| 73 | ||
| 74 | #define IQ_NONE -1 | |
| 75 | #define IQ_AUTH 0 | |
| 76 | #define IQ_ROSTER 1 | |
| 77 | ||
|
3259
d666b7b44145
[gaim-migrate @ 3277]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3257
diff
changeset
|
78 | #define UC_AWAY (0x02 | UC_UNAVAILABLE) |
|
d666b7b44145
[gaim-migrate @ 3277]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3257
diff
changeset
|
79 | #define UC_CHAT 0x04 |
|
d666b7b44145
[gaim-migrate @ 3277]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3257
diff
changeset
|
80 | #define UC_XA (0x08 | UC_UNAVAILABLE) |
|
d666b7b44145
[gaim-migrate @ 3277]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3257
diff
changeset
|
81 | #define UC_DND (0x10 | UC_UNAVAILABLE) |
|
d666b7b44145
[gaim-migrate @ 3277]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3257
diff
changeset
|
82 | #define UC_ERROR (0x20 | UC_UNAVAILABLE) |
| 2086 | 83 | |
| 4917 | 84 | #define DEFAULT_SERVER "jabber.org" |
| 2086 | 85 | #define DEFAULT_GROUPCHAT "conference.jabber.org" |
| 86 | #define DEFAULT_PORT 5222 | |
| 87 | ||
| 88 | #define USEROPT_PORT 0 | |
| 4436 | 89 | #define USEROPT_CONN_SERVER 1 |
| 2086 | 90 | |
| 3311 | 91 | #define JABBER_TYPING_NOTIFY_INT 15 /* Delay (in seconds) between sending typing notifications */ |
| 92 | ||
| 4450 | 93 | #define JABBER_KEEPALIVE_STRING " \t " |
| 94 | ||
|
3074
b6510843df8f
[gaim-migrate @ 3088]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3059
diff
changeset
|
95 | /* |
|
b6510843df8f
[gaim-migrate @ 3088]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3059
diff
changeset
|
96 | * Note: "was_connected" may seem redundant, but it was needed and I |
|
b6510843df8f
[gaim-migrate @ 3088]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3059
diff
changeset
|
97 | * didn't want to touch the Jabber state stuff not specific to Gaim. |
|
b6510843df8f
[gaim-migrate @ 3088]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3059
diff
changeset
|
98 | */ |
| 2086 | 99 | typedef struct gjconn_struct { |
| 100 | /* Core structure */ | |
| 101 | pool p; /* Memory allocation pool */ | |
| 102 | int state; /* Connection state flag */ | |
|
3074
b6510843df8f
[gaim-migrate @ 3088]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3059
diff
changeset
|
103 | int was_connected; /* We were once connected */ |
| 2086 | 104 | int fd; /* Connection file descriptor */ |
| 105 | jid user; /* User info */ | |
| 106 | char *pass; /* User passwd */ | |
| 107 | ||
| 108 | /* Stream stuff */ | |
| 109 | int id; /* id counter for jab_getid() function */ | |
| 110 | char idbuf[9]; /* temporary storage for jab_getid() */ | |
| 111 | char *sid; /* stream id from server, for digest auth */ | |
| 112 | XML_Parser parser; /* Parser instance */ | |
| 113 | xmlnode current; /* Current node in parsing instance.. */ | |
| 114 | ||
| 115 | /* Event callback ptrs */ | |
| 2956 | 116 | void (*on_state)(struct gjconn_struct *gjc, int state); |
| 117 | void (*on_packet)(struct gjconn_struct *gjc, jpacket p); | |
| 118 | ||
| 119 | GHashTable *queries; /* query tracker */ | |
| 2086 | 120 | |
| 121 | void *priv; | |
| 122 | ||
| 123 | } *gjconn, gjconn_struct; | |
| 124 | ||
| 2956 | 125 | typedef void (*gjconn_state_h)(gjconn gjc, int state); |
| 126 | typedef void (*gjconn_packet_h)(gjconn gjc, jpacket p); | |
| 2086 | 127 | |
| 128 | static gjconn gjab_new(char *user, char *pass, void *priv); | |
| 2956 | 129 | static void gjab_delete(gjconn gjc); |
| 130 | static void gjab_state_handler(gjconn gjc, gjconn_state_h h); | |
| 131 | static void gjab_packet_handler(gjconn gjc, gjconn_packet_h h); | |
| 132 | static void gjab_start(gjconn gjc); | |
| 133 | static void gjab_stop(gjconn gjc); | |
| 2086 | 134 | /* |
| 2956 | 135 | static int gjab_getfd(gjconn gjc); |
| 136 | static jid gjab_getjid(gjconn gjc); | |
| 137 | static char *gjab_getsid(gjconn gjc); | |
| 2086 | 138 | */ |
| 2956 | 139 | static char *gjab_getid(gjconn gjc); |
| 140 | static void gjab_send(gjconn gjc, xmlnode x); | |
| 141 | static void gjab_send_raw(gjconn gjc, const char *str); | |
| 142 | static void gjab_recv(gjconn gjc); | |
| 143 | static void gjab_auth(gjconn gjc); | |
| 144 | ||
| 145 | /* | |
| 146 | * It is *this* to which we point the gaim_connection proto_data | |
| 147 | */ | |
| 2086 | 148 | struct jabber_data { |
| 2956 | 149 | gjconn gjc; |
| 2086 | 150 | gboolean did_import; |
| 2956 | 151 | GSList *chats; |
| 2086 | 152 | time_t idle; |
|
2800
06490388d3e9
[gaim-migrate @ 2813]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2791
diff
changeset
|
153 | gboolean die; |
| 3311 | 154 | GHashTable *buddies; |
| 3630 | 155 | GSList *file_transfers; |
| 2086 | 156 | }; |
| 157 | ||
| 2956 | 158 | /* |
|
3340
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
159 | * Used in jabber_buddy_data.invisible, below |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
160 | */ |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
161 | #define JABBER_NOT_INVIS 0x00 |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
162 | #define JABBER_SERV_INVIS 0x01 /* Invisible set on server */ |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
163 | #define JABBER_BUD_INVIS 0x02 /* Invisible set on buddy */ |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
164 | |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
165 | /* |
| 4927 | 166 | * Used in jabber_buddy_data.subscription, below |
| 167 | */ | |
| 168 | #define JABBER_SUB_NONE 0x0 | |
| 169 | #define JABBER_SUB_PENDING 0x1 | |
| 170 | #define JABBER_SUB_TO 0x2 | |
| 171 | #define JABBER_SUB_FROM 0x4 | |
| 172 | #define JABBER_SUB_BOTH (JABBER_SUB_TO | JABBER_SUB_FROM) | |
| 173 | ||
| 174 | ||
| 175 | /* | |
| 3311 | 176 | * It is *this* to which we point the buddy proto_data |
| 177 | */ | |
| 178 | struct jabber_buddy_data { | |
| 179 | GSList *resources; | |
| 180 | char *error_msg; | |
|
3340
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
181 | unsigned invisible; /* We've set presence type invisible for this buddy */ |
| 4927 | 182 | unsigned subscription; /* subscription type for this buddy */ |
| 3311 | 183 | }; |
| 184 | ||
| 185 | /* | |
| 186 | * per-resource info | |
| 187 | */ | |
| 188 | typedef struct jabber_resource_info { | |
| 3770 | 189 | char *name; |
| 3311 | 190 | int priority; |
| 191 | int state; | |
| 192 | char *away_msg; | |
| 193 | char *thread_id; | |
| 194 | gboolean has_composing; | |
| 5093 | 195 | gboolean has_xhtml; |
| 3311 | 196 | } *jab_res_info; |
| 197 | ||
| 198 | /* | |
| 199 | * For our own jid handling | |
| 200 | * | |
| 201 | * We do our own so we can cleanly parse buddy names | |
| 202 | * (user@server/resource) and rid ourselves of the | |
| 203 | * struct when we're done with it. The Jabber lib | |
| 204 | * structs last the life of the pool--we frequently | |
| 205 | * don't want that. | |
| 206 | * | |
| 207 | * We use the real jid structs so we can make use of | |
| 208 | * jid_safe(), jid_cmp() and some others. | |
| 209 | * | |
| 210 | * BE CAREFUL using the Jabber lib routines. | |
| 211 | * Many of them assume pool use and are not | |
| 212 | * amenable to use with our own! | |
| 213 | * | |
| 214 | * We give them special names so we know, throughout | |
| 215 | * the code, that they're not alloc'd out of pool | |
| 216 | * memory and we can, and must, dispose of them when | |
| 217 | * we're done with 'em. | |
| 218 | */ | |
| 219 | #define gaim_jid_struct jid_struct | |
| 220 | typedef struct gaim_jid_struct *gaim_jid; | |
| 221 | ||
| 222 | /* | |
| 2956 | 223 | * Jabber "chat group" info. Pointers to these go in jabber_data |
| 224 | * pending and existing chats lists. | |
| 225 | */ | |
| 2086 | 226 | struct jabber_chat { |
| 3311 | 227 | gaim_jid gjid; |
| 2086 | 228 | struct gaim_connection *gc; |
|
4359
cf899ee07d1d
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4357
diff
changeset
|
229 | struct gaim_conversation *b; |
| 2086 | 230 | int id; |
| 2956 | 231 | int state; |
| 2086 | 232 | }; |
| 233 | ||
| 2956 | 234 | /* |
| 235 | * Jabber chat states... | |
| 236 | * | |
| 237 | * Note: due to a bug in one version of the Jabber server, subscriptions | |
| 238 | * to chat groups aren't (always?) properly removed at the server. The | |
| 239 | * result is clients receive Jabber "presence" notifications for JIDs | |
| 240 | * they no longer care about. The problem with such vestigial notifies is | |
| 241 | * that we really have no way of telling if it's vestigial or if it's a | |
| 242 | * valid "buddy" presence notification. So we keep jabber_chat structs | |
| 243 | * around after leaving a chat group and simply mark them "closed." That | |
| 244 | * way we can test for such errant presence notifications. I.e.: if we | |
| 245 | * get a presence notfication from a JID that matches a chat group JID, | |
| 246 | * we disregard it. | |
| 247 | */ | |
| 248 | #define JCS_PENDING 1 /* pending */ | |
| 249 | #define JCS_ACTIVE 2 /* active */ | |
| 250 | #define JCS_CLOSED 3 /* closed */ | |
| 251 | ||
| 252 | ||
| 253 | #define STATE_EVT(arg) if(gjc->on_state) { (gjc->on_state)(gjc, (arg) ); } | |
| 254 | ||
| 255 | static void jabber_handlevcard(gjconn, xmlnode, char *); | |
| 2086 | 256 | |
| 3630 | 257 | static char *jabber_normalize(const char *s); |
| 258 | ||
| 2086 | 259 | static char *create_valid_jid(const char *given, char *server, char *resource) |
| 260 | { | |
| 261 | char *valid; | |
| 4927 | 262 | char *tmp; |
| 263 | ||
| 264 | if (!(tmp = strchr(given, '@'))) | |
| 2086 | 265 | valid = g_strdup_printf("%s@%s/%s", given, server, resource); |
| 4927 | 266 | else if (!strchr(tmp, '/')) |
| 2086 | 267 | valid = g_strdup_printf("%s/%s", given, resource); |
| 268 | else | |
| 269 | valid = g_strdup(given); | |
| 270 | ||
| 271 | return valid; | |
| 272 | } | |
| 273 | ||
|
4915
9e39899447b8
[gaim-migrate @ 5249]
Robert McQueen <robot101@debian.org>
parents:
4874
diff
changeset
|
274 | |
| 3311 | 275 | /* |
| 276 | * Dispose of a gaim_jid_struct | |
| 277 | */ | |
| 278 | static void gaim_jid_free(gaim_jid gjid) | |
| 279 | { | |
| 280 | if(gjid) { | |
| 281 | if(gjid->resource) | |
| 282 | free(gjid->resource); | |
| 283 | if(gjid->user) | |
| 284 | free(gjid->user); | |
| 285 | if(gjid->server) | |
| 286 | free(gjid->server); | |
| 287 | if(gjid->full) | |
| 288 | free(gjid->full); | |
| 289 | free(gjid); | |
| 290 | } | |
| 291 | } | |
| 292 | ||
| 293 | /* | |
| 294 | * Create a new gjid struct | |
| 295 | * | |
| 296 | * Unlike jid_new(), also creates "full." | |
| 297 | * | |
| 298 | * Shamelessly copied, in part, from jid.c: jid_new() | |
| 299 | * | |
| 300 | * Caller is responsible for freeing the space allocated by this via | |
| 301 | * gaim_jid_free(). | |
| 302 | * | |
| 303 | * JFIXME: Has a local declaration for jid.c:jid_safe(). I've put in a | |
| 304 | * request to have that added to libjabber's lib.h file. (JSeymour) | |
| 305 | */ | |
| 306 | static gaim_jid gaim_jid_new(char *name) | |
| 307 | { | |
| 308 | extern jid jid_safe(jid); /* *retch* */ | |
| 309 | ||
| 310 | gaim_jid gjid = NULL; | |
| 311 | ||
| 312 | if(name && strlen(name)) { | |
| 313 | char *server, *resource, *type, *str; | |
| 314 | int full_len = 0; | |
| 315 | ||
| 316 | /* user@server/resource */ | |
| 317 | ||
| 318 | str = strdup(name); /* we mangle a copy */ | |
| 319 | ||
| 320 | gjid = calloc(1, sizeof(struct gaim_jid_struct)); | |
| 321 | ||
| 322 | if((resource = strstr(str, "/")) != NULL) { | |
| 323 | *resource = '\0'; | |
| 324 | ++resource; | |
| 325 | if((full_len = strlen(resource)) > 0) { | |
| 326 | gjid->resource = strdup(resource); | |
| 327 | ++full_len; /* for later "/" addition */ | |
| 328 | } | |
| 329 | } else { | |
| 330 | resource = str + strlen(str); /* point to end */ | |
| 331 | } | |
| 332 | ||
| 333 | type = strstr(str, ":"); | |
| 334 | if(type != NULL && type < resource) { | |
| 335 | *type = '\0'; | |
| 336 | ++type; | |
| 337 | str = type; /* ignore the type: prefix */ | |
| 338 | } | |
| 339 | ||
| 340 | server = strstr(str, "@"); | |
| 341 | ||
| 342 | /* | |
| 343 | * if there's no @, it's just the server address | |
| 344 | */ | |
| 345 | if(server == NULL || server > resource) { | |
| 346 | gjid->server = strdup(str); | |
| 347 | full_len += strlen(str); | |
| 348 | } else { | |
| 349 | *server = '\0'; | |
| 350 | ++server; | |
| 351 | gjid->server = strdup(server); | |
| 352 | full_len += strlen(server) + 1; /* account for later "@" */ | |
| 353 | if(strlen(str) > 0) { | |
| 354 | gjid->user = strdup(str); | |
| 355 | full_len += strlen(str); | |
| 356 | } | |
| 357 | } | |
| 358 | ||
| 359 | free(str); | |
| 360 | ||
| 361 | if(!jid_safe(gjid)) { | |
| 362 | gaim_jid_free(gjid); | |
| 363 | gjid = NULL; | |
| 364 | } else { | |
| 365 | if(full_len) { | |
| 366 | char *s = gjid->full = malloc(++full_len); | |
| 367 | ||
| 368 | if(gjid->user) { | |
| 369 | strcpy(s, gjid->user); | |
| 370 | s += strlen(gjid->user); | |
| 371 | } | |
| 372 | if(gjid->server) { | |
| 373 | if(s > gjid->full) | |
| 374 | *(s++) = '@'; | |
| 375 | strcpy(s, gjid->server); | |
| 376 | s += strlen(gjid->server); | |
| 377 | } | |
| 378 | if(gjid->resource) { | |
| 379 | *(s++) = '/'; | |
| 380 | strcpy(s, gjid->resource); | |
| 381 | } | |
| 382 | } | |
| 383 | } | |
| 384 | } | |
| 385 | ||
| 386 | return gjid; | |
| 387 | } | |
| 388 | ||
| 389 | /* | |
| 390 | * Get a "username@server" from unadorned "username" | |
| 391 | * | |
| 392 | * If there's no "@server" part and "who" doesn't match the | |
| 393 | * gjconn server (which would indicate that "who" *is* the | |
| 394 | * server in case of server messages), the gjconn server is | |
| 395 | * appended. | |
| 396 | * | |
| 397 | * If incl_resource is TRUE (non-0), the returned string | |
| 398 | * includes the "/resource" part (if it exists), otherwise not. | |
| 399 | * | |
| 400 | * Allocates space for returned string. Caller is | |
| 401 | * responsible for freeing it with g_free(). | |
| 402 | * | |
| 403 | * If "gjid" is non-null, sets that as well. Caller is | |
| 404 | * reponsible for freeing that via gaim_jid_free() when done | |
| 405 | * with it. | |
| 406 | */ | |
| 3466 | 407 | static gchar *get_realwho(gjconn gjc, const char *who, int incl_resource, gaim_jid *gjid) |
| 3311 | 408 | { |
| 409 | gaim_jid my_gjid; | |
| 410 | gchar *my_who; | |
| 411 | gchar *realwho = NULL; | |
| 412 | ||
| 413 | if(!(who && who[0])) { | |
| 414 | return NULL; | |
| 415 | } | |
| 416 | ||
| 417 | /* | |
| 418 | * Bare username and "username" not the server itself? | |
| 419 | */ | |
| 420 | if(!strchr(who, '@') && strcasecmp(who, gjc->user->server)) { | |
| 421 | my_who = g_strdup_printf("%s@%s", who, gjc->user->server); | |
| 422 | } else { | |
| 423 | my_who = g_strdup(who); | |
| 424 | } | |
| 425 | ||
| 426 | if((my_gjid = gaim_jid_new(my_who)) != NULL) { | |
| 427 | /* | |
| 428 | * If there's no "user" part, "who" was just the server or perhaps a transport (?) | |
| 429 | */ | |
| 430 | if(my_gjid->user) { | |
| 431 | /* | |
| 432 | * Include "/resource" bit? | |
| 433 | */ | |
| 434 | if(incl_resource) { | |
| 435 | realwho = g_strdup(my_gjid->full); | |
| 436 | } else { | |
| 437 | realwho = g_strdup_printf("%s@%s", my_gjid->user, my_gjid->server); | |
| 438 | } | |
| 439 | } else { | |
| 440 | realwho = g_strdup(my_gjid->server); | |
| 441 | } | |
| 442 | } | |
| 443 | ||
| 444 | g_free(my_who); | |
| 445 | ||
| 446 | if(gjid) { | |
| 447 | *gjid = my_gjid; | |
| 448 | } else { | |
| 449 | gaim_jid_free(my_gjid); | |
| 450 | } | |
| 451 | ||
| 452 | return realwho; | |
| 453 | } | |
| 454 | ||
| 2086 | 455 | static gjconn gjab_new(char *user, char *pass, void *priv) |
| 456 | { | |
| 457 | pool p; | |
| 2956 | 458 | gjconn gjc; |
| 2086 | 459 | |
| 460 | if (!user) | |
| 461 | return (NULL); | |
| 462 | ||
| 463 | p = pool_new(); | |
| 464 | if (!p) | |
| 465 | return (NULL); | |
| 2956 | 466 | gjc = pmalloc_x(p, sizeof(gjconn_struct), 0); |
| 467 | if (!gjc) { | |
| 468 | pool_free(p); /* no need for this anymore! */ | |
| 2086 | 469 | return (NULL); |
| 2956 | 470 | } |
| 471 | gjc->p = p; | |
| 472 | ||
|
3236
1507dc2b5719
[gaim-migrate @ 3253]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3234
diff
changeset
|
473 | if((gjc->user = jid_new(p, user)) == NULL) { |
|
1507dc2b5719
[gaim-migrate @ 3253]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3234
diff
changeset
|
474 | pool_free(p); /* no need for this anymore! */ |
|
1507dc2b5719
[gaim-migrate @ 3253]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3234
diff
changeset
|
475 | return (NULL); |
|
1507dc2b5719
[gaim-migrate @ 3253]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3234
diff
changeset
|
476 | } |
| 3257 | 477 | |
| 478 | gjc->pass = strdup(pass); | |
| 2956 | 479 | |
| 480 | gjc->state = JCONN_STATE_OFF; | |
|
3074
b6510843df8f
[gaim-migrate @ 3088]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3059
diff
changeset
|
481 | gjc->was_connected = 0; |
| 2956 | 482 | gjc->id = 1; |
| 483 | gjc->fd = -1; | |
| 484 | ||
| 485 | gjc->priv = priv; | |
| 486 | ||
| 487 | return gjc; | |
| 2086 | 488 | } |
| 489 | ||
| 2956 | 490 | static void gjab_delete(gjconn gjc) |
| 2086 | 491 | { |
| 2956 | 492 | if (!gjc) |
| 2086 | 493 | return; |
| 494 | ||
| 2956 | 495 | gjab_stop(gjc); |
| 3257 | 496 | free(gjc->pass); |
| 2956 | 497 | pool_free(gjc->p); |
| 2086 | 498 | } |
| 499 | ||
| 2956 | 500 | static void gjab_state_handler(gjconn gjc, gjconn_state_h h) |
| 2086 | 501 | { |
| 2956 | 502 | if (!gjc) |
| 2086 | 503 | return; |
| 504 | ||
| 2956 | 505 | gjc->on_state = h; |
| 2086 | 506 | } |
| 507 | ||
| 2956 | 508 | static void gjab_packet_handler(gjconn gjc, gjconn_packet_h h) |
| 2086 | 509 | { |
| 2956 | 510 | if (!gjc) |
| 2086 | 511 | return; |
| 512 | ||
| 2956 | 513 | gjc->on_packet = h; |
| 2086 | 514 | } |
| 515 | ||
| 2956 | 516 | static void gjab_stop(gjconn gjc) |
| 2086 | 517 | { |
| 2956 | 518 | if (!gjc || gjc->state == JCONN_STATE_OFF) |
| 2086 | 519 | return; |
| 520 | ||
| 2956 | 521 | gjab_send_raw(gjc, "</stream:stream>"); |
| 522 | gjc->state = JCONN_STATE_OFF; | |
|
3074
b6510843df8f
[gaim-migrate @ 3088]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3059
diff
changeset
|
523 | gjc->was_connected = 0; |
| 2956 | 524 | close(gjc->fd); |
| 525 | gjc->fd = -1; | |
| 526 | XML_ParserFree(gjc->parser); | |
| 527 | gjc->parser = NULL; | |
| 2086 | 528 | } |
| 529 | ||
| 530 | /* | |
| 2956 | 531 | static int gjab_getfd(gjconn gjc) |
| 2086 | 532 | { |
| 2956 | 533 | if (gjc) |
| 534 | return gjc->fd; | |
| 2086 | 535 | else |
| 536 | return -1; | |
| 537 | } | |
| 538 | ||
| 2956 | 539 | static jid gjab_getjid(gjconn gjc) |
| 2086 | 540 | { |
| 2956 | 541 | if (gjc) |
| 542 | return (gjc->user); | |
| 2086 | 543 | else |
| 544 | return NULL; | |
| 545 | } | |
| 546 | ||
| 2956 | 547 | static char *gjab_getsid(gjconn gjc) |
| 2086 | 548 | { |
| 2956 | 549 | if (gjc) |
| 550 | return (gjc->sid); | |
| 2086 | 551 | else |
| 552 | return NULL; | |
| 553 | } | |
| 554 | */ | |
| 555 | ||
| 2956 | 556 | static char *gjab_getid(gjconn gjc) |
| 2086 | 557 | { |
| 2956 | 558 | snprintf(gjc->idbuf, 8, "%d", gjc->id++); |
| 559 | return &gjc->idbuf[0]; | |
| 2086 | 560 | } |
| 561 | ||
| 2956 | 562 | static void gjab_send(gjconn gjc, xmlnode x) |
| 2086 | 563 | { |
| 2956 | 564 | if (gjc && gjc->state != JCONN_STATE_OFF) { |
| 2086 | 565 | char *buf = xmlnode2str(x); |
| 566 | if (buf) | |
| 3630 | 567 | #ifndef _WIN32 |
| 2956 | 568 | write(gjc->fd, buf, strlen(buf)); |
| 3630 | 569 | #else |
| 570 | send(gjc->fd, buf, strlen(buf), 0); | |
| 571 | #endif | |
|
5223
4ea16d1f5cd1
[gaim-migrate @ 5593]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
572 | gaim_debug(GAIM_DEBUG_MISC, "jabber", "gjab_send: %s\n", buf); |
| 2086 | 573 | } |
| 574 | } | |
| 575 | ||
| 2956 | 576 | static void gjab_send_raw(gjconn gjc, const char *str) |
| 2086 | 577 | { |
| 2956 | 578 | if (gjc && gjc->state != JCONN_STATE_OFF) { |
| 579 | /* | |
| 580 | * JFIXME: No error detection?!?! | |
| 581 | */ | |
| 3630 | 582 | #ifndef _WIN32 |
| 2956 | 583 | if(write(gjc->fd, str, strlen(str)) < 0) { |
| 3630 | 584 | #else |
| 585 | if(send(gjc->fd, str, strlen(str), 0) < 0) { | |
| 586 | #endif | |
| 2956 | 587 | fprintf(stderr, "DBG: Problem sending. Error: %d\n", errno); |
| 588 | fflush(stderr); | |
| 589 | } | |
| 4450 | 590 | /* printing keepalives to the debug window is really annoying */ |
| 591 | if(strcmp(str, JABBER_KEEPALIVE_STRING)) | |
|
5223
4ea16d1f5cd1
[gaim-migrate @ 5593]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
592 | gaim_debug(GAIM_DEBUG_MISC, "jabber", "gjab_send_raw: %s\n", str); |
| 2086 | 593 | } |
| 594 | } | |
| 595 | ||
| 2956 | 596 | static void gjab_reqroster(gjconn gjc) |
| 2086 | 597 | { |
| 598 | xmlnode x; | |
| 599 | ||
| 600 | x = jutil_iqnew(JPACKET__GET, NS_ROSTER); | |
| 2956 | 601 | xmlnode_put_attrib(x, "id", gjab_getid(gjc)); |
| 602 | ||
| 603 | gjab_send(gjc, x); | |
| 2086 | 604 | xmlnode_free(x); |
| 605 | } | |
| 606 | ||
| 2956 | 607 | static void gjab_reqauth(gjconn gjc) |
|
2814
91cc1a0cdee0
[gaim-migrate @ 2827]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2800
diff
changeset
|
608 | { |
|
91cc1a0cdee0
[gaim-migrate @ 2827]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2800
diff
changeset
|
609 | xmlnode x, y, z; |
|
91cc1a0cdee0
[gaim-migrate @ 2827]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2800
diff
changeset
|
610 | char *user; |
|
91cc1a0cdee0
[gaim-migrate @ 2827]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2800
diff
changeset
|
611 | |
| 2956 | 612 | if (!gjc) |
|
2814
91cc1a0cdee0
[gaim-migrate @ 2827]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2800
diff
changeset
|
613 | return; |
|
91cc1a0cdee0
[gaim-migrate @ 2827]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2800
diff
changeset
|
614 | |
|
91cc1a0cdee0
[gaim-migrate @ 2827]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2800
diff
changeset
|
615 | x = jutil_iqnew(JPACKET__GET, NS_AUTH); |
|
91cc1a0cdee0
[gaim-migrate @ 2827]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2800
diff
changeset
|
616 | xmlnode_put_attrib(x, "id", IQID_AUTH); |
|
91cc1a0cdee0
[gaim-migrate @ 2827]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2800
diff
changeset
|
617 | y = xmlnode_get_tag(x, "query"); |
|
91cc1a0cdee0
[gaim-migrate @ 2827]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2800
diff
changeset
|
618 | |
| 2956 | 619 | user = gjc->user->user; |
|
2814
91cc1a0cdee0
[gaim-migrate @ 2827]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2800
diff
changeset
|
620 | |
|
91cc1a0cdee0
[gaim-migrate @ 2827]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2800
diff
changeset
|
621 | if (user) { |
|
91cc1a0cdee0
[gaim-migrate @ 2827]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2800
diff
changeset
|
622 | z = xmlnode_insert_tag(y, "username"); |
|
91cc1a0cdee0
[gaim-migrate @ 2827]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2800
diff
changeset
|
623 | xmlnode_insert_cdata(z, user, -1); |
|
91cc1a0cdee0
[gaim-migrate @ 2827]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2800
diff
changeset
|
624 | } |
|
91cc1a0cdee0
[gaim-migrate @ 2827]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2800
diff
changeset
|
625 | |
| 2956 | 626 | gjab_send(gjc, x); |
|
2814
91cc1a0cdee0
[gaim-migrate @ 2827]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2800
diff
changeset
|
627 | xmlnode_free(x); |
|
91cc1a0cdee0
[gaim-migrate @ 2827]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2800
diff
changeset
|
628 | } |
|
91cc1a0cdee0
[gaim-migrate @ 2827]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2800
diff
changeset
|
629 | |
| 2956 | 630 | static void gjab_auth(gjconn gjc) |
| 2086 | 631 | { |
| 632 | xmlnode x, y, z; | |
| 633 | char *hash, *user; | |
| 634 | ||
| 2956 | 635 | if (!gjc) |
| 2086 | 636 | return; |
| 637 | ||
| 638 | x = jutil_iqnew(JPACKET__SET, NS_AUTH); | |
| 639 | xmlnode_put_attrib(x, "id", IQID_AUTH); | |
| 640 | y = xmlnode_get_tag(x, "query"); | |
| 641 | ||
| 2956 | 642 | user = gjc->user->user; |
| 2086 | 643 | |
| 644 | if (user) { | |
| 645 | z = xmlnode_insert_tag(y, "username"); | |
| 646 | xmlnode_insert_cdata(z, user, -1); | |
| 647 | } | |
| 648 | ||
| 649 | z = xmlnode_insert_tag(y, "resource"); | |
| 2956 | 650 | xmlnode_insert_cdata(z, gjc->user->resource, -1); |
| 651 | ||
| 652 | if (gjc->sid) { | |
|
5223
4ea16d1f5cd1
[gaim-migrate @ 5593]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
653 | gaim_debug(GAIM_DEBUG_MISC, "jabber", |
|
4ea16d1f5cd1
[gaim-migrate @ 5593]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
654 | "digest authentication (sid %s)\n", gjc->sid); |
| 2086 | 655 | z = xmlnode_insert_tag(y, "digest"); |
| 2956 | 656 | hash = pmalloc(x->p, strlen(gjc->sid) + strlen(gjc->pass) + 1); |
| 657 | strcpy(hash, gjc->sid); | |
| 658 | strcat(hash, gjc->pass); | |
| 2086 | 659 | hash = shahash(hash); |
| 660 | xmlnode_insert_cdata(z, hash, 40); | |
| 661 | } else { | |
| 662 | z = xmlnode_insert_tag(y, "password"); | |
| 2956 | 663 | xmlnode_insert_cdata(z, gjc->pass, -1); |
| 2086 | 664 | } |
| 665 | ||
| 2956 | 666 | gjab_send(gjc, x); |
| 2086 | 667 | xmlnode_free(x); |
| 668 | ||
| 669 | return; | |
| 670 | } | |
| 671 | ||
| 2956 | 672 | static void gjab_recv(gjconn gjc) |
| 2086 | 673 | { |
| 674 | static char buf[4096]; | |
| 675 | int len; | |
| 676 | ||
| 2956 | 677 | if (!gjc || gjc->state == JCONN_STATE_OFF) |
| 2086 | 678 | return; |
| 3630 | 679 | #ifndef _WIN32 |
| 3234 | 680 | if ((len = read(gjc->fd, buf, sizeof(buf) - 1)) > 0) { |
| 3630 | 681 | #else |
| 682 | if ((len = recv(gjc->fd, buf, sizeof(buf) - 1, 0)) > 0) { | |
| 683 | #endif | |
| 2956 | 684 | struct jabber_data *jd = GJ_GC(gjc)->proto_data; |
| 2086 | 685 | buf[len] = '\0'; |
|
5223
4ea16d1f5cd1
[gaim-migrate @ 5593]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
686 | gaim_debug(GAIM_DEBUG_MISC, "jabber", |
|
4ea16d1f5cd1
[gaim-migrate @ 5593]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
687 | "input (len %d): %s\n", len, buf); |
| 2956 | 688 | XML_Parse(gjc->parser, buf, len, 0); |
|
2800
06490388d3e9
[gaim-migrate @ 2813]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2791
diff
changeset
|
689 | if (jd->die) |
| 2956 | 690 | signoff(GJ_GC(gjc)); |
|
3105
8c23b0ec1036
[gaim-migrate @ 3119]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3074
diff
changeset
|
691 | } else if (len < 0 || errno != EAGAIN) { |
| 2086 | 692 | STATE_EVT(JCONN_STATE_OFF) |
| 693 | } | |
| 694 | } | |
| 695 | ||
| 696 | static void startElement(void *userdata, const char *name, const char **attribs) | |
| 697 | { | |
| 698 | xmlnode x; | |
| 2956 | 699 | gjconn gjc = (gjconn) userdata; |
| 700 | ||
| 701 | if (gjc->current) { | |
| 2086 | 702 | /* Append the node to the current one */ |
| 2956 | 703 | x = xmlnode_insert_tag(gjc->current, name); |
| 2086 | 704 | xmlnode_put_expat_attribs(x, attribs); |
| 705 | ||
| 2956 | 706 | gjc->current = x; |
| 2086 | 707 | } else { |
| 708 | x = xmlnode_new_tag(name); | |
| 709 | xmlnode_put_expat_attribs(x, attribs); | |
| 710 | if (strcmp(name, "stream:stream") == 0) { | |
| 711 | /* special case: name == stream:stream */ | |
| 712 | /* id attrib of stream is stored for digest auth */ | |
| 2956 | 713 | gjc->sid = g_strdup(xmlnode_get_attrib(x, "id")); |
| 2086 | 714 | /* STATE_EVT(JCONN_STATE_AUTH) */ |
|
2635
60897108c74c
[gaim-migrate @ 2648]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2607
diff
changeset
|
715 | xmlnode_free(x); |
| 2086 | 716 | } else { |
| 2956 | 717 | gjc->current = x; |
| 2086 | 718 | } |
| 719 | } | |
| 720 | } | |
| 721 | ||
| 722 | static void endElement(void *userdata, const char *name) | |
| 723 | { | |
| 2956 | 724 | gjconn gjc = (gjconn) userdata; |
| 2086 | 725 | xmlnode x; |
| 726 | jpacket p; | |
| 727 | ||
| 2956 | 728 | if (gjc->current == NULL) { |
| 2086 | 729 | /* we got </stream:stream> */ |
| 730 | STATE_EVT(JCONN_STATE_OFF) | |
| 731 | return; | |
| 732 | } | |
| 733 | ||
| 2956 | 734 | x = xmlnode_get_parent(gjc->current); |
| 2086 | 735 | |
| 736 | if (!x) { | |
| 737 | /* it is time to fire the event */ | |
| 2956 | 738 | p = jpacket_new(gjc->current); |
| 739 | ||
| 740 | if (gjc->on_packet) | |
| 741 | (gjc->on_packet) (gjc, p); | |
| 2086 | 742 | else |
| 2956 | 743 | xmlnode_free(gjc->current); |
| 2086 | 744 | } |
| 745 | ||
| 2956 | 746 | gjc->current = x; |
| 2086 | 747 | } |
| 748 | ||
|
2090
bab8b7e309db
[gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
749 | static void jabber_callback(gpointer data, gint source, GaimInputCondition condition) |
| 2086 | 750 | { |
| 751 | struct gaim_connection *gc = (struct gaim_connection *)data; | |
| 752 | struct jabber_data *jd = (struct jabber_data *)gc->proto_data; | |
| 753 | ||
| 2956 | 754 | gjab_recv(jd->gjc); |
| 2086 | 755 | } |
| 756 | ||
| 757 | static void charData(void *userdata, const char *s, int slen) | |
| 758 | { | |
| 2956 | 759 | gjconn gjc = (gjconn) userdata; |
| 760 | ||
| 761 | if (gjc->current) | |
| 762 | xmlnode_insert_cdata(gjc->current, s, slen); | |
| 2086 | 763 | } |
| 764 | ||
|
2090
bab8b7e309db
[gaim-migrate @ 2100]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
765 | static void gjab_connected(gpointer data, gint source, GaimInputCondition cond) |
| 2086 | 766 | { |
| 767 | xmlnode x; | |
| 768 | char *t, *t2; | |
| 769 | struct gaim_connection *gc = data; | |
| 770 | struct jabber_data *jd; | |
| 2956 | 771 | gjconn gjc; |
| 2086 | 772 | |
| 773 | if (!g_slist_find(connections, gc)) { | |
| 774 | close(source); | |
| 775 | return; | |
| 776 | } | |
| 777 | ||
| 778 | jd = gc->proto_data; | |
| 2956 | 779 | gjc = jd->gjc; |
| 780 | ||
|
4366
d2b52a5ff6fc
[gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents:
4359
diff
changeset
|
781 | gjc->fd = source; |
|
2300
06a3c10f4918
[gaim-migrate @ 2310]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2289
diff
changeset
|
782 | |
| 2086 | 783 | if (source == -1) { |
| 784 | STATE_EVT(JCONN_STATE_OFF) | |
| 785 | return; | |
| 786 | } | |
| 787 | ||
| 2956 | 788 | gjc->state = JCONN_STATE_CONNECTED; |
| 2086 | 789 | STATE_EVT(JCONN_STATE_CONNECTED) |
| 790 | ||
| 791 | /* start stream */ | |
| 2956 | 792 | x = jutil_header(NS_CLIENT, gjc->user->server); |
| 2086 | 793 | t = xmlnode2str(x); |
| 794 | /* this is ugly, we can create the string here instead of jutil_header */ | |
| 795 | /* what do you think about it? -madcat */ | |
| 796 | t2 = strstr(t, "/>"); | |
| 797 | *t2++ = '>'; | |
| 798 | *t2 = '\0'; | |
| 2956 | 799 | gjab_send_raw(gjc, "<?xml version='1.0'?>"); |
| 800 | gjab_send_raw(gjc, t); | |
| 2086 | 801 | xmlnode_free(x); |
| 802 | ||
| 2956 | 803 | gjc->state = JCONN_STATE_ON; |
| 2086 | 804 | STATE_EVT(JCONN_STATE_ON); |
| 805 | ||
| 2956 | 806 | gc = GJ_GC(gjc); |
| 807 | gc->inpa = gaim_input_add(gjc->fd, GAIM_INPUT_READ, jabber_callback, gc); | |
| 2086 | 808 | } |
| 809 | ||
| 2956 | 810 | static void gjab_start(gjconn gjc) |
| 2086 | 811 | { |
| 4491 | 812 | struct gaim_account *account; |
|
4366
d2b52a5ff6fc
[gaim-migrate @ 4632]
Nicolás Lichtmaier <nico@lichtmaier.com.ar>
parents:
4359
diff
changeset
|
813 | int port, rc; |
| 4436 | 814 | char *server; |
| 2086 | 815 | |
| 2956 | 816 | if (!gjc || gjc->state != JCONN_STATE_OFF) |
| 2086 | 817 | return; |
| 818 | ||
| 4491 | 819 | account = GJ_GC(gjc)->account; |
| 820 | port = account->proto_opt[USEROPT_PORT][0] ? atoi(account->proto_opt[USEROPT_PORT]) : DEFAULT_PORT; | |
| 821 | server = account->proto_opt[USEROPT_CONN_SERVER][0] ? account->proto_opt[USEROPT_CONN_SERVER] : gjc->user->server; | |
| 4436 | 822 | |
| 2086 | 823 | |
| 2956 | 824 | gjc->parser = XML_ParserCreate(NULL); |
| 825 | XML_SetUserData(gjc->parser, (void *)gjc); | |
| 826 | XML_SetElementHandler(gjc->parser, startElement, endElement); | |
| 827 | XML_SetCharacterDataHandler(gjc->parser, charData); | |
| 828 | ||
| 4634 | 829 | rc = proxy_connect(account, server, port, gjab_connected, GJ_GC(gjc)); |
| 4491 | 830 | if (!account->gc || (rc != 0)) { |
| 2086 | 831 | STATE_EVT(JCONN_STATE_OFF) |
| 832 | return; | |
| 833 | } | |
| 834 | } | |
| 835 | ||
| 2956 | 836 | /* |
| 837 | * Find chat by chat group name | |
| 838 | */ | |
|
4359
cf899ee07d1d
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4357
diff
changeset
|
839 | static struct gaim_conversation *find_chat(struct gaim_connection *gc, char *name) |
| 2086 | 840 | { |
| 841 | GSList *bcs = gc->buddy_chats; | |
|
4359
cf899ee07d1d
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4357
diff
changeset
|
842 | struct gaim_conversation *b = NULL; |
| 2086 | 843 | char *chat = g_strdup(normalize(name)); |
| 844 | ||
| 845 | while (bcs) { | |
| 846 | b = bcs->data; | |
| 847 | if (!strcasecmp(normalize(b->name), chat)) | |
| 848 | break; | |
| 849 | b = NULL; | |
| 850 | bcs = bcs->next; | |
| 851 | } | |
| 852 | ||
| 853 | g_free(chat); | |
| 854 | return b; | |
| 855 | } | |
| 856 | ||
| 2956 | 857 | /* |
| 858 | * Find chat by "chat id" | |
| 859 | * | |
| 860 | * Returns: 0 on success and jabber_chat pointer set | |
| 861 | * or -EINVAL on error and jabber_chat pointer is | |
| 862 | * undefined. | |
| 863 | * | |
| 864 | * TBD: Slogging through the buddy_chats list seems | |
| 865 | * redundant since the chat i.d. is mirrored in the | |
| 866 | * jabber_chat struct list. But that's the way it | |
| 867 | * was, so that's the way I'm leaving it--for now. | |
| 868 | */ | |
| 869 | static int jabber_find_chat_by_convo_id(struct gaim_connection *gc, int id, struct jabber_chat **jc) | |
| 2086 | 870 | { |
| 2956 | 871 | GSList *bcs = gc->buddy_chats; |
|
4359
cf899ee07d1d
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4357
diff
changeset
|
872 | struct gaim_conversation *b = NULL; |
| 2956 | 873 | struct jabber_data *jd = gc->proto_data; |
| 874 | ||
| 875 | *jc = NULL; | |
| 876 | ||
| 877 | while(bcs != NULL) { | |
| 878 | b = bcs->data; | |
|
4359
cf899ee07d1d
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4357
diff
changeset
|
879 | if (id == gaim_chat_get_id(GAIM_CHAT(b))) |
| 2956 | 880 | break; |
| 881 | bcs = bcs->next; | |
| 882 | } | |
| 883 | ||
| 884 | if (bcs != NULL) { | |
| 885 | bcs = jd->chats; | |
| 886 | while (bcs != NULL) { | |
| 887 | *jc = bcs->data; | |
| 888 | if ((*jc)->state == JCS_ACTIVE && (*jc)->b == b) | |
| 889 | break; | |
| 890 | bcs = bcs->next; | |
| 891 | } | |
| 892 | } | |
| 893 | ||
| 894 | return(bcs == NULL? -EINVAL : 0); | |
| 895 | } | |
| 896 | ||
| 897 | /* | |
| 898 | * Find any chat | |
| 899 | */ | |
| 900 | static struct jabber_chat *find_any_chat(struct gaim_connection *gc, jid chat) | |
| 901 | { | |
| 902 | GSList *jcs = ((struct jabber_data *)gc->proto_data)->chats; | |
| 2086 | 903 | struct jabber_chat *jc = NULL; |
| 904 | ||
| 2956 | 905 | while (jcs) { |
| 906 | jc = jcs->data; | |
| 3311 | 907 | if (!jid_cmpx(chat, jc->gjid, JID_USER | JID_SERVER)) |
| 2086 | 908 | break; |
| 909 | jc = NULL; | |
| 2956 | 910 | jcs = jcs->next; |
| 2086 | 911 | } |
| 912 | ||
| 913 | return jc; | |
| 914 | } | |
| 915 | ||
| 2956 | 916 | |
| 917 | /* | |
| 918 | * Find existing/active Jabber chat | |
| 919 | */ | |
| 920 | static struct jabber_chat *find_existing_chat(struct gaim_connection *gc, jid chat) | |
| 921 | { | |
| 922 | GSList *jcs = ((struct jabber_data *)gc->proto_data)->chats; | |
| 923 | struct jabber_chat *jc = NULL; | |
| 924 | ||
| 925 | while (jcs) { | |
| 926 | jc = jcs->data; | |
| 3311 | 927 | if (jc->state == JCS_ACTIVE && !jid_cmpx(chat, jc->gjid, JID_USER | JID_SERVER)) |
| 2956 | 928 | break; |
| 929 | jc = NULL; | |
| 930 | jcs = jcs->next; | |
| 931 | } | |
| 932 | ||
| 933 | return jc; | |
| 934 | } | |
| 935 | ||
| 936 | /* | |
| 937 | * Find pending chat | |
| 938 | */ | |
| 2086 | 939 | static struct jabber_chat *find_pending_chat(struct gaim_connection *gc, jid chat) |
| 940 | { | |
| 2956 | 941 | GSList *jcs = ((struct jabber_data *)gc->proto_data)->chats; |
| 2086 | 942 | struct jabber_chat *jc = NULL; |
| 943 | ||
| 2956 | 944 | while (jcs) { |
| 945 | jc = jcs->data; | |
| 3311 | 946 | if (jc->state == JCS_PENDING && !jid_cmpx(chat, jc->gjid, JID_USER | JID_SERVER)) |
| 2086 | 947 | break; |
| 948 | jc = NULL; | |
| 2956 | 949 | jcs = jcs->next; |
| 2086 | 950 | } |
| 951 | ||
| 952 | return jc; | |
| 953 | } | |
| 954 | ||
|
4359
cf899ee07d1d
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4357
diff
changeset
|
955 | static gboolean find_chat_buddy(struct gaim_conversation *b, char *name) |
| 2086 | 956 | { |
|
4359
cf899ee07d1d
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4357
diff
changeset
|
957 | GList *m = gaim_chat_get_users(GAIM_CHAT(b)); |
| 2086 | 958 | |
| 959 | while (m) { | |
| 960 | if (!strcmp(m->data, name)) | |
| 961 | return TRUE; | |
| 962 | m = m->next; | |
| 963 | } | |
| 964 | ||
| 965 | return FALSE; | |
| 966 | } | |
| 967 | ||
| 2956 | 968 | /* |
|
3236
1507dc2b5719
[gaim-migrate @ 3253]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3234
diff
changeset
|
969 | * Remove a buddy from the (gaim) buddylist (if he's on it) |
|
1507dc2b5719
[gaim-migrate @ 3253]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3234
diff
changeset
|
970 | */ |
| 3466 | 971 | static void jabber_remove_gaim_buddy(struct gaim_connection *gc, const char *buddyname) |
|
3236
1507dc2b5719
[gaim-migrate @ 3253]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3234
diff
changeset
|
972 | { |
|
1507dc2b5719
[gaim-migrate @ 3253]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3234
diff
changeset
|
973 | struct buddy *b; |
|
1507dc2b5719
[gaim-migrate @ 3253]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3234
diff
changeset
|
974 | |
| 4687 | 975 | if ((b = gaim_find_buddy(gc->account, buddyname)) != NULL) { |
|
5223
4ea16d1f5cd1
[gaim-migrate @ 5593]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
976 | gaim_debug(GAIM_DEBUG_INFO, "jabber", |
|
4ea16d1f5cd1
[gaim-migrate @ 5593]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
977 | "removing buddy [1]: %s\n", buddyname); |
| 4687 | 978 | gaim_blist_remove_buddy(b); |
| 4349 | 979 | gaim_blist_save(); |
|
3236
1507dc2b5719
[gaim-migrate @ 3253]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3234
diff
changeset
|
980 | } |
|
1507dc2b5719
[gaim-migrate @ 3253]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3234
diff
changeset
|
981 | } |
|
1507dc2b5719
[gaim-migrate @ 3253]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3234
diff
changeset
|
982 | |
| 3466 | 983 | static void jabber_change_passwd(struct gaim_connection *gc, const char *old, const char *new) |
| 3257 | 984 | { |
| 985 | gjconn gjc = ((struct jabber_data *)gc->proto_data)->gjc; | |
| 986 | ||
| 987 | if(strcmp(old, gjc->pass)) | |
| 988 | { | |
| 3427 | 989 | do_error_dialog(_("Unable to change password."), |
| 990 | _("The current password you entered is incorrect. Your password has " | |
| 991 | "not been changed."), GAIM_ERROR); | |
| 3257 | 992 | } |
| 993 | else if(!strcmp(old, new)) | |
| 994 | { | |
| 3427 | 995 | do_error_dialog(_("Unable to change password"), |
| 4059 | 996 | _("The new password you entered is the same as your current password. " |
| 3427 | 997 | "Your password remains the same."), GAIM_ERROR); |
| 3257 | 998 | } |
| 999 | else | |
| 1000 | { | |
| 1001 | xmlnode x, y, z; | |
| 1002 | char *id; | |
| 1003 | ||
| 1004 | x = jutil_iqnew(JPACKET__SET, NS_REGISTER); | |
| 1005 | xmlnode_put_attrib(x, "to", gjc->user->server); | |
| 1006 | y = xmlnode_get_tag(x, "query"); | |
| 1007 | z = xmlnode_insert_tag(y, "username"); | |
| 1008 | xmlnode_insert_cdata(z, gjc->user->user, -1); | |
| 1009 | z = xmlnode_insert_tag(y, "password"); | |
| 1010 | xmlnode_insert_cdata(z, new, -1); | |
| 1011 | ||
| 1012 | id = gjab_getid(gjc); | |
| 1013 | xmlnode_put_attrib(x, "id", id); | |
| 1014 | ||
| 1015 | free(gjc->pass); | |
| 1016 | gjc->pass = strdup(new); | |
| 1017 | ||
| 1018 | g_hash_table_insert(gjc->queries, g_strdup(id), g_strdup("change_password")); | |
| 1019 | ||
| 1020 | gjab_send(gjc, x); | |
| 1021 | xmlnode_free(x); | |
| 1022 | } | |
| 1023 | } | |
| 3311 | 1024 | |
|
3340
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
1025 | /* |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
1026 | * Return pointer to jabber_buddy_data if buddy found. Create if necessary. |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
1027 | */ |
| 5136 | 1028 | static struct jabber_buddy_data* jabber_find_buddy(struct gaim_connection *gc, const char *buddy, gboolean create) |
| 3311 | 1029 | { |
| 1030 | struct jabber_data *jd = gc->proto_data; | |
| 1031 | gpointer val; | |
| 1032 | char *realwho; | |
| 1033 | ||
| 1034 | if((realwho = get_realwho(jd->gjc, buddy, FALSE, NULL)) == NULL) | |
| 1035 | return NULL; | |
| 1036 | ||
| 1037 | val = g_hash_table_lookup(jd->buddies, realwho); | |
| 1038 | if(val) { | |
| 1039 | g_free(realwho); | |
| 1040 | return (struct jabber_buddy_data *)val; | |
| 1041 | ||
| 5135 | 1042 | } else if (create) { |
| 3311 | 1043 | struct jabber_buddy_data *jbd = g_new0(struct jabber_buddy_data, 1); |
|
3340
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
1044 | jbd->invisible = JABBER_NOT_INVIS; |
| 3311 | 1045 | g_hash_table_insert(jd->buddies, g_strdup(realwho), jbd); |
| 1046 | g_free(realwho); | |
| 1047 | return jbd; | |
| 5135 | 1048 | } else { |
| 1049 | return NULL; | |
| 3311 | 1050 | } |
| 1051 | } | |
| 3770 | 1052 | |
|
3236
1507dc2b5719
[gaim-migrate @ 3253]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3234
diff
changeset
|
1053 | /* |
| 3311 | 1054 | * find a resource by name, or if no name given, return the "default" resource |
| 3770 | 1055 | * default being the highest priority one. |
| 3311 | 1056 | */ |
| 1057 | ||
| 5136 | 1058 | static jab_res_info jabber_find_resource(struct gaim_connection *gc, const char *who) |
| 3311 | 1059 | { |
| 1060 | GSList *resources; | |
| 5135 | 1061 | struct jabber_buddy_data *jbd = jabber_find_buddy(gc, who, FALSE); |
| 3311 | 1062 | jab_res_info jri = NULL; |
| 1063 | char *res = strstr(who, "/"); | |
| 1064 | ||
| 1065 | if(res) | |
| 1066 | res++; | |
| 1067 | ||
| 1068 | if(jbd) | |
| 1069 | { | |
| 1070 | resources = jbd->resources; | |
| 1071 | while(resources) | |
| 1072 | { | |
| 1073 | if(!jri && !res) { | |
| 1074 | jri = (jab_res_info) resources->data; | |
| 1075 | } else if(!res) { /* we're looking for the default priority, so... */ | |
| 1076 | if(((jab_res_info) resources->data)->priority >= jri->priority) | |
| 1077 | jri = (jab_res_info) resources->data; | |
| 3337 | 1078 | } else if(((jab_res_info)resources->data)->name) { |
| 3311 | 1079 | if(!strcasecmp(((jab_res_info) resources->data)->name, res)) { |
| 1080 | jri = (jab_res_info) resources->data; | |
| 1081 | break; | |
| 1082 | } | |
| 1083 | } | |
| 1084 | resources = resources->next; | |
| 1085 | } | |
| 1086 | } | |
| 1087 | ||
| 1088 | return jri; | |
| 1089 | } | |
| 1090 | ||
| 1091 | /* | |
| 1092 | * if the resource doesn't exist, create it. otherwise, just update the priority | |
| 2956 | 1093 | */ |
| 3311 | 1094 | static void jabber_track_resource(struct gaim_connection *gc, |
| 1095 | char *buddy, | |
| 1096 | char *res, | |
| 1097 | int priority, | |
| 1098 | int state) | |
| 1099 | { | |
| 5135 | 1100 | struct jabber_buddy_data *jbd = jabber_find_buddy(gc, buddy, TRUE); |
| 3311 | 1101 | |
| 3337 | 1102 | if(jbd) { |
| 1103 | char *who; | |
| 1104 | jab_res_info jri; | |
| 1105 | if(res) | |
| 1106 | who = g_strdup_printf("%s/%s", buddy, res); | |
| 1107 | else | |
| 1108 | who = g_strdup(buddy); | |
| 1109 | jri = jabber_find_resource(gc, who); | |
| 3311 | 1110 | g_free(who); |
| 1111 | if(!jri) { | |
| 1112 | jri = g_new0(struct jabber_resource_info, 1); | |
| 1113 | jri->name = g_strdup(res); | |
| 1114 | jri->away_msg = NULL; | |
| 5093 | 1115 | jri->has_xhtml = TRUE; |
| 3311 | 1116 | jbd->resources = g_slist_append(jbd->resources, jri); |
| 1117 | } | |
| 1118 | jri->priority = priority; | |
| 1119 | jri->state = state; | |
| 1120 | } | |
| 1121 | } | |
| 1122 | ||
| 1123 | /* | |
| 1124 | * remove the resource, if it exists | |
| 1125 | */ | |
| 1126 | static void jabber_remove_resource(struct gaim_connection *gc, char *buddy, char *res) | |
| 2956 | 1127 | { |
| 5135 | 1128 | struct jabber_buddy_data *jbd = jabber_find_buddy(gc, buddy, FALSE); |
| 3337 | 1129 | if(jbd) { |
| 1130 | char *who; | |
| 1131 | jab_res_info jri; | |
| 1132 | if(res) | |
| 1133 | who = g_strdup_printf("%s/%s", buddy, res); | |
| 1134 | else | |
| 1135 | who = g_strdup(buddy); | |
| 1136 | jri = jabber_find_resource(gc, who); | |
| 3311 | 1137 | g_free(who); |
| 1138 | if(jri) { | |
| 3337 | 1139 | if(jri->name) |
| 1140 | g_free(jri->name); | |
| 3311 | 1141 | if(jri->away_msg) |
| 1142 | g_free(jri->away_msg); | |
| 1143 | jbd->resources = g_slist_remove(jbd->resources, jri); | |
| 1144 | g_free(jri); | |
| 1145 | } | |
| 1146 | } | |
| 1147 | } | |
| 1148 | ||
| 1149 | /* | |
| 1150 | * grab the away message for the default resource | |
| 1151 | */ | |
| 1152 | static char *jabber_lookup_away(gjconn gjc, char *name) | |
| 1153 | { | |
| 1154 | jab_res_info jri = jabber_find_resource(GJ_GC(gjc), name); | |
| 1155 | ||
| 4745 | 1156 | if(!jri) |
| 3311 | 1157 | return _("Unknown"); |
| 1158 | ||
| 1159 | return jri->away_msg; | |
| 1160 | } | |
| 4745 | 1161 | static const char *jabber_get_state_string(int s) { |
| 1162 | switch(s) { | |
| 1163 | case UC_AWAY: | |
| 1164 | return _("Away"); | |
| 1165 | case UC_CHAT: | |
| 1166 | return _("Chatty"); | |
| 1167 | case UC_XA: | |
| 1168 | return _("Extended Away"); | |
| 1169 | case UC_DND: | |
| 1170 | return _("Do Not Disturb"); | |
| 1171 | default: | |
| 1172 | return _("Available"); | |
| 1173 | } | |
| 1174 | } | |
| 3311 | 1175 | |
| 1176 | static void jabber_track_away(gjconn gjc, jpacket p, char *type) | |
| 1177 | { | |
| 1178 | jab_res_info jri = NULL; | |
| 1179 | ||
| 3337 | 1180 | if(!p || !p->from || !p->from->user) |
| 3311 | 1181 | return; |
| 1182 | ||
| 1183 | jri = jabber_find_resource(GJ_GC(gjc), jid_full(p->from)); | |
| 1184 | ||
| 1185 | if(!jri) | |
| 1186 | return; | |
| 3770 | 1187 | |
| 3311 | 1188 | if(jri->away_msg) |
| 1189 | g_free(jri->away_msg); | |
| 1190 | ||
| 4745 | 1191 | jri->away_msg = g_strdup(xmlnode_get_tag_data(p->x, "status")); |
| 3311 | 1192 | } |
| 1193 | ||
| 1194 | static void jabber_convo_closed(struct gaim_connection *gc, char *name) | |
| 1195 | { | |
| 1196 | jab_res_info jri = jabber_find_resource(gc, name); | |
| 1197 | ||
| 1198 | if(jri) { | |
| 1199 | if(jri->thread_id) | |
| 1200 | g_free(jri->thread_id); | |
| 1201 | ||
| 1202 | jri->thread_id = NULL; | |
| 2956 | 1203 | } |
| 1204 | } | |
| 1205 | ||
| 3311 | 1206 | static void jabber_track_convo_thread(gjconn gjc, char *name, char *thread_id) |
| 1207 | { | |
| 1208 | jab_res_info jri = jabber_find_resource(GJ_GC(gjc), name); | |
| 1209 | ||
| 1210 | if(jri) { | |
| 1211 | if(jri->thread_id) | |
| 1212 | g_free(jri->thread_id); | |
| 1213 | ||
| 1214 | jri->thread_id = g_strdup(thread_id); | |
| 1215 | } | |
| 1216 | } | |
| 1217 | ||
| 5136 | 1218 | static char *jabber_get_convo_thread(gjconn gjc, const char *name) |
| 3311 | 1219 | { |
| 1220 | char *ct = NULL; | |
| 1221 | jab_res_info jri = jabber_find_resource(GJ_GC(gjc), name); | |
| 1222 | ||
| 1223 | if(jri) { | |
| 1224 | if(jri->thread_id) | |
| 1225 | ct = g_strdup(jri->thread_id); | |
| 1226 | } | |
| 5135 | 1227 | |
| 3311 | 1228 | return ct; |
| 1229 | } | |
| 1230 | ||
| 1231 | ||
| 3159 | 1232 | static time_t iso8601_to_time(char *timestamp) |
| 1233 | { | |
|
3229
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1234 | struct tm t; |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1235 | time_t retval = 0; |
| 5112 | 1236 | localtime_r(NULL, &t); |
|
3229
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1237 | |
| 3311 | 1238 | if(sscanf(timestamp, "%04d%02d%02dT%02d:%02d:%02d", |
|
3229
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1239 | &t.tm_year, &t.tm_mon, &t.tm_mday, &t.tm_hour, &t.tm_min, &t.tm_sec)) |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1240 | { |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1241 | t.tm_year -= 1900; |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1242 | t.tm_mon -= 1; |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1243 | retval = mktime(&t); |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1244 | # ifdef HAVE_TM_GMTOFF |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1245 | retval += t.tm_gmtoff; |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1246 | # else |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1247 | # ifdef HAVE_TIMEZONE |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1248 | tzset(); /* making sure */ |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1249 | retval -= timezone; |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1250 | # endif |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1251 | # endif |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1252 | } |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1253 | |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1254 | return retval; |
| 3159 | 1255 | } |
| 1256 | ||
| 2956 | 1257 | static void jabber_handlemessage(gjconn gjc, jpacket p) |
| 2086 | 1258 | { |
| 3311 | 1259 | xmlnode y, subj; |
| 3159 | 1260 | time_t time_sent = time(NULL); |
| 3311 | 1261 | gboolean typing = FALSE; |
| 5093 | 1262 | gboolean has_xhtml = TRUE; |
| 2086 | 1263 | |
| 1264 | char *from = NULL, *msg = NULL, *type = NULL, *topic = NULL; | |
| 3311 | 1265 | char *thread_id = NULL; |
| 1266 | char *conference_room = NULL; | |
| 2086 | 1267 | char m[BUF_LONG * 2]; |
| 1268 | ||
| 1269 | type = xmlnode_get_attrib(p->x, "type"); | |
| 3769 | 1270 | |
| 3311 | 1271 | if ((y = xmlnode_get_tag(p->x, "thread"))) |
| 1272 | thread_id = xmlnode_get_data(y); | |
| 1273 | ||
| 1274 | y = xmlnode_get_firstchild(p->x); | |
| 1275 | ||
| 1276 | while(y) { | |
| 1277 | if(NSCHECK(y, NS_DELAY)) { | |
| 1278 | char *timestamp = xmlnode_get_attrib(y, "stamp"); | |
| 1279 | time_sent = iso8601_to_time(timestamp); | |
| 1280 | } else if(NSCHECK(y, "jabber:x:event")) { | |
| 1281 | if(xmlnode_get_tag(y, "composing")) | |
| 1282 | typing = TRUE; | |
| 1283 | } else if(NSCHECK(y, "jabber:x:conference")) { | |
| 1284 | conference_room = xmlnode_get_attrib(y, "jid"); | |
| 1285 | } | |
| 1286 | y = xmlnode_get_nextsibling(y); | |
| 3159 | 1287 | } |
| 1288 | ||
| 2086 | 1289 | if (!type || !strcasecmp(type, "normal") || !strcasecmp(type, "chat")) { |
| 1290 | ||
| 1291 | from = jid_full(p->from); | |
| 1292 | if ((y = xmlnode_get_tag(p->x, "html"))) { | |
| 5093 | 1293 | msg = xmlnode2str(y); |
| 1294 | } else if ((y = xmlnode_get_tag(p->x, "body"))) { | |
| 2086 | 1295 | msg = xmlnode_get_data(y); |
| 5093 | 1296 | has_xhtml = FALSE; |
| 2086 | 1297 | } |
| 1298 | ||
| 1299 | if (!from) | |
| 1300 | return; | |
| 1301 | ||
| 3311 | 1302 | if (conference_room) { |
| 5234 | 1303 | GHashTable *components = g_hash_table_new_full(g_str_hash, |
| 1304 | g_str_equal, g_free, g_free); | |
|
2205
68c42ce8eba6
[gaim-migrate @ 2215]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2170
diff
changeset
|
1305 | char **data; |
| 2086 | 1306 | |
| 3311 | 1307 | data = g_strsplit(conference_room, "@", 2); |
| 5234 | 1308 | g_hash_table_replace(components, g_strdup("room"), |
| 1309 | g_strdup(data[0])); | |
| 1310 | g_hash_table_replace(components, g_strdup("server"), | |
| 1311 | g_strdup(data[1])); | |
| 1312 | g_hash_table_replace(components, g_strdup("handle"), | |
| 1313 | g_strdup(gjc->user->user)); | |
|
2205
68c42ce8eba6
[gaim-migrate @ 2215]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2170
diff
changeset
|
1314 | g_strfreev(data); |
| 2086 | 1315 | |
| 5234 | 1316 | serv_got_chat_invite(GJ_GC(gjc), conference_room, from, msg, components); |
| 2086 | 1317 | } else if (msg) { /* whisper */ |
| 1318 | struct jabber_chat *jc; | |
| 1319 | g_snprintf(m, sizeof(m), "%s", msg); | |
| 2956 | 1320 | if (((jc = find_existing_chat(GJ_GC(gjc), p->from)) != NULL) && jc->b) |
|
4359
cf899ee07d1d
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4357
diff
changeset
|
1321 | serv_got_chat_in(GJ_GC(gjc), |
|
cf899ee07d1d
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4357
diff
changeset
|
1322 | gaim_chat_get_id(GAIM_CHAT(jc->b)), |
|
cf899ee07d1d
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4357
diff
changeset
|
1323 | p->from->resource, 1, m, time_sent); |
| 2086 | 1324 | else { |
|
2278
79ae3adc97bf
[gaim-migrate @ 2288]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2232
diff
changeset
|
1325 | int flags = 0; |
| 3769 | 1326 | jab_res_info jri = jabber_find_resource(GJ_GC(gjc), from); |
| 5093 | 1327 | if(jri) { |
| 1328 | if(typing) | |
| 1329 | jri->has_composing = TRUE; | |
| 1330 | jri->has_xhtml = has_xhtml; | |
| 1331 | } | |
|
2278
79ae3adc97bf
[gaim-migrate @ 2288]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2232
diff
changeset
|
1332 | if (xmlnode_get_tag(p->x, "gaim")) |
|
79ae3adc97bf
[gaim-migrate @ 2288]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2232
diff
changeset
|
1333 | flags = IM_FLAG_GAIMUSER; |
| 3769 | 1334 | jabber_track_convo_thread(gjc, from, thread_id); |
|
4359
cf899ee07d1d
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4357
diff
changeset
|
1335 | if (gaim_find_conversation(from)) |
| 3769 | 1336 | serv_got_im(GJ_GC(gjc), from, m, flags, |
| 3311 | 1337 | time_sent, -1); |
| 2086 | 1338 | else { |
| 2956 | 1339 | if(p->from->user) { |
| 3311 | 1340 | from = g_strdup_printf("%s@%s", p->from->user, |
| 1341 | p->from->server); | |
| 2956 | 1342 | } else { |
| 3311 | 1343 | /* server message? */ |
| 1344 | from = g_strdup(p->from->server); | |
| 2956 | 1345 | } |
| 3159 | 1346 | serv_got_im(GJ_GC(gjc), from, m, flags, time_sent, -1); |
| 2086 | 1347 | g_free(from); |
| 1348 | } | |
| 1349 | } | |
| 3311 | 1350 | } else { |
| 1351 | /* a non-message message! */ | |
| 1352 | from = g_strdup_printf("%s@%s", p->from->user, p->from->server); | |
| 1353 | if(typing) | |
| 3768 | 1354 | serv_got_typing(GJ_GC(gjc), from, 0, TYPING); |
| 3311 | 1355 | else |
| 1356 | serv_got_typing_stopped(GJ_GC(gjc), from); | |
| 1357 | g_free(from); | |
| 2086 | 1358 | } |
| 1359 | ||
| 1360 | } else if (!strcasecmp(type, "error")) { | |
| 1361 | if ((y = xmlnode_get_tag(p->x, "error"))) { | |
| 1362 | type = xmlnode_get_attrib(y, "code"); | |
| 1363 | msg = xmlnode_get_data(y); | |
| 1364 | } | |
| 1365 | ||
| 1366 | if (msg) { | |
| 3427 | 1367 | from = g_strdup_printf(_("Jabber Error %s"), type ? type : ""); |
| 1368 | do_error_dialog(from, msg, GAIM_ERROR); | |
| 2086 | 1369 | g_free(from); |
| 1370 | } | |
| 1371 | } else if (!strcasecmp(type, "groupchat")) { | |
| 1372 | struct jabber_chat *jc; | |
| 1373 | static int i = 0; | |
| 1374 | ||
| 1375 | if ((y = xmlnode_get_tag(p->x, "html"))) { | |
| 5093 | 1376 | msg = xmlnode2str(y); |
| 1377 | } else if ((y = xmlnode_get_tag(p->x, "body"))) { | |
| 2086 | 1378 | msg = xmlnode_get_data(y); |
| 1379 | } | |
| 1380 | ||
| 1381 | if ((subj = xmlnode_get_tag(p->x, "subject"))) { | |
| 3770 | 1382 | topic = xmlnode_get_data(subj); |
| 1383 | } | |
| 2086 | 1384 | |
| 2956 | 1385 | jc = find_existing_chat(GJ_GC(gjc), p->from); |
| 2086 | 1386 | if (!jc) { |
| 1387 | /* we're not in this chat. are we supposed to be? */ | |
| 2956 | 1388 | if ((jc = find_pending_chat(GJ_GC(gjc), p->from)) != NULL) { |
| 2086 | 1389 | /* yes, we're supposed to be. so now we are. */ |
| 2956 | 1390 | jc->b = serv_got_joined_chat(GJ_GC(gjc), i++, p->from->user); |
|
4359
cf899ee07d1d
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4357
diff
changeset
|
1391 | jc->id = gaim_chat_get_id(GAIM_CHAT(jc->b)); |
| 2956 | 1392 | jc->state = JCS_ACTIVE; |
| 2086 | 1393 | } else { |
| 1394 | /* no, we're not supposed to be. */ | |
| 1395 | g_free(msg); | |
| 1396 | return; | |
| 1397 | } | |
| 1398 | } | |
| 1399 | if (p->from->resource) { | |
| 1400 | if (!y) { | |
| 2956 | 1401 | if (!find_chat_buddy(jc->b, p->from->resource)) { |
|
4359
cf899ee07d1d
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4357
diff
changeset
|
1402 | gaim_chat_add_user(GAIM_CHAT(jc->b), |
|
cf899ee07d1d
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4357
diff
changeset
|
1403 | p->from->resource, NULL); |
| 2956 | 1404 | } else if ((y = xmlnode_get_tag(p->x, "status"))) { |
| 3311 | 1405 | jabber_track_away(gjc, p, NULL); |
| 2086 | 1406 | } |
| 1407 | } else if (jc->b && msg) { | |
| 1408 | char buf[8192]; | |
| 1409 | ||
| 1410 | if (topic) { | |
| 1411 | char tbuf[8192]; | |
| 1412 | g_snprintf(tbuf, sizeof(tbuf), "%s", topic); | |
|
4359
cf899ee07d1d
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4357
diff
changeset
|
1413 | gaim_chat_set_topic(GAIM_CHAT(jc->b), |
|
cf899ee07d1d
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4357
diff
changeset
|
1414 | p->from->resource, tbuf); |
| 2086 | 1415 | } |
| 1416 | ||
| 1417 | g_snprintf(buf, sizeof(buf), "%s", msg); | |
|
4359
cf899ee07d1d
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4357
diff
changeset
|
1418 | serv_got_chat_in(GJ_GC(gjc), |
|
cf899ee07d1d
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4357
diff
changeset
|
1419 | gaim_chat_get_id(GAIM_CHAT(jc->b)), |
|
cf899ee07d1d
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4357
diff
changeset
|
1420 | p->from->resource, 0, buf, time_sent); |
| 2086 | 1421 | } |
| 1422 | } else { /* message from the server */ | |
| 3770 | 1423 | if(jc->b && topic) { |
| 1424 | char tbuf[8192]; | |
| 2086 | 1425 | g_snprintf(tbuf, sizeof(tbuf), "%s", topic); |
|
4359
cf899ee07d1d
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4357
diff
changeset
|
1426 | gaim_chat_set_topic(GAIM_CHAT(jc->b), "", tbuf); |
| 2086 | 1427 | } |
| 1428 | } | |
| 1429 | ||
| 1430 | } else { | |
|
5223
4ea16d1f5cd1
[gaim-migrate @ 5593]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
1431 | gaim_debug(GAIM_DEBUG_WARNING, "jabber", |
|
4ea16d1f5cd1
[gaim-migrate @ 5593]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
1432 | "unhandled message %s\n", type); |
| 2086 | 1433 | } |
| 1434 | } | |
| 3770 | 1435 | |
| 2956 | 1436 | static void jabber_handlepresence(gjconn gjc, jpacket p) |
| 2086 | 1437 | { |
| 1438 | char *to, *from, *type; | |
| 1439 | struct buddy *b = NULL; | |
| 3311 | 1440 | gaim_jid gjid; |
| 2086 | 1441 | char *buddy; |
|
3194
9404dfabed94
[gaim-migrate @ 3211]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3161
diff
changeset
|
1442 | xmlnode y; |
| 2086 | 1443 | char *show; |
|
2501
5e1fa4926c93
[gaim-migrate @ 2514]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2382
diff
changeset
|
1444 | int state = 0; |
|
4359
cf899ee07d1d
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4357
diff
changeset
|
1445 | struct gaim_conversation *cnv = NULL; |
| 2086 | 1446 | struct jabber_chat *jc = NULL; |
| 3311 | 1447 | int priority = 0; |
| 1448 | struct jabber_buddy_data *jbd; | |
| 3770 | 1449 | |
| 2086 | 1450 | to = xmlnode_get_attrib(p->x, "to"); |
| 1451 | from = xmlnode_get_attrib(p->x, "from"); | |
| 1452 | type = xmlnode_get_attrib(p->x, "type"); | |
| 3770 | 1453 | |
| 3311 | 1454 | if((buddy = get_realwho(gjc, from, FALSE, &gjid)) == NULL) |
| 1455 | return; | |
| 1456 | ||
| 1457 | if (gjid->user == NULL) { | |
| 1458 | /* FIXME: transport */ | |
| 1459 | g_free(buddy); | |
| 1460 | gaim_jid_free(gjid); | |
| 1461 | return; | |
| 1462 | } | |
| 1463 | ||
| 5135 | 1464 | jbd = jabber_find_buddy(GJ_GC(gjc), buddy, TRUE); |
| 3311 | 1465 | |
| 1466 | if(jbd->error_msg) { | |
| 1467 | g_free(jbd->error_msg); | |
| 1468 | jbd->error_msg = NULL; | |
| 1469 | } | |
| 1470 | ||
|
3259
d666b7b44145
[gaim-migrate @ 3277]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3257
diff
changeset
|
1471 | if(type && !strcasecmp(type, "error")) { |
|
d666b7b44145
[gaim-migrate @ 3277]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3257
diff
changeset
|
1472 | state = UC_ERROR; |
| 3311 | 1473 | if((y = xmlnode_get_tag(p->x, "error")) != NULL) { |
| 1474 | jbd->error_msg = g_strdup_printf(_("Error %s: %s"), | |
| 1475 | xmlnode_get_attrib(y, "code"), xmlnode_get_data(y)); | |
| 1476 | } else { | |
| 1477 | jbd->error_msg = g_strdup(_("Unknown Error in presence")); | |
| 1478 | } | |
|
3259
d666b7b44145
[gaim-migrate @ 3277]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3257
diff
changeset
|
1479 | } else { |
|
d666b7b44145
[gaim-migrate @ 3277]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3257
diff
changeset
|
1480 | if ((y = xmlnode_get_tag(p->x, "show"))) { |
|
d666b7b44145
[gaim-migrate @ 3277]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3257
diff
changeset
|
1481 | show = xmlnode_get_data(y); |
|
d666b7b44145
[gaim-migrate @ 3277]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3257
diff
changeset
|
1482 | if (!show) { |
|
d666b7b44145
[gaim-migrate @ 3277]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3257
diff
changeset
|
1483 | state = 0; |
|
d666b7b44145
[gaim-migrate @ 3277]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3257
diff
changeset
|
1484 | } else if (!strcasecmp(show, "away")) { |
|
d666b7b44145
[gaim-migrate @ 3277]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3257
diff
changeset
|
1485 | state = UC_AWAY; |
|
d666b7b44145
[gaim-migrate @ 3277]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3257
diff
changeset
|
1486 | } else if (!strcasecmp(show, "chat")) { |
|
d666b7b44145
[gaim-migrate @ 3277]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3257
diff
changeset
|
1487 | state = UC_CHAT; |
|
d666b7b44145
[gaim-migrate @ 3277]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3257
diff
changeset
|
1488 | } else if (!strcasecmp(show, "xa")) { |
|
d666b7b44145
[gaim-migrate @ 3277]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3257
diff
changeset
|
1489 | state = UC_XA; |
|
d666b7b44145
[gaim-migrate @ 3277]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3257
diff
changeset
|
1490 | } else if (!strcasecmp(show, "dnd")) { |
|
d666b7b44145
[gaim-migrate @ 3277]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3257
diff
changeset
|
1491 | state = UC_DND; |
|
d666b7b44145
[gaim-migrate @ 3277]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3257
diff
changeset
|
1492 | } |
|
d666b7b44145
[gaim-migrate @ 3277]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3257
diff
changeset
|
1493 | } else { |
|
2501
5e1fa4926c93
[gaim-migrate @ 2514]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2382
diff
changeset
|
1494 | state = 0; |
| 2086 | 1495 | } |
| 1496 | } | |
| 1497 | ||
| 3311 | 1498 | if ((y = xmlnode_get_tag(p->x, "priority"))) |
| 3770 | 1499 | priority = atoi(xmlnode_get_data(y)); |
| 2086 | 1500 | |
| 1501 | /* um. we're going to check if it's a chat. if it isn't, and there are pending | |
| 2956 | 1502 | * chats, create the chat. if there aren't pending chats and we don't have the |
| 1503 | * buddy on our list, simply bail out. */ | |
| 3311 | 1504 | if ((cnv = find_chat(GJ_GC(gjc), gjid->user)) == NULL) { |
| 2086 | 1505 | static int i = 0x70; |
| 3311 | 1506 | if ((jc = find_pending_chat(GJ_GC(gjc), gjid)) != NULL) { |
| 1507 | jc->b = cnv = serv_got_joined_chat(GJ_GC(gjc), i++, gjid->user); | |
|
4359
cf899ee07d1d
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4357
diff
changeset
|
1508 | jc->id = gaim_chat_get_id(GAIM_CHAT(jc->b)); |
| 2956 | 1509 | jc->state = JCS_ACTIVE; |
| 4687 | 1510 | } else if ((b = gaim_find_buddy(GJ_GC(gjc)->account, buddy)) == NULL) { |
| 2956 | 1511 | g_free(buddy); |
| 3311 | 1512 | gaim_jid_free(gjid); |
| 2956 | 1513 | return; |
| 2086 | 1514 | } |
| 1515 | } | |
| 1516 | ||
| 4732 | 1517 | if (state == UC_ERROR || (type && (strcasecmp(type, "unavailable") == 0))) |
| 3311 | 1518 | jabber_remove_resource(GJ_GC(gjc), buddy, gjid->resource); |
| 1519 | else { | |
| 1520 | jabber_track_resource(GJ_GC(gjc), buddy, gjid->resource, priority, state); | |
| 1521 | ||
| 1522 | /* keep track of away msg somewhat the same as the yahoo plugin */ | |
| 1523 | jabber_track_away(gjc, p, type); | |
| 1524 | } | |
| 3770 | 1525 | |
| 3311 | 1526 | |
| 2086 | 1527 | if (!cnv) { |
| 3311 | 1528 | /* this is where we handle presence information for "regular" buddies */ |
| 1529 | jab_res_info jri = jabber_find_resource(GJ_GC(gjc), buddy); | |
| 1530 | if(jri) { | |
| 4732 | 1531 | serv_got_update(GJ_GC(gjc), buddy, 1, 0, b->signon, b->idle, jri->state); |
| 3311 | 1532 | } else |
| 4732 | 1533 | serv_got_update(GJ_GC(gjc), buddy, 0, 0, 0, 0, 0); |
| 3311 | 1534 | |
| 2086 | 1535 | } else { |
| 3311 | 1536 | if (gjid->resource) { |
|
3259
d666b7b44145
[gaim-migrate @ 3277]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3257
diff
changeset
|
1537 | if (type && (!strcasecmp(type, "unavailable"))) { |
| 2086 | 1538 | struct jabber_data *jd; |
| 3311 | 1539 | if (!jc && !(jc = find_existing_chat(GJ_GC(gjc), gjid))) { |
| 2086 | 1540 | g_free(buddy); |
| 3311 | 1541 | gaim_jid_free(gjid); |
| 2086 | 1542 | return; |
| 1543 | } | |
| 1544 | jd = jc->gc->proto_data; | |
| 2956 | 1545 | /* if it's not ourselves...*/ |
| 3311 | 1546 | if (strcmp(gjid->resource, jc->gjid->resource) && jc->b) { |
|
4359
cf899ee07d1d
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4357
diff
changeset
|
1547 | gaim_chat_remove_user(GAIM_CHAT(jc->b), gjid->resource, |
|
cf899ee07d1d
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4357
diff
changeset
|
1548 | NULL); |
| 2086 | 1549 | g_free(buddy); |
| 3311 | 1550 | gaim_jid_free(gjid); |
| 2086 | 1551 | return; |
| 1552 | } | |
| 2956 | 1553 | |
| 1554 | jc->state = JCS_CLOSED; | |
| 1555 | serv_got_chat_left(GJ_GC(gjc), jc->id); | |
| 1556 | /* | |
| 1557 | * TBD: put back some day? | |
| 1558 | jd->chats = g_slist_remove(jd->chats, jc); | |
| 1559 | g_free(jc); | |
| 1560 | */ | |
| 1561 | } else { | |
| 3311 | 1562 | if ((!jc && !(jc = find_existing_chat(GJ_GC(gjc), gjid))) || !jc->b) { |
| 2956 | 1563 | g_free(buddy); |
| 3311 | 1564 | gaim_jid_free(gjid); |
| 2956 | 1565 | return; |
| 1566 | } | |
| 3311 | 1567 | if (!find_chat_buddy(jc->b, gjid->resource)) { |
|
4359
cf899ee07d1d
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4357
diff
changeset
|
1568 | gaim_chat_add_user(GAIM_CHAT(jc->b), gjid->resource, NULL); |
| 2086 | 1569 | } |
| 1570 | } | |
| 1571 | } | |
| 1572 | } | |
| 1573 | ||
| 1574 | g_free(buddy); | |
| 3311 | 1575 | gaim_jid_free(gjid); |
| 2086 | 1576 | |
| 1577 | return; | |
| 1578 | } | |
| 1579 | ||
|
3229
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1580 | /* |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1581 | * Used only by Jabber accept/deny add stuff just below |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1582 | */ |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1583 | struct jabber_add_permit { |
|
4249
62583b5d3663
[gaim-migrate @ 4499]
Robert McQueen <robot101@debian.org>
parents:
4245
diff
changeset
|
1584 | struct gaim_connection *gc; |
|
3229
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1585 | gchar *user; |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1586 | }; |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1587 | |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1588 | /* |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1589 | * Common part for Jabber accept/deny adds |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1590 | * |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1591 | * "type" says whether we'll permit/deny the subscribe request |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1592 | */ |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1593 | static void jabber_accept_deny_add(struct jabber_add_permit *jap, const char *type) |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1594 | { |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1595 | xmlnode g = xmlnode_new_tag("presence"); |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1596 | |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1597 | xmlnode_put_attrib(g, "to", jap->user); |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1598 | xmlnode_put_attrib(g, "type", type); |
|
4249
62583b5d3663
[gaim-migrate @ 4499]
Robert McQueen <robot101@debian.org>
parents:
4245
diff
changeset
|
1599 | gjab_send(GC_GJ(jap->gc), g); |
|
3229
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1600 | |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1601 | xmlnode_free(g); |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1602 | } |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1603 | |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1604 | /* |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1605 | * Callback from "accept" in do_ask_dialog() invoked by jabber_handles10n() |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1606 | */ |
| 3730 | 1607 | static void jabber_accept_add(struct jabber_add_permit *jap) |
|
3229
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1608 | { |
|
4249
62583b5d3663
[gaim-migrate @ 4499]
Robert McQueen <robot101@debian.org>
parents:
4245
diff
changeset
|
1609 | if(g_slist_find(connections, jap->gc)) { |
|
62583b5d3663
[gaim-migrate @ 4499]
Robert McQueen <robot101@debian.org>
parents:
4245
diff
changeset
|
1610 | jabber_accept_deny_add(jap, "subscribed"); |
|
62583b5d3663
[gaim-migrate @ 4499]
Robert McQueen <robot101@debian.org>
parents:
4245
diff
changeset
|
1611 | /* |
|
62583b5d3663
[gaim-migrate @ 4499]
Robert McQueen <robot101@debian.org>
parents:
4245
diff
changeset
|
1612 | * If we don't already have the buddy on *our* buddylist, |
|
62583b5d3663
[gaim-migrate @ 4499]
Robert McQueen <robot101@debian.org>
parents:
4245
diff
changeset
|
1613 | * ask if we want him or her added. |
|
62583b5d3663
[gaim-migrate @ 4499]
Robert McQueen <robot101@debian.org>
parents:
4245
diff
changeset
|
1614 | */ |
| 4687 | 1615 | if(gaim_find_buddy(jap->gc->account, jap->user) == NULL) { |
|
4249
62583b5d3663
[gaim-migrate @ 4499]
Robert McQueen <robot101@debian.org>
parents:
4245
diff
changeset
|
1616 | show_got_added(jap->gc, NULL, jap->user, NULL, NULL); |
|
62583b5d3663
[gaim-migrate @ 4499]
Robert McQueen <robot101@debian.org>
parents:
4245
diff
changeset
|
1617 | } |
|
3229
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1618 | } |
|
4249
62583b5d3663
[gaim-migrate @ 4499]
Robert McQueen <robot101@debian.org>
parents:
4245
diff
changeset
|
1619 | |
|
3229
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1620 | g_free(jap->user); |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1621 | g_free(jap); |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1622 | } |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1623 | |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1624 | /* |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1625 | * Callback from "deny/cancel" in do_ask_dialog() invoked by jabber_handles10n() |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1626 | */ |
| 3730 | 1627 | static void jabber_deny_add(struct jabber_add_permit *jap) |
|
3229
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1628 | { |
|
4249
62583b5d3663
[gaim-migrate @ 4499]
Robert McQueen <robot101@debian.org>
parents:
4245
diff
changeset
|
1629 | if(g_slist_find(connections, jap->gc)) { |
|
62583b5d3663
[gaim-migrate @ 4499]
Robert McQueen <robot101@debian.org>
parents:
4245
diff
changeset
|
1630 | jabber_accept_deny_add(jap, "unsubscribed"); |
|
62583b5d3663
[gaim-migrate @ 4499]
Robert McQueen <robot101@debian.org>
parents:
4245
diff
changeset
|
1631 | } |
|
62583b5d3663
[gaim-migrate @ 4499]
Robert McQueen <robot101@debian.org>
parents:
4245
diff
changeset
|
1632 | |
|
3229
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1633 | g_free(jap->user); |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1634 | g_free(jap); |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1635 | } |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1636 | |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1637 | /* |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1638 | * Handle subscription requests |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1639 | */ |
| 2956 | 1640 | static void jabber_handles10n(gjconn gjc, jpacket p) |
| 2086 | 1641 | { |
| 1642 | xmlnode g; | |
| 1643 | char *Jid = xmlnode_get_attrib(p->x, "from"); | |
| 3136 | 1644 | char *type = xmlnode_get_attrib(p->x, "type"); |
| 2086 | 1645 | |
| 1646 | g = xmlnode_new_tag("presence"); | |
| 1647 | xmlnode_put_attrib(g, "to", Jid); | |
|
3229
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1648 | |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1649 | if (!strcmp(type, "subscribe")) { |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1650 | /* |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1651 | * A "subscribe to us" request was received - put up the approval dialog |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1652 | */ |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1653 | struct jabber_add_permit *jap = g_new0(struct jabber_add_permit, 1); |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1654 | gchar *msg = g_strdup_printf(_("The user %s wants to add you to their buddy list."), |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1655 | Jid); |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1656 | |
|
4249
62583b5d3663
[gaim-migrate @ 4499]
Robert McQueen <robot101@debian.org>
parents:
4245
diff
changeset
|
1657 | jap->gc = GJ_GC(gjc); |
|
3229
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1658 | jap->user = g_strdup(Jid); |
|
5205
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
1659 | do_ask_dialog(msg, NULL, jap, _("Authorize"), jabber_accept_add, _("Deny"), jabber_deny_add, my_protocol->handle, FALSE); |
|
3229
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1660 | |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1661 | g_free(msg); |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1662 | xmlnode_free(g); /* Never needed it here anyway */ |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1663 | return; |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1664 | |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1665 | } else if (!strcmp(type, "unsubscribe")) { |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1666 | /* |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1667 | * An "unsubscribe to us" was received - simply "approve" it |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1668 | */ |
| 2086 | 1669 | xmlnode_put_attrib(g, "type", "unsubscribed"); |
|
3229
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1670 | } else { |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1671 | /* |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1672 | * Did we attempt to subscribe to somebody and they do not exist? |
|
ad46a5607172
[gaim-migrate @ 3246]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3203
diff
changeset
|
1673 | */ |
| 3136 | 1674 | if (!strcmp(type, "unsubscribed")) { |
| 1675 | xmlnode y; | |
| 1676 | char *status; | |
| 1677 | if((y = xmlnode_get_tag(p->x, "status")) && (status = xmlnode_get_data(y)) && | |
| 1678 | !strcmp(status, "Not Found")) { | |
| 3427 | 1679 | char *msg = g_strdup_printf(_("The Jabber user %s does not exist and was therefore " |
| 1680 | "not added to your roster."), | |
| 1681 | xmlnode_get_attrib(p->x, "from")); | |
| 1682 | do_error_dialog(_("No such user."), msg, GAIM_ERROR ); | |
| 3136 | 1683 | g_free(msg); |
| 1684 | } | |
| 1685 | } | |
| 1686 | ||
| 2956 | 1687 | xmlnode_free(g); |
| 2086 | 1688 | return; |
| 2956 | 1689 | } |
| 1690 | ||
| 1691 | gjab_send(gjc, g); | |
| 1692 | xmlnode_free(g); | |
| 2086 | 1693 | } |
| 1694 | ||
| 2956 | 1695 | /* |
| 1696 | * Pending subscription to a buddy? | |
| 1697 | */ | |
| 1698 | #define BUD_SUB_TO_PEND(sub, ask) ((!strcasecmp((sub), "none") || !strcasecmp((sub), "from")) && \ | |
| 3770 | 1699 | (ask) != NULL && !strcasecmp((ask), "subscribe")) |
| 2956 | 1700 | |
| 1701 | /* | |
| 1702 | * Subscribed to a buddy? | |
| 1703 | */ | |
| 1704 | #define BUD_SUBD_TO(sub, ask) ((!strcasecmp((sub), "to") || !strcasecmp((sub), "both")) && \ | |
| 1705 | ((ask) == NULL || !strcasecmp((ask), "subscribe"))) | |
| 1706 | ||
| 1707 | /* | |
| 1708 | * Pending unsubscription to a buddy? | |
| 1709 | */ | |
| 1710 | #define BUD_USUB_TO_PEND(sub, ask) ((!strcasecmp((sub), "to") || !strcasecmp((sub), "both")) && \ | |
| 1711 | (ask) != NULL && !strcasecmp((ask), "unsubscribe")) | |
| 1712 | ||
| 1713 | /* | |
| 1714 | * Unsubscribed to a buddy? | |
| 1715 | */ | |
| 1716 | #define BUD_USUBD_TO(sub, ask) ((!strcasecmp((sub), "none") || !strcasecmp((sub), "from")) && \ | |
| 1717 | ((ask) == NULL || !strcasecmp((ask), "unsubscribe"))) | |
| 1718 | ||
| 1719 | /* | |
| 1720 | * If a buddy is added or removed from the roster on another resource | |
| 1721 | * jabber_handlebuddy is called | |
| 1722 | * | |
| 1723 | * Called with roster item node. | |
| 1724 | */ | |
| 1725 | static void jabber_handlebuddy(gjconn gjc, xmlnode x) | |
| 1726 | { | |
| 1727 | xmlnode g; | |
| 3311 | 1728 | char *who, *name, *sub, *ask; |
| 1729 | gaim_jid gjid; | |
| 2956 | 1730 | struct buddy *b = NULL; |
| 4927 | 1731 | struct jabber_buddy_data *jbd = NULL; |
| 3136 | 1732 | char *buddyname, *groupname = NULL; |
| 2956 | 1733 | |
| 3311 | 1734 | who = xmlnode_get_attrib(x, "jid"); |
| 2956 | 1735 | name = xmlnode_get_attrib(x, "name"); |
| 1736 | sub = xmlnode_get_attrib(x, "subscription"); | |
| 1737 | ask = xmlnode_get_attrib(x, "ask"); | |
| 3311 | 1738 | |
| 1739 | if((buddyname = get_realwho(gjc, who, FALSE, &gjid)) == NULL) | |
| 1740 | return; | |
| 2956 | 1741 | |
| 4705 | 1742 | |
| 2956 | 1743 | /* JFIXME: jabber_handleroster() had a "FIXME: transport" at this |
| 1744 | * equivilent point. So... | |
| 1745 | * | |
| 3311 | 1746 | * We haven't done anything interesting to this point, so we'll |
| 1747 | * violate Good Coding Structure here by simply bailing out. | |
| 2956 | 1748 | */ |
| 3311 | 1749 | if(!gjid->user) { |
| 1750 | g_free(buddyname); | |
| 1751 | gaim_jid_free(gjid); | |
| 2956 | 1752 | return; |
| 1753 | } | |
| 3311 | 1754 | gaim_jid_free(gjid); |
| 2956 | 1755 | |
|
3236
1507dc2b5719
[gaim-migrate @ 3253]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3234
diff
changeset
|
1756 | if((g = xmlnode_get_tag(x, "group")) != NULL) { |
| 3136 | 1757 | groupname = xmlnode_get_data(g); |
| 2956 | 1758 | } |
| 1759 | ||
|
3059
bd4d661482f5
[gaim-migrate @ 3073]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3048
diff
changeset
|
1760 | /* |
| 3136 | 1761 | * Add or remove a buddy? Change buddy's alias or group? |
|
3059
bd4d661482f5
[gaim-migrate @ 3073]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3048
diff
changeset
|
1762 | */ |
| 2956 | 1763 | if (BUD_SUB_TO_PEND(sub, ask) || BUD_SUBD_TO(sub, ask)) { |
| 4687 | 1764 | if ((b = gaim_find_buddy(GJ_GC(gjc)->account, buddyname)) == NULL) { |
| 4932 | 1765 | struct group *g; |
| 4927 | 1766 | b = gaim_buddy_new(GJ_GC(gjc)->account, buddyname, name); |
| 4687 | 1767 | if (groupname) { |
|
4775
239cb803fb1d
[gaim-migrate @ 5095]
Mark Doliner <markdoliner@pidgin.im>
parents:
4745
diff
changeset
|
1768 | if (!(g = gaim_find_group(groupname))) { |
| 4687 | 1769 | g = gaim_group_new(groupname); |
|
4775
239cb803fb1d
[gaim-migrate @ 5095]
Mark Doliner <markdoliner@pidgin.im>
parents:
4745
diff
changeset
|
1770 | gaim_blist_add_group(g, NULL); |
|
239cb803fb1d
[gaim-migrate @ 5095]
Mark Doliner <markdoliner@pidgin.im>
parents:
4745
diff
changeset
|
1771 | } |
|
239cb803fb1d
[gaim-migrate @ 5095]
Mark Doliner <markdoliner@pidgin.im>
parents:
4745
diff
changeset
|
1772 | } else { |
| 4687 | 1773 | g = gaim_group_new(_("Buddies")); |
|
4775
239cb803fb1d
[gaim-migrate @ 5095]
Mark Doliner <markdoliner@pidgin.im>
parents:
4745
diff
changeset
|
1774 | gaim_blist_add_group(g, NULL); |
|
239cb803fb1d
[gaim-migrate @ 5095]
Mark Doliner <markdoliner@pidgin.im>
parents:
4745
diff
changeset
|
1775 | } |
|
5223
4ea16d1f5cd1
[gaim-migrate @ 5593]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
1776 | gaim_debug(GAIM_DEBUG_INFO, "jabber", |
|
4ea16d1f5cd1
[gaim-migrate @ 5593]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
1777 | "adding buddy [4]: %s\n", buddyname); |
| 4687 | 1778 | gaim_blist_add_buddy(b, g, NULL); |
| 4349 | 1779 | gaim_blist_save(); |
| 3136 | 1780 | } else { |
| 4687 | 1781 | struct group *c_grp = gaim_find_buddys_group(b); |
| 3136 | 1782 | |
| 3770 | 1783 | /* |
| 3136 | 1784 | * If the buddy's in a new group or his/her alias is changed... |
| 1785 | */ | |
| 1786 | if(groupname && c_grp && strcmp(c_grp->name, groupname)) { | |
| 1787 | int present = b->present; /* save presence state */ | |
| 1788 | int uc = b->uc; /* and away state (?) */ | |
| 3150 | 1789 | int idle = b->idle; |
| 1790 | int signon = b->signon; | |
| 3136 | 1791 | |
| 1792 | /* | |
| 5068 | 1793 | * FIXME: this ugly hack is no longer needed |
| 3136 | 1794 | * seems rude, but it seems to be the only way... |
| 1795 | */ | |
| 4687 | 1796 | gaim_blist_remove_buddy(b); |
| 4705 | 1797 | b = gaim_buddy_new(GJ_GC(gjc)->account, buddyname, name); |
| 4687 | 1798 | gaim_blist_add_buddy(b, gaim_find_group(groupname), NULL); |
| 4349 | 1799 | gaim_blist_save(); |
| 5068 | 1800 | if(present > 0) { |
| 3311 | 1801 | serv_got_update(GJ_GC(gjc), buddyname, 1, 0, signon, idle, |
| 4732 | 1802 | uc); |
| 3136 | 1803 | } |
| 4227 | 1804 | } else if(name != NULL && strcmp(b->alias, name)) { |
| 4705 | 1805 | g_free(b->alias); |
| 1806 | b->alias = g_strdup(name); | |
| 4687 | 1807 | gaim_blist_rename_buddy(b, buddyname); |
| 4349 | 1808 | gaim_blist_save(); |
| 3136 | 1809 | } |
| 2956 | 1810 | } |
| 1811 | } else if (BUD_USUB_TO_PEND(sub, ask) || BUD_USUBD_TO(sub, ask) || !strcasecmp(sub, "remove")) { | |
|
3236
1507dc2b5719
[gaim-migrate @ 3253]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3234
diff
changeset
|
1812 | jabber_remove_gaim_buddy(GJ_GC(gjc), buddyname); |
| 2956 | 1813 | } |
| 5135 | 1814 | if(b && (jbd = jabber_find_buddy(b->account->gc, buddyname, TRUE)) != NULL) { |
| 4927 | 1815 | jbd->subscription = JABBER_SUB_NONE; |
| 1816 | if(!strcasecmp(sub, "to")) | |
| 1817 | jbd->subscription |= JABBER_SUB_TO; | |
| 1818 | else if(!strcasecmp(sub, "from")) | |
| 1819 | jbd->subscription |= JABBER_SUB_FROM; | |
| 1820 | else if(!strcasecmp(sub, "both")) | |
| 1821 | jbd->subscription |= JABBER_SUB_BOTH; | |
| 1822 | ||
| 1823 | if(ask && !strcasecmp(ask, "subscribe")) | |
| 1824 | jbd->subscription |= JABBER_SUB_PENDING; | |
| 1825 | } | |
| 3328 | 1826 | |
| 2956 | 1827 | g_free(buddyname); |
| 1828 | ||
| 1829 | } | |
| 1830 | ||
| 1831 | static void jabber_handleroster(gjconn gjc, xmlnode querynode) | |
| 2086 | 1832 | { |
| 1833 | xmlnode x; | |
| 1834 | ||
| 1835 | x = xmlnode_get_firstchild(querynode); | |
| 1836 | while (x) { | |
| 2956 | 1837 | jabber_handlebuddy(gjc, x); |
| 2086 | 1838 | x = xmlnode_get_nextsibling(x); |
| 1839 | } | |
| 1840 | ||
| 1841 | x = jutil_presnew(0, NULL, "Online"); | |
| 2956 | 1842 | gjab_send(gjc, x); |
| 2086 | 1843 | xmlnode_free(x); |
| 1844 | } | |
| 1845 | ||
| 2956 | 1846 | static void jabber_handleauthresp(gjconn gjc, jpacket p) |
| 2086 | 1847 | { |
| 1848 | if (jpacket_subtype(p) == JPACKET__RESULT) { | |
|
2814
91cc1a0cdee0
[gaim-migrate @ 2827]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2800
diff
changeset
|
1849 | if (xmlnode_has_children(p->x)) { |
|
91cc1a0cdee0
[gaim-migrate @ 2827]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2800
diff
changeset
|
1850 | xmlnode query = xmlnode_get_tag(p->x, "query"); |
| 2975 | 1851 | set_login_progress(GJ_GC(gjc), 4, _("Authenticating")); |
|
2814
91cc1a0cdee0
[gaim-migrate @ 2827]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2800
diff
changeset
|
1852 | if (!xmlnode_get_tag(query, "digest")) { |
| 2956 | 1853 | g_free(gjc->sid); |
| 1854 | gjc->sid = NULL; | |
|
2814
91cc1a0cdee0
[gaim-migrate @ 2827]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2800
diff
changeset
|
1855 | } |
| 2956 | 1856 | gjab_auth(gjc); |
|
2814
91cc1a0cdee0
[gaim-migrate @ 2827]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2800
diff
changeset
|
1857 | } else { |
|
5223
4ea16d1f5cd1
[gaim-migrate @ 5593]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
1858 | gaim_debug(GAIM_DEBUG_INFO, "jabber", "auth success\n"); |
| 2086 | 1859 | |
| 2956 | 1860 | account_online(GJ_GC(gjc)); |
| 1861 | serv_finish_login(GJ_GC(gjc)); | |
| 1862 | ||
| 1863 | ((struct jabber_data *)GJ_GC(gjc)->proto_data)->did_import = TRUE; | |
| 1864 | ||
| 1865 | gjab_reqroster(gjc); | |
|
2814
91cc1a0cdee0
[gaim-migrate @ 2827]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2800
diff
changeset
|
1866 | } |
| 2086 | 1867 | } else { |
| 1868 | xmlnode xerr; | |
| 1869 | char *errmsg = NULL; | |
| 1870 | int errcode = 0; | |
| 2956 | 1871 | struct jabber_data *jd = GJ_GC(gjc)->proto_data; |
| 2086 | 1872 | |
|
5223
4ea16d1f5cd1
[gaim-migrate @ 5593]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
1873 | gaim_debug(GAIM_DEBUG_ERROR, "jabber", "auth failed\n"); |
| 2086 | 1874 | xerr = xmlnode_get_tag(p->x, "error"); |
| 1875 | if (xerr) { | |
| 1876 | char msg[BUF_LONG]; | |
| 1877 | errmsg = xmlnode_get_data(xerr); | |
| 1878 | if (xmlnode_get_attrib(xerr, "code")) { | |
| 1879 | errcode = atoi(xmlnode_get_attrib(xerr, "code")); | |
| 1880 | g_snprintf(msg, sizeof(msg), "Error %d: %s", errcode, errmsg); | |
| 1881 | } else | |
| 1882 | g_snprintf(msg, sizeof(msg), "%s", errmsg); | |
| 2956 | 1883 | hide_login_progress(GJ_GC(gjc), msg); |
| 2086 | 1884 | } else { |
| 2975 | 1885 | hide_login_progress(GJ_GC(gjc), _("Unknown login error")); |
| 2086 | 1886 | } |
| 1887 | ||
|
2800
06490388d3e9
[gaim-migrate @ 2813]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2791
diff
changeset
|
1888 | jd->die = TRUE; |
| 2086 | 1889 | } |
| 1890 | } | |
| 1891 | ||
| 2956 | 1892 | static void jabber_handleversion(gjconn gjc, xmlnode iqnode) { |
| 2086 | 1893 | xmlnode querynode, x; |
| 1894 | char *id, *from; | |
| 1895 | char os[1024]; | |
| 1896 | struct utsname osinfo; | |
| 1897 | ||
| 1898 | uname(&osinfo); | |
| 1899 | g_snprintf(os, sizeof os, "%s %s %s", osinfo.sysname, osinfo.release, osinfo.machine); | |
| 1900 | ||
| 1901 | id = xmlnode_get_attrib(iqnode, "id"); | |
| 1902 | from = xmlnode_get_attrib(iqnode, "from"); | |
| 1903 | ||
| 1904 | x = jutil_iqnew(JPACKET__RESULT, NS_VERSION); | |
| 1905 | ||
| 1906 | xmlnode_put_attrib(x, "to", from); | |
| 1907 | xmlnode_put_attrib(x, "id", id); | |
| 1908 | querynode = xmlnode_get_tag(x, "query"); | |
| 1909 | xmlnode_insert_cdata(xmlnode_insert_tag(querynode, "name"), PACKAGE, -1); | |
| 1910 | xmlnode_insert_cdata(xmlnode_insert_tag(querynode, "version"), VERSION, -1); | |
| 1911 | xmlnode_insert_cdata(xmlnode_insert_tag(querynode, "os"), os, -1); | |
| 1912 | ||
| 2956 | 1913 | gjab_send(gjc, x); |
| 2086 | 1914 | |
| 1915 | xmlnode_free(x); | |
| 1916 | } | |
| 1917 | ||
| 2956 | 1918 | static void jabber_handletime(gjconn gjc, xmlnode iqnode) { |
| 2086 | 1919 | xmlnode querynode, x; |
| 1920 | char *id, *from; | |
| 3770 | 1921 | time_t now_t; |
| 2086 | 1922 | struct tm *now; |
| 1923 | char buf[1024]; | |
| 1924 | ||
| 1925 | time(&now_t); | |
| 1926 | now = localtime(&now_t); | |
| 1927 | ||
| 1928 | id = xmlnode_get_attrib(iqnode, "id"); | |
| 1929 | from = xmlnode_get_attrib(iqnode, "from"); | |
| 1930 | ||
| 1931 | x = jutil_iqnew(JPACKET__RESULT, NS_TIME); | |
| 1932 | ||
| 1933 | xmlnode_put_attrib(x, "to", from); | |
| 1934 | xmlnode_put_attrib(x, "id", id); | |
| 1935 | querynode = xmlnode_get_tag(x, "query"); | |
| 1936 | ||
| 1937 | strftime(buf, 1024, "%Y%m%dT%T", now); | |
| 1938 | xmlnode_insert_cdata(xmlnode_insert_tag(querynode, "utc"), buf, -1); | |
| 1939 | strftime(buf, 1024, "%Z", now); | |
| 1940 | xmlnode_insert_cdata(xmlnode_insert_tag(querynode, "tz"), buf, -1); | |
| 1941 | strftime(buf, 1024, "%d %b %Y %T", now); | |
| 1942 | xmlnode_insert_cdata(xmlnode_insert_tag(querynode, "display"), buf, -1); | |
| 3770 | 1943 | |
| 2956 | 1944 | gjab_send(gjc, x); |
| 2086 | 1945 | |
| 1946 | xmlnode_free(x); | |
| 1947 | } | |
| 1948 | ||
| 4538 | 1949 | struct jabber_xfer_data { |
| 3630 | 1950 | struct g_url *url; |
| 1951 | GString *headers; | |
| 1952 | gboolean newline; | |
| 4538 | 1953 | |
| 1954 | char *iq_id; | |
| 1955 | ||
| 1956 | struct jabber_data *jd; | |
| 3630 | 1957 | }; |
| 1958 | ||
| 4538 | 1959 | static void jabber_xfer_init(struct gaim_xfer *xfer) |
| 1960 | { | |
| 1961 | struct jabber_xfer_data *data = xfer->data; | |
| 1962 | gaim_xfer_start(xfer, -1, data->url->address, data->url->port); | |
| 1963 | } | |
| 1964 | ||
| 1965 | static void jabber_xfer_free(struct gaim_xfer *xfer) | |
| 1966 | { | |
| 1967 | struct jabber_xfer_data *data = xfer->data; | |
| 1968 | data->jd->file_transfers = g_slist_remove(data->jd->file_transfers, xfer); | |
| 1969 | ||
| 1970 | g_string_free(data->headers, TRUE); | |
| 1971 | g_free(data->url); | |
| 1972 | g_free(data->iq_id); | |
| 1973 | g_free(data); | |
| 1974 | ||
| 1975 | xfer->data = NULL; | |
| 3630 | 1976 | } |
| 1977 | ||
| 4538 | 1978 | static void jabber_xfer_end(struct gaim_xfer *xfer) |
| 1979 | { | |
| 1980 | struct jabber_xfer_data *data = xfer->data; | |
| 1981 | xmlnode x; | |
| 1982 | ||
| 1983 | x = xmlnode_new_tag("iq"); | |
| 1984 | xmlnode_put_attrib(x, "type", "result"); | |
| 1985 | xmlnode_put_attrib(x, "to", xfer->who); | |
| 1986 | xmlnode_put_attrib(x, "id", data->iq_id); | |
| 1987 | ||
| 1988 | gjab_send(data->jd->gjc, x); | |
| 1989 | ||
| 1990 | xmlnode_free(x); | |
| 1991 | ||
| 1992 | jabber_xfer_free(xfer); | |
| 1993 | } | |
| 1994 | ||
| 1995 | static void jabber_xfer_start(struct gaim_xfer *xfer) | |
| 1996 | { | |
| 1997 | struct jabber_xfer_data *data = xfer->data; | |
| 1998 | char *buf = g_strdup_printf("GET /%s HTTP/1.1\r\nHost: %s\r\n\r\n", | |
| 1999 | data->url->page, data->url->address); | |
| 2000 | write(xfer->fd, buf, strlen(buf)); | |
| 2001 | g_free(buf); | |
| 2002 | } | |
| 2003 | ||
| 2004 | static size_t jabber_xfer_read(char **buffer, struct gaim_xfer *xfer) { | |
| 2005 | struct jabber_xfer_data *data = xfer->data; | |
| 3630 | 2006 | char test; |
| 4538 | 2007 | size_t size; |
| 2008 | ||
| 2009 | if(read(xfer->fd, &test, sizeof(test)) > 0) { | |
| 2010 | data->headers = g_string_append_c(data->headers, test); | |
| 2011 | if(test == '\r') | |
| 2012 | return 0; | |
| 2013 | if(test == '\n') { | |
| 2014 | if(data->newline) { | |
| 2015 | gchar *lenstr = strstr(data->headers->str, "Content-Length: "); | |
| 2016 | if(lenstr) { | |
| 2017 | sscanf(lenstr, "Content-Length: %d", &size); | |
| 2018 | gaim_xfer_set_size(xfer, size); | |
| 2019 | } | |
| 2020 | gaim_xfer_set_read_fnc(xfer, NULL); | |
| 2021 | return 0; | |
| 2022 | } else | |
| 2023 | data->newline = TRUE; | |
| 2024 | return 0; | |
| 3630 | 2025 | } |
| 4538 | 2026 | data->newline = FALSE; |
| 2027 | return 0; | |
| 3630 | 2028 | } |
| 4538 | 2029 | return 0; |
| 3630 | 2030 | } |
| 2031 | ||
|
4675
8e0a7b537ca2
[gaim-migrate @ 4986]
Christian Hammond <chipx86@chipx86.com>
parents:
4634
diff
changeset
|
2032 | static void jabber_xfer_cancel_send(struct gaim_xfer *xfer) { |
|
8e0a7b537ca2
[gaim-migrate @ 4986]
Christian Hammond <chipx86@chipx86.com>
parents:
4634
diff
changeset
|
2033 | } |
|
8e0a7b537ca2
[gaim-migrate @ 4986]
Christian Hammond <chipx86@chipx86.com>
parents:
4634
diff
changeset
|
2034 | |
|
8e0a7b537ca2
[gaim-migrate @ 4986]
Christian Hammond <chipx86@chipx86.com>
parents:
4634
diff
changeset
|
2035 | static void jabber_xfer_cancel_recv(struct gaim_xfer *xfer) { |
| 4538 | 2036 | struct jabber_xfer_data *data = xfer->data; |
| 3630 | 2037 | xmlnode x,y; |
| 2038 | ||
| 2039 | x = xmlnode_new_tag("iq"); | |
| 2040 | xmlnode_put_attrib(x, "type", "error"); | |
| 4538 | 2041 | xmlnode_put_attrib(x, "to", xfer->who); |
| 2042 | xmlnode_put_attrib(x, "id", data->iq_id); | |
| 3630 | 2043 | y = xmlnode_insert_tag(x, "error"); |
| 2044 | /* FIXME: need to handle other kinds of errors here */ | |
| 2045 | xmlnode_put_attrib(y, "code", "406"); | |
| 2046 | xmlnode_insert_cdata(y, "File Transfer Refused", -1); | |
| 2047 | ||
| 4538 | 2048 | gjab_send(data->jd->gjc, x); |
| 3630 | 2049 | |
| 2050 | xmlnode_free(x); | |
| 2051 | ||
| 4538 | 2052 | jabber_xfer_free(xfer); |
| 3630 | 2053 | } |
| 2054 | ||
| 2055 | static void jabber_handleoob(gjconn gjc, xmlnode iqnode) { | |
| 4538 | 2056 | struct jabber_xfer_data *xfer_data; |
| 3630 | 2057 | struct jabber_data *jd = GJ_GC(gjc)->proto_data; |
|
4675
8e0a7b537ca2
[gaim-migrate @ 4986]
Christian Hammond <chipx86@chipx86.com>
parents:
4634
diff
changeset
|
2058 | struct gaim_xfer *xfer; |
| 3630 | 2059 | char *msg = NULL; |
| 4538 | 2060 | char *filename; |
| 3630 | 2061 | xmlnode querynode = xmlnode_get_tag(iqnode, "query"); |
| 2062 | xmlnode urlnode,descnode; | |
| 2063 | ||
| 2064 | if(!querynode) | |
| 2065 | return; | |
| 2066 | urlnode = xmlnode_get_tag(querynode, "url"); | |
| 2067 | if(!urlnode) | |
| 2068 | return; | |
| 2069 | descnode = xmlnode_get_tag(querynode, "desc"); | |
| 2070 | if(descnode) | |
| 2071 | msg = xmlnode_get_data(descnode); | |
| 2072 | ||
| 4538 | 2073 | xfer_data = g_new0(struct jabber_xfer_data, 1); |
| 2074 | xfer_data->url = parse_url(xmlnode_get_data(urlnode)); | |
| 2075 | xfer_data->jd = jd; | |
| 2076 | xfer_data->headers = g_string_new(""); | |
| 2077 | xfer_data->iq_id = g_strdup(xmlnode_get_attrib(iqnode, "id")); | |
| 2078 | ||
| 2079 | xfer = gaim_xfer_new(GJ_GC(gjc)->account, GAIM_XFER_RECEIVE, | |
| 2080 | xmlnode_get_attrib(iqnode, "from")); | |
| 2081 | xfer->data = xfer_data; | |
| 2082 | ||
| 2083 | filename = g_strdup(g_strrstr(xfer_data->url->page, "/")); | |
| 2084 | if(!filename) | |
| 2085 | filename = g_strdup(xfer_data->url->page); | |
| 2086 | ||
| 2087 | gaim_xfer_set_filename(xfer, filename); | |
| 2088 | ||
| 2089 | g_free(filename); | |
| 2090 | ||
| 2091 | gaim_xfer_set_init_fnc(xfer, jabber_xfer_init); | |
| 2092 | gaim_xfer_set_end_fnc(xfer, jabber_xfer_end); | |
|
4675
8e0a7b537ca2
[gaim-migrate @ 4986]
Christian Hammond <chipx86@chipx86.com>
parents:
4634
diff
changeset
|
2093 | gaim_xfer_set_cancel_send_fnc(xfer, jabber_xfer_cancel_send); |
|
8e0a7b537ca2
[gaim-migrate @ 4986]
Christian Hammond <chipx86@chipx86.com>
parents:
4634
diff
changeset
|
2094 | gaim_xfer_set_cancel_recv_fnc(xfer, jabber_xfer_cancel_recv); |
| 4538 | 2095 | gaim_xfer_set_read_fnc(xfer, jabber_xfer_read); |
| 2096 | gaim_xfer_set_start_fnc(xfer, jabber_xfer_start); | |
| 2097 | ||
| 2098 | jd->file_transfers = g_slist_append(jd->file_transfers, xfer); | |
| 2099 | ||
| 2100 | gaim_xfer_request(xfer); | |
| 3630 | 2101 | } |
| 2102 | ||
| 2956 | 2103 | static void jabber_handlelast(gjconn gjc, xmlnode iqnode) { |
| 3630 | 2104 | xmlnode x, querytag; |
| 2086 | 2105 | char *id, *from; |
| 2956 | 2106 | struct jabber_data *jd = GJ_GC(gjc)->proto_data; |
| 2086 | 2107 | char idle_time[32]; |
| 3630 | 2108 | |
| 2086 | 2109 | id = xmlnode_get_attrib(iqnode, "id"); |
| 2110 | from = xmlnode_get_attrib(iqnode, "from"); | |
| 2111 | ||
| 2112 | x = jutil_iqnew(JPACKET__RESULT, "jabber:iq:last"); | |
| 2113 | ||
| 2114 | xmlnode_put_attrib(x, "to", from); | |
| 2115 | xmlnode_put_attrib(x, "id", id); | |
| 2116 | querytag = xmlnode_get_tag(x, "query"); | |
| 2117 | g_snprintf(idle_time, sizeof idle_time, "%ld", jd->idle ? time(NULL) - jd->idle : 0); | |
| 2118 | xmlnode_put_attrib(querytag, "seconds", idle_time); | |
| 2119 | ||
| 2956 | 2120 | gjab_send(gjc, x); |
| 2086 | 2121 | xmlnode_free(x); |
| 2122 | } | |
| 2123 | ||
| 2956 | 2124 | /* |
| 2125 | * delete == TRUE: delete found entry | |
| 2126 | * | |
| 2127 | * returns pointer to (local) copy of value if found, NULL otherwise | |
| 2128 | * | |
| 2129 | * Note: non-reentrant! Local static storage re-used on subsequent calls. | |
| 2130 | * If you're going to need to keep the returned value, make a copy! | |
| 2131 | */ | |
| 2132 | static gchar *jabber_track_queries(GHashTable *queries, gchar *key, gboolean delete) | |
| 2133 | { | |
| 2134 | gpointer my_key, my_val; | |
| 2135 | static gchar *ret_val = NULL; | |
| 2136 | ||
| 2137 | if(ret_val != NULL) { | |
| 2138 | g_free(ret_val); | |
| 2139 | ret_val = NULL; | |
| 2140 | } | |
| 2141 | ||
| 2142 | /* self-protection */ | |
| 2143 | if(queries != NULL && key != NULL) { | |
| 2144 | if(g_hash_table_lookup_extended(queries, key, &my_key, &my_val)) { | |
| 2145 | ret_val = g_strdup((gchar *) my_val); | |
| 2146 | if(delete) { | |
| 2147 | g_hash_table_remove(queries, key); | |
| 2148 | g_free(my_key); | |
| 2149 | g_free(my_val); | |
| 2150 | } | |
| 2151 | } | |
| 2152 | } | |
| 2153 | ||
| 2154 | return(ret_val); | |
| 2155 | } | |
| 2156 | ||
| 2157 | static void jabber_handlepacket(gjconn gjc, jpacket p) | |
| 2086 | 2158 | { |
|
2814
91cc1a0cdee0
[gaim-migrate @ 2827]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2800
diff
changeset
|
2159 | char *id; |
| 2086 | 2160 | switch (p->type) { |
| 2161 | case JPACKET_MESSAGE: | |
| 2956 | 2162 | jabber_handlemessage(gjc, p); |
| 2086 | 2163 | break; |
| 2164 | case JPACKET_PRESENCE: | |
| 2956 | 2165 | jabber_handlepresence(gjc, p); |
| 2086 | 2166 | break; |
| 2167 | case JPACKET_IQ: | |
|
5223
4ea16d1f5cd1
[gaim-migrate @ 5593]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
2168 | gaim_debug(GAIM_DEBUG_MISC, "jabber", |
|
4ea16d1f5cd1
[gaim-migrate @ 5593]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
2169 | "jpacket_subtype: %d\n", jpacket_subtype(p)); |
| 2086 | 2170 | |
| 2956 | 2171 | id = xmlnode_get_attrib(p->x, "id"); |
| 2172 | if (id != NULL && !strcmp(id, IQID_AUTH)) { | |
| 2173 | jabber_handleauthresp(gjc, p); | |
|
2814
91cc1a0cdee0
[gaim-migrate @ 2827]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2800
diff
changeset
|
2174 | break; |
| 2086 | 2175 | } |
| 2176 | ||
| 2177 | if (jpacket_subtype(p) == JPACKET__SET) { | |
| 2956 | 2178 | xmlnode querynode; |
| 2179 | querynode = xmlnode_get_tag(p->x, "query"); | |
| 2180 | if (NSCHECK(querynode, "jabber:iq:roster")) { | |
| 2181 | jabber_handlebuddy(gjc, xmlnode_get_firstchild(querynode)); | |
| 3630 | 2182 | } else if(NSCHECK(querynode, "jabber:iq:oob")) { |
| 2183 | jabber_handleoob(gjc, p->x); | |
| 2956 | 2184 | } |
| 2086 | 2185 | } else if (jpacket_subtype(p) == JPACKET__GET) { |
| 3770 | 2186 | xmlnode querynode; |
| 2086 | 2187 | querynode = xmlnode_get_tag(p->x, "query"); |
| 3770 | 2188 | if (NSCHECK(querynode, NS_VERSION)) { |
| 2189 | jabber_handleversion(gjc, p->x); | |
| 2086 | 2190 | } else if (NSCHECK(querynode, NS_TIME)) { |
| 3770 | 2191 | jabber_handletime(gjc, p->x); |
| 2086 | 2192 | } else if (NSCHECK(querynode, "jabber:iq:last")) { |
| 3770 | 2193 | jabber_handlelast(gjc, p->x); |
| 2086 | 2194 | } |
| 2195 | } else if (jpacket_subtype(p) == JPACKET__RESULT) { | |
| 2196 | xmlnode querynode, vcard; | |
| 2197 | char *xmlns, *from; | |
| 2198 | ||
| 2956 | 2199 | /* |
| 2200 | * TBD: ISTM maybe this part could use a serious re-work? | |
| 2201 | */ | |
| 2086 | 2202 | from = xmlnode_get_attrib(p->x, "from"); |
| 2203 | querynode = xmlnode_get_tag(p->x, "query"); | |
| 2204 | vcard = xmlnode_get_tag(p->x, "vCard"); | |
| 2316 | 2205 | if (!vcard) |
| 2206 | vcard = xmlnode_get_tag(p->x, "VCARD"); | |
| 2086 | 2207 | |
| 2208 | if (NSCHECK(querynode, NS_ROSTER)) { | |
| 2956 | 2209 | jabber_handleroster(gjc, querynode); |
| 2086 | 2210 | } else if (NSCHECK(querynode, NS_VCARD)) { |
| 2956 | 2211 | jabber_track_queries(gjc->queries, id, TRUE); /* delete query track */ |
| 3770 | 2212 | jabber_handlevcard(gjc, querynode, from); |
| 2316 | 2213 | } else if (vcard) { |
| 2956 | 2214 | jabber_track_queries(gjc->queries, id, TRUE); /* delete query track */ |
| 2215 | jabber_handlevcard(gjc, vcard, from); | |
| 2216 | } else if((xmlns = xmlnode_get_attrib(querynode, "xmlns")) != NULL) { | |
|
5223
4ea16d1f5cd1
[gaim-migrate @ 5593]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
2217 | gaim_debug(GAIM_DEBUG_MISC, "jabber", |
|
4ea16d1f5cd1
[gaim-migrate @ 5593]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
2218 | "jabber:iq:query: %s\n", xmlns); |
| 2086 | 2219 | } else { |
| 2956 | 2220 | char *val; |
| 2221 | ||
|
5223
4ea16d1f5cd1
[gaim-migrate @ 5593]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
2222 | gaim_debug(GAIM_DEBUG_MISC, "jabber", |
|
4ea16d1f5cd1
[gaim-migrate @ 5593]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
2223 | "jabber:iq: %s\n", xmlnode2str(p->x)); |
| 2956 | 2224 | |
| 2225 | /* handle "null" query results */ | |
| 2226 | if((val = jabber_track_queries(gjc->queries, id, TRUE)) != NULL) { | |
| 2227 | if(strcmp((char *) val, "vCard") == 0) { | |
| 2228 | /* | |
| 2229 | * No actual vCard, but there's other stuff. This | |
| 2230 | * way the user always gets some kind of response. | |
| 2231 | */ | |
| 2232 | jabber_handlevcard(gjc, NULL, from); | |
| 3257 | 2233 | } else if(!strcmp((char *) val, "change_password")) { |
| 2234 | char buf[BUF_LONG]; | |
| 3311 | 2235 | sprintf(buf, _("Password successfully changed.")); |
| 3257 | 2236 | |
| 3427 | 2237 | do_error_dialog(buf, NULL, GAIM_INFO); |
| 2956 | 2238 | } |
| 2239 | } | |
| 2086 | 2240 | } |
| 2241 | ||
| 2242 | } else if (jpacket_subtype(p) == JPACKET__ERROR) { | |
| 2243 | xmlnode xerr; | |
| 2244 | char *from, *errmsg = NULL; | |
| 2245 | int errcode = 0; | |
| 2246 | ||
| 2247 | from = xmlnode_get_attrib(p->x, "from"); | |
| 2248 | xerr = xmlnode_get_tag(p->x, "error"); | |
| 2249 | if (xerr) { | |
| 2250 | errmsg = xmlnode_get_data(xerr); | |
| 2251 | if (xmlnode_get_attrib(xerr, "code")) | |
| 2252 | errcode = atoi(xmlnode_get_attrib(xerr, "code")); | |
| 2253 | } | |
| 2254 | ||
| 3427 | 2255 | from = g_strdup_printf("Jabber Error %d (%s)", errcode, from); |
| 2256 | do_error_dialog(from, errmsg, GAIM_ERROR); | |
| 2086 | 2257 | g_free(from); |
| 2258 | ||
| 2259 | } | |
| 2260 | ||
| 2261 | break; | |
| 2262 | case JPACKET_S10N: | |
| 2956 | 2263 | jabber_handles10n(gjc, p); |
| 2086 | 2264 | break; |
| 2265 | default: | |
|
5223
4ea16d1f5cd1
[gaim-migrate @ 5593]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
2266 | gaim_debug(GAIM_DEBUG_MISC, "jabber", |
|
4ea16d1f5cd1
[gaim-migrate @ 5593]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
2267 | "jabber: packet type %d (%s)\n", p->type, xmlnode2str(p->x)); |
| 2086 | 2268 | } |
| 2269 | ||
| 2270 | xmlnode_free(p->x); | |
| 2271 | ||
| 2272 | return; | |
| 2273 | } | |
| 2274 | ||
| 2956 | 2275 | static void jabber_handlestate(gjconn gjc, int state) |
| 2086 | 2276 | { |
| 2277 | switch (state) { | |
| 2278 | case JCONN_STATE_OFF: | |
|
3074
b6510843df8f
[gaim-migrate @ 3088]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3059
diff
changeset
|
2279 | if(gjc->was_connected) { |
|
b6510843df8f
[gaim-migrate @ 3088]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3059
diff
changeset
|
2280 | hide_login_progress_error(GJ_GC(gjc), _("Connection lost")); |
|
b6510843df8f
[gaim-migrate @ 3088]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3059
diff
changeset
|
2281 | } else { |
|
b6510843df8f
[gaim-migrate @ 3088]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3059
diff
changeset
|
2282 | hide_login_progress(GJ_GC(gjc), _("Unable to connect")); |
|
b6510843df8f
[gaim-migrate @ 3088]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3059
diff
changeset
|
2283 | } |
| 2956 | 2284 | signoff(GJ_GC(gjc)); |
| 2086 | 2285 | break; |
| 2286 | case JCONN_STATE_CONNECTED: | |
|
3074
b6510843df8f
[gaim-migrate @ 3088]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3059
diff
changeset
|
2287 | gjc->was_connected = 1; |
| 2975 | 2288 | set_login_progress(GJ_GC(gjc), 2, _("Connected")); |
| 2086 | 2289 | break; |
| 2290 | case JCONN_STATE_ON: | |
| 2975 | 2291 | set_login_progress(GJ_GC(gjc), 3, _("Requesting Authentication Method")); |
| 2956 | 2292 | gjab_reqauth(gjc); |
| 2086 | 2293 | break; |
| 2294 | default: | |
|
5223
4ea16d1f5cd1
[gaim-migrate @ 5593]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
2295 | gaim_debug(GAIM_DEBUG_MISC, "jabber", "state change: %d\n", state); |
| 2086 | 2296 | } |
| 2297 | return; | |
| 2298 | } | |
| 2299 | ||
| 4491 | 2300 | static void jabber_login(struct gaim_account *account) |
| 2086 | 2301 | { |
| 4491 | 2302 | struct gaim_connection *gc = new_gaim_conn(account); |
| 2086 | 2303 | struct jabber_data *jd = gc->proto_data = g_new0(struct jabber_data, 1); |
| 4917 | 2304 | char *loginname = create_valid_jid(account->username, DEFAULT_SERVER, "Gaim"); |
| 2086 | 2305 | |
| 5174 | 2306 | gc->flags |= OPT_CONN_HTML; |
| 2307 | ||
| 3311 | 2308 | jd->buddies = g_hash_table_new(g_str_hash, g_str_equal); |
| 2956 | 2309 | jd->chats = NULL; /* we have no chats yet */ |
| 2086 | 2310 | |
| 2975 | 2311 | set_login_progress(gc, 1, _("Connecting")); |
| 2086 | 2312 | |
| 4491 | 2313 | if (!(jd->gjc = gjab_new(loginname, account->password, gc))) { |
| 2086 | 2314 | g_free(loginname); |
|
5223
4ea16d1f5cd1
[gaim-migrate @ 5593]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
2315 | gaim_debug(GAIM_DEBUG_ERROR, "jabber", |
|
4ea16d1f5cd1
[gaim-migrate @ 5593]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
2316 | "unable to connect (jab_new failed)\n"); |
| 2975 | 2317 | hide_login_progress(gc, _("Unable to connect")); |
| 2086 | 2318 | signoff(gc); |
| 2319 | return; | |
| 2320 | } | |
| 2321 | ||
| 2322 | g_free(loginname); | |
| 2956 | 2323 | gjab_state_handler(jd->gjc, jabber_handlestate); |
| 2324 | gjab_packet_handler(jd->gjc, jabber_handlepacket); | |
| 2325 | jd->gjc->queries = g_hash_table_new(g_str_hash, g_str_equal); | |
| 2326 | gjab_start(jd->gjc); | |
| 2086 | 2327 | } |
| 2328 | ||
| 2329 | static gboolean jabber_destroy_hash(gpointer key, gpointer val, gpointer data) { | |
| 3770 | 2330 | g_free(key); |
| 2086 | 2331 | g_free(val); |
| 2332 | return TRUE; | |
| 2333 | } | |
| 2334 | ||
| 3311 | 2335 | static gboolean jabber_destroy_buddy_hash(gpointer key, gpointer val, gpointer data) { |
| 2336 | struct jabber_buddy_data *jbd = val; | |
| 2337 | while (jbd->resources) { | |
| 2338 | g_free(((jab_res_info) ((GSList *)jbd->resources)->data)->name); | |
| 2339 | if(((jab_res_info) ((GSList *)jbd->resources)->data)->away_msg) | |
| 2340 | g_free(((jab_res_info) ((GSList *)jbd->resources)->data)->away_msg); | |
| 2341 | g_free(((GSList *)jbd->resources)->data); | |
| 2342 | jbd->resources = g_slist_remove(jbd->resources, ((GSList *)jbd->resources)->data); | |
| 2343 | ||
| 2344 | } | |
| 2345 | if(jbd->error_msg) | |
| 2346 | g_free(jbd->error_msg); | |
| 2347 | g_free(key); | |
| 2348 | g_free(jbd); | |
| 2349 | return TRUE; | |
| 2350 | } | |
| 2351 | ||
| 2352 | ||
| 2086 | 2353 | static gboolean jabber_free(gpointer data) |
| 2354 | { | |
| 2956 | 2355 | struct jabber_data *jd = data; |
| 2356 | ||
|
3236
1507dc2b5719
[gaim-migrate @ 3253]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3234
diff
changeset
|
2357 | if(jd->gjc != NULL) { |
| 3486 | 2358 | g_free(jd->gjc->sid); |
|
3236
1507dc2b5719
[gaim-migrate @ 3253]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3234
diff
changeset
|
2359 | gjab_delete(jd->gjc); |
|
1507dc2b5719
[gaim-migrate @ 3253]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3234
diff
changeset
|
2360 | jd->gjc = NULL; |
|
1507dc2b5719
[gaim-migrate @ 3253]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3234
diff
changeset
|
2361 | } |
| 2956 | 2362 | g_free(jd); |
| 2363 | ||
| 2086 | 2364 | return FALSE; |
| 2365 | } | |
| 2366 | ||
| 2367 | static void jabber_close(struct gaim_connection *gc) | |
| 2368 | { | |
| 2369 | struct jabber_data *jd = gc->proto_data; | |
| 2956 | 2370 | |
| 2371 | if(jd) { | |
| 2372 | GSList *jcs = jd->chats; | |
| 2373 | ||
| 2374 | /* Free-up the jabber_chat struct allocs and the list */ | |
| 2375 | while (jcs) { | |
| 3311 | 2376 | gaim_jid_free(((struct jabber_chat *)jcs->data)->gjid); |
| 2956 | 2377 | g_free(jcs->data); |
| 2378 | jcs = jcs->next; | |
| 2379 | } | |
| 2380 | g_slist_free(jd->chats); | |
| 2381 | ||
| 3311 | 2382 | /* Free-up the buddy data hash */ |
| 2383 | if(jd->buddies != NULL) | |
| 2384 | { | |
| 2385 | g_hash_table_foreach_remove(jd->buddies, jabber_destroy_buddy_hash, NULL); | |
| 2386 | g_hash_table_destroy(jd->buddies); | |
| 2387 | jd->buddies = NULL; | |
| 2956 | 2388 | } |
| 2389 | ||
| 2390 | /* Free-up the pending queries memories and the list */ | |
|
3236
1507dc2b5719
[gaim-migrate @ 3253]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3234
diff
changeset
|
2391 | if(jd->gjc != NULL && jd->gjc->queries != NULL) { |
| 2956 | 2392 | g_hash_table_foreach_remove(jd->gjc->queries, jabber_destroy_hash, NULL); |
| 2393 | g_hash_table_destroy(jd->gjc->queries); | |
| 2394 | jd->gjc->queries = NULL; | |
| 2395 | } | |
| 2396 | } | |
|
2300
06a3c10f4918
[gaim-migrate @ 2310]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2289
diff
changeset
|
2397 | if (gc->inpa) |
|
06a3c10f4918
[gaim-migrate @ 2310]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2289
diff
changeset
|
2398 | gaim_input_remove(gc->inpa); |
| 2956 | 2399 | |
| 2400 | if(jd) { | |
| 3613 | 2401 | g_timeout_add(0, jabber_free, jd); |
|
3236
1507dc2b5719
[gaim-migrate @ 3253]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3234
diff
changeset
|
2402 | if(jd->gjc != NULL) |
|
1507dc2b5719
[gaim-migrate @ 3253]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3234
diff
changeset
|
2403 | xmlnode_free(jd->gjc->current); |
| 2956 | 2404 | } |
| 2086 | 2405 | gc->proto_data = NULL; |
| 2406 | } | |
| 2407 | ||
| 3311 | 2408 | static int jabber_send_typing(struct gaim_connection *gc, char *who, int typing) |
| 2409 | { | |
| 2410 | xmlnode x, y; | |
| 2411 | char *realwho; | |
| 2412 | gjconn gjc = ((struct jabber_data *)gc->proto_data)->gjc; | |
| 2413 | jab_res_info jri = jabber_find_resource(gc, who); | |
| 2414 | ||
| 2415 | if(!jri || !jri->has_composing) | |
| 2416 | return 0; | |
| 2417 | ||
| 2418 | if((realwho = get_realwho(gjc, who, FALSE, NULL)) == NULL) | |
| 2419 | return 0; | |
|
3596
94fcf584c358
[gaim-migrate @ 3698]
Mark Doliner <markdoliner@pidgin.im>
parents:
3583
diff
changeset
|
2420 | |
| 3311 | 2421 | x = xmlnode_new_tag("message"); |
| 2422 | xmlnode_put_attrib(x, "to", realwho); | |
| 2423 | xmlnode_insert_tag(x, "gaim"); | |
| 2424 | ||
| 2425 | y = xmlnode_insert_tag(x, "x"); | |
| 2426 | xmlnode_put_attrib(y, "xmlns", "jabber:x:event"); | |
| 2427 | ||
|
3596
94fcf584c358
[gaim-migrate @ 3698]
Mark Doliner <markdoliner@pidgin.im>
parents:
3583
diff
changeset
|
2428 | if(typing == TYPING) |
| 3311 | 2429 | xmlnode_insert_tag(y, "composing"); |
|
3596
94fcf584c358
[gaim-migrate @ 3698]
Mark Doliner <markdoliner@pidgin.im>
parents:
3583
diff
changeset
|
2430 | |
| 3311 | 2431 | gjab_send(((struct jabber_data *)gc->proto_data)->gjc, x); |
| 2432 | xmlnode_free(x); | |
| 2433 | g_free(realwho); | |
| 2434 | return JABBER_TYPING_NOTIFY_INT; | |
| 2435 | } | |
| 2436 | ||
| 5093 | 2437 | static void insert_message(xmlnode x, const char *message, gboolean use_xhtml) { |
| 2438 | xmlnode y; | |
| 5110 | 2439 | char *buf = g_strdup_printf("<html xmlns='http://jabber.org/protocol/xhtml-im'><body>%s</body></html>", message); |
| 2440 | char *xhtml, *plain; | |
| 2441 | ||
| 2442 | html_to_xhtml(buf, &xhtml, &plain); | |
| 2443 | g_free(buf); | |
| 2444 | ||
| 5093 | 2445 | y = xmlnode_insert_tag(x, "body"); |
| 5110 | 2446 | xmlnode_insert_cdata(y, plain, -1); |
| 2447 | g_free(plain); | |
| 5093 | 2448 | |
| 2449 | if(use_xhtml) { | |
| 5110 | 2450 | y = xmlnode_str(xhtml, strlen(xhtml)); |
| 5093 | 2451 | if(y) { |
| 2452 | xmlnode_insert_tag_node(x, y); | |
| 2453 | xmlnode_free(y); | |
| 2454 | } else { | |
|
5223
4ea16d1f5cd1
[gaim-migrate @ 5593]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
2455 | gaim_debug(GAIM_DEBUG_ERROR, "jabber", |
|
4ea16d1f5cd1
[gaim-migrate @ 5593]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
2456 | "holy cow, html_to_xhtml didn't work right!\n"); |
|
4ea16d1f5cd1
[gaim-migrate @ 5593]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
2457 | gaim_debug(GAIM_DEBUG_ERROR, "jabber", |
|
4ea16d1f5cd1
[gaim-migrate @ 5593]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
2458 | "the invalid XML: %s\n", xhtml); |
| 5093 | 2459 | } |
| 2460 | } | |
| 5110 | 2461 | g_free(xhtml); |
| 5093 | 2462 | } |
| 2463 | ||
| 5136 | 2464 | static int jabber_send_im(struct gaim_connection *gc, const char *who, const char *message, int len, int flags) |
| 2086 | 2465 | { |
| 2466 | xmlnode x, y; | |
| 3311 | 2467 | char *thread_id = NULL; |
| 2956 | 2468 | gjconn gjc = ((struct jabber_data *)gc->proto_data)->gjc; |
| 5093 | 2469 | jab_res_info jri = jabber_find_resource(gc, who); |
| 2086 | 2470 | |
| 2471 | if (!who || !message) | |
|
2123
4cfdde0aa3f1
[gaim-migrate @ 2133]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2112
diff
changeset
|
2472 | return 0; |
| 2086 | 2473 | |
| 2474 | x = xmlnode_new_tag("message"); | |
| 4927 | 2475 | xmlnode_put_attrib(x, "to", who); |
| 2476 | ||
| 2477 | thread_id = jabber_get_convo_thread(gjc, who); | |
| 3311 | 2478 | if(thread_id) |
| 2479 | { | |
| 3769 | 2480 | if(strcmp(thread_id, "")) { |
| 2481 | y = xmlnode_insert_tag(x, "thread"); | |
| 2482 | xmlnode_insert_cdata(y, thread_id, -1); | |
| 2483 | } | |
| 3311 | 2484 | g_free(thread_id); |
| 2485 | } | |
| 2486 | ||
|
2278
79ae3adc97bf
[gaim-migrate @ 2288]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2232
diff
changeset
|
2487 | xmlnode_insert_tag(x, "gaim"); |
| 2086 | 2488 | xmlnode_put_attrib(x, "type", "chat"); |
| 2489 | ||
| 3311 | 2490 | /* let other clients know we support typing notification */ |
| 2491 | y = xmlnode_insert_tag(x, "x"); | |
| 2492 | xmlnode_put_attrib(y, "xmlns", "jabber:x:event"); | |
| 2493 | xmlnode_insert_tag(y, "composing"); | |
| 2494 | ||
| 2086 | 2495 | if (message && strlen(message)) { |
| 5093 | 2496 | insert_message(x, message, jri ? jri->has_xhtml : TRUE); |
| 2086 | 2497 | } |
| 2498 | ||
| 2956 | 2499 | gjab_send(((struct jabber_data *)gc->proto_data)->gjc, x); |
| 2086 | 2500 | xmlnode_free(x); |
|
2303
18171aa8cd37
[gaim-migrate @ 2313]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2300
diff
changeset
|
2501 | return 1; |
| 2086 | 2502 | } |
| 2503 | ||
|
3105
8c23b0ec1036
[gaim-migrate @ 3119]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3074
diff
changeset
|
2504 | /* |
|
8c23b0ec1036
[gaim-migrate @ 3119]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3074
diff
changeset
|
2505 | * Add/update buddy's roster entry on server |
|
3349
82d6463648fa
[gaim-migrate @ 3368]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3340
diff
changeset
|
2506 | * |
|
82d6463648fa
[gaim-migrate @ 3368]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3340
diff
changeset
|
2507 | * If "alias" or "group" are NULL, gets them from Gaim's current buddylist values |
|
82d6463648fa
[gaim-migrate @ 3368]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3340
diff
changeset
|
2508 | * for the buddy. |
|
3105
8c23b0ec1036
[gaim-migrate @ 3119]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3074
diff
changeset
|
2509 | */ |
| 3867 | 2510 | static void jabber_roster_update(struct gaim_connection *gc, const char *name, const char *alias, const char *group) |
|
3105
8c23b0ec1036
[gaim-migrate @ 3119]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3074
diff
changeset
|
2511 | { |
|
8c23b0ec1036
[gaim-migrate @ 3119]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3074
diff
changeset
|
2512 | xmlnode x, y; |
|
8c23b0ec1036
[gaim-migrate @ 3119]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3074
diff
changeset
|
2513 | char *realwho; |
|
8c23b0ec1036
[gaim-migrate @ 3119]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3074
diff
changeset
|
2514 | gjconn gjc; |
|
8c23b0ec1036
[gaim-migrate @ 3119]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3074
diff
changeset
|
2515 | struct buddy *buddy = NULL; |
|
8c23b0ec1036
[gaim-migrate @ 3119]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3074
diff
changeset
|
2516 | struct group *buddy_group = NULL; |
| 3867 | 2517 | const char *my_alias = NULL; |
| 2518 | const char *my_group = NULL; | |
| 3770 | 2519 | |
|
3105
8c23b0ec1036
[gaim-migrate @ 3119]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3074
diff
changeset
|
2520 | if(gc && gc->proto_data && ((struct jabber_data *)gc->proto_data)->gjc && name) { |
| 3311 | 2521 | gaim_jid gjid; |
|
3105
8c23b0ec1036
[gaim-migrate @ 3119]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3074
diff
changeset
|
2522 | gjc = ((struct jabber_data *)gc->proto_data)->gjc; |
|
8c23b0ec1036
[gaim-migrate @ 3119]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3074
diff
changeset
|
2523 | |
| 3311 | 2524 | if((realwho = get_realwho(gjc, name, FALSE, &gjid)) == NULL) |
| 2525 | return; | |
| 2526 | ||
| 2527 | /* FIXME: transport */ | |
| 2528 | if(gjid->user == NULL) { | |
| 2529 | g_free(realwho); | |
| 2530 | gaim_jid_free(gjid); | |
| 2531 | return; | |
|
3105
8c23b0ec1036
[gaim-migrate @ 3119]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3074
diff
changeset
|
2532 | } |
| 3311 | 2533 | gaim_jid_free(gjid); |
|
3105
8c23b0ec1036
[gaim-migrate @ 3119]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3074
diff
changeset
|
2534 | |
|
8c23b0ec1036
[gaim-migrate @ 3119]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3074
diff
changeset
|
2535 | x = jutil_iqnew(JPACKET__SET, NS_ROSTER); |
|
8c23b0ec1036
[gaim-migrate @ 3119]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3074
diff
changeset
|
2536 | y = xmlnode_insert_tag(xmlnode_get_tag(x, "query"), "item"); |
|
8c23b0ec1036
[gaim-migrate @ 3119]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3074
diff
changeset
|
2537 | xmlnode_put_attrib(y, "jid", realwho); |
|
8c23b0ec1036
[gaim-migrate @ 3119]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3074
diff
changeset
|
2538 | |
| 4687 | 2539 | buddy = gaim_find_buddy(gc->account, realwho); |
| 4349 | 2540 | |
|
3349
82d6463648fa
[gaim-migrate @ 3368]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3340
diff
changeset
|
2541 | /* |
|
82d6463648fa
[gaim-migrate @ 3368]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3340
diff
changeset
|
2542 | * See if there's an explict (new?) alias for the buddy or we can pull |
|
82d6463648fa
[gaim-migrate @ 3368]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3340
diff
changeset
|
2543 | * one out of current Gaim buddylist data for him. |
|
82d6463648fa
[gaim-migrate @ 3368]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3340
diff
changeset
|
2544 | */ |
|
82d6463648fa
[gaim-migrate @ 3368]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3340
diff
changeset
|
2545 | if(alias && alias[0] != '\0') { |
|
82d6463648fa
[gaim-migrate @ 3368]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3340
diff
changeset
|
2546 | my_alias = alias; |
| 4705 | 2547 | } else if(buddy && buddy->alias) { |
| 4227 | 2548 | my_alias = buddy->alias; |
|
3349
82d6463648fa
[gaim-migrate @ 3368]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3340
diff
changeset
|
2549 | } |
|
82d6463648fa
[gaim-migrate @ 3368]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3340
diff
changeset
|
2550 | |
|
82d6463648fa
[gaim-migrate @ 3368]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3340
diff
changeset
|
2551 | /* If there's an alias for the buddy, it's not 0-length |
|
3105
8c23b0ec1036
[gaim-migrate @ 3119]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3074
diff
changeset
|
2552 | * and it doesn't match his JID, add the "name" attribute. |
|
8c23b0ec1036
[gaim-migrate @ 3119]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3074
diff
changeset
|
2553 | */ |
|
3349
82d6463648fa
[gaim-migrate @ 3368]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3340
diff
changeset
|
2554 | if(my_alias != NULL && my_alias[0] != '\0' && strcmp(realwho, my_alias)) |
| 3311 | 2555 | { |
| 3642 | 2556 | xmlnode_put_attrib(y, "name", my_alias); |
|
3105
8c23b0ec1036
[gaim-migrate @ 3119]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3074
diff
changeset
|
2557 | } |
|
8c23b0ec1036
[gaim-migrate @ 3119]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3074
diff
changeset
|
2558 | |
|
8c23b0ec1036
[gaim-migrate @ 3119]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3074
diff
changeset
|
2559 | /* |
|
3349
82d6463648fa
[gaim-migrate @ 3368]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3340
diff
changeset
|
2560 | * See if there's an explict (new?) group for the buddy or pull |
|
82d6463648fa
[gaim-migrate @ 3368]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3340
diff
changeset
|
2561 | * one out of current Gaim buddylist data for him. |
|
3105
8c23b0ec1036
[gaim-migrate @ 3119]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3074
diff
changeset
|
2562 | */ |
|
3349
82d6463648fa
[gaim-migrate @ 3368]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3340
diff
changeset
|
2563 | if(group && group[0] != '\0') { |
|
82d6463648fa
[gaim-migrate @ 3368]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3340
diff
changeset
|
2564 | my_group = group; |
| 4687 | 2565 | } else if((buddy_group = gaim_find_buddys_group(buddy)) != NULL) { |
|
3349
82d6463648fa
[gaim-migrate @ 3368]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3340
diff
changeset
|
2566 | my_group = buddy_group->name; |
|
82d6463648fa
[gaim-migrate @ 3368]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3340
diff
changeset
|
2567 | } |
|
82d6463648fa
[gaim-migrate @ 3368]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3340
diff
changeset
|
2568 | |
|
82d6463648fa
[gaim-migrate @ 3368]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3340
diff
changeset
|
2569 | /* |
|
82d6463648fa
[gaim-migrate @ 3368]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3340
diff
changeset
|
2570 | * Send what group the buddy's in along with the roster item. |
|
82d6463648fa
[gaim-migrate @ 3368]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3340
diff
changeset
|
2571 | */ |
|
82d6463648fa
[gaim-migrate @ 3368]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3340
diff
changeset
|
2572 | if(my_group != NULL && my_group[0] != '\0') { |
|
82d6463648fa
[gaim-migrate @ 3368]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3340
diff
changeset
|
2573 | xmlnode z = xmlnode_insert_tag(y, "group"); |
|
82d6463648fa
[gaim-migrate @ 3368]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3340
diff
changeset
|
2574 | xmlnode_insert_cdata(z, my_group, -1); |
|
3105
8c23b0ec1036
[gaim-migrate @ 3119]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3074
diff
changeset
|
2575 | } |
|
8c23b0ec1036
[gaim-migrate @ 3119]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3074
diff
changeset
|
2576 | |
|
8c23b0ec1036
[gaim-migrate @ 3119]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3074
diff
changeset
|
2577 | gjab_send(((struct jabber_data *)gc->proto_data)->gjc, x); |
|
8c23b0ec1036
[gaim-migrate @ 3119]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3074
diff
changeset
|
2578 | |
|
8c23b0ec1036
[gaim-migrate @ 3119]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3074
diff
changeset
|
2579 | xmlnode_free(x); |
|
8c23b0ec1036
[gaim-migrate @ 3119]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3074
diff
changeset
|
2580 | g_free(realwho); |
|
8c23b0ec1036
[gaim-migrate @ 3119]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3074
diff
changeset
|
2581 | } |
|
8c23b0ec1036
[gaim-migrate @ 3119]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3074
diff
changeset
|
2582 | } |
|
8c23b0ec1036
[gaim-migrate @ 3119]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3074
diff
changeset
|
2583 | |
| 3136 | 2584 | /* |
|
3349
82d6463648fa
[gaim-migrate @ 3368]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3340
diff
changeset
|
2585 | * Add/update buddy's alias on server |
|
82d6463648fa
[gaim-migrate @ 3368]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3340
diff
changeset
|
2586 | * |
|
82d6463648fa
[gaim-migrate @ 3368]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3340
diff
changeset
|
2587 | * This is just a roster update using existing, local buddylist data |
|
82d6463648fa
[gaim-migrate @ 3368]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3340
diff
changeset
|
2588 | */ |
|
4269
c716bd9eee3c
[gaim-migrate @ 4520]
Mark Doliner <markdoliner@pidgin.im>
parents:
4249
diff
changeset
|
2589 | static void jabber_alias_buddy(struct gaim_connection *gc, const char *name, const char *alias) |
|
3349
82d6463648fa
[gaim-migrate @ 3368]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3340
diff
changeset
|
2590 | { |
|
4269
c716bd9eee3c
[gaim-migrate @ 4520]
Mark Doliner <markdoliner@pidgin.im>
parents:
4249
diff
changeset
|
2591 | jabber_roster_update(gc, name, alias, NULL); |
|
3349
82d6463648fa
[gaim-migrate @ 3368]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3340
diff
changeset
|
2592 | } |
|
82d6463648fa
[gaim-migrate @ 3368]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3340
diff
changeset
|
2593 | |
|
82d6463648fa
[gaim-migrate @ 3368]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3340
diff
changeset
|
2594 | /* |
| 3136 | 2595 | * Change buddy's group on server roster |
| 2596 | */ | |
| 3867 | 2597 | static void jabber_group_change(struct gaim_connection *gc, const char *name, const char *old_group, const char *new_group) |
| 3136 | 2598 | { |
|
3349
82d6463648fa
[gaim-migrate @ 3368]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3340
diff
changeset
|
2599 | if(old_group && new_group && strcmp(old_group, new_group)) |
|
82d6463648fa
[gaim-migrate @ 3368]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3340
diff
changeset
|
2600 | jabber_roster_update(gc, name, NULL, new_group); |
|
82d6463648fa
[gaim-migrate @ 3368]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3340
diff
changeset
|
2601 | } |
|
82d6463648fa
[gaim-migrate @ 3368]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3340
diff
changeset
|
2602 | |
|
82d6463648fa
[gaim-migrate @ 3368]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3340
diff
changeset
|
2603 | /* |
|
82d6463648fa
[gaim-migrate @ 3368]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3340
diff
changeset
|
2604 | * Group rename |
|
82d6463648fa
[gaim-migrate @ 3368]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3340
diff
changeset
|
2605 | * |
|
82d6463648fa
[gaim-migrate @ 3368]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3340
diff
changeset
|
2606 | * Jabber doesn't have "groups," per se. "Group" is simply a JID attribute. |
|
82d6463648fa
[gaim-migrate @ 3368]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3340
diff
changeset
|
2607 | * So we iterate through the list of buddies that are in the group and change |
|
82d6463648fa
[gaim-migrate @ 3368]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3340
diff
changeset
|
2608 | * the group attribute for each of them. |
|
82d6463648fa
[gaim-migrate @ 3368]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3340
diff
changeset
|
2609 | */ |
|
82d6463648fa
[gaim-migrate @ 3368]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3340
diff
changeset
|
2610 | static void jabber_rename_group(struct gaim_connection *gc, |
| 3867 | 2611 | const char *old_group, |
| 2612 | const char *new_group, | |
|
3349
82d6463648fa
[gaim-migrate @ 3368]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3340
diff
changeset
|
2613 | GList *members) |
|
82d6463648fa
[gaim-migrate @ 3368]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3340
diff
changeset
|
2614 | { |
|
82d6463648fa
[gaim-migrate @ 3368]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3340
diff
changeset
|
2615 | if(old_group && new_group && strcmp(old_group, new_group)) |
|
82d6463648fa
[gaim-migrate @ 3368]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3340
diff
changeset
|
2616 | while(members) { |
|
82d6463648fa
[gaim-migrate @ 3368]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3340
diff
changeset
|
2617 | jabber_group_change(gc, (char *)(members->data), old_group, new_group); |
|
82d6463648fa
[gaim-migrate @ 3368]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3340
diff
changeset
|
2618 | members = members->next; |
|
82d6463648fa
[gaim-migrate @ 3368]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3340
diff
changeset
|
2619 | } |
| 3136 | 2620 | } |
| 2621 | ||
| 3466 | 2622 | static void jabber_add_buddy(struct gaim_connection *gc, const char *name) |
| 2086 | 2623 | { |
| 3136 | 2624 | xmlnode x; |
| 2086 | 2625 | char *realwho; |
| 2956 | 2626 | gjconn gjc = ((struct jabber_data *)gc->proto_data)->gjc; |
| 3311 | 2627 | gaim_jid gjid; |
| 2086 | 2628 | |
| 2629 | if (!((struct jabber_data *)gc->proto_data)->did_import) | |
| 2630 | return; | |
| 2631 | ||
| 3311 | 2632 | /* |
| 2633 | * If there's no name or the name is ourself | |
| 2634 | */ | |
| 2635 | if(!name || !strcmp(gc->username, name)) | |
| 2086 | 2636 | return; |
| 2637 | ||
| 3311 | 2638 | if((realwho = get_realwho(gjc, name, FALSE, &gjid)) == NULL) { |
| 3427 | 2639 | char *msg = g_strdup_printf(_("The user %s is an invalid Jabber I.D. and was " |
| 2640 | "therefore not added."), name); | |
| 2641 | do_error_dialog("Unable to add buddy.", _("Jabber Error"), GAIM_ERROR); | |
| 3311 | 2642 | g_free(msg); |
| 2643 | jabber_remove_gaim_buddy(gc, name); | |
| 2644 | return; | |
| 2086 | 2645 | } |
| 2646 | ||
| 3311 | 2647 | /* FIXME: transport */ |
| 2648 | if(gjid->user == NULL) { | |
| 2649 | g_free(realwho); | |
| 2650 | gaim_jid_free(gjid); | |
| 2651 | return; | |
| 2652 | } | |
| 2653 | gaim_jid_free(gjid); | |
| 2654 | ||
| 2086 | 2655 | x = xmlnode_new_tag("presence"); |
| 2656 | xmlnode_put_attrib(x, "to", realwho); | |
| 2657 | xmlnode_put_attrib(x, "type", "subscribe"); | |
| 2956 | 2658 | gjab_send(((struct jabber_data *)gc->proto_data)->gjc, x); |
| 2659 | xmlnode_free(x); | |
| 2086 | 2660 | |
|
3349
82d6463648fa
[gaim-migrate @ 3368]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3340
diff
changeset
|
2661 | jabber_roster_update(gc, realwho, NULL, NULL); |
|
3105
8c23b0ec1036
[gaim-migrate @ 3119]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3074
diff
changeset
|
2662 | |
| 2086 | 2663 | g_free(realwho); |
| 2664 | } | |
| 2665 | ||
|
2681
73cd94b9e78e
[gaim-migrate @ 2694]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2635
diff
changeset
|
2666 | static void jabber_remove_buddy(struct gaim_connection *gc, char *name, char *group) |
| 2086 | 2667 | { |
| 3048 | 2668 | xmlnode x; |
| 2086 | 2669 | char *realwho; |
| 2956 | 2670 | gjconn gjc = ((struct jabber_data *)gc->proto_data)->gjc; |
| 2086 | 2671 | |
| 3311 | 2672 | if(!name || (realwho = get_realwho(gjc, name, FALSE, NULL)) == NULL) |
| 2086 | 2673 | return; |
| 2674 | ||
| 2956 | 2675 | x = xmlnode_new_tag("presence"); |
| 2676 | xmlnode_put_attrib(x, "to", realwho); | |
| 2677 | xmlnode_put_attrib(x, "type", "unsubscribe"); | |
| 2678 | gjab_send(((struct jabber_data *)gc->proto_data)->gjc, x); | |
| 2086 | 2679 | g_free(realwho); |
| 2680 | xmlnode_free(x); | |
| 2681 | } | |
| 2682 | ||
| 4916 | 2683 | #if 0 /* Faceprint! Look here! */ |
|
3314
12fa45677717
[gaim-migrate @ 3332]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3311
diff
changeset
|
2684 | /* |
|
12fa45677717
[gaim-migrate @ 3332]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3311
diff
changeset
|
2685 | * Remove a buddy item from the roster entirely |
|
12fa45677717
[gaim-migrate @ 3332]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3311
diff
changeset
|
2686 | */ |
|
12fa45677717
[gaim-migrate @ 3332]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3311
diff
changeset
|
2687 | static void jabber_remove_buddy_roster_item(struct gaim_connection *gc, char *name) |
|
12fa45677717
[gaim-migrate @ 3332]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3311
diff
changeset
|
2688 | { |
|
3340
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2689 | gjconn gjc = ((struct jabber_data *)gc->proto_data)->gjc; |
|
3314
12fa45677717
[gaim-migrate @ 3332]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3311
diff
changeset
|
2690 | char *realwho; |
|
3340
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2691 | |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2692 | if((realwho = get_realwho(gjc, name, FALSE, NULL)) != NULL) { |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2693 | xmlnode x = jutil_iqnew(JPACKET__SET, NS_ROSTER); |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2694 | xmlnode y = xmlnode_insert_tag(xmlnode_get_tag(x, "query"), "item"); |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2695 | xmlnode_put_attrib(y, "jid", realwho); |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2696 | xmlnode_put_attrib(y, "subscription", "remove"); |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2697 | gjab_send(((struct jabber_data *)gc->proto_data)->gjc, x); |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2698 | g_free(realwho); |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2699 | xmlnode_free(x); |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2700 | } |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2701 | } |
| 4916 | 2702 | #endif |
|
3340
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2703 | |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2704 | /* |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2705 | * Unsubscribe a buddy from our presence |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2706 | */ |
| 5136 | 2707 | static void jabber_unsubscribe_buddy_from_us(struct gaim_connection *gc, const char *name) |
|
3340
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2708 | { |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2709 | gjconn gjc = ((struct jabber_data *)gc->proto_data)->gjc; |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2710 | char *realwho; |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2711 | |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2712 | if((realwho = get_realwho(gjc, name, FALSE, NULL)) != NULL) { |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2713 | xmlnode g = xmlnode_new_tag("presence"); |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2714 | xmlnode_put_attrib(g, "to", realwho); |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2715 | xmlnode_put_attrib(g, "type", "unsubscribed"); |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2716 | gjab_send(gjc, g); |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2717 | xmlnode_free(g); |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2718 | } |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2719 | } |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2720 | |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2721 | /* |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2722 | * Common code for setting ourselves invisible/visible to buddy |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2723 | */ |
| 5136 | 2724 | static void jabber_invisible_to_buddy_common(struct gaim_connection *gc, const char *name, gboolean invisible) |
|
3340
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2725 | { |
|
3314
12fa45677717
[gaim-migrate @ 3332]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3311
diff
changeset
|
2726 | gjconn gjc = ((struct jabber_data *)gc->proto_data)->gjc; |
|
3340
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2727 | char *realwho; |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2728 | |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2729 | if((realwho = get_realwho(gjc, name, FALSE, NULL)) != NULL) { |
| 5135 | 2730 | struct jabber_buddy_data *jbd = jabber_find_buddy(gc, realwho, TRUE); |
|
3340
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2731 | xmlnode g = xmlnode_new_tag("presence"); |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2732 | |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2733 | xmlnode_put_attrib(g, "to", realwho); |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2734 | |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2735 | if(invisible) |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2736 | xmlnode_put_attrib(g, "type", "invisible"); |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2737 | |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2738 | gjab_send(gjc, g); |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2739 | |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2740 | g_free(realwho); |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2741 | xmlnode_free(g); |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2742 | |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2743 | if(jbd) { |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2744 | if(invisible) { |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2745 | jbd->invisible |= JABBER_BUD_INVIS; |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2746 | } else { |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2747 | jbd->invisible &= ~JABBER_BUD_INVIS; |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2748 | } |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2749 | } |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2750 | } |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2751 | } |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2752 | |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2753 | /* |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2754 | * Make ourselves temporarily invisible to a buddy |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2755 | */ |
| 5136 | 2756 | static void jabber_invisible_to_buddy(struct gaim_connection *gc, const char *name) |
|
3340
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2757 | { |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2758 | jabber_invisible_to_buddy_common(gc, name, TRUE); |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2759 | } |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2760 | |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2761 | /* |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2762 | * Make ourselves visible to a buddy |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2763 | */ |
| 5136 | 2764 | static void jabber_visible_to_buddy(struct gaim_connection *gc, const char *name) |
|
3340
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2765 | { |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2766 | jabber_invisible_to_buddy_common(gc, name, FALSE); |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2767 | } |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2768 | |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2769 | /* |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2770 | * Function used by the g_hash_table_foreach() in invisible_to_all_buddies() to |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2771 | * actually set the status. |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2772 | * |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2773 | * key is unused |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2774 | * value is the pointer to the jabber_buddy_data struct |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2775 | * data is gboolean: TRUE (invisible) or FALSE (not invisible) |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2776 | */ |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2777 | static void set_invisible_to_buddy_status(gpointer key, gpointer val, gpointer data) { |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2778 | struct jabber_buddy_data *jbd = val; |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2779 | gboolean invisible = (gboolean) data; |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2780 | |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2781 | if(jbd) { |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2782 | if(invisible) { |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2783 | jbd->invisible = JABBER_SERV_INVIS | JABBER_BUD_INVIS; |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2784 | } else { |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2785 | /* |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2786 | * If we've asserted server-level invisibility, cancelling |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2787 | * it removes explicit buddy invisibility settings too. |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2788 | */ |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2789 | if(jbd->invisible & JABBER_SERV_INVIS) |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2790 | jbd->invisible = JABBER_NOT_INVIS; |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2791 | } |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2792 | } |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2793 | } |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2794 | |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2795 | /* |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2796 | * Show we've set ourselves invisible/visible to all buddies on the server |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2797 | * |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2798 | * Used when we set server-wide invisibility so that individual buddy menu |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2799 | * entries show the proper option. |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2800 | */ |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2801 | static void invisible_to_all_buddies(struct gaim_connection *gc, gboolean invisible) |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2802 | { |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2803 | struct jabber_data *jd = gc->proto_data; |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2804 | |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2805 | if(jd->buddies != NULL) |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
2806 | g_hash_table_foreach(jd->buddies, set_invisible_to_buddy_status, (gpointer) invisible); |
|
3314
12fa45677717
[gaim-migrate @ 3332]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3311
diff
changeset
|
2807 | } |
|
12fa45677717
[gaim-migrate @ 3332]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3311
diff
changeset
|
2808 | |
| 4687 | 2809 | static const char *jabber_list_icon(struct gaim_account *a, struct buddy *b) |
| 2086 | 2810 | { |
| 4687 | 2811 | return "jabber"; |
| 2812 | } | |
| 4916 | 2813 | |
| 2814 | static void jabber_list_emblems(struct buddy *b, char **se, char **sw, char **nw, char **ne) | |
| 2815 | { | |
| 5135 | 2816 | struct jabber_buddy_data *jbd = jabber_find_buddy(b->account->gc, b->name, FALSE); |
| 2817 | ||
| 2818 | if(!GAIM_BUDDY_IS_ONLINE(b)) { | |
| 2819 | if (jbd && jbd->error_msg) | |
| 4927 | 2820 | *nw = "error"; |
| 5135 | 2821 | |
| 2822 | if(jbd && (jbd->subscription & JABBER_SUB_PENDING || | |
| 2823 | !(jbd->subscription & JABBER_SUB_TO))) | |
| 2824 | *se = "notauthorized"; | |
| 2825 | else | |
| 2826 | *se = "offline"; | |
| 2827 | ||
| 4916 | 2828 | } else { |
| 2829 | switch (b->uc) { | |
| 2830 | case UC_AWAY: | |
| 2831 | *se = "away"; | |
| 2832 | break; | |
| 2833 | case UC_CHAT: | |
| 2834 | *se = "chat"; | |
| 2835 | break; | |
| 2836 | case UC_XA: | |
| 2837 | *se = "extendedaway"; | |
| 2838 | break; | |
| 2839 | case UC_DND: | |
| 2840 | *se = "dnd"; | |
| 2841 | break; | |
| 2842 | case UC_ERROR: | |
| 2843 | *se = "error"; | |
| 2844 | break; | |
| 2845 | } | |
| 2086 | 2846 | } |
| 4916 | 2847 | } |
| 2086 | 2848 | |
|
2205
68c42ce8eba6
[gaim-migrate @ 2215]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2170
diff
changeset
|
2849 | static GList *jabber_chat_info(struct gaim_connection *gc) |
|
68c42ce8eba6
[gaim-migrate @ 2215]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2170
diff
changeset
|
2850 | { |
| 2956 | 2851 | gjconn gjc = ((struct jabber_data *)gc->proto_data)->gjc; |
| 2852 | ||
| 2853 | static char *confserv = NULL; /* this pointer must be persistent */ | |
| 2854 | gchar *server; | |
|
2205
68c42ce8eba6
[gaim-migrate @ 2215]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2170
diff
changeset
|
2855 | |
|
68c42ce8eba6
[gaim-migrate @ 2215]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2170
diff
changeset
|
2856 | GList *m = NULL; |
|
68c42ce8eba6
[gaim-migrate @ 2215]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2170
diff
changeset
|
2857 | struct proto_chat_entry *pce; |
|
68c42ce8eba6
[gaim-migrate @ 2215]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2170
diff
changeset
|
2858 | |
| 2956 | 2859 | /* This is a scientific wild-ass guess... |
| 2860 | * | |
| 2861 | * If there are more than two "components" to the current server name, | |
| 2862 | * lop-off the left-most component and replace with "conference." | |
| 2863 | */ | |
| 2864 | if(confserv != NULL) { | |
| 2865 | g_free(confserv); /* dispose of the old value */ | |
| 2866 | } | |
| 2867 | ||
| 2868 | if((server = g_strdup(gjc->user->server)) == NULL) { | |
| 2869 | confserv = g_strdup(DEFAULT_GROUPCHAT); | |
| 2870 | } else { | |
| 2871 | gchar **splits, **index; | |
| 2872 | gchar *tmp; | |
| 2873 | int cnt = 0; | |
| 2874 | ||
| 2875 | ||
| 2876 | index = splits = g_strsplit(server, ".", -1); /* split the connected server */ | |
| 2877 | ||
| 2878 | while(*(index++)) /* index to the end--counting the parts */ | |
| 2879 | ++cnt; | |
| 2880 | ||
| 2881 | /* | |
| 2882 | * If we've more than two parts, point to the second part. Else point | |
| 2883 | * to the start. | |
| 2884 | */ | |
| 2885 | if(cnt > 2) { | |
| 2886 | index -= cnt; | |
| 2887 | } else { | |
| 2888 | index = splits; | |
| 2889 | } | |
| 2890 | ||
| 2891 | /* Put it together */ | |
| 2892 | confserv = g_strjoin(".", "conference", (tmp = g_strjoinv(".", index)), NULL); | |
| 2893 | ||
| 2894 | g_free(server); /* we don't need this stuff no more */ | |
| 2895 | g_free(tmp); | |
| 2896 | g_strfreev(splits); | |
| 2897 | } | |
| 2898 | ||
|
2205
68c42ce8eba6
[gaim-migrate @ 2215]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2170
diff
changeset
|
2899 | pce = g_new0(struct proto_chat_entry, 1); |
|
68c42ce8eba6
[gaim-migrate @ 2215]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2170
diff
changeset
|
2900 | pce->label = _("Room:"); |
| 5234 | 2901 | pce->identifier = "room"; |
|
2205
68c42ce8eba6
[gaim-migrate @ 2215]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2170
diff
changeset
|
2902 | m = g_list_append(m, pce); |
|
68c42ce8eba6
[gaim-migrate @ 2215]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2170
diff
changeset
|
2903 | |
|
68c42ce8eba6
[gaim-migrate @ 2215]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2170
diff
changeset
|
2904 | pce = g_new0(struct proto_chat_entry, 1); |
|
68c42ce8eba6
[gaim-migrate @ 2215]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2170
diff
changeset
|
2905 | pce->label = _("Server:"); |
| 5234 | 2906 | pce->identifier = "server"; |
| 2956 | 2907 | pce->def = confserv; |
|
2205
68c42ce8eba6
[gaim-migrate @ 2215]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2170
diff
changeset
|
2908 | m = g_list_append(m, pce); |
|
68c42ce8eba6
[gaim-migrate @ 2215]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2170
diff
changeset
|
2909 | |
|
68c42ce8eba6
[gaim-migrate @ 2215]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2170
diff
changeset
|
2910 | pce = g_new0(struct proto_chat_entry, 1); |
|
68c42ce8eba6
[gaim-migrate @ 2215]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2170
diff
changeset
|
2911 | pce->label = _("Handle:"); |
| 5234 | 2912 | pce->identifier = "handle"; |
| 2956 | 2913 | pce->def = gjc->user->user; |
|
2205
68c42ce8eba6
[gaim-migrate @ 2215]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2170
diff
changeset
|
2914 | m = g_list_append(m, pce); |
|
68c42ce8eba6
[gaim-migrate @ 2215]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2170
diff
changeset
|
2915 | |
|
68c42ce8eba6
[gaim-migrate @ 2215]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2170
diff
changeset
|
2916 | return m; |
|
68c42ce8eba6
[gaim-migrate @ 2215]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2170
diff
changeset
|
2917 | } |
|
68c42ce8eba6
[gaim-migrate @ 2215]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2170
diff
changeset
|
2918 | |
| 5234 | 2919 | static void jabber_join_chat(struct gaim_connection *gc, GHashTable *data) |
| 2086 | 2920 | { |
| 2921 | xmlnode x; | |
| 5234 | 2922 | char *room, *server, *handle; |
| 2086 | 2923 | char *realwho; |
| 2956 | 2924 | gjconn gjc = ((struct jabber_data *)gc->proto_data)->gjc; |
| 2925 | GSList *jcs = ((struct jabber_data *)gc->proto_data)->chats; | |
| 2086 | 2926 | struct jabber_chat *jc; |
| 3311 | 2927 | gaim_jid gjid; |
| 2086 | 2928 | |
| 5234 | 2929 | room = g_hash_table_lookup(data, "room"); |
| 2930 | server = g_hash_table_lookup(data, "server"); | |
| 2931 | handle = g_hash_table_lookup(data, "handle"); | |
| 2932 | ||
| 2933 | if (!room || !server || !handle) | |
| 2086 | 2934 | return; |
| 2935 | ||
| 5234 | 2936 | realwho = create_valid_jid(room, server, handle); |
| 2937 | gaim_debug(GAIM_DEBUG_INFO, "jabber", "%s\n", realwho); | |
| 2086 | 2938 | |
| 3311 | 2939 | if((gjid = gaim_jid_new(realwho)) == NULL) { |
| 3427 | 2940 | char *msg = g_strdup_printf("The Jabber I.D. %s is invalid.", realwho); |
| 2941 | do_error_dialog(_("Unable to join chat"), msg, GAIM_ERROR); | |
|
3236
1507dc2b5719
[gaim-migrate @ 3253]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3234
diff
changeset
|
2942 | g_free(msg); |
| 3311 | 2943 | g_free(realwho); |
|
3236
1507dc2b5719
[gaim-migrate @ 3253]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3234
diff
changeset
|
2944 | return; |
|
1507dc2b5719
[gaim-migrate @ 3253]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3234
diff
changeset
|
2945 | } |
| 2956 | 2946 | |
| 3311 | 2947 | if((jc = find_any_chat(gc, gjid)) != NULL) { |
| 2956 | 2948 | switch(jc->state) { |
| 2949 | case JCS_PENDING: | |
|
5223
4ea16d1f5cd1
[gaim-migrate @ 5593]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
2950 | gaim_debug(GAIM_DEBUG_INFO, "jabber", |
|
4ea16d1f5cd1
[gaim-migrate @ 5593]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
2951 | "attempt to re-join already pending Jabber chat! (ignoring)\n"); |
| 2956 | 2952 | g_free(realwho); /* yuck! */ |
| 3311 | 2953 | gaim_jid_free(gjid); |
| 2956 | 2954 | return; |
| 2955 | case JCS_ACTIVE: | |
|
5223
4ea16d1f5cd1
[gaim-migrate @ 5593]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
2956 | gaim_debug(GAIM_DEBUG_INFO, "jabber", |
|
4ea16d1f5cd1
[gaim-migrate @ 5593]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
2957 | "attempt to re-join already active Jabber chat! (ignoring)\n"); |
| 2956 | 2958 | g_free(realwho); /* yuck! */ |
| 3311 | 2959 | gaim_jid_free(gjid); |
| 2956 | 2960 | return; |
| 2961 | case JCS_CLOSED: | |
|
5223
4ea16d1f5cd1
[gaim-migrate @ 5593]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
2962 | gaim_debug(GAIM_DEBUG_INFO, "jabber", |
|
4ea16d1f5cd1
[gaim-migrate @ 5593]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
2963 | "rejoining previously closed Jabber chat\n"); |
| 2956 | 2964 | break; |
| 2965 | default: | |
|
5223
4ea16d1f5cd1
[gaim-migrate @ 5593]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
2966 | gaim_debug(GAIM_DEBUG_INFO, "jabber", |
|
4ea16d1f5cd1
[gaim-migrate @ 5593]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
2967 | "found Jabber chat in unknown state! (ignoring)\n"); |
| 2956 | 2968 | g_free(realwho); /* yuck! */ |
| 3311 | 2969 | gaim_jid_free(gjid); |
| 2956 | 2970 | return; |
| 2971 | } | |
| 2972 | } else { | |
|
5223
4ea16d1f5cd1
[gaim-migrate @ 5593]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
2973 | gaim_debug(GAIM_DEBUG_INFO, "jabber", |
|
4ea16d1f5cd1
[gaim-migrate @ 5593]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
2974 | "joining completely new Jabber chat\n"); |
| 2956 | 2975 | jc = g_new0(struct jabber_chat, 1); |
| 3311 | 2976 | jc->gjid = gjid; |
| 2956 | 2977 | jc->gc = gc; |
| 2978 | ((struct jabber_data *)gc->proto_data)->chats = g_slist_append(jcs, jc); | |
| 4687 | 2979 | // add_buddy(gc->account, _("Chats"), realwho, realwho); |
| 2956 | 2980 | } |
| 2981 | ||
| 2982 | jc->state = JCS_PENDING; | |
| 2983 | ||
| 2086 | 2984 | x = jutil_presnew(0, realwho, NULL); |
| 2956 | 2985 | gjab_send(gjc, x); |
| 2086 | 2986 | xmlnode_free(x); |
| 2987 | g_free(realwho); | |
| 2988 | } | |
| 2989 | ||
| 3466 | 2990 | static void jabber_chat_invite(struct gaim_connection *gc, int id, const char *message, const char *name) |
| 2086 | 2991 | { |
| 2992 | xmlnode x, y; | |
| 2993 | struct jabber_data *jd = gc->proto_data; | |
| 2956 | 2994 | gjconn gjc = jd->gjc; |
|
2205
68c42ce8eba6
[gaim-migrate @ 2215]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2170
diff
changeset
|
2995 | struct jabber_chat *jc = NULL; |
| 2086 | 2996 | char *realwho, *subject; |
| 2997 | ||
| 3311 | 2998 | if(!name || (realwho = get_realwho(gjc, name, FALSE, NULL)) == NULL) |
| 2086 | 2999 | return; |
| 3000 | ||
| 3001 | /* find which chat we're inviting to */ | |
| 2956 | 3002 | if(jabber_find_chat_by_convo_id(gc, id, &jc) != 0) |
| 2086 | 3003 | return; |
| 3004 | ||
| 3005 | x = xmlnode_new_tag("message"); | |
| 3006 | xmlnode_put_attrib(x, "to", realwho); | |
| 3311 | 3007 | |
| 2086 | 3008 | g_free(realwho); |
| 3009 | ||
| 3010 | y = xmlnode_insert_tag(x, "x"); | |
| 3011 | xmlnode_put_attrib(y, "xmlns", "jabber:x:conference"); | |
| 3311 | 3012 | subject = g_strdup_printf("%s@%s", jc->gjid->user, jc->gjid->server); |
| 2086 | 3013 | xmlnode_put_attrib(y, "jid", subject); |
| 3014 | g_free(subject); | |
| 3015 | ||
| 3016 | if (message && strlen(message)) { | |
| 5093 | 3017 | insert_message(x, message, FALSE); |
| 2086 | 3018 | } |
| 3019 | ||
| 2956 | 3020 | gjab_send(((struct jabber_data *)gc->proto_data)->gjc, x); |
| 2086 | 3021 | xmlnode_free(x); |
| 3022 | } | |
| 3023 | ||
| 3024 | static void jabber_chat_leave(struct gaim_connection *gc, int id) | |
| 3025 | { | |
| 3026 | struct jabber_data *jd = gc->proto_data; | |
| 2956 | 3027 | gjconn gjc = jd->gjc; |
|
2205
68c42ce8eba6
[gaim-migrate @ 2215]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2170
diff
changeset
|
3028 | struct jabber_chat *jc = NULL; |
| 3311 | 3029 | char *chatname; |
| 2086 | 3030 | xmlnode x; |
| 3031 | ||
| 2956 | 3032 | /* Find out which chat we're leaving */ |
| 3033 | if(jabber_find_chat_by_convo_id(gc, id, &jc) != 0) | |
| 2086 | 3034 | return; |
| 3035 | ||
| 3311 | 3036 | chatname = g_strdup_printf("%s@%s", jc->gjid->user, jc->gjid->server); |
| 3037 | x = jutil_presnew(0, chatname, NULL); | |
| 3038 | g_free(chatname); | |
| 2086 | 3039 | xmlnode_put_attrib(x, "type", "unavailable"); |
| 2956 | 3040 | gjab_send(gjc, x); |
| 2086 | 3041 | xmlnode_free(x); |
| 3042 | jc->b = NULL; | |
| 3043 | } | |
| 3044 | ||
|
2167
cbb558585911
[gaim-migrate @ 2177]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2162
diff
changeset
|
3045 | static int jabber_chat_send(struct gaim_connection *gc, int id, char *message) |
| 2086 | 3046 | { |
| 3047 | xmlnode x, y; | |
|
2205
68c42ce8eba6
[gaim-migrate @ 2215]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2170
diff
changeset
|
3048 | struct jabber_chat *jc = NULL; |
| 2086 | 3049 | char *chatname; |
| 2956 | 3050 | int retval = 0; |
| 3051 | ||
| 3052 | /* Find out which chat we're sending to */ | |
| 3053 | if((retval = jabber_find_chat_by_convo_id(gc, id, &jc)) != 0) | |
| 3054 | return(retval); | |
| 2086 | 3055 | |
| 3056 | x = xmlnode_new_tag("message"); | |
| 3311 | 3057 | xmlnode_put_attrib(x, "from", jc->gjid->full); |
| 3058 | chatname = g_strdup_printf("%s@%s", jc->gjid->user, jc->gjid->server); | |
| 2086 | 3059 | xmlnode_put_attrib(x, "to", chatname); |
| 3060 | g_free(chatname); | |
| 3061 | xmlnode_put_attrib(x, "type", "groupchat"); | |
| 3062 | ||
|
2289
0af7cf95a25d
[gaim-migrate @ 2299]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2278
diff
changeset
|
3063 | if (message && strlen(message) > strlen("/topic ") && |
| 4793 | 3064 | !g_ascii_strncasecmp(message, "/topic ", strlen("/topic "))) { |
|
2289
0af7cf95a25d
[gaim-migrate @ 2299]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2278
diff
changeset
|
3065 | char buf[8192]; |
|
0af7cf95a25d
[gaim-migrate @ 2299]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2278
diff
changeset
|
3066 | y = xmlnode_insert_tag(x, "subject"); |
| 3642 | 3067 | xmlnode_insert_cdata(y, message + strlen("/topic "), -1); |
|
2289
0af7cf95a25d
[gaim-migrate @ 2299]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2278
diff
changeset
|
3068 | y = xmlnode_insert_tag(x, "body"); |
| 3642 | 3069 | g_snprintf(buf, sizeof(buf), "/me has changed the subject to: %s", message + strlen("/topic")); |
|
2289
0af7cf95a25d
[gaim-migrate @ 2299]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2278
diff
changeset
|
3070 | xmlnode_insert_cdata(y, buf, -1); |
|
0af7cf95a25d
[gaim-migrate @ 2299]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2278
diff
changeset
|
3071 | } else if (message && strlen(message)) { |
| 5093 | 3072 | insert_message(x, message, FALSE); |
| 2086 | 3073 | } |
| 3074 | ||
| 2956 | 3075 | gjab_send(((struct jabber_data *)gc->proto_data)->gjc, x); |
| 2086 | 3076 | xmlnode_free(x); |
|
2167
cbb558585911
[gaim-migrate @ 2177]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2162
diff
changeset
|
3077 | return 0; |
| 2086 | 3078 | } |
| 3079 | ||
| 3080 | static void jabber_chat_whisper(struct gaim_connection *gc, int id, char *who, char *message) | |
| 3081 | { | |
| 5093 | 3082 | xmlnode x; |
|
2205
68c42ce8eba6
[gaim-migrate @ 2215]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2170
diff
changeset
|
3083 | struct jabber_chat *jc = NULL; |
| 2086 | 3084 | char *chatname; |
| 3085 | ||
| 2956 | 3086 | /* Find out which chat we're whispering to */ |
| 3087 | if(jabber_find_chat_by_convo_id(gc, id, &jc) != 0) | |
| 2086 | 3088 | return; |
| 3089 | ||
| 3090 | x = xmlnode_new_tag("message"); | |
| 3311 | 3091 | xmlnode_put_attrib(x, "from", jc->gjid->full); |
| 3092 | chatname = g_strdup_printf("%s@%s/%s", jc->gjid->user, jc->gjid->server, who); | |
| 2086 | 3093 | xmlnode_put_attrib(x, "to", chatname); |
| 3094 | g_free(chatname); | |
| 3095 | xmlnode_put_attrib(x, "type", "normal"); | |
| 3096 | ||
| 3097 | if (message && strlen(message)) { | |
| 5093 | 3098 | insert_message(x, message, FALSE); |
| 2086 | 3099 | } |
| 3100 | ||
| 2956 | 3101 | gjab_send(((struct jabber_data *)gc->proto_data)->gjc, x); |
| 2086 | 3102 | xmlnode_free(x); |
| 3103 | } | |
| 3104 | ||
| 3105 | static char *jabber_normalize(const char *s) | |
| 3106 | { | |
| 3107 | static char buf[BUF_LEN]; | |
| 3108 | char *t, *u; | |
| 3109 | int x = 0; | |
| 3110 | ||
| 3111 | g_return_val_if_fail((s != NULL), NULL); | |
| 3112 | ||
| 2956 | 3113 | /* Somebody called us with s == NULL once... */ |
| 3114 | if(s == NULL) { | |
| 3115 | return(NULL); | |
| 3116 | } else { | |
| 4793 | 3117 | u = t = g_utf8_strdown(s, -1); |
| 2956 | 3118 | |
| 3119 | while (*t && (x < BUF_LEN - 1)) { | |
| 3120 | if (*t != ' ') | |
| 3121 | buf[x++] = *t; | |
| 3122 | t++; | |
| 3123 | } | |
| 3124 | buf[x] = '\0'; | |
| 3125 | g_free(u); | |
| 3126 | ||
| 3127 | if (!strchr(buf, '@')) { | |
| 4927 | 3128 | strcat(buf, "@" DEFAULT_SERVER); /* this isn't always right, but eh */ |
| 2956 | 3129 | } else if ((u = strchr(strchr(buf, '@'), '/')) != NULL) { |
| 3130 | *u = '\0'; | |
| 3131 | } | |
| 3132 | ||
| 3133 | return buf; | |
| 2086 | 3134 | } |
| 3135 | } | |
| 3136 | ||
| 5136 | 3137 | static void jabber_get_info(struct gaim_connection *gc, const char *who) { |
| 2086 | 3138 | xmlnode x; |
| 3139 | char *id; | |
| 2956 | 3140 | char *realwho; |
| 2086 | 3141 | struct jabber_data *jd = gc->proto_data; |
| 2956 | 3142 | gjconn gjc = jd->gjc; |
| 2086 | 3143 | |
| 3311 | 3144 | if((realwho = get_realwho(gjc, who, TRUE, NULL)) == NULL) |
| 3145 | return; | |
| 3146 | ||
| 2086 | 3147 | x = jutil_iqnew(JPACKET__GET, NS_VCARD); |
| 2956 | 3148 | xmlnode_put_attrib(x, "to", realwho); |
| 3311 | 3149 | |
| 2956 | 3150 | g_free(realwho); |
| 3151 | ||
| 3152 | id = gjab_getid(gjc); | |
| 2086 | 3153 | xmlnode_put_attrib(x, "id", id); |
| 3154 | ||
| 2956 | 3155 | g_hash_table_insert(jd->gjc->queries, g_strdup(id), g_strdup("vCard")); |
| 3156 | ||
| 3157 | gjab_send(gjc, x); | |
| 2086 | 3158 | |
| 3159 | xmlnode_free(x); | |
| 3311 | 3160 | } |
| 3161 | ||
| 5136 | 3162 | static void jabber_get_error_msg(struct gaim_connection *gc, const char *who) { |
| 3311 | 3163 | struct jabber_data *jd = gc->proto_data; |
| 3164 | gjconn gjc = jd->gjc; | |
| 3165 | gchar **str_arr = (gchar **) g_new(gpointer, 3); | |
| 3166 | gchar **ap = str_arr; | |
| 3167 | gchar *realwho, *final; | |
| 3168 | struct jabber_buddy_data *jbd; | |
| 3169 | ||
| 3170 | if((realwho = get_realwho(gjc, who, FALSE, NULL)) == NULL) { | |
| 3171 | g_strfreev(str_arr); | |
| 3172 | return; | |
| 3173 | } | |
| 3174 | ||
| 5135 | 3175 | jbd = jabber_find_buddy(gc, realwho, TRUE); |
| 3311 | 3176 | |
| 3177 | *ap++ = g_strdup_printf("<B>Jabber ID:</B> %s<BR>\n", realwho); | |
| 3178 | *ap++ = g_strdup_printf("<B>Error:</B> %s<BR>\n", jbd->error_msg); | |
| 3179 | *ap = NULL; | |
| 3770 | 3180 | |
| 3311 | 3181 | final= g_strjoinv(NULL, str_arr); |
| 3770 | 3182 | |
| 3311 | 3183 | g_strfreev(str_arr); |
| 3184 | ||
| 3185 | g_show_info_text(gc, realwho, 2, final, NULL); | |
| 3186 | g_free(realwho); | |
| 3187 | g_free(final); | |
| 2086 | 3188 | } |
| 3189 | ||
| 5136 | 3190 | static void jabber_get_away_msg(struct gaim_connection *gc, const char *who) { |
| 2956 | 3191 | struct jabber_data *jd = gc->proto_data; |
| 3192 | gjconn gjc = jd->gjc; | |
| 3311 | 3193 | int num_resources; |
| 3194 | gaim_jid gjid; | |
| 3195 | char *buddy = get_realwho(gjc, who, FALSE, &gjid); | |
| 5135 | 3196 | struct jabber_buddy_data *jbd = jabber_find_buddy(gc, buddy, TRUE); |
| 3311 | 3197 | gchar **str_arr; |
| 3198 | gchar **ap; | |
| 3199 | gchar *realwho, *final; | |
| 3200 | GSList *resources; | |
| 3201 | int i; | |
| 3202 | ||
| 3203 | if(!buddy) | |
| 3204 | return; | |
| 3205 | ||
| 3206 | if(!gjid->resource) { | |
| 3207 | num_resources = g_slist_length(jbd->resources); | |
| 3208 | resources = jbd->resources; | |
| 3209 | } else { | |
| 3210 | num_resources = 1; | |
| 3211 | resources = jbd->resources; | |
| 3212 | while(strcasecmp(((jab_res_info)resources->data)->name, gjid->resource)) | |
| 3213 | resources = resources->next; | |
| 3214 | } | |
| 3215 | ||
| 3216 | gaim_jid_free(gjid); | |
| 2956 | 3217 | |
| 3218 | /* space for all elements: Jabber I.D. + "status" + NULL (list terminator) */ | |
| 3311 | 3219 | str_arr = (gchar **) g_new(gpointer, num_resources*2 + 1); |
| 3220 | ap = str_arr; | |
| 3221 | ||
| 3222 | for(i=0; i<num_resources; i++) | |
| 3223 | { | |
| 3224 | jab_res_info jri = resources->data; | |
| 4450 | 3225 | char *status; |
| 3311 | 3226 | realwho = g_strdup_printf("%s/%s", buddy, jri->name); |
| 4450 | 3227 | status = strdup_withhtml(jabber_lookup_away(gjc, realwho)); |
| 3311 | 3228 | *ap++ = g_strdup_printf("<B>Jabber ID:</B> %s<BR>\n", realwho); |
| 4745 | 3229 | *ap++ = g_strdup_printf("<B>Status:</B> %s%s%s<BR>\n", jabber_get_state_string(jri->state), status ? ": " : "", status ? status : ""); |
| 4450 | 3230 | g_free(status); |
| 3311 | 3231 | g_free(realwho); |
| 3232 | resources = resources->next; | |
| 2956 | 3233 | } |
| 3234 | ||
| 3235 | *ap = NULL; | |
| 3770 | 3236 | |
| 3311 | 3237 | g_free(buddy); |
| 2956 | 3238 | |
| 3239 | final= g_strjoinv(NULL, str_arr); | |
| 3240 | g_strfreev(str_arr); | |
| 3241 | ||
| 3311 | 3242 | g_show_info_text(gc, who, 2, final, NULL); |
| 2956 | 3243 | g_free(final); |
| 3770 | 3244 | |
| 2956 | 3245 | } |
| 3246 | ||
| 3247 | static void jabber_get_cb_info(struct gaim_connection *gc, int cid, char *who) { | |
| 3248 | struct jabber_chat *jc = NULL; | |
| 3249 | char *realwho; | |
| 3250 | ||
| 3251 | /* Find out which chat */ | |
| 3252 | if(jabber_find_chat_by_convo_id(gc, cid, &jc) != 0) | |
| 3253 | return; | |
| 3254 | ||
| 3311 | 3255 | realwho = g_strdup_printf("%s@%s/%s", jc->gjid->user, jc->gjid->server, who); |
| 2956 | 3256 | |
| 3257 | jabber_get_info(gc, realwho); | |
| 3258 | g_free(realwho); | |
| 3259 | } | |
| 3260 | ||
| 3261 | static void jabber_get_cb_away_msg(struct gaim_connection *gc, int cid, char *who) { | |
| 3262 | struct jabber_chat *jc = NULL; | |
| 3263 | char *realwho; | |
| 3264 | ||
| 3265 | /* Find out which chat */ | |
| 3266 | if(jabber_find_chat_by_convo_id(gc, cid, &jc) != 0) | |
| 3267 | return; | |
| 3268 | ||
| 3311 | 3269 | realwho = g_strdup_printf("%s@%s/%s", jc->gjid->user, jc->gjid->server, who); |
| 2956 | 3270 | |
| 3271 | jabber_get_away_msg(gc, realwho); | |
| 3272 | g_free(realwho); | |
| 3273 | ||
| 3274 | } | |
| 3275 | ||
| 4744 | 3276 | static char *jabber_tooltip_text(struct buddy *b) |
| 3277 | { | |
| 5135 | 3278 | struct jabber_buddy_data *jbd = jabber_find_buddy(b->account->gc, b->name, FALSE); |
| 4745 | 3279 | jab_res_info jri = jabber_find_resource(b->account->gc, b->name); |
| 5135 | 3280 | char *ret = NULL; |
| 4745 | 3281 | if(jri) { |
| 4777 | 3282 | char *stripped = strip_html(jabber_lookup_away(GC_GJ(b->account->gc), |
| 4745 | 3283 | b->name)); |
| 4777 | 3284 | char *text = NULL; |
| 3285 | if(stripped) | |
| 3286 | text = g_markup_escape_text(stripped, strlen(stripped)); | |
| 3287 | ret = g_strdup_printf(_("<b>Status:</b> %s%s%s"), | |
| 4745 | 3288 | jabber_get_state_string(jri->state), text ? ": " : "", |
| 3289 | text ? text : ""); | |
| 3290 | ||
| 4777 | 3291 | if(stripped) { |
| 3292 | g_free(stripped); | |
| 4745 | 3293 | g_free(text); |
| 4777 | 3294 | } |
| 5136 | 3295 | } else if(jbd && !GAIM_BUDDY_IS_ONLINE(b) && |
| 3296 | (jbd->subscription & JABBER_SUB_PENDING || | |
| 5135 | 3297 | !(jbd->subscription & JABBER_SUB_TO))) { |
| 3298 | ret = g_strdup(_("<b>Status:</b> Not Authorized")); | |
| 4745 | 3299 | } |
| 5135 | 3300 | return ret; |
| 4744 | 3301 | } |
| 3302 | ||
| 4732 | 3303 | static char *jabber_status_text(struct buddy *b) |
| 3304 | { | |
| 5135 | 3305 | struct jabber_buddy_data *jbd = jabber_find_buddy(b->account->gc, b->name, FALSE); |
| 3306 | char *ret = NULL; | |
| 4732 | 3307 | if (b->uc & UC_UNAVAILABLE) { |
| 4777 | 3308 | char *stripped = strip_html(jabber_lookup_away(GC_GJ(b->account->gc), |
| 4745 | 3309 | b->name)); |
| 4777 | 3310 | if(!stripped) { |
| 4745 | 3311 | jab_res_info jri = jabber_find_resource(b->account->gc, b->name); |
| 3312 | if(jri) | |
| 4777 | 3313 | stripped = g_strdup(jabber_get_state_string(jri->state)); |
| 4745 | 3314 | } |
| 4777 | 3315 | ret = g_markup_escape_text(stripped, strlen(stripped)); |
| 3316 | g_free(stripped); | |
| 5136 | 3317 | } else if(jbd && !GAIM_BUDDY_IS_ONLINE(b) && |
| 3318 | (jbd->subscription & JABBER_SUB_PENDING || | |
| 5135 | 3319 | !(jbd->subscription & JABBER_SUB_TO))) { |
| 3320 | ret = g_strdup(_("Not Authorized")); | |
| 4732 | 3321 | } |
| 5135 | 3322 | return ret; |
| 4732 | 3323 | } |
| 3324 | ||
| 5136 | 3325 | static GList *jabber_buddy_menu(struct gaim_connection *gc, const char *who) { |
|
2170
5c93594ff522
[gaim-migrate @ 2180]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
3326 | GList *m = NULL; |
|
5c93594ff522
[gaim-migrate @ 2180]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
3327 | struct proto_buddy_menu *pbm; |
| 4687 | 3328 | struct buddy *b = gaim_find_buddy(gc->account, who); |
| 3311 | 3329 | |
| 3330 | if(b->uc == UC_ERROR) | |
| 3331 | { | |
| 3332 | pbm = g_new0(struct proto_buddy_menu, 1); | |
| 3333 | pbm->label = _("View Error Msg"); | |
| 3334 | pbm->callback = jabber_get_error_msg; | |
| 3335 | pbm->gc = gc; | |
| 3336 | m = g_list_append(m, pbm); | |
| 3337 | } else { | |
|
3340
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
3338 | gjconn gjc = ((struct jabber_data *)gc->proto_data)->gjc; |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
3339 | char *realwho = get_realwho(gjc, who, FALSE, NULL); |
| 5135 | 3340 | struct jabber_buddy_data *jbd = jabber_find_buddy(gc, realwho, FALSE); |
|
3340
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
3341 | |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
3342 | g_free(realwho); |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
3343 | |
| 3311 | 3344 | pbm = g_new0(struct proto_buddy_menu, 1); |
| 3345 | pbm->label = _("Get Away Msg"); | |
| 3346 | pbm->callback = jabber_get_away_msg; | |
| 3347 | pbm->gc = gc; | |
| 3348 | m = g_list_append(m, pbm); | |
|
3340
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
3349 | |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
3350 | pbm = g_new0(struct proto_buddy_menu, 1); |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
3351 | if(jbd && (jbd->invisible & JABBER_BUD_INVIS)) { |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
3352 | pbm->label = _("Un-hide From"); |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
3353 | pbm->callback = jabber_visible_to_buddy; |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
3354 | } else { |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
3355 | pbm->label = _("Temporarily Hide From"); |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
3356 | pbm->callback = jabber_invisible_to_buddy; |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
3357 | } |
| 4916 | 3358 | |
| 3359 | pbm->gc = gc; | |
| 3360 | m = g_list_append(m, pbm); | |
| 3361 | pbm = g_new0(struct proto_buddy_menu, 1); | |
| 3362 | pbm->label = _("Cancel Presence Notification"); | |
| 3363 | pbm->callback = jabber_unsubscribe_buddy_from_us; | |
|
3340
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
3364 | pbm->gc = gc; |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
3365 | m = g_list_append(m, pbm); |
| 5136 | 3366 | |
| 3367 | if(jbd && !GAIM_BUDDY_IS_ONLINE(b) && | |
| 3368 | !(jbd->subscription & JABBER_SUB_TO)) { | |
| 3369 | pbm = g_new0(struct proto_buddy_menu, 1); | |
| 3370 | pbm->label = _("Re-request authorization"); | |
| 3371 | pbm->callback = jabber_add_buddy; | |
| 3372 | pbm->gc = gc; | |
| 3373 | m = g_list_append(m, pbm); | |
| 3374 | } | |
| 3311 | 3375 | } |
|
2170
5c93594ff522
[gaim-migrate @ 2180]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
3376 | |
|
5c93594ff522
[gaim-migrate @ 2180]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
3377 | return m; |
| 2086 | 3378 | } |
| 3379 | ||
|
2501
5e1fa4926c93
[gaim-migrate @ 2514]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2382
diff
changeset
|
3380 | static GList *jabber_away_states(struct gaim_connection *gc) { |
| 2086 | 3381 | GList *m = NULL; |
| 3382 | ||
| 4982 | 3383 | m = g_list_append(m, _("Online")); |
| 3384 | m = g_list_append(m, _("Chatty")); | |
| 3385 | m = g_list_append(m, _("Away")); | |
| 3386 | m = g_list_append(m, _("Extended Away")); | |
| 3387 | m = g_list_append(m, _("Do Not Disturb")); | |
| 3388 | m = g_list_append(m, _("Invisible")); | |
|
4110
481c7ea9e258
[gaim-migrate @ 4325]
Robert McQueen <robot101@debian.org>
parents:
4074
diff
changeset
|
3389 | m = g_list_append(m, GAIM_AWAY_CUSTOM); |
| 2086 | 3390 | |
| 3391 | return m; | |
| 3392 | } | |
| 3393 | ||
| 3394 | static void jabber_set_away(struct gaim_connection *gc, char *state, char *message) | |
| 3395 | { | |
| 3396 | xmlnode x, y; | |
| 3397 | struct jabber_data *jd = gc->proto_data; | |
| 2956 | 3398 | gjconn gjc = jd->gjc; |
| 3311 | 3399 | GSList *jcs; |
| 3400 | struct jabber_chat *jc; | |
| 3401 | char *chatname; | |
|
3340
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
3402 | gboolean invisible = FALSE; |
| 2086 | 3403 | |
|
4111
93b27900416e
[gaim-migrate @ 4326]
Robert McQueen <robot101@debian.org>
parents:
4110
diff
changeset
|
3404 | if (gc->away) { |
|
93b27900416e
[gaim-migrate @ 4326]
Robert McQueen <robot101@debian.org>
parents:
4110
diff
changeset
|
3405 | g_free(gc->away); |
|
93b27900416e
[gaim-migrate @ 4326]
Robert McQueen <robot101@debian.org>
parents:
4110
diff
changeset
|
3406 | gc->away = NULL; |
|
93b27900416e
[gaim-migrate @ 4326]
Robert McQueen <robot101@debian.org>
parents:
4110
diff
changeset
|
3407 | } |
| 2086 | 3408 | |
| 3409 | x = xmlnode_new_tag("presence"); | |
| 3410 | ||
| 3411 | if (!strcmp(state, GAIM_AWAY_CUSTOM)) { | |
| 3412 | /* oh goody. Gaim is telling us what to do. */ | |
| 3413 | if (message) { | |
| 3414 | /* Gaim wants us to be away */ | |
| 5174 | 3415 | char *stripped; |
| 3416 | ||
| 3417 | /* Jabber supports XHTML in IMs, but not in away messages. */ | |
| 3418 | html_to_xhtml(message, NULL, &stripped); | |
| 3419 | ||
| 2086 | 3420 | y = xmlnode_insert_tag(x, "show"); |
| 3421 | xmlnode_insert_cdata(y, "away", -1); | |
| 3422 | y = xmlnode_insert_tag(x, "status"); | |
| 5174 | 3423 | xmlnode_insert_cdata(y, stripped, -1); |
| 3424 | ||
| 3425 | gc->away = g_strdup(stripped); | |
| 3426 | g_free(stripped); | |
| 2086 | 3427 | } else { |
| 3428 | /* Gaim wants us to not be away */ | |
| 3429 | /* but for Jabber, we can just send presence with no other information. */ | |
| 3430 | } | |
| 3431 | } else { | |
| 3432 | /* state is one of our own strings. it won't be NULL. */ | |
| 4982 | 3433 | if (!strcmp(state, _("Online"))) { |
| 2086 | 3434 | /* once again, we don't have to put anything here */ |
| 4982 | 3435 | } else if (!strcmp(state, _("Chatty"))) { |
| 2086 | 3436 | y = xmlnode_insert_tag(x, "show"); |
| 3437 | xmlnode_insert_cdata(y, "chat", -1); | |
|
4111
93b27900416e
[gaim-migrate @ 4326]
Robert McQueen <robot101@debian.org>
parents:
4110
diff
changeset
|
3438 | gc->away = g_strdup(""); |
| 4982 | 3439 | } else if (!strcmp(state, _("Away"))) { |
| 2086 | 3440 | y = xmlnode_insert_tag(x, "show"); |
| 3441 | xmlnode_insert_cdata(y, "away", -1); | |
|
4111
93b27900416e
[gaim-migrate @ 4326]
Robert McQueen <robot101@debian.org>
parents:
4110
diff
changeset
|
3442 | gc->away = g_strdup(""); |
| 4982 | 3443 | } else if (!strcmp(state, _("Extended Away"))) { |
| 2086 | 3444 | y = xmlnode_insert_tag(x, "show"); |
| 3445 | xmlnode_insert_cdata(y, "xa", -1); | |
|
4111
93b27900416e
[gaim-migrate @ 4326]
Robert McQueen <robot101@debian.org>
parents:
4110
diff
changeset
|
3446 | gc->away = g_strdup(""); |
| 4982 | 3447 | } else if (!strcmp(state, _("Do Not Disturb"))) { |
| 2086 | 3448 | y = xmlnode_insert_tag(x, "show"); |
| 3449 | xmlnode_insert_cdata(y, "dnd", -1); | |
|
4111
93b27900416e
[gaim-migrate @ 4326]
Robert McQueen <robot101@debian.org>
parents:
4110
diff
changeset
|
3450 | gc->away = g_strdup(""); |
| 4982 | 3451 | } else if (!strcmp(state, _("Invisible"))) { |
|
3340
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
3452 | xmlnode_put_attrib(x, "type", "invisible"); |
|
4111
93b27900416e
[gaim-migrate @ 4326]
Robert McQueen <robot101@debian.org>
parents:
4110
diff
changeset
|
3453 | gc->away = g_strdup(""); |
|
3340
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
3454 | invisible = TRUE; |
| 2086 | 3455 | } |
| 3456 | } | |
| 3457 | ||
| 3311 | 3458 | gjab_send(gjc, x); /* Notify "individuals" */ |
| 3459 | ||
| 3460 | /* | |
| 3461 | * As of jabberd-1.4.2: simply sending presence to the server doesn't result in | |
| 3462 | * it being propagated to conference rooms. So we wade thru the list of chats, | |
| 3463 | * sending our new presence status to each and every one. | |
| 3464 | */ | |
| 3465 | for(jcs = jd->chats; jcs; jcs = jcs->next) { | |
| 3466 | jc = jcs->data; | |
| 3467 | if(jc->state == JCS_ACTIVE) { | |
| 3468 | xmlnode_put_attrib(x, "from", jc->gjid->full); | |
| 3469 | chatname = g_strdup_printf("%s@%s", jc->gjid->user, jc->gjid->server); | |
| 3470 | xmlnode_put_attrib(x, "to", chatname); | |
| 3471 | gjab_send(gjc, x); | |
| 3472 | g_free(chatname); | |
| 3473 | } | |
| 3474 | } | |
| 3475 | ||
| 2086 | 3476 | xmlnode_free(x); |
|
3340
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
3477 | |
|
7e59a209931d
[gaim-migrate @ 3359]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3337
diff
changeset
|
3478 | invisible_to_all_buddies(gc, invisible); |
| 2086 | 3479 | } |
| 3480 | ||
| 3481 | static void jabber_set_idle(struct gaim_connection *gc, int idle) { | |
| 3482 | struct jabber_data *jd = (struct jabber_data *)gc->proto_data; | |
|
5223
4ea16d1f5cd1
[gaim-migrate @ 5593]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
3483 | gaim_debug(GAIM_DEBUG_INFO, "jabber", |
|
4ea16d1f5cd1
[gaim-migrate @ 5593]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
3484 | "jabber_set_idle: setting idle %i\n", idle); |
| 3770 | 3485 | jd->idle = idle ? time(NULL) - idle : idle; |
| 2086 | 3486 | } |
| 3487 | ||
| 3488 | static void jabber_keepalive(struct gaim_connection *gc) { | |
| 3489 | struct jabber_data *jd = (struct jabber_data *)gc->proto_data; | |
| 4450 | 3490 | gjab_send_raw(jd->gjc, JABBER_KEEPALIVE_STRING); |
| 2086 | 3491 | } |
| 3492 | ||
| 2956 | 3493 | /*---------------------------------------*/ |
| 3494 | /* Jabber "set info" (vCard) support */ | |
| 3495 | /*---------------------------------------*/ | |
| 3496 | ||
| 3497 | /* | |
| 3498 | * V-Card format: | |
| 3499 | * | |
| 3500 | * <vCard prodid='' version='' xmlns=''> | |
| 3501 | * <FN></FN> | |
| 3502 | * <N> | |
| 3503 | * <FAMILY/> | |
| 3504 | * <GIVEN/> | |
| 3505 | * </N> | |
| 3506 | * <NICKNAME/> | |
| 3507 | * <URL/> | |
| 3508 | * <ADR> | |
| 3509 | * <STREET/> | |
| 3510 | * <EXTADD/> | |
| 3511 | * <LOCALITY/> | |
| 3512 | * <REGION/> | |
| 3513 | * <PCODE/> | |
| 3514 | * <COUNTRY/> | |
| 3515 | * </ADR> | |
| 3516 | * <TEL/> | |
| 3517 | * <EMAIL/> | |
| 3518 | * <ORG> | |
| 3519 | * <ORGNAME/> | |
| 3520 | * <ORGUNIT/> | |
| 3521 | * </ORG> | |
| 3522 | * <TITLE/> | |
| 3523 | * <ROLE/> | |
| 3524 | * <DESC/> | |
| 3525 | * <BDAY/> | |
| 3526 | * </vCard> | |
| 3527 | * | |
| 3528 | * See also: | |
| 3529 | * | |
| 3530 | * http://docs.jabber.org/proto/html/vcard-temp.html | |
| 3531 | * http://www.vcard-xml.org/dtd/vCard-XML-v2-20010520.dtd | |
| 3532 | */ | |
| 3533 | ||
| 3534 | /* | |
| 3535 | * Cross-reference user-friendly V-Card entry labels to vCard XML tags | |
| 3536 | * and attributes. | |
| 3537 | * | |
| 3538 | * Order is (or should be) unimportant. For example: we have no way of | |
| 3539 | * knowing in what order real data will arrive. | |
| 3540 | * | |
| 3541 | * Format: Label, Pre-set text, "visible" flag, "editable" flag, XML tag | |
| 3542 | * name, XML tag's parent tag "path" (relative to vCard node). | |
| 3543 | * | |
| 3544 | * List is terminated by a NULL label pointer. | |
| 3545 | * | |
| 3546 | * Entries with no label text, but with XML tag and parent tag | |
| 3547 | * entries, are used by V-Card XML construction routines to | |
| 3548 | * "automagically" construct the appropriate XML node tree. | |
| 3549 | * | |
| 3550 | * Thoughts on future direction/expansion | |
| 3551 | * | |
| 3552 | * This is a "simple" vCard. | |
| 3553 | * | |
| 3554 | * It is possible for nodes other than the "vCard" node to have | |
| 3555 | * attributes. Should that prove necessary/desirable, add an | |
| 3556 | * "attributes" pointer to the vcard_template struct, create the | |
| 3557 | * necessary tag_attr structs, and add 'em to the vcard_dflt_data | |
| 3558 | * array. | |
| 3559 | * | |
| 3560 | * The above changes will (obviously) require changes to the vCard | |
| 3561 | * construction routines. | |
| 3562 | */ | |
| 3563 | ||
| 3564 | struct vcard_template { | |
| 3565 | char *label; /* label text pointer */ | |
| 3566 | char *text; /* entry text pointer */ | |
| 3567 | int visible; /* should entry field be "visible?" */ | |
| 3568 | int editable; /* should entry field be editable? */ | |
| 3569 | char *tag; /* tag text */ | |
| 3570 | char *ptag; /* parent tag "path" text */ | |
| 3571 | char *url; /* vCard display format if URL */ | |
| 3572 | } vcard_template_data[] = { | |
| 2975 | 3573 | {N_("Full Name"), NULL, TRUE, TRUE, "FN", NULL, NULL}, |
| 3574 | {N_("Family Name"), NULL, TRUE, TRUE, "FAMILY", "N", NULL}, | |
| 3575 | {N_("Given Name"), NULL, TRUE, TRUE, "GIVEN", "N", NULL}, | |
| 3576 | {N_("Nickname"), NULL, TRUE, TRUE, "NICKNAME", NULL, NULL}, | |
| 3577 | {N_("URL"), NULL, TRUE, TRUE, "URL", NULL, "<A HREF=\"%s\">%s</A>"}, | |
| 3578 | {N_("Street Address"), NULL, TRUE, TRUE, "STREET", "ADR", NULL}, | |
| 3579 | {N_("Extended Address"), NULL, TRUE, TRUE, "EXTADD", "ADR", NULL}, | |
| 3580 | {N_("Locality"), NULL, TRUE, TRUE, "LOCALITY", "ADR", NULL}, | |
| 3581 | {N_("Region"), NULL, TRUE, TRUE, "REGION", "ADR", NULL}, | |
| 3582 | {N_("Postal Code"), NULL, TRUE, TRUE, "PCODE", "ADR", NULL}, | |
| 3583 | {N_("Country"), NULL, TRUE, TRUE, "COUNTRY", "ADR", NULL}, | |
| 3584 | {N_("Telephone"), NULL, TRUE, TRUE, "TELEPHONE", NULL, NULL}, | |
| 3585 | {N_("Email"), NULL, TRUE, TRUE, "EMAIL", NULL, "<A HREF=\"mailto:%s\">%s</A>"}, | |
| 3586 | {N_("Organization Name"), NULL, TRUE, TRUE, "ORGNAME", "ORG", NULL}, | |
| 3587 | {N_("Organization Unit"), NULL, TRUE, TRUE, "ORGUNIT", "ORG", NULL}, | |
| 3588 | {N_("Title"), NULL, TRUE, TRUE, "TITLE", NULL, NULL}, | |
| 3589 | {N_("Role"), NULL, TRUE, TRUE, "ROLE", NULL, NULL}, | |
| 3590 | {N_("Birthday"), NULL, TRUE, TRUE, "BDAY", NULL, NULL}, | |
| 3591 | {N_("Description"), NULL, TRUE, TRUE, "DESC", NULL, NULL}, | |
| 2956 | 3592 | {"", NULL, TRUE, TRUE, "N", NULL, NULL}, |
| 3593 | {"", NULL, TRUE, TRUE, "ADR", NULL, NULL}, | |
| 3594 | {"", NULL, TRUE, TRUE, "ORG", NULL, NULL}, | |
| 3595 | {NULL, NULL, 0, 0, NULL, NULL, NULL} | |
| 3596 | }; | |
| 3597 | ||
| 3598 | /* | |
| 3599 | * The "vCard" tag's attibute list... | |
| 3600 | */ | |
| 3601 | struct tag_attr { | |
| 3602 | char *attr; | |
| 3603 | char *value; | |
| 3604 | } vcard_tag_attr_list[] = { | |
| 3605 | {"prodid", "-//HandGen//NONSGML vGen v1.0//EN"}, | |
| 3606 | {"version", "2.0", }, | |
| 3607 | {"xmlns", "vcard-temp", }, | |
| 3608 | {NULL, NULL}, | |
| 3609 | }; | |
| 3610 | ||
| 3611 | ||
| 3612 | /* | |
| 3613 | * V-Card user instructions | |
| 3614 | */ | |
| 3615 | static char *multi_entry_instructions = | |
| 2975 | 3616 | N_("All items below are optional. Enter only the information with which you feel comfortable"); |
| 3617 | static char *entries_title = N_("User Identity"); | |
| 2956 | 3618 | |
| 3619 | /* | |
| 3620 | * Used by routines to parse an XML-encoded string into an xmlnode tree | |
| 3621 | */ | |
| 3622 | typedef struct { | |
| 3623 | XML_Parser parser; | |
| 3624 | xmlnode current; | |
| 3625 | } *xmlstr2xmlnode_parser, xmlstr2xmlnode_parser_struct; | |
| 3626 | ||
| 3627 | ||
| 3628 | /* | |
| 3629 | * Display a Jabber vCard | |
| 3630 | */ | |
| 3631 | static void jabber_handlevcard(gjconn gjc, xmlnode querynode, char *from) | |
| 3632 | { | |
| 3633 | struct gaim_connection *gc = GJ_GC(gjc); | |
| 3634 | char *cdata, *status; | |
| 3635 | struct vcard_template *vc_tp = vcard_template_data; | |
| 3636 | ||
| 3637 | /* space for all vCard elements + Jabber I.D. + "status" + NULL (list terminator) */ | |
| 3638 | gchar **str_arr = (gchar **) g_new(gpointer, | |
| 3639 | (sizeof(vcard_template_data)/sizeof(struct vcard_template)) + 3); | |
| 3640 | gchar **ap = str_arr; | |
| 3641 | gchar *buddy, *final; | |
| 3642 | ||
| 4745 | 3643 | jab_res_info jri; |
| 3644 | ||
| 3311 | 3645 | if((buddy = get_realwho(gjc, from, TRUE, NULL)) == NULL) { |
| 3646 | g_strfreev(str_arr); | |
| 3647 | return; | |
| 2956 | 3648 | } |
| 3311 | 3649 | |
| 4745 | 3650 | jri = jabber_find_resource(GJ_GC(gjc), buddy); |
| 3651 | ||
| 2956 | 3652 | *ap++ = g_strdup_printf("<B>Jabber ID:</B> %s<BR>\n", buddy); |
| 3653 | ||
| 3654 | for(vc_tp = vcard_template_data; vc_tp->label != NULL; ++vc_tp) { | |
| 3655 | if(strcmp(vc_tp->tag, "DESC") == 0) | |
| 3656 | continue; /* special handling later */ | |
| 3657 | if(vc_tp->ptag == NULL) { | |
| 3658 | cdata = xmlnode_get_tag_data(querynode, vc_tp->tag); | |
| 3659 | } else { | |
| 3660 | gchar *tag = g_strdup_printf("%s/%s", vc_tp->ptag, vc_tp->tag); | |
| 3661 | cdata = xmlnode_get_tag_data(querynode, tag); | |
| 3662 | g_free(tag); | |
| 3663 | } | |
| 3664 | if(cdata != NULL) { | |
| 3665 | if(vc_tp->url == NULL) { | |
| 3666 | *ap++ = g_strdup_printf("<B>%s:</B> %s<BR>\n", vc_tp->label, cdata); | |
| 3667 | } else { | |
| 3668 | gchar *fmt = g_strdup_printf("<B>%%s:</B> %s<BR>\n", vc_tp->url); | |
| 3669 | *ap++ = g_strdup_printf(fmt, vc_tp->label, cdata, cdata); | |
| 3670 | g_free(fmt); | |
| 3671 | } | |
| 3672 | } | |
| 3673 | } | |
| 3674 | ||
| 4745 | 3675 | |
| 4450 | 3676 | status = strdup_withhtml(jabber_lookup_away(gjc, buddy)); |
| 4745 | 3677 | *ap++ = g_strdup_printf("<B>Status:</B> %s%s%s<BR>\n", |
| 3678 | jri ? jabber_get_state_string(jri->state) : "", | |
| 3679 | jri && status ? ": " : "", status ? status : ""); | |
| 4450 | 3680 | g_free(status); |
| 2956 | 3681 | |
| 3682 | /* | |
| 3683 | * "Description" handled as a special case: get a copy of the | |
| 3684 | * string and HTML-ize. | |
| 3685 | */ | |
| 3686 | if((cdata = xmlnode_get_tag_data(querynode, "DESC")) != NULL) { | |
| 3687 | gchar *tmp = g_strdup_printf("<HR>%s<BR>", cdata); | |
| 3688 | *ap++ = strdup_withhtml(tmp); | |
| 3689 | g_free(tmp); | |
| 3690 | } | |
| 3691 | ||
| 3692 | *ap = NULL; | |
| 3693 | ||
| 3694 | final= g_strjoinv(NULL, str_arr); | |
| 3695 | g_strfreev(str_arr); | |
| 3696 | ||
| 3697 | g_show_info_text(gc, buddy, 2, final, NULL); | |
| 3698 | g_free(buddy); | |
| 3699 | g_free(final); | |
| 3700 | } | |
| 3701 | ||
| 3702 | /* | |
| 3703 | * Used by XML_Parse on parsing CDATA | |
| 3704 | */ | |
| 3705 | static void xmlstr2xmlnode_charData(void *userdata, const char *s, int slen) | |
| 3706 | { | |
| 3707 | xmlstr2xmlnode_parser xmlp = (xmlstr2xmlnode_parser) userdata; | |
| 3708 | ||
| 3709 | if (xmlp->current) | |
| 3710 | xmlnode_insert_cdata(xmlp->current, s, slen); | |
| 3711 | } | |
| 3712 | ||
| 3713 | /* | |
| 3714 | * Used by XML_Parse to start or append to an xmlnode | |
| 3715 | */ | |
| 3716 | static void xmlstr2xmlnode_startElement(void *userdata, const char *name, const char **attribs) | |
| 3717 | { | |
| 3718 | xmlnode x; | |
| 3719 | xmlstr2xmlnode_parser xmlp = (xmlstr2xmlnode_parser) userdata; | |
| 3720 | ||
| 3721 | if (xmlp->current) { | |
| 3722 | /* Append the node to the current one */ | |
| 3723 | x = xmlnode_insert_tag(xmlp->current, name); | |
| 3724 | xmlnode_put_expat_attribs(x, attribs); | |
| 3725 | ||
| 3726 | xmlp->current = x; | |
| 3727 | } else { | |
| 3728 | x = xmlnode_new_tag(name); | |
| 3729 | xmlnode_put_expat_attribs(x, attribs); | |
| 3730 | xmlp->current = x; | |
| 3731 | } | |
| 3732 | } | |
| 3733 | ||
| 3734 | /* | |
| 3735 | * Used by XML_Parse to end an xmlnode | |
| 3736 | */ | |
| 3737 | static void xmlstr2xmlnode_endElement(void *userdata, const char *name) | |
| 3738 | { | |
| 3739 | xmlstr2xmlnode_parser xmlp = (xmlstr2xmlnode_parser) userdata; | |
| 3740 | xmlnode x; | |
| 3741 | ||
| 3742 | if (xmlp->current != NULL && (x = xmlnode_get_parent(xmlp->current)) != NULL) { | |
| 3743 | xmlp->current = x; | |
| 3744 | } | |
| 3745 | } | |
| 3746 | ||
| 3747 | /* | |
| 3748 | * Parse an XML-encoded string into an xmlnode tree | |
| 3749 | * | |
| 3750 | * Caller is responsible for freeing the returned xmlnode | |
| 3751 | */ | |
| 3752 | static xmlnode xmlstr2xmlnode(char *xmlstring) | |
| 3753 | { | |
| 3754 | xmlstr2xmlnode_parser my_parser = g_new(xmlstr2xmlnode_parser_struct, 1); | |
| 3755 | xmlnode x = NULL; | |
| 3756 | ||
| 3757 | my_parser->parser = XML_ParserCreate(NULL); | |
| 3758 | my_parser->current = NULL; | |
| 3759 | ||
| 3760 | XML_SetUserData(my_parser->parser, (void *)my_parser); | |
| 3761 | XML_SetElementHandler(my_parser->parser, xmlstr2xmlnode_startElement, xmlstr2xmlnode_endElement); | |
| 3762 | XML_SetCharacterDataHandler(my_parser->parser, xmlstr2xmlnode_charData); | |
| 3763 | XML_Parse(my_parser->parser, xmlstring, strlen(xmlstring), 0); | |
| 3764 | ||
| 3765 | x = my_parser->current; | |
| 3766 | ||
| 3767 | XML_ParserFree(my_parser->parser); | |
| 3768 | g_free(my_parser); | |
| 3769 | ||
| 3770 | return(x); | |
| 3771 | } | |
| 3772 | ||
| 3773 | /* | |
| 3774 | * Insert a tag node into an xmlnode tree, recursively inserting parent tag | |
| 3775 | * nodes as necessary | |
| 3776 | * | |
| 3777 | * Returns pointer to inserted node | |
| 3778 | * | |
| 3779 | * Note to hackers: this code is designed to be re-entrant (it's recursive--it | |
| 3780 | * calls itself), so don't put any "static"s in here! | |
| 3781 | */ | |
| 3782 | static xmlnode insert_tag_to_parent_tag(xmlnode start, const char *parent_tag, const char *new_tag) | |
| 3783 | { | |
| 3784 | xmlnode x = NULL; | |
| 3785 | ||
| 3786 | /* | |
| 3787 | * If the parent tag wasn't specified, see if we can get it | |
| 3788 | * from the vCard template struct. | |
| 3789 | */ | |
| 3790 | if(parent_tag == NULL) { | |
| 3791 | struct vcard_template *vc_tp = vcard_template_data; | |
| 3792 | ||
| 3793 | while(vc_tp->label != NULL) { | |
| 3794 | if(strcmp(vc_tp->tag, new_tag) == 0) { | |
| 3795 | parent_tag = vc_tp->ptag; | |
| 3796 | break; | |
| 3797 | } | |
| 3798 | ++vc_tp; | |
| 3799 | } | |
| 3800 | } | |
| 3801 | ||
| 3802 | /* | |
| 3803 | * If we have a parent tag... | |
| 3804 | */ | |
| 3805 | if(parent_tag != NULL ) { | |
| 3806 | /* | |
| 3807 | * Try to get the parent node for a tag | |
| 3808 | */ | |
| 3809 | if((x = xmlnode_get_tag(start, parent_tag)) == NULL) { | |
| 3810 | /* | |
| 3811 | * Descend? | |
| 3812 | */ | |
| 3813 | char *grand_parent = strcpy(g_malloc(strlen(parent_tag) + 1), parent_tag); | |
| 3814 | char *parent; | |
| 3815 | ||
| 3816 | if((parent = strrchr(grand_parent, '/')) != NULL) { | |
| 3817 | *(parent++) = '\0'; | |
| 3818 | x = insert_tag_to_parent_tag(start, grand_parent, parent); | |
| 3819 | } else { | |
| 3820 | x = xmlnode_insert_tag(start, grand_parent); | |
| 3821 | } | |
| 3822 | g_free(grand_parent); | |
| 3823 | } else { | |
| 3824 | /* | |
| 3825 | * We found *something* to be the parent node. | |
| 3826 | * Note: may be the "root" node! | |
| 3827 | */ | |
| 3828 | xmlnode y; | |
| 3829 | if((y = xmlnode_get_tag(x, new_tag)) != NULL) { | |
| 3830 | return(y); | |
| 3831 | } | |
| 3832 | } | |
| 3833 | } | |
| 3834 | ||
| 3835 | /* | |
| 3836 | * insert the new tag into its parent node | |
| 3837 | */ | |
| 3838 | return(xmlnode_insert_tag((x == NULL? start : x), new_tag)); | |
| 3839 | } | |
| 3840 | ||
| 3841 | /* | |
| 3842 | * Find the tag name for a label | |
| 3843 | * | |
| 3844 | * Returns NULL on not found | |
| 3845 | */ | |
| 3846 | static char *tag_for_label(const char *label) | |
| 3847 | { | |
| 3848 | struct vcard_template *vc_tp = vcard_template_data; | |
| 3849 | char *p = NULL; | |
| 3850 | ||
| 3851 | for(vc_tp = vcard_template_data; vc_tp->label != NULL; ++vc_tp) { | |
| 3852 | if(strcmp(label, vc_tp->label) == 0) { | |
| 3853 | p = vc_tp->tag; | |
| 3854 | break; | |
| 3855 | } | |
| 3856 | } | |
| 3857 | ||
| 3858 | return(p); | |
| 3859 | } | |
| 3860 | ||
| 3861 | /* | |
| 3862 | * Send vCard info to Jabber server | |
| 3863 | */ | |
| 3864 | static void jabber_set_info(struct gaim_connection *gc, char *info) | |
| 3865 | { | |
| 3866 | xmlnode x, vc_node; | |
| 3867 | char *id; | |
| 3868 | struct jabber_data *jd = gc->proto_data; | |
| 3869 | gjconn gjc = jd->gjc; | |
| 3870 | ||
| 3871 | x = xmlnode_new_tag("iq"); | |
| 3311 | 3872 | xmlnode_put_attrib(x, "type", "set"); |
| 2956 | 3873 | |
| 3874 | id = gjab_getid(gjc); | |
| 3770 | 3875 | |
| 2956 | 3876 | xmlnode_put_attrib(x, "id", id); |
| 3877 | ||
| 3878 | /* | |
| 3879 | * Send only if there's actually any *information* to send | |
| 3880 | */ | |
| 4874 | 3881 | vc_node = xmlstr2xmlnode(info); |
| 3882 | ||
| 3883 | if(vc_node) { | |
| 3884 | if (xmlnode_get_name(vc_node) && | |
| 3885 | !g_ascii_strncasecmp(xmlnode_get_name(vc_node), "vcard", 5)) { | |
| 3886 | xmlnode_insert_tag_node(x, vc_node); | |
|
5223
4ea16d1f5cd1
[gaim-migrate @ 5593]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
3887 | gaim_debug(GAIM_DEBUG_MISC, "jabber", |
|
4ea16d1f5cd1
[gaim-migrate @ 5593]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
3888 | "jabber: vCard packet: %s\n", xmlnode2str(x)); |
| 4874 | 3889 | gjab_send(gjc, x); |
| 3890 | } | |
| 3891 | xmlnode_free(vc_node); | |
| 2956 | 3892 | } |
| 3893 | ||
| 3894 | xmlnode_free(x); | |
| 3895 | } | |
| 3896 | ||
| 3897 | /* | |
| 3898 | * This is the callback from the "ok clicked" for "set vCard" | |
| 3899 | * | |
| 3900 | * Formats GSList data into XML-encoded string and returns a pointer | |
| 3901 | * to said string. | |
| 3902 | * | |
| 3903 | * g_free()'ing the returned string space is the responsibility of | |
| 3904 | * the caller. | |
| 3905 | */ | |
| 3906 | static gchar *jabber_format_info(MultiEntryDlg *b) | |
| 3907 | { | |
| 3908 | xmlnode vc_node; | |
| 3909 | GSList *list; | |
| 3910 | MultiEntryData *med; | |
| 3911 | MultiTextData *mtd; | |
| 3912 | char *p; | |
| 3913 | ||
| 3914 | struct tag_attr *tag_attr; | |
| 3915 | ||
| 3916 | vc_node = xmlnode_new_tag("vCard"); | |
| 3917 | ||
| 3918 | for(tag_attr = vcard_tag_attr_list; tag_attr->attr != NULL; ++tag_attr) | |
| 3919 | xmlnode_put_attrib(vc_node, tag_attr->attr, tag_attr->value); | |
| 3920 | ||
| 3921 | for(list = b->multi_entry_items; list != NULL; list = list->next) { | |
| 3922 | med = (MultiEntryData *) list->data; | |
| 3923 | if(med->label != NULL && med->text != NULL && (med->text)[0] != '\0') { | |
| 3924 | if((p = tag_for_label(med->label)) != NULL) { | |
| 3925 | xmlnode xp; | |
| 3926 | if((xp = insert_tag_to_parent_tag(vc_node, NULL, p)) != NULL) { | |
| 3927 | xmlnode_insert_cdata(xp, med->text, -1); | |
| 3928 | } | |
| 3929 | } | |
| 3930 | } | |
| 3931 | } | |
| 3932 | ||
| 3933 | for(list = b->multi_text_items; list != NULL; list = list->next) { | |
| 3934 | mtd = (MultiTextData *) list->data; | |
| 3935 | if(mtd->label != NULL && mtd->text != NULL && (mtd->text)[0] != '\0') { | |
| 3936 | if((p = tag_for_label(mtd->label)) != NULL) { | |
| 3937 | xmlnode xp; | |
| 3938 | if((xp = insert_tag_to_parent_tag(vc_node, NULL, p)) != NULL) { | |
| 3939 | xmlnode_insert_cdata(xp, mtd->text, -1); | |
| 3940 | } | |
| 3941 | } | |
| 3942 | } | |
| 3943 | } | |
| 3944 | ||
| 3945 | ||
| 3946 | p = g_strdup(xmlnode2str(vc_node)); | |
| 3947 | xmlnode_free(vc_node); | |
| 3948 | ||
| 3949 | return(p); | |
| 3950 | } | |
| 3951 | ||
| 3952 | /* | |
| 3953 | * This gets executed by the proto action | |
| 3954 | * | |
| 3955 | * Creates a new MultiEntryDlg struct, gets the XML-formatted user_info | |
| 3956 | * string (if any) into GSLists for the (multi-entry) edit dialog and | |
| 3957 | * calls the set_vcard dialog. | |
| 3958 | */ | |
| 3959 | static void jabber_setup_set_info(struct gaim_connection *gc) | |
| 3960 | { | |
| 3961 | MultiEntryData *data; | |
| 3962 | const struct vcard_template *vc_tp; | |
| 3963 | char *user_info; | |
| 3964 | MultiEntryDlg *b = multi_entry_dialog_new(); | |
| 3965 | char *cdata; | |
| 3966 | xmlnode x_vc_data = NULL; | |
| 4491 | 3967 | struct gaim_account *tmp = gc->account; |
| 3968 | b->account = tmp; | |
| 2956 | 3969 | |
| 3970 | ||
| 3971 | /* | |
| 3972 | * Get existing, XML-formatted, user info | |
| 3973 | */ | |
| 3974 | if((user_info = g_malloc(strlen(tmp->user_info) + 1)) != NULL) { | |
| 3975 | strcpy(user_info, tmp->user_info); | |
| 3976 | x_vc_data = xmlstr2xmlnode(user_info); | |
| 3977 | } | |
| 3978 | ||
| 3979 | /* | |
| 3980 | * Set up GSLists for edit with labels from "template," data from user info | |
| 3981 | */ | |
| 3982 | for(vc_tp = vcard_template_data; vc_tp->label != NULL; ++vc_tp) { | |
| 3983 | if((vc_tp->label)[0] == '\0') | |
| 3984 | continue; | |
| 3985 | if(vc_tp->ptag == NULL) { | |
| 3986 | cdata = xmlnode_get_tag_data(x_vc_data, vc_tp->tag); | |
| 3987 | } else { | |
| 3988 | gchar *tag = g_strdup_printf("%s/%s", vc_tp->ptag, vc_tp->tag); | |
| 3989 | cdata = xmlnode_get_tag_data(x_vc_data, tag); | |
| 3990 | g_free(tag); | |
| 3991 | } | |
| 3992 | if(strcmp(vc_tp->tag, "DESC") == 0) { | |
| 3993 | multi_text_list_update(&(b->multi_text_items), | |
| 3994 | vc_tp->label, cdata, TRUE); | |
| 3995 | } else { | |
| 3996 | data = multi_entry_list_update(&(b->multi_entry_items), | |
| 3997 | vc_tp->label, cdata, TRUE); | |
| 3998 | data->visible = vc_tp->visible; | |
| 3999 | data->editable = vc_tp->editable; | |
| 4000 | } | |
| 4001 | } | |
| 4002 | ||
| 4003 | ||
| 4004 | if(x_vc_data != NULL) { | |
| 4005 | xmlnode_free(x_vc_data); | |
| 4006 | } else { | |
| 4007 | /* | |
| 4008 | * Early Beta versions had a different user_info storage format--let's | |
| 4009 | * see if that works. | |
| 4010 | * | |
| 4011 | * This goes away RSN. | |
| 4012 | */ | |
| 4013 | const char *record_separator = "<BR>"; | |
| 4014 | const char *field_separator = ": "; | |
| 4015 | gchar **str_list, **str_list_ptr, **str_list2; | |
| 4016 | ||
| 4017 | if((str_list = g_strsplit(user_info, record_separator, 0)) != NULL) { | |
| 4018 | for(str_list_ptr = str_list; *str_list_ptr != NULL; ++str_list_ptr) { | |
| 4019 | str_list2 = g_strsplit(*str_list_ptr, field_separator, 2); | |
| 4020 | if(str_list2[0] != NULL && str_list2[1] != NULL) { | |
| 4021 | g_strstrip(str_list2[0]); | |
| 4022 | g_strstrip(str_list2[1]); | |
| 4023 | /* this is ugly--so far */ | |
| 4024 | if(strcmp(str_list2[0], "Description") == 0) { | |
| 4025 | multi_text_list_update(&(b->multi_text_items), | |
| 4026 | str_list2[0], str_list2[1], FALSE); | |
| 4027 | } else { | |
| 4028 | multi_entry_list_update(&(b->multi_entry_items), | |
| 4029 | str_list2[0], str_list2[1], FALSE); | |
| 4030 | } | |
| 4031 | } | |
| 4032 | g_strfreev(str_list2); | |
| 4033 | } | |
| 4034 | g_strfreev(str_list); | |
| 4035 | } | |
| 4036 | } | |
| 4037 | ||
| 4038 | if(user_info != NULL) { | |
| 4039 | g_free(user_info); | |
| 4040 | } | |
| 4041 | ||
| 2975 | 4042 | b->title = _("Gaim - Edit Jabber vCard"); |
|
4074
c69100a0ede9
[gaim-migrate @ 4289]
Robert McQueen <robot101@debian.org>
parents:
4059
diff
changeset
|
4043 | b->role = "set_info"; |
| 2956 | 4044 | b->instructions->text = g_strdup(multi_entry_instructions); |
| 2975 | 4045 | b->entries_title = g_strdup(entries_title); |
| 2956 | 4046 | |
| 4047 | b->custom = (void *) jabber_format_info; | |
| 4048 | ||
| 4049 | show_set_vcard(b); | |
| 4050 | } | |
| 4051 | ||
| 4052 | /*---------------------------------------*/ | |
| 4053 | /* End Jabber "set info" (vCard) support */ | |
| 4054 | /*---------------------------------------*/ | |
| 4055 | ||
| 4056 | /*----------------------------------------*/ | |
| 4057 | /* Jabber "user registration" support */ | |
| 4058 | /*----------------------------------------*/ | |
| 4059 | ||
| 4060 | /* | |
| 4061 | * Three of the following four functions duplicate much of what | |
| 4062 | * exists elsewhere: | |
| 4063 | * | |
| 4064 | * jabber_handleregresp() | |
| 4065 | * gjab_reqreg() | |
| 4066 | * jabber_handle_registration_state() | |
| 4067 | * | |
| 4068 | * It may be that an additional flag could be added to one of | |
| 4069 | * the "local" structs and the duplicated code modified to | |
| 4070 | * account for it--thus eliminating the duplication. Then again: | |
| 4071 | * doing it the way it is may be much cleaner. | |
| 4072 | * | |
| 4073 | * TBD: Code to support requesting additional information server | |
| 4074 | * wants at registration--incl. dialog. | |
| 4075 | */ | |
| 4076 | ||
| 4077 | /* | |
| 4078 | * Like jabber_handlepacket(), only different | |
| 4079 | */ | |
| 4080 | static void jabber_handleregresp(gjconn gjc, jpacket p) | |
| 4081 | { | |
| 4082 | if (jpacket_subtype(p) == JPACKET__RESULT) { | |
| 4083 | xmlnode querynode; | |
| 4084 | ||
| 4085 | if((querynode = xmlnode_get_tag(p->x, "query")) != NULL) { | |
| 4086 | char *xmlns; | |
| 4087 | ||
| 4088 | /* we damn well *better* have this! */ | |
| 4089 | if((xmlns = xmlnode_get_attrib(querynode, "xmlns")) != NULL && | |
| 4090 | strcmp(xmlns, NS_REGISTER) == 0) { | |
| 4091 | ||
| 4092 | char *tag; | |
| 4093 | xmlnode child = xmlnode_get_firstchild(querynode); | |
| 4094 | ||
|
5223
4ea16d1f5cd1
[gaim-migrate @ 5593]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
4095 | gaim_debug(GAIM_DEBUG_INFO, "jabber", |
|
4ea16d1f5cd1
[gaim-migrate @ 5593]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
4096 | "got registration requirments response!\n"); |
| 2956 | 4097 | |
| 4098 | while(child != NULL) { | |
| 4099 | if((tag = xmlnode_get_name(child)) != NULL) { | |
| 4100 | char *data; | |
| 4101 | ||
| 4102 | fprintf(stderr, "DBG: got node: \"%s\"\n", tag); | |
| 4103 | fflush(stderr); | |
| 4104 | ||
| 4105 | if((data = xmlnode_get_data(child)) != NULL) { | |
| 4106 | fprintf(stderr, "DBG: got data: \"%s\"\n", data); | |
| 4107 | fflush(stderr); | |
| 4108 | } | |
| 4109 | } | |
| 4110 | child = xmlnode_get_nextsibling(child); | |
| 4111 | } | |
| 4112 | } | |
| 4113 | } else { | |
|
5223
4ea16d1f5cd1
[gaim-migrate @ 5593]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
4114 | gaim_debug(GAIM_DEBUG_INFO, "jabber", |
|
4ea16d1f5cd1
[gaim-migrate @ 5593]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
4115 | "registration successful!\n"); |
| 2956 | 4116 | |
| 2975 | 4117 | hide_login_progress_notice(GJ_GC(gjc), _("Server Registration successful!")); |
| 2956 | 4118 | /* |
| 4119 | * TBD: is this the correct way to do away with a | |
| 4120 | * gaim_connection and all its associated memory | |
| 4121 | * allocs, etc.? | |
| 4122 | */ | |
| 4123 | signoff(GJ_GC(gjc)); | |
| 4124 | } | |
| 4125 | ||
| 4126 | } else { | |
| 4127 | xmlnode xerr; | |
| 4128 | char *errmsg = NULL; | |
| 4129 | int errcode = 0; | |
| 4130 | struct jabber_data *jd = GJ_GC(gjc)->proto_data; | |
| 4131 | ||
|
5223
4ea16d1f5cd1
[gaim-migrate @ 5593]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
4132 | gaim_debug(GAIM_DEBUG_ERROR, "jabber", "registration failed\n"); |
| 2956 | 4133 | xerr = xmlnode_get_tag(p->x, "error"); |
| 4134 | if (xerr) { | |
| 4135 | char msg[BUF_LONG]; | |
| 4136 | errmsg = xmlnode_get_data(xerr); | |
| 4137 | if (xmlnode_get_attrib(xerr, "code")) { | |
| 4138 | errcode = atoi(xmlnode_get_attrib(xerr, "code")); | |
| 4139 | g_snprintf(msg, sizeof(msg), "Error %d: %s", errcode, errmsg); | |
| 4140 | } else | |
| 4141 | g_snprintf(msg, sizeof(msg), "%s", errmsg); | |
| 4142 | hide_login_progress(GJ_GC(gjc), msg); | |
| 4143 | } else { | |
| 2975 | 4144 | hide_login_progress(GJ_GC(gjc), _("Unknown registration error")); |
| 2956 | 4145 | } |
| 4146 | ||
| 4147 | jd->die = TRUE; | |
| 4148 | } | |
| 4149 | } | |
| 4150 | ||
| 4151 | /* | |
| 4152 | * Like gjab_reqauth(), only different | |
| 4153 | */ | |
| 4154 | static void gjab_reqreg(gjconn gjc) | |
| 4155 | { | |
| 4156 | xmlnode x, y, z; | |
| 4157 | char *user; | |
| 4158 | ||
| 4159 | if (!gjc) | |
| 4160 | return; | |
| 4161 | ||
| 4162 | x = jutil_iqnew(JPACKET__SET, NS_REGISTER); | |
| 4163 | y = xmlnode_get_tag(x, "query"); | |
| 4164 | ||
| 4165 | user = gjc->user->user; | |
| 4166 | ||
| 4167 | if (user) { | |
| 4168 | z = xmlnode_insert_tag(y, "username"); | |
| 4169 | xmlnode_insert_cdata(z, user, -1); | |
| 4170 | } | |
| 4171 | z = xmlnode_insert_tag(y, "password"); | |
| 4172 | xmlnode_insert_cdata(z, gjc->pass, -1); | |
| 4173 | ||
|
5223
4ea16d1f5cd1
[gaim-migrate @ 5593]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
4174 | gaim_debug(GAIM_DEBUG_MISC, "jabber", |
|
4ea16d1f5cd1
[gaim-migrate @ 5593]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
4175 | "jabber: registration packet: %s\n", xmlnode2str(x)); |
| 2956 | 4176 | gjab_send(gjc, x); |
| 4177 | xmlnode_free(x); | |
| 4178 | } | |
| 4179 | ||
| 4180 | /* | |
| 4181 | * Like jabber_handlestate(), only different | |
| 4182 | */ | |
| 4183 | static void jabber_handle_registration_state(gjconn gjc, int state) | |
| 4184 | { | |
| 4185 | switch (state) { | |
| 4186 | case JCONN_STATE_OFF: | |
|
3074
b6510843df8f
[gaim-migrate @ 3088]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3059
diff
changeset
|
4187 | if(gjc->was_connected) { |
|
b6510843df8f
[gaim-migrate @ 3088]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3059
diff
changeset
|
4188 | hide_login_progress_error(GJ_GC(gjc), _("Connection lost")); |
|
b6510843df8f
[gaim-migrate @ 3088]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3059
diff
changeset
|
4189 | } else { |
|
b6510843df8f
[gaim-migrate @ 3088]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3059
diff
changeset
|
4190 | hide_login_progress(GJ_GC(gjc), _("Unable to connect")); |
|
b6510843df8f
[gaim-migrate @ 3088]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3059
diff
changeset
|
4191 | } |
| 2956 | 4192 | signoff(GJ_GC(gjc)); |
| 4193 | break; | |
| 4194 | case JCONN_STATE_CONNECTED: | |
|
3074
b6510843df8f
[gaim-migrate @ 3088]
Jim Seymour <jseymour@users.sourceforge.net>
parents:
3059
diff
changeset
|
4195 | gjc->was_connected = 1; |
| 2956 | 4196 | /* |
| 4197 | * TBD? | |
| 2975 | 4198 | set_login_progress(GJ_GC(gjc), 2, _("Connected")); |
| 2956 | 4199 | */ |
| 4200 | break; | |
| 4201 | case JCONN_STATE_ON: | |
| 4202 | /* | |
| 4203 | * TBD? | |
| 2975 | 4204 | set_login_progress(GJ_GC(gjc), 3, _("Requesting Authentication Method")); |
| 2956 | 4205 | */ |
| 4206 | gjab_reqreg(gjc); | |
| 4207 | /* | |
| 4208 | * TBD: A work-in-progress | |
| 4209 | gjab_reqregreqs(gjc); | |
| 4210 | */ | |
| 4211 | break; | |
| 4212 | default: | |
|
5223
4ea16d1f5cd1
[gaim-migrate @ 5593]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
4213 | gaim_debug(GAIM_DEBUG_MISC, "jabber", "state change: %d\n", state); |
| 2956 | 4214 | } |
| 4215 | return; | |
| 4216 | } | |
| 4217 | ||
| 4218 | /* | |
| 4219 | * Like jabber_login(), only different | |
| 4220 | */ | |
| 4491 | 4221 | void jabber_register_user(struct gaim_account *account) |
| 2956 | 4222 | { |
| 4491 | 4223 | struct gaim_connection *gc = new_gaim_conn(account); |
| 2956 | 4224 | struct jabber_data *jd = gc->proto_data = g_new0(struct jabber_data, 1); |
| 4917 | 4225 | char *loginname = create_valid_jid(account->username, DEFAULT_SERVER, "Gaim"); |
| 2956 | 4226 | |
| 4227 | /* | |
| 4228 | * These do nothing during registration | |
| 4229 | */ | |
| 3311 | 4230 | jd->buddies = NULL; |
| 2956 | 4231 | jd->chats = NULL; |
| 4232 | ||
| 4491 | 4233 | if ((jd->gjc = gjab_new(loginname, account->password, gc)) == NULL) { |
| 2956 | 4234 | g_free(loginname); |
|
5223
4ea16d1f5cd1
[gaim-migrate @ 5593]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
4235 | gaim_debug(GAIM_DEBUG_ERROR, "jabber", |
|
4ea16d1f5cd1
[gaim-migrate @ 5593]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
4236 | "unable to connect (jab_new failed)\n"); |
| 2975 | 4237 | hide_login_progress(gc, _("Unable to connect")); |
| 2956 | 4238 | signoff(gc); |
| 4239 | } else { | |
| 4240 | gjab_state_handler(jd->gjc, jabber_handle_registration_state); | |
| 4241 | gjab_packet_handler(jd->gjc, jabber_handleregresp); | |
| 4242 | jd->gjc->queries = NULL; | |
| 4243 | gjab_start(jd->gjc); | |
| 4244 | } | |
| 4245 | ||
| 4246 | g_free(loginname); | |
| 4247 | } | |
| 4248 | ||
| 4249 | /*----------------------------------------*/ | |
| 4250 | /* End Jabber "user registration" support */ | |
| 4251 | /*----------------------------------------*/ | |
| 4252 | ||
|
4333
f4c095774bc2
[gaim-migrate @ 4597]
Mark Doliner <markdoliner@pidgin.im>
parents:
4316
diff
changeset
|
4253 | static GList *jabber_actions(struct gaim_connection *gc) |
| 2956 | 4254 | { |
| 4255 | GList *m = NULL; | |
|
4333
f4c095774bc2
[gaim-migrate @ 4597]
Mark Doliner <markdoliner@pidgin.im>
parents:
4316
diff
changeset
|
4256 | struct proto_actions_menu *pam; |
|
f4c095774bc2
[gaim-migrate @ 4597]
Mark Doliner <markdoliner@pidgin.im>
parents:
4316
diff
changeset
|
4257 | |
|
f4c095774bc2
[gaim-migrate @ 4597]
Mark Doliner <markdoliner@pidgin.im>
parents:
4316
diff
changeset
|
4258 | pam = g_new0(struct proto_actions_menu, 1); |
|
f4c095774bc2
[gaim-migrate @ 4597]
Mark Doliner <markdoliner@pidgin.im>
parents:
4316
diff
changeset
|
4259 | pam->label = _("Set User Info"); |
|
f4c095774bc2
[gaim-migrate @ 4597]
Mark Doliner <markdoliner@pidgin.im>
parents:
4316
diff
changeset
|
4260 | pam->callback = jabber_setup_set_info; |
|
f4c095774bc2
[gaim-migrate @ 4597]
Mark Doliner <markdoliner@pidgin.im>
parents:
4316
diff
changeset
|
4261 | pam->gc = gc; |
|
f4c095774bc2
[gaim-migrate @ 4597]
Mark Doliner <markdoliner@pidgin.im>
parents:
4316
diff
changeset
|
4262 | m = g_list_append(m, pam); |
|
f4c095774bc2
[gaim-migrate @ 4597]
Mark Doliner <markdoliner@pidgin.im>
parents:
4316
diff
changeset
|
4263 | |
| 2956 | 4264 | /* |
|
4333
f4c095774bc2
[gaim-migrate @ 4597]
Mark Doliner <markdoliner@pidgin.im>
parents:
4316
diff
changeset
|
4265 | pam = g_new0(struct proto_actions_menu, 1); |
|
f4c095774bc2
[gaim-migrate @ 4597]
Mark Doliner <markdoliner@pidgin.im>
parents:
4316
diff
changeset
|
4266 | pam->label = _("Set Dir Info"); |
|
f4c095774bc2
[gaim-migrate @ 4597]
Mark Doliner <markdoliner@pidgin.im>
parents:
4316
diff
changeset
|
4267 | pam->callback = show_set_dir; |
|
f4c095774bc2
[gaim-migrate @ 4597]
Mark Doliner <markdoliner@pidgin.im>
parents:
4316
diff
changeset
|
4268 | pam->gc = gc; |
|
f4c095774bc2
[gaim-migrate @ 4597]
Mark Doliner <markdoliner@pidgin.im>
parents:
4316
diff
changeset
|
4269 | m = g_list_append(m, pam); |
| 3257 | 4270 | */ |
|
4333
f4c095774bc2
[gaim-migrate @ 4597]
Mark Doliner <markdoliner@pidgin.im>
parents:
4316
diff
changeset
|
4271 | |
|
f4c095774bc2
[gaim-migrate @ 4597]
Mark Doliner <markdoliner@pidgin.im>
parents:
4316
diff
changeset
|
4272 | pam = g_new0(struct proto_actions_menu, 1); |
|
f4c095774bc2
[gaim-migrate @ 4597]
Mark Doliner <markdoliner@pidgin.im>
parents:
4316
diff
changeset
|
4273 | pam->label = _("Change Password"); |
|
f4c095774bc2
[gaim-migrate @ 4597]
Mark Doliner <markdoliner@pidgin.im>
parents:
4316
diff
changeset
|
4274 | pam->callback = show_change_passwd; |
|
f4c095774bc2
[gaim-migrate @ 4597]
Mark Doliner <markdoliner@pidgin.im>
parents:
4316
diff
changeset
|
4275 | pam->gc = gc; |
|
f4c095774bc2
[gaim-migrate @ 4597]
Mark Doliner <markdoliner@pidgin.im>
parents:
4316
diff
changeset
|
4276 | m = g_list_append(m, pam); |
| 2956 | 4277 | |
| 4278 | return m; | |
| 4279 | } | |
| 4280 | ||
|
5205
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4281 | static GaimPluginProtocolInfo prpl_info = |
| 2086 | 4282 | { |
|
5205
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4283 | GAIM_PROTO_JABBER, |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4284 | OPT_PROTO_UNIQUE_CHATNAME | OPT_PROTO_CHAT_TOPIC, |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4285 | NULL, |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4286 | NULL, |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4287 | jabber_list_icon, |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4288 | jabber_list_emblems, |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4289 | jabber_status_text, |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4290 | jabber_tooltip_text, |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4291 | jabber_away_states, |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4292 | jabber_actions, |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4293 | jabber_buddy_menu, |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4294 | jabber_chat_info, |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4295 | jabber_login, |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4296 | jabber_close, |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4297 | jabber_send_im, |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4298 | jabber_set_info, |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4299 | jabber_send_typing, |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4300 | jabber_get_info, |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4301 | jabber_set_away, |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4302 | NULL, |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4303 | NULL, |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4304 | NULL, |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4305 | NULL, |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4306 | jabber_set_idle, |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4307 | jabber_change_passwd, |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4308 | jabber_add_buddy, |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4309 | NULL, |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4310 | jabber_remove_buddy, |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4311 | NULL, |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4312 | NULL, |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4313 | NULL, |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4314 | NULL, |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4315 | NULL, |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4316 | NULL, |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4317 | NULL, |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4318 | jabber_join_chat, |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4319 | jabber_chat_invite, |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4320 | jabber_chat_leave, |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4321 | jabber_chat_whisper, |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4322 | jabber_chat_send, |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4323 | jabber_keepalive, |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4324 | jabber_register_user, |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4325 | jabber_get_cb_info, |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4326 | jabber_get_cb_away_msg, |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4327 | jabber_alias_buddy, |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4328 | NULL, |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4329 | jabber_rename_group, |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4330 | NULL, |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4331 | jabber_convo_closed, |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4332 | jabber_normalize |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4333 | }; |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4334 | |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4335 | static GaimPluginInfo info = |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4336 | { |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4337 | 2, /**< api_version */ |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4338 | GAIM_PLUGIN_PROTOCOL, /**< type */ |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4339 | NULL, /**< ui_requirement */ |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4340 | 0, /**< flags */ |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4341 | NULL, /**< dependencies */ |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4342 | GAIM_PRIORITY_DEFAULT, /**< priority */ |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4343 | |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4344 | "prpl-jabber", /**< id */ |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4345 | "Jabber", /**< name */ |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4346 | VERSION, /**< version */ |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4347 | /** summary */ |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4348 | N_("Jabber Protocol Plugin"), |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4349 | /** description */ |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4350 | N_("Jabber Protocol Plugin"), |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4351 | NULL, /**< author */ |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4352 | WEBSITE, /**< homepage */ |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4353 | |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4354 | NULL, /**< load */ |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4355 | NULL, /**< unload */ |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4356 | NULL, /**< destroy */ |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4357 | |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4358 | NULL, /**< ui_info */ |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4359 | &prpl_info /**< extra_info */ |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4360 | }; |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4361 | |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4362 | static void |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4363 | __init_plugin(GaimPlugin *plugin) |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4364 | { |
| 3572 | 4365 | struct proto_user_opt *puo; |
|
5205
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4366 | struct proto_user_split *pus; |
|
4508
3b98688619fc
[gaim-migrate @ 4784]
Christian Hammond <chipx86@chipx86.com>
parents:
4491
diff
changeset
|
4367 | |
| 4966 | 4368 | pus = g_new0(struct proto_user_split, 1); |
| 4369 | pus->sep = '@'; | |
| 4370 | pus->label = g_strdup(_("Server:")); | |
| 4371 | pus->def = g_strdup("jabber.org"); | |
|
5205
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4372 | prpl_info.user_splits = g_list_append(prpl_info.user_splits, pus); |
| 4966 | 4373 | |
| 4374 | pus = g_new0(struct proto_user_split, 1); | |
| 4375 | pus->sep = '/'; | |
| 4376 | pus->label = g_strdup(_("Resource:")); | |
| 4377 | pus->def = g_strdup("Gaim"); | |
|
5205
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4378 | prpl_info.user_splits = g_list_append(prpl_info.user_splits, pus); |
| 4966 | 4379 | |
| 3572 | 4380 | puo = g_new0(struct proto_user_opt, 1); |
| 4591 | 4381 | puo->label = g_strdup(_("Port:")); |
| 4927 | 4382 | puo->def = g_strdup_printf("%d", DEFAULT_PORT); |
| 4591 | 4383 | puo->pos = USEROPT_PORT; |
|
5205
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4384 | prpl_info.user_opts = g_list_append(prpl_info.user_opts, puo); |
| 4591 | 4385 | |
| 4386 | puo = g_new0(struct proto_user_opt, 1); | |
| 4917 | 4387 | puo->label = g_strdup(_("Connect Server:")); |
|
4589
e6d7d19da849
[gaim-migrate @ 4873]
Björn Voigt <bjoern@cs.tu-berlin.de>
parents:
4538
diff
changeset
|
4388 | puo->def = g_strdup(""); |
|
e6d7d19da849
[gaim-migrate @ 4873]
Björn Voigt <bjoern@cs.tu-berlin.de>
parents:
4538
diff
changeset
|
4389 | puo->pos = USEROPT_CONN_SERVER; |
|
5205
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4390 | prpl_info.user_opts = g_list_append(prpl_info.user_opts, puo); |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4391 | |
|
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4392 | my_protocol = plugin; |
| 2086 | 4393 | } |
| 4394 | ||
|
5205
242b8aa81328
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5174
diff
changeset
|
4395 | GAIM_INIT_PLUGIN(jabber, __init_plugin, info); |