Mercurial > pidgin
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++ ){ |