comparison src/protocols/msn/msnslp.c @ 6868:ab80de7a74d1

[gaim-migrate @ 7414] Commitinating the current MSNSLP code. It's not working.. I don't know why. No clients will respond to my messages, even though they appear very valid. committer: Tailor Script <tailor@pidgin.im>
author Christian Hammond <chipx86@chipx86.com>
date Wed, 17 Sep 2003 02:10:37 +0000
parents bd433a45a463
children ac638b90da44
comparison
equal deleted inserted replaced
6867:1c4e4c725e0d 6868:ab80de7a74d1
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 */ 21 */
22 #include "msn.h" 22 #include "msn.h"
23 #include "msnslp.h" 23 #include "msnslp.h"
24 24
25 static void
26 send_ack(MsnSlpSession *slpsession, MsnMessage *acked_msg)
27 {
28 MsnMessage *msg;
29
30 msg = msn_message_new_msnslp();
31
32 msg->msnslp_header.length = acked_msg->msnslp_header.length;
33 msg->msnslp_header.flags = 0x02;
34 msg->msnslp_header.ack_session_id =
35 acked_msg->msnslp_header.ack_session_id;
36 msg->msnslp_header.ack_unique_id =
37 acked_msg->msnslp_header.id;
38 msg->msnslp_header.ack_length = acked_msg->msnslp_header.length;
39
40 /* Send this puppy. */
41 msn_slp_session_send_msg(slpsession, msg);
42 }
43
44 MsnSlpSession * 25 MsnSlpSession *
45 msn_slp_session_new(MsnSwitchBoard *swboard, gboolean local_initiated) 26 msn_slp_session_new(MsnSwitchBoard *swboard, gboolean local_initiated)
46 { 27 {
47 MsnSlpSession *slpsession; 28 MsnSlpSession *slpsession;
48 29
84 65
85 return FALSE; 66 return FALSE;
86 } 67 }
87 68
88 /* Now send an ack, since we got this. */ 69 /* Now send an ack, since we got this. */
89 send_ack(slpsession, msg); 70 msn_slp_session_send_ack(slpsession, msg);
90 71
91 return FALSE; 72 return FALSE;
73 }
74
75 static void
76 send_msg_part(MsnSlpSession *slpsession, MsnMessage *msg)
77 {
78 msg->msnslp_header.length =
79 (slpsession->orig_len - slpsession->offset > 1202
80 ? 1202 : slpsession->orig_len - slpsession->offset);
81
82 if (slpsession->offset > 0)
83 {
84 if (msg->bin_content)
85 {
86 msn_message_set_bin_data(msg,
87 slpsession->orig_body + slpsession->offset,
88 msg->msnslp_header.length);
89 }
90 else
91 {
92 msn_message_set_body(msg,
93 slpsession->orig_body + slpsession->offset);
94 }
95 }
96
97 msg->msnslp_header.offset_1 = slpsession->offset;
98
99 msn_switchboard_send_msg(slpsession->swboard, msg);
100
101 if (slpsession->offset + msg->msnslp_header.length == slpsession->orig_len)
102 {
103 msn_message_destroy(msg);
104
105 g_free(slpsession->orig_body);
106
107 slpsession->offset = 0;
108 slpsession->orig_len = 0;
109 slpsession->orig_body = NULL;
110 slpsession->outgoing_msg = NULL;
111 }
112 else
113 slpsession->offset += msg->msnslp_header.length;
92 } 114 }
93 115
94 void 116 void
95 msn_slp_session_send_msg(MsnSlpSession *slpsession, MsnMessage *msg) 117 msn_slp_session_send_msg(MsnSlpSession *slpsession, MsnMessage *msg)
96 { 118 {
97 g_return_if_fail(slpsession != NULL); 119 g_return_if_fail(slpsession != NULL);
98 g_return_if_fail(msg != NULL); 120 g_return_if_fail(msg != NULL);
99 g_return_if_fail(msg->msnslp_message); 121 g_return_if_fail(msg->msnslp_message);
122 g_return_if_fail(slpsession->outgoing_msg == NULL);
100 123
101 msg->msnslp_header.session_id = slpsession->session_id; 124 msg->msnslp_header.session_id = slpsession->session_id;
102 125
126 slpsession->outgoing_msg = msn_message_ref(msg);
127
103 if (slpsession->base_id == 0) 128 if (slpsession->base_id == 0)
104 { 129 {
105 slpsession->base_id = rand() % 0xFFFFFF00 + 4; 130 slpsession->base_id = rand() % 0x0FFFFFF0 + 4;
106 slpsession->prev_msg_id = slpsession->base_id; 131 slpsession->prev_msg_id = slpsession->base_id;
132 }
133 else if (slpsession->offset == 0)
134 slpsession->prev_msg_id = ++slpsession->base_id;
135
136 msg->msnslp_header.id = slpsession->prev_msg_id;
137 // msg->msnslp_header.ack_session_id = rand() % 0xFFFFFF00;
138 msg->msnslp_header.ack_session_id = 1980589;
139
140 msn_message_set_charset(msg, NULL);
141
142 if (msg->msnslp_header.session_id != 0)
143 msg->msnslp_footer.app_id = 1;
144
145 if (msg->bin_content)
146 {
147 const void *temp;
148
149 temp = msn_message_get_bin_data(msg, &slpsession->orig_len);
150
151 slpsession->orig_body = g_memdup(temp, slpsession->orig_len);
152 }
153 else
154 {
155 slpsession->orig_body = g_strdup(msn_message_get_body(msg));
156 slpsession->orig_len = strlen(slpsession->orig_body);
157 }
158
159 msg->msnslp_header.total_size_1 = slpsession->orig_len;
160
161 send_msg_part(slpsession, msg);
162 }
163
164 void
165 msn_slp_session_send_ack(MsnSlpSession *slpsession, MsnMessage *acked_msg)
166 {
167 MsnMessage *msg;
168 gboolean new_base_id = FALSE;
169
170 g_return_if_fail(slpsession != NULL);
171 g_return_if_fail(acked_msg != NULL);
172 g_return_if_fail(acked_msg->msnslp_message);
173 g_return_if_fail(slpsession->outgoing_msg == NULL);
174
175 msg = msn_message_new_msnslp_ack(acked_msg);
176
177 if (slpsession->base_id == 0)
178 {
179 slpsession->base_id = rand() % 0x0FFFFE00 + 10;
180 slpsession->prev_msg_id = slpsession->base_id;
181
182 new_base_id = TRUE;
107 } 183 }
108 else 184 else
109 slpsession->prev_msg_id = ++slpsession->base_id; 185 slpsession->prev_msg_id = ++slpsession->base_id;
110 186
111 msg->msnslp_header.id = slpsession->prev_msg_id; 187 msg->msnslp_header.id = slpsession->prev_msg_id;
112 msg->msnslp_header.ack_session_id = rand() % 0xFFFFFF00; 188
113 189 if (new_base_id)
114 if (msn_message_get_body(msg) != NULL) 190 slpsession->prev_msg_id -= 4;
115 msg->msnslp_header.total_size = strlen(msn_message_get_body(msg));
116
117 msn_message_set_charset(msg, NULL);
118
119 msn_message_set_flag(msg, 'D');
120 msn_message_set_content_type(msg, "application/x-msnmsgrp2p");
121 msn_message_set_attr(msg, "P2P-Dest",
122 msn_user_get_passport(msn_message_get_receiver(msg)));
123
124 if (msg->msnslp_header.session_id != 0)
125 msg->msnslp_footer.app_id = 1;
126 191
127 msn_switchboard_send_msg(slpsession->swboard, msg); 192 msn_switchboard_send_msg(slpsession->swboard, msg);
128 } 193 }
129 194
130 void 195 void
139 char *msnobj_base64; 204 char *msnobj_base64;
140 char *branch; 205 char *branch;
141 char *call_id; 206 char *call_id;
142 char *content; 207 char *content;
143 char *body; 208 char *body;
144 char *c;
145 209
146 g_return_if_fail(slpsession != NULL); 210 g_return_if_fail(slpsession != NULL);
147 g_return_if_fail(local_user != NULL); 211 g_return_if_fail(local_user != NULL);
148 g_return_if_fail(remote_user != NULL); 212 g_return_if_fail(remote_user != NULL);
149 g_return_if_fail(obj != NULL); 213 g_return_if_fail(obj != NULL);
150 214
151 msnobj_data = msn_object_to_string(obj); 215 msnobj_data = msn_object_to_string(obj);
152 msnobj_base64 = tobase64(msnobj_data, strlen(msnobj_data)); 216 msnobj_base64 = tobase64(msnobj_data, strlen(msnobj_data));
153 g_free(msnobj_data); 217 g_free(msnobj_data);
154 218
219 #if 0
155 if ((c = strchr(msnobj_base64, '=')) != NULL) 220 if ((c = strchr(msnobj_base64, '=')) != NULL)
156 *c = '\0'; 221 *c = '\0';
222 #endif
157 223
158 session_id = rand() % 0xFFFFFF00 + 4; 224 session_id = rand() % 0xFFFFFF00 + 4;
159 225
160 branch = g_strdup_printf("%4X%4X-%4X-%4X-%4X-%4X%4X%4X", 226 branch = g_strdup_printf("%4X%4X-%4X-%4X-%4X-%4X%4X%4X",
161 rand() % 0xAAFF + 0x1111, 227 rand() % 0xAAFF + 0x1111,