annotate src/protocols/sametime/meanwhile/session.c @ 12468:6faefbebcd24

[gaim-migrate @ 14778] SF Patch #1372898 from charkins "This patch updates the unseen conversation api in gtkconv to ensure consistancy and avoid code duplication. The ...first_unseen() function is renamed and expanded to return a list of conversations that match the specified criteria. A max_count parameter is used to allow this to short circuit early (using 1 gives old behavior). An additional flag was added to allow this function to only consider hidden conversations (used by the buddy list). The blist is currently inconsistant in which conversations it loops over for showing the menu tray icon, creating the tooltip and the unseen menu. This patch fixes that. The ...find_unseen_list() now handles contact-aware conversations correctly as well (based on sadrul's patches in #1362579 which are obsoleted by this patch). I also included the fix from #1362579 which increments unseen_count only when state>=UNSEEN_TEXT." committer: Tailor Script <tailor@pidgin.im>
author Richard Laager <rlaager@wiktel.com>
date Mon, 12 Dec 2005 18:59:29 +0000
parents a2ebf585d8c6
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10969
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
2 /*
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
3 Meanwhile - Unofficial Lotus Sametime Community Client Library
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
4 Copyright (C) 2004 Christopher (siege) O'Brien
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
5
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
6 This library is free software; you can redistribute it and/or
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
7 modify it under the terms of the GNU Library General Public
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
8 License as published by the Free Software Foundation; either
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
9 version 2 of the License, or (at your option) any later version.
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
10
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
11 This library is distributed in the hope that it will be useful,
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
14 Library General Public License for more details.
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
15
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
16 You should have received a copy of the GNU Library General Public
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
17 License along with this library; if not, write to the Free
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
19 */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
20
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
21 #include <glib.h>
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
22 #include <string.h>
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
23
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
24 #include "mw_channel.h"
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
25 #include "mw_cipher.h"
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
26 #include "mw_debug.h"
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
27 #include "mw_error.h"
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
28 #include "mw_message.h"
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
29 #include "mw_service.h"
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
30 #include "mw_session.h"
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
31 #include "mw_util.h"
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
32
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
33
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
34 /** the hash table key for a service, for mwSession::services */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
35 #define SERVICE_KEY(srvc) mwService_getType(srvc)
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
36
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
37 /** the hash table key for a cipher, for mwSession::ciphers */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
38 #define CIPHER_KEY(ciph) mwCipher_getType(ciph)
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
39
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
40
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
41 #define GPOINTER(val) (GUINT_TO_POINTER((guint) (val)))
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
42 #define GUINT(val) (GPOINTER_TO_UINT((val)))
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
43
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
44
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
45 struct mwSession {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
46
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
47 /** provides I/O and callback functions */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
48 struct mwSessionHandler *handler;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
49
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
50 enum mwSessionState state; /**< session state */
11943
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
51 gpointer state_info; /**< additional state info */
10969
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
52
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
53 /* input buffering for an incoming message */
12311
a2ebf585d8c6 [gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents: 12261
diff changeset
54 guchar *buf; /**< buffer for incoming message data */
a2ebf585d8c6 [gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents: 12261
diff changeset
55 gsize buf_len; /**< length of buf */
a2ebf585d8c6 [gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents: 12261
diff changeset
56 gsize buf_used; /**< offset to last-used byte of buf */
10969
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
57
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
58 struct mwLoginInfo login; /**< login information */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
59 struct mwUserStatus status; /**< user status */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
60 struct mwPrivacyInfo privacy; /**< privacy list */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
61
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
62 /** the collection of channels */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
63 struct mwChannelSet *channels;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
64
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
65 /** the collection of services, keyed to guint32 service id */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
66 GHashTable *services;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
67
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
68 /** the collection of ciphers, keyed to guint16 cipher type */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
69 GHashTable *ciphers;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
70
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
71 /** arbitrary key:value pairs */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
72 GHashTable *attributes;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
73
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
74 /** optional user data */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
75 struct mw_datum client_data;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
76 };
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
77
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
78
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
79 static void property_set(struct mwSession *s, const char *key,
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
80 gpointer val, GDestroyNotify clean) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
81
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
82 g_hash_table_insert(s->attributes, g_strdup(key),
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
83 mw_datum_new(val, clean));
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
84 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
85
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
86
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
87 static gpointer property_get(struct mwSession *s, const char *key) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
88 struct mw_datum *p = g_hash_table_lookup(s->attributes, key);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
89 return p? p->data: NULL;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
90 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
91
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
92
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
93 static void property_del(struct mwSession *s, const char *key) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
94 g_hash_table_remove(s->attributes, key);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
95 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
96
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
97
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
98 /**
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
99 set up the default properties for a newly created session
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
100 */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
101 static void session_defaults(struct mwSession *s) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
102 property_set(s, mwSession_CLIENT_VER_MAJOR,
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
103 GPOINTER(MW_PROTOCOL_VERSION_MAJOR), NULL);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
104
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
105 property_set(s, mwSession_CLIENT_VER_MINOR,
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
106 GPOINTER(MW_PROTOCOL_VERSION_MINOR), NULL);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
107
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
108 property_set(s, mwSession_CLIENT_TYPE_ID,
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
109 GPOINTER(mwLogin_MEANWHILE), NULL);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
110 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
111
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
112
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
113 struct mwSession *mwSession_new(struct mwSessionHandler *handler) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
114 struct mwSession *s;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
115
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
116 g_return_val_if_fail(handler != NULL, NULL);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
117
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
118 /* consider io_write and io_close to be absolute necessities */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
119 g_return_val_if_fail(handler->io_write != NULL, NULL);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
120 g_return_val_if_fail(handler->io_close != NULL, NULL);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
121
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
122 s = g_new0(struct mwSession, 1);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
123
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
124 s->state = mwSession_STOPPED;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
125
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
126 s->handler = handler;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
127
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
128 s->channels = mwChannelSet_new(s);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
129 s->services = map_guint_new();
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
130 s->ciphers = map_guint_new();
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
131
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
132 s->attributes = g_hash_table_new_full(g_str_hash, g_str_equal, g_free,
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
133 (GDestroyNotify) mw_datum_free);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
134
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
135 session_defaults(s);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
136
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
137 return s;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
138 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
139
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
140
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
141 /** free and reset the session buffer */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
142 static void session_buf_free(struct mwSession *s) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
143 g_return_if_fail(s != NULL);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
144
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
145 g_free(s->buf);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
146 s->buf = NULL;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
147 s->buf_len = 0;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
148 s->buf_used = 0;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
149 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
150
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
151
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
152 /** a polite string version of the session state enum */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
153 static const char *state_str(enum mwSessionState state) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
154 switch(state) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
155 case mwSession_STARTING: return "starting";
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
156 case mwSession_HANDSHAKE: return "handshake sent";
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
157 case mwSession_HANDSHAKE_ACK: return "handshake acknowledged";
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
158 case mwSession_LOGIN: return "login sent";
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
159 case mwSession_LOGIN_REDIR: return "login redirected";
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
160 case mwSession_LOGIN_CONT: return "forcing login";
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
161 case mwSession_LOGIN_ACK: return "login acknowledged";
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
162 case mwSession_STARTED: return "started";
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
163 case mwSession_STOPPING: return "stopping";
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
164 case mwSession_STOPPED: return "stopped";
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
165
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
166 case mwSession_UNKNOWN: /* fall-through */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
167 default: return "UNKNOWN";
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
168 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
169 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
170
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
171
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
172 void mwSession_free(struct mwSession *s) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
173 struct mwSessionHandler *h;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
174
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
175 g_return_if_fail(s != NULL);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
176
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
177 if(! mwSession_isStopped(s)) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
178 g_debug("session is not stopped (state: %s), proceeding with free",
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
179 state_str(s->state));
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
180 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
181
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
182 h = s->handler;
12311
a2ebf585d8c6 [gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents: 12261
diff changeset
183 if(h && h->clear) h->clear(s);
10969
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
184 s->handler = NULL;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
185
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
186 session_buf_free(s);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
187
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
188 mwChannelSet_free(s->channels);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
189 g_hash_table_destroy(s->services);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
190 g_hash_table_destroy(s->ciphers);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
191 g_hash_table_destroy(s->attributes);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
192
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
193 mwLoginInfo_clear(&s->login);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
194 mwUserStatus_clear(&s->status);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
195 mwPrivacyInfo_clear(&s->privacy);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
196
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
197 g_free(s);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
198 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
199
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
200
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
201 /** write data to the session handler */
12311
a2ebf585d8c6 [gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents: 12261
diff changeset
202 static int io_write(struct mwSession *s, const guchar *buf, gsize len) {
10969
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
203 g_return_val_if_fail(s != NULL, -1);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
204 g_return_val_if_fail(s->handler != NULL, -1);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
205 g_return_val_if_fail(s->handler->io_write != NULL, -1);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
206
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
207 return s->handler->io_write(s, buf, len);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
208 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
209
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
210
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
211 /** close the session handler */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
212 static void io_close(struct mwSession *s) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
213 g_return_if_fail(s != NULL);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
214 g_return_if_fail(s->handler != NULL);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
215 g_return_if_fail(s->handler->io_close != NULL);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
216
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
217 s->handler->io_close(s);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
218 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
219
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
220
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
221 static void state(struct mwSession *s, enum mwSessionState state,
11943
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
222 gpointer info) {
10969
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
223
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
224 struct mwSessionHandler *sh;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
225
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
226 g_return_if_fail(s != NULL);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
227 g_return_if_fail(s->handler != NULL);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
228
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
229 if(mwSession_isState(s, state)) return;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
230
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
231 s->state = state;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
232 s->state_info = info;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
233
11943
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
234 switch(state) {
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
235 case mwSession_STOPPING:
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
236 case mwSession_STOPPED:
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
237 g_message("session state: %s (0x%08x)", state_str(state),
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
238 GPOINTER_TO_UINT(info));
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
239 break;
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
240
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
241 case mwSession_LOGIN_REDIR:
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
242 g_message("session state: %s (%s)", state_str(state),
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
243 (char *)info);
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
244 break;
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
245
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
246 default:
10969
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
247 g_message("session state: %s", state_str(state));
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
248 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
249
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
250 sh = s->handler;
11943
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
251 if(sh && sh->on_stateChange)
10969
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
252 sh->on_stateChange(s, state, info);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
253 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
254
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
255
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
256 void mwSession_start(struct mwSession *s) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
257 struct mwMsgHandshake *msg;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
258 int ret;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
259
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
260 g_return_if_fail(s != NULL);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
261 g_return_if_fail(mwSession_isStopped(s));
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
262
11943
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
263 if(mwSession_isStarted(s) || mwSession_isStarting(s)) {
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
264 g_debug("attempted to start session that is already started/starting");
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
265 return;
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
266 }
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
267
10969
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
268 state(s, mwSession_STARTING, 0);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
269
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
270 msg = (struct mwMsgHandshake *) mwMessage_new(mwMessage_HANDSHAKE);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
271 msg->major = GUINT(property_get(s, mwSession_CLIENT_VER_MAJOR));
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
272 msg->minor = GUINT(property_get(s, mwSession_CLIENT_VER_MINOR));
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
273 msg->login_type = GUINT(property_get(s, mwSession_CLIENT_TYPE_ID));
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
274
11943
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
275 msg->loclcalc_addr = GUINT(property_get(s, mwSession_CLIENT_IP));
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
276
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
277 if(msg->major >= 0x001e && msg->minor >= 0x001d) {
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
278 msg->unknown_a = 0x0100;
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
279 msg->local_host = (char *) property_get(s, mwSession_CLIENT_HOST);
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
280 }
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
281
10969
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
282 ret = mwSession_send(s, MW_MESSAGE(msg));
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
283 mwMessage_free(MW_MESSAGE(msg));
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
284
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
285 if(ret) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
286 mwSession_stop(s, CONNECTION_BROKEN);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
287 } else {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
288 state(s, mwSession_HANDSHAKE, 0);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
289 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
290 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
291
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
292
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
293 void mwSession_stop(struct mwSession *s, guint32 reason) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
294 GList *list, *l = NULL;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
295 struct mwMsgChannelDestroy *msg;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
296
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
297 g_return_if_fail(s != NULL);
11943
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
298
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
299 if(mwSession_isStopped(s) || mwSession_isStopping(s)) {
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
300 g_debug("attempted to stop session that is already stopped/stopping");
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
301 return;
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
302 }
10969
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
303
11943
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
304 state(s, mwSession_STOPPING, GUINT_TO_POINTER(reason));
10969
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
305
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
306 for(list = l = mwSession_getServices(s); l; l = l->next)
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
307 mwService_stop(MW_SERVICE(l->data));
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
308 g_list_free(list);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
309
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
310 msg = (struct mwMsgChannelDestroy *)
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
311 mwMessage_new(mwMessage_CHANNEL_DESTROY);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
312
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
313 msg->head.channel = MW_MASTER_CHANNEL_ID;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
314 msg->reason = reason;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
315
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
316 /* don't care if this fails, we're closing the connection anyway */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
317 mwSession_send(s, MW_MESSAGE(msg));
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
318 mwMessage_free(MW_MESSAGE(msg));
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
319
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
320 session_buf_free(s);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
321
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
322 /* close the connection */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
323 io_close(s);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
324
11943
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
325 state(s, mwSession_STOPPED, GUINT_TO_POINTER(reason));
10969
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
326 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
327
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
328
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
329 /** compose authentication information into an opaque based on the
11943
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
330 password, encrypted via RC2/40 */
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
331 static void compose_auth_rc2_40(struct mwOpaque *auth, const char *pass) {
12311
a2ebf585d8c6 [gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents: 12261
diff changeset
332 guchar iv[8], key[5];
10969
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
333 struct mwOpaque a, b, z;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
334 struct mwPutBuffer *p;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
335
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
336 /* get an IV and a random five-byte key */
12311
a2ebf585d8c6 [gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents: 12261
diff changeset
337 mwIV_init(iv);
a2ebf585d8c6 [gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents: 12261
diff changeset
338 mwKeyRandom(key, 5);
10969
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
339
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
340 /* the opaque with the key */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
341 a.len = 5;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
342 a.data = key;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
343
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
344 /* the opaque to receive the encrypted pass */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
345 b.len = 0;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
346 b.data = NULL;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
347
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
348 /* the plain-text pass dressed up as an opaque */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
349 z.len = strlen(pass);
12311
a2ebf585d8c6 [gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents: 12261
diff changeset
350 z.data = (guchar *) pass;
10969
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
351
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
352 /* the opaque with the encrypted pass */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
353 mwEncrypt(a.data, a.len, iv, &z, &b);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
354
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
355 /* an opaque containing the other two opaques */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
356 p = mwPutBuffer_new();
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
357 mwOpaque_put(p, &a);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
358 mwOpaque_put(p, &b);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
359 mwPutBuffer_finalize(auth, p);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
360
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
361 /* this is the only one to clear, as the other uses a static buffer */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
362 mwOpaque_clear(&b);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
363 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
364
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
365
11943
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
366 static void compose_auth_rc2_128(struct mwOpaque *auth, const char *pass,
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
367 guint32 magic, struct mwOpaque *rkey) {
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
368
12311
a2ebf585d8c6 [gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents: 12261
diff changeset
369 guchar iv[8];
11943
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
370 struct mwOpaque a, b, c;
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
371 struct mwPutBuffer *p;
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
372
12261
2edf5dc1b2ea [gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents: 11943
diff changeset
373 struct mwMpi *private, *public;
2edf5dc1b2ea [gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents: 11943
diff changeset
374 struct mwMpi *remote;
2edf5dc1b2ea [gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents: 11943
diff changeset
375 struct mwMpi *shared;
11943
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
376
12261
2edf5dc1b2ea [gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents: 11943
diff changeset
377 private = mwMpi_new();
2edf5dc1b2ea [gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents: 11943
diff changeset
378 public = mwMpi_new();
2edf5dc1b2ea [gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents: 11943
diff changeset
379 remote = mwMpi_new();
2edf5dc1b2ea [gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents: 11943
diff changeset
380 shared = mwMpi_new();
11943
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
381
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
382 mwIV_init(iv);
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
383
12261
2edf5dc1b2ea [gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents: 11943
diff changeset
384 mwMpi_randDHKeypair(private, public);
2edf5dc1b2ea [gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents: 11943
diff changeset
385 mwMpi_import(remote, rkey);
2edf5dc1b2ea [gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents: 11943
diff changeset
386 mwMpi_calculateDHShared(shared, remote, private);
11943
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
387
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
388 /* put the password in opaque a */
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
389 p = mwPutBuffer_new();
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
390 guint32_put(p, magic);
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
391 mwString_put(p, pass);
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
392 mwPutBuffer_finalize(&a, p);
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
393
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
394 /* put the shared key in opaque b */
12261
2edf5dc1b2ea [gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents: 11943
diff changeset
395 mwMpi_export(shared, &b);
11943
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
396
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
397 /* encrypt the password (a) using the shared key (b), put the result
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
398 in opaque c */
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
399 mwEncrypt(b.data+(b.len-16), 16, iv, &a, &c);
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
400
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
401 /* don't need the shared key anymore, re-use opaque (b) as the
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
402 export of the public key */
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
403 mwOpaque_clear(&b);
12261
2edf5dc1b2ea [gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents: 11943
diff changeset
404 mwMpi_export(public, &b);
11943
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
405
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
406 p = mwPutBuffer_new();
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
407 guint16_put(p, 0x0001); /* XXX: unknown */
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
408 mwOpaque_put(p, &b);
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
409 mwOpaque_put(p, &c);
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
410 mwPutBuffer_finalize(auth, p);
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
411
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
412 mwOpaque_clear(&a);
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
413 mwOpaque_clear(&b);
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
414 mwOpaque_clear(&c);
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
415
12261
2edf5dc1b2ea [gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents: 11943
diff changeset
416 mwMpi_free(private);
2edf5dc1b2ea [gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents: 11943
diff changeset
417 mwMpi_free(public);
2edf5dc1b2ea [gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents: 11943
diff changeset
418 mwMpi_free(remote);
2edf5dc1b2ea [gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents: 11943
diff changeset
419 mwMpi_free(shared);
11943
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
420 }
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
421
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
422
10969
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
423 /** handle the receipt of a handshake_ack message by sending the login
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
424 message */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
425 static void HANDSHAKE_ACK_recv(struct mwSession *s,
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
426 struct mwMsgHandshakeAck *msg) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
427 struct mwMsgLogin *log;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
428 int ret;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
429
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
430 g_return_if_fail(s != NULL);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
431 g_return_if_fail(msg != NULL);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
432 g_return_if_fail(mwSession_isState(s, mwSession_HANDSHAKE) ||
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
433 mwSession_isState(s, mwSession_LOGIN_CONT));
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
434
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
435 if(mwSession_isState(s, mwSession_LOGIN_CONT)) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
436 /* this is a login continuation, don't re-send the login. We
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
437 should receive a login ack in a moment */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
438
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
439 state(s, mwSession_HANDSHAKE_ACK, 0);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
440 state(s, mwSession_LOGIN, 0);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
441 return;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
442
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
443 } else {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
444 state(s, mwSession_HANDSHAKE_ACK, 0);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
445 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
446
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
447 /* record the major/minor versions from the server */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
448 property_set(s, mwSession_SERVER_VER_MAJOR, GPOINTER(msg->major), NULL);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
449 property_set(s, mwSession_SERVER_VER_MINOR, GPOINTER(msg->minor), NULL);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
450
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
451 /* compose the login message */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
452 log = (struct mwMsgLogin *) mwMessage_new(mwMessage_LOGIN);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
453 log->login_type = GUINT(property_get(s, mwSession_CLIENT_TYPE_ID));
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
454 log->name = g_strdup(property_get(s, mwSession_AUTH_USER_ID));
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
455
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
456 /** @todo default to password for now. later use token optionally */
11943
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
457 {
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
458 const char *pw;
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
459 pw = (const char *) property_get(s, mwSession_AUTH_PASSWORD);
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
460
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
461 if(msg->data.len >= 64) {
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
462 /* good login encryption */
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
463 log->auth_type = mwAuthType_RC2_128;
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
464 compose_auth_rc2_128(&log->auth_data, pw, msg->magic, &msg->data);
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
465
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
466 } else {
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
467 /* BAD login encryption */
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
468 log->auth_type = mwAuthType_RC2_40;
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
469 compose_auth_rc2_40(&log->auth_data, pw);
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
470 }
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
471 }
10969
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
472
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
473 /* send the login message */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
474 ret = mwSession_send(s, MW_MESSAGE(log));
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
475 mwMessage_free(MW_MESSAGE(log));
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
476
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
477 if(! ret) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
478 /* sent login OK, set state appropriately */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
479 state(s, mwSession_LOGIN, 0);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
480 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
481 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
482
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
483
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
484 /** handle the receipt of a login_ack message. This completes the
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
485 startup sequence for the session */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
486 static void LOGIN_ACK_recv(struct mwSession *s,
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
487 struct mwMsgLoginAck *msg) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
488 GList *ll, *l;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
489
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
490 g_return_if_fail(s != NULL);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
491 g_return_if_fail(msg != NULL);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
492 g_return_if_fail(mwSession_isState(s, mwSession_LOGIN));
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
493
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
494 /* store the login information in the session */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
495 mwLoginInfo_clear(&s->login);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
496 mwLoginInfo_clone(&s->login, &msg->login);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
497
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
498 state(s, mwSession_LOGIN_ACK, 0);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
499
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
500 /* start up our services */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
501 for(ll = l = mwSession_getServices(s); l; l = l->next) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
502 mwService_start(l->data);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
503 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
504 g_list_free(ll);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
505
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
506 /* @todo any further startup stuff? */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
507
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
508 state(s, mwSession_STARTED, 0);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
509 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
510
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
511
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
512 static void CHANNEL_CREATE_recv(struct mwSession *s,
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
513 struct mwMsgChannelCreate *msg) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
514 struct mwChannel *chan;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
515 chan = mwChannel_newIncoming(s->channels, msg->channel);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
516
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
517 /* hand off to channel */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
518 mwChannel_recvCreate(chan, msg);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
519 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
520
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
521
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
522 static void CHANNEL_ACCEPT_recv(struct mwSession *s,
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
523 struct mwMsgChannelAccept *msg) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
524 struct mwChannel *chan;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
525 chan = mwChannel_find(s->channels, msg->head.channel);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
526
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
527 g_return_if_fail(chan != NULL);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
528
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
529 /* hand off to channel */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
530 mwChannel_recvAccept(chan, msg);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
531 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
532
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
533
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
534 static void CHANNEL_DESTROY_recv(struct mwSession *s,
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
535 struct mwMsgChannelDestroy *msg) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
536
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
537 /* the server can indicate that we should close the session by
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
538 destroying the zero channel */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
539 if(msg->head.channel == MW_MASTER_CHANNEL_ID) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
540 mwSession_stop(s, msg->reason);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
541
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
542 } else {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
543 struct mwChannel *chan;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
544 chan = mwChannel_find(s->channels, msg->head.channel);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
545
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
546 /* we don't have any such channel... so I guess we destroyed it.
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
547 This is to remove a warning from timing errors when two clients
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
548 both try to close a channel at about the same time. */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
549 if(! chan) return;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
550
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
551 /* hand off to channel */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
552 mwChannel_recvDestroy(chan, msg);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
553 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
554 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
555
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
556
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
557 static void CHANNEL_SEND_recv(struct mwSession *s,
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
558 struct mwMsgChannelSend *msg) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
559 struct mwChannel *chan;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
560 chan = mwChannel_find(s->channels, msg->head.channel);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
561
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
562 /* if we don't have any such channel, we're certainly not going to
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
563 accept data from it */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
564 if(! chan) return;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
565
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
566 /* hand off to channel */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
567 mwChannel_recv(chan, msg);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
568 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
569
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
570
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
571 static void SET_PRIVACY_LIST_recv(struct mwSession *s,
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
572 struct mwMsgSetPrivacyList *msg) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
573 struct mwSessionHandler *sh = s->handler;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
574
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
575 g_info("SET_PRIVACY_LIST");
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
576
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
577 mwPrivacyInfo_clear(&s->privacy);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
578 mwPrivacyInfo_clone(&s->privacy, &msg->privacy);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
579
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
580 if(sh && sh->on_setPrivacyInfo)
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
581 sh->on_setPrivacyInfo(s);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
582 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
583
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
584
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
585 static void SET_USER_STATUS_recv(struct mwSession *s,
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
586 struct mwMsgSetUserStatus *msg) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
587 struct mwSessionHandler *sh = s->handler;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
588
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
589 mwUserStatus_clear(&s->status);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
590 mwUserStatus_clone(&s->status, &msg->status);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
591
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
592 if(sh && sh->on_setUserStatus)
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
593 sh->on_setUserStatus(s);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
594 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
595
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
596
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
597 static void SENSE_SERVICE_recv(struct mwSession *s,
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
598 struct mwMsgSenseService *msg) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
599 struct mwService *srvc;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
600
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
601 srvc = mwSession_getService(s, msg->service);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
602 if(srvc) mwService_start(srvc);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
603 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
604
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
605
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
606 static void ADMIN_recv(struct mwSession *s, struct mwMsgAdmin *msg) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
607 struct mwSessionHandler *sh = s->handler;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
608
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
609 if(sh && sh->on_admin)
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
610 sh->on_admin(s, msg->text);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
611 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
612
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
613
11943
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
614 static void ANNOUNCE_recv(struct mwSession *s, struct mwMsgAnnounce *msg) {
10969
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
615 struct mwSessionHandler *sh = s->handler;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
616
11943
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
617 if(sh && sh->on_announce)
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
618 sh->on_announce(s, &msg->sender, msg->may_reply, msg->text);
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
619 }
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
620
10969
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
621
11943
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
622 static void LOGIN_REDIRECT_recv(struct mwSession *s,
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
623 struct mwMsgLoginRedirect *msg) {
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
624
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
625 state(s, mwSession_LOGIN_REDIR, msg->host);
10969
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
626 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
627
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
628
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
629 #define CASE(var, type) \
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
630 case mwMessage_ ## var: \
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
631 var ## _recv(s, (struct type *) msg); \
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
632 break;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
633
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
634
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
635 static void session_process(struct mwSession *s,
12311
a2ebf585d8c6 [gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents: 12261
diff changeset
636 const guchar *buf, gsize len) {
10969
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
637
12311
a2ebf585d8c6 [gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents: 12261
diff changeset
638 struct mwOpaque o = { .len = len, .data = (guchar *) buf };
10969
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
639 struct mwGetBuffer *b;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
640 struct mwMessage *msg;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
641
11291
57fccea36e36 [gaim-migrate @ 13491]
Mark Doliner <mark@kingant.net>
parents: 10969
diff changeset
642 g_return_if_fail(s != NULL);
10969
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
643 g_return_if_fail(buf != NULL);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
644
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
645 /* ignore zero-length messages */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
646 if(len == 0) return;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
647
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
648 /* wrap up buf */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
649 b = mwGetBuffer_wrap(&o);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
650
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
651 /* attempt to parse the message. */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
652 msg = mwMessage_get(b);
11943
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
653
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
654 if(mwGetBuffer_error(b)) {
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
655 mw_mailme_opaque(&o, "parsing of message failed");
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
656 }
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
657
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
658 mwGetBuffer_free(b);
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
659
10969
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
660 g_return_if_fail(msg != NULL);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
661
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
662 /* handle each of the appropriate incoming types of mwMessage */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
663 switch(msg->type) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
664 CASE(HANDSHAKE_ACK, mwMsgHandshakeAck);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
665 CASE(LOGIN_REDIRECT, mwMsgLoginRedirect);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
666 CASE(LOGIN_ACK, mwMsgLoginAck);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
667 CASE(CHANNEL_CREATE, mwMsgChannelCreate);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
668 CASE(CHANNEL_DESTROY, mwMsgChannelDestroy);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
669 CASE(CHANNEL_SEND, mwMsgChannelSend);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
670 CASE(CHANNEL_ACCEPT, mwMsgChannelAccept);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
671 CASE(SET_PRIVACY_LIST, mwMsgSetPrivacyList);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
672 CASE(SET_USER_STATUS, mwMsgSetUserStatus);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
673 CASE(SENSE_SERVICE, mwMsgSenseService);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
674 CASE(ADMIN, mwMsgAdmin);
11943
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
675 CASE(ANNOUNCE, mwMsgAnnounce);
10969
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
676
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
677 default:
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
678 g_warning("unknown message type 0x%04x, no handler", msg->type);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
679 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
680
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
681 mwMessage_free(msg);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
682 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
683
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
684
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
685 #undef CASE
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
686
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
687
11943
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
688 #define ADVANCE(b, n, count) { b += count; n -= count; }
10969
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
689
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
690
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
691 /* handle input to complete an existing buffer */
12311
a2ebf585d8c6 [gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents: 12261
diff changeset
692 static gsize session_recv_cont(struct mwSession *s,
a2ebf585d8c6 [gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents: 12261
diff changeset
693 const guchar *b, gsize n) {
10969
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
694
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
695 /* determine how many bytes still required */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
696 gsize x = s->buf_len - s->buf_used;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
697
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
698 /* g_message(" session_recv_cont: session = %p, b = %p, n = %u",
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
699 s, b, n); */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
700
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
701 if(n < x) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
702 /* not quite enough; still need some more */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
703 memcpy(s->buf+s->buf_used, b, n);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
704 s->buf_used += n;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
705 return 0;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
706
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
707 } else {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
708 /* enough to finish the buffer, at least */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
709 memcpy(s->buf+s->buf_used, b, x);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
710 ADVANCE(b, n, x);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
711
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
712 if(s->buf_len == 4) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
713 /* if only the length bytes were being buffered, we'll now try
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
714 to complete an actual message */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
715
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
716 struct mwOpaque o = { 4, s->buf };
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
717 struct mwGetBuffer *gb = mwGetBuffer_wrap(&o);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
718 x = guint32_peek(gb);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
719 mwGetBuffer_free(gb);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
720
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
721 if(n < x) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
722 /* there isn't enough to meet the demands of the length, so
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
723 we'll buffer it for next time */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
724
12311
a2ebf585d8c6 [gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents: 12261
diff changeset
725 guchar *t;
10969
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
726 x += 4;
12311
a2ebf585d8c6 [gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents: 12261
diff changeset
727 t = (guchar *) g_malloc(x);
10969
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
728 memcpy(t, s->buf, 4);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
729 memcpy(t+4, b, n);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
730
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
731 session_buf_free(s);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
732
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
733 s->buf = t;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
734 s->buf_len = x;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
735 s->buf_used = n + 4;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
736 return 0;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
737
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
738 } else {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
739 /* there's enough (maybe more) for a full message. don't need
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
740 the old session buffer (which recall, was only the length
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
741 bytes) any more */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
742
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
743 session_buf_free(s);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
744 session_process(s, b, x);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
745 ADVANCE(b, n, x);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
746 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
747
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
748 } else {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
749 /* process the now-complete buffer. remember to skip the first
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
750 four bytes, since they're just the size count */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
751 session_process(s, s->buf+4, s->buf_len-4);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
752 session_buf_free(s);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
753 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
754 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
755
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
756 return n;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
757 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
758
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
759
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
760 /* handle input when there's nothing previously buffered */
12311
a2ebf585d8c6 [gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents: 12261
diff changeset
761 static gsize session_recv_empty(struct mwSession *s,
a2ebf585d8c6 [gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents: 12261
diff changeset
762 const guchar *b, gsize n) {
a2ebf585d8c6 [gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents: 12261
diff changeset
763
a2ebf585d8c6 [gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents: 12261
diff changeset
764 struct mwOpaque o = { n, (guchar *) b };
10969
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
765 struct mwGetBuffer *gb;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
766 gsize x;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
767
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
768 if(n < 4) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
769 /* uh oh. less than four bytes means we've got an incomplete
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
770 length indicator. Have to buffer to get the rest of it. */
12311
a2ebf585d8c6 [gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents: 12261
diff changeset
771 s->buf = (guchar *) g_malloc0(4);
10969
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
772 memcpy(s->buf, b, n);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
773 s->buf_len = 4;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
774 s->buf_used = n;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
775 return 0;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
776 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
777
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
778 /* peek at the length indicator. if it's a zero length message,
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
779 don't process, just skip it */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
780 gb = mwGetBuffer_wrap(&o);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
781 x = guint32_peek(gb);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
782 mwGetBuffer_free(gb);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
783 if(! x) return n - 4;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
784
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
785 if(n < (x + 4)) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
786 /* if the total amount of data isn't enough to cover the length
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
787 bytes and the length indicated by those bytes, then we'll need
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
788 to buffer. This is where the DOS mentioned below in
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
789 session_recv takes place */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
790
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
791 x += 4;
12311
a2ebf585d8c6 [gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents: 12261
diff changeset
792 s->buf = (guchar *) g_malloc(x);
10969
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
793 memcpy(s->buf, b, n);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
794 s->buf_len = x;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
795 s->buf_used = n;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
796 return 0;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
797
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
798 } else {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
799 /* advance past length bytes */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
800 ADVANCE(b, n, 4);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
801
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
802 /* process and advance */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
803 session_process(s, b, x);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
804 ADVANCE(b, n, x);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
805
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
806 /* return left-over count */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
807 return n;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
808 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
809 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
810
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
811
12311
a2ebf585d8c6 [gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents: 12261
diff changeset
812 static gsize session_recv(struct mwSession *s,
a2ebf585d8c6 [gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents: 12261
diff changeset
813 const guchar *b, gsize n) {
a2ebf585d8c6 [gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents: 12261
diff changeset
814
10969
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
815 /* This is messy and kind of confusing. I'd like to simplify it at
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
816 some point, but the constraints are as follows:
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
817
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
818 - buffer up to a single full message on the session buffer
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
819 - buffer must contain the four length bytes
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
820 - the four length bytes indicate how much we'll need to buffer
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
821 - the four length bytes might not arrive all at once, so it's
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
822 possible that we'll need to buffer to get them.
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
823 - since our buffering includes the length bytes, we know we
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
824 still have an incomplete length if the buffer length is only
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
825 four. */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
826
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
827 /** @todo we should allow a compiled-in upper limit to message
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
828 sizes, and just drop messages over that size. However, to do that
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
829 we'd need to keep track of the size of a message and keep
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
830 dropping bytes until we'd fulfilled the entire length. eg: if we
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
831 receive a message size of 10MB, we need to pass up exactly 10MB
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
832 before it's safe to start processing the rest as a new
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
833 message. As it stands, a malicious packet from the server can run
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
834 us out of memory by indicating it's going to send us some
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
835 obscenely long message (even if it never actually sends it) */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
836
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
837 /* g_message(" session_recv: session = %p, b = %p, n = %u",
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
838 s, b, n); */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
839
11943
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
840 if(s->buf_len == 0) {
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
841 while(n && (*b & 0x80)) {
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
842 /* keep-alive and series bytes are ignored */
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
843 ADVANCE(b, n, 1);
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
844 }
10969
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
845 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
846
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
847 if(n == 0) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
848 return 0;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
849
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
850 } else if(s->buf_len > 0) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
851 return session_recv_cont(s, b, n);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
852
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
853 } else {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
854 return session_recv_empty(s, b, n);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
855 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
856 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
857
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
858
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
859 #undef ADVANCE
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
860
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
861
12311
a2ebf585d8c6 [gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents: 12261
diff changeset
862 void mwSession_recv(struct mwSession *s, const guchar *buf, gsize n) {
a2ebf585d8c6 [gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents: 12261
diff changeset
863 guchar *b = (guchar *) buf;
10969
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
864 gsize remain = 0;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
865
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
866 g_return_if_fail(s != NULL);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
867
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
868 while(n > 0) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
869 remain = session_recv(s, b, n);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
870 b += (n - remain);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
871 n = remain;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
872 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
873 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
874
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
875
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
876 int mwSession_send(struct mwSession *s, struct mwMessage *msg) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
877 struct mwPutBuffer *b;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
878 struct mwOpaque o;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
879 int ret = 0;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
880
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
881 g_return_val_if_fail(s != NULL, -1);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
882
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
883 /* writing nothing is easy */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
884 if(! msg) return 0;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
885
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
886 /* first we render the message into an opaque */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
887 b = mwPutBuffer_new();
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
888 mwMessage_put(b, msg);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
889 mwPutBuffer_finalize(&o, b);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
890
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
891 /* then we render the opaque into... another opaque! */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
892 b = mwPutBuffer_new();
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
893 mwOpaque_put(b, &o);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
894 mwOpaque_clear(&o);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
895 mwPutBuffer_finalize(&o, b);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
896
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
897 /* then we use that opaque's data and length to write to the socket */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
898 ret = io_write(s, o.data, o.len);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
899 mwOpaque_clear(&o);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
900
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
901 /* ensure we could actually write the message */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
902 if(! ret) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
903
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
904 /* special case, as the server doesn't always respond to user
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
905 status messages. Thus, we trigger the event when we send the
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
906 messages as well as when we receive them */
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
907 if(msg->type == mwMessage_SET_USER_STATUS) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
908 SET_USER_STATUS_recv(s, (struct mwMsgSetUserStatus *) msg);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
909 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
910 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
911
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
912 return ret;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
913 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
914
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
915
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
916 int mwSession_sendKeepalive(struct mwSession *s) {
12311
a2ebf585d8c6 [gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents: 12261
diff changeset
917 const guchar b = 0x80;
10969
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
918
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
919 g_return_val_if_fail(s != NULL, -1);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
920 return io_write(s, &b, 1);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
921 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
922
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
923
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
924 int mwSession_forceLogin(struct mwSession *s) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
925 struct mwMsgLoginContinue *msg;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
926 int ret;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
927
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
928 g_return_val_if_fail(s != NULL, -1);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
929 g_return_val_if_fail(mwSession_isState(s, mwSession_LOGIN_REDIR), -1);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
930
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
931 state(s, mwSession_LOGIN_CONT, 0x00);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
932
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
933 msg = (struct mwMsgLoginContinue *)
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
934 mwMessage_new(mwMessage_LOGIN_CONTINUE);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
935
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
936 ret = mwSession_send(s, MW_MESSAGE(msg));
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
937 mwMessage_free(MW_MESSAGE(msg));
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
938
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
939 return ret;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
940 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
941
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
942
11943
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
943 int mwSession_sendAnnounce(struct mwSession *s, gboolean may_reply,
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
944 const char *text, const GList *recipients) {
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
945
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
946 struct mwMsgAnnounce *msg;
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
947 int ret;
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
948
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
949 g_return_val_if_fail(s != NULL, -1);
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
950 g_return_val_if_fail(mwSession_isStarted(s), -1);
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
951
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
952 msg = (struct mwMsgAnnounce *) mwMessage_new(mwMessage_ANNOUNCE);
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
953
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
954 msg->recipients = (GList *) recipients;
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
955 msg->may_reply = may_reply;
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
956 msg->text = g_strdup(text);
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
957
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
958 ret = mwSession_send(s, MW_MESSAGE(msg));
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
959
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
960 msg->recipients = NULL; /* don't kill our recipients param */
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
961 mwMessage_free(MW_MESSAGE(msg));
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
962
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
963 return ret;
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
964 }
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
965
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
966
10969
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
967 struct mwSessionHandler *mwSession_getHandler(struct mwSession *s) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
968 g_return_val_if_fail(s != NULL, NULL);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
969 return s->handler;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
970 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
971
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
972
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
973 struct mwLoginInfo *mwSession_getLoginInfo(struct mwSession *s) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
974 g_return_val_if_fail(s != NULL, NULL);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
975 return &s->login;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
976 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
977
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
978
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
979 int mwSession_setPrivacyInfo(struct mwSession *s,
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
980 struct mwPrivacyInfo *privacy) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
981
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
982 struct mwMsgSetPrivacyList *msg;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
983 int ret;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
984
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
985 g_return_val_if_fail(s != NULL, -1);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
986 g_return_val_if_fail(privacy != NULL, -1);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
987
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
988 msg = (struct mwMsgSetPrivacyList *)
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
989 mwMessage_new(mwMessage_SET_PRIVACY_LIST);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
990
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
991 mwPrivacyInfo_clone(&msg->privacy, privacy);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
992
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
993 ret = mwSession_send(s, MW_MESSAGE(msg));
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
994 mwMessage_free(MW_MESSAGE(msg));
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
995
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
996 return ret;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
997 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
998
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
999
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1000 struct mwPrivacyInfo *mwSession_getPrivacyInfo(struct mwSession *s) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1001 g_return_val_if_fail(s != NULL, NULL);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1002 return &s->privacy;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1003 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1004
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1005
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1006 int mwSession_setUserStatus(struct mwSession *s,
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1007 struct mwUserStatus *stat) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1008
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1009 struct mwMsgSetUserStatus *msg;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1010 int ret;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1011
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1012 g_return_val_if_fail(s != NULL, -1);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1013 g_return_val_if_fail(stat != NULL, -1);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1014
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1015 msg = (struct mwMsgSetUserStatus *)
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1016 mwMessage_new(mwMessage_SET_USER_STATUS);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1017
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1018 mwUserStatus_clone(&msg->status, stat);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1019
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1020 ret = mwSession_send(s, MW_MESSAGE(msg));
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1021 mwMessage_free(MW_MESSAGE(msg));
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1022
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1023 return ret;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1024 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1025
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1026
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1027 struct mwUserStatus *mwSession_getUserStatus(struct mwSession *s) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1028 g_return_val_if_fail(s != NULL, NULL);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1029 return &s->status;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1030 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1031
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1032
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1033 enum mwSessionState mwSession_getState(struct mwSession *s) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1034 g_return_val_if_fail(s != NULL, mwSession_UNKNOWN);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1035 return s->state;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1036 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1037
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1038
11943
0110fc7c6a8a [gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents: 11291
diff changeset
1039 gpointer mwSession_getStateInfo(struct mwSession *s) {
10969
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1040 g_return_val_if_fail(s != NULL, 0);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1041 return s->state_info;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1042 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1043
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1044
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1045 struct mwChannelSet *mwSession_getChannels(struct mwSession *session) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1046 g_return_val_if_fail(session != NULL, NULL);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1047 return session->channels;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1048 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1049
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1050
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1051 gboolean mwSession_addService(struct mwSession *s, struct mwService *srv) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1052 g_return_val_if_fail(s != NULL, FALSE);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1053 g_return_val_if_fail(srv != NULL, FALSE);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1054 g_return_val_if_fail(s->services != NULL, FALSE);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1055
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1056 if(map_guint_lookup(s->services, SERVICE_KEY(srv))) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1057 return FALSE;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1058
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1059 } else {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1060 map_guint_insert(s->services, SERVICE_KEY(srv), srv);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1061 if(mwSession_isState(s, mwSession_STARTED))
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1062 mwSession_senseService(s, mwService_getType(srv));
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1063 return TRUE;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1064 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1065 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1066
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1067
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1068 struct mwService *mwSession_getService(struct mwSession *s, guint32 srv) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1069 g_return_val_if_fail(s != NULL, NULL);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1070 g_return_val_if_fail(s->services != NULL, NULL);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1071
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1072 return map_guint_lookup(s->services, srv);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1073 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1074
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1075
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1076 struct mwService *mwSession_removeService(struct mwSession *s, guint32 srv) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1077 struct mwService *svc;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1078
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1079 g_return_val_if_fail(s != NULL, NULL);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1080 g_return_val_if_fail(s->services != NULL, NULL);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1081
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1082 svc = map_guint_lookup(s->services, srv);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1083 if(svc) map_guint_remove(s->services, srv);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1084 return svc;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1085 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1086
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1087
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1088 GList *mwSession_getServices(struct mwSession *s) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1089 g_return_val_if_fail(s != NULL, NULL);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1090 g_return_val_if_fail(s->services != NULL, NULL);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1091
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1092 return map_collect_values(s->services);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1093 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1094
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1095
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1096 void mwSession_senseService(struct mwSession *s, guint32 srvc) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1097 struct mwMsgSenseService *msg;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1098
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1099 g_return_if_fail(s != NULL);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1100 g_return_if_fail(srvc != 0x00);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1101 g_return_if_fail(mwSession_isStarted(s));
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1102
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1103 msg = (struct mwMsgSenseService *)
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1104 mwMessage_new(mwMessage_SENSE_SERVICE);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1105 msg->service = srvc;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1106
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1107 mwSession_send(s, MW_MESSAGE(msg));
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1108 mwMessage_free(MW_MESSAGE(msg));
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1109 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1110
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1111
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1112 gboolean mwSession_addCipher(struct mwSession *s, struct mwCipher *c) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1113 g_return_val_if_fail(s != NULL, FALSE);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1114 g_return_val_if_fail(c != NULL, FALSE);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1115 g_return_val_if_fail(s->ciphers != NULL, FALSE);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1116
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1117 if(map_guint_lookup(s->ciphers, mwCipher_getType(c))) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1118 g_message("cipher %s is already added, apparently",
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1119 NSTR(mwCipher_getName(c)));
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1120 return FALSE;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1121
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1122 } else {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1123 g_message("adding cipher %s", NSTR(mwCipher_getName(c)));
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1124 map_guint_insert(s->ciphers, mwCipher_getType(c), c);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1125 return TRUE;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1126 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1127 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1128
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1129
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1130 struct mwCipher *mwSession_getCipher(struct mwSession *s, guint16 c) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1131 g_return_val_if_fail(s != NULL, NULL);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1132 g_return_val_if_fail(s->ciphers != NULL, NULL);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1133
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1134 return map_guint_lookup(s->ciphers, c);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1135 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1136
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1137
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1138 struct mwCipher *mwSession_removeCipher(struct mwSession *s, guint16 c) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1139 struct mwCipher *ciph;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1140
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1141 g_return_val_if_fail(s != NULL, NULL);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1142 g_return_val_if_fail(s->ciphers != NULL, NULL);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1143
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1144 ciph = map_guint_lookup(s->ciphers, c);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1145 if(ciph) map_guint_remove(s->ciphers, c);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1146 return ciph;
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1147 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1148
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1149
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1150 GList *mwSession_getCiphers(struct mwSession *s) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1151 g_return_val_if_fail(s != NULL, NULL);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1152 g_return_val_if_fail(s->ciphers != NULL, NULL);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1153
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1154 return map_collect_values(s->ciphers);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1155 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1156
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1157
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1158 void mwSession_setProperty(struct mwSession *s, const char *key,
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1159 gpointer val, GDestroyNotify clean) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1160
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1161 g_return_if_fail(s != NULL);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1162 g_return_if_fail(s->attributes != NULL);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1163 g_return_if_fail(key != NULL);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1164
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1165 property_set(s, key, val, clean);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1166 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1167
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1168
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1169 gpointer mwSession_getProperty(struct mwSession *s, const char *key) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1170
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1171 g_return_val_if_fail(s != NULL, NULL);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1172 g_return_val_if_fail(s->attributes != NULL, NULL);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1173 g_return_val_if_fail(key != NULL, NULL);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1174
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1175 return property_get(s, key);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1176 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1177
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1178
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1179 void mwSession_removeProperty(struct mwSession *s, const char *key) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1180 g_return_if_fail(s != NULL);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1181 g_return_if_fail(s->attributes != NULL);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1182 g_return_if_fail(key != NULL);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1183
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1184 property_del(s, key);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1185 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1186
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1187
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1188 void mwSession_setClientData(struct mwSession *session,
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1189 gpointer data, GDestroyNotify clear) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1190
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1191 g_return_if_fail(session != NULL);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1192 mw_datum_set(&session->client_data, data, clear);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1193 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1194
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1195
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1196 gpointer mwSession_getClientData(struct mwSession *session) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1197 g_return_val_if_fail(session != NULL, NULL);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1198 return mw_datum_get(&session->client_data);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1199 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1200
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1201
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1202 void mwSession_removeClientData(struct mwSession *session) {
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1203 g_return_if_fail(session != NULL);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1204 mw_datum_clear(&session->client_data);
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1205 }
3ef77720e577 [gaim-migrate @ 12790]
Christopher O'Brien <siege@pidgin.im>
parents:
diff changeset
1206