aboutsummaryrefslogtreecommitdiffstats
path: root/src/libcharon/plugins/maemo/maemo_plugin.c
diff options
context:
space:
mode:
authorTobias Brunner <tobias@strongswan.org>2010-09-20 17:35:28 +0200
committerTobias Brunner <tobias@strongswan.org>2010-10-14 17:36:18 +0200
commit8464e25a0f9b895df27cf0110b693440a2b34083 (patch)
tree64db5d828e98fd20c5c46cb8d1bc930e8f87a8af /src/libcharon/plugins/maemo/maemo_plugin.c
parent2bce814190b5c5f057be4babf7589d389162da44 (diff)
downloadstrongswan-8464e25a0f9b895df27cf0110b693440a2b34083.tar.bz2
strongswan-8464e25a0f9b895df27cf0110b693440a2b34083.tar.xz
Maemo: Register with libosso and init Glib main loop.
Diffstat (limited to 'src/libcharon/plugins/maemo/maemo_plugin.c')
-rw-r--r--src/libcharon/plugins/maemo/maemo_plugin.c82
1 files changed, 82 insertions, 0 deletions
diff --git a/src/libcharon/plugins/maemo/maemo_plugin.c b/src/libcharon/plugins/maemo/maemo_plugin.c
index ebf0c969c..8673c339e 100644
--- a/src/libcharon/plugins/maemo/maemo_plugin.c
+++ b/src/libcharon/plugins/maemo/maemo_plugin.c
@@ -13,9 +13,18 @@
* for more details.
*/
+#include <glib.h>
+#include <libosso.h>
+
#include "maemo_plugin.h"
#include <daemon.h>
+#include <processing/jobs/callback_job.h>
+
+#define OSSO_CHARON_NAME "charon"
+#define OSSO_CHARON_SERVICE "org.strongswan."OSSO_CHARON_NAME
+#define OSSO_CHARON_OBJECT "/org/strongswan/"OSSO_CHARON_NAME
+#define OSSO_CHARON_IFACE "org.strongswan."OSSO_CHARON_NAME
typedef struct private_maemo_plugin_t private_maemo_plugin_t;
@@ -29,11 +38,53 @@ struct private_maemo_plugin_t {
*/
maemo_plugin_t public;
+ /**
+ * Glib main loop for a thread, handles DBUS calls
+ */
+ GMainLoop *loop;
+
+ /**
+ * Context for OSSO
+ */
+ osso_context_t *context;
+
};
+/**
+ * Callback for libosso dbus wrapper
+ */
+static gint dbus_req_handler(const gchar *interface, const gchar *method,
+ GArray *arguments, private_maemo_plugin_t *this,
+ osso_rpc_t *retval)
+{
+ return OSSO_OK;
+}
+
+/**
+ * Main loop to handle D-BUS messages.
+ */
+static job_requeue_t run(private_maemo_plugin_t *this)
+{
+ this->loop = g_main_loop_new(NULL, FALSE);
+ g_main_loop_run(this->loop);
+ return JOB_REQUEUE_NONE;
+}
+
METHOD(plugin_t, destroy, void,
private_maemo_plugin_t *this)
{
+ if (this->loop)
+ {
+ if (g_main_loop_is_running(this->loop))
+ {
+ g_main_loop_quit(this->loop);
+ }
+ g_main_loop_unref(this->loop);
+ }
+ if (this->context)
+ {
+ osso_deinitialize(this->context);
+ }
free(this);
}
@@ -42,6 +93,7 @@ METHOD(plugin_t, destroy, void,
*/
plugin_t *maemo_plugin_create()
{
+ osso_return_t result;
private_maemo_plugin_t *this;
INIT(this,
@@ -50,6 +102,36 @@ plugin_t *maemo_plugin_create()
},
);
+ this->context = osso_initialize(OSSO_CHARON_SERVICE, "0.0.1", TRUE, NULL);
+ if (!this->context)
+ {
+ DBG1(DBG_CFG, "failed to initialize OSSO context");
+ destroy(this);
+ return NULL;
+ }
+
+ result = osso_rpc_set_cb_f(this->context,
+ OSSO_CHARON_SERVICE,
+ OSSO_CHARON_OBJECT,
+ OSSO_CHARON_IFACE,
+ (osso_rpc_cb_f*)dbus_req_handler,
+ this);
+ if (result != OSSO_OK)
+ {
+ DBG1(DBG_CFG, "failed to set D-BUS callback (%d)", result);
+ destroy(this);
+ return NULL;
+ }
+
+ this->loop = NULL;
+ if (!g_thread_supported())
+ {
+ g_thread_init(NULL);
+ }
+
+ lib->processor->queue_job(lib->processor,
+ (job_t*)callback_job_create((callback_job_cb_t)run, this, NULL, NULL));
+
return &this->public.plugin;
}