summaryrefslogtreecommitdiffstats
path: root/src/gprs.c
diff options
context:
space:
mode:
authorAndrzej Zaborowski <andrew.zaborowski@intel.com>2009-10-25 09:35:26 +0100
committerDenis Kenzior <denkenz@gmail.com>2009-10-26 13:34:41 -0500
commit939be2adc2f87df82c202ba7eae48b5a1fccc2d6 (patch)
tree818619a63494904edecf586dcf2ce9078f712eab /src/gprs.c
parent53414483d391184667738953000a16de2e18aa40 (diff)
downloadofono-939be2adc2f87df82c202ba7eae48b5a1fccc2d6.tar.bz2
Refactor: Make GPRS use information from netreg
Diffstat (limited to 'src/gprs.c')
-rw-r--r--src/gprs.c147
1 files changed, 106 insertions, 41 deletions
diff --git a/src/gprs.c b/src/gprs.c
index a3c64a70..487297ed 100644
--- a/src/gprs.c
+++ b/src/gprs.c
@@ -38,6 +38,7 @@
#define DATA_CONTEXT_INTERFACE "org.ofono.PrimaryDataContext"
#define GPRS_FLAG_ATTACHING 0x1
+#define GPRS_FLAG_DETACHED_AFTER_ROAMING 0x2
static GSList *g_drivers = NULL;
static GSList *g_context_drivers = NULL;
@@ -51,6 +52,7 @@ enum gprs_context_type {
struct ofono_gprs {
GSList *contexts;
ofono_bool_t attached;
+ ofono_bool_t driver_attached;
ofono_bool_t roaming_allowed;
ofono_bool_t powered;
int status;
@@ -61,6 +63,10 @@ struct ofono_gprs {
int next_context_id;
int cid_min;
int cid_max;
+ int netreg_status;
+ struct ofono_netreg *netreg;
+ unsigned int netreg_watch;
+ unsigned int status_watch;
DBusMessage *pending;
struct ofono_gprs_context *context_driver;
const struct ofono_gprs_driver *driver;
@@ -506,23 +512,32 @@ static char **gprs_contexts_path_list(GSList *context_list)
return objlist;
}
-static void gprs_attach_callback(const struct ofono_error *error, void *data)
+static void gprs_set_attached(struct ofono_gprs *gprs)
{
- struct ofono_gprs *gprs = data;
DBusConnection *conn = ofono_dbus_get_connection();
const char *path;
dbus_bool_t value;
+ ofono_bool_t attached = gprs->driver_attached &&
+ !(gprs->flags & GPRS_FLAG_DETACHED_AFTER_ROAMING);
- if (error->type == OFONO_ERROR_TYPE_NO_ERROR &&
- (gprs->flags & GPRS_FLAG_ATTACHING)) {
- gprs->attached = !gprs->attached;
+ if (attached != gprs->attached) {
+ gprs->attached = attached;
path = __ofono_atom_get_path(gprs->atom);
- value = gprs->attached;
+ value = attached;
ofono_dbus_signal_property_changed(conn, path,
DATA_CONNECTION_MANAGER_INTERFACE,
"Attached", DBUS_TYPE_BOOLEAN, &value);
}
+}
+
+static void gprs_attach_callback(const struct ofono_error *error, void *data)
+{
+ struct ofono_gprs *gprs = data;
+
+ if (error->type == OFONO_ERROR_TYPE_NO_ERROR &&
+ (gprs->flags & GPRS_FLAG_ATTACHING))
+ gprs->driver_attached = !gprs->driver_attached;
gprs->flags &= ~GPRS_FLAG_ATTACHING;
@@ -531,18 +546,21 @@ static void gprs_attach_callback(const struct ofono_error *error, void *data)
static void gprs_netreg_update(struct ofono_gprs *gprs)
{
- DBusConnection *conn = ofono_dbus_get_connection();
int attach;
int operator_ok;
- const char *path;
- dbus_bool_t value = 0;
operator_ok = gprs->roaming_allowed ||
- (gprs->status != NETWORK_REGISTRATION_STATUS_ROAMING);
+ (gprs->status != NETWORK_REGISTRATION_STATUS_ROAMING &&
+ !(gprs->flags & GPRS_FLAG_DETACHED_AFTER_ROAMING));
+
+ if (gprs->powered && !operator_ok)
+ gprs->flags |= GPRS_FLAG_DETACHED_AFTER_ROAMING;
+
+ gprs_set_attached(gprs);
attach = gprs->powered && operator_ok;
- if (gprs->attached != attach &&
+ if (gprs->driver_attached != attach &&
!(gprs->flags & GPRS_FLAG_ATTACHING) &&
!(attach && gprs->status ==
NETWORK_REGISTRATION_STATUS_SEARCHING)) {
@@ -550,17 +568,33 @@ static void gprs_netreg_update(struct ofono_gprs *gprs)
gprs->driver->set_attached(gprs, attach, gprs_attach_callback,
gprs);
+ }
+}
- /* Prevent further attempts to attach */
- if (!attach && gprs->powered) {
- gprs->powered = 0;
+static void netreg_status_changed(int status, int lac, int ci, int tech,
+ const struct ofono_network_operator *op,
+ void *data)
+{
+ struct ofono_gprs *gprs = data;
- path = __ofono_atom_get_path(gprs->atom);
- ofono_dbus_signal_property_changed(conn, path,
- DATA_CONNECTION_MANAGER_INTERFACE,
- "Powered", DBUS_TYPE_BOOLEAN, &value);
- }
- }
+ DBG("%d, %d, %d, %d, %p", status, lac, ci, tech, op);
+
+ if (gprs->netreg_status == status)
+ return;
+ gprs->netreg_status = status;
+
+ if (!(gprs->flags & GPRS_FLAG_DETACHED_AFTER_ROAMING))
+ return;
+
+ if (status != NETWORK_REGISTRATION_STATUS_REGISTERED)
+ return;
+
+ /* If the circuit switched radio just registered to home PLMN then
+ * we also make an attempt to attach.
+ */
+ gprs->flags &= ~GPRS_FLAG_DETACHED_AFTER_ROAMING;
+
+ gprs_netreg_update(gprs);
}
static DBusMessage *gprs_get_properties(DBusConnection *conn,
@@ -667,6 +701,8 @@ static DBusMessage *gprs_set_property(DBusConnection *conn,
return dbus_message_new_method_return(msg);
gprs->roaming_allowed = value;
+ gprs->flags &= ~GPRS_FLAG_DETACHED_AFTER_ROAMING;
+
gprs_netreg_update(gprs);
} else if (!strcmp(property, "Powered")) {
if (!gprs->driver->set_attached)
@@ -681,6 +717,8 @@ static DBusMessage *gprs_set_property(DBusConnection *conn,
return dbus_message_new_method_return(msg);
gprs->powered = value;
+ gprs->flags &= ~GPRS_FLAG_DETACHED_AFTER_ROAMING;
+
gprs_netreg_update(gprs);
} else
return __ofono_error_invalid_args(msg);
@@ -854,17 +892,9 @@ static GDBusSignalTable manager_signals[] = {
void ofono_gprs_attach_notify(struct ofono_gprs *gprs, int attached)
{
- DBusConnection *conn = ofono_dbus_get_connection();
- const char *path;
- dbus_bool_t value = 0;
-
- if (gprs->attached && !(gprs->flags & GPRS_FLAG_ATTACHING)) {
- gprs->attached = 0;
-
- path = __ofono_atom_get_path(gprs->atom);
- ofono_dbus_signal_property_changed(conn, path,
- DATA_CONNECTION_MANAGER_INTERFACE,
- "Attached", DBUS_TYPE_BOOLEAN, &value);
+ if (gprs->driver_attached != attached &&
+ !(gprs->flags & GPRS_FLAG_ATTACHING)) {
+ gprs->driver_attached = attached;
gprs_netreg_update(gprs);
}
@@ -875,7 +905,7 @@ static void set_registration_status(struct ofono_gprs *gprs, int status)
const char *str_status = registration_status_to_string(status);
const char *path = __ofono_atom_get_path(gprs->atom);
DBusConnection *conn = ofono_dbus_get_connection();
- dbus_bool_t attached;
+ ofono_bool_t attached;
gprs->status = status;
@@ -886,15 +916,8 @@ static void set_registration_status(struct ofono_gprs *gprs, int status)
attached = (status == NETWORK_REGISTRATION_STATUS_REGISTERED ||
status == NETWORK_REGISTRATION_STATUS_ROAMING);
- if (gprs->attached != (int) attached &&
- !(gprs->flags & GPRS_FLAG_ATTACHING)) {
- gprs->attached = (int) attached;
-
- ofono_dbus_signal_property_changed(conn, path,
- DATA_CONNECTION_MANAGER_INTERFACE,
- "Attached", DBUS_TYPE_BOOLEAN,
- &attached);
- }
+ if (!(gprs->flags & GPRS_FLAG_ATTACHING))
+ gprs->driver_attached = attached;
gprs_netreg_update(gprs);
}
@@ -1136,6 +1159,18 @@ static void gprs_unregister(struct ofono_atom *atom)
g_slist_free(gprs->contexts);
+ if (gprs->netreg_watch) {
+ if (gprs->status_watch) {
+ __ofono_netreg_remove_status_watch(gprs->netreg,
+ gprs->status_watch);
+ gprs->status_watch = 0;
+ }
+
+ __ofono_modem_remove_atom_watch(modem, gprs->netreg_watch);
+ gprs->netreg_watch = 0;
+ gprs->netreg = NULL;
+ }
+
ofono_modem_remove_interface(modem, DATA_CONNECTION_MANAGER_INTERFACE);
g_dbus_unregister_interface(conn, path,
DATA_CONNECTION_MANAGER_INTERFACE);
@@ -1195,11 +1230,30 @@ struct ofono_gprs *ofono_gprs_create(struct ofono_modem *modem,
return gprs;
}
+static void netreg_watch(struct ofono_atom *atom,
+ enum ofono_atom_watch_condition cond,
+ void *data)
+{
+ struct ofono_gprs *gprs = data;
+
+ if (cond != OFONO_ATOM_WATCH_CONDITION_REGISTERED) {
+ gprs->status_watch = 0;
+ gprs->netreg = NULL;
+ return;
+ }
+
+ gprs->netreg = __ofono_atom_get_data(atom);
+ gprs->netreg_status = ofono_netreg_get_status(gprs->netreg);
+ gprs->status_watch = __ofono_netreg_add_status_watch(gprs->netreg,
+ netreg_status_changed, gprs, NULL);
+}
+
void ofono_gprs_register(struct ofono_gprs *gprs)
{
DBusConnection *conn = ofono_dbus_get_connection();
struct ofono_modem *modem = __ofono_atom_get_modem(gprs->atom);
const char *path = __ofono_atom_get_path(gprs->atom);
+ struct ofono_atom *netreg_atom;
if (!g_dbus_register_interface(conn, path,
DATA_CONNECTION_MANAGER_INTERFACE,
@@ -1213,6 +1267,17 @@ void ofono_gprs_register(struct ofono_gprs *gprs)
ofono_modem_add_interface(modem, DATA_CONNECTION_MANAGER_INTERFACE);
+ gprs->netreg_watch = __ofono_modem_add_atom_watch(modem,
+ OFONO_ATOM_TYPE_NETREG,
+ netreg_watch, gprs, NULL);
+
+ netreg_atom = __ofono_modem_find_atom(modem, OFONO_ATOM_TYPE_NETREG);
+
+ if (netreg_atom && __ofono_atom_get_registered(netreg_atom))
+ netreg_watch(netreg_atom,
+ OFONO_ATOM_WATCH_CONDITION_REGISTERED, gprs);
+
+
__ofono_atom_register(gprs->atom, gprs_unregister);
}