Slightly improved the GPRS connection plug-in
This commit is contained in:
parent
5f30a9d775
commit
888948a1f3
|
@ -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,
|
||||
|
|
11
src/gsm.c
11
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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user