summaryrefslogtreecommitdiffstats
path: root/plugins/phonesim.c
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2010-10-25 20:12:32 +0200
committerMarcel Holtmann <marcel@holtmann.org>2010-10-25 20:12:32 +0200
commit7c2529077cb885d8fb4c50b6696c53c2b4e5d20b (patch)
treefa10d4d15232feb21aa7b6a3e8fa54c426d70fd4 /plugins/phonesim.c
parentd37285636f6e441bc1eb70fec1b7cea6941e467c (diff)
downloadofono-7c2529077cb885d8fb4c50b6696c53c2b4e5d20b.tar.bz2
phonesim: Don't use modem.conf for phonesim modems
Diffstat (limited to 'plugins/phonesim.c')
-rw-r--r--plugins/phonesim.c103
1 files changed, 102 insertions, 1 deletions
diff --git a/plugins/phonesim.c b/plugins/phonesim.c
index 2a4561b1..64516130 100644
--- a/plugins/phonesim.c
+++ b/plugins/phonesim.c
@@ -400,15 +400,116 @@ static struct ofono_modem_driver phonesim_driver = {
.post_online = phonesim_post_online,
};
+static struct ofono_modem *create_modem(GKeyFile *keyfile, const char *group)
+{
+ struct ofono_modem *modem;
+ char *value;
+
+ DBG("group %s", group);
+
+ modem = ofono_modem_create(group, "phonesim");
+ if (!modem)
+ return NULL;
+
+ value = g_key_file_get_string(keyfile, group, "Address", NULL);
+ if (!value)
+ goto error;
+
+ ofono_modem_set_string(modem, "Address", value);
+ g_free(value);
+
+ value = g_key_file_get_string(keyfile, group, "Port", NULL);
+ if (!value)
+ goto error;
+
+ ofono_modem_set_integer(modem, "Port", atoi(value));
+ g_free(value);
+
+ value = g_key_file_get_string(keyfile, group, "Modem", NULL);
+ if (value) {
+ ofono_modem_set_string(modem, "Modem", value);
+ g_free(value);
+ }
+
+ value = g_key_file_get_string(keyfile, group, "Multiplexer", NULL);
+ if (value) {
+ ofono_modem_set_string(modem, "Multiplexer", value);
+ g_free(value);
+ }
+
+ return modem;
+
+error:
+ ofono_error("Missing address or port setting for %s", group);
+
+ ofono_modem_remove(modem);
+
+ return NULL;
+}
+
+static GSList *modem_list = NULL;
+
+static void parse_config(const char *filename)
+{
+ GKeyFile *keyfile;
+ GError *err = NULL;
+ char **modems;
+ int i;
+
+ DBG("filename %s", filename);
+
+ keyfile = g_key_file_new();
+
+ g_key_file_set_list_separator(keyfile, ',');
+
+ if (!g_key_file_load_from_file(keyfile, filename, 0, &err)) {
+ ofono_warn("Reading of %s failed: %s", filename, err->message);
+ g_error_free(err);
+ goto done;
+ }
+
+ modems = g_key_file_get_groups(keyfile, NULL);
+
+ for (i = 0; modems[i]; i++) {
+ struct ofono_modem *modem;
+
+ modem = create_modem(keyfile, modems[i]);
+ if (!modem)
+ continue;
+
+ modem_list = g_slist_prepend(modem_list, modem);
+
+ ofono_modem_register(modem);
+ }
+
+ g_strfreev(modems);
+
+done:
+ g_key_file_free(keyfile);
+}
+
static int phonesim_init(void)
{
+ parse_config(CONFIGDIR "/phonesim.conf");
+
return ofono_modem_driver_register(&phonesim_driver);
}
static void phonesim_exit(void)
{
+ GSList *list;
+
ofono_modem_driver_unregister(&phonesim_driver);
+
+ for (list = modem_list; list; list = list->next) {
+ struct ofono_modem *modem = list->data;
+
+ ofono_modem_remove(modem);
+ }
+
+ g_slist_free(modem_list);
+ modem_list = NULL;
}
-OFONO_PLUGIN_DEFINE(phonesim, "PhoneSIM driver", VERSION,
+OFONO_PLUGIN_DEFINE(phonesim, "Phone Simulator driver", VERSION,
OFONO_PLUGIN_PRIORITY_DEFAULT, phonesim_init, phonesim_exit)