首页 | 数据结构 | 文件列表 | 数据字段 | 全局定义

group_find.c

浏览该文件的文档。
00001 
00023 // START OF FILE
00024 /*****************************************************************************/
00025 #include "debug.h"              // gaim_debug
00026 #include "conversation.h"       // GaimConversation
00027 
00028 #include "utils.h"              // QQ_NAME_PREFIX, gaim_name_to_uid
00029 #include "group_find.h"
00030 #include "group_network.h"      // group_packet
00031 #include "qq.h"                 // qq_data
00032 
00033 /*****************************************************************************/
00034 // find a chat member's valid gaim_name of its nickname and chat room channel
00035 gchar *qq_group_find_member_by_channel_and_nickname(GaimConnection * gc, gint channel, const gchar * who) {
00036         qq_group *group;
00037         qq_buddy *member;
00038         GList *list;
00039 
00040         g_return_val_if_fail(gc != NULL && who != NULL, NULL);
00041 
00042         // if it starts with QQ_NAME_PREFIX, we think it is valid name already
00043         // otherwise we think it is nickname and try to find the matching gaim_name
00044         if (g_str_has_prefix(who, QQ_NAME_PREFIX) && gaim_name_to_uid(who) > 0)
00045                 return (gchar *) who;
00046 
00047         group = qq_group_find_by_channel(gc, channel);
00048         g_return_val_if_fail(group != NULL, NULL);
00049 
00050         list = group->members;
00051         member = NULL;
00052         while (list != NULL) {
00053                 member = (qq_buddy *) list->data;
00054                 if (member->nickname != NULL && !g_ascii_strcasecmp(member->nickname, who))
00055                         break;
00056                 list = list->next;
00057         }                       // while list
00058 
00059         return (member == NULL) ? NULL : uid_to_gaim_name(member->uid);
00060 
00061 }                               // qq_group_find_member_by_channel_and_nickname
00062 
00063 /*****************************************************************************/
00064 // find the internal_group_id by the reply packet sequence
00065 // return TRUE if we have a record of it, return FALSE if not
00066 gboolean qq_group_find_internal_group_id_by_seq(GaimConnection * gc, guint16 seq, guint32 * internal_group_id) {
00067         GList *list;
00068         qq_data *qd;
00069         group_packet *p;
00070 
00071         g_return_val_if_fail(gc != NULL && gc->proto_data != NULL && internal_group_id != NULL, FALSE);
00072         qd = (qq_data *) gc->proto_data;
00073 
00074         list = qd->group_packets;
00075         while (list != NULL) {
00076                 p = (group_packet *) (list->data);
00077                 if (p->send_seq == seq) {       // found and remove
00078                         *internal_group_id = p->internal_group_id;
00079                         qd->group_packets = g_list_remove(qd->group_packets, p);
00080                         g_free(p);
00081                         return TRUE;
00082                 }               // if
00083                 list = list->next;
00084         }                       // while
00085 
00086         return FALSE;
00087 }                               // qq_group_find_internal_group_id_by_seq
00088 
00089 /*****************************************************************************/
00090 // find a qq_buddy by uid, called by qq_im.c
00091 qq_buddy *qq_group_find_member_by_uid(qq_group * group, guint32 uid)
00092 {
00093         GList *list;
00094         qq_buddy *member;
00095         g_return_val_if_fail(group != NULL && uid > 0, NULL);
00096 
00097         list = group->members;
00098         while (list != NULL) {
00099                 member = (qq_buddy *) list->data;
00100                 if (member->uid == uid)
00101                         return member;
00102                 else
00103                         list = list->next;
00104         }                       // while list
00105 
00106         return NULL;
00107 }                               // qq_group_find_member_by_uid
00108 
00109 /*****************************************************************************/
00110 // remove a qq_buddy by uid, called by qq_group_opt.c
00111 void qq_group_remove_member_by_uid(qq_group * group, guint32 uid)
00112 {
00113         GList *list;
00114         qq_buddy *member;
00115         g_return_if_fail(group != NULL && uid > 0);
00116 
00117         list = group->members;
00118         while (list != NULL) {
00119                 member = (qq_buddy *) list->data;
00120                 if (member->uid == uid) {
00121                         group->members = g_list_remove(group->members, member);
00122                         return;
00123                 } else
00124                         list = list->next;
00125         }                       // while list
00126 
00127 }                               // qq_group_remove_member_by_uid
00128 
00129 /*****************************************************************************/
00130 qq_buddy *qq_group_find_or_add_member(GaimConnection * gc, qq_group * group, guint32 member_uid) {
00131         qq_buddy *member, *q_bud;
00132         GaimBuddy *buddy;
00133         g_return_val_if_fail(gc != NULL && group != NULL && member_uid > 0, NULL);
00134 
00135         member = qq_group_find_member_by_uid(group, member_uid);
00136         if (member == NULL) {   // first appear during my session
00137                 member = g_new0(qq_buddy, 1);
00138                 member->uid = member_uid;
00139                 buddy = gaim_find_buddy(gaim_connection_get_account(gc), uid_to_gaim_name(member_uid));
00140                 if (buddy != NULL) {
00141 /*                      q_bud = (qq_buddy *) buddy->proto_data;
00142                         if (q_bud != NULL )
00143                         {
00144                                 gaim_debug(GAIM_DEBUG_ERROR, "QQ", "gnap: q_bud->nickname: %s\n", q_bud->nickname);
00145                                 if(q_bud->nickname != NULL)
00146                                         member->nickname = g_strdup(q_bud->nickname);
00147                         }
00148                         else if (buddy->alias != NULL)
00149                                 member->nickname = g_strdup(buddy->alias); */
00150                 }               // if buddy != NULL
00151                 group->members = g_list_append(group->members, member);
00152         }                       // if member
00153 
00154         return member;
00155 }                               // qq_group_find_or_add_member
00156 
00157 /*****************************************************************************/
00158 // find a qq_group by chatroom channel
00159 qq_group *qq_group_find_by_channel(GaimConnection * gc, gint channel)
00160 {
00161         GaimConversation *conv;
00162         qq_data *qd;
00163         qq_group *group;
00164         GList *list;
00165 
00166         g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, NULL);
00167         qd = (qq_data *) gc->proto_data;
00168 
00169         conv = gaim_find_chat(gc, channel);
00170         g_return_val_if_fail(conv != NULL, NULL);
00171 
00172         list = qd->groups;
00173         group = NULL;
00174         while (list != NULL) {
00175                 group = (qq_group *) list->data;
00176                 if (!g_ascii_strcasecmp(gaim_conversation_get_name(conv), group->group_name_utf8))
00177                         break;
00178                 list = list->next;
00179         }                       // while list
00180 
00181         return group;
00182 
00183 }                               // qq_group_find_by_name
00184 
00185 /*****************************************************************************/
00186 // find a qq_group by internal_group_id
00187 qq_group *qq_group_find_by_internal_group_id(GaimConnection * gc, guint32 internal_group_id) {
00188 
00189         GList *list;
00190         qq_group *group;
00191         qq_data *qd;
00192 
00193         g_return_val_if_fail(gc != NULL && gc->proto_data != NULL && internal_group_id > 0, NULL);
00194 
00195         qd = (qq_data *) gc->proto_data;
00196         if (qd->groups == NULL)
00197                 return NULL;
00198 
00199         list = qd->groups;
00200         while (list != NULL) {
00201                 group = (qq_group *) list->data;
00202                 if (group->internal_group_id == internal_group_id)
00203                         return group;
00204                 list = list->next;
00205         }                       // while
00206 
00207         return NULL;
00208 }                               // qq_group_find_by_internal_group_id
00209 
00210 /*****************************************************************************/
00211 // END OF FILE

Generated at Mon May 8 15:41:23 2006 for OpenQ by  doxygen 1.4.4