Mercurial > pidgin
annotate libgaim/protocols/msn/transaction.c @ 20392:9ba7dee775e1
The first msn-p13-merge-head.diff.gz from SF Patch #1621854 from Ka-Hing Cheung.
"uploaded a diff, this diff is unchanged from the last tarball that I
previously uploaded, except that it's against HEAD. This should be a little
easier for most people."
(This was apparently msn-p13-merge-head.diff, which SourceForge didn't allow to
be uploaded.)
PLUS
"Updated the diff with basically no change, except with simom's icon fix.
The previous diff was broken because some of the files were not added"
author | Richard Laager <rlaager@wiktel.com> |
---|---|
date | Sun, 15 Apr 2007 03:01:41 +0000 |
parents | e354528c4163 |
children |
rev | line source |
---|---|
14192 | 1 /** |
2 * @file transaction.c MSN transaction functions | |
3 * | |
4 * gaim | |
5 * | |
6 * Gaim 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 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 gaim_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 gaim_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 gaim_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 gaim_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 { | |
20389
e354528c4163
propagate from branch 'im.pidgin.gaim' (head 70ac931e4936c7916eec18a07fe46a0af0fd7403)
Richard Laager <rlaager@wiktel.com>
parents:
14192
diff
changeset
|
208 if (trans->timer){ |
14192 | 209 gaim_debug_error("msn", "This shouldn't be happening\n"); |
210 gaim_timeout_remove(trans->timer); | |
211 } | |
212 trans->timeout_cb = cb; | |
213 trans->timer = gaim_timeout_add(60000, transaction_timeout, trans); | |
214 } | |
215 | |
216 void | |
217 msn_transaction_set_error_cb(MsnTransaction *trans, MsnErrorCb cb) | |
218 { | |
219 trans->error_cb = cb; | |
220 } |