00001
00023
00024
00025 #include "blist.h"
00026 #include "debug.h"
00027
00028 #include "utils.h"
00029 #include "buddy_opt.h"
00030 #include "group_hash.h"
00031 #include "group_misc.h"
00032
00033
00034 gchar *_qq_group_set_my_status_desc(qq_group * group)
00035 {
00036 gchar *status_desc;
00037 g_return_val_if_fail(group != NULL, g_strdup(""));
00038
00039 switch (group->my_status) {
00040 case QQ_GROUP_MEMBER_STATUS_NOT_MEMBER:
00041 status_desc = _("I am not member");
00042 break;
00043 case QQ_GROUP_MEMBER_STATUS_IS_MEMBER:
00044 status_desc = _("I am a member");
00045 break;
00046 case QQ_GROUP_MEMBER_STATUS_APPLYING:
00047 status_desc = _("I am applying to join");
00048 break;
00049 case QQ_GROUP_MEMBER_STATUS_IS_ADMIN:
00050 status_desc = _("I am the admin");
00051 break;
00052 default:
00053 status_desc = _("Unknown status");
00054 }
00055
00056 return g_strdup(status_desc);
00057 }
00058
00059
00060 void _qq_group_add_to_blist(GaimConnection * gc, qq_group * group)
00061 {
00062 GHashTable *components;
00063 GaimGroup *g;
00064 GaimChat *chat;
00065 components = qq_group_to_hashtable(group);
00066 chat = gaim_chat_new(gaim_connection_get_account(gc), group->group_name_utf8, components);
00067 g = qq_get_gaim_group(GAIM_GROUP_QQ_QUN);
00068 gaim_blist_add_chat(chat, g, NULL);
00069 gaim_debug(GAIM_DEBUG_INFO, "QQ", "You have add group \"%s\" to blist locally\n", group->group_name_utf8);
00070 }
00071
00072
00073
00074
00075
00076 qq_group *qq_group_create_by_id(GaimConnection * gc, guint32 internal_id, guint32 external_id) {
00077 qq_group *group;
00078 qq_data *qd;
00079
00080 g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, NULL);
00081 g_return_val_if_fail(internal_id > 0, NULL);
00082 qd = (qq_data *) gc->proto_data;
00083
00084 group = g_new0(qq_group, 1);
00085 group->my_status = QQ_GROUP_MEMBER_STATUS_NOT_MEMBER;
00086 group->my_status_desc = _qq_group_set_my_status_desc(group);
00087 group->internal_group_id = internal_id;
00088 group->external_group_id = external_id;
00089 group->group_type = 0x01;
00090 group->creator_uid = 10000;
00091 group->group_category = 0x01;
00092 group->auth_type = 0x02;
00093 group->group_name_utf8 = g_strdup("");
00094 group->group_desc_utf8 = g_strdup("");
00095 group->notice_utf8 = g_strdup("");
00096 group->members = NULL;
00097
00098 qd->groups = g_list_append(qd->groups, group);
00099 _qq_group_add_to_blist(gc, group);
00100
00101 return group;
00102 }
00103
00104
00105
00106 GHashTable *qq_group_to_hashtable(qq_group * group)
00107 {
00108 GHashTable *components;
00109 components = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
00110 g_hash_table_insert(components, g_strdup(QQ_GROUP_KEY_MEMBER_STATUS), g_strdup_printf("%d", group->my_status));
00111 group->my_status_desc = _qq_group_set_my_status_desc(group);
00112
00113 g_hash_table_insert(components,
00114 g_strdup(QQ_GROUP_KEY_INTERNAL_ID), g_strdup_printf("%d", group->internal_group_id));
00115 g_hash_table_insert(components, g_strdup(QQ_GROUP_KEY_EXTERNAL_ID),
00116 g_strdup_printf("%d", group->external_group_id));
00117 g_hash_table_insert(components, g_strdup(QQ_GROUP_KEY_GROUP_TYPE), g_strdup_printf("%d", group->group_type));
00118 g_hash_table_insert(components, g_strdup(QQ_GROUP_KEY_CREATOR_UID), g_strdup_printf("%d", group->creator_uid));
00119 g_hash_table_insert(components,
00120 g_strdup(QQ_GROUP_KEY_GROUP_CATEGORY), g_strdup_printf("%d", group->group_category));
00121 g_hash_table_insert(components, g_strdup(QQ_GROUP_KEY_AUTH_TYPE), g_strdup_printf("%d", group->auth_type));
00122 g_hash_table_insert(components, g_strdup(QQ_GROUP_KEY_MEMBER_STATUS_DESC), g_strdup(group->my_status_desc));
00123 g_hash_table_insert(components, g_strdup(QQ_GROUP_KEY_GROUP_NAME_UTF8), g_strdup(group->group_name_utf8));
00124 g_hash_table_insert(components, g_strdup(QQ_GROUP_KEY_GROUP_DESC_UTF8), g_strdup(group->group_desc_utf8));
00125 return components;
00126 }
00127
00128
00129
00130 qq_group *qq_group_from_hashtable(GaimConnection * gc, GHashTable * data)
00131 {
00132 qq_data *qd;
00133 qq_group *group;
00134
00135 g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, NULL);
00136 g_return_val_if_fail(data != NULL, NULL);
00137 qd = (qq_data *) gc->proto_data;
00138
00139 group = g_new0(qq_group, 1);
00140 group->my_status =
00141 qq_string_to_dec_value
00142 (NULL ==
00143 g_hash_table_lookup(data,
00144 QQ_GROUP_KEY_MEMBER_STATUS) ?
00145 g_strdup_printf("%d",
00146 QQ_GROUP_MEMBER_STATUS_NOT_MEMBER) :
00147 g_hash_table_lookup(data, QQ_GROUP_KEY_MEMBER_STATUS));
00148 group->internal_group_id = qq_string_to_dec_value(g_hash_table_lookup(data, QQ_GROUP_KEY_INTERNAL_ID));
00149 group->external_group_id = qq_string_to_dec_value(g_hash_table_lookup(data, QQ_GROUP_KEY_EXTERNAL_ID));
00150 group->group_type = qq_string_to_dec_value(g_hash_table_lookup(data, QQ_GROUP_KEY_GROUP_TYPE));
00151 group->creator_uid = qq_string_to_dec_value(g_hash_table_lookup(data, QQ_GROUP_KEY_CREATOR_UID));
00152 group->group_category = qq_string_to_dec_value(g_hash_table_lookup(data, QQ_GROUP_KEY_GROUP_CATEGORY));
00153 group->auth_type = qq_string_to_dec_value(g_hash_table_lookup(data, QQ_GROUP_KEY_AUTH_TYPE));
00154 group->group_name_utf8 = g_strdup(g_hash_table_lookup(data, QQ_GROUP_KEY_GROUP_NAME_UTF8));
00155 group->group_desc_utf8 = g_strdup(g_hash_table_lookup(data, QQ_GROUP_KEY_GROUP_DESC_UTF8));
00156 group->my_status_desc = _qq_group_set_my_status_desc(group);
00157
00158 qd->groups = g_list_append(qd->groups, group);
00159
00160 return group;
00161 }
00162
00163
00164
00165 void qq_group_refresh(GaimConnection * gc, qq_group * group)
00166 {
00167 GaimChat *chat;
00168 g_return_if_fail(gc != NULL && group != NULL);
00169
00170 chat = gaim_blist_find_chat(gaim_connection_get_account(gc), g_strdup_printf("%d", group->external_group_id));
00171 if (chat == NULL && group->my_status != QQ_GROUP_MEMBER_STATUS_NOT_MEMBER)
00172 _qq_group_add_to_blist(gc, group);
00173 else if (chat != NULL) {
00174
00175 if (group->group_name_utf8 != NULL && strlen(group->group_name_utf8) > 0)
00176 gaim_blist_alias_chat(chat, group->group_name_utf8);
00177 g_hash_table_replace(chat->components,
00178 g_strdup(QQ_GROUP_KEY_MEMBER_STATUS), g_strdup_printf("%d", group->my_status));
00179 group->my_status_desc = _qq_group_set_my_status_desc(group);
00180 g_hash_table_replace(chat->components,
00181 g_strdup(QQ_GROUP_KEY_MEMBER_STATUS_DESC), g_strdup(group->my_status_desc));
00182 g_hash_table_replace(chat->components,
00183 g_strdup(QQ_GROUP_KEY_INTERNAL_ID),
00184 g_strdup_printf("%d", group->internal_group_id));
00185 g_hash_table_replace(chat->components,
00186 g_strdup(QQ_GROUP_KEY_EXTERNAL_ID),
00187 g_strdup_printf("%d", group->external_group_id));
00188 g_hash_table_replace(chat->components,
00189 g_strdup(QQ_GROUP_KEY_GROUP_TYPE), g_strdup_printf("%d", group->group_type));
00190 g_hash_table_replace(chat->components,
00191 g_strdup(QQ_GROUP_KEY_CREATOR_UID), g_strdup_printf("%d", group->creator_uid));
00192 g_hash_table_replace(chat->components,
00193 g_strdup(QQ_GROUP_KEY_GROUP_CATEGORY),
00194 g_strdup_printf("%d", group->group_category));
00195 g_hash_table_replace(chat->components,
00196 g_strdup(QQ_GROUP_KEY_AUTH_TYPE), g_strdup_printf("%d", group->auth_type));
00197 g_hash_table_replace(chat->components,
00198 g_strdup(QQ_GROUP_KEY_GROUP_NAME_UTF8), g_strdup(group->group_name_utf8));
00199 g_hash_table_replace(chat->components,
00200 g_strdup(QQ_GROUP_KEY_GROUP_DESC_UTF8), g_strdup(group->group_desc_utf8));
00201 }
00202 }
00203
00204
00205