comparison libpurple/protocols/msn/sbconn.c @ 31253:5904070c0019

Move sending messages via SB to SBConn.
author masca@cpw.pidgin.im
date Sat, 19 Jun 2010 23:03:04 +0000
parents 07a9356ad2e0
children ead7b8c19725
comparison
equal deleted inserted replaced
31252:358abb453add 31253:5904070c0019
106 slplink->swboard->slplinks = g_list_prepend(slplink->swboard->slplinks, slplink); 106 slplink->swboard->slplinks = g_list_prepend(slplink->swboard->slplinks, slplink);
107 } 107 }
108 108
109 msn_switchboard_send_msg(slplink->swboard, msg, TRUE); 109 msn_switchboard_send_msg(slplink->swboard, msg, TRUE);
110 } 110 }
111
112 static void
113 release_msg(MsnSwitchBoard *swboard, MsnMessage *msg)
114 {
115 MsnCmdProc *cmdproc;
116 MsnTransaction *trans;
117 char *payload;
118 gsize payload_len;
119 char flag;
120
121 g_return_if_fail(swboard != NULL);
122 g_return_if_fail(msg != NULL);
123
124 cmdproc = swboard->cmdproc;
125
126 payload = msn_message_gen_payload(msg, &payload_len);
127
128 if (purple_debug_is_verbose()) {
129 purple_debug_info("msn", "SB length:{%" G_GSIZE_FORMAT "}\n", payload_len);
130 msn_message_show_readable(msg, "SB SEND", FALSE);
131 }
132
133 flag = msn_message_get_flag(msg);
134 trans = msn_transaction_new(cmdproc, "MSG", "%c %" G_GSIZE_FORMAT,
135 flag, payload_len);
136
137 /* Data for callbacks */
138 msn_transaction_set_data(trans, msg);
139
140 if (flag != 'U') {
141 if (msg->type == MSN_MSG_TEXT)
142 {
143 msg->ack_ref = TRUE;
144 msn_message_ref(msg);
145 swboard->ack_list = g_list_append(swboard->ack_list, msg);
146 msn_transaction_set_timeout_cb(trans, msg_timeout);
147 }
148 else if (msg->type == MSN_MSG_SLP)
149 {
150 msg->ack_ref = TRUE;
151 msn_message_ref(msg);
152 swboard->ack_list = g_list_append(swboard->ack_list, msg);
153 msn_transaction_set_timeout_cb(trans, msg_timeout);
154 #if 0
155 if (msg->ack_cb != NULL)
156 {
157 msn_transaction_add_cb(trans, "ACK", msg_ack);
158 msn_transaction_add_cb(trans, "NAK", msg_nak);
159 }
160 #endif
161 }
162 }
163
164 trans->payload = payload;
165 trans->payload_len = payload_len;
166
167 msg->trans = trans;
168
169 msn_cmdproc_send_trans(cmdproc, trans);
170 }
171
172 static void
173 queue_msg(MsnSwitchBoard *swboard, MsnMessage *msg)
174 {
175 g_return_if_fail(swboard != NULL);
176 g_return_if_fail(msg != NULL);
177
178 purple_debug_info("msn", "Appending message to queue.\n");
179
180 g_queue_push_tail(swboard->msg_queue, msg);
181
182 msn_message_ref(msg);
183 }
184
185 static void
186 process_queue(MsnSwitchBoard *swboard)
187 {
188 MsnMessage *msg;
189
190 g_return_if_fail(swboard != NULL);
191
192 purple_debug_info("msn", "Processing queue\n");
193
194 while ((msg = g_queue_pop_head(swboard->msg_queue)) != NULL)
195 {
196 purple_debug_info("msn", "Sending message\n");
197 release_msg(swboard, msg);
198 msn_message_unref(msg);
199 }
200 }
201
202 void
203 msn_switchboard_send_msg(MsnSwitchBoard *swboard, MsnMessage *msg,
204 gboolean queue)
205 {
206 g_return_if_fail(swboard != NULL);
207 g_return_if_fail(msg != NULL);
208
209 purple_debug_info("msn", "switchboard send msg..\n");
210 if (msn_switchboard_can_send(swboard))
211 release_msg(swboard, msg);
212 else if (queue)
213 queue_msg(swboard, msg);
214 }