| 105 g_free(segments[index]); |
105 g_free(segments[index]); |
| 106 } |
106 } |
| 107 purple_debug_info("QQ", "memo freed\n"); |
107 purple_debug_info("QQ", "memo freed\n"); |
| 108 } |
108 } |
| 109 |
109 |
| 110 static void update_buddy_memo(PurpleConnection *gc, guint32 bd_uid, gchar *alias) |
110 static void update_buddy_memo(PurpleConnection *gc, UID bd_uid, gchar *alias) |
| 111 { |
111 { |
| 112 PurpleAccount *account; |
112 PurpleAccount *account; |
| 113 PurpleBuddy *buddy; |
113 PurpleBuddy *buddy; |
| 114 gchar *who; |
114 gchar *who; |
| 115 g_return_if_fail(NULL != gc && NULL != alias); |
115 g_return_if_fail(NULL != gc && NULL != alias); |
| 125 return; |
125 return; |
| 126 } |
126 } |
| 127 purple_blist_alias_buddy(buddy, (const char*)alias); |
127 purple_blist_alias_buddy(buddy, (const char*)alias); |
| 128 } |
128 } |
| 129 |
129 |
| 130 static void request_change_memo(PurpleConnection *gc, guint32 bd_uid, gchar **segments) |
130 static void request_change_memo(PurpleConnection *gc, UID bd_uid, gchar **segments) |
| 131 { |
131 { |
| 132 gint bytes; |
132 gint bytes; |
| 133 /* Attention, length of each segment must be guint8(0~255), |
133 /* Attention, length of each segment must be guint8(0~255), |
| 134 * so length of memo string is limited. |
134 * so length of memo string is limited. |
| 135 * convert it to guint8 first before putting data */ |
135 * convert it to guint8 first before putting data */ |
| 168 |
168 |
| 169 /* prepare segments to be sent, string all convert to qq charset */ |
169 /* prepare segments to be sent, string all convert to qq charset */ |
| 170 static void memo_modify_ok_cb(modify_memo_request *memo_request, PurpleRequestFields *fields) |
170 static void memo_modify_ok_cb(modify_memo_request *memo_request, PurpleRequestFields *fields) |
| 171 { |
171 { |
| 172 PurpleConnection *gc; |
172 PurpleConnection *gc; |
| 173 guint32 bd_uid; |
173 UID bd_uid; |
| 174 gchar **segments; |
174 gchar **segments; |
| 175 const gchar *utf8_str; |
175 const gchar *utf8_str; |
| 176 gchar *value = NULL; |
176 gchar *value = NULL; |
| 177 gint index; |
177 gint index; |
| 178 |
178 |
| 185 |
185 |
| 186 for (index = 0; index < QQ_MEMO_SIZE; index++) { |
186 for (index = 0; index < QQ_MEMO_SIZE; index++) { |
| 187 utf8_str = purple_request_fields_get_string(fields, memo_id[index]); |
187 utf8_str = purple_request_fields_get_string(fields, memo_id[index]); |
| 188 /* update alias */ |
188 /* update alias */ |
| 189 if (QQ_MEMO_ALIAS == index) { |
189 if (QQ_MEMO_ALIAS == index) { |
| 190 update_buddy_memo(gc, bd_uid, segments[QQ_MEMO_ALIAS]); |
190 update_buddy_memo(gc, (UID)bd_uid, segments[QQ_MEMO_ALIAS]); |
| 191 } |
191 } |
| 192 if (NULL == utf8_str) { |
192 if (NULL == utf8_str) { |
| 193 value = g_strdup(""); |
193 value = g_strdup(""); |
| 194 } |
194 } |
| 195 else { |
195 else { |
| 211 memo_free(segments); |
211 memo_free(segments); |
| 212 g_free(memo_request); |
212 g_free(memo_request); |
| 213 } |
213 } |
| 214 |
214 |
| 215 /* memo modify dialogue */ |
215 /* memo modify dialogue */ |
| 216 static void memo_modify_dialogue(PurpleConnection *gc, guint32 bd_uid, gchar **segments, guint32 action) |
216 static void memo_modify_dialogue(PurpleConnection *gc, UID bd_uid, gchar **segments, guint32 action) |
| 217 { |
217 { |
| 218 modify_memo_request *memo_request; |
218 modify_memo_request *memo_request; |
| 219 PurpleRequestField *field; |
219 PurpleRequestField *field; |
| 220 PurpleRequestFields *fields; |
220 PurpleRequestFields *fields; |
| 221 PurpleRequestFieldGroup *group; |
221 PurpleRequestFieldGroup *group; |
| 270 purple_debug_info("QQ", "Error...unknown memo action, please tell us\n"); |
270 purple_debug_info("QQ", "Error...unknown memo action, please tell us\n"); |
| 271 break; |
271 break; |
| 272 } |
272 } |
| 273 } |
273 } |
| 274 |
274 |
| 275 static void qq_create_buddy_memo(PurpleConnection *gc, guint32 bd_uid, guint32 action) |
275 static void qq_create_buddy_memo(PurpleConnection *gc, UID bd_uid, guint32 action) |
| 276 { |
276 { |
| 277 gchar **segments; |
277 gchar **segments; |
| 278 gint index; |
278 gint index; |
| 279 g_return_if_fail(NULL != gc); |
279 g_return_if_fail(NULL != gc); |
| 280 |
280 |
| 283 segments[index] = g_strdup("");; |
283 segments[index] = g_strdup("");; |
| 284 } |
284 } |
| 285 memo_modify_dialogue(gc, bd_uid, segments, action); |
285 memo_modify_dialogue(gc, bd_uid, segments, action); |
| 286 } |
286 } |
| 287 |
287 |
| 288 /* process reply to get_memo packet */ |
288 /* process reply to get_memo packet |
| |
289 * here, update_class will be regarded as buddy's uid. because some |
| |
290 * memo packages returned without uid, which will make us confused */ |
| 289 void qq_process_get_buddy_memo(PurpleConnection *gc, guint8* data, gint data_len, |
291 void qq_process_get_buddy_memo(PurpleConnection *gc, guint8* data, gint data_len, |
| 290 guint32 update_class, guint32 action) |
292 UPDCLS update_class, guint32 action) |
| 291 { |
293 { |
| 292 gchar **segments; |
294 gchar **segments; |
| 293 gint bytes; |
295 gint bytes; |
| 294 gint index; |
296 gint index; |
| 295 guint8 rcv_cmd; |
297 guint8 rcv_cmd; |
| 312 /* it's possible that packet contains no buddy uid and no memo!!! |
314 /* it's possible that packet contains no buddy uid and no memo!!! |
| 313 * go to next step according to previous action sent */ |
315 * go to next step according to previous action sent */ |
| 314 if (1 == data_len) { /* only one byte */ |
316 if (1 == data_len) { /* only one byte */ |
| 315 purple_debug_info("QQ", "memo packet contains no buddy uid and memo...\n"); |
317 purple_debug_info("QQ", "memo packet contains no buddy uid and memo...\n"); |
| 316 if (QQ_BUDDY_MEMO_MODIFY == action) { |
318 if (QQ_BUDDY_MEMO_MODIFY == action) { |
| 317 qq_create_buddy_memo(gc, (guint32)update_class, QQ_BUDDY_MEMO_MODIFY); |
319 UID mod_uid; |
| |
320 mod_uid = (UID)update_class; |
| |
321 qq_create_buddy_memo(gc, mod_uid, QQ_BUDDY_MEMO_MODIFY); |
| 318 return; |
322 return; |
| 319 } |
323 } |
| 320 return; |
324 return; |
| 321 } |
325 } |
| 322 |
326 |
| 352 purple_debug_info("QQ", "bytes:%d, seg:%s\n", bytes, segments[index]); |
356 purple_debug_info("QQ", "bytes:%d, seg:%s\n", bytes, segments[index]); |
| 353 */ |
357 */ |
| 354 } |
358 } |
| 355 |
359 |
| 356 /* common action, update buddy memo */ |
360 /* common action, update buddy memo */ |
| 357 update_buddy_memo(gc, rcv_uid, segments[QQ_MEMO_ALIAS]); |
361 update_buddy_memo(gc, (UID)rcv_uid, segments[QQ_MEMO_ALIAS]); |
| 358 |
362 |
| 359 /* memo is thing that we regard our buddy as, so we need one more buddy_uid */ |
363 /* memo is a thing that we regard our buddy as, so we need one more buddy_uid */ |
| 360 memo_modify_dialogue(gc, rcv_uid, segments, action); |
364 memo_modify_dialogue(gc, rcv_uid, segments, action); |
| 361 break; |
365 break; |
| 362 default: |
366 default: |
| 363 purple_debug_info("QQ", "received an UNKNOWN memo cmd!!!\n"); |
367 purple_debug_info("QQ", "received an UNKNOWN memo cmd!!!\n"); |
| 364 break; |
368 break; |
| 365 } |
369 } |
| 366 } |
370 } |
| 367 |
371 |
| 368 /* request buddy memo */ |
372 /* request buddy memo |
| 369 void qq_request_buddy_memo(PurpleConnection *gc, guint32 bd_uid, guint32 update_class, guint32 action) |
373 * |
| |
374 * param: gc, uid, update_class, action |
| |
375 * here, update_class will be set to buddy's uid. because some memo |
| |
376 * packages returned without uid, which will make us confused */ |
| |
377 void qq_request_buddy_memo(PurpleConnection *gc, UID bd_uid, UPDCLS update_class, guint32 action) |
| 370 { |
378 { |
| 371 guint8 raw_data[16] = {0}; |
379 guint8 raw_data[16] = {0}; |
| 372 gint bytes; |
380 gint bytes; |
| 373 |
381 |
| 374 purple_debug_info("QQ", "qq_request_buddy_memo, buddy uid=%u, update_class=%u\n", |
382 purple_debug_info("QQ", "qq_request_buddy_memo, buddy uid=%u, update_class=%u\n", |