From 888948a1f37fa64ffc3db0c8d1fd14e82875704c Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Tue, 5 Apr 2011 12:54:19 +0000 Subject: [PATCH] Slightly improved the GPRS connection plug-in --- include/Phone.h | 1 + src/gsm.c | 11 +++++- src/gsm.h | 8 ++++ src/phone.c | 9 +++++ src/plugins/gprs.c | 95 +++++++++++++++++++++++++++++++++++----------- 5 files changed, 100 insertions(+), 24 deletions(-) diff --git a/include/Phone.h b/include/Phone.h index 164a9ab..9ae6832 100644 --- a/include/Phone.h +++ b/include/Phone.h @@ -55,6 +55,7 @@ typedef enum _PhoneEvent PHONE_EVENT_CALLING, /* char const * number */ PHONE_EVENT_FUNCTIONAL, PHONE_EVENT_GPRS_ATTACHMENT, /* gboolean attached */ + PHONE_EVENT_GPRS_CONNECTION, /* gboolean connected */ PHONE_EVENT_KEY_TONE, PHONE_EVENT_NOTIFICATION_OFF, PHONE_EVENT_NOTIFICATION_ON, diff --git a/src/gsm.c b/src/gsm.c index 431cba7..6583906 100644 --- a/src/gsm.c +++ b/src/gsm.c @@ -753,6 +753,10 @@ int gsm_event(GSM * gsm, GSMEventType type, ...) event->gprs_attachment.attached = va_arg(ap, unsigned int); break; + case GSM_EVENT_TYPE_GPRS_CONNECTION: + event->gprs_connection.connected = va_arg(ap, + unsigned int); + break; case GSM_EVENT_TYPE_INCOMING_CALL: event->incoming_call.calltype = va_arg(ap, unsigned int); @@ -1018,6 +1022,7 @@ int gsm_queue_command(GSM * gsm, GSMCommand * gsmc) if(gsm->mode == GSM_MODE_DATA && (q = gsm_command_get_command(gsmc)) && strcmp(q, "ATH") == 0) /* XXX */ { + gsm_event(gsm, GSM_EVENT_TYPE_GPRS_CONNECTION, 0); gsm_event(gsm, GSM_EVENT_TYPE_GPRS_ATTACHMENT, 0); gsm_reset(gsm, 0, NULL); return 0; @@ -2052,7 +2057,9 @@ static int _gsm_trigger_connect(GSM * gsm, char const * result, g_io_channel_set_encoding(gsm->wr_ppp_channel, NULL, &error); g_io_channel_set_buffered(gsm->wr_ppp_channel, FALSE); gsm->wr_ppp_source = 0; - return gsm_event(gsm, GSM_EVENT_TYPE_GPRS_ATTACHMENT, 1); + gsm_event(gsm, GSM_EVENT_TYPE_GPRS_ATTACHMENT, 1); + gsm_event(gsm, GSM_EVENT_TYPE_GPRS_CONNECTION, 1); + return 0; } @@ -2577,6 +2584,7 @@ static gboolean _on_watch_can_read_ppp(GIOChannel * source, case G_IO_STATUS_EOF: default: gsm->rd_ppp_source = 0; + gsm_event(gsm, GSM_EVENT_TYPE_GPRS_CONNECTION, 0); gsm_reset(gsm, 0, NULL); return FALSE; } @@ -2686,6 +2694,7 @@ static gboolean _on_watch_can_write_ppp(GIOChannel * source, case G_IO_STATUS_EOF: default: gsm->wr_ppp_source = 0; + gsm_event(gsm, GSM_EVENT_TYPE_GPRS_CONNECTION, 0); gsm_reset(gsm, 0, NULL); return FALSE; } diff --git a/src/gsm.h b/src/gsm.h index c191254..ccec0a7 100644 --- a/src/gsm.h +++ b/src/gsm.h @@ -55,6 +55,7 @@ typedef enum _GSMEventType GSM_EVENT_TYPE_CONTACT_LIST, GSM_EVENT_TYPE_FUNCTIONAL, GSM_EVENT_TYPE_GPRS_ATTACHMENT, + GSM_EVENT_TYPE_GPRS_CONNECTION, GSM_EVENT_TYPE_GPRS_REGISTRATION, GSM_EVENT_TYPE_INCOMING_CALL, GSM_EVENT_TYPE_INCOMING_MESSAGE, @@ -218,6 +219,13 @@ typedef union _GSMEvent unsigned int attached; } gprs_attachment; + /* GSM_EVENT_TYPE_GPRS_CONNECTION */ + struct + { + GSMEventType type; + unsigned int connected; + } gprs_connection; + /* GSM_EVENT_TYPE_INCOMING_CALL */ struct { diff --git a/src/phone.c b/src/phone.c index ca111ae..b990c4a 100644 --- a/src/phone.c +++ b/src/phone.c @@ -825,6 +825,10 @@ int phone_event(Phone * phone, PhoneEvent event, ...) active = va_arg(ap, gboolean); ret |= plugin->event(plugin, event, active); break; + case PHONE_EVENT_GPRS_CONNECTION: + active = va_arg(ap, gboolean); + ret |= plugin->event(plugin, event, active); + break; case PHONE_EVENT_SET_OPERATOR: operator = va_arg(ap, char const *); ret |= plugin->event(plugin, event, operator); @@ -3237,6 +3241,11 @@ static int _phone_gsm_event(GSMEvent * event, gpointer data) event->gprs_attachment.attached ? TRUE : FALSE); return 0; + case GSM_EVENT_TYPE_GPRS_CONNECTION: + phone_event(phone, PHONE_EVENT_GPRS_CONNECTION, + event->gprs_connection.connected ? TRUE + : FALSE); + return 0; case GSM_EVENT_TYPE_GPRS_REGISTRATION: return 0; /* XXX not used at the moment */ case GSM_EVENT_TYPE_INCOMING_CALL: diff --git a/src/plugins/gprs.c b/src/plugins/gprs.c index 6dacd8b..3c21f80 100644 --- a/src/plugins/gprs.c +++ b/src/plugins/gprs.c @@ -15,6 +15,7 @@ +#include #include #include #include @@ -27,11 +28,16 @@ /* types */ typedef struct _GPRS { + gboolean connected; + GtkWidget * window; GtkWidget * attach; GtkWidget * apn; GtkWidget * username; GtkWidget * password; + GtkWidget * connect; + GtkWidget * st_image; + GtkWidget * st_label; } GPRS; @@ -42,6 +48,9 @@ static int _gprs_destroy(PhonePlugin * plugin); static int _gprs_event(PhonePlugin * plugin, PhoneEvent event, ...); static void _gprs_settings(PhonePlugin * plugin); +static void _gprs_set_connected(PhonePlugin * plugin, gboolean connected, + char const * message); + static int _gprs_access_point(PhonePlugin * plugin); static int _gprs_attach(PhonePlugin * plugin); static int _gprs_connect(PhonePlugin * plugin); @@ -73,7 +82,10 @@ static int _gprs_init(PhonePlugin * plugin) if((gprs = object_new(sizeof(*gprs))) == NULL) return 1; plugin->priv = gprs; + gprs->connected = FALSE; gprs->window = NULL; + gprs->st_image = NULL; + gprs->st_label = NULL; return 0; } @@ -92,13 +104,23 @@ static int _gprs_destroy(PhonePlugin * plugin) /* gprs_event */ static int _gprs_event_functional(PhonePlugin * plugin); +static int _gprs_event_gprs_connection(PhonePlugin * plugin, + gboolean connected); static int _gprs_event(PhonePlugin * plugin, PhoneEvent event, ...) { + va_list ap; + gboolean connected; + switch(event) { case PHONE_EVENT_FUNCTIONAL: return _gprs_event_functional(plugin); + case PHONE_EVENT_GPRS_CONNECTION: + va_start(ap, event); + connected = va_arg(ap, gboolean); + va_end(ap); + return _gprs_event_gprs_connection(plugin, connected); default: /* not relevant */ return 0; } @@ -109,12 +131,18 @@ static int _gprs_event_functional(PhonePlugin * plugin) return _gprs_attach(plugin) | _gprs_access_point(plugin); } +static int _gprs_event_gprs_connection(PhonePlugin * plugin, gboolean connected) +{ + _gprs_set_connected(plugin, connected, connected ? "Connected" + : "Not connected"); + return 0; +} + /* gprs_settings */ static void _on_settings_apply(gpointer data); static void _on_settings_cancel(gpointer data); static gboolean _on_settings_closex(gpointer data); -static void _on_settings_disconnect(gpointer data); static void _on_settings_connect(gpointer data); static void _on_settings_ok(gpointer data); @@ -144,7 +172,8 @@ static void _gprs_settings(PhonePlugin * plugin) vbox = gtk_vbox_new(FALSE, 4); group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); /* attachment */ - gprs->attach = gtk_check_button_new_with_label("Always on"); + gprs->attach = gtk_check_button_new_with_label( + "Force GPRS registration"); gtk_box_pack_start(GTK_BOX(vbox), gprs->attach, FALSE, TRUE, 0); /* access point */ hbox = gtk_hbox_new(FALSE, 4); @@ -180,22 +209,23 @@ static void _gprs_settings(PhonePlugin * plugin) gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); gtk_size_group_add_widget(group, widget); gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, TRUE, 0); - widget = gtk_button_new_from_stock(GTK_STOCK_CONNECT); - g_signal_connect_swapped(G_OBJECT(widget), "clicked", G_CALLBACK( + gprs->connect = gtk_button_new_from_stock(GTK_STOCK_CONNECT); + g_signal_connect_swapped(G_OBJECT(gprs->connect), "clicked", G_CALLBACK( _on_settings_connect), plugin); - gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, 0); + gtk_box_pack_start(GTK_BOX(hbox), gprs->connect, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0); - /* disconnect */ + /* status */ + widget = gtk_frame_new("Status"); hbox = gtk_hbox_new(FALSE, 4); - widget = gtk_label_new(""); - gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); - gtk_size_group_add_widget(group, widget); - gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, TRUE, 0); - widget = gtk_button_new_from_stock(GTK_STOCK_DISCONNECT); - g_signal_connect_swapped(G_OBJECT(widget), "clicked", G_CALLBACK( - _on_settings_disconnect), plugin); - gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, 0); - gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0); + gtk_container_set_border_width(GTK_CONTAINER(hbox), 4); + gprs->st_image = gtk_image_new_from_icon_name(GTK_STOCK_DISCONNECT, + GTK_ICON_SIZE_BUTTON); + gtk_box_pack_start(GTK_BOX(hbox), gprs->st_image, FALSE, TRUE, 0); + gprs->st_label = gtk_label_new("Not connected"); + gtk_misc_set_alignment(GTK_MISC(gprs->st_label), 0.0, 0.5); + gtk_box_pack_start(GTK_BOX(hbox), gprs->st_label, TRUE, TRUE, 0); + gtk_container_add(GTK_CONTAINER(widget), hbox); + gtk_box_pack_start(GTK_BOX(vbox), widget, FALSE, TRUE, 0); /* button box */ bbox = gtk_hbutton_box_new(); gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END); @@ -276,16 +306,13 @@ static gboolean _on_settings_closex(gpointer data) static void _on_settings_connect(gpointer data) { PhonePlugin * plugin = data; + GPRS * gprs = plugin->priv; _on_settings_apply(plugin); - _gprs_connect(plugin); -} - -static void _on_settings_disconnect(gpointer data) -{ - PhonePlugin * plugin = data; - - _gprs_disconnect(plugin); + if(gprs->connected) + _gprs_disconnect(plugin); + else + _gprs_connect(plugin); } static void _on_settings_ok(gpointer data) @@ -298,6 +325,24 @@ static void _on_settings_ok(gpointer data) } +/* gprs_set_connected */ +static void _gprs_set_connected(PhonePlugin * plugin, gboolean connected, + char const * message) +{ + GPRS * gprs = plugin->priv; + + gprs->connected = connected; + if(gprs->window == NULL) + return; + gtk_image_set_from_icon_name(GTK_IMAGE(gprs->st_image), connected + ? GTK_STOCK_CONNECT : GTK_STOCK_DISCONNECT, + GTK_ICON_SIZE_BUTTON); + gtk_label_set_text(GTK_LABEL(gprs->st_label), message); + gtk_button_set_label(GTK_BUTTON(gprs->connect), connected + ? GTK_STOCK_DISCONNECT : GTK_STOCK_CONNECT); +} + + /* gprs_access_point */ static int _gprs_access_point(PhonePlugin * plugin) { @@ -336,8 +381,10 @@ static int _gprs_attach(PhonePlugin * plugin) /* gprs_connect */ static int _gprs_connect(PhonePlugin * plugin) { + GPRS * gprs = plugin->priv; char const * cmd = "ATD*99***1#"; + _gprs_set_connected(plugin, gprs->connected, "Connecting..."); return plugin->helper->queue(plugin->helper->phone, cmd); } @@ -345,7 +392,9 @@ static int _gprs_connect(PhonePlugin * plugin) /* gprs_disconnect */ static int _gprs_disconnect(PhonePlugin * plugin) { + GPRS * gprs = plugin->priv; char const * cmd = "ATH"; /* XXX requires interpretation from Phone */ + _gprs_set_connected(plugin, gprs->connected, "Disconnecting..."); return plugin->helper->queue(plugin->helper->phone, cmd); }