Changeset 739:55ae5c895436 in mediastreamer2


Ignore:
Timestamp:
Oct 21, 2009 9:21:07 PM (4 years ago)
Author:
smorlat <smorlat@…>
Branch:
default
Message:

use buddy lookup to display buddy images in contact list (not finished).
buddy lookup important refactoring.

git-svn-id: svn+ssh://svn.savannah.nongnu.org/linphone/trunk@727 3f6dc0c8-ddfe-455d-9043-3cd528dc4637

Location:
linphone
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • linphone/coreapi/friend.c

    r297 r739  
    33 * 
    44 *  Sat May 15 15:25:16 2004 
    5  *  Copyright  2004  Simon Morlat 
     5 *  Copyright  2004-2009  Simon Morlat 
    66 *  Email 
    77 ****************************************************************************/ 
     
    562562        linphone_friend_unsubscribe(lf); 
    563563        if (lf->url!=NULL) osip_from_free(lf->url); 
     564        if (lf->info!=NULL) buddy_info_free(lf->info); 
    564565        ms_free(lf); 
    565566} 
     
    607608} 
    608609 
     610BuddyInfo * linphone_friend_get_info(const LinphoneFriend *lf){ 
     611        return lf->info; 
     612} 
    609613 
    610614void linphone_friend_apply(LinphoneFriend *fr, LinphoneCore *lc){ 
     
    639643        } 
    640644        ms_message("linphone_friend_apply() done."); 
     645        lc->bl_refresh=TRUE; 
    641646} 
    642647 
     
    666671                linphone_core_write_friends_config(lc); 
    667672        } 
     673} 
     674 
     675static bool_t username_match(const char *u1, const char *u2){ 
     676        if (u1==NULL && u2==NULL) return TRUE; 
     677        if (u1 && u2 && strcasecmp(u1,u2)==0) return TRUE; 
     678        return FALSE; 
     679} 
     680 
     681LinphoneFriend *linphone_core_get_friend_by_uri(const LinphoneCore *lc, const char *uri){ 
     682        osip_from_t *from; 
     683        osip_from_init(&from); 
     684        const MSList *elem; 
     685        if (osip_from_parse(from,uri)!=0){ 
     686                osip_from_free(from); 
     687                return NULL; 
     688        } 
     689        for(elem=lc->friends;elem!=NULL;elem=ms_list_next(elem)){ 
     690                LinphoneFriend *lf=(LinphoneFriend*)elem->data; 
     691                const char *it_username=lf->url->url->username; 
     692                const char *it_host=lf->url->url->host; 
     693                if (strcasecmp(from->url->host,it_host)==0 && username_match(from->url->username,it_username)){ 
     694                        return lf; 
     695                } 
     696        } 
     697        return NULL; 
    668698} 
    669699 
  • linphone/coreapi/linphonecore.c

    r728 r739  
    10371037} 
    10381038 
     1039static void assign_buddy_info(LinphoneCore *lc, BuddyInfo *info){ 
     1040        LinphoneFriend *lf=linphone_core_get_friend_by_uri(lc,info->sip_uri); 
     1041        if (lf!=NULL){ 
     1042                lf->info=info; 
     1043                ms_message("%s has a BuddyInfo assigned.",info->sip_uri); 
     1044        }else{ 
     1045                ms_warning("Could not any friend with uri %s",info->sip_uri); 
     1046        } 
     1047} 
     1048 
     1049static void analyze_buddy_lookup_results(LinphoneCore *lc, LinphoneProxyConfig *cfg){ 
     1050        MSList *elem; 
     1051        SipSetupContext *ctx=linphone_proxy_config_get_sip_setup_context(cfg); 
     1052        for (elem=lc->bl_reqs;elem!=NULL;elem=ms_list_next(elem)){ 
     1053                BuddyLookupRequest *req=(BuddyLookupRequest *)elem->data; 
     1054                if (req->status==BuddyLookupDone || req->status==BuddyLookupFailure){ 
     1055                        if (req->results!=NULL){ 
     1056                                BuddyInfo *i=(BuddyInfo*)req->results->data; 
     1057                                ms_list_free(req->results); 
     1058                                req->results=NULL; 
     1059                                assign_buddy_info(lc,i); 
     1060                        } 
     1061                        sip_setup_context_buddy_lookup_free(ctx,req); 
     1062                        elem->data=NULL; 
     1063                } 
     1064        } 
     1065        /*purge completed requests */ 
     1066        while((elem=ms_list_find(lc->bl_reqs,NULL))!=NULL){ 
     1067                lc->bl_reqs=ms_list_remove_link(lc->bl_reqs,elem); 
     1068        } 
     1069} 
     1070 
     1071static void linphone_core_grab_buddy_infos(LinphoneCore *lc, LinphoneProxyConfig *cfg){ 
     1072        const MSList *elem; 
     1073        SipSetupContext *ctx=linphone_proxy_config_get_sip_setup_context(cfg); 
     1074        for(elem=linphone_core_get_friend_list(lc);elem!=NULL;elem=elem->next){ 
     1075                LinphoneFriend *lf=(LinphoneFriend*)elem->data; 
     1076                if (lf->info==NULL){ 
     1077                        char *url=linphone_friend_get_url(lf); 
     1078                        if (linphone_core_lookup_known_proxy(lc,url)==cfg){ 
     1079                                char *name=linphone_friend_get_name(lf); 
     1080                                if (name!=NULL && strlen(name)>0){ 
     1081                                        BuddyLookupRequest *req; 
     1082                                        req=sip_setup_context_create_buddy_lookup_request(ctx); 
     1083                                        buddy_lookup_request_set_key(req,name); 
     1084                                        buddy_lookup_request_set_max_results(req,1); 
     1085                                        sip_setup_context_buddy_lookup_submit(ctx,req); 
     1086                                        lc->bl_reqs=ms_list_append(lc->bl_reqs,req); 
     1087                                } 
     1088                                ms_free(name); 
     1089                        } 
     1090                        ms_free(url); 
     1091                } 
     1092        } 
     1093} 
     1094 
     1095static void linphone_core_do_plugin_tasks(LinphoneCore *lc){ 
     1096        LinphoneProxyConfig *cfg=NULL; 
     1097        linphone_core_get_default_proxy(lc,&cfg); 
     1098        if (cfg){ 
     1099                if (lc->bl_refresh){ 
     1100                        SipSetupContext *ctx=linphone_proxy_config_get_sip_setup_context(cfg); 
     1101                        if (ctx && (sip_setup_context_get_capabilities(ctx) & SIP_SETUP_CAP_BUDDY_LOOKUP)){ 
     1102                                linphone_core_grab_buddy_infos(lc,cfg); 
     1103                                lc->bl_refresh=FALSE; 
     1104                        } 
     1105                } 
     1106                if (lc->bl_reqs) analyze_buddy_lookup_results(lc,cfg); 
     1107        } 
     1108} 
     1109 
    10391110void linphone_core_iterate(LinphoneCore *lc) 
    10401111{ 
     
    11101181        if (disconnected) 
    11111182                linphone_core_disconnected(lc); 
     1183 
     1184        linphone_core_do_plugin_tasks(lc); 
     1185 
    11121186        if (one_second_elapsed && lp_config_needs_commit(lc->config)){ 
    11131187                lp_config_sync(lc->config); 
     
    11981272                                return FALSE; 
    11991273                        } 
    1200                         sipaddr=ortp_strdup_printf("sip:%s@%s",url,uri->url->host); 
     1274                        if (uri->url->port!=NULL && uri->url->port[0]!='\0') 
     1275                                sipaddr=ortp_strdup_printf("sip:%s@%s:%s",url,uri->url->host,uri->url->port); 
     1276                        else 
     1277                                sipaddr=ortp_strdup_printf("sip:%s@%s",url,uri->url->host); 
    12011278                        if (real_parsed_url!=NULL) *real_parsed_url=osip_to_create(sipaddr); 
    12021279                        if (real_url!=NULL) *real_url=sipaddr; 
  • linphone/coreapi/linphonecore.h

    r685 r739  
    213213        struct _LinphoneProxyConfig *proxy; 
    214214        struct _LinphoneCore *lc; 
     215        BuddyInfo *info; 
    215216        bool_t subscribe; 
    216217        bool_t inc_subscribe_pending; 
     
    234235LinphoneSubscribePolicy linphone_friend_get_inc_subscribe_policy(const LinphoneFriend *lf); 
    235236LinphoneOnlineStatus linphone_friend_get_status(const LinphoneFriend *lf); 
     237BuddyInfo * linphone_friend_get_info(const LinphoneFriend *lf); 
    236238#define linphone_friend_in_list(lf)     ((lf)->lc!=NULL) 
    237239 
     
    478480        struct _VideoStream *previewstream; 
    479481        struct _RtpProfile *local_profile; 
     482        MSList *bl_reqs; 
    480483        MSList *subscribers;    /* unknown subscribers */ 
    481484        int minutes_away; 
     
    502505        bool_t apply_nat_settings; 
    503506        bool_t ready; 
     507        bool_t bl_refresh; 
    504508#ifdef VINCENT_MAURY_RSVP 
    505509        /* QoS parameters*/ 
     
    696700/* notify all friends that have subscribed */ 
    697701void linphone_core_notify_all_friends(LinphoneCore *lc, LinphoneOnlineStatus os); 
     702LinphoneFriend *linphone_core_get_friend_by_uri(const LinphoneCore *lc, const char *uri); 
    698703 
    699704/* returns a list of LinphoneCallLog */ 
  • linphone/coreapi/plugins/buddylookup/src/lookup.c

    r738 r739  
    1010static bool_t buddy_lookup_init(void){ 
    1111        return TRUE; 
    12 } 
    13  
    14 typedef struct _BuddyLookupState{ 
     12}; 
     13 
     14typedef struct _BLReq{ 
     15        BuddyLookupRequest base; 
     16        SoupMessage *msg; 
    1517        SoupSession *session; 
    16         BuddyLookupStatus status; 
    17         SoupMessage *msg; 
    1818        ortp_thread_t th; 
    19         MSList *results; 
    20         bool_t processing; 
    21 }BuddyLookupState; 
    22  
    23 #define get_buddy_lookup_state(ctx)     ((BuddyLookupState*)((ctx)->data)) 
     19}BLReq; 
     20 
    2421 
    2522void set_proxy(SoupSession *session, const char *proxy){ 
     
    3027 
    3128static void buddy_lookup_instance_init(SipSetupContext *ctx){ 
    32         BuddyLookupState *s=ms_new0(BuddyLookupState,1); 
    33         const char *proxy=NULL; 
    34         s->session=soup_session_sync_new(); 
    35         proxy=getenv("http_proxy"); 
    36         if (proxy && strlen(proxy)>0) set_proxy(s->session,proxy); 
    37         ctx->data=s; 
    3829} 
    3930 
    4031static void buddy_lookup_instance_uninit(SipSetupContext *ctx){ 
    41         BuddyLookupState *s=get_buddy_lookup_state(ctx); 
    42         g_object_unref(G_OBJECT(s->session)); 
    43         ms_free(s); 
    44 } 
    45  
    46 static SoupMessage * build_xmlrpc_request(const char *identity, const char *password, const char *key, const char *domain, const char *url){ 
     32} 
     33 
     34static SoupMessage * build_xmlrpc_request(const char *identity, const char *password, const char *key, const char *domain, const char *url, int max_results){ 
    4735        SoupMessage * msg; 
    4836 
     
    5240                                G_TYPE_STRING, password ? password : "", 
    5341                                G_TYPE_STRING, key, 
    54                                 G_TYPE_INT , 100, 
     42                                G_TYPE_INT , max_results, 
    5543                                G_TYPE_INT , 0, 
    5644                                G_TYPE_STRING, domain, 
     
    6654} 
    6755 
    68 static void got_headers(SipSetupContext *ctx, SoupMessage*msg){ 
    69         BuddyLookupState *s=get_buddy_lookup_state(ctx); 
     56static void got_headers(BLReq *blreq, SoupMessage*msg){ 
    7057        ms_message("Got headers !"); 
    71         s->status=BuddyLookupConnected; 
     58        blreq->base.status=BuddyLookupConnected; 
    7259} 
    7360 
     
    8269} 
    8370 
    84 static void fill_buddy_info(BuddyLookupState *s, BuddyInfo *bi, GHashTable *ht){ 
     71static void fill_buddy_info(BLReq *blreq, BuddyInfo *bi, GHashTable *ht){ 
    8572        char tmp[256]; 
    8673        fill_item(ht,"first_name",bi->firstname,sizeof(bi->firstname)); 
     
    10693                ms_message("This buddy has an image, let's download it: %s",tmp); 
    10794                msg=soup_message_new("GET",tmp); 
    108                 if ((status=soup_session_send_message(s->session,msg))==200){ 
     95                if ((status=soup_session_send_message(blreq->session,msg))==200){ 
    10996                        SoupMessageBody *body=msg->response_body; 
    11097                        ms_message("Received %i bytes",body->length); 
     
    120107} 
    121108 
    122 static MSList * make_buddy_list(BuddyLookupState *s, GValue *retval){ 
     109static MSList * make_buddy_list(BLReq *blreq, GValue *retval){ 
    123110        MSList *ret=NULL; 
    124111        if (G_VALUE_TYPE(retval)==G_TYPE_VALUE_ARRAY){ 
     
    131118                                GHashTable *ht=(GHashTable*)g_value_get_boxed(gelem); 
    132119                                BuddyInfo *bi=buddy_info_new(); 
    133                                 fill_buddy_info(s,bi,ht); 
     120                                fill_buddy_info(blreq,bi,ht); 
    134121                                ret=ms_list_append(ret,bi); 
    135122                        }else{ 
     
    142129 
    143130 
    144 static int xml_rpc_parse_response(SipSetupContext *ctx, SoupMessage *sm){ 
    145         BuddyLookupState *s=get_buddy_lookup_state(ctx); 
     131static int xml_rpc_parse_response(BLReq *blreq, SoupMessage *sm){ 
    146132        SoupBuffer *sb; 
    147133        GValue retval; 
     
    156142                        ms_error("Could not parse xml-rpc response !"); 
    157143                } 
    158                 s->status=BuddyLookupFailure; 
     144                blreq->base.status=BuddyLookupFailure; 
    159145        }else{ 
    160146                ms_message("Extracting values from return type..."); 
    161                 s->results=make_buddy_list(s,&retval); 
     147                blreq->base.results=make_buddy_list(blreq,&retval); 
    162148                g_value_unset(&retval); 
    163                 s->status=BuddyLookupDone; 
     149                blreq->base.status=BuddyLookupDone; 
    164150        } 
    165151        soup_buffer_free(sb); 
    166         return s->status==BuddyLookupDone ? 0 : -1; 
     152        return blreq->base.status==BuddyLookupDone ? 0 : -1; 
    167153} 
    168154 
    169155static void * process_xml_rpc_request(void *up){ 
    170         SipSetupContext *ctx=(SipSetupContext*)up; 
    171         BuddyLookupState *s=get_buddy_lookup_state(ctx); 
    172         SoupMessage *sm=s->msg; 
     156        BLReq *blreq=(BLReq*)up; 
     157        SoupMessage *sm=blreq->msg; 
    173158        int code; 
    174         g_signal_connect_swapped(G_OBJECT(sm),"got-headers",(GCallback)got_headers,ctx); 
    175         s->status=BuddyLookupConnecting; 
    176         code=soup_session_send_message(s->session,sm); 
     159        g_signal_connect_swapped(G_OBJECT(sm),"got-headers",(GCallback)got_headers,blreq); 
     160        blreq->base.status=BuddyLookupConnecting; 
     161        code=soup_session_send_message(blreq->session,sm); 
    177162        if (code==200){ 
    178163                ms_message("Got a response from server, yeah !"); 
    179                 xml_rpc_parse_response(ctx,sm); 
     164                xml_rpc_parse_response(blreq,sm); 
    180165        }else{ 
    181166                ms_error("request failed, error-code=%i (%s)",code,soup_status_get_phrase(code)); 
    182                 s->status=BuddyLookupFailure; 
    183         } 
    184         s->processing=FALSE; 
     167                blreq->base.status=BuddyLookupFailure; 
     168        } 
    185169        return NULL; 
    186170} 
    187171 
    188 static int lookup_buddy(SipSetupContext *ctx, const char *key){ 
    189         BuddyLookupState *s=get_buddy_lookup_state(ctx); 
     172static int lookup_buddy(SipSetupContext *ctx, BLReq *req){ 
    190173        LinphoneProxyConfig *cfg=sip_setup_context_get_proxy_config(ctx); 
    191174        LinphoneCore *lc=linphone_proxy_config_get_core(cfg); 
     
    200183                return -1; 
    201184        } 
    202         if (s->th!=0){ 
    203                 if (s->processing){ 
    204                         ms_message("Canceling previous request..."); 
    205                         soup_session_cancel_message(s->session,s->msg, SOUP_STATUS_CANCELLED); 
    206                 } 
    207                 ortp_thread_join(s->th,NULL); 
    208                 s->th=0; 
    209                 g_object_unref(G_OBJECT(s->msg)); 
    210         } 
    211185 
    212186        osip_from_t *from; 
     
    220194        if (aa) ms_message("There is a password: %s",aa->passwd); 
    221195        else ms_message("No password for %s on %s",from->url->username,from->url->host); 
    222         sm=build_xmlrpc_request(identity, aa ? aa->passwd : NULL, key, from->url->host, url); 
     196        sm=build_xmlrpc_request(identity, aa ? aa->passwd : NULL, req->base.key, from->url->host, url, req->base.max_results); 
    223197        osip_from_free(from); 
    224         s->msg=sm; 
    225         s->processing=TRUE; 
    226         ortp_thread_create(&s->th,NULL,process_xml_rpc_request,ctx); 
     198        req->msg=sm; 
     199        ortp_thread_create(&req->th,NULL,process_xml_rpc_request,req); 
    227200        if (!sm) return -1; 
    228201        return 0; 
    229202} 
    230203 
    231 static BuddyLookupStatus get_buddy_lookup_status(SipSetupContext *ctx){ 
    232         BuddyLookupState *s=get_buddy_lookup_state(ctx); 
    233         return s->status; 
    234 } 
    235  
    236 static int get_buddy_lookup_results(SipSetupContext *ctx, MSList **results){ 
    237         BuddyLookupState *s=get_buddy_lookup_state(ctx); 
    238         if (s->results){ 
    239                 *results=s->results; 
    240                 s->results=NULL; 
    241         } 
     204static BuddyLookupRequest * create_request(SipSetupContext *ctx){ 
     205        BLReq *req=ms_new0(BLReq,1); 
     206        const char *proxy=NULL; 
     207        req->session=soup_session_sync_new(); 
     208        proxy=getenv("http_proxy"); 
     209        if (proxy && strlen(proxy)>0) set_proxy(req->session,proxy); 
     210        return (BuddyLookupRequest*)req; 
     211} 
     212 
     213static int submit_request(SipSetupContext *ctx, BuddyLookupRequest *req){ 
     214        BLReq *blreq=(BLReq*)req; 
     215        return lookup_buddy(ctx,blreq); 
     216} 
     217 
     218static int free_request(SipSetupContext *ctx, BuddyLookupRequest *req){ 
     219        BLReq *blreq=(BLReq*)req; 
     220        if (blreq->th!=0){ 
     221                soup_session_cancel_message(blreq->session,blreq->msg, SOUP_STATUS_CANCELLED); 
     222                ortp_thread_join(blreq->th,NULL); 
     223                blreq->th=0; 
     224                g_object_unref(G_OBJECT(blreq->msg)); 
     225        } 
     226        if (blreq->session) 
     227                g_object_unref(G_OBJECT(blreq->session)); 
     228        buddy_lookup_request_free(req); 
    242229        return 0; 
    243230} 
     
    245232static void buddy_lookup_exit(void){ 
    246233} 
     234 
     235static BuddyLookupFuncs bl_funcs={ 
     236        .request_create=create_request, 
     237        .request_submit=submit_request, 
     238        .request_free=free_request 
     239}; 
     240 
     241 
    247242 
    248243static SipSetup buddy_lookup_funcs={ 
     
    251246        .init=buddy_lookup_init, 
    252247        .init_instance=buddy_lookup_instance_init, 
    253         .lookup_buddy=lookup_buddy, 
    254         .get_buddy_lookup_status=get_buddy_lookup_status, 
    255         .get_buddy_lookup_results=get_buddy_lookup_results, 
    256248        .uninit_instance=buddy_lookup_instance_uninit, 
    257         .exit=buddy_lookup_exit 
     249        .exit=buddy_lookup_exit, 
     250        .buddy_lookup_funcs=&bl_funcs, 
    258251}; 
    259252 
  • linphone/coreapi/sipsetup.c

    r738 r739  
    8080} 
    8181 
     82void buddy_lookup_request_set_key(BuddyLookupRequest *req, const char *key){ 
     83        if (req->key!=NULL) { 
     84                ms_free(req->key); 
     85                req->key=NULL; 
     86        } 
     87        if (key) req->key=ms_strdup(key); 
     88} 
     89 
     90void buddy_lookup_request_set_max_results(BuddyLookupRequest *req, int ncount){ 
     91        req->max_results=ncount; 
     92} 
     93 
     94void buddy_lookup_request_free(BuddyLookupRequest *req){ 
     95        if (req->key) ms_free(req->key); 
     96        if (req->results){ 
     97                ms_list_for_each(req->results,(void (*)(void*))buddy_info_free); 
     98                ms_list_free(req->results); 
     99        } 
     100        ms_free(req); 
     101} 
     102 
    82103LinphoneProxyConfig *sip_setup_context_get_proxy_config(const SipSetupContext *ctx){ 
    83104        return ctx->cfg; 
     
    145166} 
    146167 
    147 int sip_setup_context_lookup_buddy(SipSetupContext *ctx, const char *key){ 
    148         if (ctx->funcs->lookup_buddy) 
    149                 return ctx->funcs->lookup_buddy(ctx,key); 
    150         return -1; 
    151 } 
    152  
    153 BuddyLookupStatus sip_setup_context_get_buddy_lookup_status(SipSetupContext *ctx){ 
    154         if (ctx->funcs->get_buddy_lookup_status) 
    155                 return ctx->funcs->get_buddy_lookup_status(ctx); 
    156         return BuddyLookupFailure; 
    157 } 
    158  
    159 int sip_setup_context_get_buddy_lookup_results(SipSetupContext *ctx, MSList **results /*of BuddyInfo */){ 
    160         if (ctx->funcs->get_buddy_lookup_results) 
    161                 return ctx->funcs->get_buddy_lookup_results(ctx,results); 
     168BuddyLookupRequest *sip_setup_context_create_buddy_lookup_request(SipSetupContext *ctx){ 
     169        if (ctx->funcs->buddy_lookup_funcs) 
     170                return ctx->funcs->buddy_lookup_funcs->request_create(ctx); 
     171        return NULL; 
     172} 
     173 
     174int sip_setup_context_buddy_lookup_submit(SipSetupContext *ctx , BuddyLookupRequest *req){ 
     175        if (ctx->funcs->buddy_lookup_funcs) 
     176                return ctx->funcs->buddy_lookup_funcs->request_submit(ctx,req); 
     177        return -1; 
     178} 
     179 
     180int sip_setup_context_buddy_lookup_free(SipSetupContext *ctx , BuddyLookupRequest *req){ 
     181        if (ctx->funcs->buddy_lookup_funcs) 
     182                return ctx->funcs->buddy_lookup_funcs->request_free(ctx,req); 
    162183        return -1; 
    163184} 
     
    175196} 
    176197 
    177  
    178 void sip_setup_context_free_results(MSList *results){ 
    179         ms_list_for_each(results,(void (*)(void*))&buddy_info_free); 
    180         ms_list_free(results); 
    181 } 
    182198 
    183199int sip_setup_context_logout(SipSetupContext *ctx){ 
  • linphone/coreapi/sipsetup.h

    r738 r739  
    7474}BuddyInfo; 
    7575 
     76typedef struct _BuddyLookupRequest { 
     77        char *key; 
     78        int max_results; 
     79        BuddyLookupStatus status; 
     80        MSList *results; /*of BuddyInfo */ 
     81}BuddyLookupRequest; 
     82 
     83 
     84typedef struct _BuddyLookupFuncs{ 
     85        BuddyLookupRequest * (*request_create)(SipSetupContext *ctx); 
     86        int (*request_submit)(SipSetupContext *ctx, BuddyLookupRequest *req); 
     87        int (*request_free)(SipSetupContext *ctx, BuddyLookupRequest *req); 
     88}BuddyLookupFuncs; 
     89 
    7690 
    7791struct _SipSetup{ 
     
    89103        int (*get_stun_servers)(SipSetupContext *ctx, char *stun1, char *stun2, size_t size); 
    90104        int (*get_relay)(SipSetupContext *ctx, char *relay, size_t size); 
    91         int (*lookup_buddy)(SipSetupContext *ctx, const char *key); 
    92         BuddyLookupStatus (*get_buddy_lookup_status)(SipSetupContext *ctx); 
    93         int (*get_buddy_lookup_results)(SipSetupContext *ctx, MSList **results); 
    94105        const char * (*get_notice)(SipSetupContext *ctx); 
    95106        const char ** (*get_domains)(SipSetupContext *ctx); 
    96107        int (*logout_account)(SipSetupContext *ctx); 
     108        BuddyLookupFuncs *buddy_lookup_funcs; 
    97109}; 
    98110 
    99111typedef struct _SipSetup SipSetup; 
     112 
    100113 
    101114 
     
    106119BuddyInfo *buddy_info_new(); 
    107120void buddy_info_free(BuddyInfo *info); 
     121 
     122void buddy_lookup_request_set_key(BuddyLookupRequest *req, const char *key); 
     123void buddy_lookup_request_set_max_results(BuddyLookupRequest *req, int ncount); 
    108124 
    109125 
     
    122138int sip_setup_context_get_stun_servers(SipSetupContext *ctx, char *stun1, char *stun2, size_t size); 
    123139int sip_setup_context_get_relay(SipSetupContext *ctx, char *relay, size_t size); 
    124 int sip_setup_context_lookup_buddy(SipSetupContext *ctx, const char *key); 
    125 BuddyLookupStatus sip_setup_context_get_buddy_lookup_status(SipSetupContext *ctx); 
    126 int sip_setup_context_get_buddy_lookup_results(SipSetupContext *ctx, MSList **results /*of BuddyInfo */); 
     140 
     141BuddyLookupRequest *sip_setup_context_create_buddy_lookup_request(SipSetupContext *ctx); 
     142int sip_setup_context_buddy_lookup_submit(SipSetupContext *ctx , BuddyLookupRequest *req); 
     143int sip_setup_context_buddy_lookup_free(SipSetupContext *ctx , BuddyLookupRequest *req); 
     144 
    127145const char * sip_setup_context_get_notice(SipSetupContext *ctx); 
    128146const char ** sip_setup_context_get_domains(SipSetupContext *ctx); 
    129147 
    130 void sip_setup_context_free_results(MSList *results); 
    131148void sip_setup_context_free(SipSetupContext *ctx); 
    132149 
    133150int sip_setup_context_logout(SipSetupContext *ctx); 
    134151 
    135 /*internal methods*/ 
     152/*internal methods for use WITHIN plugins: do not use elsewhere*/ 
    136153struct _LinphoneProxyConfig *sip_setup_context_get_proxy_config(const SipSetupContext *ctx); 
    137  
     154void buddy_lookup_request_free(BuddyLookupRequest *req); 
    138155 
    139156#ifdef __cplusplus 
  • linphone/gtk-glade/buddylookup.c

    r738 r739  
    139139        MSList *results=NULL; 
    140140        GtkProgressBar *pb=GTK_PROGRESS_BAR(linphone_gtk_get_widget(w,"progressbar")); 
    141         ctx=(SipSetupContext*)g_object_get_data(G_OBJECT(w),"SipSetupContext"); 
     141        BuddyLookupRequest *req=(BuddyLookupRequest*)g_object_get_data(G_OBJECT(w),"buddylookup_request"); 
     142 
     143        ctx=(SipSetupContext*)g_object_get_data(G_OBJECT(w),"SipSetupContext");  
    142144        last_state=GPOINTER_TO_INT(g_object_get_data(G_OBJECT(w),"last_state")); 
    143         bls=sip_setup_context_get_buddy_lookup_status(ctx); 
     145 
     146        if (req==NULL) return FALSE; 
     147        bls=req->status; 
    144148        if (last_state==bls) return TRUE; 
    145149        switch(bls){ 
     
    165169                        break; 
    166170                case BuddyLookupDone: 
    167                         sip_setup_context_get_buddy_lookup_results(ctx,&results); 
     171                        results=req->results; 
    168172                        linphone_gtk_display_lookup_results( 
    169173                                        linphone_gtk_get_widget(w,"search_results"), 
     
    175179                        gtk_progress_bar_set_text(pb,tmp); 
    176180                        g_free(tmp); 
    177                         if (results) sip_setup_context_free_results(results); 
     181                        sip_setup_context_buddy_lookup_free(ctx,req); 
     182                        g_object_set_data(G_OBJECT(w),"buddylookup_request",NULL); 
    178183                        break; 
    179184        } 
     
    191196        keyword=gtk_entry_get_text(GTK_ENTRY(linphone_gtk_get_widget(w,"keyword"))); 
    192197        if (strlen(keyword)>=1){ 
     198                BuddyLookupRequest *req; 
    193199                guint tid2; 
    194200                ctx=(SipSetupContext*)g_object_get_data(G_OBJECT(w),"SipSetupContext"); 
    195                 sip_setup_context_lookup_buddy(ctx,keyword); 
     201                req=(BuddyLookupRequest*)g_object_get_data(G_OBJECT(w),"buddylookup_request"); 
     202                if (req!=NULL){ 
     203                        sip_setup_context_buddy_lookup_free(ctx,req); 
     204                } 
     205                req=sip_setup_context_create_buddy_lookup_request(ctx); 
     206                buddy_lookup_request_set_key(req,keyword); 
     207                sip_setup_context_buddy_lookup_submit(ctx,req); 
     208                g_object_set_data(G_OBJECT(w),"buddylookup_request",req); 
    196209                if (g_object_get_data(G_OBJECT(w),"buddylookup_processing")==NULL){ 
    197210                        tid2=g_timeout_add(20,(GSourceFunc)linphone_gtk_process_buddy_lookup,w); 
  • linphone/gtk-glade/friendlist.c

    r645 r739  
    2929        FRIEND_ID, 
    3030        FRIEND_SIP_ADDRESS, 
     31        FRIEND_ICON, 
    3132        FRIEND_LIST_NCOL 
    3233}; 
     
    186187         
    187188        store = gtk_list_store_new(FRIEND_LIST_NCOL, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING,  G_TYPE_POINTER, 
    188                                         G_TYPE_STRING); 
    189         /* need to add friends to the store here ...*/ 
    190          
     189                                        G_TYPE_STRING, GDK_TYPE_PIXBUF); 
     190 
    191191        gtk_tree_view_set_model(GTK_TREE_VIEW(friendlist),GTK_TREE_MODEL(store)); 
    192192        g_object_unref(G_OBJECT(store)); 
    193193 
    194         renderer = gtk_cell_renderer_pixbuf_new(); 
    195         column = gtk_tree_view_column_new_with_attributes (NULL, 
    196                                                    renderer, 
    197                                                    "pixbuf", FRIEND_PRESENCE_IMG, 
    198                                                    NULL); 
    199         gtk_tree_view_column_set_min_width (column, 29); 
    200         gtk_tree_view_append_column (GTK_TREE_VIEW (friendlist), column); 
    201  
    202         gtk_tree_view_column_set_visible(column,linphone_gtk_get_ui_config_int("friendlist_icon",1)); 
    203  
    204         renderer = gtk_cell_renderer_text_new (); 
     194        renderer = gtk_cell_renderer_pixbuf_new (); 
    205195        column = gtk_tree_view_column_new_with_attributes (_("Name"), 
    206196                                                   renderer, 
    207                                                    "text", FRIEND_NAME, 
     197                                                   "pixbuf", FRIEND_ICON, 
    208198                                                   NULL); 
    209199        g_object_set (G_OBJECT(column), "resizable", TRUE, NULL); 
     200        renderer = gtk_cell_renderer_text_new (); 
     201        gtk_tree_view_column_pack_start(column,renderer,FALSE); 
     202        gtk_tree_view_column_add_attribute  (column,renderer, 
     203                                                         "text", 
     204                                                         FRIEND_NAME); 
     205         
    210206        gtk_tree_view_append_column (GTK_TREE_VIEW (friendlist), column); 
    211207 
     
    215211                                                   NULL); 
    216212        g_object_set (G_OBJECT(column), "resizable", TRUE, NULL); 
     213        gtk_tree_view_column_set_visible(column,linphone_gtk_get_ui_config_int("friendlist_status",1)); 
     214         
     215        renderer = gtk_cell_renderer_pixbuf_new(); 
     216        gtk_tree_view_column_pack_start(column,renderer,FALSE); 
     217        gtk_tree_view_column_add_attribute  (column,renderer, 
     218                                                         "pixbuf", 
     219                                                         FRIEND_PRESENCE_IMG); 
    217220        gtk_tree_view_append_column (GTK_TREE_VIEW (friendlist), column); 
    218         gtk_tree_view_column_set_visible(column,linphone_gtk_get_ui_config_int("friendlist_status",1)); 
    219          
     221 
    220222        select = gtk_tree_view_get_selection (GTK_TREE_VIEW (friendlist)); 
    221223        gtk_tree_selection_set_mode (select, GTK_SELECTION_SINGLE); 
     
    321323                } 
    322324                if (!online_only || (linphone_friend_get_status(lf)!=LINPHONE_STATUS_OFFLINE)){ 
     325                        BuddyInfo *bi; 
    323326                        if (name==NULL || name[0]=='\0') display=addr; 
    324327                        gtk_list_store_append(store,&iter); 
     
    332335                        gtk_list_store_set(store,&iter,FRIEND_SIP_ADDRESS,escaped,-1); 
    333336                        g_free(escaped); 
     337                        bi=linphone_friend_get_info(lf); 
     338                        if (bi!=NULL && bi->image_data!=NULL){ 
     339                                GdkPixbuf *pbuf= 
     340                                        _gdk_pixbuf_new_from_memory_at_scale(bi->image_data,bi->image_length,-1,40,TRUE); 
     341                                if (pbuf) { 
     342                                        gtk_list_store_set(store,&iter,FRIEND_ICON,pbuf,-1); 
     343                                        g_object_unref(G_OBJECT(pbuf)); 
     344                                } 
     345                        } 
    334346                } 
    335347                ms_free(uri); 
Note: See TracChangeset for help on using the changeset viewer.