Maemo: Register with libosso and init Glib main loop.

This commit is contained in:
Tobias Brunner 2010-09-20 17:35:28 +02:00
parent 2bce814190
commit 8464e25a0f
3 changed files with 86 additions and 0 deletions

View File

@ -626,6 +626,9 @@ if test x$android = xtrue; then
fi
if test x$maemo = xtrue; then
PKG_CHECK_MODULES(maemo, [glib-2.0 gthread-2.0 libosso osso-af-settings])
AC_SUBST(maemo_CFLAGS)
AC_SUBST(maemo_LIBS)
dbusservicedir="/usr/share/dbus-1/system-services"
AC_SUBST(dbusservicedir)
fi

View File

@ -14,6 +14,7 @@ libstrongswan_maemo_la_SOURCES = \
maemo_plugin.h maemo_plugin.c
libstrongswan_maemo_la_LDFLAGS = -module -avoid-version
libstrongswan_maemo_la_LIBADD = ${maemo_LIBS}
dbusservice_DATA = org.strongswan.charon.service

View File

@ -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;
}