---
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