summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDenis Kenzior <denkenz@gmail.com>2010-07-19 13:50:37 -0500
committerDenis Kenzior <denkenz@gmail.com>2010-07-19 13:50:37 -0500
commitd4cae8dd5614a6f5b61e48adece67654cceed6c0 (patch)
tree50372222ae7556fc93b1de2a7d6299bfabfae5d2
parentb3237600c4ada2b822bf48d820d52b4f3907175a (diff)
downloadofono-d4cae8dd5614a6f5b61e48adece67654cceed6c0.tar.bz2
gprs: Add Protocol property with IPv6/IPv4
-rw-r--r--src/gprs.c82
1 files changed, 81 insertions, 1 deletions
diff --git a/src/gprs.c b/src/gprs.c
index cf4f6267..0d5e9235 100644
--- a/src/gprs.c
+++ b/src/gprs.c
@@ -139,6 +139,32 @@ static enum gprs_context_type gprs_context_string_to_type(const char *str)
return GPRS_CONTEXT_TYPE_INVALID;
}
+static const char *gprs_proto_to_string(enum ofono_gprs_proto proto)
+{
+ switch (proto) {
+ case OFONO_GPRS_PROTO_IP:
+ return "ip";
+ case OFONO_GPRS_PROTO_IPV6:
+ return "ipv6";
+ };
+
+ return NULL;
+}
+
+static gboolean gprs_proto_from_string(const char *str,
+ enum ofono_gprs_proto *proto)
+{
+ if (g_str_equal(str, "ip")) {
+ *proto = OFONO_GPRS_PROTO_IP;
+ return TRUE;
+ } else if (g_str_equal(str, "ipv6")) {
+ *proto = OFONO_GPRS_PROTO_IPV6;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
static unsigned int gprs_cid_alloc(struct ofono_gprs *gprs)
{
return idmap_alloc(gprs->cid_map);
@@ -358,6 +384,7 @@ static DBusMessage *pri_get_properties(DBusConnection *conn,
DBusMessageIter dict;
dbus_bool_t value;
const char *type = gprs_context_type_to_string(ctx->type);
+ const char *proto = gprs_proto_to_string(ctx->context.proto);
const char *name = ctx->name;
const char *strvalue;
@@ -378,6 +405,8 @@ static DBusMessage *pri_get_properties(DBusConnection *conn,
ofono_dbus_dict_append(&dict, "Type", DBUS_TYPE_STRING, &type);
+ ofono_dbus_dict_append(&dict, "Protocol", DBUS_TYPE_STRING, &proto);
+
strvalue = ctx->context.apn;
ofono_dbus_dict_append(&dict, "AccessPointName", DBUS_TYPE_STRING,
&strvalue);
@@ -588,7 +617,38 @@ static DBusMessage *pri_set_type(struct pri_context *ctx, DBusConnection *conn,
ofono_dbus_signal_property_changed(conn, ctx->path,
OFONO_DATA_CONTEXT_INTERFACE,
- "Type", DBUS_TYPE_STRING, &type);
+ "Type", DBUS_TYPE_STRING,
+ &type);
+
+ return NULL;
+}
+
+static DBusMessage *pri_set_proto(struct pri_context *ctx,
+ DBusConnection *conn,
+ DBusMessage *msg, const char *str)
+{
+ GKeyFile *settings = ctx->gprs->settings;
+ enum ofono_gprs_proto proto;
+
+ if (gprs_proto_from_string(str, &proto) == FALSE)
+ return __ofono_error_invalid_format(msg);
+
+ if (ctx->context.proto == proto)
+ return dbus_message_new_method_return(msg);
+
+ ctx->context.proto = proto;
+
+ if (settings) {
+ g_key_file_set_string(settings, ctx->key, "Protocol", str);
+ storage_sync(ctx->gprs->imsi, SETTINGS_STORE, settings);
+ }
+
+ g_dbus_send_reply(conn, msg, DBUS_TYPE_INVALID);
+
+ ofono_dbus_signal_property_changed(conn, ctx->path,
+ OFONO_DATA_CONTEXT_INTERFACE,
+ "Protocol", DBUS_TYPE_STRING,
+ &str);
return NULL;
}
@@ -717,6 +777,13 @@ static DBusMessage *pri_set_property(DBusConnection *conn,
dbus_message_iter_get_basic(&var, &str);
return pri_set_type(ctx, conn, msg, str);
+ } else if (!strcmp(property, "Protocol")) {
+ if (dbus_message_iter_get_arg_type(&var) != DBUS_TYPE_STRING)
+ return __ofono_error_invalid_args(msg);
+
+ dbus_message_iter_get_basic(&var, &str);
+
+ return pri_set_proto(ctx, conn, msg, str);
} else if (!strcmp(property, "Username")) {
if (dbus_message_iter_get_arg_type(&var) != DBUS_TYPE_STRING)
return __ofono_error_invalid_args(msg);
@@ -1153,6 +1220,8 @@ static DBusMessage *gprs_create_context(DBusConnection *conn,
"Password", context->context.password);
g_key_file_set_string(gprs->settings, context->key, "Type",
gprs_context_type_to_string(context->type));
+ g_key_file_set_string(gprs->settings, context->key, "Protocol",
+ gprs_proto_to_string(context->context.proto));
storage_sync(gprs->imsi, SETTINGS_STORE, gprs->settings);
}
@@ -1628,12 +1697,14 @@ static gboolean load_context(struct ofono_gprs *gprs, const char *group)
{
char *name = NULL;
char *typestr = NULL;
+ char *protostr = NULL;
char *username = NULL;
char *password = NULL;
char *apn = NULL;
gboolean ret = FALSE;
struct pri_context *context;
enum gprs_context_type type;
+ enum ofono_gprs_proto proto;
unsigned int id;
if (sscanf(group, "primarycontext%d", &id) != 1)
@@ -1654,6 +1725,13 @@ static gboolean load_context(struct ofono_gprs *gprs, const char *group)
if (type == GPRS_CONTEXT_TYPE_INVALID)
goto error;
+ if ((protostr = g_key_file_get_string(gprs->settings, group,
+ "Protocol", NULL)) == NULL)
+ protostr = g_strdup("ip");
+
+ if (gprs_proto_from_string(protostr, &proto) == FALSE)
+ goto error;
+
username = g_key_file_get_string(gprs->settings, group,
"Username", NULL);
if (!username)
@@ -1693,6 +1771,7 @@ static gboolean load_context(struct ofono_gprs *gprs, const char *group)
strcpy(context->context.username, username);
strcpy(context->context.password, password);
strcpy(context->context.apn, apn);
+ context->context.proto = proto;
if (context_dbus_register(context) == FALSE)
goto error;
@@ -1705,6 +1784,7 @@ static gboolean load_context(struct ofono_gprs *gprs, const char *group)
error:
g_free(name);
g_free(typestr);
+ g_free(protostr);
g_free(username);
g_free(password);
g_free(apn);