First implementation of standard dbus service
authorjaviplx <javiplx@gmail.com>
Mon, 4 Oct 2010 09:17:24 +0000 (09:17 +0000)
committerjaviplx <javiplx@gmail.com>
Mon, 4 Oct 2010 09:17:24 +0000 (09:17 +0000)
git-svn-id: file:///svnroot/wifihood/trunk@16 c51dfc6a-5949-4919-9c8e-f207a149c383

wifiscand/Makefile
wifiscand/debian/rules
wifiscand/wifiscand.c

index 80f7f27..7d82bbb 100644 (file)
@@ -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
+
index a0870df..4d72a01 100755 (executable)
@@ -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.
index 36780c9..09d6176 100644 (file)
@@ -1,9 +1,28 @@
 
 #include <iwlib.h>
 
+#ifdef HAVE_LIBOSSO
 #include <libosso.h>
-
-#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);
 }