summaryrefslogtreecommitdiffstats
path: root/src/emulator.c
diff options
context:
space:
mode:
authorDenis Kenzior <denkenz@gmail.com>2011-05-22 08:10:09 -0500
committerDenis Kenzior <denkenz@gmail.com>2011-05-24 12:34:32 -0500
commit42bed7b16a63e8601385388a552fcf317daa8c72 (patch)
tree1ce516ef14ea0288b8c66a0337a5fd3995e309fd /src/emulator.c
parent1bd4f75ac0bc8368bb4118adb408cc6b95ed5568 (diff)
downloadofono-42bed7b16a63e8601385388a552fcf317daa8c72.tar.bz2
emulator: Update to the new GAtPPP API
Diffstat (limited to 'src/emulator.c')
-rw-r--r--src/emulator.c93
1 files changed, 27 insertions, 66 deletions
diff --git a/src/emulator.c b/src/emulator.c
index 70d6037f..de9921ac 100644
--- a/src/emulator.c
+++ b/src/emulator.c
@@ -42,7 +42,6 @@ struct ofono_emulator {
enum ofono_emulator_type type;
GAtServer *server;
GAtPPP *ppp;
- guint source;
gboolean slc;
int l_features;
int r_features;
@@ -54,7 +53,6 @@ struct ofono_emulator {
gboolean clip;
gboolean ccwa;
int pns_id;
- struct ofono_private_network_settings *local_pns;
};
struct indicator {
@@ -90,29 +88,15 @@ static void ppp_connect(const char *iface, const char *local,
DBG("Secondary DNS Server: %s\n", dns2);
}
-static void release_pns(struct ofono_emulator *em)
+static void cleanup_ppp(struct ofono_emulator *em)
{
- g_free(em->local_pns->server_ip);
- g_free(em->local_pns->peer_ip);
- g_free(em->local_pns->primary_dns);
- g_free(em->local_pns->secondary_dns);
- g_free(em->local_pns);
-
- __ofono_private_network_release(em->pns_id);
- em->pns_id = 0;
-}
-
-static void ppp_disconnect(GAtPPPDisconnectReason reason, gpointer user_data)
-{
- struct ofono_emulator *em = user_data;
-
DBG("");
g_at_ppp_unref(em->ppp);
em->ppp = NULL;
- if (em->pns_id > 0)
- release_pns(em);
+ __ofono_private_network_release(em->pns_id);
+ em->pns_id = 0;
if (em->server == NULL)
return;
@@ -121,54 +105,31 @@ static void ppp_disconnect(GAtPPPDisconnectReason reason, gpointer user_data)
g_at_server_send_final(em->server, G_AT_SERVER_RESULT_NO_CARRIER);
}
-static void ppp_suspend(gpointer user_data)
+static void ppp_disconnect(GAtPPPDisconnectReason reason, gpointer user_data)
{
struct ofono_emulator *em = user_data;
- DBG("");
-
- g_at_server_resume(em->server);
+ cleanup_ppp(em);
}
-static gboolean setup_ppp(gpointer user_data)
+static void ppp_suspend(gpointer user_data)
{
struct ofono_emulator *em = user_data;
- GAtIO *io;
DBG("");
- em->source = 0;
+ g_at_server_resume(em->server);
+}
- io = g_at_server_get_io(em->server);
+static void suspend_server(gpointer user_data)
+{
+ struct ofono_emulator *em = user_data;
+ GAtIO *io = g_at_server_get_io(em->server);
g_at_server_suspend(em->server);
- em->ppp = g_at_ppp_server_new_full(io, em->local_pns->server_ip,
- em->local_pns->fd);
- if (em->ppp == NULL) {
- /* PPP stack hasn't closed fd */
- close(em->local_pns->fd);
- if (em->pns_id > 0)
- release_pns(em);
-
- g_at_server_resume(em->server);
- g_at_server_send_final(em->server,
- G_AT_SERVER_RESULT_NO_CARRIER);
- return FALSE;
- }
-
- g_at_ppp_set_server_info(em->ppp, em->local_pns->peer_ip,
- em->local_pns->primary_dns,
- em->local_pns->secondary_dns);
-
- g_at_ppp_set_credentials(em->ppp, "", "");
- g_at_ppp_set_debug(em->ppp, emulator_debug, "PPP");
-
- g_at_ppp_set_connect_function(em->ppp, ppp_connect, em);
- g_at_ppp_set_disconnect_function(em->ppp, ppp_disconnect, em);
- g_at_ppp_set_suspend_function(em->ppp, ppp_suspend, em);
-
- return FALSE;
+ if (g_at_ppp_listen(em->ppp, io) == FALSE)
+ cleanup_ppp(em);
}
static void request_private_network_cb(
@@ -176,24 +137,29 @@ static void request_private_network_cb(
void *data)
{
struct ofono_emulator *em = data;
+ GAtIO *io = g_at_server_get_io(em->server);
if (pns == NULL)
goto error;
- em->local_pns = g_try_new0(struct ofono_private_network_settings, 1);
- if (em->local_pns == NULL) {
+ em->ppp = g_at_ppp_server_new_full(pns->server_ip, pns->fd);
+ if (em->ppp == NULL) {
close(pns->fd);
goto error;
}
- em->local_pns->fd = pns->fd;
- em->local_pns->server_ip = g_strdup(pns->server_ip);
- em->local_pns->peer_ip = g_strdup(pns->peer_ip);
- em->local_pns->primary_dns = g_strdup(pns->primary_dns);
- em->local_pns->secondary_dns = g_strdup(pns->secondary_dns);
+ g_at_ppp_set_server_info(em->ppp, pns->peer_ip,
+ pns->primary_dns, pns->secondary_dns);
+
+ g_at_ppp_set_credentials(em->ppp, "", "");
+ g_at_ppp_set_debug(em->ppp, emulator_debug, "PPP");
+
+ g_at_ppp_set_connect_function(em->ppp, ppp_connect, em);
+ g_at_ppp_set_disconnect_function(em->ppp, ppp_disconnect, em);
+ g_at_ppp_set_suspend_function(em->ppp, ppp_suspend, em);
g_at_server_send_intermediate(em->server, "CONNECT");
- em->source = g_idle_add(setup_ppp, em);
+ g_at_io_set_write_done(io, suspend_server, em);
return;
@@ -760,11 +726,6 @@ static void emulator_unregister(struct ofono_atom *atom)
DBG("%p", em);
- if (em->source) {
- g_source_remove(em->source);
- em->source = 0;
- }
-
if (em->callsetup_source) {
g_source_remove(em->callsetup_source);
em->callsetup_source = 0;