---
 include/emulator.h |   10 +++++++
 src/emulator.c     |   75 +++++++++++++++++++++++++++++++++++++++++++++++-----
 2 files changed, 78 insertions(+), 7 deletions(-)

diff --git a/include/emulator.h b/include/emulator.h
index 5cd894b..29abf55 100644
--- a/include/emulator.h
+++ b/include/emulator.h
@@ -105,6 +105,16 @@ enum ofono_emulator_request_type 
ofono_emulator_request_get_type(
 void ofono_emulator_set_indicator(struct ofono_emulator *em,
                                        const char *name, int value);
 
+typedef void (*network_request)(struct ofono_error *, int *,
+                               const char **, const char **,
+                               const char **, const char **);
+typedef void (*network_release)(void);
+
+void ofono_emulator_add_network_request_cb(struct ofono_emulator *em,
+                                                       network_request cb);
+void ofono_emulator_add_network_release_cb(struct ofono_emulator *em,
+                                                       network_release cb);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/src/emulator.c b/src/emulator.c
index 9b4647b..b5055ff 100644
--- a/src/emulator.c
+++ b/src/emulator.c
@@ -33,10 +33,13 @@
 #include "gatserver.h"
 #include "gatppp.h"
 
-#define DUN_SERVER_ADDRESS     "192.168.1.1"
-#define DUN_PEER_ADDRESS       "192.168.1.2"
-#define DUN_DNS_SERVER_1       "10.10.10.10"
-#define DUN_DNS_SERVER_2       "10.10.10.11"
+struct emulator_network {
+       int fd;
+       const char *server_ip;
+       const char *peer_ip;
+       const char *primary_dns;
+       const char *secondary_dns;
+};
 
 #define RING_TIMEOUT 3
 
@@ -55,6 +58,9 @@ struct ofono_emulator {
        guint callsetup_source;
        gboolean clip;
        gboolean ccwa;
+       struct emulator_network *en;
+       network_request req_en_cb;
+       network_release rel_en_cb;
 };
 
 struct indicator {
@@ -78,6 +84,40 @@ static void emulator_disconnect(gpointer user_data)
        ofono_emulator_remove(em);
 }
 
+static struct emulator_network *get_emulator_network(struct ofono_emulator *e)
+{
+       struct ofono_error error;
+       struct emulator_network *en;
+
+       en = g_try_new0(struct emulator_network, 1);
+
+       if (en == NULL)
+               return en;
+
+       if (e->req_en_cb)
+               e->req_en_cb(&error, &en->fd, &en->server_ip, &en->peer_ip,
+                               &en->primary_dns, &en->secondary_dns);
+       else
+               goto error;
+
+       if (error.type == OFONO_ERROR_TYPE_FAILURE)
+               goto error;
+
+       return en;
+
+error:
+       g_free(en);
+       return NULL;
+}
+
+static void release_emulator_network(struct ofono_emulator *e)
+{
+       if (e->rel_en_cb)
+               e->rel_en_cb();
+       if (e->en)
+               g_free(e->en);
+}
+
 static void ppp_connect(const char *iface, const char *local,
                        const char *remote,
                        const char *dns1, const char *dns2,
@@ -98,6 +138,7 @@ static void ppp_disconnect(GAtPPPDisconnectReason reason, 
gpointer user_data)
 
        g_at_ppp_unref(em->ppp);
        em->ppp = NULL;
+       release_emulator_network(em);
 
        if (em->server == NULL)
                return;
@@ -118,14 +159,16 @@ static gboolean setup_ppp(gpointer user_data)
 
        g_at_server_suspend(em->server);
 
-       em->ppp = g_at_ppp_server_new_from_io(io, DUN_SERVER_ADDRESS);
+       em->ppp = g_at_ppp_server_new_from_io_with_fd(io,
+                                                       em->en->server_ip,
+                                                       em->en->fd);
        if (em->ppp == NULL) {
                g_at_server_resume(em->server);
                return FALSE;
        }
 
-       g_at_ppp_set_server_info(em->ppp, DUN_PEER_ADDRESS,
-                                       DUN_DNS_SERVER_1, DUN_DNS_SERVER_2);
+       g_at_ppp_set_server_info(em->ppp, em->en->peer_ip,
+                                       em->en->primary_dns, 
em->en->secondary_dns);;
 
        g_at_ppp_set_credentials(em->ppp, "", "");
        g_at_ppp_set_debug(em->ppp, emulator_debug, "PPP");
@@ -143,6 +186,9 @@ static gboolean dial_call(struct ofono_emulator *em, const 
char *dial_str)
        DBG("dial call %s", dial_str);
 
        if (c == '*' || c == '#' || c == 'T' || c == 't') {
+               em->en = get_emulator_network(em);
+               if (!em->en)
+                       return FALSE;
                g_at_server_send_intermediate(em->server, "CONNECT");
                em->source = g_idle_add(setup_ppp, em);
        }
@@ -927,3 +973,18 @@ void ofono_emulator_set_indicator(struct ofono_emulator 
*em,
                break;
        }
 }
+
+void ofono_emulator_add_network_request_cb(struct ofono_emulator *em,
+                                                       network_request cb)
+{
+       if (em !=NULL)
+               em->req_en_cb = cb;
+}
+
+void ofono_emulator_add_network_release_cb(struct ofono_emulator *em,
+                                                       network_release cb)
+{
+       if (em !=NULL)
+               em->rel_en_cb = cb;
+}
+
-- 
1.7.1

_______________________________________________
ofono mailing list
[email protected]
http://lists.ofono.org/listinfo/ofono

Reply via email to