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)
26
void fill_address_book(GtkWidget *address_list);
32
void show_address_book(){
33
if (get_uiobj()->ab!=NULL){
34
gtk_widget_show(get_uiobj()->ab);
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);
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)
46
void contact_draw(GtkWidget *w, LinphoneProxyConfig *cfg){
47
GtkWidget *table=lookup_widget(w,"table10");
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");
64
GtkWidget * contact_new(LinphoneFriend *lf, GtkWidget *ab){
65
GtkWidget *w=create_contact_box();
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);
76
GtkWidget * contact_edit(LinphoneFriend *lf, GtkWidget *ab){
77
GtkWidget *w=create_contact_box();
79
contact_draw(w,lf->proxy);
81
g_object_set_data(G_OBJECT(w),"friend_ref",(gpointer)lf);
82
linphone_friend_edit(lf);
83
tmpstr=linphone_friend_get_name(lf);
85
gtk_entry_set_text(GTK_ENTRY(lookup_widget(w,"name")),tmpstr);
88
tmpstr=linphone_friend_get_addr(lf);
89
gtk_entry_set_text(GTK_ENTRY(lookup_widget(w,"sipaddr")),tmpstr);
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);
96
if (ab!=NULL) g_object_set_data(G_OBJECT(w),"address_book",(gpointer)ab);
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));
106
gint contact_ok(GtkWidget *dialog){
107
gchar *name,*sipaddr;
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);
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);
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"))));
138
linphone_core_add_friend(get_core(),lf);
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"));
25
148
SIP_ADDRESS_COLUMN,
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;
33
157
GtkTreeModel *model;
35
select = gtk_tree_view_get_selection (GTK_TREE_VIEW (ab->address_list));
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))
39
164
gtk_tree_model_get (model, &iter,SIP_ADDRESS_COLUMN , &address, -1);
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);
167
gtk_entry_set_text (GTK_ENTRY(addressentry),address);
170
gtk_widget_destroy(ab);
173
address_book_close (GtkWidget *object,
176
gtk_widget_destroy(gtk_widget_get_toplevel(object));
46
179
void address_selection_changed_cb(GtkTreeSelection *selection, gpointer data)
48
AddressBook *ab=get_address_book();
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);
60
error=from_parse(sipaddr,address);
62
g_warning("error parsing sip address\n");
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);
77
183
gboolean address_button_press(GtkWidget *widget,GdkEventButton *event,gpointer user_data)
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);
86
void address_book_init(AddressBook *ab,LinphoneCore *lc,GtkWidget *main_entry)
193
void fill_address_book(GtkWidget *address_list){
88
194
GtkListStore *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);
213
GtkWidget *create_and_fill_address_book(){
90
215
GtkCellRenderer *renderer;
91
216
GtkTreeViewColumn *column;
92
217
GtkTreeSelection *select;
95
if (ab->address_book!=NULL) {
96
gtk_widget_show(ab->address_book);
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;
105
/* setup the address list */
106
ab->address_list=lookup_widget(ab->address_book,"address_list");
107
list=linphone_core_get_address_list(lc);
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);
115
if (list!=NULL) g_list_free(list);
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();
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"),
122
228
"text", SIP_ADDRESS_COLUMN,
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);
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),
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);
242
fill_address_book(address_list);
139
247
on_modify_address_clicked (GtkButton *button,
140
248
gpointer user_data)
142
gchar *address,*full_address,*displayname;
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");
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);
153
error=from_parse(sipaddr,address);
156
g_warning("Sip address is incorrect.\n");
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))
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)));
173
265
void on_add_address_clicked(GtkButton *button,gpointer user_data)
175
gchar *address,*full_address,*displayname;
179
AddressBook *ab=get_address_book();
180
GtkTreeModel *model=gtk_tree_view_get_model(GTK_TREE_VIEW(ab->address_list));
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);
186
error=from_parse(sipaddr,address);
189
g_warning("Sip address is incorrect.\n");
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);
267
LinphoneFriend *lf=linphone_friend_new();
268
contact_new(lf,gtk_widget_get_toplevel(GTK_WIDGET(button)));
207
271
void on_remove_address_clicked(GtkButton *button,gpointer user_data)
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))
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);
222
287
void on_select_address_clicked(GtkButton *button,gpointer user_data)
225
AddressBook *ab=get_address_book();
226
choose_address_and_close(ab);
229
void address_book_close(GtkButton *button,gpointer user_data)
232
address_book_uninit(get_address_book(),TRUE);
235
void on_address_book_close(GtkWidget *ab){
236
g_message("on_address_book_close");
237
address_book_uninit(get_address_book(),FALSE);
240
void address_book_uninit(AddressBook *ab, gboolean destroy_widget)
243
GtkTreeModel *model=gtk_tree_view_get_model(GTK_TREE_VIEW(ab->address_list));
247
/* get the list from the view */
248
if (gtk_tree_model_get_iter_first(model,&iter)){
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)));
294
on_contact_box_response (GtkDialog *dialog,
298
switch (response_id){
299
case GTK_RESPONSE_OK:
300
contact_ok(GTK_WIDGET(dialog));
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));