| 32 |
32 |
| 33 static qq_room_data *room_data_new(guint32 id, guint32 ext_id, gchar *title) |
33 static qq_room_data *room_data_new(guint32 id, guint32 ext_id, gchar *title) |
| 34 { |
34 { |
| 35 qq_room_data *rmd; |
35 qq_room_data *rmd; |
| 36 |
36 |
| 37 purple_debug_info("QQ", "Created room data: %s, ext id %d, id %d\n", |
37 purple_debug_info("QQ", "Created room data: %s, ext id %u, id %u\n", |
| 38 title, ext_id, id); |
38 title == NULL ? "(NULL)" : title, |
| |
39 ext_id, id); |
| 39 rmd = g_new0(qq_room_data, 1); |
40 rmd = g_new0(qq_room_data, 1); |
| 40 rmd->my_role = QQ_ROOM_ROLE_NO; |
41 rmd->my_role = QQ_ROOM_ROLE_NO; |
| 41 rmd->id = id; |
42 rmd->id = id; |
| 42 rmd->ext_id = ext_id; |
43 rmd->ext_id = ext_id; |
| 43 rmd->type8 = 0x01; /* assume permanent Qun */ |
44 rmd->type8 = 0x01; /* assume permanent Qun */ |
| 58 qq_room_data *rmd; |
59 qq_room_data *rmd; |
| 59 guint32 id, ext_id; |
60 guint32 id, ext_id; |
| 60 gchar *value; |
61 gchar *value; |
| 61 |
62 |
| 62 value = g_hash_table_lookup(data, QQ_ROOM_KEY_INTERNAL_ID); |
63 value = g_hash_table_lookup(data, QQ_ROOM_KEY_INTERNAL_ID); |
| 63 id = value ? strtol(value, NULL, 10) : 0; |
64 id = value ? strtoul(value, NULL, 10) : 0; |
| 64 value= g_hash_table_lookup(data, QQ_ROOM_KEY_EXTERNAL_ID); |
65 value= g_hash_table_lookup(data, QQ_ROOM_KEY_EXTERNAL_ID); |
| 65 ext_id = value ? strtol(value, NULL, 10) : 0; |
66 ext_id = value ? strtoul(value, NULL, 10) : 0; |
| 66 value = g_strdup(g_hash_table_lookup(data, QQ_ROOM_KEY_TITLE_UTF8)); |
67 value = g_strdup(g_hash_table_lookup(data, QQ_ROOM_KEY_TITLE_UTF8)); |
| 67 |
68 |
| 68 rmd = room_data_new(id, ext_id, value); |
69 rmd = room_data_new(id, ext_id, value); |
| 69 rmd->my_role = QQ_ROOM_ROLE_YES; |
70 rmd->my_role = QQ_ROOM_ROLE_YES; |
| 70 return rmd; |
71 return rmd; |
| 110 |
111 |
| 111 components = purple_chat_get_components(chat); |
112 components = purple_chat_get_components(chat); |
| 112 |
113 |
| 113 g_hash_table_replace(components, |
114 g_hash_table_replace(components, |
| 114 g_strdup(QQ_ROOM_KEY_INTERNAL_ID), |
115 g_strdup(QQ_ROOM_KEY_INTERNAL_ID), |
| 115 g_strdup_printf("%d", rmd->id)); |
116 g_strdup_printf("%u", rmd->id)); |
| 116 g_hash_table_replace(components, |
117 g_hash_table_replace(components, |
| 117 g_strdup(QQ_ROOM_KEY_EXTERNAL_ID), |
118 g_strdup(QQ_ROOM_KEY_EXTERNAL_ID), |
| 118 g_strdup_printf("%d", rmd->ext_id)); |
119 g_strdup_printf("%u", rmd->ext_id)); |
| 119 g_hash_table_replace(components, |
120 g_hash_table_replace(components, |
| 120 g_strdup(QQ_ROOM_KEY_TITLE_UTF8), g_strdup(rmd->title_utf8)); |
121 g_strdup(QQ_ROOM_KEY_TITLE_UTF8), g_strdup(rmd->title_utf8)); |
| 121 } |
122 } |
| 122 |
123 |
| 123 static PurpleChat *chat_new(PurpleConnection *gc, qq_room_data *rmd) |
124 static PurpleChat *chat_new(PurpleConnection *gc, qq_room_data *rmd) |
| 124 { |
125 { |
| 125 GHashTable *components; |
126 GHashTable *components; |
| 126 PurpleGroup *g; |
127 PurpleGroup *g; |
| 127 PurpleChat *chat; |
128 PurpleChat *chat; |
| 128 |
129 |
| 129 purple_debug_info("QQ", "Add new chat: id %d, ext id %d, title %s\n", |
130 purple_debug_info("QQ", "Add new chat: id %u, ext id %u, title %s\n", |
| 130 rmd->id, rmd->ext_id, rmd->title_utf8); |
131 rmd->id, rmd->ext_id, |
| |
132 rmd->title_utf8 == NULL ? "(NULL)" : rmd->title_utf8); |
| 131 |
133 |
| 132 components = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); |
134 components = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); |
| 133 g_hash_table_insert(components, |
135 g_hash_table_insert(components, |
| 134 g_strdup(QQ_ROOM_KEY_INTERNAL_ID), g_strdup_printf("%d", rmd->id)); |
136 g_strdup(QQ_ROOM_KEY_INTERNAL_ID), g_strdup_printf("%u", rmd->id)); |
| 135 g_hash_table_insert(components, g_strdup(QQ_ROOM_KEY_EXTERNAL_ID), |
137 g_hash_table_insert(components, g_strdup(QQ_ROOM_KEY_EXTERNAL_ID), |
| 136 g_strdup_printf("%d", rmd->ext_id)); |
138 g_strdup_printf("%u", rmd->ext_id)); |
| 137 g_hash_table_insert(components, g_strdup(QQ_ROOM_KEY_TITLE_UTF8), g_strdup(rmd->title_utf8)); |
139 g_hash_table_insert(components, g_strdup(QQ_ROOM_KEY_TITLE_UTF8), g_strdup(rmd->title_utf8)); |
| 138 |
140 |
| 139 chat = purple_chat_new(purple_connection_get_account(gc), rmd->title_utf8, components); |
141 chat = purple_chat_new(purple_connection_get_account(gc), rmd->title_utf8, components); |
| 140 g = qq_group_find_or_new(PURPLE_GROUP_QQ_QUN); |
142 g = qq_group_find_or_new(PURPLE_GROUP_QQ_QUN); |
| 141 purple_blist_add_chat(chat, g, NULL); |
143 purple_blist_add_chat(chat, g, NULL); |
| 153 g_return_val_if_fail (gc != NULL && gc->proto_data != NULL, NULL); |
155 g_return_val_if_fail (gc != NULL && gc->proto_data != NULL, NULL); |
| 154 qd = (qq_data *) gc->proto_data; |
156 qd = (qq_data *) gc->proto_data; |
| 155 |
157 |
| 156 g_return_val_if_fail(id != 0 && ext_id != 0, NULL); |
158 g_return_val_if_fail(id != 0 && ext_id != 0, NULL); |
| 157 |
159 |
| 158 purple_debug_info("QQ", "Find or add new room: id %d, ext id %d\n", id, ext_id); |
160 purple_debug_info("QQ", "Find or add new room: id %u, ext id %u\n", id, ext_id); |
| 159 |
161 |
| 160 rmd = qq_room_data_find(gc, id); |
162 rmd = qq_room_data_find(gc, id); |
| 161 if (rmd == NULL) { |
163 if (rmd == NULL) { |
| 162 rmd = room_data_new(id, ext_id, NULL); |
164 rmd = room_data_new(id, ext_id, NULL); |
| 163 g_return_val_if_fail(rmd != NULL, NULL); |
165 g_return_val_if_fail(rmd != NULL, NULL); |
| 164 rmd->my_role = QQ_ROOM_ROLE_YES; |
166 rmd->my_role = QQ_ROOM_ROLE_YES; |
| 165 qd->groups = g_list_append(qd->groups, rmd); |
167 qd->groups = g_list_append(qd->groups, rmd); |
| 166 } |
168 } |
| 167 |
169 |
| 168 num_str = g_strdup_printf("%d", ext_id); |
170 num_str = g_strdup_printf("%u", ext_id); |
| 169 chat = purple_blist_find_chat(purple_connection_get_account(gc), num_str); |
171 chat = purple_blist_find_chat(purple_connection_get_account(gc), num_str); |
| 170 g_free(num_str); |
172 g_free(num_str); |
| 171 if (chat) { |
173 if (chat) { |
| 172 return chat; |
174 return chat; |
| 173 } |
175 } |
| 184 guint32 ext_id; |
186 guint32 ext_id; |
| 185 |
187 |
| 186 g_return_if_fail (gc != NULL && gc->proto_data != NULL); |
188 g_return_if_fail (gc != NULL && gc->proto_data != NULL); |
| 187 qd = (qq_data *) gc->proto_data; |
189 qd = (qq_data *) gc->proto_data; |
| 188 |
190 |
| 189 purple_debug_info("QQ", "Find and remove room data, id %d", id); |
191 purple_debug_info("QQ", "Find and remove room data, id %u", id); |
| 190 rmd = qq_room_data_find(gc, id); |
192 rmd = qq_room_data_find(gc, id); |
| 191 g_return_if_fail (rmd != NULL); |
193 g_return_if_fail (rmd != NULL); |
| 192 |
194 |
| 193 ext_id = rmd->ext_id; |
195 ext_id = rmd->ext_id; |
| 194 qd->groups = g_list_remove(qd->groups, rmd); |
196 qd->groups = g_list_remove(qd->groups, rmd); |
| 195 room_data_free(rmd); |
197 room_data_free(rmd); |
| 196 |
198 |
| 197 purple_debug_info("QQ", "Find and remove chat, ext_id %d", ext_id); |
199 purple_debug_info("QQ", "Find and remove chat, ext_id %u", ext_id); |
| 198 num_str = g_strdup_printf("%d", ext_id); |
200 num_str = g_strdup_printf("%u", ext_id); |
| 199 chat = purple_blist_find_chat(purple_connection_get_account(gc), num_str); |
201 chat = purple_blist_find_chat(purple_connection_get_account(gc), num_str); |
| 200 g_free(num_str); |
202 g_free(num_str); |
| 201 |
203 |
| 202 g_return_if_fail (chat != NULL); |
204 g_return_if_fail (chat != NULL); |
| 203 |
205 |