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 }