]> sjero.net Git - linphone/commitdiff
add call recording feature to conference
authorSimon Morlat <simon.morlat@linphone.org>
Fri, 22 Feb 2013 16:21:50 +0000 (17:21 +0100)
committerSimon Morlat <simon.morlat@linphone.org>
Fri, 22 Feb 2013 16:22:27 +0000 (17:22 +0100)
fix broken gtk conference interface.

13 files changed:
coreapi/conference.c
coreapi/linphonecore.c
coreapi/linphonecore.h
coreapi/private.h
gtk/call_statistics.ui
gtk/conference.c
gtk/incall_view.c
gtk/linphone.h
gtk/main.c
gtk/main.ui
gtk/propertybox.c
gtk/update.c [changed mode: 0755->0644]
linphone.kdevelop [deleted file]

index a125673a29b0b91ef1861a748d76ffb8d5cc08db..16be62613f2b9697d5aaaed66dea6e0bf33ee489 100644 (file)
@@ -55,22 +55,38 @@ static void remove_local_endpoint(LinphoneConference *ctx){
        }
 }
 
+static int linphone_conference_get_size(LinphoneConference *conf){
+       if (conf->conf == NULL) {
+               return 0;
+       }
+       return ms_audio_conference_get_size(conf->conf) - (conf->record_endpoint ? 1 : 0);
+}
+
 static int remote_participants_count(LinphoneConference *ctx) {
-       if (!ctx->conf || ms_audio_conference_get_size(ctx->conf)==0) return 0;
-       if (!ctx->local_participant) return ms_audio_conference_get_size(ctx->conf);
-       return ms_audio_conference_get_size(ctx->conf) -1;
+       int count=linphone_conference_get_size(ctx);
+       if (count==0) return 0;
+       if (!ctx->local_participant) return count;
+       return count -1;
 }
 
 void linphone_core_conference_check_uninit(LinphoneCore *lc){
        LinphoneConference *ctx=&lc->conf_ctx;
        if (ctx->conf){
-               ms_message("conference_check_uninit(): nmembers=%i",ms_audio_conference_get_size(ctx->conf));
-               if (remote_participants_count(ctx)==1){
+               int remote_count=remote_participants_count(ctx);
+               ms_message("conference_check_uninit(): size=%i",linphone_conference_get_size(ctx));
+               if (remote_count==1){
                        convert_conference_to_call(lc);
                }
-               if (ms_audio_conference_get_size(ctx->conf)==1 && ctx->local_participant!=NULL){
-                       remove_local_endpoint(ctx);
+               if (remote_count==0){
+                       if (ctx->local_participant!=NULL)
+                               remove_local_endpoint(ctx);
+                       if (ctx->record_endpoint){
+                               ms_audio_conference_remove_member(ctx->conf,ctx->record_endpoint);
+                               ms_audio_endpoint_destroy(ctx->record_endpoint);
+                               ctx->record_endpoint=NULL;
+                       }
                }
+               
                if (ms_audio_conference_get_size(ctx->conf)==0){
                        ms_audio_conference_destroy(ctx->conf);
                        ctx->conf=NULL;
@@ -381,10 +397,37 @@ int linphone_core_terminate_conference(LinphoneCore *lc) {
  * @returns the number of participants to the conference
 **/
 int linphone_core_get_conference_size(LinphoneCore *lc) {
-       if (lc->conf_ctx.conf == NULL) {
-               return 0;
+       LinphoneConference *conf=&lc->conf_ctx;
+       return linphone_conference_get_size(conf);
+}
+
+
+int linphone_core_start_conference_recording(LinphoneCore *lc, const char *path){
+       LinphoneConference *conf=&lc->conf_ctx;
+       if (conf->conf == NULL) {
+               ms_warning("linphone_core_start_conference_recording(): no conference now.");
+               return -1;
+       }
+       if (conf->record_endpoint==NULL){
+               conf->record_endpoint=ms_audio_endpoint_new_recorder();
+               ms_audio_conference_add_member(conf->conf,conf->record_endpoint);
        }
-       return ms_audio_conference_get_size(lc->conf_ctx.conf);
+       ms_audio_recorder_endpoint_start(conf->record_endpoint,path);
+       return 0;
+}
+
+int linphone_core_stop_conference_recording(LinphoneCore *lc){
+       LinphoneConference *conf=&lc->conf_ctx;
+       if (conf->conf == NULL) {
+               ms_warning("linphone_core_stop_conference_recording(): no conference now.");
+               return -1;
+       }
+       if (conf->record_endpoint==NULL){
+               ms_warning("linphone_core_stop_conference_recording(): no record active.");
+               return -1;
+       }
+       ms_audio_recorder_endpoint_stop(conf->record_endpoint);
+       return 0;
 }
 
 /**
index d9d199c3f95102cf8e43d4693e4dd71fb95a24dd..237590473f27d638f3eedf8e5018edb718bb82cd 100644 (file)
@@ -92,12 +92,7 @@ int lc_callback_obj_invoke(LCCallbackObj *obj, LinphoneCore *lc){
 
 /*prevent a gcc bug with %c*/
 static size_t my_strftime(char *s, size_t max, const char  *fmt,  const struct tm *tm){
-#if !defined(_WIN32_WCE)
        return strftime(s, max, fmt, tm);
-#else
-       return 0;
-       /*FIXME*/
-#endif /*_WIN32_WCE*/
 }
 
 static void set_call_log_date(LinphoneCallLog *cl, time_t start_time){
@@ -120,7 +115,7 @@ LinphoneCallLog * linphone_call_log_new(LinphoneCall *call, LinphoneAddress *fro
        set_call_log_date(cl,cl->start_date_time);
        cl->from=from;
        cl->to=to;
-    cl->status=LinphoneCallAborted; /*default status*/
+       cl->status=LinphoneCallAborted; /*default status*/
        return cl;
 }
 
index 78193aaa0c7f7639f7db7a6f397fbaf7b9232d17..2c2168646c6d38f4073532fabd3f87eba10fff88 100644 (file)
@@ -1368,6 +1368,8 @@ float linphone_core_get_conference_local_input_volume(LinphoneCore *lc);
 
 int linphone_core_terminate_conference(LinphoneCore *lc);
 int linphone_core_get_conference_size(LinphoneCore *lc);
+int linphone_core_start_conference_recording(LinphoneCore *lc, const char *path);
+int linphone_core_stop_conference_recording(LinphoneCore *lc);
 
 int linphone_core_get_max_calls(LinphoneCore *lc);
 void linphone_core_set_max_calls(LinphoneCore *lc, int max);
index c0b467cee3f719ed06515c2270253613b9722a70..41d453df3bdea168cbde72fe76d1d626c0c93508 100644 (file)
@@ -530,6 +530,7 @@ struct _LinphoneConference{
        MSAudioConference *conf;
        AudioStream *local_participant;
        MSAudioEndpoint *local_endpoint;
+       MSAudioEndpoint *record_endpoint;
        RtpProfile *local_dummy_profile;
        bool_t local_muted;
 };
index 6ed8bd9bd1cd175ccec1c6985fae2b017f91be5d..c6f71deb648150c843c54680be80b669548498d4 100644 (file)
@@ -1,34 +1,71 @@
-<?xml version="1.0"?>
+<?xml version="1.0" encoding="UTF-8"?>
 <interface>
   <requires lib="gtk+" version="2.24"/>
   <!-- interface-naming-policy project-wide -->
   <object class="GtkDialog" id="call_statistics">
+    <property name="can_focus">False</property>
     <property name="border_width">5</property>
     <property name="title" translatable="yes">Call statistics</property>
     <property name="type_hint">dialog</property>
-    <signal name="response" handler="linphone_gtk_call_statistics_closed"/>
+    <signal name="response" handler="linphone_gtk_call_statistics_closed" swapped="no"/>
     <child internal-child="vbox">
       <object class="GtkVBox" id="dialog-vbox1">
         <property name="visible">True</property>
+        <property name="can_focus">False</property>
         <property name="spacing">2</property>
+        <child internal-child="action_area">
+          <object class="GtkHButtonBox" id="dialog-action_area1">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="layout_style">end</property>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <object class="GtkButton" id="button1">
+                <property name="label">gtk-close</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_action_appearance">False</property>
+                <property name="use_stock">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="pack_type">end</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
         <child>
           <object class="GtkFrame" id="frame1">
             <property name="visible">True</property>
+            <property name="can_focus">False</property>
             <property name="label_xalign">0</property>
             <property name="shadow_type">none</property>
             <child>
               <object class="GtkAlignment" id="alignment1">
                 <property name="visible">True</property>
+                <property name="can_focus">False</property>
                 <property name="left_padding">12</property>
                 <child>
                   <object class="GtkTable" id="table1">
                     <property name="visible">True</property>
-                    <property name="n_rows">6</property>
+                    <property name="can_focus">False</property>
+                    <property name="n_rows">7</property>
                     <property name="n_columns">2</property>
                     <property name="homogeneous">True</property>
                     <child>
                       <object class="GtkLabel" id="audio_codec_label">
                         <property name="visible">True</property>
+                        <property name="can_focus">False</property>
                         <property name="label" translatable="yes">Audio codec</property>
                       </object>
                       <packing>
@@ -38,6 +75,7 @@
                     <child>
                       <object class="GtkLabel" id="video_codec_label">
                         <property name="visible">True</property>
+                        <property name="can_focus">False</property>
                         <property name="label" translatable="yes">Video codec</property>
                       </object>
                       <packing>
@@ -49,6 +87,7 @@
                     <child>
                       <object class="GtkLabel" id="label3">
                         <property name="visible">True</property>
+                        <property name="can_focus">False</property>
                         <property name="label" translatable="yes">Audio IP bandwidth usage</property>
                       </object>
                       <packing>
@@ -60,6 +99,7 @@
                     <child>
                       <object class="GtkLabel" id="audio_codec">
                         <property name="visible">True</property>
+                        <property name="can_focus">False</property>
                       </object>
                       <packing>
                         <property name="left_attach">1</property>
                     <child>
                       <object class="GtkLabel" id="video_codec">
                         <property name="visible">True</property>
+                        <property name="can_focus">False</property>
                       </object>
                       <packing>
                         <property name="left_attach">1</property>
                     <child>
                       <object class="GtkLabel" id="audio_bandwidth_usage">
                         <property name="visible">True</property>
+                        <property name="can_focus">False</property>
                       </object>
                       <packing>
                         <property name="left_attach">1</property>
                     <child>
                       <object class="GtkLabel" id="label4">
                         <property name="visible">True</property>
+                        <property name="can_focus">False</property>
                         <property name="label" translatable="yes">Audio Media connectivity</property>
                       </object>
                       <packing>
                     <child>
                       <object class="GtkLabel" id="audio_media_connectivity">
                         <property name="visible">True</property>
+                        <property name="can_focus">False</property>
                       </object>
                       <packing>
                         <property name="left_attach">1</property>
                     <child>
                       <object class="GtkLabel" id="label1">
                         <property name="visible">True</property>
+                        <property name="can_focus">False</property>
                         <property name="label" translatable="yes">Video IP bandwidth usage</property>
                       </object>
                       <packing>
                     <child>
                       <object class="GtkLabel" id="video_bandwidth_usage">
                         <property name="visible">True</property>
+                        <property name="can_focus">False</property>
                       </object>
                       <packing>
                         <property name="left_attach">1</property>
                     <child>
                       <object class="GtkLabel" id="label2">
                         <property name="visible">True</property>
+                        <property name="can_focus">False</property>
                         <property name="label" translatable="yes">Video Media connectivity</property>
                       </object>
                       <packing>
                     <child>
                       <object class="GtkLabel" id="video_media_connectivity">
                         <property name="visible">True</property>
+                        <property name="can_focus">False</property>
                       </object>
                       <packing>
                         <property name="left_attach">1</property>
                         <property name="bottom_attach">6</property>
                       </packing>
                     </child>
+                    <child>
+                      <object class="GtkLabel" id="label5">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Round trip time</property>
+                      </object>
+                      <packing>
+                        <property name="top_attach">6</property>
+                        <property name="bottom_attach">7</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="round_trip_time">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">6</property>
+                        <property name="bottom_attach">7</property>
+                      </packing>
+                    </child>
                   </object>
                 </child>
               </object>
             <child type="label">
               <object class="GtkLabel" id="call_statistics_label">
                 <property name="visible">True</property>
+                <property name="can_focus">False</property>
                 <property name="label" translatable="yes">&lt;b&gt;Call statistics and information&lt;/b&gt;</property>
                 <property name="use_markup">True</property>
               </object>
             <property name="position">1</property>
           </packing>
         </child>
-        <child internal-child="action_area">
-          <object class="GtkHButtonBox" id="dialog-action_area1">
-            <property name="visible">True</property>
-            <property name="layout_style">end</property>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <object class="GtkButton" id="button1">
-                <property name="label">gtk-close</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="use_stock">True</property>
-              </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">False</property>
-                <property name="position">1</property>
-              </packing>
-            </child>
-          </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="pack_type">end</property>
-            <property name="position">0</property>
-          </packing>
-        </child>
       </object>
     </child>
     <action-widgets>
index dddb3cec98c7e5e0dc5f191254c84e68f25e4eb9..08262c771db9e1b7fa98c31062e1090225880bb6 100644 (file)
 
 #define PADDING_PIXELS 4
 
+/*
+ * conferencee_box = a vbox where participants are added or removed
+ * conf_frame = the conference tab
+ */
+
 static GtkWidget *create_conference_label(void){
        GtkWidget *box=gtk_hbox_new(FALSE,0);
        gtk_box_pack_start(GTK_BOX(box),gtk_image_new_from_stock(GTK_STOCK_ADD,GTK_ICON_SIZE_MENU),FALSE,FALSE,0);
@@ -46,34 +51,21 @@ static void init_local_participant(GtkWidget *participant){
        linphone_gtk_init_audio_meter(sound_meter, (get_volume_t) linphone_core_get_conference_local_input_volume, linphone_gtk_get_core());
 }
 
-static GtkWidget *get_conference_tab(GtkWidget *mw){
-       GtkWidget *box=(GtkWidget*)g_object_get_data(G_OBJECT(mw),"conference_tab");
-       GtkWidget *conf_frame=(GtkWidget*)g_object_get_data(G_OBJECT(mw),"conf_frame");
-       if(conf_frame!=NULL){
-               if (box==NULL){
-                       GtkWidget *conf_box=linphone_gtk_get_widget(conf_frame,"conf_box");
-                       box=gtk_vbox_new(FALSE,0);
-                       GtkWidget *participant=linphone_gtk_create_widget("main","callee_frame");
-                       gtk_box_set_homogeneous(GTK_BOX(box),TRUE);
-                       init_local_participant(participant);
-                       gtk_box_pack_start(GTK_BOX(box),participant,FALSE,FALSE,PADDING_PIXELS);
-                       gtk_widget_show(box);
-                       g_object_set_data(G_OBJECT(mw),"conference_tab",box);
-                       gtk_box_pack_start(GTK_BOX(conf_box),box,FALSE,FALSE,PADDING_PIXELS);
-               }
-       }
+static GtkWidget *get_conferencee_box(GtkWidget *mw){
+       GtkWidget *box=(GtkWidget*)g_object_get_data(G_OBJECT(mw),"conferencee_box");
        return box;
 }
 
 static GtkWidget *find_conferencee_from_call(LinphoneCall *call){
        GtkWidget *mw=linphone_gtk_get_main_window();
-       get_conference_tab(mw);
-       GtkWidget *conf_frame=(GtkWidget *)g_object_get_data(G_OBJECT(mw),"conf_frame");
-       GtkWidget *conf_box=linphone_gtk_get_widget(conf_frame,"conf_box");
+       GtkWidget *conferencee_box=get_conferencee_box(mw);
        GList *elem;
        GtkWidget *ret=NULL;
+       
+       if (conferencee_box==NULL) return NULL;
+       
        if (call!=NULL){
-               GList *l=gtk_container_get_children(GTK_CONTAINER(conf_box));
+               GList *l=gtk_container_get_children(GTK_CONTAINER(conferencee_box));
                for(elem=l;elem!=NULL;elem=elem->next){
                        GtkWidget *frame=(GtkWidget*)elem->data;
                        if (call==g_object_get_data(G_OBJECT(frame),"call")){
@@ -87,28 +79,53 @@ static GtkWidget *find_conferencee_from_call(LinphoneCall *call){
        return ret;
 }
 
-void linphone_gtk_set_in_conference(LinphoneCall *call){
+static GtkWidget * create_conference_panel(void){
        GtkWidget *mw=linphone_gtk_get_main_window();
+       GtkWidget *conf_frame=linphone_gtk_create_widget("main","conf_frame");
+       GtkWidget *conf_box=linphone_gtk_get_widget(conf_frame,"conf_box");
+       GtkWidget *button_conf=linphone_gtk_get_widget(conf_frame,"terminate_conf");
+       GtkWidget *image=create_pixmap("stopcall-small.png");
+       GtkWidget *box;
        GtkWidget *viewswitch=linphone_gtk_get_widget(mw,"viewswitch");
+       
+       gtk_button_set_image(GTK_BUTTON(button_conf),image);
+       g_signal_connect_swapped(G_OBJECT(button_conf),"clicked",(GCallback)linphone_gtk_terminate_call,NULL);
+       g_object_set_data(G_OBJECT(mw),"conf_frame",(gpointer)conf_frame);
+       
+       box=gtk_vbox_new(FALSE,0);
+       GtkWidget *participant=linphone_gtk_create_widget("main","callee_frame");
+       gtk_widget_show(participant);
+       gtk_box_set_homogeneous(GTK_BOX(box),TRUE);
+       init_local_participant(participant);
+       gtk_box_pack_start(GTK_BOX(box),participant,FALSE,FALSE,PADDING_PIXELS);
+       gtk_widget_show(box);
+       g_object_set_data(G_OBJECT(mw),"conferencee_box",box);
+       gtk_box_pack_start(GTK_BOX(conf_box),box,FALSE,FALSE,PADDING_PIXELS);
+       
+       gtk_notebook_append_page(GTK_NOTEBOOK(viewswitch),conf_frame,
+                               create_conference_label());
+       return conf_frame;
+}
+
+void linphone_gtk_set_in_conference(LinphoneCall *call){
+       GtkWidget *mw=linphone_gtk_get_main_window();
        GtkWidget *conf_frame=(GtkWidget *)g_object_get_data(G_OBJECT(mw),"conf_frame");
-       g_object_set_data(G_OBJECT(mw),"is_conf",GINT_TO_POINTER(TRUE));
+       GtkWidget *viewswitch=linphone_gtk_get_widget(mw,"viewswitch");
+       
        if(conf_frame==NULL){
-               conf_frame=linphone_gtk_create_widget("main","conf_frame");
-               GtkWidget *button_conf=linphone_gtk_get_widget(conf_frame,"terminate_conf");
-               GtkWidget *image=create_pixmap("stopcall-small.png");
-               gtk_button_set_image(GTK_BUTTON(button_conf),image);
-               g_signal_connect_swapped(G_OBJECT(button_conf),"clicked",(GCallback)linphone_gtk_terminate_call,NULL);
-               g_object_set_data(G_OBJECT(mw),"conf_frame",(gpointer)conf_frame);
-               gtk_notebook_append_page(GTK_NOTEBOOK(viewswitch),conf_frame,
-                                     create_conference_label());
+               conf_frame=create_conference_panel();
        }
-       GtkWidget *participant=find_conferencee_from_call(call);        
-       GtkWidget *conf_box=linphone_gtk_get_widget(conf_frame,"conf_box");
+       GtkWidget *participant=find_conferencee_from_call(call);
+       
        if (participant==NULL){
-               const LinphoneAddress *addr=linphone_call_get_remote_address(call);
-               participant=linphone_gtk_create_widget("main","callee_frame");
+               /*create and add it */
+               GtkWidget *conferencee_box=get_conferencee_box(mw);
                GtkWidget *sound_meter;
+               const LinphoneAddress *addr=linphone_call_get_remote_address(call);
                gchar *markup;
+               
+               participant=linphone_gtk_create_widget("main","callee_frame");
+               gtk_widget_show(participant);
                if (linphone_address_get_display_name(addr)!=NULL){
                        markup=g_strdup_printf("<b>%s</b>",linphone_address_get_display_name(addr));
                }else{
@@ -119,11 +136,11 @@ void linphone_gtk_set_in_conference(LinphoneCall *call){
                gtk_label_set_markup(GTK_LABEL(linphone_gtk_get_widget(participant,"callee_name_label")),markup);
                g_free(markup);
                sound_meter=linphone_gtk_get_widget(participant,"sound_indicator");
-               linphone_gtk_init_audio_meter(sound_meter, (get_volume_t) linphone_call_get_play_volume, call); 
-               gtk_box_pack_start(GTK_BOX(conf_box),participant,FALSE,FALSE,PADDING_PIXELS);
+               linphone_gtk_init_audio_meter(sound_meter, (get_volume_t) linphone_call_get_play_volume, call);
+               gtk_box_pack_start(GTK_BOX(conferencee_box),participant,FALSE,FALSE,PADDING_PIXELS);
                g_object_set_data_full(G_OBJECT(participant),"call",linphone_call_ref(call),(GDestroyNotify)linphone_call_unref);
                gtk_notebook_set_current_page(GTK_NOTEBOOK(viewswitch),
-               gtk_notebook_page_num(GTK_NOTEBOOK(viewswitch),conf_frame));
+                       gtk_notebook_page_num(GTK_NOTEBOOK(viewswitch),conf_frame));
        }
 }
 
@@ -135,24 +152,26 @@ void linphone_gtk_terminate_conference_participant(LinphoneCall *call){
 }
 
 void linphone_gtk_unset_from_conference(LinphoneCall *call){
-       GtkWidget *mw=linphone_gtk_get_main_window();
-       GtkWidget *conf_frame=(GtkWidget *)g_object_get_data(G_OBJECT(mw),"conf_frame");
-       GtkWidget *conf_box=linphone_gtk_get_widget(conf_frame,"conf_box");
-       GtkWidget *frame;
-       if (conf_box==NULL) return; /*conference tab already destroyed*/
-       frame=find_conferencee_from_call(call);
-       GList *children;
+       GtkWidget *frame=find_conferencee_from_call(call);
+       
        if (frame){
+               GtkWidget *mw=linphone_gtk_get_main_window();
+               GtkWidget *conf_frame=(GtkWidget *)g_object_get_data(G_OBJECT(mw),"conf_frame");
+               GtkWidget *conferencee_box=g_object_get_data(G_OBJECT(mw),"conferencee_box");
+               GList *children;
+               
+               g_message("Removing a participant from conference");
                gtk_widget_destroy(frame);
+               children=gtk_container_get_children(GTK_CONTAINER(conferencee_box));
+               if (g_list_length(children)==1){ /* only local participant */
+                       /*the conference is terminated */
+                       g_message("The conference is terminated");
+                       g_object_set_data(G_OBJECT(mw),"conferencee_box",NULL);
+                       gtk_widget_destroy(conf_frame);
+                       g_object_set_data(G_OBJECT(mw),"conf_frame",NULL);
+               }
+               g_list_free(children);
        }
-       children=gtk_container_get_children(GTK_CONTAINER(conf_box));
-       if (g_list_length(children)==2){
-               /*the conference is terminated */
-               gtk_widget_destroy(conf_box);
-               g_object_set_data(G_OBJECT(mw),"conference_tab",NULL);          
-       }
-       gtk_widget_destroy(conf_frame);
-       g_list_free(children);
-       g_object_set_data(G_OBJECT(mw),"is_conf",GINT_TO_POINTER(FALSE));
-       g_object_set_data(G_OBJECT(mw),"conf_frame",NULL);
 }
+
+
index 60aa7cb1421734d9d8b5542c02192e1595edfa31..0a64a1041d2484f6cca2b1eb21f9f2e9c48b9414 100644 (file)
@@ -50,7 +50,8 @@ LinphoneCall *linphone_gtk_get_currently_displayed_call(gboolean *is_conf){
                if (page!=NULL){
                        LinphoneCall *call=(LinphoneCall*)g_object_get_data(G_OBJECT(page),"call");
                        if (call==NULL){
-                               if (GPOINTER_TO_INT(g_object_get_data(G_OBJECT(main_window),"is_conf"))){
+                               GtkWidget *conf_frame=(GtkWidget *)g_object_get_data(G_OBJECT(main_window),"conf_frame");
+                               if (conf_frame==page){
                                        if (is_conf)
                                                *is_conf=TRUE;
                                        return NULL;
@@ -75,25 +76,28 @@ static GtkWidget *make_tab_header(int number){
 }
 
 void update_tab_header(LinphoneCall *call,gboolean pause){
-    GtkWidget *w=(GtkWidget*)linphone_call_get_user_pointer(call);
-    GtkWidget *main_window=linphone_gtk_get_main_window();
-    GtkNotebook *notebook=GTK_NOTEBOOK(linphone_gtk_get_widget(main_window,"viewswitch"));
-    gint call_index=GPOINTER_TO_INT(g_object_get_data(G_OBJECT(w),"call_index"));
-    GtkWidget *new_label=gtk_hbox_new (FALSE,0);
-    GtkWidget *i=NULL;
-    if(pause){
-i=gtk_image_new_from_stock(GTK_STOCK_MEDIA_PAUSE,GTK_ICON_SIZE_SMALL_TOOLBAR);
-    } else {
-        i=create_pixmap ("startcall-small.png");
-    }
+       GtkWidget *w=(GtkWidget*)linphone_call_get_user_pointer(call);
+       GtkWidget *main_window=linphone_gtk_get_main_window();
+       GtkNotebook *notebook=GTK_NOTEBOOK(linphone_gtk_get_widget(main_window,"viewswitch"));
+       gint call_index=GPOINTER_TO_INT(g_object_get_data(G_OBJECT(w),"call_index"));
+       GtkWidget *new_label=gtk_hbox_new (FALSE,0);
+       GtkWidget *i=NULL;
        GtkWidget *l;
-       gchar *text=g_strdup_printf(_("Call #%i"),call_index);
+       gchar *text;
+       
+       if(pause){
+               i=gtk_image_new_from_stock(GTK_STOCK_MEDIA_PAUSE,GTK_ICON_SIZE_SMALL_TOOLBAR);
+       } else {
+               i=create_pixmap ("startcall-small.png");
+       }
+       
+       text=g_strdup_printf(_("Call #%i"),call_index);
        l=gtk_label_new (text);
        gtk_box_pack_start (GTK_BOX(new_label),i,FALSE,FALSE,0);
        gtk_box_pack_end(GTK_BOX(new_label),l,TRUE,TRUE,0);
 
-    gtk_notebook_set_tab_label(notebook,w,new_label);
-    gtk_widget_show_all(new_label);
+       gtk_notebook_set_tab_label(notebook,w,new_label);
+       gtk_widget_show_all(new_label);
 }
 
 static void linphone_gtk_in_call_set_animation_image(GtkWidget *callview, const char *image_name, gboolean is_stock){
@@ -157,8 +161,7 @@ void transfer_button_clicked(GtkWidget *button, gpointer call_ref){
                        g_signal_connect_swapped(G_OBJECT(menu_item),"activate",(GCallback)linphone_gtk_transfer_call,other_call);
                }
        }
-       gtk_menu_popup(GTK_MENU(menu),NULL,NULL,NULL,NULL,0,
-       gtk_get_current_event_time());
+       gtk_menu_popup(GTK_MENU(menu),NULL,NULL,NULL,NULL,0,gtk_get_current_event_time());
        gtk_widget_show(menu);
 }
 
@@ -178,7 +181,6 @@ static void conference_button_clicked(GtkWidget *button, gpointer call_ref){
        gtk_widget_set_sensitive(button,FALSE);
        g_object_set_data(G_OBJECT(linphone_gtk_get_main_window()),"conf_frame",NULL);
        linphone_core_add_all_to_conference(linphone_gtk_get_core());
-       //linphone_core_add_to_conference(linphone_gtk_get_core(),(LinphoneCall*)call_ref);
        
 }
 
@@ -202,7 +204,6 @@ static void show_used_codecs(GtkWidget *callstats, LinphoneCall *call){
                GtkWidget *acodec_ui=linphone_gtk_get_widget(callstats,"audio_codec");
                GtkWidget *vcodec_ui=linphone_gtk_get_widget(callstats,"video_codec");
                if (acodec){
-
                        char tmp[64]={0};
                        snprintf(tmp,sizeof(tmp)-1,"%s/%i/%i",acodec->mime_type,acodec->clock_rate,acodec->channels);
                        gtk_label_set_label(GTK_LABEL(acodec_ui),tmp);
@@ -252,28 +253,40 @@ static const char *upnp_state_to_string(LinphoneUpnpState ice_state){
 static void _refresh_call_stats(GtkWidget *callstats, LinphoneCall *call){
        const LinphoneCallStats *as=linphone_call_get_audio_stats(call);
        const LinphoneCallStats *vs=linphone_call_get_video_stats(call);
-       const char *audio_media_connectivity = _("Direct");
-       const char *video_media_connectivity = _("Direct");
+       const char *audio_media_connectivity = _("Direct or through server");
+       const char *video_media_connectivity = _("Direct or through server");
+       gboolean has_video=linphone_call_params_video_enabled(linphone_call_get_current_params(call));
        gchar *tmp=g_strdup_printf(_("download: %f\nupload: %f (kbit/s)"),
                as->download_bandwidth,as->upload_bandwidth);
+       
        gtk_label_set_markup(GTK_LABEL(linphone_gtk_get_widget(callstats,"audio_bandwidth_usage")),tmp);
        g_free(tmp);
-       tmp=g_strdup_printf(_("download: %f\nupload: %f (kbit/s)"),
-               vs->download_bandwidth,vs->upload_bandwidth);
+       if (has_video)
+               tmp=g_strdup_printf(_("download: %f\nupload: %f (kbit/s)"),vs->download_bandwidth,vs->upload_bandwidth);
+       else tmp=NULL;
        gtk_label_set_markup(GTK_LABEL(linphone_gtk_get_widget(callstats,"video_bandwidth_usage")),tmp);
-       g_free(tmp);
+       if (tmp) g_free(tmp);
        if(as->upnp_state != LinphoneUpnpStateNotAvailable && as->upnp_state != LinphoneUpnpStateIdle) {
                audio_media_connectivity = upnp_state_to_string(as->upnp_state);
        } else if(as->ice_state != LinphoneIceStateNotActivated) {
                audio_media_connectivity = ice_state_to_string(as->ice_state);
        }
        gtk_label_set_text(GTK_LABEL(linphone_gtk_get_widget(callstats,"audio_media_connectivity")),audio_media_connectivity);
-       if(vs->upnp_state != LinphoneUpnpStateNotAvailable && vs->upnp_state != LinphoneUpnpStateIdle) {
-                       video_media_connectivity = upnp_state_to_string(vs->upnp_state);
-       } else if(vs->ice_state != LinphoneIceStateNotActivated) {
-               video_media_connectivity = ice_state_to_string(vs->ice_state);
-       }
+       
+       if (has_video){
+               if(vs->upnp_state != LinphoneUpnpStateNotAvailable && vs->upnp_state != LinphoneUpnpStateIdle) {
+                               video_media_connectivity = upnp_state_to_string(vs->upnp_state);
+               } else if(vs->ice_state != LinphoneIceStateNotActivated) {
+                       video_media_connectivity = ice_state_to_string(vs->ice_state);
+               }
+       }else video_media_connectivity=NULL;
        gtk_label_set_text(GTK_LABEL(linphone_gtk_get_widget(callstats,"video_media_connectivity")),video_media_connectivity);
+       
+       if (as->round_trip_delay>0){
+               tmp=g_strdup_printf(_("%.3f seconds"),as->round_trip_delay);
+               gtk_label_set_text(GTK_LABEL(linphone_gtk_get_widget(callstats,"round_trip_time")),tmp);
+               g_free(tmp);
+       }
 }
 
 static gboolean refresh_call_stats(GtkWidget *callstats){
@@ -689,6 +702,9 @@ void linphone_gtk_in_call_view_set_in_call(LinphoneCall *call){
        if (in_conf){
                linphone_gtk_set_in_conference(call);
                gtk_widget_set_sensitive(linphone_gtk_get_widget(callview,"incall_mute"),FALSE);
+       }else{
+               linphone_gtk_unset_from_conference(call); /*in case it was previously*/
+               gtk_widget_set_sensitive(linphone_gtk_get_widget(callview,"incall_mute"),TRUE);
        }
        gtk_widget_show_all(linphone_gtk_get_widget(callview,"buttons_panel"));
        if (!in_conf) gtk_widget_show_all(linphone_gtk_get_widget(callview,"record_hbox"));
@@ -857,18 +873,46 @@ void linphone_gtk_call_statistics_closed(GtkWidget *call_stats){
 
 void linphone_gtk_record_call_toggled(GtkWidget *button){
        gboolean active=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button));
-       LinphoneCall *call=linphone_gtk_get_currently_displayed_call(NULL);
-       GtkWidget *callview=(GtkWidget*)linphone_call_get_user_pointer (call);
-       const LinphoneCallParams *params=linphone_call_get_current_params(call);
-       const char *filepath=linphone_call_params_get_record_file(params);
-       gchar *message=g_strdup_printf(_("<small><i>Recording into %s %s</i></small>"),filepath,active ? "" : _("(Paused)"));
+       gboolean is_conf=FALSE;
+       const char *filepath;
+       gchar *message;
+       LinphoneCore *lc=linphone_gtk_get_core();
+       LinphoneCall *call=linphone_gtk_get_currently_displayed_call(&is_conf);
+       GtkWidget *callview;
+       GtkWidget *label;
+       if (call){
+               callview=(GtkWidget*)linphone_call_get_user_pointer (call);
+               const LinphoneCallParams *params=linphone_call_get_current_params(call);
+               filepath=linphone_call_params_get_record_file(params);
+               label=linphone_gtk_get_widget(callview,"record_status");
+       }else if (is_conf){
+               GtkWidget *mw=linphone_gtk_get_main_window();
+               callview=(GtkWidget *)g_object_get_data(G_OBJECT(linphone_gtk_get_main_window()),"conf_frame");
+               label=linphone_gtk_get_widget(callview,"conf_record_status");
+               filepath=(const char*)g_object_get_data(G_OBJECT(mw),"conf_record_path");
+               if (filepath==NULL){
+                       filepath=linphone_gtk_get_record_path(NULL,TRUE);
+                       g_object_set_data_full(G_OBJECT(mw),"conf_record_path",(char*)filepath,g_free);
+               }
+       }else{
+               g_warning("linphone_gtk_record_call_toggled(): bug.");
+               return;
+       }
+       message=g_strdup_printf(_("<small><i>Recording into\n%s %s</i></small>"),filepath,active ? "" : _("(Paused)"));
        
        if (active){
-               linphone_call_start_recording(call);
+               if (call)
+                       linphone_call_start_recording(call);
+               else
+                       linphone_core_start_conference_recording(lc,filepath);
        }else {
-               linphone_call_stop_recording(call);
+               if (call)
+                       linphone_call_stop_recording(call);
+               else
+                       linphone_core_stop_conference_recording(lc);
+               
        }
-       gtk_label_set_markup(GTK_LABEL(linphone_gtk_get_widget(callview,"record_status")),message);
+       gtk_label_set_markup(GTK_LABEL(label),message);
        g_free(message);
 }
 
index abb395127dda042cd87430c919e91ace83a8a96e..f9597849d8e68f7c49dcadc5732c3af6941d9c0c 100644 (file)
@@ -149,3 +149,5 @@ void linphone_gtk_uninit_instance(void);
 void linphone_gtk_monitor_usb(void);
 void linphone_gtk_unmonitor_usb(void);
 
+gchar *linphone_gtk_get_record_path(const LinphoneAddress *address, gboolean is_conference);
+
index 94d94f662e1696bfd37c8e725bf2fddd356e91d3..2f34cd4d420862f93e776c4a899a5452c842d4d7 100644 (file)
@@ -750,14 +750,35 @@ static void linphone_gtk_update_call_buttons(LinphoneCall *call){
        }
 }
 
-gchar *linphone_gtk_get_call_record_path(LinphoneAddress *address){
+gchar *linphone_gtk_get_record_path(const LinphoneAddress *address, gboolean is_conference){
        const char *dir=g_get_user_special_dir(G_USER_DIRECTORY_MUSIC);
-       const char *id=linphone_address_get_username(address);
+       const char *id="unknown";
        char filename[256]={0};
-       if (id==NULL) id=linphone_address_get_domain(address);
-       snprintf(filename,sizeof(filename)-1,"%s-%lu-%s-record.wav",
-                linphone_gtk_get_ui_config("title","Linphone"),
-                (unsigned long)time(NULL),id);
+       char date[64]={0};
+       time_t curtime=time(NULL);
+       struct tm loctime;
+       
+#ifdef WIN32
+       loctime=*localtime(&curtime);
+#else
+       localtime_r(&curtime,&loctime);
+#endif
+       snprintf(date,sizeof(date)-1,"%i%02i%02i-%02i%02i",loctime.tm_year+1900,loctime.tm_mon+1,loctime.tm_mday, loctime.tm_hour, loctime.tm_min);
+       
+       if (address){
+               id=linphone_address_get_username(address);
+               if (id==NULL) id=linphone_address_get_domain(address);
+       }
+       if (is_conference){
+               snprintf(filename,sizeof(filename)-1,"%s-conference-%s.wav",
+                       linphone_gtk_get_ui_config("title","Linphone"),
+                       date);
+       }else{
+               snprintf(filename,sizeof(filename)-1,"%s-call-%s-%s.wav",
+                       linphone_gtk_get_ui_config("title","Linphone"),
+                       date,
+                       id);
+       }
        return g_build_filename(dir,filename,NULL);
 }
 
@@ -768,7 +789,7 @@ static gboolean linphone_gtk_start_call_do(GtkWidget *uri_bar){
        
        if (addr!=NULL){
                LinphoneCallParams *params=linphone_core_create_default_call_parameters(lc);
-               gchar *record_file=linphone_gtk_get_call_record_path(addr);
+               gchar *record_file=linphone_gtk_get_record_path(addr,FALSE);
                linphone_call_params_set_record_file(params,record_file);
                linphone_core_invite_address_with_params(lc,addr,params);
                completion_add_text(GTK_ENTRY(uri_bar),entered);
@@ -781,24 +802,34 @@ static gboolean linphone_gtk_start_call_do(GtkWidget *uri_bar){
        return FALSE;
 }
 
+
+static void accept_incoming_call(LinphoneCall *call){
+       LinphoneCore *lc=linphone_gtk_get_core();
+       LinphoneCallParams *params=linphone_core_create_default_call_parameters(lc);
+       gchar *record_file=linphone_gtk_get_record_path(linphone_call_get_remote_address(call),FALSE);
+       linphone_call_params_set_record_file(params,record_file);
+       linphone_core_accept_call_with_params(lc,call,params);
+       linphone_call_params_destroy(params);
+}
+
 static gboolean linphone_gtk_auto_answer(LinphoneCall *call){
-       if (linphone_call_get_state(call)==LinphoneCallIncomingReceived){
-               linphone_core_accept_call (linphone_gtk_get_core(),call);
+       LinphoneCallState state=linphone_call_get_state(call);
+       if (state==LinphoneCallIncomingReceived || state==LinphoneCallIncomingEarlyMedia){
+               accept_incoming_call(call);
                linphone_call_unref(call);
        }
        return FALSE;
 }
 
 void linphone_gtk_start_call(GtkWidget *w){
-       LinphoneCore *lc=linphone_gtk_get_core();
-       LinphoneCall *call;
+       LinphoneCall *call=linphone_gtk_get_currently_displayed_call(NULL);
        /*change into in-call mode, then do the work later as it might block a bit */
        GtkWidget *mw=gtk_widget_get_toplevel(w);
        GtkWidget *uri_bar=linphone_gtk_get_widget(mw,"uribar");
+       LinphoneCallState state= call ? linphone_call_get_state(call) : LinphoneCallIdle;
 
-       call=linphone_gtk_get_currently_displayed_call(NULL);
-       if (call!=NULL && linphone_call_get_state(call)==LinphoneCallIncomingReceived){
-               linphone_core_accept_call(lc,call);
+       if (state == LinphoneCallIncomingReceived || state == LinphoneCallIncomingEarlyMedia){
+               accept_incoming_call(call);
        }else{
                /*immediately disable the button and delay a bit the execution the linphone_core_invite()
                so that we don't freeze the button. linphone_core_invite() might block for some hundreds of milliseconds*/
@@ -831,7 +862,7 @@ void linphone_gtk_decline_clicked(GtkWidget *button){
 void linphone_gtk_answer_clicked(GtkWidget *button){
        LinphoneCall *call=linphone_gtk_get_currently_displayed_call(NULL);
        if (call){
-               linphone_core_accept_call(linphone_gtk_get_core(),call);
+               accept_incoming_call(call);
                linphone_gtk_show_main_window(); /* useful when the button is clicked on a notification */
        }
 }
index b42470e5ad612a59032fb420624d4a88996fcf36..e1c8c91291fcdd0b9cc626d84fff03a8e22f49a8 100644 (file)
           <object class="GtkVBox" id="conf_box">
             <property name="visible">True</property>
             <property name="can_focus">False</property>
-            <child>
-              <placeholder/>
-            </child>
             <child>
               <object class="GtkHButtonBox" id="button_conf">
                 <property name="visible">True</property>
                 <property name="expand">True</property>
                 <property name="fill">True</property>
                 <property name="pack_type">end</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkHBox" id="conf_record_hbox">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <child>
+                  <object class="GtkToggleButton" id="conf_record_button">
+                    <property name="label">gtk-media-record</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="use_action_appearance">False</property>
+                    <property name="use_stock">True</property>
+                    <signal name="toggled" handler="linphone_gtk_record_call_toggled" swapped="no"/>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkLabel" id="conf_record_status">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="wrap">True</property>
+                    <property name="wrap_mode">char</property>
+                  </object>
+                  <packing>
+                    <property name="expand">True</property>
+                    <property name="fill">True</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="pack_type">end</property>
                 <property name="position">1</property>
               </packing>
             </child>
+            <child>
+              <placeholder/>
+            </child>
           </object>
         </child>
       </object>
index 5aee3f4300e92b025c02544c782bad10da923951..8481bef7e6532dae73ce02b8bd58c0c4cafa67be 100644 (file)
@@ -972,7 +972,8 @@ static void linphone_gtk_show_media_encryption(GtkWidget *pb){
                }
                g_signal_connect(G_OBJECT(combo),"changed",(GCallback)linphone_gtk_media_encryption_changed,NULL);
        }
-       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(pb,"media_encryption_mandatory")),linphone_core_is_media_encryption_mandatory(lc));
+       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(pb,"media_encryption_mandatory")),
+                                    linphone_core_is_media_encryption_mandatory(lc));
        g_object_unref(G_OBJECT(model));
 }
 
@@ -1015,10 +1016,8 @@ void linphone_gtk_show_parameters(void){
        if (pb==NULL) {
                pb=linphone_gtk_create_window("parameters");
                g_object_set_data(G_OBJECT(mw),"parameters",pb);
-               ms_error("linphone_gtk_show_paramters: create");
        }else {
                gtk_widget_show(pb);
-               ms_error("linphone_gtk_show_parameters: show");
                return;
        }
        codec_list=linphone_gtk_get_widget(pb,"codec_list");
@@ -1028,21 +1027,21 @@ void linphone_gtk_show_parameters(void){
                                linphone_core_ipv6_enabled(lc));
        linphone_core_get_sip_transports(lc,&tr);
 
-    if (tr.tcp_port > 0) {
-        gtk_combo_box_set_active(GTK_COMBO_BOX(linphone_gtk_get_widget(pb,"proto_combo")), 1);
-        gtk_spin_button_set_value(GTK_SPIN_BUTTON(linphone_gtk_get_widget(pb,"proto_port")),
+       if (tr.tcp_port > 0) {
+               gtk_combo_box_set_active(GTK_COMBO_BOX(linphone_gtk_get_widget(pb,"proto_combo")), 1);
+               gtk_spin_button_set_value(GTK_SPIN_BUTTON(linphone_gtk_get_widget(pb,"proto_port")),
                                tr.tcp_port);
-    }
-    else if (tr.tls_port > 0) {
-        gtk_combo_box_set_active(GTK_COMBO_BOX(linphone_gtk_get_widget(pb,"proto_combo")), 2);
-        gtk_spin_button_set_value(GTK_SPIN_BUTTON(linphone_gtk_get_widget(pb,"proto_port")),
+       }
+       else if (tr.tls_port > 0) {
+               gtk_combo_box_set_active(GTK_COMBO_BOX(linphone_gtk_get_widget(pb,"proto_combo")), 2);
+               gtk_spin_button_set_value(GTK_SPIN_BUTTON(linphone_gtk_get_widget(pb,"proto_port")),
                                tr.tls_port);
-    }
-    else {
-        gtk_combo_box_set_active(GTK_COMBO_BOX(linphone_gtk_get_widget(pb,"proto_combo")), 0);
-        gtk_spin_button_set_value(GTK_SPIN_BUTTON(linphone_gtk_get_widget(pb,"proto_port")),
+       }
+       else {
+               gtk_combo_box_set_active(GTK_COMBO_BOX(linphone_gtk_get_widget(pb,"proto_combo")), 0);
+               gtk_spin_button_set_value(GTK_SPIN_BUTTON(linphone_gtk_get_widget(pb,"proto_port")),
                                tr.udp_port);
-    }
+       }
 
        linphone_core_get_audio_port_range(lc, &min_port, &max_port);
        gtk_spin_button_set_value(GTK_SPIN_BUTTON(linphone_gtk_get_widget(pb, "audio_min_rtp_port")), min_port);
old mode 100755 (executable)
new mode 100644 (file)
diff --git a/linphone.kdevelop b/linphone.kdevelop
deleted file mode 100644 (file)
index 2cb0437..0000000
+++ /dev/null
@@ -1,558 +0,0 @@
-<?xml version = '1.0'?>
-<kdevelop>
-  <general>
-    <author>Simon Morlat</author>
-    <email>simon.morlat@linphone.org</email>
-    <version>[3.1.2]</version>
-    <projectmanagement>KDevCustomProject</projectmanagement>
-    <primarylanguage>C</primarylanguage>
-    <ignoreparts/>
-    <projectname>linphone</projectname>
-    <projectdirectory>.</projectdirectory>
-    <absoluteprojectpath>false</absoluteprojectpath>
-    <description/>
-    <defaultencoding/>
-  </general>
-  <kdevcustomproject>
-    <run>
-      <directoryradio>executable</directoryradio>
-      <mainprogram>gtk-glade/linphone</mainprogram>
-      <programargs/>
-      <globaldebugarguments/>
-      <globalcwd/>
-      <useglobalprogram>false</useglobalprogram>
-      <terminal>false</terminal>
-      <autocompile>false</autocompile>
-      <autoinstall>false</autoinstall>
-      <autokdesu>false</autokdesu>
-      <envvars/>
-    </run>
-    <filetypes>
-      <filetype>*.java</filetype>
-      <filetype>*.h</filetype>
-      <filetype>*.H</filetype>
-      <filetype>*.hh</filetype>
-      <filetype>*.hxx</filetype>
-      <filetype>*.hpp</filetype>
-      <filetype>*.c</filetype>
-      <filetype>*.C</filetype>
-      <filetype>*.cc</filetype>
-      <filetype>*.cpp</filetype>
-      <filetype>*.c++</filetype>
-      <filetype>*.cxx</filetype>
-    </filetypes>
-    <blacklist>
-      <path>config.h</path>
-      <path>exosip</path>
-      <path>exosip/eXosip2.h</path>
-      <path>exosip/eXosip.c</path>
-      <path>exosip/eXosip_cfg.h</path>
-      <path>exosip/eXosip.h</path>
-      <path>exosip/eXutils.c</path>
-      <path>exosip/jauth.c</path>
-      <path>exosip/jcallback.c</path>
-      <path>exosip/jcall.c</path>
-      <path>exosip/jdialog.c</path>
-      <path>exosip/jevents.c</path>
-      <path>exosip/jfreinds.c</path>
-      <path>exosip/jidentity.c</path>
-      <path>exosip/jnotify.c</path>
-      <path>exosip/jpipe.c</path>
-      <path>exosip/jpipe.h</path>
-      <path>exosip/jpublish.c</path>
-      <path>exosip/jreg.c</path>
-      <path>exosip/jrequest.c</path>
-      <path>exosip/jresponse.c</path>
-      <path>exosip/jsubscribe.c</path>
-      <path>exosip/jsubscribers.c</path>
-      <path>exosip/misc.c</path>
-      <path>exosip/sdp_offans.c</path>
-      <path>exosip/udp.c</path>
-      <path>gnome</path>
-      <path>gnome/addressbook.c</path>
-      <path>gnome/addressbook.h</path>
-      <path>gnome/applet.c</path>
-      <path>gnome/callbacks.c</path>
-      <path>gnome/callbacks.h</path>
-      <path>gnome/friends.c</path>
-      <path>gnome/friends.h</path>
-      <path>gnome/gui_utils.c</path>
-      <path>gnome/gui_utils.h</path>
-      <path>gnome/interface.c</path>
-      <path>gnome/interface.h</path>
-      <path>gnome/linphone.c</path>
-      <path>gnome/linphone.h</path>
-      <path>gnome/main.c</path>
-      <path>gnome/presence.c</path>
-      <path>gnome/presence.h</path>
-      <path>gnome/propertybox.c</path>
-      <path>gnome/propertybox.h</path>
-      <path>gnome/support.c</path>
-      <path>gnome/support.h</path>
-      <path>gsmlib</path>
-      <path>gsmlib/code.c</path>
-      <path>gsmlib/config.h</path>
-      <path>gsmlib/debug.c</path>
-      <path>gsmlib/decode.c</path>
-      <path>gsmlib/gsmadd.c</path>
-      <path>gsmlib/gsm_create.c</path>
-      <path>gsmlib/gsm_decode.c</path>
-      <path>gsmlib/gsm_destroy.c</path>
-      <path>gsmlib/gsm_encode.c</path>
-      <path>gsmlib/gsm_explode.c</path>
-      <path>gsmlib/gsm.h</path>
-      <path>gsmlib/gsm_implode.c</path>
-      <path>gsmlib/gsm_option.c</path>
-      <path>gsmlib/gsm_print.c</path>
-      <path>gsmlib/gsm_wrapper.c</path>
-      <path>gsmlib/gsm_wrapper.h</path>
-      <path>gsmlib/long_term.c</path>
-      <path>gsmlib/lpc.c</path>
-      <path>gsmlib/preprocess.c</path>
-      <path>gsmlib/private.h</path>
-      <path>gsmlib/proto.h</path>
-      <path>gsmlib/rpe.c</path>
-      <path>gsmlib/short_term.c</path>
-      <path>gsmlib/table.c</path>
-      <path>gsmlib/toast.h</path>
-      <path>gsmlib/unproto.h</path>
-      <path>gtk</path>
-      <path>gtk/addressbook.c</path>
-      <path>gtk/addressbook.h</path>
-      <path>gtk/applet.c</path>
-      <path>gtk/callbacks.c</path>
-      <path>gtk/callbacks.h</path>
-      <path>gtk/friends.c</path>
-      <path>gtk/friends.h</path>
-      <path>gtk/gui_utils.c</path>
-      <path>gtk/gui_utils.h</path>
-      <path>gtk/interface.c</path>
-      <path>gtk/interface.h</path>
-      <path>gtk/linphone.c</path>
-      <path>gtk/linphone.h</path>
-      <path>gtk/main.c</path>
-      <path>gtk/presence.c</path>
-      <path>gtk/presence.h</path>
-      <path>gtk/propertybox.c</path>
-      <path>gtk/propertybox.h</path>
-      <path>gtk/support.c</path>
-      <path>gtk/support.h</path>
-      <path>intl</path>
-      <path>intl/bindtextdom.c</path>
-      <path>intl/cat-compat.c</path>
-      <path>intl/dcgettext.c</path>
-      <path>intl/dgettext.c</path>
-      <path>intl/explodename.c</path>
-      <path>intl/finddomain.c</path>
-      <path>intl/gettext.c</path>
-      <path>intl/gettext.h</path>
-      <path>intl/gettextP.h</path>
-      <path>intl/hash-string.h</path>
-      <path>intl/intl-compat.c</path>
-      <path>intl/l10nflist.c</path>
-      <path>intl/libgettext.h</path>
-      <path>intl/loadinfo.h</path>
-      <path>intl/loadmsgcat.c</path>
-      <path>intl/localealias.c</path>
-      <path>intl/textdomain.c</path>
-      <path>lpc10-1.5</path>
-      <path>lpc10-1.5/analys.c</path>
-      <path>lpc10-1.5/bitio.c</path>
-      <path>lpc10-1.5/bsynz.c</path>
-      <path>lpc10-1.5/chanwr.c</path>
-      <path>lpc10-1.5/dcbias.c</path>
-      <path>lpc10-1.5/decode.c</path>
-      <path>lpc10-1.5/deemp.c</path>
-      <path>lpc10-1.5/difmag.c</path>
-      <path>lpc10-1.5/dyptrk.c</path>
-      <path>lpc10-1.5/encode.c</path>
-      <path>lpc10-1.5/energy.c</path>
-      <path>lpc10-1.5/f2c.h</path>
-      <path>lpc10-1.5/f2clib.c</path>
-      <path>lpc10-1.5/ham84.c</path>
-      <path>lpc10-1.5/hp100.c</path>
-      <path>lpc10-1.5/invert.c</path>
-      <path>lpc10-1.5/irc2pc.c</path>
-      <path>lpc10-1.5/ivfilt.c</path>
-      <path>lpc10-1.5/lpc10.h</path>
-      <path>lpc10-1.5/lpc10_wrapper.c</path>
-      <path>lpc10-1.5/lpc10_wrapper.h</path>
-      <path>lpc10-1.5/lpcdec.c</path>
-      <path>lpc10-1.5/lpcenc.c</path>
-      <path>lpc10-1.5/lpcini.c</path>
-      <path>lpc10-1.5/lpfilt.c</path>
-      <path>lpc10-1.5/median.c</path>
-      <path>lpc10-1.5/mload.c</path>
-      <path>lpc10-1.5/onset.c</path>
-      <path>lpc10-1.5/pitsyn.c</path>
-      <path>lpc10-1.5/placea.c</path>
-      <path>lpc10-1.5/placev.c</path>
-      <path>lpc10-1.5/preemp.c</path>
-      <path>lpc10-1.5/prepro.c</path>
-      <path>lpc10-1.5/random.c</path>
-      <path>lpc10-1.5/rcchk.c</path>
-      <path>lpc10-1.5/synths.c</path>
-      <path>lpc10-1.5/tbdm.c</path>
-      <path>lpc10-1.5/voicin.c</path>
-      <path>lpc10-1.5/vparms.c</path>
-      <path>media_api</path>
-      <path>media_api/apitest.c</path>
-      <path>media_api/apitest.h</path>
-      <path>media_api/basiccall.c</path>
-      <path>media_api/basiccall.h</path>
-      <path>media_api/callmember.c</path>
-      <path>media_api/callmember.h</path>
-      <path>media_api/common.h</path>
-      <path>media_api/media_api.c</path>
-      <path>media_api/media_api.h</path>
-      <path>media_api/mediaflow.c</path>
-      <path>media_api/mediaflow.h</path>
-      <path>mediastreamer</path>
-      <path>mediastreamer/affine.c</path>
-      <path>mediastreamer/affine.h</path>
-      <path>mediastreamer/alsacard.c</path>
-      <path>mediastreamer/alsacard.h</path>
-      <path>mediastreamer/audiostream.c</path>
-      <path>mediastreamer/g711common.h</path>
-      <path>mediastreamer/hpuxsndcard.c</path>
-      <path>mediastreamer/jackcard.c</path>
-      <path>mediastreamer/jackcard.h</path>
-      <path>mediastreamer/mediastream.c</path>
-      <path>mediastreamer/mediastream.h</path>
-      <path>mediastreamer/msAlawdec.c</path>
-      <path>mediastreamer/msAlawdec.h</path>
-      <path>mediastreamer/msAlawenc.c</path>
-      <path>mediastreamer/msAlawenc.h</path>
-      <path>mediastreamer/msavdecoder.c</path>
-      <path>mediastreamer/msavdecoder.h</path>
-      <path>mediastreamer/msavencoder.c</path>
-      <path>mediastreamer/msavencoder.h</path>
-      <path>mediastreamer/msbuffer.c</path>
-      <path>mediastreamer/msbuffer.h</path>
-      <path>mediastreamer/ms.c</path>
-      <path>mediastreamer/mscodec.c</path>
-      <path>mediastreamer/mscodec.h</path>
-      <path>mediastreamer/mscopy.c</path>
-      <path>mediastreamer/mscopy.h</path>
-      <path>mediastreamer/msfdispatcher.c</path>
-      <path>mediastreamer/msfdispatcher.h</path>
-      <path>mediastreamer/msfifo.c</path>
-      <path>mediastreamer/msfifo.h</path>
-      <path>mediastreamer/msfilter.c</path>
-      <path>mediastreamer/msfilter.h</path>
-      <path>mediastreamer/msGSMdecoder.c</path>
-      <path>mediastreamer/msGSMdecoder.h</path>
-      <path>mediastreamer/msGSMencoder.c</path>
-      <path>mediastreamer/msGSMencoder.h</path>
-      <path>mediastreamer/ms.h</path>
-      <path>mediastreamer/msLPC10decoder.c</path>
-      <path>mediastreamer/msLPC10decoder.h</path>
-      <path>mediastreamer/msLPC10encoder.c</path>
-      <path>mediastreamer/msLPC10encoder.h</path>
-      <path>mediastreamer/msMUlawdec.c</path>
-      <path>mediastreamer/msMUlawdec.h</path>
-      <path>mediastreamer/msMUlawenc.c</path>
-      <path>mediastreamer/msMUlawenc.h</path>
-      <path>mediastreamer/msnosync.c</path>
-      <path>mediastreamer/msnosync.h</path>
-      <path>mediastreamer/msossread.c</path>
-      <path>mediastreamer/msossread.h</path>
-      <path>mediastreamer/msosswrite.c</path>
-      <path>mediastreamer/msosswrite.h</path>
-      <path>mediastreamer/msqdispatcher.c</path>
-      <path>mediastreamer/msqdispatcher.h</path>
-      <path>mediastreamer/msqueue.c</path>
-      <path>mediastreamer/msqueue.h</path>
-      <path>mediastreamer/msread.c</path>
-      <path>mediastreamer/msread.h</path>
-      <path>mediastreamer/msringplayer.c</path>
-      <path>mediastreamer/msringplayer.h</path>
-      <path>mediastreamer/msrtprecv.c</path>
-      <path>mediastreamer/msrtprecv.h</path>
-      <path>mediastreamer/msrtpsend.c</path>
-      <path>mediastreamer/msrtpsend.h</path>
-      <path>mediastreamer/mssdlout.c</path>
-      <path>mediastreamer/mssdlout.h</path>
-      <path>mediastreamer/mssmpeg.c</path>
-      <path>mediastreamer/mssmpeg.h</path>
-      <path>mediastreamer/mssoundread.c</path>
-      <path>mediastreamer/mssoundread.h</path>
-      <path>mediastreamer/mssoundwrite.c</path>
-      <path>mediastreamer/mssoundwrite.h</path>
-      <path>mediastreamer/msspeexdec.c</path>
-      <path>mediastreamer/msspeexdec.h</path>
-      <path>mediastreamer/msspeexenc.c</path>
-      <path>mediastreamer/msspeexenc.h</path>
-      <path>mediastreamer/mssync.c</path>
-      <path>mediastreamer/mssync.h</path>
-      <path>mediastreamer/mstcpclient.c</path>
-      <path>mediastreamer/mstcpclient.h</path>
-      <path>mediastreamer/mstcpserv.c</path>
-      <path>mediastreamer/mstcpserv.h</path>
-      <path>mediastreamer/mstimer.c</path>
-      <path>mediastreamer/mstimer.h</path>
-      <path>mediastreamer/mstruespeechdecoder.c</path>
-      <path>mediastreamer/mstruespeechdecoder.h</path>
-      <path>mediastreamer/mstruespeechencoder.c</path>
-      <path>mediastreamer/mstruespeechencoder.h</path>
-      <path>mediastreamer/msutils.h</path>
-      <path>mediastreamer/msv4l.c</path>
-      <path>mediastreamer/msv4l.h</path>
-      <path>mediastreamer/msvideooutput.c</path>
-      <path>mediastreamer/msvideooutput.h</path>
-      <path>mediastreamer/msvideosource.c</path>
-      <path>mediastreamer/msvideosource.h</path>
-      <path>mediastreamer/mswrite.c</path>
-      <path>mediastreamer/mswrite.h</path>
-      <path>mediastreamer/msxine.c</path>
-      <path>mediastreamer/msxine.h</path>
-      <path>mediastreamer/osscard.c</path>
-      <path>mediastreamer/osscard.h</path>
-      <path>mediastreamer/rfc2429.h</path>
-      <path>mediastreamer/ring_test.c</path>
-      <path>mediastreamer/sndcard.c</path>
-      <path>mediastreamer/sndcard.h</path>
-      <path>mediastreamer/test_alaw.c</path>
-      <path>mediastreamer/test.c</path>
-      <path>mediastreamer/test_gsm.c</path>
-      <path>mediastreamer/test_lpc10.c</path>
-      <path>mediastreamer/test_mulaw.c</path>
-      <path>mediastreamer/test_rtprecv.c</path>
-      <path>mediastreamer/test_smpeg.c</path>
-      <path>mediastreamer/test_speex.c</path>
-      <path>mediastreamer/test_truespeech.c</path>
-      <path>mediastreamer/test_v4l.c</path>
-      <path>mediastreamer/test_videostream.c</path>
-      <path>mediastreamer/test_xine.c</path>
-      <path>mediastreamer/videoclient.c</path>
-      <path>mediastreamer/videoserver.c</path>
-      <path>mediastreamer/videostream.c</path>
-      <path>mediastreamer/waveheader.h</path>
-      <path>po</path>
-      <path>po/cat-id-tbl.c</path>
-      <path>win32acm</path>
-      <path>win32acm/afl.c</path>
-      <path>win32acm/com.h</path>
-      <path>win32acm/config.h</path>
-      <path>win32acm/cpudetect.c</path>
-      <path>win32acm/cpudetect.h</path>
-      <path>win32acm/cputable.h</path>
-      <path>win32acm/driver.c</path>
-      <path>win32acm/driver.h</path>
-      <path>win32acm/elfdll.c</path>
-      <path>win32acm/ext.c</path>
-      <path>win32acm/ext.h</path>
-      <path>win32acm/ldt_keeper.c</path>
-      <path>win32acm/ldt_keeper.h</path>
-      <path>win32acm/loader.h</path>
-      <path>win32acm/module.c</path>
-      <path>win32acm/mp_msg.c</path>
-      <path>win32acm/mp_msg.h</path>
-      <path>win32acm/pe_image.c</path>
-      <path>win32acm/pe_resource.c</path>
-      <path>win32acm/registry.c</path>
-      <path>win32acm/registry.h</path>
-      <path>win32acm/resource.c</path>
-      <path>win32acm/test_truespeech.c</path>
-      <path>win32acm/win32.c</path>
-      <path>win32acm/win32codec.c</path>
-      <path>win32acm/win32codec.h</path>
-      <path>win32acm/win32.h</path>
-      <path>win32acm/wine</path>
-      <path>win32acm/wine/basetsd.h</path>
-      <path>win32acm/wine/debugtools.h</path>
-      <path>win32acm/wine/driver.h</path>
-      <path>win32acm/wine/elfdll.h</path>
-      <path>win32acm/wine/heap.h</path>
-      <path>win32acm/wine/ldt.h</path>
-      <path>win32acm/wine/mmreg.h</path>
-      <path>win32acm/wine/module.h</path>
-      <path>win32acm/wine/msacmdrv.h</path>
-      <path>win32acm/wine/msacm.h</path>
-      <path>win32acm/wine/ntdef.h</path>
-      <path>win32acm/wine/pe_image.h</path>
-      <path>win32acm/wine/poppack.h</path>
-      <path>win32acm/wine/pshpack1.h</path>
-      <path>win32acm/wine/pshpack2.h</path>
-      <path>win32acm/wine/pshpack4.h</path>
-      <path>win32acm/wine/pshpack8.h</path>
-      <path>win32acm/wine/vfw.h</path>
-      <path>win32acm/wine/winbase.h</path>
-      <path>win32acm/wine/windef.h</path>
-      <path>win32acm/wine/windows.h</path>
-      <path>win32acm/wine/winerror.h</path>
-      <path>win32acm/wine/winestring.h</path>
-      <path>win32acm/wine/winnt.h</path>
-      <path>win32acm/wine/winreg.h</path>
-      <path>win32acm/wine/winuser.h</path>
-      <path>win32acm/wineacm.h</path>
-      <path>win32acm/wrapper.h</path>
-      <path>builddate.h</path>
-    </blacklist>
-    <build>
-      <buildtool>make</buildtool>
-      <builddir/>
-    </build>
-    <other>
-      <prio>0</prio>
-      <otherbin/>
-      <defaulttarget/>
-      <otheroptions/>
-      <selectedenvironment>default</selectedenvironment>
-      <environments>
-        <default/>
-      </environments>
-    </other>
-    <make>
-      <abortonerror>true</abortonerror>
-      <numberofjobs>0</numberofjobs>
-      <prio>0</prio>
-      <dontact>false</dontact>
-      <makebin/>
-      <defaulttarget/>
-      <makeoptions/>
-      <selectedenvironment>default</selectedenvironment>
-      <environments>
-        <default/>
-      </environments>
-    </make>
-  </kdevcustomproject>
-  <kdevdebugger>
-    <general>
-      <dbgshell/>
-      <gdbpath/>
-      <configGdbScript/>
-      <runShellScript/>
-      <runGdbScript/>
-      <breakonloadinglibs>true</breakonloadinglibs>
-      <separatetty>false</separatetty>
-      <floatingtoolbar>false</floatingtoolbar>
-      <raiseGDBOnStart>false</raiseGDBOnStart>
-    </general>
-    <display>
-      <staticmembers>false</staticmembers>
-      <demanglenames>true</demanglenames>
-      <outputradix>10</outputradix>
-    </display>
-  </kdevdebugger>
-  <kdevdoctreeview>
-    <ignoretocs>
-      <toc>ada</toc>
-      <toc>ada_bugs_gcc</toc>
-      <toc>bash</toc>
-      <toc>bash_bugs</toc>
-      <toc>clanlib</toc>
-      <toc>fortran_bugs_gcc</toc>
-      <toc>gnome1</toc>
-      <toc>gnustep</toc>
-      <toc>gtk</toc>
-      <toc>gtk_bugs</toc>
-      <toc>haskell</toc>
-      <toc>haskell_bugs_ghc</toc>
-      <toc>java_bugs_gcc</toc>
-      <toc>java_bugs_sun</toc>
-      <toc>kde2book</toc>
-      <toc>libstdc++</toc>
-      <toc>opengl</toc>
-      <toc>pascal_bugs_fp</toc>
-      <toc>php</toc>
-      <toc>php_bugs</toc>
-      <toc>perl</toc>
-      <toc>perl_bugs</toc>
-      <toc>python</toc>
-      <toc>python_bugs</toc>
-      <toc>qt-kdev3</toc>
-      <toc>ruby</toc>
-      <toc>ruby_bugs</toc>
-      <toc>sdl</toc>
-      <toc>stl</toc>
-      <toc>sw</toc>
-      <toc>w3c-dom-level2-html</toc>
-      <toc>w3c-svg</toc>
-      <toc>w3c-uaag10</toc>
-      <toc>wxwidgets_bugs</toc>
-    </ignoretocs>
-    <ignoreqt_xml>
-      <toc>Guide to the Qt Translation Tools</toc>
-      <toc>Qt Assistant Manual</toc>
-      <toc>Qt Designer Manual</toc>
-      <toc>Qt Reference Documentation</toc>
-      <toc>qmake User Guide</toc>
-    </ignoreqt_xml>
-    <ignoredoxygen>
-      <toc>KDE Libraries (Doxygen)</toc>
-    </ignoredoxygen>
-  </kdevdoctreeview>
-  <kdevfilecreate>
-    <filetypes/>
-    <useglobaltypes>
-      <type ext="c" />
-      <type ext="h" />
-    </useglobaltypes>
-  </kdevfilecreate>
-  <kdevcppsupport>
-    <qt>
-      <used>false</used>
-      <version>3</version>
-      <includestyle>3</includestyle>
-      <root></root>
-      <designerintegration>EmbeddedKDevDesigner</designerintegration>
-      <qmake></qmake>
-      <designer></designer>
-      <designerpluginpaths/>
-    </qt>
-    <references/>
-    <codecompletion>
-      <automaticCodeCompletion>false</automaticCodeCompletion>
-      <automaticArgumentsHint>true</automaticArgumentsHint>
-      <automaticHeaderCompletion>true</automaticHeaderCompletion>
-      <codeCompletionDelay>250</codeCompletionDelay>
-      <argumentsHintDelay>400</argumentsHintDelay>
-      <headerCompletionDelay>250</headerCompletionDelay>
-      <showOnlyAccessibleItems>false</showOnlyAccessibleItems>
-      <completionBoxItemOrder>0</completionBoxItemOrder>
-      <howEvaluationContextMenu>true</howEvaluationContextMenu>
-      <showCommentWithArgumentHint>true</showCommentWithArgumentHint>
-      <statusBarTypeEvaluation>false</statusBarTypeEvaluation>
-      <namespaceAliases>std=_GLIBCXX_STD;__gnu_cxx=std</namespaceAliases>
-      <processPrimaryTypes>true</processPrimaryTypes>
-      <processFunctionArguments>false</processFunctionArguments>
-      <preProcessAllHeaders>false</preProcessAllHeaders>
-      <parseMissingHeadersExperimental>false</parseMissingHeadersExperimental>
-      <resolveIncludePathsUsingMakeExperimental>false</resolveIncludePathsUsingMakeExperimental>
-      <alwaysParseInBackground>true</alwaysParseInBackground>
-      <usePermanentCaching>true</usePermanentCaching>
-      <alwaysIncludeNamespaces>false</alwaysIncludeNamespaces>
-      <includePaths>.;</includePaths>
-    </codecompletion>
-    <creategettersetter>
-      <prefixGet/>
-      <prefixSet>set</prefixSet>
-      <prefixVariable>m_,_</prefixVariable>
-      <parameterName>theValue</parameterName>
-      <inlineGet>true</inlineGet>
-      <inlineSet>true</inlineSet>
-    </creategettersetter>
-    <splitheadersource>
-      <enabled>false</enabled>
-      <synchronize>true</synchronize>
-      <orientation>Vertical</orientation>
-    </splitheadersource>
-  </kdevcppsupport>
-  <kdevfileview>
-    <groups>
-      <hidenonprojectfiles>false</hidenonprojectfiles>
-      <hidenonlocation>false</hidenonlocation>
-    </groups>
-    <tree>
-      <hidepatterns>*.o,*.lo,CVS</hidepatterns>
-      <hidenonprojectfiles>false</hidenonprojectfiles>
-    </tree>
-  </kdevfileview>
-  <cppsupportpart>
-    <filetemplates>
-      <interfacesuffix>.h</interfacesuffix>
-      <implementationsuffix>.cpp</implementationsuffix>
-    </filetemplates>
-  </cppsupportpart>
-</kdevelop>