Slightly improved the GPRS connection plug-in

This commit is contained in:
Pierre Pronchery 2011-04-05 12:54:19 +00:00
parent 5f30a9d775
commit 888948a1f3
5 changed files with 100 additions and 24 deletions

View File

@ -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,

View File

@ -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;
}

View File

@ -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
{

View File

@ -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:

View File

@ -15,6 +15,7 @@
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>
#include <gtk/gtk.h>
@ -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);
}