~ubuntu-branches/ubuntu/quantal/linphone/quantal

« back to all changes in this revision

Viewing changes to gnome/addressbook.c

  • Committer: Bazaar Package Importer
  • Author(s): Samuel Mimram
  • Date: 2006-11-15 10:34:50 UTC
  • mfrom: (1.2.1 upstream) (2.1.8 feisty)
  • Revision ID: james.westby@ubuntu.com-20061115103450-qgafwcks2lkhctlj
* New upstream release.
* Enable video support.
* Fix mismatched #endif in mscommon.h, closes: #398307.

Show diffs side-by-side

added added

removed removed

Lines of Context:
20
20
 
21
21
#define get_address_book()      (&uiobj->addressbook)
22
22
#define get_main_window() (&uiobj->main_window)
 
23
#define get_core() (uiobj->core)
 
24
#define get_uiobj() (uiobj)
 
25
 
 
26
void fill_address_book(GtkWidget *address_list);
 
27
 
 
28
void ab_destroyed(){
 
29
        get_uiobj()->ab=NULL;
 
30
}
 
31
 
 
32
void show_address_book(){
 
33
        if (get_uiobj()->ab!=NULL){
 
34
                gtk_widget_show(get_uiobj()->ab);
 
35
        }else{
 
36
                get_uiobj()->ab=create_and_fill_address_book();
 
37
                g_signal_connect(G_OBJECT(get_uiobj()->ab),"destroy",G_CALLBACK(ab_destroyed),NULL);
 
38
                gtk_widget_show(get_uiobj()->ab);
 
39
        }
 
40
}
 
41
 
 
42
#define GLADE_HOOKUP_OBJECT(component,widget,name) \
 
43
  g_object_set_data_full (G_OBJECT (component), name, \
 
44
    gtk_widget_ref (widget), (GDestroyNotify) gtk_widget_unref)
 
45
 
 
46
void contact_draw(GtkWidget *w, LinphoneProxyConfig *cfg){
 
47
        GtkWidget *table=lookup_widget(w,"table10");
 
48
        GtkWidget *combo;
 
49
        combo=proxy_combo_box_new(cfg);
 
50
        gtk_widget_show(combo);
 
51
        gtk_table_attach(GTK_TABLE(table),combo,1,2,2,3, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
 
52
                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
 
53
        GLADE_HOOKUP_OBJECT(w,combo,"proxy");
 
54
        combo=gtk_combo_box_new_text();
 
55
        gtk_combo_box_append_text(GTK_COMBO_BOX(combo),_("Wait"));
 
56
        gtk_combo_box_append_text(GTK_COMBO_BOX(combo),_("Deny"));
 
57
        gtk_combo_box_append_text(GTK_COMBO_BOX(combo),_("Accept"));
 
58
        gtk_widget_show(combo);
 
59
        gtk_table_attach(GTK_TABLE(table),combo,1,2,3,4, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
 
60
                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
 
61
        GLADE_HOOKUP_OBJECT(w,combo,"pol");
 
62
}
 
63
 
 
64
GtkWidget * contact_new(LinphoneFriend *lf, GtkWidget *ab){
 
65
        GtkWidget *w=create_contact_box();
 
66
        contact_draw(w,NULL);
 
67
        gtk_widget_show(w);
 
68
        g_object_set_data(G_OBJECT(w),"friend_ref",(gpointer)lf);
 
69
        g_object_set_data(G_OBJECT(w),"address_book",(gpointer)ab);
 
70
        g_object_set_data(G_OBJECT(w),"add",GINT_TO_POINTER(TRUE));
 
71
        gtk_combo_box_set_active(GTK_COMBO_BOX(lookup_widget(w,"pol")),lf->pol);
 
72
        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(lookup_widget(w,"send_subscribe")),lf->subscribe);
 
73
        return w;
 
74
}
 
75
 
 
76
GtkWidget * contact_edit(LinphoneFriend *lf, GtkWidget *ab){
 
77
        GtkWidget *w=create_contact_box();
 
78
        gchar *tmpstr;
 
79
        contact_draw(w,lf->proxy);
 
80
        
 
81
        g_object_set_data(G_OBJECT(w),"friend_ref",(gpointer)lf);
 
82
        linphone_friend_edit(lf);
 
83
        tmpstr=linphone_friend_get_name(lf);
 
84
        if (tmpstr!=NULL) {
 
85
                gtk_entry_set_text(GTK_ENTRY(lookup_widget(w,"name")),tmpstr);
 
86
                g_free(tmpstr);
 
87
        }
 
88
        tmpstr=linphone_friend_get_addr(lf);
 
89
        gtk_entry_set_text(GTK_ENTRY(lookup_widget(w,"sipaddr")),tmpstr);
 
90
        g_free(tmpstr);
 
91
        
 
92
        gtk_combo_box_set_active(GTK_COMBO_BOX(lookup_widget(w,"pol")),lf->pol);
 
93
        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(lookup_widget(w,"send_subscribe")),lf->subscribe);
 
94
        
 
95
        gtk_widget_show(w);
 
96
        if (ab!=NULL) g_object_set_data(G_OBJECT(w),"address_book",(gpointer)ab);
 
97
        return w;
 
98
}
 
99
 
 
100
GtkWidget * subscriber_edit(LinphoneFriend *lf){
 
101
        GtkWidget *w=contact_edit(lf,NULL);
 
102
        g_object_set_data(G_OBJECT(w),"add",GINT_TO_POINTER(TRUE));
 
103
        return w;
 
104
}
 
105
 
 
106
gint contact_ok(GtkWidget *dialog){
 
107
        gchar *name,*sipaddr;
 
108
        gchar *url;
 
109
        gboolean add=FALSE;
 
110
        GtkWidget *ab;
 
111
        LinphoneFriend *lf;
 
112
        int err;
 
113
        lf=(LinphoneFriend*)g_object_get_data(G_OBJECT(dialog),"friend_ref");
 
114
        add=GPOINTER_TO_INT(g_object_get_data(G_OBJECT(dialog),"add"));
 
115
        name=gtk_editable_get_chars(GTK_EDITABLE(lookup_widget(dialog,"name")),0,-1);
 
116
        sipaddr=gtk_editable_get_chars(GTK_EDITABLE(lookup_widget(dialog,"sipaddr")),0,-1);
 
117
        url=g_strdup_printf("%s <%s>",name,sipaddr);
 
118
        /* workaround a bug in osip ? */
 
119
        /* something doesn't like addresses like "machin <<sip:truc@bidule>>" */
 
120
        if (strchr(sipaddr,'<')==NULL){
 
121
                err=linphone_friend_set_sip_addr(lf,url);
 
122
        }else err=-1;
 
123
        if (err<0){
 
124
                linphone_gnome_ui_display_something(get_uiobj(),GTK_MESSAGE_WARNING,_("Bad sip address: a sip address looks like sip:user@domain"));
 
125
                linphone_friend_destroy(lf);
 
126
                g_free(name);
 
127
                g_free(sipaddr);
 
128
                g_free(url);
 
129
                return -1;              
 
130
        }
 
131
        g_free(name);
 
132
        g_free(sipaddr);
 
133
        g_free(url);
 
134
        linphone_friend_set_proxy(lf,proxy_combo_box_get_selected(lookup_widget(dialog,"proxy")));
 
135
        linphone_friend_set_inc_subscribe_policy(lf,gtk_combo_box_get_active(GTK_COMBO_BOX(lookup_widget(dialog,"pol"))));
 
136
        linphone_friend_send_subscribe(lf,gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(dialog,"send_subscribe"))));
 
137
        if (add){
 
138
                linphone_core_add_friend(get_core(),lf);
 
139
        }
 
140
        else linphone_friend_done(lf);
 
141
        /* ask the address book to redraw itself */
 
142
        ab=g_object_get_data(G_OBJECT(dialog),"address_book");
 
143
        if (ab!=NULL) fill_address_book(lookup_widget(ab,"address_list"));
 
144
        return 0;
 
145
}
23
146
 
24
147
enum{
25
148
        SIP_ADDRESS_COLUMN,
 
149
        FRIEND_REFERENCE,
26
150
        AB_NCOLUMNS
27
151
};
28
152
 
29
 
void choose_address_and_close(AddressBook *ab){
 
153
void choose_address_and_close(GtkWidget *ab){
30
154
        GtkTreeSelection *select;
31
155
        GtkWidget *addressentry=get_main_window()->addressentry;
32
156
        GtkTreeIter iter;
33
157
        GtkTreeModel *model;
34
 
        gchar *address;
35
 
        select = gtk_tree_view_get_selection (GTK_TREE_VIEW (ab->address_list));
 
158
        gchar *address=NULL;
 
159
        GtkWidget *address_list=lookup_widget(ab,"address_list");
 
160
        select = gtk_tree_view_get_selection (GTK_TREE_VIEW (address_list));
36
161
        if (select==NULL) return;
37
162
        if (gtk_tree_selection_get_selected (select, &model, &iter))
38
163
        {
39
164
                gtk_tree_model_get (model, &iter,SIP_ADDRESS_COLUMN , &address, -1);
40
165
        }
41
 
        g_return_if_fail(address!=NULL);
42
 
        gtk_entry_set_text (GTK_ENTRY(gnome_entry_gtk_entry(GNOME_ENTRY(addressentry))),address);
43
 
        address_book_uninit(ab,TRUE);
 
166
        if (address!=NULL){
 
167
                gtk_entry_set_text (GTK_ENTRY(addressentry),address);
 
168
                g_free(address);
 
169
        }
 
170
        gtk_widget_destroy(ab);
 
171
}
 
172
void
 
173
address_book_close                  (GtkWidget       *object,
 
174
                                        gpointer         user_data)
 
175
{
 
176
        gtk_widget_destroy(gtk_widget_get_toplevel(object));    
44
177
}
45
178
 
46
179
void address_selection_changed_cb(GtkTreeSelection *selection, gpointer data)
47
180
{
48
 
        AddressBook *ab=get_address_book();
49
 
        GtkTreeIter iter;
50
 
        GtkTreeModel *model;
51
 
        from_t *sipaddr;
52
 
        gchar *address=NULL;
53
 
        gchar *url;
54
 
        gint error;
55
181
        
56
 
        if (gtk_tree_selection_get_selected (selection, &model, &iter)){
57
 
                gtk_tree_model_get (model, &iter,SIP_ADDRESS_COLUMN , &address, -1);
58
 
                g_return_if_fail(address!=NULL);
59
 
                from_init(&sipaddr);
60
 
                error=from_parse(sipaddr,address);
61
 
                if (error!=0){
62
 
                        g_warning("error parsing sip address\n");
63
 
                        goto end;
64
 
                }
65
 
                gtk_entry_set_text(GTK_ENTRY(ab->name_entry),sipaddr->displayname);
66
 
                sfree(sipaddr->displayname);
67
 
                sipaddr->displayname=NULL;
68
 
                from_2char(sipaddr,&url);
69
 
                gtk_entry_set_text(GTK_ENTRY(ab->address_entry),url);
70
 
                from_free(sipaddr);
71
 
                sfree(sipaddr);
72
 
                sfree(url);
73
 
        }else return;
74
 
        end:
75
 
                g_free(address);
76
182
}
77
183
gboolean address_button_press(GtkWidget *widget,GdkEventButton *event,gpointer user_data)
78
184
{
 
185
        GtkWidget *ab=(GtkWidget*)user_data;
79
186
        if (event->type==GDK_2BUTTON_PRESS){
80
 
                choose_address_and_close(get_address_book());
 
187
                choose_address_and_close(ab);
81
188
                return TRUE;
82
189
        }
83
190
        return FALSE;
84
191
}
85
192
 
86
 
void address_book_init(AddressBook *ab,LinphoneCore *lc,GtkWidget *main_entry)
87
 
{
 
193
void fill_address_book(GtkWidget *address_list){
88
194
        GtkListStore *store;
89
195
        GtkTreeIter iter;
 
196
        GtkTreeModel *model;
 
197
        MSList *elem;
 
198
        gchar *tmpstr;
 
199
        /* fill the store */
 
200
        elem=linphone_core_get_friend_list(get_core());
 
201
        model=gtk_tree_view_get_model(GTK_TREE_VIEW(address_list));
 
202
        store=GTK_LIST_STORE(model);
 
203
        gtk_list_store_clear(store);
 
204
        for(;elem!=NULL;elem=ms_list_next(elem)){
 
205
                LinphoneFriend *lf=(LinphoneFriend*)elem->data;
 
206
                tmpstr=linphone_friend_get_url(lf);
 
207
                gtk_list_store_append(store,&iter);
 
208
                gtk_list_store_set(store,&iter,SIP_ADDRESS_COLUMN,tmpstr,FRIEND_REFERENCE,(gpointer)lf,-1);
 
209
                ms_free(tmpstr);
 
210
        }
 
211
}
 
212
 
 
213
GtkWidget *create_and_fill_address_book(){
 
214
        GtkListStore *store;
90
215
        GtkCellRenderer *renderer;
91
216
        GtkTreeViewColumn *column;
92
217
        GtkTreeSelection *select;
93
 
        GList *list,*elem;
94
 
        
95
 
        if (ab->address_book!=NULL) {
96
 
                gtk_widget_show(ab->address_book);
97
 
                return;
98
 
        }
99
 
        store = gtk_list_store_new (AB_NCOLUMNS, G_TYPE_STRING);
100
 
        ab->address_book=create_address_book();
101
 
        ab->name_entry=lookup_widget(ab->address_book,"name_entry");
102
 
        ab->address_entry=lookup_widget(ab->address_book,"address_entry");
103
 
        ab->main_entry=main_entry;
104
 
        ab->lc=lc;
105
 
        /* setup the address list */
106
 
        ab->address_list=lookup_widget(ab->address_book,"address_list");
107
 
        list=linphone_core_get_address_list(lc);
108
 
        elem=list;
109
 
        while(elem!=NULL){
110
 
                /* get an iterator */
111
 
                gtk_list_store_append(store,&iter);
112
 
                gtk_list_store_set(store,&iter,SIP_ADDRESS_COLUMN,elem->data,-1);
113
 
                elem=g_list_next(elem);
114
 
        }
115
 
        if (list!=NULL) g_list_free(list);
116
 
        
117
 
        gtk_tree_view_set_model(GTK_TREE_VIEW(ab->address_list),GTK_TREE_MODEL(store));
 
218
        GtkWidget *address_list;
 
219
        GtkWidget *ret=create_address_book();
 
220
        
 
221
        address_list=lookup_widget(ret,"address_list");
 
222
        store = gtk_list_store_new (AB_NCOLUMNS, G_TYPE_STRING,G_TYPE_POINTER);
 
223
        gtk_tree_view_set_model(GTK_TREE_VIEW(address_list),GTK_TREE_MODEL(store));
118
224
        g_object_unref(G_OBJECT(store));
119
225
        renderer = gtk_cell_renderer_text_new ();
120
 
        column = gtk_tree_view_column_new_with_attributes ("SIP Address list",
 
226
        column = gtk_tree_view_column_new_with_attributes (_("Contact list"),
121
227
                                                   renderer,
122
228
                                                   "text", SIP_ADDRESS_COLUMN,
123
229
                                                   NULL);
124
 
        gtk_tree_view_append_column (GTK_TREE_VIEW (ab->address_list), column);
 
230
        gtk_tree_view_append_column (GTK_TREE_VIEW (address_list), column);
 
231
        
125
232
        /* Setup the selection handler */
126
 
        select = gtk_tree_view_get_selection (GTK_TREE_VIEW (ab->address_list));
 
233
        select = gtk_tree_view_get_selection (GTK_TREE_VIEW (address_list));
127
234
        gtk_tree_selection_set_mode (select, GTK_SELECTION_SINGLE);
128
235
        g_signal_connect (G_OBJECT (select), "changed",
129
236
                  G_CALLBACK (address_selection_changed_cb),
130
237
                  NULL);
131
238
        
132
239
        /* setup handler for double click */
133
 
        g_signal_connect(G_OBJECT(ab->address_list),"button-press-event",G_CALLBACK(address_button_press),(gpointer)NULL);
134
 
        gtk_widget_show(ab->address_book);
 
240
        g_signal_connect(G_OBJECT(address_list),"button-press-event",G_CALLBACK(address_button_press),(gpointer)ret);
 
241
        
 
242
        fill_address_book(address_list);
 
243
        return ret;
135
244
}
136
245
 
137
 
 
138
246
void
139
247
on_modify_address_clicked              (GtkButton       *button,
140
248
                                        gpointer         user_data)
141
249
{
142
 
        gchar *address,*full_address,*displayname;
143
 
        from_t *sipaddr;
144
 
        gint error;
145
 
        AddressBook *ab=get_address_book();
146
250
        GtkTreeSelection *select;
147
251
        GtkTreeIter iter;
148
252
        GtkTreeModel *model;
 
253
        GtkWidget *address_list=lookup_widget(gtk_widget_get_toplevel(GTK_WIDGET(button)),"address_list");
149
254
        
150
 
        address=gtk_editable_get_chars(GTK_EDITABLE(ab->address_entry),0,-1);
151
 
        displayname=gtk_editable_get_chars(GTK_EDITABLE(ab->name_entry),0,-1);
152
 
        from_init(&sipaddr);
153
 
        error=from_parse(sipaddr,address);
154
 
        if (error!=0)
155
 
        {
156
 
                g_warning("Sip address is incorrect.\n");
157
 
                free(sipaddr);
158
 
                g_free(address);
159
 
                g_free(displayname);
160
 
                return;
161
 
        }
162
 
        sipaddr->displayname=sgetcopy(displayname);
163
 
        from_2char(sipaddr,&full_address);
164
 
        g_return_if_fail(full_address!=NULL);
165
255
        /* change the address in the view */
166
 
        select = gtk_tree_view_get_selection (GTK_TREE_VIEW (ab->address_list));
 
256
        select = gtk_tree_view_get_selection (GTK_TREE_VIEW (address_list));
167
257
        if (gtk_tree_selection_get_selected (select, &model, &iter))
168
258
        {
169
 
                gtk_list_store_set(GTK_LIST_STORE(model), &iter,SIP_ADDRESS_COLUMN ,full_address, -1);
 
259
                LinphoneFriend *lf=NULL;
 
260
                gtk_tree_model_get(model,&iter,FRIEND_REFERENCE,&lf,-1);
 
261
                contact_edit(lf,gtk_widget_get_toplevel(GTK_WIDGET(button)));
170
262
        }
171
263
}
172
264
 
173
265
void on_add_address_clicked(GtkButton *button,gpointer user_data)
174
266
{
175
 
        gchar *address,*full_address,*displayname;
176
 
        from_t *sipaddr;
177
 
        int error;
178
 
        GtkTreeIter iter;
179
 
        AddressBook *ab=get_address_book();
180
 
        GtkTreeModel *model=gtk_tree_view_get_model(GTK_TREE_VIEW(ab->address_list));
181
 
        
182
 
        address=gtk_editable_get_chars(GTK_EDITABLE(ab->address_entry),0,-1);
183
 
        displayname=gtk_editable_get_chars(GTK_EDITABLE(ab->name_entry),0,-1);
184
 
        
185
 
        from_init(&sipaddr);
186
 
        error=from_parse(sipaddr,address);
187
 
        if (error!=0)
188
 
        {
189
 
                g_warning("Sip address is incorrect.\n");
190
 
                sfree(sipaddr);
191
 
                g_free(address);
192
 
                g_free(displayname);
193
 
                return;
194
 
        }
195
 
        sipaddr->displayname=sgetcopy(displayname);
196
 
        from_2char(sipaddr,&full_address);
197
 
        g_return_if_fail(full_address!=NULL);
198
 
        gtk_list_store_append(GTK_LIST_STORE(model),&iter);
199
 
        gtk_list_store_set(GTK_LIST_STORE(model),&iter,SIP_ADDRESS_COLUMN,full_address,-1);
200
 
 
201
 
        from_free(sipaddr);
202
 
        sfree(sipaddr);
203
 
        g_free(address);
204
 
        g_free(displayname);
 
267
        LinphoneFriend *lf=linphone_friend_new();
 
268
        contact_new(lf,gtk_widget_get_toplevel(GTK_WIDGET(button)));
205
269
}
206
270
 
207
271
void on_remove_address_clicked(GtkButton *button,gpointer user_data)
208
272
{
209
 
        AddressBook *ab=get_address_book();
210
273
        GtkTreeSelection *select;
211
274
        GtkTreeIter iter;
212
275
        GtkTreeModel *model;
213
 
        select = gtk_tree_view_get_selection (GTK_TREE_VIEW (ab->address_list));
 
276
        GtkWidget *address_list=lookup_widget(gtk_widget_get_toplevel(GTK_WIDGET(button)),"address_list");
 
277
        select = gtk_tree_view_get_selection (GTK_TREE_VIEW (address_list));
214
278
        if (gtk_tree_selection_get_selected (select, &model, &iter))
215
279
        {
 
280
                LinphoneFriend *lf=NULL;
 
281
                gtk_tree_model_get(model,&iter,FRIEND_REFERENCE,&lf,-1);
 
282
                linphone_core_remove_friend(get_core(),lf);
216
283
                gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
217
284
        }
218
285
}
219
286
 
220
 
 
221
 
 
222
287
void on_select_address_clicked(GtkButton *button,gpointer user_data)
223
288
{
224
 
        
225
 
        AddressBook *ab=get_address_book();
226
 
        choose_address_and_close(ab);
227
 
}
228
 
 
229
 
void address_book_close(GtkButton *button,gpointer user_data)
230
 
{
231
 
        
232
 
        address_book_uninit(get_address_book(),TRUE);
233
 
}
234
 
 
235
 
void on_address_book_close(GtkWidget *ab){
236
 
        g_message("on_address_book_close");
237
 
        address_book_uninit(get_address_book(),FALSE);
238
 
}
239
 
 
240
 
void address_book_uninit(AddressBook *ab, gboolean destroy_widget)
241
 
{
242
 
        GtkTreeIter iter;
243
 
        GtkTreeModel *model=gtk_tree_view_get_model(GTK_TREE_VIEW(ab->address_list));
244
 
        GList *siplist=NULL;
245
 
        gchar *address;
246
 
        
247
 
        /* get the list from the view */
248
 
        if (gtk_tree_model_get_iter_first(model,&iter)){
249
 
        
250
 
                do{
251
 
                        gtk_tree_model_get (model, &iter,SIP_ADDRESS_COLUMN , &address, -1);
252
 
                        g_return_if_fail(address!=NULL);
253
 
                        siplist=g_list_append(siplist,(gpointer)address);
254
 
                } while(gtk_tree_model_iter_next(model,&iter));
 
289
        choose_address_and_close(gtk_widget_get_toplevel(GTK_WIDGET(button)));
 
290
}
 
291
 
 
292
 
 
293
void
 
294
on_contact_box_response                (GtkDialog       *dialog,
 
295
                                        gint             response_id,
 
296
                                        gpointer         user_data)
 
297
{
 
298
        switch (response_id){
 
299
                case GTK_RESPONSE_OK:
 
300
                        contact_ok(GTK_WIDGET(dialog));
 
301
                        break;
 
302
                default:
 
303
                        break;
255
304
        }
256
 
        linphone_core_set_address_list(ab->lc,siplist);
257
 
        if (destroy_widget) gtk_widget_destroy(ab->address_book);
258
 
        memset(ab,0,sizeof(AddressBook));
 
305
        gtk_widget_destroy(GTK_WIDGET(dialog));
259
306
}