comparison src/protocols/qq/group_info.c @ 14021:ef8490f9e823

[gaim-migrate @ 16618] Replaced all C++-style comments with C-style ones. Cleaned up some comments and implemented a more consistent formatting scheme. committer: Tailor Script <tailor@pidgin.im>
author Mark Huetsch <markhuetsch>
date Wed, 02 Aug 2006 15:35:36 +0000
parents 983fd420e86b
children 32a71e64ceae
comparison
equal deleted inserted replaced
14020:13e7ba964993 14021:ef8490f9e823
18 * You should have received a copy of the GNU General Public License 18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software 19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 */ 21 */
22 22
23 // START OF FILE 23 #include "conversation.h"
24 /*****************************************************************************/ 24 #include "debug.h"
25 #include "debug.h" // gaim_debug 25
26 #include "conversation.h" // gaim_find_conversation_with_account 26 #include "buddy_status.h"
27 27 #include "char_conv.h"
28 #include "buddy_status.h" // QQ_BUDDY_ONLINE_NORMAL 28 #include "group_find.h"
29 #include "char_conv.h" // convert_as_pascal_string 29 #include "group_hash.h"
30 #include "group_find.h" // qq_group_find_by_internal_group_id
31 #include "group_hash.h" // qq_group_refresh
32 #include "group_info.h" 30 #include "group_info.h"
33 #include "buddy_status.h" // is_online 31 #include "buddy_status.h"
34 #include "group_network.h" // qq_send_group_cmd 32 #include "group_network.h"
35 33
36 // we check who needs to update member info every minutes 34 /* we check who needs to update member info every minutes
37 // this interval determines if their member info is outdated 35 * this interval determines if their member info is outdated */
38 #define QQ_GROUP_CHAT_REFRESH_NICKNAME_INTERNAL 180 36 #define QQ_GROUP_CHAT_REFRESH_NICKNAME_INTERNAL 180
39 37
40 /*****************************************************************************/ 38 static gboolean _is_group_member_need_update_info(qq_buddy *member)
41 static gboolean _is_group_member_need_update_info(qq_buddy * member)
42 { 39 {
43 g_return_val_if_fail(member != NULL, FALSE); 40 g_return_val_if_fail(member != NULL, FALSE);
44 return (member->nickname == NULL) || 41 return (member->nickname == NULL) ||
45 (time(NULL) - member->last_refresh) > QQ_GROUP_CHAT_REFRESH_NICKNAME_INTERNAL; 42 (time(NULL) - member->last_refresh) > QQ_GROUP_CHAT_REFRESH_NICKNAME_INTERNAL;
46 } // _is_group_member_need_update_info 43 }
47 44
48 /*****************************************************************************/ 45 /* this is done when we receive the reply to get_online_member sub_cmd
49 // this is done when we receive the reply to get_online_member sub_cmd 46 * all member are set offline, and then only those in reply packets are online */
50 // all member are set offline, and then only those in reply packets are online 47 static void _qq_group_set_members_all_offline(qq_group *group)
51 static void _qq_group_set_members_all_offline(qq_group * group)
52 { 48 {
53 GList *list; 49 GList *list;
54 qq_buddy *member; 50 qq_buddy *member;
55 g_return_if_fail(group != NULL); 51 g_return_if_fail(group != NULL);
56 52
57 list = group->members; 53 list = group->members;
58 while (list != NULL) { 54 while (list != NULL) {
59 member = (qq_buddy *) list->data; 55 member = (qq_buddy *) list->data;
60 member->status = QQ_BUDDY_ONLINE_OFFLINE; 56 member->status = QQ_BUDDY_ONLINE_OFFLINE;
61 list = list->next; 57 list = list->next;
62 } // while list 58 }
63 } // _qq_group_set_members_all_offline 59 }
64 60
65 /*****************************************************************************/ 61 /* send packet to get detailed information of one group */
66 // send packet to get detailed information of one group 62 void qq_send_cmd_group_get_group_info(GaimConnection *gc, qq_group *group)
67 void qq_send_cmd_group_get_group_info(GaimConnection * gc, qq_group * group)
68 { 63 {
69 guint8 *raw_data, *cursor; 64 guint8 *raw_data, *cursor;
70 gint bytes, data_len; 65 gint bytes, data_len;
71 66
72 g_return_if_fail(gc != NULL && group != NULL); 67 g_return_if_fail(gc != NULL && group != NULL);
82 if (bytes != data_len) 77 if (bytes != data_len)
83 gaim_debug(GAIM_DEBUG_ERROR, "QQ", 78 gaim_debug(GAIM_DEBUG_ERROR, "QQ",
84 "Fail create packet for %s\n", qq_group_cmd_get_desc(QQ_GROUP_CMD_GET_GROUP_INFO)); 79 "Fail create packet for %s\n", qq_group_cmd_get_desc(QQ_GROUP_CMD_GET_GROUP_INFO));
85 else 80 else
86 qq_send_group_cmd(gc, group, raw_data, data_len); 81 qq_send_group_cmd(gc, group, raw_data, data_len);
87 } // qq_send_cmd_group_get_group_info 82 }
88 83
89 /*****************************************************************************/ 84 /* send packet to get online group member, called by keep_alive */
90 // send packet to get online group member, called by keep_alive 85 void qq_send_cmd_group_get_online_member(GaimConnection *gc, qq_group *group)
91 void qq_send_cmd_group_get_online_member(GaimConnection * gc, qq_group * group) { 86 {
92 guint8 *raw_data, *cursor; 87 guint8 *raw_data, *cursor;
93 gint bytes, data_len; 88 gint bytes, data_len;
94 89
95 g_return_if_fail(gc != NULL && group != NULL); 90 g_return_if_fail(gc != NULL && group != NULL);
96 91
97 // only get online members when conversation window is on 92 /* only get online members when conversation window is on */
98 if (NULL == gaim_find_conversation_with_account(GAIM_CONV_TYPE_CHAT/*gfhuang*/,group->group_name_utf8, gaim_connection_get_account(gc))) { 93 if (NULL == gaim_find_conversation_with_account(GAIM_CONV_TYPE_CHAT,group->group_name_utf8, gaim_connection_get_account(gc))) {
99 gaim_debug(GAIM_DEBUG_WARNING, "QQ", 94 gaim_debug(GAIM_DEBUG_WARNING, "QQ",
100 "Conv windows for \"%s\" is not on, do not get online members\n", group->group_name_utf8); 95 "Conv windows for \"%s\" is not on, do not get online members\n", group->group_name_utf8);
101 return; 96 return;
102 } // if gaim_find_conversation_with_account 97 }
103 98
104 data_len = 5; 99 data_len = 5;
105 raw_data = g_newa(guint8, data_len); 100 raw_data = g_newa(guint8, data_len);
106 cursor = raw_data; 101 cursor = raw_data;
107 102
112 if (bytes != data_len) 107 if (bytes != data_len)
113 gaim_debug(GAIM_DEBUG_ERROR, "QQ", 108 gaim_debug(GAIM_DEBUG_ERROR, "QQ",
114 "Fail create packet for %s\n", qq_group_cmd_get_desc(QQ_GROUP_CMD_GET_ONLINE_MEMBER)); 109 "Fail create packet for %s\n", qq_group_cmd_get_desc(QQ_GROUP_CMD_GET_ONLINE_MEMBER));
115 else 110 else
116 qq_send_group_cmd(gc, group, raw_data, data_len); 111 qq_send_group_cmd(gc, group, raw_data, data_len);
117 } // qq_send_cmd_group_search_group 112 }
118 113
119 /*****************************************************************************/ 114 /* send packet to get group member info */
120 // send packet to get group member info 115 void qq_send_cmd_group_get_member_info(GaimConnection *gc, qq_group *group)
121 void qq_send_cmd_group_get_member_info(GaimConnection * gc, qq_group * group) { 116 {
122 guint8 *raw_data, *cursor; 117 guint8 *raw_data, *cursor;
123 gint bytes, data_len, i; 118 gint bytes, data_len, i;
124 GList *list; 119 GList *list;
125 qq_buddy *member; 120 qq_buddy *member;
126 121
127 g_return_if_fail(gc != NULL && group != NULL); 122 g_return_if_fail(gc != NULL && group != NULL);
128 for (i = 0, list = group->members; list != NULL; list = list->next) { 123 for (i = 0, list = group->members; list != NULL; list = list->next) {
129 member = (qq_buddy *) list->data; 124 member = (qq_buddy *) list->data;
130 if (_is_group_member_need_update_info(member)) 125 if (_is_group_member_need_update_info(member))
131 i++; 126 i++;
132 } // for i 127 }
133 128
134 if (i <= 0) { 129 if (i <= 0) {
135 gaim_debug(GAIM_DEBUG_INFO, "QQ", "No group member needs to to update info now.\n"); 130 gaim_debug(GAIM_DEBUG_INFO, "QQ", "No group member needs to to update info now.\n");
136 return; 131 return;
137 } // if i 132 }
138 133
139 data_len = 5 + 4 * i; 134 data_len = 5 + 4 * i;
140 raw_data = g_newa(guint8, data_len); 135 raw_data = g_newa(guint8, data_len);
141 cursor = raw_data; 136 cursor = raw_data;
142 137
148 while (list != NULL) { 143 while (list != NULL) {
149 member = (qq_buddy *) list->data; 144 member = (qq_buddy *) list->data;
150 if (_is_group_member_need_update_info(member)) 145 if (_is_group_member_need_update_info(member))
151 bytes += create_packet_dw(raw_data, &cursor, member->uid); 146 bytes += create_packet_dw(raw_data, &cursor, member->uid);
152 list = list->next; 147 list = list->next;
153 } // while list 148 }
154 149
155 if (bytes != data_len) 150 if (bytes != data_len)
156 gaim_debug(GAIM_DEBUG_ERROR, "QQ", 151 gaim_debug(GAIM_DEBUG_ERROR, "QQ",
157 "Fail create packet for %s\n", qq_group_cmd_get_desc(QQ_GROUP_CMD_GET_MEMBER_INFO)); 152 "Fail create packet for %s\n", qq_group_cmd_get_desc(QQ_GROUP_CMD_GET_MEMBER_INFO));
158 else 153 else
159 qq_send_group_cmd(gc, group, raw_data, data_len); 154 qq_send_group_cmd(gc, group, raw_data, data_len);
160 } // qq_send_cmd_group_get_member_info 155 }
161 156
162 /*****************************************************************************/ 157 void qq_process_group_cmd_get_group_info(guint8 *data, guint8 **cursor, gint len, GaimConnection *gc)
163 void qq_process_group_cmd_get_group_info(guint8 * data, guint8 ** cursor, gint len, GaimConnection * gc) { 158 {
164 qq_group *group; 159 qq_group *group;
165 qq_data *qd; 160 qq_data *qd;
166 guint8 orgnization, role; //gfhuang 161 guint8 orgnization, role;
167 guint16 unknown; 162 guint16 unknown;
168 guint32 member_uid, internal_group_id; 163 guint32 member_uid, internal_group_id;
169 gint pascal_len, i; 164 gint pascal_len, i;
170 guint32 unknown4; 165 guint32 unknown4;
171 guint8 unknown1; 166 guint8 unknown1;
180 group = qq_group_find_by_internal_group_id(gc, internal_group_id); 175 group = qq_group_find_by_internal_group_id(gc, internal_group_id);
181 g_return_if_fail(group != NULL); 176 g_return_if_fail(group != NULL);
182 177
183 read_packet_dw(data, cursor, len, &(group->external_group_id)); 178 read_packet_dw(data, cursor, len, &(group->external_group_id));
184 read_packet_b(data, cursor, len, &(group->group_type)); 179 read_packet_b(data, cursor, len, &(group->group_type));
185 read_packet_dw(data, cursor, len, &unknown4); //unknown 4 bytes, protocal changed by gfhuang 180 read_packet_dw(data, cursor, len, &unknown4); /* unknown 4 bytes */
186 read_packet_dw(data, cursor, len, &(group->creator_uid)); 181 read_packet_dw(data, cursor, len, &(group->creator_uid));
187 read_packet_b(data, cursor, len, &(group->auth_type)); 182 read_packet_b(data, cursor, len, &(group->auth_type));
188 read_packet_dw(data, cursor, len, &unknown4); // oldCategory, by gfhuang 183 read_packet_dw(data, cursor, len, &unknown4); /* oldCategory */
189 read_packet_w(data, cursor, len, &unknown); 184 read_packet_w(data, cursor, len, &unknown);
190 read_packet_dw(data, cursor, len, &(group->group_category)); 185 read_packet_dw(data, cursor, len, &(group->group_category));
191 read_packet_w(data, cursor, len, &(unknown)); // 0x0000 186 read_packet_w(data, cursor, len, &(unknown)); /* 0x0000 */
192 read_packet_b(data, cursor, len, &unknown1); 187 read_packet_b(data, cursor, len, &unknown1);
193 read_packet_dw(data, cursor, len, &(unknown4)); // versionID, by gfhuang 188 read_packet_dw(data, cursor, len, &(unknown4)); /* versionID */
194 189
195 pascal_len = convert_as_pascal_string(*cursor, &(group->group_name_utf8), QQ_CHARSET_DEFAULT); 190 pascal_len = convert_as_pascal_string(*cursor, &(group->group_name_utf8), QQ_CHARSET_DEFAULT);
196 *cursor += pascal_len; 191 *cursor += pascal_len;
197 read_packet_w(data, cursor, len, &(unknown)); // 0x0000 192 read_packet_w(data, cursor, len, &(unknown)); /* 0x0000 */
198 pascal_len = convert_as_pascal_string(*cursor, &(group->notice_utf8), QQ_CHARSET_DEFAULT); 193 pascal_len = convert_as_pascal_string(*cursor, &(group->notice_utf8), QQ_CHARSET_DEFAULT);
199 *cursor += pascal_len; 194 *cursor += pascal_len;
200 pascal_len = convert_as_pascal_string(*cursor, &(group->group_desc_utf8), QQ_CHARSET_DEFAULT); 195 pascal_len = convert_as_pascal_string(*cursor, &(group->group_desc_utf8), QQ_CHARSET_DEFAULT);
201 *cursor += pascal_len; 196 *cursor += pascal_len;
202 197
203 i = 0; 198 i = 0;
204 // now comes the member list separated by 0x00 199 /* now comes the member list separated by 0x00 */
205 while (*cursor < data + len) { 200 while (*cursor < data + len) {
206 read_packet_dw(data, cursor, len, &member_uid); 201 read_packet_dw(data, cursor, len, &member_uid);
207 i++; 202 i++;
208 read_packet_b(data, cursor, len, &orgnization); // protocal changed, gfhuang 203 read_packet_b(data, cursor, len, &orgnization);
209 read_packet_b(data, cursor, len, &role);// gfhuang 204 read_packet_b(data, cursor, len, &role);
210 205
211 if(orgnization != 0 || role != 0) { 206 if(orgnization != 0 || role != 0) {
212 gaim_debug(GAIM_DEBUG_INFO, "QQ", "group member %d: orgnizatio=%d, role=%d\n", member_uid, orgnization, role); 207 gaim_debug(GAIM_DEBUG_INFO, "QQ", "group member %d: orgnizatio=%d, role=%d\n", member_uid, orgnization, role);
213 } 208 }
214 qq_buddy *member = qq_group_find_or_add_member(gc, group, member_uid); 209 qq_buddy *member = qq_group_find_or_add_member(gc, group, member_uid);
215 member->role = role; 210 member->role = role;
216 } // while *cursor 211 }
217 if(*cursor > (data + len)) { 212 if(*cursor > (data + len)) {
218 gaim_debug(GAIM_DEBUG_ERROR, "QQ", "group_cmd_get_group_info: Dangerous error! maybe protocal changed, notify me!"); 213 gaim_debug(GAIM_DEBUG_ERROR, "QQ", "group_cmd_get_group_info: Dangerous error! maybe protocal changed, notify me!");
219 } 214 }
220 215
221 gaim_debug(GAIM_DEBUG_INFO, "QQ", "group \"%s\" has %d members\n", group->group_name_utf8, i); 216 gaim_debug(GAIM_DEBUG_INFO, "QQ", "group \"%s\" has %d members\n", group->group_name_utf8, i);
223 if (group->creator_uid == qd->uid) 218 if (group->creator_uid == qd->uid)
224 group->my_status = QQ_GROUP_MEMBER_STATUS_IS_ADMIN; 219 group->my_status = QQ_GROUP_MEMBER_STATUS_IS_ADMIN;
225 220
226 qq_group_refresh(gc, group); 221 qq_group_refresh(gc, group);
227 222
228 //added topic by gfhuang
229 GaimConversation *gaim_conv = gaim_find_conversation_with_account(GAIM_CONV_TYPE_CHAT,group->group_name_utf8, gaim_connection_get_account(gc)); 223 GaimConversation *gaim_conv = gaim_find_conversation_with_account(GAIM_CONV_TYPE_CHAT,group->group_name_utf8, gaim_connection_get_account(gc));
230 if(NULL == gaim_conv) { 224 if(NULL == gaim_conv) {
231 gaim_debug(GAIM_DEBUG_WARNING, "QQ", 225 gaim_debug(GAIM_DEBUG_WARNING, "QQ",
232 "Conv windows for \"%s\" is not on, do not set topic\n", group->group_name_utf8); 226 "Conv windows for \"%s\" is not on, do not set topic\n", group->group_name_utf8);
233 } 227 }
234 else { 228 else {
235 gaim_conv_chat_set_topic(GAIM_CONV_CHAT(gaim_conv), NULL, group->notice_utf8); 229 gaim_conv_chat_set_topic(GAIM_CONV_CHAT(gaim_conv), NULL, group->notice_utf8);
236 } 230 }
237 } // qq_process_group_cmd_get_group_info 231 }
238 232
239 /*****************************************************************************/ 233 void qq_process_group_cmd_get_online_member(guint8 *data, guint8 **cursor, gint len, GaimConnection *gc)
240 void qq_process_group_cmd_get_online_member(guint8 * data, guint8 ** cursor, gint len, GaimConnection * gc) { 234 {
241 guint32 internal_group_id, member_uid; 235 guint32 internal_group_id, member_uid;
242 guint8 unknown; 236 guint8 unknown;
243 gint bytes, i; 237 gint bytes, i;
244 qq_group *group; 238 qq_group *group;
245 qq_buddy *member; 239 qq_buddy *member;
247 g_return_if_fail(gc != NULL && data != NULL && len > 0); 241 g_return_if_fail(gc != NULL && data != NULL && len > 0);
248 242
249 if (data + len - *cursor < 4) { 243 if (data + len - *cursor < 4) {
250 gaim_debug(GAIM_DEBUG_ERROR, "QQ", "Invalid group online member reply, discard it!\n"); 244 gaim_debug(GAIM_DEBUG_ERROR, "QQ", "Invalid group online member reply, discard it!\n");
251 return; 245 return;
252 } // if data_len-*cursor 246 }
253 247
254 bytes = 0; 248 bytes = 0;
255 i = 0; 249 i = 0;
256 bytes += read_packet_dw(data, cursor, len, &internal_group_id); 250 bytes += read_packet_dw(data, cursor, len, &internal_group_id);
257 bytes += read_packet_b(data, cursor, len, &unknown); // 0x3c ?? 251 bytes += read_packet_b(data, cursor, len, &unknown); /* 0x3c ?? */
258 g_return_if_fail(internal_group_id > 0); 252 g_return_if_fail(internal_group_id > 0);
259 253
260 group = qq_group_find_by_internal_group_id(gc, internal_group_id); 254 group = qq_group_find_by_internal_group_id(gc, internal_group_id);
261 if (group == NULL) { 255 if (group == NULL) {
262 gaim_debug(GAIM_DEBUG_ERROR, "QQ", "We have no group info for internal id [%d]\n", internal_group_id); 256 gaim_debug(GAIM_DEBUG_ERROR, "QQ",
257 "We have no group info for internal id [%d]\n", internal_group_id);
263 return; 258 return;
264 } // if group == NULL 259 }
265 260
266 // set all offline first, then update those online 261 /* set all offline first, then update those online */
267 _qq_group_set_members_all_offline(group); 262 _qq_group_set_members_all_offline(group);
268 while (*cursor < data + len) { 263 while (*cursor < data + len) {
269 bytes += read_packet_dw(data, cursor, len, &member_uid); 264 bytes += read_packet_dw(data, cursor, len, &member_uid);
270 i++; 265 i++;
271 member = qq_group_find_or_add_member(gc, group, member_uid); 266 member = qq_group_find_or_add_member(gc, group, member_uid);
272 if (member != NULL) 267 if (member != NULL)
273 member->status = QQ_BUDDY_ONLINE_NORMAL; 268 member->status = QQ_BUDDY_ONLINE_NORMAL;
274 } // while 269 }
275 if(*cursor > (data + len)) { 270 if(*cursor > (data + len)) {
276 gaim_debug(GAIM_DEBUG_ERROR, "QQ", "group_cmd_get_online_member: Dangerous error! maybe protocal changed, notify me!"); 271 gaim_debug(GAIM_DEBUG_ERROR, "QQ",
272 "group_cmd_get_online_member: Dangerous error! maybe protocol changed, notify developers!");
277 } 273 }
278 274
279 gaim_debug(GAIM_DEBUG_INFO, "QQ", "Group \"%s\" has %d online members\n", group->group_name_utf8, i); 275 gaim_debug(GAIM_DEBUG_INFO, "QQ", "Group \"%s\" has %d online members\n", group->group_name_utf8, i);
280 276 }
281 } // qq_process_group_cmd_get_online_member 277
282 278 /* process the reply to get_member_info packet */
283 /*****************************************************************************/ 279 void qq_process_group_cmd_get_member_info(guint8 *data, guint8 **cursor, gint len, GaimConnection *gc)
284 // process the reply to get_member_info packet 280 {
285 void qq_process_group_cmd_get_member_info(guint8 * data, guint8 ** cursor, gint len, GaimConnection * gc) {
286 guint32 internal_group_id, member_uid; 281 guint32 internal_group_id, member_uid;
287 guint16 unknown; 282 guint16 unknown;
288 guint8 bar; 283 guint8 bar;
289 gint pascal_len, i; 284 gint pascal_len, i;
290 qq_group *group; 285 qq_group *group;
297 292
298 group = qq_group_find_by_internal_group_id(gc, internal_group_id); 293 group = qq_group_find_by_internal_group_id(gc, internal_group_id);
299 g_return_if_fail(group != NULL); 294 g_return_if_fail(group != NULL);
300 295
301 i = 0; 296 i = 0;
302 // now starts the member info, as get buddy list reply 297 /* now starts the member info, as get buddy list reply */
303 while (*cursor < data + len) { 298 while (*cursor < data + len) {
304 read_packet_dw(data, cursor, len, &member_uid); 299 read_packet_dw(data, cursor, len, &member_uid);
305 g_return_if_fail(member_uid > 0); 300 g_return_if_fail(member_uid > 0);
306 member = qq_group_find_member_by_uid(group, member_uid); 301 member = qq_group_find_member_by_uid(group, member_uid);
307 g_return_if_fail(member != NULL); 302 g_return_if_fail(member != NULL);
316 read_packet_w(data, cursor, len, &unknown); 311 read_packet_w(data, cursor, len, &unknown);
317 read_packet_b(data, cursor, len, &(member->flag1)); 312 read_packet_b(data, cursor, len, &(member->flag1));
318 read_packet_b(data, cursor, len, &(member->comm_flag)); 313 read_packet_b(data, cursor, len, &(member->comm_flag));
319 314
320 member->last_refresh = time(NULL); 315 member->last_refresh = time(NULL);
321 } // while 316 }
322 if(*cursor > (data + len)) { 317 if(*cursor > (data + len)) {
323 gaim_debug(GAIM_DEBUG_ERROR, "QQ", "group_cmd_get_member_info: Dangerous error! maybe protocal changed, notify me!"); 318 gaim_debug(GAIM_DEBUG_ERROR, "QQ",
319 "group_cmd_get_member_info: Dangerous error! maybe protocol changed, notify developers!");
324 } 320 }
325 gaim_debug(GAIM_DEBUG_INFO, "QQ", "Group \"%s\" obtained %d member info\n", group->group_name_utf8, i); 321 gaim_debug(GAIM_DEBUG_INFO, "QQ", "Group \"%s\" obtained %d member info\n", group->group_name_utf8, i);
326 322 }
327 } // qq_process_group_cmd_get_member_info
328
329 /*****************************************************************************/
330 // END OF FILE