comparison libpurple/protocols/qq/buddy_memo.c @ 25516:8bc9f89f305e

2009.02.09 - Chengming Wang <tiger2007532246(at)gmail.com> * Rewrite buddy_memo using qq_put/qq_get series functions
author SHiNE CsyFeK <csyfek@gmail.com>
date Mon, 09 Feb 2009 15:52:13 +0000
parents 7f903e67a995
children 59ed7712be5e
comparison
equal deleted inserted replaced
25515:7f903e67a995 25516:8bc9f89f305e
19 19
20 #include<string.h> 20 #include<string.h>
21 #include<stdlib.h> 21 #include<stdlib.h>
22 #include<stdio.h> 22 #include<stdio.h>
23 23
24 24 #include <stdlib.h>
25 #include <stdio.h>
25 static const gchar* buddy_memo_txt[] = { 26 static const gchar* buddy_memo_txt[] = {
26 "Name", 27 "Name",
27 "Mobile", 28 "Mobile",
28 "Telephone", 29 "Telephone",
29 "Address", 30 "Address",
125 void qq_request_buddy_memo_upload( PurpleBuddy * buddy ) 126 void qq_request_buddy_memo_upload( PurpleBuddy * buddy )
126 { 127 {
127 PurpleConnection* gc; 128 PurpleConnection* gc;
128 qq_buddy_data* buddy_data; 129 qq_buddy_data* buddy_data;
129 guint8* rawData; 130 guint8* rawData;
130 guint8* pos; 131 gint bytes;
131 int rawDataSize; 132 int rawDataSize;
132 int index; 133 int index;
133 int memoItemSize[QQ_BUDDY_MEMO_SIZE]; 134 int memoItemSize[QQ_BUDDY_MEMO_SIZE];
134 gchar* qqCharSetTxt[QQ_BUDDY_MEMO_SIZE]; 135 gchar* qqCharSetTxt[QQ_BUDDY_MEMO_SIZE];
135 136
141 qqCharSetTxt[index] = utf8_to_qq( buddy_data->memo[index], QQ_CHARSET_DEFAULT ); 142 qqCharSetTxt[index] = utf8_to_qq( buddy_data->memo[index], QQ_CHARSET_DEFAULT );
142 memoItemSize[index] = strlen( qqCharSetTxt[index] ); 143 memoItemSize[index] = strlen( qqCharSetTxt[index] );
143 rawDataSize += memoItemSize[index]+1; 144 rawDataSize += memoItemSize[index]+1;
144 } 145 }
145 rawData = g_new0( guint8,rawDataSize ); 146 rawData = g_new0( guint8,rawDataSize );
146 pos = rawData; 147 bytes = 0;
147 (*pos) = QQ_BUDDY_MEMO_UPLOAD; 148 bytes += qq_put8( rawData+bytes,QQ_BUDDY_MEMO_UPLOAD );
148 pos += 2; 149 bytes += qq_put8( rawData+bytes,0 );
149 (*(guint32*)pos) = htonl( buddy_data->uid ); 150 bytes += qq_put32( rawData+bytes, buddy_data->uid );
150 pos += 5; 151 bytes += qq_put8( rawData+bytes,0 );
151 for( index=0; index<QQ_BUDDY_MEMO_SIZE; index++ ){ 152 for( index=0; index<QQ_BUDDY_MEMO_SIZE; index++ ){
152 (*pos) = 0xff&memoItemSize[index]; 153 bytes += qq_put8( rawData+bytes,0xff&memoItemSize[index] ); //TODO: 0xff?
153 pos++; 154 bytes += qq_putdata( rawData+bytes, (const guint8 *)qqCharSetTxt[index], memoItemSize[index] );
154 memcpy( pos, qqCharSetTxt[index], memoItemSize[index] );
155 pos += memoItemSize[index];
156 } 155 }
157 156
158 qq_send_cmd( gc, QQ_CMD_BUDDY_MEMO, rawData, rawDataSize ); 157 qq_send_cmd( gc, QQ_CMD_BUDDY_MEMO, rawData, rawDataSize );
159 for( index=0; index<QQ_BUDDY_MEMO_SIZE; index++ ){ 158 for( index=0; index<QQ_BUDDY_MEMO_SIZE; index++ ){
160 g_free( qqCharSetTxt[index] ); 159 g_free( qqCharSetTxt[index] );
163 162
164 163
165 164
166 void qq_request_buddy_memo_download(PurpleConnection *gc, guint32 uid) 165 void qq_request_buddy_memo_download(PurpleConnection *gc, guint32 uid)
167 { 166 {
168 gchar raw_data[16] = {0}; 167 guint8 raw_data[16] = {0};
169 unsigned int tmp; 168 //unsigned int tmp;
169 gint bytes;
170
170 purple_debug_info("QQ", "Call qq_request_buddy_memo_download! qq number =%u\n", uid); 171 purple_debug_info("QQ", "Call qq_request_buddy_memo_download! qq number =%u\n", uid);
171 g_return_if_fail(uid != 0); 172 g_return_if_fail(uid != 0);
172 raw_data[0] = QQ_BUDDY_MEMO_GET; 173 bytes = 0;
173 174 bytes += qq_put8( raw_data+bytes, QQ_BUDDY_MEMO_GET );
174 tmp = htonl((unsigned int)uid); 175 bytes += qq_put32( raw_data+bytes, uid );
175 memcpy(raw_data+1, &tmp, 4); 176
176 177 qq_send_cmd(gc, QQ_CMD_BUDDY_MEMO, (guint8*)raw_data, bytes);
177 qq_send_cmd(gc, QQ_CMD_BUDDY_MEMO, (guint8*)raw_data, 5);
178 } 178 }
179 179
180 180
181 void qq_process_get_buddy_memo( PurpleConnection *gc, guint8* data, gint len ) 181 void qq_process_get_buddy_memo( PurpleConnection *gc, guint8* data, gint len )
182 { 182 {
183 qq_data *qd; 183 qq_data *qd;
184 //_buddy_memo memo;
185 PurpleBuddy *buddy; 184 PurpleBuddy *buddy;
186 gchar *who; 185 gchar *who;
187 qq_buddy_data* bd; 186 qq_buddy_data* bd;
188 guint8* pos; 187 gint bytes;
189 gint lenth; 188 guint8 lenth;
190 guint32 qq_number; 189 guint32 qq_number;
190 guint8 receive_cmd;
191 guint8 receive_data;
191 int k; 192 int k;
192 193
193 pos = data; 194 bytes = 0;
194 switch( *pos ){ 195 bytes += qq_get8( &receive_cmd, data+bytes );
196 switch( receive_cmd ){
195 case QQ_BUDDY_MEMO_UPLOAD : 197 case QQ_BUDDY_MEMO_UPLOAD :
196 case QQ_BUDDY_MEMO_REMOVE : 198 case QQ_BUDDY_MEMO_REMOVE :
197 if( data[1] == QQ_BUDDY_MEMO_REQUEST_SUCCESS ){//显示服务器接受请求对话框 199 bytes += qq_get8( &receive_data, data+bytes );
198 //TODO: 200 if( receive_data == QQ_BUDDY_MEMO_REQUEST_SUCCESS ){//显示服务器接受请求对话框
199 purple_debug_info( "QQ","服务器接受了请求\n" ); 201 purple_debug_info( "QQ","服务器接受了请求\n" );
200 purple_notify_message( gc, 202 purple_notify_message( gc,
201 PURPLE_NOTIFY_MSG_INFO, 203 PURPLE_NOTIFY_MSG_INFO,
202 _( "Your request was accepted" ), 204 _( "Your request was accepted" ),
203 _( "Your request was accepted" ), 205 _( "Your request was accepted" ),
204 _( "Your request was accepted" ), 206 _( "Your request was accepted" ),
205 NULL, 207 NULL,
206 NULL); 208 NULL);
207 } 209 }
210 else{
211 purple_debug_info( "QQ","服务器拒绝了请求\n" );
212 purple_notify_message( gc,
213 PURPLE_NOTIFY_MSG_INFO,
214 _( "Your request was rejected" ),
215 _( "Your request was rejected" ),
216 _( "Your request was rejected" ),
217 NULL,
218 NULL);
219 }
208 break; 220 break;
209 case QQ_BUDDY_MEMO_GET: 221 case QQ_BUDDY_MEMO_GET:
210 qd = (qq_data *) gc->proto_data; 222 qd = (qq_data *) gc->proto_data;
211 pos++; 223 bytes += qq_get32( &qq_number, data+bytes );
212 qq_number = ntohl( *(uint32_t*)pos ); 224 bytes ++;//qq号后面有一个字节不知道什么作用
213 pos += 5;//qq号后面有一个字节不知道什么作用
214 who = uid_to_purple_name( qq_number ); 225 who = uid_to_purple_name( qq_number );
215 buddy = purple_find_buddy( gc->account, who ); 226 buddy = purple_find_buddy( gc->account, who );
216 if (buddy == NULL || buddy->proto_data == NULL) { 227 if (buddy == NULL || buddy->proto_data == NULL) {
217 g_free(who); 228 g_free(who);
218 purple_debug_info("QQ", "Error Can not find %d!\n", qq_number); 229 purple_debug_info("QQ", "Error Can not find %d!\n", qq_number);
222 233
223 if( bd->memo == NULL ){ 234 if( bd->memo == NULL ){
224 bd->memo = g_new0( gchar*,QQ_BUDDY_MEMO_SIZE ); 235 bd->memo = g_new0( gchar*,QQ_BUDDY_MEMO_SIZE );
225 } 236 }
226 for( k=0; k<QQ_BUDDY_MEMO_SIZE; k++ ){ 237 for( k=0; k<QQ_BUDDY_MEMO_SIZE; k++ ){
227 lenth = pos[0]; 238 bytes += qq_get8( &lenth, data+bytes );
228 pos++;
229 if( bd->memo[k] != NULL ) 239 if( bd->memo[k] != NULL )
230 g_free( bd->memo[k] ); 240 g_free( bd->memo[k] );
231 bd->memo[k] = qq_to_utf8_len( (gchar*)pos, lenth, QQ_CHARSET_DEFAULT ); 241 bd->memo[k] = qq_to_utf8_len( (gchar*)(data+bytes), lenth, QQ_CHARSET_DEFAULT );
232 pos += lenth; 242 bytes += lenth;
233 } 243 }
234 buddy_memo_debug( bd->memo ); 244 buddy_memo_debug( bd->memo );
235 purple_blist_alias_buddy( buddy, 245 purple_blist_alias_buddy( buddy,
236 (const char*)bd->memo[QQ_BUDDY_MEMO_NAME] );//改名 246 (const char*)bd->memo[QQ_BUDDY_MEMO_NAME] );//改名
237 break; 247 break;
238 default: 248 default:
239 purple_debug_info( "QQ","error: unknown memo cmd\n" ); 249 purple_debug_info( "QQ","error: unknown memo cmd \n" );
240 break; 250 break;
241 } 251 }
242 252
243 253
244 } 254 }
303 313
304 purple_debug_info( "QQ","show memo" ); 314 purple_debug_info( "QQ","show memo" );
305 } 315 }
306 316
307 317
308 static gchar** buddy_memo_init_data( ) 318 gchar** buddy_memo_init_data( )
309 { 319 {
310 gchar** pmemo; 320 gchar** pmemo;
311 int index; 321 int index;
312 pmemo = g_new0( gchar*,QQ_BUDDY_MEMO_SIZE ); 322 pmemo = g_new0( gchar*,QQ_BUDDY_MEMO_SIZE );
313 for( index=0; index<QQ_BUDDY_MEMO_SIZE; index++ ){ 323 for( index=0; index<QQ_BUDDY_MEMO_SIZE; index++ ){