From aa5e1d5040e5268e8f7dae6d55523690a778d136 Mon Sep 17 00:00:00 2001 From: javiplx Date: Mon, 4 Oct 2010 09:17:24 +0000 Subject: [PATCH] First implementation of standard dbus service git-svn-id: file:///svnroot/wifihood/trunk@16 c51dfc6a-5949-4919-9c8e-f207a149c383 --- wifiscand/Makefile | 22 ++++++- wifiscand/debian/rules | 5 +- wifiscand/wifiscand.c | 159 +++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 178 insertions(+), 8 deletions(-) diff --git a/wifiscand/Makefile b/wifiscand/Makefile index 80f7f27..7d82bbb 100644 --- a/wifiscand/Makefile +++ b/wifiscand/Makefile @@ -1,9 +1,25 @@ -LDFLAGS = -liw $(shell pkg-config --libs libosso) +PREFIX = /usr -CPPFLAGS = $(shell pkg-config --cflags libosso) +OSSO_CFLAGS = $(shell pkg-config --cflags libosso) +OSSO_LDFLAGS = $(shell pkg-config --libs libosso) -default: wifiscand +DBUS_CFLAGS = $(shell pkg-config --cflags dbus-1) +DBUS_LDFLAGS = $(shell pkg-config --libs dbus-1) + +GLIB_CFLAGS = $(shell pkg-config --cflags glib-2.0) +GLIB_LDFLAGS = $(shell pkg-config --libs glib-2.0) + +CPPFLAGS = +CFLAGS = $(DBUS_CFLAGS) $(GLIB_CFLAGS) +LDFLAGS = -liw $(DBUS_LDFLAGS) $(GLIB_LDFLAGS) + +default: + +install: wifiscand + cp wifiscand $(DESTDIR)$(PREFIX)/sbin + cp wifiscand.service $(DESTDIR)$(PREFIX)/share/dbus-1/services clean: @rm -rf wifiscand + diff --git a/wifiscand/debian/rules b/wifiscand/debian/rules index a0870df..4d72a01 100755 --- a/wifiscand/debian/rules +++ b/wifiscand/debian/rules @@ -34,7 +34,7 @@ build-stamp: configure-stamp dh_testdir # Add here commands to compile the package. - $(MAKE) + $(MAKE) wifiscand CPPFLAGS="-DHAVE_LIBOSSO" touch build-stamp @@ -55,8 +55,7 @@ install: build dh_installdirs # Add here commands to install the package into debian/tmp - cp wifiscand $(CURDIR)/debian/tmp/usr/sbin - cp wifiscand.service $(CURDIR)/debian/tmp/usr/share/dbus-1/services + make install DESTDIR=$(CURDIR)/debian/tmp # Build architecture-independent files here. diff --git a/wifiscand/wifiscand.c b/wifiscand/wifiscand.c index 36780c9..09d6176 100644 --- a/wifiscand/wifiscand.c +++ b/wifiscand/wifiscand.c @@ -1,9 +1,28 @@ #include +#ifdef HAVE_LIBOSSO #include - -#define WIFISCAND_VERSION_STRING "1.0" +#else +#include "glib/gtypes.h" +#include "dbus/dbus.h" +#define OSSO_OK 0 +#define OSSO_ERROR 1 +#endif + +#ifndef HAVE_LIBOSSO +#define osso_context_t DBusConnection +typedef struct osso_rpc_t_values { + int i; + char *s; + } osso_rpc_t_values; +typedef struct osso_rpc_t { + int type; + osso_rpc_t_values value; + } osso_rpc_t; +#endif + +#define WIFISCAND_VERSION_STRING "1.1" #define OSSO_NAME "wifiscan" #define OSSO_SERVICE "org.javiplx."OSSO_NAME @@ -211,14 +230,40 @@ struct _AppData { osso_context_t *osso_context; }; +#ifdef HAVE_LIBOSSO static GMainLoop *event_loop = NULL; +#endif static short int start_flags = 0; +#ifndef HAVE_LIBOSSO +int submit_reply_message(DBusConnection *connection, DBusMessage *message, char *string) { + DBusMessage *reply = dbus_message_new_method_return (message); + if (reply == NULL) + exit(0); + if (!dbus_message_append_args (reply, DBUS_TYPE_STRING, &string, DBUS_TYPE_INVALID)) + exit(0); + if (!dbus_connection_send (connection, reply, NULL)) + exit(0); + dbus_message_unref (reply); + return DBUS_HANDLER_RESULT_HANDLED; +} +#endif + /* Callback for normal D-BUS messages */ +#ifdef HAVE_LIBOSSO gint dbus_req_handler(const gchar * interface, const gchar * method, GArray * arguments, gpointer data, osso_rpc_t * retval) +#else +static DBusHandlerResult dbus_req_handler (DBusConnection *connection, + DBusMessage *message, + void *data) +#endif { +#ifndef HAVE_LIBOSSO + osso_rpc_t *retval = malloc(sizeof(osso_rpc_t)); +#endif + AppData *appdata; appdata = (AppData *) data; @@ -226,18 +271,34 @@ gint dbus_req_handler(const gchar * interface, const gchar * method, retval->value.s = (gchar*) malloc( sizeof(gchar *) ); retval->value.s[0] = '\0'; +#ifdef HAVE_LIBOSSO if ( strcmp(method,"wakeup")==0 ) { +#else + if (dbus_message_is_method_call(message, OSSO_IFACE, "wakeup")) { +#endif retval->value.s = (gchar *) realloc(retval->value.s,16*sizeof(gchar *)); snprintf(retval->value.s,16,"WifiScand ready"); +#ifdef HAVE_LIBOSSO return OSSO_OK; +#else + return submit_reply_message(connection, message, retval->value.s); +#endif } +#ifdef HAVE_LIBOSSO if ( strcmp(method,"start")==0 ) { +#else + if (dbus_message_is_method_call(message, OSSO_IFACE, "start")) { +#endif if( (appdata->iface.sock=iw_sockets_open()) < 0) { retval->value.s = (gchar *) realloc(retval->value.s,33*sizeof(gchar *)); snprintf(retval->value.s,33,"Failure in socket initialization"); +#ifdef HAVE_LIBOSSO return OSSO_ERROR; +#else + return submit_reply_message(connection, message, retval->value.s); +#endif } struct ifreq frq; @@ -245,7 +306,11 @@ gint dbus_req_handler(const gchar * interface, const gchar * method, if(ioctl(appdata->iface.sock, SIOCGIFFLAGS, &frq)) { retval->value.s = (gchar *) realloc(retval->value.s,28*sizeof(gchar *)); snprintf(retval->value.s,28,"Cannot get interface status"); +#ifdef HAVE_LIBOSSO return OSSO_ERROR; +#else + return submit_reply_message(connection, message, retval->value.s); +#endif } start_flags = frq.ifr_flags; @@ -254,16 +319,28 @@ gint dbus_req_handler(const gchar * interface, const gchar * method, if(ioctl(appdata->iface.sock, SIOCSIFFLAGS, &frq)) { retval->value.s = (gchar *) realloc(retval->value.s,27*sizeof(gchar *)); snprintf(retval->value.s,27,"Cannot set interface state"); +#ifdef HAVE_LIBOSSO return OSSO_ERROR; +#else + return submit_reply_message(connection, message, retval->value.s); +#endif } refresh(&appdata->iface); retval->value.s = (gchar *) realloc(retval->value.s,22*sizeof(gchar *)); snprintf(retval->value.s,22,"Interface initialized"); +#ifdef HAVE_LIBOSSO return OSSO_OK; +#else + return submit_reply_message(connection, message, retval->value.s); +#endif } +#ifdef HAVE_LIBOSSO if ( strcmp(method,"stop")==0 ) { +#else + if (dbus_message_is_method_call(message, OSSO_IFACE, "stop")) { +#endif struct ifreq frq; strncpy(frq.ifr_name, appdata->iface.ifname, IFNAMSIZ); if(!ioctl(appdata->iface.sock, SIOCGIFFLAGS, &frq)) { @@ -273,7 +350,12 @@ gint dbus_req_handler(const gchar * interface, const gchar * method, } iw_sockets_close(appdata->iface.sock); appdata->iface.sock = 0; +#ifdef HAVE_LIBOSSO osso_deinitialize(appdata->osso_context); +#else + dbus_connection_unref(appdata->osso_context); + dbus_shutdown(); +#endif /* Instead of exiting, signaling finish to main loop could be better retval->value.s = (gchar *) realloc(retval->value.s,34*sizeof(gchar *)); snprintf(retval->value.s,34,"Interface moved to original state"); @@ -281,13 +363,21 @@ gint dbus_req_handler(const gchar * interface, const gchar * method, exit(0); } +#ifdef HAVE_LIBOSSO if ( strcmp(method,"scan")==0 ) { +#else + if (dbus_message_is_method_call(message, OSSO_IFACE, "scan")) { +#endif ScanInfo **scan = (ScanInfo **) makeScan(&appdata->iface,retval->value.s); if(scan == NULL) { retval->value.s = (gchar *) realloc(retval->value.s,64*sizeof(gchar *)); snprintf(retval->value.s,64,"ERROR"); +#ifdef HAVE_LIBOSSO return OSSO_ERROR; +#else + return submit_reply_message(connection, message, retval->value.s); +#endif } int i; @@ -296,36 +386,72 @@ gint dbus_req_handler(const gchar * interface, const gchar * method, retval->value.s = (gchar *) realloc(retval->value.s,23*(i+1)*sizeof(gchar *)); if ( retval->value.s == NULL ) { retval->value.s = "Error allocating memory"; +#ifdef HAVE_LIBOSSO return OSSO_ERROR; +#else + return submit_reply_message(connection, message, retval->value.s); +#endif } sprintf(retval->value.s+strlen(retval->value.s),"%s:%d ",sc->mac,sc->rssi); } retval->value.s[strlen(retval->value.s)-1] = '\0'; +#ifdef HAVE_LIBOSSO return OSSO_OK; +#else + return submit_reply_message(connection, message, retval->value.s); +#endif } retval->value.s = (gchar *) realloc(retval->value.s,64*sizeof(gchar *)); snprintf(retval->value.s,64,"Unknown method"); +#ifdef HAVE_LIBOSSO return OSSO_ERROR; +#else + return submit_reply_message(connection, message, retval->value.s); +#endif } +#ifndef HAVE_LIBOSSO +static DBusObjectPathVTable +dbus_req_handler_vtable = { + NULL, + dbus_req_handler, + NULL, +}; +#endif int main( void ) { osso_context_t *osso_context; +#ifndef HAVE_LIBOSSO + DBusError error; +#endif /* Initialize maemo application */ +#ifdef HAVE_LIBOSSO osso_context = osso_initialize(OSSO_NAME, WIFISCAND_VERSION_STRING, TRUE, NULL); +#else + dbus_error_init(&error); + osso_context = dbus_bus_get(DBUS_BUS_STARTER, &error); +#endif /* Check that initialization was ok */ if (osso_context == NULL) { +#ifndef HAVE_LIBOSSO + fprintf (stderr, "*** Failed to open connection to activating message bus: %s\n", error.message); + dbus_error_free (&error); +#endif exit(OSSO_ERROR); } /* Create AppData */ AppData *appdata; +#ifdef HAVE_LIBOSSO appdata = g_new0(AppData, 1); +#else + appdata = malloc(sizeof(AppData)); +#endif appdata->osso_context = osso_context; memset(&(appdata->iface.info), 0, sizeof(wireless_info)); @@ -333,19 +459,48 @@ int main( void ) { appdata->iface.sock = 0; /* Add handler for hello D-BUS messages */ +#ifdef HAVE_LIBOSSO osso_return_t result = osso_rpc_set_cb_f(osso_context, OSSO_SERVICE, OSSO_OBJECT, OSSO_IFACE, dbus_req_handler, appdata); +#else + int result = dbus_connection_register_fallback(osso_context, OSSO_OBJECT, &dbus_req_handler_vtable, appdata); +#endif +// NOTE : valid return codes do not match from both functions +#ifdef HAVE_LIBOSSO if (result != OSSO_OK) { +#else + if (!result) { +#endif +#ifdef HAVE_LIBOSSO osso_system_note_infoprint(appdata->osso_context, "Failure while setting OSSO callback", NULL); +#endif return OSSO_ERROR; } +#ifndef HAVE_LIBOSSO + result = dbus_bus_request_name (osso_context, OSSO_SERVICE, 0, &error); + if (dbus_error_is_set (&error)) { + fprintf (stderr, "Error %s\n", error.message); + dbus_error_free (&error); + exit (1); + } +#endif + /* INITIALIZATION FINISH */ +#ifdef HAVE_LIBOSSO event_loop = g_main_loop_new(NULL, FALSE); g_main_loop_run(event_loop); +#else + while (dbus_connection_read_write_dispatch (osso_context, -1)) {} +#endif /* Deinitialize OSSO */ +#ifdef HAVE_LIBOSSO osso_deinitialize(osso_context); +#else + dbus_connection_unref(osso_context); + dbus_shutdown(); +#endif exit(0); } -- 1.7.9.5