Mercurial > pidgin.yaz
comparison libpurple/protocols/qq/buddy_memo.c @ 25146:7f903e67a995
2009.02.09 - Chengming Wang <tiger2007532246(at)gmail.com>
* Added buddy 'get memo', 'remove memo', 'upload memo' functions
author | SHiNE CsyFeK <csyfek@gmail.com> |
---|---|
date | Mon, 09 Feb 2009 15:49:14 +0000 |
parents | |
children | 8bc9f89f305e |
comparison
equal
deleted
inserted
replaced
25070:cddd7961901f | 25146:7f903e67a995 |
---|---|
1 | |
2 #include "buddy_memo.h" | |
3 #include "internal.h" | |
4 #include "debug.h" | |
5 #include "notify.h" | |
6 #include "request.h" | |
7 | |
8 #include "utils.h" | |
9 #include "packet_parse.h" | |
10 #include "buddy_list.h" | |
11 #include "buddy_info.h" | |
12 #include "char_conv.h" | |
13 #include "im.h" | |
14 #include "qq_define.h" | |
15 #include "qq_base.h" | |
16 #include "qq_network.h" | |
17 #include "../../blist.h" | |
18 | |
19 | |
20 #include<string.h> | |
21 #include<stdlib.h> | |
22 #include<stdio.h> | |
23 | |
24 | |
25 static const gchar* buddy_memo_txt[] = { | |
26 "Name", | |
27 "Mobile", | |
28 "Telephone", | |
29 "Address", | |
30 "Email", | |
31 "ZipCode", | |
32 "Note" | |
33 };/* 备注信息的名称 */ | |
34 | |
35 | |
36 /** | |
37 * 打印出好友备注信息 | |
38 * | |
39 * @param memo | |
40 */ | |
41 static void buddy_memo_debug( gchar* memo[] ); | |
42 | |
43 /** | |
44 * 好友备注对话框中上传按钮的响应函数 | |
45 * | |
46 * @param info_request | |
47 * @param fields | |
48 */ | |
49 static void buddy_memo_on_upload(void *info_request, PurpleRequestFields *fields); | |
50 | |
51 | |
52 static gchar** buddy_memo_init_data( ); | |
53 | |
54 | |
55 | |
56 /** | |
57 * 弹出窗口显示好友备注信息 | |
58 * | |
59 * @param node | |
60 * @param buddy_data | |
61 */ | |
62 static void qq_show_buddy_memo( void* node, void* buddy_data ); | |
63 | |
64 | |
65 | |
66 | |
67 | |
68 /** | |
69 * 向服务器发送更新好友信息请求 | |
70 * | |
71 * @param gc | |
72 * @param buddy_data | |
73 */ | |
74 static void qq_request_buddy_memo_upload( PurpleBuddy * buddy ); | |
75 | |
76 | |
77 | |
78 /*********************************************************************************************/ | |
79 | |
80 | |
81 | |
82 | |
83 | |
84 void buddy_memo_on_upload(void *bd, PurpleRequestFields *fields) | |
85 { | |
86 int index; | |
87 PurpleBuddy *buddy; | |
88 qq_buddy_data* buddy_data; | |
89 int memoChanged; | |
90 const char *utf8_str; | |
91 buddy = ( PurpleBuddy* )bd; | |
92 buddy_data = ( qq_buddy_data* )( buddy->proto_data ); | |
93 | |
94 | |
95 purple_debug_info("QQ", "update memo\n"); | |
96 memoChanged = 0; | |
97 for( index=0; index<QQ_BUDDY_MEMO_SIZE; index++ ){ | |
98 utf8_str = purple_request_fields_get_string(fields, buddy_memo_txt[index]); | |
99 if( utf8_str == NULL ){ | |
100 if( buddy_data->memo[index] != NULL ){ | |
101 g_free( buddy_data->memo[index] ); | |
102 memoChanged = 1; | |
103 } | |
104 buddy_data->memo[index] = g_new0( gchar,1 ); | |
105 } | |
106 else if( buddy_data->memo[index] == NULL || | |
107 strcmp( utf8_str, buddy_data->memo[index] ) != 0 ) | |
108 { | |
109 if( buddy_data->memo[index] != NULL ) | |
110 g_free( buddy_data->memo[index] ); | |
111 buddy_data->memo[index] = g_new( gchar,strlen(utf8_str)+2 ); | |
112 strcpy( buddy_data->memo[index], utf8_str ); | |
113 memoChanged = 1; | |
114 purple_debug_info( "QQ","%s=%s\n",buddy_memo_txt[index],utf8_str ); | |
115 } | |
116 | |
117 } | |
118 if( memoChanged == 1 ){ | |
119 qq_request_buddy_memo_upload( buddy ); | |
120 purple_blist_alias_buddy( buddy,buddy_data->memo[QQ_BUDDY_MEMO_NAME] ); | |
121 } | |
122 return; | |
123 } | |
124 | |
125 void qq_request_buddy_memo_upload( PurpleBuddy * buddy ) | |
126 { | |
127 PurpleConnection* gc; | |
128 qq_buddy_data* buddy_data; | |
129 guint8* rawData; | |
130 guint8* pos; | |
131 int rawDataSize; | |
132 int index; | |
133 int memoItemSize[QQ_BUDDY_MEMO_SIZE]; | |
134 gchar* qqCharSetTxt[QQ_BUDDY_MEMO_SIZE]; | |
135 | |
136 gc = buddy->account->gc; | |
137 buddy_data = ( qq_buddy_data* )buddy->proto_data; | |
138 purple_debug_info( "QQ","call qq_request_buddy_memo_download_upload\n" ); | |
139 rawDataSize = 7; | |
140 for( index=0; index<QQ_BUDDY_MEMO_SIZE; index++ ){ | |
141 qqCharSetTxt[index] = utf8_to_qq( buddy_data->memo[index], QQ_CHARSET_DEFAULT ); | |
142 memoItemSize[index] = strlen( qqCharSetTxt[index] ); | |
143 rawDataSize += memoItemSize[index]+1; | |
144 } | |
145 rawData = g_new0( guint8,rawDataSize ); | |
146 pos = rawData; | |
147 (*pos) = QQ_BUDDY_MEMO_UPLOAD; | |
148 pos += 2; | |
149 (*(guint32*)pos) = htonl( buddy_data->uid ); | |
150 pos += 5; | |
151 for( index=0; index<QQ_BUDDY_MEMO_SIZE; index++ ){ | |
152 (*pos) = 0xff&memoItemSize[index]; | |
153 pos++; | |
154 memcpy( pos, qqCharSetTxt[index], memoItemSize[index] ); | |
155 pos += memoItemSize[index]; | |
156 } | |
157 | |
158 qq_send_cmd( gc, QQ_CMD_BUDDY_MEMO, rawData, rawDataSize ); | |
159 for( index=0; index<QQ_BUDDY_MEMO_SIZE; index++ ){ | |
160 g_free( qqCharSetTxt[index] ); | |
161 } | |
162 } | |
163 | |
164 | |
165 | |
166 void qq_request_buddy_memo_download(PurpleConnection *gc, guint32 uid) | |
167 { | |
168 gchar raw_data[16] = {0}; | |
169 unsigned int tmp; | |
170 purple_debug_info("QQ", "Call qq_request_buddy_memo_download! qq number =%u\n", uid); | |
171 g_return_if_fail(uid != 0); | |
172 raw_data[0] = QQ_BUDDY_MEMO_GET; | |
173 | |
174 tmp = htonl((unsigned int)uid); | |
175 memcpy(raw_data+1, &tmp, 4); | |
176 | |
177 qq_send_cmd(gc, QQ_CMD_BUDDY_MEMO, (guint8*)raw_data, 5); | |
178 } | |
179 | |
180 | |
181 void qq_process_get_buddy_memo( PurpleConnection *gc, guint8* data, gint len ) | |
182 { | |
183 qq_data *qd; | |
184 //_buddy_memo memo; | |
185 PurpleBuddy *buddy; | |
186 gchar *who; | |
187 qq_buddy_data* bd; | |
188 guint8* pos; | |
189 gint lenth; | |
190 guint32 qq_number; | |
191 int k; | |
192 | |
193 pos = data; | |
194 switch( *pos ){ | |
195 case QQ_BUDDY_MEMO_UPLOAD : | |
196 case QQ_BUDDY_MEMO_REMOVE : | |
197 if( data[1] == QQ_BUDDY_MEMO_REQUEST_SUCCESS ){//显示服务器接受请求对话框 | |
198 //TODO: | |
199 purple_debug_info( "QQ","服务器接受了请求\n" ); | |
200 purple_notify_message( gc, | |
201 PURPLE_NOTIFY_MSG_INFO, | |
202 _( "Your request was accepted" ), | |
203 _( "Your request was accepted" ), | |
204 _( "Your request was accepted" ), | |
205 NULL, | |
206 NULL); | |
207 } | |
208 break; | |
209 case QQ_BUDDY_MEMO_GET: | |
210 qd = (qq_data *) gc->proto_data; | |
211 pos++; | |
212 qq_number = ntohl( *(uint32_t*)pos ); | |
213 pos += 5;//qq号后面有一个字节不知道什么作用 | |
214 who = uid_to_purple_name( qq_number ); | |
215 buddy = purple_find_buddy( gc->account, who ); | |
216 if (buddy == NULL || buddy->proto_data == NULL) { | |
217 g_free(who); | |
218 purple_debug_info("QQ", "Error Can not find %d!\n", qq_number); | |
219 return; | |
220 } | |
221 bd = (qq_buddy_data *)buddy->proto_data; | |
222 | |
223 if( bd->memo == NULL ){ | |
224 bd->memo = g_new0( gchar*,QQ_BUDDY_MEMO_SIZE ); | |
225 } | |
226 for( k=0; k<QQ_BUDDY_MEMO_SIZE; k++ ){ | |
227 lenth = pos[0]; | |
228 pos++; | |
229 if( bd->memo[k] != NULL ) | |
230 g_free( bd->memo[k] ); | |
231 bd->memo[k] = qq_to_utf8_len( (gchar*)pos, lenth, QQ_CHARSET_DEFAULT ); | |
232 pos += lenth; | |
233 } | |
234 buddy_memo_debug( bd->memo ); | |
235 purple_blist_alias_buddy( buddy, | |
236 (const char*)bd->memo[QQ_BUDDY_MEMO_NAME] );//改名 | |
237 break; | |
238 default: | |
239 purple_debug_info( "QQ","error: unknown memo cmd\n" ); | |
240 break; | |
241 } | |
242 | |
243 | |
244 } | |
245 | |
246 void buddy_memo_debug( gchar* memo[] ) | |
247 { | |
248 gint k=0; | |
249 for( k=0; k<QQ_BUDDY_MEMO_SIZE; k++ ){ | |
250 purple_debug_info( "QQ","备注: %s=%s\n",buddy_memo_txt[k],memo[k] ); | |
251 } | |
252 } | |
253 | |
254 void qq_show_buddy_memo( void* node, void* buddy_data ) | |
255 { | |
256 qq_buddy_data* data; | |
257 PurpleRequestField *field; | |
258 PurpleRequestFields *fields; | |
259 PurpleRequestFieldGroup *group; | |
260 int index; | |
261 | |
262 data = ( qq_buddy_data* )buddy_data; | |
263 | |
264 fields = purple_request_fields_new(); | |
265 group = purple_request_field_group_new(NULL); | |
266 purple_request_fields_add_group(fields, group); | |
267 | |
268 for( index=0; index<QQ_BUDDY_MEMO_SIZE; index++ ){ | |
269 if( data->memo == NULL ){ | |
270 data->memo = buddy_memo_init_data( ); | |
271 } | |
272 field = purple_request_field_string_new(buddy_memo_txt[index], | |
273 buddy_memo_txt[index], | |
274 data->memo[index], | |
275 FALSE); | |
276 purple_request_field_group_add_field(group, field); | |
277 } | |
278 | |
279 purple_request_fields(node, | |
280 _( "Buddy_memo" ), | |
281 "", | |
282 NULL, | |
283 fields, | |
284 _("_Upload"), G_CALLBACK(buddy_memo_on_upload), | |
285 _("_Cancel"), NULL, | |
286 ((PurpleBuddy *)node)->account, ((PurpleBuddy *)node)->name, NULL, | |
287 node); | |
288 } | |
289 | |
290 | |
291 | |
292 void qq_on_show_memo(PurpleBlistNode *node, gpointer data) | |
293 { | |
294 | |
295 PurpleBuddy *buddy; | |
296 | |
297 g_return_if_fail(PURPLE_BLIST_NODE_IS_BUDDY(node)); | |
298 | |
299 buddy = (PurpleBuddy *) node; | |
300 | |
301 qq_show_buddy_memo( node, buddy->proto_data ); | |
302 | |
303 | |
304 purple_debug_info( "QQ","show memo" ); | |
305 } | |
306 | |
307 | |
308 static gchar** buddy_memo_init_data( ) | |
309 { | |
310 gchar** pmemo; | |
311 int index; | |
312 pmemo = g_new0( gchar*,QQ_BUDDY_MEMO_SIZE ); | |
313 for( index=0; index<QQ_BUDDY_MEMO_SIZE; index++ ){ | |
314 pmemo[index] = g_new0( gchar,1 ); | |
315 } | |
316 return pmemo; | |
317 } |