Mercurial > pidgin.yaz
comparison libpurple/protocols/msnp9/transaction.c @ 21312:a07cfce78345
Add MSNP9 back as an alternative alongside the existing MSN prpl. Cowardly
old fools like me who prefer the stability of our MSNP9 code over the
features of MSNP14 can enable this using the --disable-msnp14 ./configure
option.
If we want to release from i.p.p and MSN stability is the only blocker, we
can trivially flick the default to use MSNP9 in configure.ac
author | Stu Tomlinson <stu@nosnilmot.com> |
---|---|
date | Sun, 11 Nov 2007 12:57:52 +0000 |
parents | |
children | 7f552614ec8a |
comparison
equal
deleted
inserted
replaced
21311:7d031cec5ba2 | 21312:a07cfce78345 |
---|---|
1 /** | |
2 * @file transaction.c MSN transaction functions | |
3 * | |
4 * purple | |
5 * | |
6 * Purple is the legal property of its developers, whose names are too numerous | |
7 * to list here. Please refer to the COPYRIGHT file distributed with this | |
8 * source distribution. | |
9 * | |
10 * This program is free software; you can redistribute it and/or modify | |
11 * it under the terms of the GNU General Public License as published by | |
12 * the Free Software Foundation; either version 2 of the License, or | |
13 * (at your option) any later version. | |
14 * | |
15 * This program is distributed in the hope that it will be useful, | |
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
18 * GNU General Public License for more details. | |
19 * | |
20 * You should have received a copy of the GNU General Public License | |
21 * along with this program; if not, write to the Free Software | |
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA | |
23 */ | |
24 #include "msn.h" | |
25 #include "transaction.h" | |
26 | |
27 MsnTransaction * | |
28 msn_transaction_new(MsnCmdProc *cmdproc, const char *command, | |
29 const char *format, ...) | |
30 { | |
31 MsnTransaction *trans; | |
32 va_list arg; | |
33 | |
34 g_return_val_if_fail(command != NULL, NULL); | |
35 | |
36 trans = g_new0(MsnTransaction, 1); | |
37 | |
38 trans->cmdproc = cmdproc; | |
39 trans->command = g_strdup(command); | |
40 | |
41 if (format != NULL) | |
42 { | |
43 va_start(arg, format); | |
44 trans->params = g_strdup_vprintf(format, arg); | |
45 va_end(arg); | |
46 } | |
47 | |
48 /* trans->queue = g_queue_new(); */ | |
49 | |
50 return trans; | |
51 } | |
52 | |
53 void | |
54 msn_transaction_destroy(MsnTransaction *trans) | |
55 { | |
56 g_return_if_fail(trans != NULL); | |
57 | |
58 g_free(trans->command); | |
59 g_free(trans->params); | |
60 g_free(trans->payload); | |
61 | |
62 #if 0 | |
63 if (trans->pendent_cmd != NULL) | |
64 msn_message_unref(trans->pendent_msg); | |
65 #endif | |
66 | |
67 #if 0 | |
68 MsnTransaction *elem; | |
69 if (trans->queue != NULL) | |
70 { | |
71 while ((elem = g_queue_pop_head(trans->queue)) != NULL) | |
72 msn_transaction_destroy(elem); | |
73 | |
74 g_queue_free(trans->queue); | |
75 } | |
76 #endif | |
77 | |
78 if (trans->callbacks != NULL && trans->has_custom_callbacks) | |
79 g_hash_table_destroy(trans->callbacks); | |
80 | |
81 if (trans->timer) | |
82 purple_timeout_remove(trans->timer); | |
83 | |
84 g_free(trans); | |
85 } | |
86 | |
87 char * | |
88 msn_transaction_to_string(MsnTransaction *trans) | |
89 { | |
90 char *str; | |
91 | |
92 g_return_val_if_fail(trans != NULL, FALSE); | |
93 | |
94 if (trans->params != NULL) | |
95 str = g_strdup_printf("%s %u %s\r\n", trans->command, trans->trId, trans->params); | |
96 else | |
97 str = g_strdup_printf("%s %u\r\n", trans->command, trans->trId); | |
98 | |
99 return str; | |
100 } | |
101 | |
102 void | |
103 msn_transaction_queue_cmd(MsnTransaction *trans, MsnCommand *cmd) | |
104 { | |
105 purple_debug_info("msn", "queueing command.\n"); | |
106 trans->pendent_cmd = cmd; | |
107 msn_command_ref(cmd); | |
108 } | |
109 | |
110 void | |
111 msn_transaction_unqueue_cmd(MsnTransaction *trans, MsnCmdProc *cmdproc) | |
112 { | |
113 MsnCommand *cmd; | |
114 | |
115 if (!cmdproc->servconn->connected) | |
116 return; | |
117 | |
118 purple_debug_info("msn", "unqueueing command.\n"); | |
119 cmd = trans->pendent_cmd; | |
120 | |
121 g_return_if_fail(cmd != NULL); | |
122 | |
123 msn_cmdproc_process_cmd(cmdproc, cmd); | |
124 msn_command_unref(cmd); | |
125 | |
126 trans->pendent_cmd = NULL; | |
127 } | |
128 | |
129 #if 0 | |
130 void | |
131 msn_transaction_queue(MsnTransaction *trans, MsnTransaction *elem) | |
132 { | |
133 if (trans->queue == NULL) | |
134 trans->queue = g_queue_new(); | |
135 | |
136 g_queue_push_tail(trans->queue, elem); | |
137 } | |
138 | |
139 void | |
140 msn_transaction_unqueue(MsnTransaction *trans, MsnCmdProc *cmdproc) | |
141 { | |
142 MsnTransaction *elem; | |
143 | |
144 while ((elem = g_queue_pop_head(trans->queue)) != NULL) | |
145 msn_cmdproc_send_trans(cmdproc, elem); | |
146 } | |
147 #endif | |
148 | |
149 void | |
150 msn_transaction_set_payload(MsnTransaction *trans, | |
151 const char *payload, int payload_len) | |
152 { | |
153 g_return_if_fail(trans != NULL); | |
154 g_return_if_fail(payload != NULL); | |
155 | |
156 trans->payload = g_strdup(payload); | |
157 trans->payload_len = payload_len ? payload_len : strlen(trans->payload); | |
158 } | |
159 | |
160 void | |
161 msn_transaction_set_data(MsnTransaction *trans, void *data) | |
162 { | |
163 g_return_if_fail(trans != NULL); | |
164 | |
165 trans->data = data; | |
166 } | |
167 | |
168 void | |
169 msn_transaction_add_cb(MsnTransaction *trans, char *answer, | |
170 MsnTransCb cb) | |
171 { | |
172 g_return_if_fail(trans != NULL); | |
173 g_return_if_fail(answer != NULL); | |
174 | |
175 if (trans->callbacks == NULL) | |
176 { | |
177 trans->has_custom_callbacks = TRUE; | |
178 trans->callbacks = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, | |
179 NULL); | |
180 } | |
181 else if (trans->has_custom_callbacks != TRUE) | |
182 g_return_if_reached (); | |
183 | |
184 g_hash_table_insert(trans->callbacks, answer, cb); | |
185 } | |
186 | |
187 static gboolean | |
188 transaction_timeout(gpointer data) | |
189 { | |
190 MsnTransaction *trans; | |
191 | |
192 trans = data; | |
193 g_return_val_if_fail(trans != NULL, FALSE); | |
194 | |
195 #if 0 | |
196 purple_debug_info("msn", "timed out: %s %d %s\n", trans->command, trans->trId, trans->params); | |
197 #endif | |
198 | |
199 if (trans->timeout_cb != NULL) | |
200 trans->timeout_cb(trans->cmdproc, trans); | |
201 | |
202 return FALSE; | |
203 } | |
204 | |
205 void | |
206 msn_transaction_set_timeout_cb(MsnTransaction *trans, MsnTimeoutCb cb) | |
207 { | |
208 if (trans->timer) | |
209 { | |
210 purple_debug_error("msn", "This shouldn't be happening\n"); | |
211 purple_timeout_remove(trans->timer); | |
212 } | |
213 trans->timeout_cb = cb; | |
214 trans->timer = purple_timeout_add(60000, transaction_timeout, trans); | |
215 } | |
216 | |
217 void | |
218 msn_transaction_set_error_cb(MsnTransaction *trans, MsnErrorCb cb) | |
219 { | |
220 trans->error_cb = cb; | |
221 } |