add completed ukit (upower/udisks aka devicekit) module
authordiscomfitor <discomfitor@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Wed, 28 Apr 2010 20:40:58 +0000 (20:40 +0000)
committerdiscomfitor <discomfitor@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Wed, 28 Apr 2010 20:40:58 +0000 (20:40 +0000)
fixes for hal module:
more readable by using defined type insertion
now utility functions always return stringshared strings. DO NOT FREE THESE.

Note that until you see a followup commit from me in e17, the filemanager/battery/illume modules will all potentially break from attempting to free stringshares

git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/e_dbus@48404 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

18 files changed:
AUTHORS
Makefile.am
configure.ac
src/bin/Makefile.am
src/lib/Makefile.am
src/lib/hal/E_Hal.h
src/lib/hal/e_hal_device.c
src/lib/hal/e_hal_manager.c
src/lib/hal/e_hal_util.c
src/lib/hal/e_hal_util.h
src/lib/ukit/E_Ukit.h [new file with mode: 0644]
src/lib/ukit/Makefile.am [new file with mode: 0644]
src/lib/ukit/e_udisks.c [new file with mode: 0644]
src/lib/ukit/e_ukit_main.c [new file with mode: 0644]
src/lib/ukit/e_ukit_private.h [new file with mode: 0644]
src/lib/ukit/e_ukit_privfunc.h [new file with mode: 0644]
src/lib/ukit/e_ukit_util.c [new file with mode: 0644]
src/lib/ukit/e_upower.c [new file with mode: 0644]

diff --git a/AUTHORS b/AUTHORS
index 7564557..31a1ab7 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -1,2 +1,3 @@
 Brian Mattern <rephorm@rephorm.com>
 Mathieu Taillefumier <mathieu.taillefumier@free.fr>
+Mike Blumenkrantz (zmike/discomfitor) mike@zentific.com
index 4beadf9..c9248d2 100644 (file)
@@ -23,6 +23,13 @@ endif
 if BUILD_EOFONO
 EOFONO_PC = eofono.pc
 endif
-pkgconfig_DATA = edbus.pc $(EHAL_PC) $(ENOTIFY_PC) $(ECONNMAN_PC) $(EBLUEZ_PC) $(EOFONO_PC)
+#if BUILD_EUDEV
+#EUDEV_PC = eudev.pc
+#endif
+if BUILD_EUKIT
+EUKIT_PC = eukit.pc
+endif
+pkgconfig_DATA = edbus.pc $(EHAL_PC) $(ENOTIFY_PC) $(ECONNMAN_PC) $(EBLUEZ_PC) $(EOFONO_PC) $(EUKIT_PC)
+#pkgconfig_DATA = edbus.pc $(EHAL_PC) $(ENOTIFY_PC) $(ECONNMAN_PC) $(EBLUEZ_PC) $(EOFONO_PC) $(EUDEV_PC) $(EUKIT_PC)
 
 EXTRA_DIST = e_dbus.spec
index 4e387d8..5867659 100644 (file)
@@ -33,6 +33,8 @@ ebluez_release_info="-release $release"
 eofono_release_info="-release $release"
 edbus_release_info="-release $release"
 ehal_release_info="-release $release"
+##eudev_release_info="-release $release"
+eukit_release_info="-release $release"
 enotify_release_info="-release $release"
 AC_SUBST(version_info)
 AC_SUBST(econnman_release_info)
@@ -40,43 +42,70 @@ AC_SUBST(ebluez_release_info)
 AC_SUBST(eofono_release_info)
 AC_SUBST(edbus_release_info)
 AC_SUBST(ehal_release_info)
+##AC_SUBST(eudev_release_info)
+AC_SUBST(eukit_release_info)
 AC_SUBST(enotify_release_info)
 
 dnl Check enabled modules to build
-AC_ARG_ENABLE([ehal],
-   [AC_HELP_STRING([--disable-ehal], [Disable ehal build])],
-   [enable_ehal=$enableval],
-   [enable_ehal="yes"])
-
-AC_ARG_ENABLE([econnman],
-   [AC_HELP_STRING([--enable-econnman], [Enable econnman build])],
-   [enable_econnman=$enableval],
-   [enable_econnman="yes"])
-
-AC_ARG_ENABLE([ebluez],
-   [AC_HELP_STRING([--enable-ebluez], [Enable ebluez build])],
-   [enable_ebluez=$enableval],
-   [enable_ebluez="yes"])
-
-AC_ARG_ENABLE([eofono],
-   [AC_HELP_STRING([--enable-eofono], [Enable eofono build])],
-   [enable_eofono=$enableval],
-   [enable_eofono="yes"])
-
-AC_ARG_ENABLE([enotify],
-   [AC_HELP_STRING([--disable-enotify], [Disable enotify build])],
-   [enable_enotify=$enableval],
-   [enable_enotify="yes"])
+AC_ARG_ENABLE([ehal],[AC_HELP_STRING([--disable-ehal], [Disable ehal build])])
+AS_IF(
+   [test "x$enableval" != "xno"],
+      AC_CHECK_PROG([enable_ehal],lshal,yes,no)
+   [enable_ehal=no],
+)
+
+#AC_ARG_ENABLE([eudev],[AC_HELP_STRING([--disable-eudev], [Disable eudev build])])
+#AS_IF(
+#   [test "x$enableval" != "xno"],
+#      [enable_eudev="yes"],
+#   [enable_eudev=no],
+#)
+
+AC_ARG_ENABLE([eukit],[AC_HELP_STRING([--disable-eukit], [Disable eukit build])])
+AS_IF(
+   [test "x$enableval" != "xno"],
+     AC_CHECK_PROG([enable_eukit],udisks,yes,no)
+     AC_CHECK_PROG([enable_eukit],upower,yes,no),
+   [enable_eukit=no],
+)
+
+AC_ARG_ENABLE([econnman],[AC_HELP_STRING([--enable-econnman], [Enable econnman build])])
+AS_IF(
+   [test "x$enableval" != "xno"],
+      [enable_econnman="yes"],
+   [enable_econnman=no],
+)
+
+AC_ARG_ENABLE([ebluez],[AC_HELP_STRING([--enable-ebluez], [Enable ebluez build])])
+AS_IF(
+   [test "x$enableval" != "xno"],
+      [enable_ebluez="yes"],
+   [enable_ebluez=no],
+)
+
+AC_ARG_ENABLE([eofono],[AC_HELP_STRING([--enable-eofono], [Enable eofono build])])
+AS_IF(
+   [test "x$enableval" != "xno"],
+      [enable_eofono="yes"],
+   [enable_eofono=no],
+)
+
+AC_ARG_ENABLE([enotify],[AC_HELP_STRING([--disable-enotify], [Disable enotify build])])
+AS_IF(
+   [test "x$enableval" != "xno"],
+      [enable_enotify="yes"],
+   [enable_enotify=no],
+)
 
 # pkg-config
 PKG_PROG_PKG_CONFIG
 
 # Check whether pkg-config supports Requires.private
-if $PKG_CONFIG --atleast-pkgconfig-version 0.22; then
-   pkgconfig_requires_private="Requires.private"
-else
-   pkgconfig_requires_private="Requires"
-fi
+AS_IF(
+   [$PKG_CONFIG --atleast-pkgconfig-version 0.22],
+      [pkgconfig_requires_private="Requires.private"],
+   [pkgconfig_requires_private="Requires"]
+)
 AC_SUBST(pkgconfig_requires_private)
 
 PKG_CHECK_MODULES([EINA], [eina-0])
@@ -91,15 +120,18 @@ dbus_version=`pkg-config --modversion dbus-1`
 DBUS_VERSION_MAJOR=`echo $dbus_version | awk -F. '{print $1}'`
 DBUS_VERSION_MINOR=`echo $dbus_version | awk -F. '{print $2}'`
 DBUS_VERSION_MICRO=`echo $dbus_version | awk -F. '{print $3}'`
-if test "z$DBUS_VERSION_MAJOR" = "z"; then
-  DBUS_VERSION_MAJOR="0"
-fi
-if test "z$DBUS_VERSION_MINOR" = "z"; then
-  DBUS_VERSION_MINOR="0"
-fi
-if test "z$DBUS_VERSION_MICRO" = "z"; then
-  DBUS_VERSION_MICRO="0"
-fi
+AS_IF(
+   [test "z$DBUS_VERSION_MAJOR" = "z"],
+      [DBUS_VERSION_MAJOR="0"]
+)
+AS_IF(
+   [test "z$DBUS_VERSION_MINOR" = "z"],
+      [DBUS_VERSION_MINOR="0"]
+)
+AS_IF(
+   [test "z$DBUS_VERSION_MICRO" = "z"],
+      [DBUS_VERSION_MICRO="0"]
+)
 DBUS_VERSION_CFLAGS="$DBUS_VERSION_CFLAGS -DDBUS_VERSION_MAJOR=$DBUS_VERSION_MAJOR"
 DBUS_VERSION_CFLAGS="$DBUS_VERSION_CFLAGS -DDBUS_VERSION_MINOR=$DBUS_VERSION_MINOR"
 DBUS_VERSION_CFLAGS="$DBUS_VERSION_CFLAGS -DDBUS_VERSION_MICRO=$DBUS_VERSION_MICRO"
@@ -108,11 +140,19 @@ AC_SUBST(DBUS_VERSION_CFLAGS)
 AC_FUNC_ALLOCA
 
 dnl evas
-if test "x${enable_enotify}" = "xyes" ; then
-   PKG_CHECK_MODULES(EVAS, [evas >= 0.9.9], [], [enable_enotify="no"])
-fi
+AS_IF(
+   [test "x${enable_enotify}" = "xyes"],
+      [PKG_CHECK_MODULES(EVAS, [evas >= 0.9.9], [], [enable_enotify="no"])]
+)
+
+#AS_IF(
+#   [test "x${enable_eudev}" = "xyes"],
+#     [PKG_CHECK_MODULES(EUDEV, udev, [], [enable_eudev="no"])]
+#)
 
 AM_CONDITIONAL([BUILD_EHAL],     [test "x${enable_ehal}"     = "xyes"])
+#AM_CONDITIONAL([BUILD_EUDEV],     [test "x${enable_eudev}"     = "xyes"])
+AM_CONDITIONAL([BUILD_EUKIT],     [test "x${enable_eukit}"     = "xyes"])
 AM_CONDITIONAL([BUILD_ENOTIFY],  [test "x${enable_enotify}"  = "xyes"])
 AM_CONDITIONAL([BUILD_ECONNMAN], [test "x${enable_econnman}" = "xyes"])
 AM_CONDITIONAL([BUILD_EBLUEZ], [test "x${enable_ebluez}" = "xyes"])
@@ -120,12 +160,14 @@ AM_CONDITIONAL([BUILD_EOFONO], [test "x${enable_eofono}" = "xyes"])
 
 EFL_EDBUS_BUILD=""
 lt_enable_auto_import=""
-case "$host_os" in
-   mingw* | cegcc*)
-      EFL_EDBUS_BUILD="-DEFL_EDBUS_BUILD"
-      lt_enable_auto_import="-Wl,--enable-auto-import"
-   ;;
-esac
+AS_CASE(
+   ["$host_os"],
+      [mingw* | cegcc*],
+        [
+           EFL_EDBUS_BUILD="-DEFL_EDBUS_BUILD"
+           lt_enable_auto_import="-Wl,--enable-auto-import"
+        ]
+)
 AC_SUBST(EFL_EDBUS_BUILD)
 AC_SUBST(lt_enable_auto_import)
 
@@ -136,6 +178,7 @@ src/Makefile
 src/lib/Makefile
 src/lib/dbus/Makefile
 src/lib/hal/Makefile
+src/lib/ukit/Makefile
 src/lib/notification/Makefile
 src/lib/connman/Makefile
 src/lib/bluez/Makefile
@@ -143,6 +186,7 @@ src/lib/ofono/Makefile
 src/bin/Makefile
 edbus.pc
 ehal.pc
+eukit.pc
 enotify.pc
 econnman.pc
 ebluez.pc
@@ -165,6 +209,8 @@ echo
 echo "  Modules:"
 echo
 echo "    EHal...............: $enable_ehal"
+echo "    EUdev..............: $enable_eudev"
+echo "    EUkit..............: $enable_eukit"
 echo "    EConnman...........: $enable_econnman"
 echo "    EBluez.............: $enable_ebluez"
 echo "    EOfono.............: $enable_eofono"
index 612eeab..208a918 100644 (file)
@@ -6,6 +6,7 @@ EDBUS_CPPFLAGS = \
 -I$(top_srcdir)/src/lib/connman \
 -I$(top_srcdir)/src/lib/bluez \
 -I$(top_srcdir)/src/lib/ofono \
+-I$(top_srcdir)/src/lib/ukit \
 @EDBUS_CFLAGS@ \
 @EINA_CFLAGS@
 
@@ -27,13 +28,17 @@ endif
 if BUILD_EOFONO
 EOFONO_PROG = e_dbus_ofono_test
 endif
+if BUILD_EUKIT
+EUKIT_PROG = e_dbus_ukit_test
+endif
 
 bin_PROGRAMS = \
 $(EDBUS_PROG) \
 $(ENOTIFY_PROG) \
 $(ECONNMAN_PROG) \
 $(EBLUEZ_PROG) \
-$(EOFONO_PROG)
+$(EOFONO_PROG) \
+$(EUKIT_PROG)
 
 noinst_PROGRAMS = \
 $(ECONNMAN_PROG_NOINST)
@@ -91,3 +96,9 @@ e_dbus_ofono_test_SOURCES = e_dbus_ofono_test.c
 e_dbus_ofono_test_CPPFLAGS = $(EDBUS_CPPFLAGS)
 e_dbus_ofono_test_LDADD = $(top_builddir)/src/lib/ofono/libeofono.la
 endif
+
+if BUILD_EUKIT
+e_dbus_ukit_test_SOURCES = e_dbus_ukit_test.c
+e_dbus_ukit_test_CPPFLAGS = $(EDBUS_CPPFLAGS)
+e_dbus_ukit_test_LDADD = $(top_builddir)/src/lib/ukit/libeukit.la
+endif
index 2e220d8..f51bcb2 100644 (file)
@@ -1,3 +1,3 @@
 MAINTAINERCLEANFILES = Makefile.in
 
-SUBDIRS=dbus hal notification connman bluez ofono
+SUBDIRS=dbus hal notification connman bluez ofono ukit
index d41aa48..ae17749 100644 (file)
@@ -42,7 +42,7 @@ struct E_Hal_String_List_Return
 
 struct E_Hal_Bool_Return
 {
-  char boolean;
+  Eina_Bool boolean;
 };
 
 struct E_Hal_UDI_Return
@@ -73,9 +73,9 @@ struct E_Hal_Property
   {
     const char *s;
     int i;
-    dbus_bool_t b;
+    Eina_Bool b;
     double d;
-    dbus_uint64_t u64;
+    uint64_t u64;
     Eina_List *strlist;
   } val;
 };
@@ -118,13 +118,13 @@ extern "C" {
    EAPI DBusPendingCall *e_hal_manager_find_device_by_capability(E_DBus_Connection *conn, const char *capability, E_DBus_Callback_Func cb_func, void *data);
 
 /* utility functions */
-   EAPI void           e_hal_property_free(E_Hal_Property *prop);
-   EAPI char          *e_hal_property_string_get(E_Hal_Properties *properties, const char *key, int *err);
-   EAPI char           e_hal_property_bool_get(E_Hal_Properties *properties, const char *key, int *err);
-   EAPI int            e_hal_property_int_get(E_Hal_Properties *properties, const char *key, int *err);
-   EAPI dbus_uint64_t  e_hal_property_uint64_get(E_Hal_Properties *properties, const char *key, int *err);
-   EAPI double         e_hal_property_double_get(E_Hal_Properties *properties, const char *key, int *err);
-   EAPI Eina_List     *e_hal_property_strlist_get(E_Hal_Properties *properties, const char *key, int *err);
+   EAPI void                e_hal_property_free(E_Hal_Property *prop);
+   EAPI const char         *e_hal_property_string_get(E_Hal_Properties *properties, const char *key, int *err);
+   EAPI Eina_Bool           e_hal_property_bool_get(E_Hal_Properties *properties, const char *key, int *err);
+   EAPI int                 e_hal_property_int_get(E_Hal_Properties *properties, const char *key, int *err);
+   EAPI uint64_t            e_hal_property_uint64_get(E_Hal_Properties *properties, const char *key, int *err);
+   EAPI double              e_hal_property_double_get(E_Hal_Properties *properties, const char *key, int *err);
+   EAPI const Eina_List    *e_hal_property_strlist_get(E_Hal_Properties *properties, const char *key, int *err);
 
 /* (un)mount */
    EAPI DBusPendingCall *e_hal_device_volume_mount(E_DBus_Connection *conn, const char *udi, const char *mount_point, const char *fstype, Eina_List *options, E_DBus_Callback_Func cb_func, void *data);
index bfb3c4d..427df2d 100644 (file)
@@ -17,6 +17,7 @@ unmarshal_device_get_property(DBusMessage *msg, DBusError *err)
   E_Hal_Device_Get_Property_Return *ret = NULL;
   DBusMessageIter iter;
   int type;
+  char *tmp;
 
   ret = calloc(1, sizeof(E_Hal_Device_Get_Property_Return));
   if (!ret) 
@@ -29,16 +30,17 @@ unmarshal_device_get_property(DBusMessage *msg, DBusError *err)
   type = dbus_message_iter_get_arg_type(&iter);
   switch(type)
   {
-    case 's':
-      dbus_message_iter_get_basic(&iter, &(ret->val.s));
+    case DBUS_TYPE_STRING:
+      dbus_message_iter_get_basic(&iter, &tmp);
+      ret->val.s = (char*)eina_stringshare_add(tmp);
       break;
-    case 'i':
+    case DBUS_TYPE_INT32:
       dbus_message_iter_get_basic(&iter, &(ret->val.i));
       break;
-    case 'b':
+    case DBUS_TYPE_BOOLEAN:
       dbus_message_iter_get_basic(&iter, &(ret->val.b));
       break;
-    case 'd':
+    case DBUS_TYPE_DOUBLE:
       dbus_message_iter_get_basic(&iter, &(ret->val.d));
       break;
   }
@@ -52,6 +54,14 @@ free_device_get_property(void *data)
   E_Hal_Device_Get_Property_Return *ret = data;
 
   if (!ret) return;
+  if (ret->type == E_HAL_PROPERTY_TYPE_STRLIST)
+    {
+       const char *s;
+       EINA_LIST_FREE(ret->val.strlist, s)
+         eina_stringshare_del(s);
+    }
+  else if (ret->type == E_HAL_PROPERTY_TYPE_STRING)
+    eina_stringshare_del(ret->val.s);
   free(ret);
 }
 
@@ -75,7 +85,9 @@ unmarshal_device_get_all_properties(DBusMessage *msg, DBusError *err)
 {
   E_Hal_Device_Get_All_Properties_Return *ret = NULL;
   DBusMessageIter iter, a_iter, s_iter, v_iter;
+  char *tmp;
 
+  /* a{sv} = array of string+variant */
   if (!dbus_message_has_signature(msg, "a{sv}")) 
   {
     dbus_set_error(err, DBUS_ERROR_INVALID_SIGNATURE, "");
@@ -104,27 +116,28 @@ unmarshal_device_get_all_properties(DBusMessage *msg, DBusError *err)
     
     switch(dbus_message_iter_get_arg_type(&v_iter))
     {
-      case 's':
+      case DBUS_TYPE_STRING:
         prop->type = E_HAL_PROPERTY_TYPE_STRING;
-        dbus_message_iter_get_basic(&v_iter, &(prop->val.s));
+        dbus_message_iter_get_basic(&v_iter, &tmp);
+        prop->val.s = (char*)eina_stringshare_add(tmp);
         break;
-      case 'i':
+      case DBUS_TYPE_INT32:
         prop->type = E_HAL_PROPERTY_TYPE_INT;
         dbus_message_iter_get_basic(&v_iter, &(prop->val.i));
         break;
-      case 't':
+      case DBUS_TYPE_UINT64:
         prop->type = E_HAL_PROPERTY_TYPE_UINT64;
         dbus_message_iter_get_basic(&v_iter, &(prop->val.u64));
         break;
-      case 'b':
+      case DBUS_TYPE_BOOLEAN:
         prop->type = E_HAL_PROPERTY_TYPE_BOOL;
         dbus_message_iter_get_basic(&v_iter, &(prop->val.b));
         break;
-      case 'd':
+      case DBUS_TYPE_DOUBLE:
         prop->type = E_HAL_PROPERTY_TYPE_DOUBLE;
         dbus_message_iter_get_basic(&v_iter, &(prop->val.d));
         break;
-      case 'a':
+      case DBUS_TYPE_ARRAY:
         prop->type = E_HAL_PROPERTY_TYPE_STRLIST;
         {
           DBusMessageIter list_iter;
@@ -134,7 +147,8 @@ unmarshal_device_get_all_properties(DBusMessage *msg, DBusError *err)
           {
             char *str;
             dbus_message_iter_get_basic(&list_iter, &str);
-            prop->val.strlist = eina_list_append(prop->val.strlist, str);
+            tmp = (char*)eina_stringshare_add(str);
+            prop->val.strlist = eina_list_append(prop->val.strlist, tmp);
             dbus_message_iter_next(&list_iter);
           }
         }
@@ -253,7 +267,7 @@ e_hal_device_volume_mount(E_DBus_Connection *conn, const char *udi, const char *
   dbus_message_iter_init_append(msg, &iter);
   dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &mount_point);
   dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &fstype);
-  dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "s", &subiter);
+  dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, DBUS_TYPE_STRING_AS_STRING, &subiter);
 
   if (options)
   {
@@ -293,7 +307,7 @@ e_hal_device_volume_unmount(E_DBus_Connection *conn, const char *udi, Eina_List
   msg = e_hal_device_volume_call_new(udi, "Unmount");
 
   dbus_message_iter_init_append(msg, &iter);
-  dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "s", &subiter);
+  dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, DBUS_TYPE_STRING_AS_STRING, &subiter);
   if (options)
   {
     const char *opt;
@@ -330,7 +344,7 @@ e_hal_device_volume_eject(E_DBus_Connection *conn, const char *udi, Eina_List *o
   msg = e_hal_device_volume_call_new(udi, "Eject");
 
   dbus_message_iter_init_append(msg, &iter);
-  dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "s", &subiter);
+  dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, DBUS_TYPE_STRING_AS_STRING, &subiter);
   if (options)
   {
     const char *opt;
index 935bb99..8b48958 100644 (file)
@@ -44,9 +44,11 @@ static void
 free_string_list(void *data)
 {
   E_Hal_String_List_Return *ret = data;
+  const char *x;
 
   if (!ret) return;
-  eina_list_free(ret->strings);
+  EINA_LIST_FREE(ret->strings, x)
+    eina_stringshare_del(x);
   free(ret);
 }
 
index a79003e..522c2fe 100644 (file)
@@ -21,20 +21,20 @@ e_hal_property_free(E_Hal_Property *prop)
  * @param key the key of the property to retrieve
  * @param err a pointer to an int, which if supplied, will be set to 0 on success and 1 on an error
  */
-EAPI char *
+EAPI const char *
 e_hal_property_string_get(E_Hal_Properties *properties, const char *key, int *err)
 {
   E_Hal_Property *prop;
   if (err) *err = 0;
   if (!properties->properties) return NULL;
   prop = eina_hash_find(properties->properties, key);
-  if (prop) return strdup(prop->val.s);
+  if (prop) return prop->val.s;
 
   if (err) *err = 1;
   return NULL;
 }
 
-EAPI char
+EAPI Eina_Bool
 e_hal_property_bool_get(E_Hal_Properties *properties, const char *key, int *err)
 {
   E_Hal_Property *prop;
@@ -60,7 +60,7 @@ e_hal_property_int_get(E_Hal_Properties *properties, const char *key, int *err)
   return 0;
 }
 
-EAPI dbus_uint64_t
+EAPI uint64_t
 e_hal_property_uint64_get(E_Hal_Properties *properties, const char *key, int *err)
 {
   E_Hal_Property *prop;
@@ -86,7 +86,7 @@ e_hal_property_double_get(E_Hal_Properties *properties, const char *key, int *er
   return 0;
 }
 
-EAPI Eina_List *
+EAPI const Eina_List *
 e_hal_property_strlist_get(E_Hal_Properties *properties, const char *key, int *err)
 {
   E_Hal_Property *prop;
index 5a01838..0413510 100644 (file)
@@ -4,11 +4,11 @@
 #include "E_Hal.h"
 
 void e_hal_property_free(E_Hal_Property *prop);
-char *e_hal_property_string_get(E_Hal_Properties *properties, const char *key, int *err);
+const char *e_hal_property_string_get(E_Hal_Properties *properties, const char *key, int *err);
 char e_hal_property_bool_get(E_Hal_Properties *properties, const char *key, int *err);
 int e_hal_property_int_get(E_Hal_Properties *properties, const char *key, int *err);
-dbus_uint64_t e_hal_property_uint64_get(E_Hal_Properties *properties, const char *key, int *err);
+uint64_t e_hal_property_uint64_get(E_Hal_Properties *properties, const char *key, int *err);
 double e_hal_property_double_get(E_Hal_Properties *properties, const char *key, int *err);
-Eina_List *e_hal_property_strlist_get(E_Hal_Properties *properties, const char *key, int *err);
+const Eina_List *e_hal_property_strlist_get(E_Hal_Properties *properties, const char *key, int *err);
 
 #endif
diff --git a/src/lib/ukit/E_Ukit.h b/src/lib/ukit/E_Ukit.h
new file mode 100644 (file)
index 0000000..d9117b3
--- /dev/null
@@ -0,0 +1,176 @@
+#ifndef E_UKIT_H
+#define E_UKIT_H
+#include <E_DBus.h>
+#include <eina_stringshare.h>
+
+#ifdef EAPI
+#undef EAPI
+#endif
+#ifdef _MSC_VER
+# ifdef BUILDING_DLL
+#  define EAPI __declspec(dllexport)
+# else
+#  define EAPI __declspec(dllimport)
+# endif
+#else
+# ifdef __GNUC__
+#  if __GNUC__ >= 4
+#   define EAPI __attribute__ ((visibility("default")))
+#  else
+#   define EAPI
+#  endif
+# else
+#  define EAPI
+# endif
+#endif
+
+#define E_UKIT_PROP_INTERFACE "org.freedesktop.DBus.Properties"
+
+#define E_UDISKS_BUS "org.freedesktop.UDisks"
+#define E_UDISKS_PATH "/org/freedesktop/UDisks"
+#define E_UDISKS_INTERFACE "org.freedesktop.UDisks.Device"
+
+#define E_UPOWER_BUS "org.freedesktop.UPower"
+#define E_UPOWER_PATH "/org/freedesktop/UPower"
+#define E_UPOWER_INTERFACE "org.freedesktop.UPower.Device"
+
+/* message return types */
+
+typedef struct E_Ukit_Property E_Ukit_Property;
+typedef struct E_Ukit_Properties E_Ukit_Properties;
+
+struct E_Ukit_String_List_Return
+{
+   Eina_List *strings; /* list of const char * */
+};
+
+struct E_Ukit_Bool_Return
+{
+   Eina_Bool boolean;
+};
+
+struct E_Ukit_UDI_Return
+{
+   const char *udi;
+};
+
+struct E_Ukit_Capability
+{
+   const char *udi;
+   const char *capability;
+};
+
+typedef enum
+{
+   E_UKIT_PROPERTY_TYPE_STRING,
+   E_UKIT_PROPERTY_TYPE_INT,
+   E_UKIT_PROPERTY_TYPE_UINT32,
+   E_UKIT_PROPERTY_TYPE_UINT64,
+   E_UKIT_PROPERTY_TYPE_INT64,
+   E_UKIT_PROPERTY_TYPE_BOOL,
+   E_UKIT_PROPERTY_TYPE_DOUBLE,
+   E_UKIT_PROPERTY_TYPE_STRLIST
+} E_Ukit_Property_Type;
+
+struct E_Ukit_Property
+{
+   E_Ukit_Property_Type type;
+   union 
+     {
+        const char *s;
+        int i;
+        Eina_Bool b;
+        double d;
+        uint32_t u;
+        uint64_t t;
+        int64_t x;
+        Eina_List *strlist;
+     } val;
+};
+
+struct E_Ukit_Properties
+{
+   Eina_Hash *properties;
+};
+
+typedef enum
+{
+   E_UPOWER_BATTERY_UNKNOWN,
+   E_UPOWER_BATTERY_LION,
+   E_UPOWER_BATTERY_LPOLYMER,
+   E_UPOWER_BATTERY_LIRONPHOS,
+   E_UPOWER_BATTERY_LEAD,
+   E_UPOWER_BATTERY_NICAD,
+   E_UPOWER_BATTERY_METALHYDRYDE
+} E_UPower_Battery_Type;
+
+typedef enum
+{
+   E_UPOWER_STATE_UNKNOWN,
+   E_UPOWER_STATE_CHARGING,
+   E_UPOWER_STATE_DISCHARGING,
+   E_UPOWER_STATE_EMPTY,
+   E_UPOWER_STATE_FULL,
+   E_UPOWER_STATE_PENDINGCHARGE,
+   E_UPOWER_STATE_PENDINGDISCHARGE
+} E_Upower_State;
+
+typedef enum
+{
+   E_UPOWER_SOURCE_UNKNOWN,
+   E_UPOWER_SOURCE_AC,
+   E_UPOWER_SOURCE_BATTERY,
+   E_UPOWER_SOURCE_UPS,
+   E_UPOWER_SOURCE_MONITOR,
+   E_UPOWER_SOURCE_MOUSE,
+   E_UPOWER_SOURCE_KEYBOARD,
+   E_UPOWER_SOURCE_PDA,
+   E_UPOWER_SOURCE_PHONE
+} E_Upower_Source;
+   
+
+typedef struct E_Ukit_Properties E_Ukit_Get_All_Properties_Return;
+typedef struct E_Ukit_Property E_Ukit_Get_Property_Return;
+typedef struct E_Ukit_String_List_Return E_Ukit_String_List_Return;
+typedef struct E_Ukit_String_List_Return E_Ukit_Get_All_Devices_Return;
+
+typedef struct E_Ukit_UDI_Return E_Ukit_Device_Added;
+typedef struct E_Ukit_UDI_Return E_Ukit_Device_Removed;
+typedef struct E_Ukit_Capability E_Ukit_New_Capability;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+   EAPI int e_ukit_init(void);
+   EAPI int e_ukit_shutdown(void);
+
+   EAPI DBusPendingCall *e_udisks_get_property(E_DBus_Connection *conn, const char *udi, const char *property, E_DBus_Callback_Func cb_func, void *data);
+   EAPI DBusPendingCall *e_udisks_get_all_properties(E_DBus_Connection *conn, const char *udi, E_DBus_Callback_Func cb_func, void *data);
+   EAPI DBusPendingCall *e_udisks_get_all_devices(E_DBus_Connection *conn, E_DBus_Callback_Func cb_func, void *data);
+
+   EAPI DBusPendingCall *e_upower_get_property(E_DBus_Connection *conn, const char *udi, const char *property, E_DBus_Callback_Func cb_func, void *data);
+   EAPI DBusPendingCall *e_upower_get_all_properties(E_DBus_Connection *conn, const char *udi, E_DBus_Callback_Func cb_func, void *data);
+   EAPI DBusPendingCall *e_upower_get_all_devices(E_DBus_Connection *conn, E_DBus_Callback_Func cb_func, void *data);
+
+/* utility functions */
+   EAPI void                e_ukit_property_free(E_Ukit_Property *prop);
+   EAPI const char         *e_ukit_property_string_get(E_Ukit_Properties *properties, const char *key, int *err);
+   EAPI Eina_Bool           e_ukit_property_bool_get(E_Ukit_Properties *properties, const char *key, int *err);
+   EAPI int                 e_ukit_property_int_get(E_Ukit_Properties *properties, const char *key, int *err);
+   EAPI uint32_t            e_ukit_property_uint32_get(E_Ukit_Properties *properties, const char *key, int *err);
+   EAPI uint64_t            e_ukit_property_uint64_get(E_Ukit_Properties *properties, const char *key, int *err);
+   EAPI int64_t             e_ukit_property_int64_get(E_Ukit_Properties *properties, const char *key, int *err);
+   EAPI double              e_ukit_property_double_get(E_Ukit_Properties *properties, const char *key, int *err);
+   EAPI const Eina_List    *e_ukit_property_strlist_get(E_Ukit_Properties *properties, const char *key, int *err);
+
+/* (un)mount */
+   EAPI DBusPendingCall *e_udisks_volume_mount(E_DBus_Connection *conn, const char *udi, const char *fstype, Eina_List *options, E_DBus_Callback_Func cb_func, void *data);
+   EAPI DBusPendingCall *e_udisks_volume_unmount(E_DBus_Connection *conn, const char *udi, Eina_List *options, E_DBus_Callback_Func cb_func, void *data);
+   EAPI DBusPendingCall *e_udisks_volume_eject(E_DBus_Connection *conn, const char *udi, Eina_List *options, E_DBus_Callback_Func cb_func, void *data);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/src/lib/ukit/Makefile.am b/src/lib/ukit/Makefile.am
new file mode 100644 (file)
index 0000000..c0b441a
--- /dev/null
@@ -0,0 +1,27 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-I $(top_srcdir)/src/lib/dbus \
+@EDBUS_CFLAGS@ @EINA_CFLAGS@
+
+if BUILD_EUKIT
+
+lib_LTLIBRARIES = libeukit.la
+include_HEADERS = E_Ukit.h
+
+noinst_HEADERS = e_ukit_private.h e_ukit_privfunc.h
+
+libeukit_la_SOURCES = \
+E_Ukit.h \
+e_udisks.c  \
+e_upower.c  \
+e_ukit_util.c \
+e_ukit_main.c
+
+libeukit_la_LIBADD = \
+@EDBUS_LIBS@ \
+$(top_builddir)/src/lib/dbus/libedbus.la \
+@EINA_LIBS@
+libeukit_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @eukit_release_info@
+
+endif
diff --git a/src/lib/ukit/e_udisks.c b/src/lib/ukit/e_udisks.c
new file mode 100644 (file)
index 0000000..556a943
--- /dev/null
@@ -0,0 +1,190 @@
+#include <E_Ukit.h>
+#include "e_ukit_private.h"
+
+#define E_UKIT_BUS E_UDISKS_BUS
+#define E_UKIT_PATH E_UDISKS_PATH
+#define E_UKIT_INTERFACE E_UDISKS_INTERFACE
+
+const char *e_udisks_iface="org.freedesktop.UDisks.Device";
+
+#if 0
+static void cb_device_get_property(void *data, DBusMessage *msg, DBusError *err);
+static void cb_device_get_all_properties(void *data, DBusMessage *msg, DBusError *err);
+static void cb_device_query_capability(void *data, DBusMessage *msg, DBusError *err);
+#endif
+
+/* Properties.Get */
+EAPI DBusPendingCall *
+e_udisks_get_property(E_DBus_Connection *conn, const char *udi, const char *property, E_DBus_Callback_Func cb_func, void *data)
+{
+   DBusMessage *msg;
+   DBusPendingCall *ret;
+
+   msg = e_ukit_property_call_new(udi, "Get");
+   dbus_message_append_args(msg, DBUS_TYPE_STRING, &e_udisks_iface, DBUS_TYPE_STRING, &property, DBUS_TYPE_INVALID);
+   ret = e_dbus_method_call_send(conn, msg, unmarshal_property, cb_func, free_property, -1, data);
+   dbus_message_unref(msg);
+   return ret;
+}
+
+/* Properties.GetAll */
+EAPI DBusPendingCall *
+e_udisks_get_all_properties(E_DBus_Connection *conn, const char *udi, E_DBus_Callback_Func cb_func, void *data)
+{
+   DBusMessage *msg;
+   DBusPendingCall *ret;
+
+   msg = e_ukit_property_call_new(udi, "GetAll");
+   dbus_message_append_args(msg, DBUS_TYPE_STRING, &e_udisks_iface, DBUS_TYPE_INVALID);
+   ret = e_dbus_method_call_send(conn, msg, unmarshal_device_get_all_properties, cb_func, free_device_get_all_properties, -1, data);
+   dbus_message_unref(msg);
+   return ret;
+}
+
+
+
+/* void FilesystemMount(string fstype, array{string}options) */
+
+/**
+ * @brief Mount a Filesystem
+ *
+ * @param conn the E_DBus_Connection
+ * @param udi the udi of the device object
+ * @param fstype the fstype of the device (e.g. volume.fstype property)
+ * @param options a list of additional options (not sure... fstype dependant?)
+ * @param cb_func an optional callback to call when the mount is done
+ * @param data custom data pointer for the callback function
+ *
+ * @return mount point of fs or error
+ */
+EAPI DBusPendingCall *
+e_udisks_volume_mount(E_DBus_Connection *conn, const char *udi, const char *fstype, Eina_List *options, E_DBus_Callback_Func cb_func, void *data)
+{
+   DBusMessage *msg;
+   DBusMessageIter iter, subiter;
+   Eina_List *l;
+   DBusPendingCall *ret;
+
+   msg = e_ukit_device_call_new(udi, "FilesystemMount");
+
+   dbus_message_iter_init_append(msg, &iter);
+   dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &fstype);
+   dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, DBUS_TYPE_STRING_AS_STRING, &subiter);
+
+   if (options)
+     {
+        const char *opt;
+
+        EINA_LIST_FOREACH(options, l, opt)
+          dbus_message_iter_append_basic(&subiter, DBUS_TYPE_STRING, &opt);
+     }
+   dbus_message_iter_close_container(&iter, &subiter) ;
+
+   ret = e_dbus_method_call_send(conn, msg, unmarshal_property, cb_func, free_property, -1, data);
+   dbus_message_unref(msg);
+   return ret;
+}
+
+/* void Unmount(array{string} options) */
+
+/**
+ * @brief Unmount a Volume
+ *
+ * @param conn the E_DBus_Connection
+ * @param udi the udi of the device object
+ * @param options a list of additional options (currently only 'force' is supported)
+ * @param cb_func an optional callback to call when the unmount is done
+ * @param data custom data pointer for the callback function
+ */
+EAPI DBusPendingCall *
+e_udisks_volume_unmount(E_DBus_Connection *conn, const char *udi, Eina_List *options, E_DBus_Callback_Func cb_func, void *data)
+{
+   DBusMessage *msg;
+   DBusMessageIter iter, subiter;
+   Eina_List *l;
+   DBusPendingCall *ret;
+
+   msg = e_ukit_device_call_new(udi, "FilesystemUnmount");
+
+   dbus_message_iter_init_append(msg, &iter);
+   dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, DBUS_TYPE_STRING_AS_STRING, &subiter);
+   if (options)
+     {
+        const char *opt;
+
+        EINA_LIST_FOREACH(options, l, opt)
+          dbus_message_iter_append_basic(&subiter, DBUS_TYPE_STRING, &opt);
+     }
+   dbus_message_iter_close_container(&iter, &subiter) ;
+
+   ret = e_dbus_method_call_send(conn, msg, NULL, cb_func, NULL, -1, data);
+   dbus_message_unref(msg);
+   return ret;
+}
+
+/**
+ * @brief Eject a Volume
+ *
+ * @param conn the E_DBus_Connection
+ * @param udi the udi of the device object
+ * @param options a list of additional options (none currently supported)
+ * @param cb_func an optional callback to call when the eject is done
+ * @param data cuatom data pointer for the callback function
+ */
+EAPI DBusPendingCall *
+e_udisks_volume_eject(E_DBus_Connection *conn, const char *udi, Eina_List *options, E_DBus_Callback_Func cb_func, void *data)
+{
+   DBusMessage *msg;
+   DBusMessageIter iter, subiter;
+   Eina_List *l;
+   DBusPendingCall *ret;
+
+   msg = e_ukit_device_call_new(udi, "DriveEject");
+
+   dbus_message_iter_init_append(msg, &iter);
+   dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, DBUS_TYPE_STRING_AS_STRING, &subiter);
+   if (options)
+     {
+        const char *opt;
+
+        EINA_LIST_FOREACH(options, l, opt)
+          dbus_message_iter_append_basic(&subiter, DBUS_TYPE_STRING, &opt);
+     }
+   dbus_message_iter_close_container(&iter, &subiter) ;
+
+   ret = e_dbus_method_call_send(conn, msg, NULL, cb_func, NULL, -1, data);
+   dbus_message_unref(msg);
+   return ret;
+}
+
+/* EnumerateDevices */
+EAPI DBusPendingCall *
+e_udisks_get_all_devices(E_DBus_Connection *conn, E_DBus_Callback_Func cb_func, void *data)
+{
+   DBusMessage *msg;
+   DBusPendingCall *ret;
+
+   msg = e_ukit_call_new(E_UKIT_PATH, "EnumerateDevices");
+   ret = e_dbus_method_call_send(conn, msg, unmarshal_string_list, cb_func, free_string_list, -1, data);
+   dbus_message_unref(msg);
+   return ret;
+}
+
+
+/* Manager.FindDeviceByCapability */
+/*
+ * not implemented in udisks yet...
+ * 
+EAPI DBusPendingCall *
+e_udisks_find_device_by_capability(E_DBus_Connection *conn, const char *capability, E_DBus_Callback_Func cb_func, void *data)
+{
+   DBusMessage *msg;
+   DBusPendingCall *ret;
+
+   msg = e_udisks_call_new("FindDeviceByCapability");
+   dbus_message_append_args(msg, DBUS_TYPE_STRING, &capability, DBUS_TYPE_INVALID);
+   ret = e_dbus_method_call_send(conn, msg, unmarshal_string_list, cb_func, free_string_list, -1, data);
+   dbus_message_unref(msg);
+   return ret;
+}
+*/
diff --git a/src/lib/ukit/e_ukit_main.c b/src/lib/ukit/e_ukit_main.c
new file mode 100644 (file)
index 0000000..6ee5bd0
--- /dev/null
@@ -0,0 +1,54 @@
+#include <E_Ukit.h>
+#include "e_ukit_private.h"
+
+int _e_dbus_udev_log_dom = -1;
+int _e_dbus_udev_init_count = 0;
+
+EAPI int
+e_ukit_init(void)
+{
+   if (++_e_dbus_udev_init_count != 1)
+     return _e_dbus_udev_init_count;
+
+   if (!eina_init())
+     return --_e_dbus_udev_init_count;
+
+   _e_dbus_udev_log_dom = eina_log_domain_register
+     ("e_ukit", E_DBUS_COLOR_DEFAULT);
+   if (_e_dbus_udev_log_dom < 0)
+     {
+        EINA_LOG_ERR("Could not register 'e_ukit' log domain.");
+        goto shutdown_eina;
+     }
+
+   if (!e_dbus_init())
+     {
+        ERR("Could not initialize E_DBus.");
+        goto unregister_log_domain;
+     }
+
+   return _e_dbus_udev_init_count;
+
+   unregister_log_domain:
+     eina_log_domain_unregister(_e_dbus_udev_log_dom);
+     _e_dbus_udev_log_dom = -1;
+   shutdown_eina:
+     eina_shutdown();
+
+   return _e_dbus_udev_init_count;
+}
+
+EAPI int
+e_ukit_shutdown(void)
+{
+   if (--_e_dbus_udev_init_count != 0)
+     return _e_dbus_udev_init_count;
+
+   e_dbus_shutdown();
+
+   eina_log_domain_unregister(_e_dbus_udev_log_dom);
+   _e_dbus_udev_log_dom = -1;
+   eina_shutdown();
+
+   return _e_dbus_udev_init_count;
+}
diff --git a/src/lib/ukit/e_ukit_private.h b/src/lib/ukit/e_ukit_private.h
new file mode 100644 (file)
index 0000000..6ebe851
--- /dev/null
@@ -0,0 +1,32 @@
+#ifndef E_UKIT_PRIVATE_H
+#define E_UKIT_PRIVATE_H
+
+#ifndef E_DBUS_COLOR_DEFAULT
+#define E_DBUS_COLOR_DEFAULT EINA_COLOR_CYAN
+#endif
+extern int _e_dbus_udev_log_dom;
+#ifdef ERR
+#undef ERR
+#endif
+#ifdef INF
+#undef INF
+#endif
+#ifdef WARN
+#undef WARN
+#endif
+#ifdef DBG
+#undef DBG
+#endif
+
+#define e_ukit_call_new(udi, member) dbus_message_new_method_call(E_UKIT_BUS, udi, E_UKIT_BUS, member)
+#define e_ukit_device_call_new(udi, member) dbus_message_new_method_call(E_UKIT_BUS, udi, E_UKIT_INTERFACE, member)
+#define e_ukit_property_call_new(udi, member) dbus_message_new_method_call(E_UKIT_BUS, udi, E_UKIT_PROP_INTERFACE, member)
+
+#define DBG(...)   EINA_LOG_DOM_DBG(_e_dbus_udev_log_dom, __VA_ARGS__)
+#define INFO(...)    EINA_LOG_DOM_INFO(_e_dbus_udev_log_dom, __VA_ARGS__)
+#define WARN(...) EINA_LOG_DOM_WARN(_e_dbus_udev_log_dom, __VA_ARGS__)
+#define ERR(...)   EINA_LOG_DOM_ERR(_e_dbus_udev_log_dom, __VA_ARGS__)
+
+#include "e_ukit_privfunc.h"
+
+#endif
diff --git a/src/lib/ukit/e_ukit_privfunc.h b/src/lib/ukit/e_ukit_privfunc.h
new file mode 100644 (file)
index 0000000..c4d2167
--- /dev/null
@@ -0,0 +1,256 @@
+#ifndef E_UKIT_PRIVFUNC_H
+#define E_UKIT_PRIVFUNC_H
+
+
+static void *
+unmarshal_property(DBusMessage *msg, DBusError *err)
+{
+   E_Ukit_Get_Property_Return *ret = NULL;
+   DBusMessageIter iter, a_iter;
+   int type;
+   char *tmp;
+
+   ret = calloc(1, sizeof(E_Ukit_Get_Property_Return));
+   if (!ret) 
+     {
+        dbus_set_error(err, DBUS_ERROR_NO_MEMORY, "");
+        return NULL;
+     }
+
+   dbus_message_iter_init(msg, &iter);
+   dbus_message_iter_recurse(&iter, &a_iter);
+   if (dbus_message_iter_get_arg_type(&a_iter) != DBUS_TYPE_INVALID)
+     {
+        type = dbus_message_iter_get_arg_type(&a_iter);    
+
+        switch(type)
+          {
+             case DBUS_TYPE_STRING:
+               ret->type = E_UKIT_PROPERTY_TYPE_STRING;
+               dbus_message_iter_get_basic(&a_iter, &tmp);
+               ret->val.s = eina_stringshare_add(tmp);
+               break;
+             case DBUS_TYPE_INT32:
+               ret->type = E_UKIT_PROPERTY_TYPE_INT;
+               dbus_message_iter_get_basic(&a_iter, &(ret->val.i));
+               break;
+             case DBUS_TYPE_UINT32:
+               ret->type = E_UKIT_PROPERTY_TYPE_UINT32;
+               dbus_message_iter_get_basic(&a_iter, &(ret->val.u));
+               break;
+             case DBUS_TYPE_UINT64:
+               ret->type = E_UKIT_PROPERTY_TYPE_UINT64;
+               dbus_message_iter_get_basic(&a_iter, &(ret->val.t));
+               break;
+             case DBUS_TYPE_INT64:
+               ret->type = E_UKIT_PROPERTY_TYPE_INT64;
+               dbus_message_iter_get_basic(&a_iter, &(ret->val.x));
+               break;
+             case DBUS_TYPE_BOOLEAN:
+               ret->type = E_UKIT_PROPERTY_TYPE_BOOL;
+               dbus_message_iter_get_basic(&a_iter, &(ret->val.b));
+               break;
+             case DBUS_TYPE_DOUBLE:
+               ret->type = E_UKIT_PROPERTY_TYPE_DOUBLE;
+               dbus_message_iter_get_basic(&a_iter, &(ret->val.d));
+               break;
+             case DBUS_TYPE_ARRAY:
+               ret->type = E_UKIT_PROPERTY_TYPE_STRLIST;
+               {
+                  DBusMessageIter list_iter;
+                  ret->val.strlist = NULL;
+                  dbus_message_iter_recurse(&a_iter, &list_iter);
+                  while (dbus_message_iter_get_arg_type(&list_iter) != DBUS_TYPE_INVALID)
+                    {
+                       char *str;
+                       dbus_message_iter_get_basic(&list_iter, &str);
+                       tmp = (char*)eina_stringshare_add(str);
+                       ret->val.strlist = eina_list_append(ret->val.strlist, tmp);
+                       dbus_message_iter_next(&list_iter);
+                    }
+                }
+                break;
+             default:
+               break;
+          }
+     }
+
+   return ret;
+}
+
+
+
+static void 
+free_property(void *data)
+{
+   E_Ukit_Get_Property_Return *ret = data;
+
+   if (!ret) return;
+   if (ret->type == E_UKIT_PROPERTY_TYPE_STRLIST)
+     {
+        const char *s;
+        EINA_LIST_FREE(ret->val.strlist, s)
+          eina_stringshare_del(s);
+     }
+   else if (ret->type == E_UKIT_PROPERTY_TYPE_STRING)
+     eina_stringshare_del(ret->val.s);
+   free(ret);
+}
+
+static void *
+unmarshal_device_get_all_properties(DBusMessage *msg, DBusError *err)
+{
+   E_Ukit_Get_All_Properties_Return *ret = NULL;
+   DBusMessageIter iter, a_iter, s_iter, v_iter;
+   int type;
+   char *tmp;
+
+   /* a{sv} = array of string+variants */
+   if (!dbus_message_has_signature(msg, "a{sv}")) 
+     {
+        dbus_set_error(err, DBUS_ERROR_INVALID_SIGNATURE, "");
+        return NULL;
+     }
+
+   ret = calloc(1, sizeof(E_Ukit_Get_All_Properties_Return));
+   if (!ret) 
+     {
+         dbus_set_error(err, DBUS_ERROR_NO_MEMORY, "");
+         return NULL;
+     }
+
+   ret->properties = eina_hash_string_small_new(EINA_FREE_CB(e_ukit_property_free));
+
+   dbus_message_iter_init(msg, &iter);
+   dbus_message_iter_recurse(&iter, &a_iter);
+   while (dbus_message_iter_get_arg_type(&a_iter) != DBUS_TYPE_INVALID)
+   {
+      const char *name;
+      E_Ukit_Property *prop = calloc(1, sizeof(E_Ukit_Property));
+      dbus_message_iter_recurse(&a_iter, &s_iter);
+      dbus_message_iter_get_basic(&s_iter, &name);
+      dbus_message_iter_next(&s_iter);
+      dbus_message_iter_recurse(&s_iter, &v_iter);
+      
+      type = dbus_message_iter_get_arg_type(&v_iter);
+      switch(type)
+        {
+           case DBUS_TYPE_STRING:
+             prop->type = E_UKIT_PROPERTY_TYPE_STRING;
+             dbus_message_iter_get_basic(&v_iter, &tmp);
+             prop->val.s = eina_stringshare_add(tmp);
+             break;
+           case DBUS_TYPE_INT32:
+             prop->type = E_UKIT_PROPERTY_TYPE_INT;
+             dbus_message_iter_get_basic(&v_iter, &(prop->val.i));
+             break;
+           case DBUS_TYPE_UINT32:
+             prop->type = E_UKIT_PROPERTY_TYPE_UINT32;
+             dbus_message_iter_get_basic(&v_iter, &(prop->val.u));
+             break;
+           case DBUS_TYPE_UINT64:
+             prop->type = E_UKIT_PROPERTY_TYPE_UINT64;
+             dbus_message_iter_get_basic(&v_iter, &(prop->val.t));
+             break;
+           case DBUS_TYPE_INT64:
+             prop->type = E_UKIT_PROPERTY_TYPE_INT64;
+             dbus_message_iter_get_basic(&v_iter, &(prop->val.x));
+             break;
+           case DBUS_TYPE_BOOLEAN:
+             prop->type = E_UKIT_PROPERTY_TYPE_BOOL;
+             dbus_message_iter_get_basic(&v_iter, &(prop->val.b));
+             break;
+           case DBUS_TYPE_DOUBLE:
+             prop->type = E_UKIT_PROPERTY_TYPE_DOUBLE;
+             dbus_message_iter_get_basic(&v_iter, &(prop->val.d));
+             break;
+           case DBUS_TYPE_ARRAY:
+             prop->type = E_UKIT_PROPERTY_TYPE_STRLIST;
+             {
+                DBusMessageIter list_iter;
+                prop->val.strlist = NULL;
+                dbus_message_iter_recurse(&v_iter, &list_iter);
+                while (dbus_message_iter_get_arg_type(&list_iter) != DBUS_TYPE_INVALID)
+                {
+                   char *str;
+                   dbus_message_iter_get_basic(&list_iter, &str);
+                   tmp = (char*)eina_stringshare_add(str);
+                   prop->val.strlist = eina_list_append(prop->val.strlist, tmp);
+                   dbus_message_iter_next(&list_iter);
+                }
+             }
+             break;
+           default:
+             WARN("EUdev Error: unexpected property type (%s): %c", name, dbus_message_iter_get_arg_type(&v_iter));
+             break;
+        }
+      eina_hash_add(ret->properties, name, prop);
+
+      dbus_message_iter_next(&a_iter);
+   }
+
+   return ret;
+}
+
+static void
+free_device_get_all_properties(void *data)
+{
+   E_Ukit_Get_All_Properties_Return *ret = data;
+
+   if (!ret) return;
+   eina_hash_free(ret->properties);
+   free(ret);
+}
+
+static void *
+unmarshal_string_list(DBusMessage *msg, DBusError *err)
+{
+   E_Ukit_String_List_Return *ret = NULL;
+   DBusMessageIter iter, sub;
+   char *tmp;
+
+   /* ao = array of object strings */
+   if (!dbus_message_has_signature(msg, "ao")) 
+     {
+        dbus_set_error(err, DBUS_ERROR_INVALID_SIGNATURE, "");
+        return NULL;
+     }
+
+   ret = calloc(1, sizeof(E_Ukit_String_List_Return));
+   if (!ret) 
+     {
+        dbus_set_error(err, DBUS_ERROR_NO_MEMORY, "");
+        return NULL;
+     }
+
+   ret->strings = NULL;
+
+   dbus_message_iter_init(msg, &iter);
+   dbus_message_iter_recurse(&iter, &sub);
+   while (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_INVALID)
+     {
+        char *dev = NULL;
+
+        dbus_message_iter_get_basic(&sub, &dev);
+        tmp = (char*)eina_stringshare_add(dev);
+        if (dev) ret->strings = eina_list_append(ret->strings, tmp);
+        dbus_message_iter_next(&sub);
+     }
+
+   return ret;
+}
+
+static void
+free_string_list(void *data)
+{
+   E_Ukit_String_List_Return *ret = data;
+   const char *x;
+
+   if (!ret) return;
+   EINA_LIST_FREE(ret->strings, x)
+     eina_stringshare_del(x);
+   free(ret);
+}
+
+
+#endif
diff --git a/src/lib/ukit/e_ukit_util.c b/src/lib/ukit/e_ukit_util.c
new file mode 100644 (file)
index 0000000..48900b1
--- /dev/null
@@ -0,0 +1,125 @@
+#include <E_Ukit.h>
+#include "e_ukit_private.h"
+
+/**
+ * @internal
+ * @brief free a property structure
+ * @param prop the property to free
+ */
+EAPI void
+e_ukit_property_free(E_Ukit_Property *prop)
+{
+   if (prop->type == E_UKIT_PROPERTY_TYPE_STRLIST)
+     eina_list_free(prop->val.strlist);
+   free(prop);
+}
+
+/**
+ * @brief Retrive a string from an element of a property hash
+ * @param properties the E_Ukit_Properties structure
+ * @param key the key of the property to retrieve
+ * @param err a pointer to an int, which if supplied, will be set to 0 on success and 1 on an error
+ */
+EAPI const char *
+e_ukit_property_string_get(E_Ukit_Properties *properties, const char *key, int *err)
+{
+   E_Ukit_Property *prop;
+   if (err) *err = 0;
+   if (!properties->properties) return NULL;
+   prop = eina_hash_find(properties->properties, key);
+   if (prop) return prop->val.s;
+
+   if (err) *err = 1;
+   return NULL;
+}
+
+EAPI Eina_Bool
+e_ukit_property_bool_get(E_Ukit_Properties *properties, const char *key, int *err)
+{
+   E_Ukit_Property *prop;
+   if (err) *err = 0;
+   if (!properties->properties) return 0;
+   prop = eina_hash_find(properties->properties, key);
+   if (prop) return prop->val.b;
+   
+   if (err) *err = 1;
+   return 0;
+}
+
+EAPI int
+e_ukit_property_int_get(E_Ukit_Properties *properties, const char *key, int *err)
+{
+   E_Ukit_Property *prop;
+   if (err) *err = 0;
+   if (!properties->properties) return 0;
+   prop = eina_hash_find(properties->properties, key);
+   if (prop) return prop->val.i;
+
+   if (err) *err = 1;
+   return 0;
+}
+
+EAPI uint32_t
+e_ukit_property_uint32_get(E_Ukit_Properties *properties, const char *key, int *err)
+{
+   E_Ukit_Property *prop;
+   if (err) *err = 0;
+   if (!properties->properties) return 0;
+   prop = eina_hash_find(properties->properties, key);
+   if (prop) return prop->val.u;
+
+   if (err) *err = 1;
+   return 0;
+}
+
+EAPI uint64_t
+e_ukit_property_uint64_get(E_Ukit_Properties *properties, const char *key, int *err)
+{
+   E_Ukit_Property *prop;
+   if (err) *err = 0;
+   if (!properties->properties) return 0;
+   prop = eina_hash_find(properties->properties, key);
+   if (prop) return prop->val.t;
+
+   if (err) *err = 1;
+   return 0;
+}
+
+EAPI int64_t
+e_ukit_property_int64_get(E_Ukit_Properties *properties, const char *key, int *err)
+{
+   E_Ukit_Property *prop;
+   if (err) *err = 0;
+   if (!properties->properties) return 0;
+   prop = eina_hash_find(properties->properties, key);
+   if (prop) return prop->val.x;
+
+   if (err) *err = 1;
+   return 0;
+}
+
+EAPI double
+e_ukit_property_double_get(E_Ukit_Properties *properties, const char *key, int *err)
+{
+   E_Ukit_Property *prop;
+   if (err) *err = 0;
+   if (!properties->properties) return 0;
+   prop = eina_hash_find(properties->properties, key);
+   if (prop) return prop->val.d;
+
+   if (err) *err = 1;
+   return 0;
+}
+
+EAPI const Eina_List *
+e_ukit_property_strlist_get(E_Ukit_Properties *properties, const char *key, int *err)
+{
+   E_Ukit_Property *prop;
+   if (err) *err = 0;
+   if (!properties->properties) return NULL;
+   prop = eina_hash_find(properties->properties, key);
+   if (prop) return prop->val.strlist;
+
+   if (err) *err = 1;
+   return NULL;
+}
diff --git a/src/lib/ukit/e_upower.c b/src/lib/ukit/e_upower.c
new file mode 100644 (file)
index 0000000..a7c0278
--- /dev/null
@@ -0,0 +1,108 @@
+#include <E_Ukit.h>
+#include "e_ukit_private.h"
+
+#define E_UKIT_BUS E_UPOWER_BUS
+#define E_UKIT_PATH E_UPOWER_PATH
+#define E_UKIT_INTERFACE E_UPOWER_INTERFACE
+
+const char *e_upower_iface="org.freedesktop.UPower.Device";
+
+#if 0
+static void cb_device_get_property(void *data, DBusMessage *msg, DBusError *err);
+static void cb_device_get_all_properties(void *data, DBusMessage *msg, DBusError *err);
+static void cb_device_query_capability(void *data, DBusMessage *msg, DBusError *err);
+#endif
+
+/* Properties.Get */
+EAPI DBusPendingCall *
+e_upower_get_property(E_DBus_Connection *conn, const char *udi, const char *property, E_DBus_Callback_Func cb_func, void *data)
+{
+   DBusMessage *msg;
+   DBusPendingCall *ret;
+
+   msg = e_ukit_property_call_new(udi, "Get");
+   dbus_message_append_args(msg, DBUS_TYPE_STRING, &e_upower_iface, DBUS_TYPE_STRING, &property, DBUS_TYPE_INVALID);
+   ret = e_dbus_method_call_send(conn, msg, unmarshal_property, cb_func, free_property, -1, data);
+   dbus_message_unref(msg);
+   return ret;
+}
+
+/* Properties.GetAll */
+EAPI DBusPendingCall *
+e_upower_get_all_properties(E_DBus_Connection *conn, const char *udi, E_DBus_Callback_Func cb_func, void *data)
+{
+   DBusMessage *msg;
+   DBusPendingCall *ret;
+
+   msg = e_ukit_property_call_new(udi, "GetAll");
+   dbus_message_append_args(msg, DBUS_TYPE_STRING, &e_upower_iface, DBUS_TYPE_INVALID);
+   ret = e_dbus_method_call_send(conn, msg, unmarshal_device_get_all_properties, cb_func, free_device_get_all_properties, -1, data);
+   dbus_message_unref(msg);
+   return ret;
+}
+
+
+EAPI DBusPendingCall *
+e_upower_hibernate(E_DBus_Connection *conn, E_DBus_Callback_Func cb_func, void *data)
+{
+   DBusMessage *msg;
+   DBusPendingCall *ret;
+
+   msg = e_ukit_call_new(E_UKIT_PATH, "Hibernate");
+
+   ret = e_dbus_method_call_send(conn, msg, NULL, cb_func, NULL, -1, data);
+   dbus_message_unref(msg);
+   return ret;
+}
+
+EAPI DBusPendingCall *
+e_upower_suspend(E_DBus_Connection *conn, E_DBus_Callback_Func cb_func, void *data)
+{
+   DBusMessage *msg;
+   DBusPendingCall *ret;
+
+   msg = e_ukit_call_new(E_UKIT_PATH, "Suspend");
+
+   ret = e_dbus_method_call_send(conn, msg, NULL, cb_func, NULL, -1, data);
+   dbus_message_unref(msg);
+   return ret;
+}
+
+EAPI DBusPendingCall *
+e_upower_hibernate_allowed(E_DBus_Connection *conn, E_DBus_Callback_Func cb_func, void *data)
+{
+   DBusMessage *msg;
+   DBusPendingCall *ret;
+
+   msg = e_ukit_call_new(E_UKIT_PATH, "HibernateAllowed");
+
+   ret = e_dbus_method_call_send(conn, msg, unmarshal_property, cb_func, free_property, -1, data);
+   dbus_message_unref(msg);
+   return ret;
+}
+
+EAPI DBusPendingCall *
+e_upower_suspend_allowed(E_DBus_Connection *conn, E_DBus_Callback_Func cb_func, void *data)
+{
+   DBusMessage *msg;
+   DBusPendingCall *ret;
+
+   msg = e_ukit_call_new(E_UKIT_PATH, "SuspendAllowed");
+
+   ret = e_dbus_method_call_send(conn, msg, unmarshal_property, cb_func, free_property, -1, data);
+   dbus_message_unref(msg);
+   return ret;
+}
+
+/* EnumerateDevices */
+EAPI DBusPendingCall *
+e_upower_get_all_devices(E_DBus_Connection *conn, E_DBus_Callback_Func cb_func, void *data)
+{
+   DBusMessage *msg;
+   DBusPendingCall *ret;
+
+   msg = e_ukit_call_new(E_UKIT_PATH, "EnumerateDevices");
+   ret = e_dbus_method_call_send(conn, msg, unmarshal_string_list, cb_func, free_string_list, -1, data);
+   dbus_message_unref(msg);
+   return ret;
+}