[Pkg-e-commits] [SCM] D-Bus integration for EFL based applications branch, master, updated. debian/0.5.0.050+svn20081126-1-145-g8d471b1

Albin Tonnerre albin.tonnerre at gmail.com
Fri Feb 6 20:44:19 UTC 2009


The following commit has been merged in the master branch:
commit 3bd69885652965be3299a495f39eedb8460f0ca7
Author: Albin Tonnerre <albin.tonnerre at gmail.com>
Date:   Fri Jan 30 14:43:40 2009 +0100

    Import new SVN snapshot

diff --git a/src/bin/Makefile.am b/src/bin/Makefile.am
index e96dc1d..2017f05 100644
--- a/src/bin/Makefile.am
+++ b/src/bin/Makefile.am
@@ -89,9 +89,9 @@ e_dbus_notification_daemon_LDADD = $(top_builddir)/src/lib/dbus/libedbus.la $(to
 e_dbus_notification_daemon_DEPENDENCIES = $(top_builddir)/src/lib/dbus/libedbus.la $(top_builddir)/src/lib/notification/libenotify.la
 
 e_notify_send_SOURCES = \
- notify-send.c
+	notify-send.c
 
 e_notify_send_CPPFLAGS = $(EDBUS_CPPFLAGS)
-e_notify_send_LDADD = $(top_builddir)/src/lib/notification/libenotify.la
-e_notify_send_DEPENDENCIES = $(top_builddir)/src/lib/notification/libenotify.la
+e_notify_send_LDADD = $(top_builddir)/src/lib/dbus/libedbus.la $(top_builddir)/src/lib/notification/libenotify.la
+e_notify_send_DEPENDENCIES = $(top_builddir)/src/lib/dbus/libedbus.la $(top_builddir)/src/lib/notification/libenotify.la
 endif 
diff --git a/src/bin/Makefile.in b/src/bin/Makefile.in
index 696f17a..c8250a4 100644
--- a/src/bin/Makefile.in
+++ b/src/bin/Makefile.in
@@ -279,11 +279,11 @@ e_dbus_test_client_DEPENDENCIES = $(top_builddir)/src/lib/dbus/libedbus.la
 @BUILD_ENOTIFY_TRUE at e_dbus_notification_daemon_LDADD = $(top_builddir)/src/lib/dbus/libedbus.la $(top_builddir)/src/lib/notification/libenotify.la
 @BUILD_ENOTIFY_TRUE at e_dbus_notification_daemon_DEPENDENCIES = $(top_builddir)/src/lib/dbus/libedbus.la $(top_builddir)/src/lib/notification/libenotify.la
 @BUILD_ENOTIFY_TRUE at e_notify_send_SOURCES = \
- at BUILD_ENOTIFY_TRUE@ notify-send.c
+ at BUILD_ENOTIFY_TRUE@	notify-send.c
 
 @BUILD_ENOTIFY_TRUE at e_notify_send_CPPFLAGS = $(EDBUS_CPPFLAGS)
- at BUILD_ENOTIFY_TRUE@e_notify_send_LDADD = $(top_builddir)/src/lib/notification/libenotify.la
- at BUILD_ENOTIFY_TRUE@e_notify_send_DEPENDENCIES = $(top_builddir)/src/lib/notification/libenotify.la
+ at BUILD_ENOTIFY_TRUE@e_notify_send_LDADD = $(top_builddir)/src/lib/dbus/libedbus.la $(top_builddir)/src/lib/notification/libenotify.la
+ at BUILD_ENOTIFY_TRUE@e_notify_send_DEPENDENCIES = $(top_builddir)/src/lib/dbus/libedbus.la $(top_builddir)/src/lib/notification/libenotify.la
 all: all-am
 
 .SUFFIXES:
diff --git a/src/bin/nm.c b/src/bin/nm.c
index ecf6e0b..0af4c11 100644
--- a/src/bin/nm.c
+++ b/src/bin/nm.c
@@ -2,10 +2,21 @@
 #include <Ecore_Data.h>
 
 #include <unistd.h>
+#include <string.h>
 
 E_NM *nm = NULL;
 E_NMS *nms = NULL;
 
+static void *
+memdup(const void *p, size_t n)
+{
+    void *q;
+
+    q = malloc(n);
+    memcpy(q, p, n);
+    return q;
+}
+
 static void
 dump_variant(E_NM_Variant *var)
 {
@@ -15,69 +26,73 @@ dump_variant(E_NM_Variant *var)
         case 'a': {
           E_NM_Variant *subvar;
 
-          printf("\n   - ");
+          printf("a:");
           ecore_list_first_goto(var->a);
           while ((subvar = ecore_list_next(var->a)))
+          {
               dump_variant(subvar);
+              printf(";");
+          }
+          printf("\n");
           break;
         }
         case 's':
+            printf("s:%s", var->s);
+            break;
         case 'o':
-            printf("%s ", var->s);
+            printf("o:%s", var->s);
             break;
         case 'u':
-            printf("%d ", var->u);
+            printf("u:%d", var->u);
             break;
         case 'b':
-            printf("%d ", var->b);
+            printf("b:%d", var->b);
             break;
         case 'y':
-            printf("%d ", var->y);
+            printf("y:%d", var->y);
             break;
         case 't':
-            printf("%lld ", var->t);
+            printf("t:%lld", var->t);
             break;
     }
 }
 
-static void
-dump_values(void *value, void *data)
+static Eina_Bool
+dump_values(const Eina_Hash *hash, const void *key, void *value, void *data)
 {
-    Ecore_Hash_Node *node;
-
-    node = value;
-    printf(" - name: %s - ", (char *)node->key);
-    dump_variant(node->value);
+    printf(" - name: %s - ", (char *)key);
+    dump_variant(value);
     printf("\n");
 }
  
-static void
-dump_settings(void *value, void *data)
+static Eina_Bool
+dump_settings(const Eina_Hash *hash, const void *key, void *value, void *fdata)
 {
-    Ecore_Hash_Node *node;
-
-    node = value;
-    printf("name: %s\n", (char *)node->key);
+    printf("name: %s\n", (char *)key);
     printf("values:\n");
-    ecore_hash_for_each_node(node->value, dump_values, NULL);
+    eina_hash_foreach(value, dump_values, NULL);
     printf("\n");
 }
 
 static int
-cb_nms_connection_settings(void *data, Ecore_Hash *settings)
+cb_nms_connection_secrets(void *data, Ecore_Hash *secrets)
 {
     printf("Secrets:\n");
-    if (settings)
-        ecore_hash_for_each_node(settings, dump_settings, NULL);
+    if (secrets)
+        eina_hash_foreach(secrets, dump_settings, NULL);
     return 1;
 }
 
 static int
-cb_nms_connection_secrets(void *data, Ecore_Hash *secrets)
+cb_nms_connection_settings(void *data, Ecore_Hash *settings)
 {
-    printf("Secrets:\n");
-    if (secrets)
-        ecore_hash_for_each_node(secrets, dump_settings, NULL);
+    printf("Settings:\n");
+    if (settings)
+    {
+        if (ecore_hash_get(settings, "802-11-wireless-security"))
+            e_nms_connection_secrets_get_secrets(data, "802-11-wireless-security", NULL, 0, cb_nms_connection_secrets, NULL);
+        eina_hash_foreach(settings, dump_settings, NULL);
+    }
     return 1;
 }
 
@@ -92,12 +107,12 @@ cb_nms_connections(void *data, Ecore_List *list)
         while ((conn = ecore_list_next(list)))
         {
             e_nms_connection_dump(conn);
-            e_nms_connection_get_settings(conn, cb_nms_connection_settings, NULL);
-            e_nms_connection_secrets_get_secrets(conn, "802-11-wireless-security", NULL, 0, cb_nms_connection_secrets, NULL);
+            e_nms_connection_get_settings(conn, cb_nms_connection_settings, conn);
         }
-        ecore_list_destroy(list);
+        //ecore_list_destroy(list);
     }
     //ecore_main_loop_quit();
+    //e_nms_list_connections(nms, cb_nms_connections, nms);
     return 1;
 }
 
@@ -174,11 +189,11 @@ cb_get_devices(void *data, Ecore_List *list)
             e_nm_device_dump(device);
             if (device->device_type == E_NM_DEVICE_TYPE_WIRELESS)
             {
-		/*
+                /*
                 e_nm_device_wireless_get_access_points(device, cb_access_points, NULL);
                 e_nm_access_point_get(nm, device->wireless.active_access_point, cb_access_point, NULL);
                 e_nm_ip4_config_get(nm, device->ip4_config, cb_ip4_config, NULL);
-		*/
+                */
             }
         }
         //ecore_list_destroy(list);
@@ -188,6 +203,93 @@ cb_get_devices(void *data, Ecore_List *list)
 }
 
 static int
+cb_nms(void *data, E_NMS *reply)
+{
+    Ecore_Hash *settings, *values;
+    E_NM_Variant variant;
+    const char ssid[] = { };
+    const char *bssids[] = { };
+
+    settings = ecore_hash_new(ecore_str_hash, ecore_str_compare);
+    ecore_hash_free_key_cb_set(settings, free);
+    ecore_hash_free_value_cb_set(settings, ECORE_FREE_CB(ecore_hash_destroy));
+    /* connection */
+    values = ecore_hash_new(ecore_str_hash, ecore_str_compare);
+    ecore_hash_free_key_cb_set(values, free);
+    ecore_hash_free_value_cb_set(values, ECORE_FREE_CB(e_nm_variant_free));
+    ecore_hash_set(settings, strdup("connection"), values);
+    memset(&variant, 0, sizeof(E_NM_Variant));
+    variant.type = 't';
+    variant.t = 1228201388;
+    ecore_hash_set(values, strdup("timestamp"), memdup(&variant, sizeof(E_NM_Variant)));
+    memset(&variant, 0, sizeof(E_NM_Variant));
+    variant.type = 's';
+    variant.s = strdup("");
+    ecore_hash_set(values, strdup("id"), memdup(&variant, sizeof(E_NM_Variant)));
+    memset(&variant, 0, sizeof(E_NM_Variant));
+    variant.type = 's';
+    variant.s = strdup("");
+    ecore_hash_set(values, strdup("uuid"), memdup(&variant, sizeof(E_NM_Variant)));
+    memset(&variant, 0, sizeof(E_NM_Variant));
+    variant.type = 's';
+    variant.s = strdup("802-11-wireless");
+    ecore_hash_set(values, strdup("type"), memdup(&variant, sizeof(E_NM_Variant)));
+    memset(&variant, 0, sizeof(E_NM_Variant));
+    variant.type = 'b';
+    variant.b = 0;
+    ecore_hash_set(values, strdup("autoconnect"), memdup(&variant, sizeof(E_NM_Variant)));
+    /* 802-11-wireless */
+    values = ecore_hash_new(ecore_str_hash, ecore_str_compare);
+    ecore_hash_free_key_cb_set(values, free);
+    ecore_hash_free_value_cb_set(values, ECORE_FREE_CB(e_nm_variant_free));
+    ecore_hash_set(settings, strdup("802-11-wireless"), values);
+    memset(&variant, 0, sizeof(E_NM_Variant));
+    variant.type = 's';
+    variant.s = strdup("mode");
+    ecore_hash_set(values, strdup("infrastructure"), memdup(&variant, sizeof(E_NM_Variant)));
+    ecore_hash_set(values, strdup("ssid"), e_nm_variant_array_new('y', ssid, sizeof(ssid) / sizeof(ssid[0])));
+    ecore_hash_set(values, strdup("seen-bssids"), e_nm_variant_array_new('s', bssids, sizeof(bssids) / sizeof(bssids[0])));
+    memset(&variant, 0, sizeof(E_NM_Variant));
+    variant.type = 's';
+    variant.s = strdup("802-11-wireless-security");
+    ecore_hash_set(values, strdup("security"), memdup(&variant, sizeof(E_NM_Variant)));
+    /* ipv4 */
+    values = ecore_hash_new(ecore_str_hash, ecore_str_compare);
+    ecore_hash_free_key_cb_set(values, free);
+    ecore_hash_free_value_cb_set(values, ECORE_FREE_CB(e_nm_variant_free));
+    ecore_hash_set(settings, strdup("ipv4"), values);
+    memset(&variant, 0, sizeof(E_NM_Variant));
+    variant.type = 's';
+    variant.s = strdup("auto");
+    ecore_hash_set(values, strdup("method"), memdup(&variant, sizeof(E_NM_Variant)));
+    /* 802-11-wireless-security */
+    values = ecore_hash_new(ecore_str_hash, ecore_str_compare);
+    ecore_hash_free_key_cb_set(values, free);
+    ecore_hash_free_value_cb_set(values, ECORE_FREE_CB(e_nm_variant_free));
+    ecore_hash_set(settings, strdup("802-11-wireless-security"), values);
+    memset(&variant, 0, sizeof(E_NM_Variant));
+    variant.type = 's';
+    variant.s = strdup("none");
+    ecore_hash_set(values, strdup("key-mgmt"), memdup(&variant, sizeof(E_NM_Variant)));
+    memset(&variant, 0, sizeof(E_NM_Variant));
+    variant.type = 's';
+    variant.s = strdup("open");
+    ecore_hash_set(values, strdup("auth-alg"), memdup(&variant, sizeof(E_NM_Variant)));
+    memset(&variant, 0, sizeof(E_NM_Variant));
+    variant.type = 's';
+    variant.s = strdup("");
+    ecore_hash_set(values, strdup("wep-key0"), memdup(&variant, sizeof(E_NM_Variant)));
+
+    nms = reply;
+    e_nms_dump(nms);
+    //ecore_hash_for_each_node(settings, dump_settings, NULL);
+    //e_nms_system_add_connection(nms, settings);
+    //sleep(1);
+    e_nms_list_connections(nms, cb_nms_connections, nms);
+    return 1;
+}
+
+static int
 cb_nm(void *data, E_NM *reply)
 {
     if (!reply)
@@ -209,9 +311,7 @@ cb_nm(void *data, E_NM *reply)
     /*
     e_nm_get_devices(nm, cb_get_devices, nm);
     */
-    nms = e_nms_get(nm);
-    e_nms_dump(nms);
-    e_nms_list_connections(nms, cb_nms_connections, nms);
+    e_nms_get(nm, E_NMS_CONTEXT_SYSTEM, cb_nms, NULL);
     return 1;
 }
    
diff --git a/src/bin/notify-send.c b/src/bin/notify-send.c
index 76f0f8f..058675b 100644
--- a/src/bin/notify-send.c
+++ b/src/bin/notify-send.c
@@ -27,6 +27,8 @@ usage(void)
          "  -n, --name=NAME                   Specifies the application name to use (default is e-notify-send).\n"
          "  -u, --urgency=LEVEL               Specifies the urgency level (low, normal, critical).\n"
          "  -t, --expire-time=TIME            Specifies the timeout in milliseconds at which to expire the notification.\n"
+         "  -r, --replace=ID                  Specifies the ID of notification to replace.\n"
+         "  -p, --print-id                    Prints the ID of notification to STDOUT.\n"
          "  -i, --icon=ICON                   Specifies an icon filename or stock icon to display.\n"
          "  -c, --category=TYPE               Specifies the notification category.\n"
          "  -v, --version                     Version of the package.\n"
@@ -34,11 +36,45 @@ usage(void)
 }
 
 int
+read_int_arg(long long *result, const char *name, intmax_t min, intmax_t max)
+{
+  char *endptr;
+
+  errno = 0;  
+  *result = strtoll(optarg, &endptr, 10);
+  if ((errno != 0 && *result == 0) || endptr == optarg) 
+    {
+       fprintf(stderr, "Cannot parse integer value '%s' for %s\n", optarg, name);
+       return 0;
+    }
+  else if (*result > max || *result < min)
+    {
+       fprintf(stderr, "Integer value '%s' for %s out of range\n", optarg, name);
+       return 0;
+    }
+
+  return 1;
+}
+
+void 
+send_cb(void *user_data, void *method_return, DBusError *error)
+{
+   E_Notification_Return_Notify *r = method_return;
+
+   if(!r)
+     return;
+
+   printf("%u\n", r->notification_id );
+
+   ecore_main_loop_quit();
+}
+
+int
 main(int argc, char **argv)
 {
   int ch;
-  char *endptr;
-  int timeout;
+  long long value;
+  int print_id = 0;
   E_Notification *n;
 
   e_notification_init();
@@ -52,13 +88,15 @@ main(int argc, char **argv)
       { "name",        required_argument,      NULL,           'n' },
       { "urgency",     required_argument,      NULL,           'u' },
       { "expire-time", required_argument,      NULL,           't' },
+      { "replace",     required_argument,      NULL,           'r' },
+      { "print-id",    no_argument,            NULL,           'p' },
       { "icon",        required_argument,      NULL,           'i' },
-      { "categorie",   required_argument,      NULL,           'c' },
+      { "category",    required_argument,      NULL,           'c' },
       { "version",     no_argument,            NULL,           'v' },
       { NULL,          0,                      NULL,             0 }
   };
 
-  while ((ch = getopt_long(argc, argv, "?vn:u:t:i:c:", longopts, NULL)) != -1)
+  while ((ch = getopt_long(argc, argv, "p?vn:u:t:r:i:c:", longopts, NULL)) != -1)
     switch (ch) {
     case '?':
       usage();
@@ -82,20 +120,16 @@ main(int argc, char **argv)
         printf("Urgency level must be: low, normal or critical\n");
       break;
     case 't':
-      errno = 0;
-      timeout = strtol(optarg, &endptr, 10);
-      if ((errno != 0 && timeout == 0) || endptr == optarg) 
-        {
-          fprintf(stderr, "Cannot parse integer value '%s' for -t\n", optarg);
-          return EXIT_FAILURE;
-        }
-      else if (timeout > INT_MAX || timeout < INT_MIN)
-        {
-          fprintf(stderr, "Integer value '%s' for -t out of range\n", optarg);
-          return EXIT_FAILURE;
-        }
+      if (!read_int_arg(&value, "-t", INT_MIN, INT_MAX))
+        return EXIT_FAILURE;
       else 
-        e_notification_timeout_set(n, timeout);
+        e_notification_timeout_set(n, (int)value);
+      break;
+    case 'r':
+      if (!read_int_arg(&value, "-r", 0, UINT_MAX))
+        return EXIT_FAILURE;
+      else
+           e_notification_replaces_id_set(n, (unsigned int)value);
       break;
     case 'i':
       e_notification_app_icon_set(n, optarg);
@@ -103,6 +137,9 @@ main(int argc, char **argv)
     case 'c':
       e_notification_hint_category_set(n, optarg);
       break;
+    case 'p':
+      print_id = 1;
+      break;
     default:
       usage();
       return EXIT_FAILURE;
@@ -119,7 +156,15 @@ main(int argc, char **argv)
   e_notification_summary_set(n, argv[0]);
   if (argc > 1) e_notification_body_set(n, argv[1]);
 
-  e_notification_send(n, NULL, NULL);
+
+  if (print_id)
+    {
+       e_notification_send(n, send_cb, NULL);
+       ecore_main_loop_begin();
+    }
+  else
+    e_notification_send(n, NULL, NULL);
+
   e_notification_unref(n);
   e_notification_shutdown();
 
diff --git a/src/bin/test.c b/src/bin/test.c
index 31d6149..9b6b7d0 100644
--- a/src/bin/test.c
+++ b/src/bin/test.c
@@ -36,7 +36,7 @@ copy_message(DBusMessageIter *from, DBusMessageIter *to)
         DBusMessageIter fsub, tsub;
         char *sig;
         dbus_message_iter_recurse(from, &fsub);
-        dbus_message_iter_get_signature(&fsub);
+        sig = dbus_message_iter_get_signature(&fsub);
         dbus_message_iter_open_container(to, type, sig, &tsub);
         copy_message(&fsub, &tsub);
         dbus_message_iter_close_container(to, &tsub);
diff --git a/src/lib/dbus/e_dbus.c b/src/lib/dbus/e_dbus.c
index d4bf889..b043090 100644
--- a/src/lib/dbus/e_dbus.c
+++ b/src/lib/dbus/e_dbus.c
@@ -54,7 +54,6 @@ static int
 e_dbus_fd_handler(void *data, Ecore_Fd_Handler *fd_handler)
 {
   E_DBus_Handler_Data *hd;
-  DBusConnection *conn;
   unsigned int condition = 0;
 
   DEBUG(5, "fd handler (%ld)!\n", (long int)fd_handler);
@@ -67,9 +66,6 @@ e_dbus_fd_handler(void *data, Ecore_Fd_Handler *fd_handler)
     hd->fd_handler = NULL;
     return 0;
   }
-
-  conn = hd->cd->conn;
-
   if (ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_READ)) condition |= DBUS_WATCH_READABLE;
   if (ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_WRITE)) condition |= DBUS_WATCH_WRITABLE;
   if (ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_ERROR)) condition |= DBUS_WATCH_ERROR;
@@ -344,9 +340,7 @@ cb_watch_add(DBusWatch *watch, void *data)
 static void
 cb_watch_del(DBusWatch *watch, void *data)
 {
-  E_DBus_Connection *cd;
   E_DBus_Handler_Data *hd;
-  cd = data;
 
   DEBUG(5, "cb_watch_del\n");
   hd = (E_DBus_Handler_Data *)dbus_watch_get_data(watch);
diff --git a/src/lib/dbus/e_dbus_signal.c b/src/lib/dbus/e_dbus_signal.c
index 16e342b..d3deda4 100644
--- a/src/lib/dbus/e_dbus_signal.c
+++ b/src/lib/dbus/e_dbus_signal.c
@@ -7,8 +7,6 @@
 #include "e_dbus_private.h"
 #include "dbus/dbus.h"
 
-static int init = 0;
-
 struct E_DBus_Signal_Handler
 {
   char *sender;
@@ -45,10 +43,8 @@ cb_name_owner(void *data, DBusMessage *msg, DBusError *err)
 {
   const char *unique_name = NULL;
   struct cb_name_owner_data *d = data;
-  E_DBus_Connection *conn;
   E_DBus_Signal_Handler *sh;
 
-  conn = d->conn;
   sh = d->sh;
   free(d);
 
diff --git a/src/lib/hal/E_Hal.h b/src/lib/hal/E_Hal.h
index 00dea4e..7fabb01 100644
--- a/src/lib/hal/E_Hal.h
+++ b/src/lib/hal/E_Hal.h
@@ -83,7 +83,7 @@ struct E_Hal_Property
 
 struct E_Hal_Properties
 {
-  Ecore_Hash *properties;
+  Eina_Hash *properties;
 };
 
 typedef struct E_Hal_Properties E_Hal_Device_Get_All_Properties_Return;
diff --git a/src/lib/hal/e_hal_device.c b/src/lib/hal/e_hal_device.c
index 480132b..b2447dc 100644
--- a/src/lib/hal/e_hal_device.c
+++ b/src/lib/hal/e_hal_device.c
@@ -88,10 +88,7 @@ unmarshal_device_get_all_properties(DBusMessage *msg, DBusError *err)
     return NULL;
   }
 
-  ret->properties = ecore_hash_new(ecore_str_hash, ecore_str_compare);
-  ecore_hash_free_key_cb_set(ret->properties, ECORE_FREE_CB(eina_stringshare_del));
-  ecore_hash_free_value_cb_set(ret->properties, ECORE_FREE_CB(e_hal_property_free));
-
+  ret->properties = eina_hash_string_small_new(EINA_FREE_CB(e_hal_property_free));
 
   dbus_message_iter_init(msg, &iter);
   dbus_message_iter_recurse(&iter, &a_iter);
@@ -145,7 +142,7 @@ unmarshal_device_get_all_properties(DBusMessage *msg, DBusError *err)
         printf("Error: unexpected property type (%s): %c\n", name, dbus_message_iter_get_arg_type(&v_iter));
         break;
     }
-    ecore_hash_set(ret->properties, (void *)eina_stringshare_add(name), prop);
+    eina_hash_add(ret->properties, name, prop);
 
     dbus_message_iter_next(&a_iter);
   }
@@ -159,7 +156,7 @@ free_device_get_all_properties(void *data)
   E_Hal_Device_Get_All_Properties_Return *ret = data;
 
   if (!ret) return;
-  ecore_hash_destroy(ret->properties);
+  eina_hash_free(ret->properties);
   free(ret);
 }
 
diff --git a/src/lib/hal/e_hal_util.c b/src/lib/hal/e_hal_util.c
index cf10126..8714292 100644
--- a/src/lib/hal/e_hal_util.c
+++ b/src/lib/hal/e_hal_util.c
@@ -26,7 +26,7 @@ e_hal_property_string_get(E_Hal_Properties *properties, const char *key, int *er
   E_Hal_Property *prop;
   if (err) *err = 0;
   if (!properties->properties) return NULL;
-  prop = ecore_hash_get(properties->properties, key);
+  prop = eina_hash_find(properties->properties, key);
   if (prop) return strdup(prop->val.s);
 
   if (err) *err = 1;
@@ -39,7 +39,7 @@ e_hal_property_bool_get(E_Hal_Properties *properties, const char *key, int *err)
   E_Hal_Property *prop;
   if (err) *err = 0;
   if (!properties->properties) return 0;
-  prop = ecore_hash_get(properties->properties, key);
+  prop = eina_hash_find(properties->properties, key);
   if (prop) return prop->val.b;
   
   if (err) *err = 1;
@@ -52,7 +52,7 @@ e_hal_property_int_get(E_Hal_Properties *properties, const char *key, int *err)
   E_Hal_Property *prop;
   if (err) *err = 0;
   if (!properties->properties) return 0;
-  prop = ecore_hash_get(properties->properties, key);
+  prop = eina_hash_find(properties->properties, key);
   if (prop) return prop->val.i;
 
   if (err) *err = 1;
@@ -65,7 +65,7 @@ e_hal_property_uint64_get(E_Hal_Properties *properties, const char *key, int *er
   E_Hal_Property *prop;
   if (err) *err = 0;
   if (!properties->properties) return 0;
-  prop = ecore_hash_get(properties->properties, key);
+  prop = eina_hash_find(properties->properties, key);
   if (prop) return prop->val.u64;
 
   if (err) *err = 1;
@@ -78,7 +78,7 @@ e_hal_property_double_get(E_Hal_Properties *properties, const char *key, int *er
   E_Hal_Property *prop;
   if (err) *err = 0;
   if (!properties->properties) return 0;
-  prop = ecore_hash_get(properties->properties, key);
+  prop = eina_hash_find(properties->properties, key);
   if (prop) return prop->val.d;
 
   if (err) *err = 1;
@@ -91,7 +91,7 @@ e_hal_property_strlist_get(E_Hal_Properties *properties, const char *key, int *e
   E_Hal_Property *prop;
   if (err) *err = 0;
   if (!properties->properties) return NULL;
-  prop = ecore_hash_get(properties->properties, key);
+  prop = eina_hash_find(properties->properties, key);
   if (prop) return prop->val.strlist;
 
   if (err) *err = 1;
diff --git a/src/lib/nm/E_Nm.h b/src/lib/nm/E_Nm.h
index c625b15..4cfaeda 100644
--- a/src/lib/nm/E_Nm.h
+++ b/src/lib/nm/E_Nm.h
@@ -9,6 +9,7 @@
  * - Return objects instead of object paths.
  * - Define who is responsible to clean up mem
  * - Only listen to signals if a callback is connected
+ * - Free properties on property changed
  */
 
 #ifdef EAPI
@@ -232,8 +233,20 @@ struct E_NM_IP4_Config
 
 /* TODO typedef struct E_NM_DHCP4_Config E_NM_DHCP4_Config; */
 
+typedef enum E_NMS_Context E_NMS_Context;
+enum E_NMS_Context
+{
+  E_NMS_CONTEXT_SYSTEM
+  /* TODO: E_NMS_CONTEXT_USER */
+};
+
 typedef struct E_NMS E_NMS;
-/* No properties */
+struct E_NMS
+{
+  const char *service_name;
+  Ecore_List *unmanaged_devices; /* object_path */
+  char       *hostname;
+};
 
 typedef struct E_NMS_Connection E_NMS_Connection;
 struct E_NMS_Connection
@@ -333,16 +346,20 @@ extern "C" {
    /* TODO: org.freedesktop.NetworkManager.DHCP4Config api */
 
    /* org.freedesktop.NetworkManagerSettings api */
-   EAPI E_NMS *e_nms_get(E_NM *nm);
+   EAPI int    e_nms_get(E_NM *nm, E_NMS_Context context, int (*cb_func)(void *data, E_NMS *nms), void *data);
    EAPI void   e_nms_free(E_NMS *nms);
    EAPI void   e_nms_dump(E_NMS *nms);
    EAPI int    e_nms_list_connections(E_NMS *nms,
                                       int (*cb_func)(void *data, Ecore_List *list),
                                       void *data);
 
-   EAPI void  e_nms_callback_new_connection_set(E_NMS *nms, int (*cb_func)(E_NMS *nms, const char *service_name, const char *connection));
+   EAPI void   e_nms_callback_new_connection_set(E_NMS *nms, int (*cb_func)(E_NMS *nms, const char *service_name, const char *connection));
+
+   /* org.freedesktop.NetworkManagerSettings.System */
+   EAPI int    e_nms_system_save_hostname(E_NMS *nms, const char *hostname);
+   EAPI int    e_nms_system_add_connection(E_NMS *nms, Ecore_Hash *settings);
 
-   /* TODO: org.freedesktop.NetworkManagerSettings.System */
+   EAPI void   e_nms_system_callback_properties_changed_set(E_NMS *nms, int (*cb_func)(E_NMS *nms));
 
    /* org.freedesktop.NetworkManagerSettings.Connection(.*) api */
    EAPI E_NMS_Connection *e_nms_connection_get(E_NMS *nms, const char *service_name, const char *connection);
@@ -351,10 +368,9 @@ extern "C" {
 
    /* TODO: e_nms_connection_update */
    /* TODO: e_nms_connection_delete */
-   EAPI int  e_nms_connection_get_settings(E_NMS_Connection *conn, int (*cb_func)(void *data, Ecore_Hash *settings), void *data);
-   EAPI int  e_nms_connection_secrets_get_secrets(E_NMS_Connection *connection, const char *setting_name, Ecore_List *hints, int request_new, int (*cb_func)(void *data, Ecore_Hash *secrets), void *data);
 
-   /* TODO: e_nms_connection_secrets_get_secrets */
+   EAPI int  e_nms_connection_get_settings(E_NMS_Connection *conn, int (*cb_func)(void *data, Eina_Hash *settings), void *data);
+   EAPI int  e_nms_connection_secrets_get_secrets(E_NMS_Connection *connection, const char *setting_name, Ecore_List *hints, int request_new, int (*cb_func)(void *data, Eina_Hash *secrets), void *data);
 
    EAPI void  e_nms_connection_callback_updated_set(E_NMS_Connection *connection, int (*cb_func)(E_NMS_Connection *conn, Ecore_Hash *settings));
    /* TODO: e_nms_connection_callback_removed_set */
@@ -369,6 +385,10 @@ extern "C" {
    /* TODO: org.freedesktop.NetworkManager.VPN.Connection api */
    /* TODO: org.freedesktop.NetworkManager.VPN.Plugin api */
 
+   EAPI E_NM_Variant *e_nm_variant_new(int type, const void *value);
+   EAPI E_NM_Variant *e_nm_variant_array_new(int type, const void *value, int size);
+   EAPI void          e_nm_variant_free(E_NM_Variant *variant);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/src/lib/nm/Makefile.am b/src/lib/nm/Makefile.am
index b0030fb..c2b6681 100644
--- a/src/lib/nm/Makefile.am
+++ b/src/lib/nm/Makefile.am
@@ -19,6 +19,7 @@ e_nm_ip4_config.c \
 e_nms.c \
 e_nms_connection.c \
 e_nm_active_connection.c \
+e_nm_variant.c \
 e_nm_util.c
 
 
diff --git a/src/lib/nm/Makefile.in b/src/lib/nm/Makefile.in
index 02624fd..da1d50a 100644
--- a/src/lib/nm/Makefile.in
+++ b/src/lib/nm/Makefile.in
@@ -54,12 +54,13 @@ libLTLIBRARIES_INSTALL = $(INSTALL)
 LTLIBRARIES = $(lib_LTLIBRARIES)
 am__libenm_la_SOURCES_DIST = e_nm_private.h e_nm.c e_nm_manager.c \
 	e_nm_access_point.c e_nm_device.c e_nm_ip4_config.c e_nms.c \
-	e_nms_connection.c e_nm_active_connection.c e_nm_util.c
+	e_nms_connection.c e_nm_active_connection.c e_nm_variant.c \
+	e_nm_util.c
 @BUILD_ENM_TRUE at am_libenm_la_OBJECTS = e_nm.lo e_nm_manager.lo \
 @BUILD_ENM_TRUE@	e_nm_access_point.lo e_nm_device.lo \
 @BUILD_ENM_TRUE@	e_nm_ip4_config.lo e_nms.lo \
 @BUILD_ENM_TRUE@	e_nms_connection.lo e_nm_active_connection.lo \
- at BUILD_ENM_TRUE@	e_nm_util.lo
+ at BUILD_ENM_TRUE@	e_nm_variant.lo e_nm_util.lo
 libenm_la_OBJECTS = $(am_libenm_la_OBJECTS)
 libenm_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
 	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
@@ -212,6 +213,7 @@ AM_CPPFLAGS = \
 @BUILD_ENM_TRUE at e_nms.c \
 @BUILD_ENM_TRUE at e_nms_connection.c \
 @BUILD_ENM_TRUE at e_nm_active_connection.c \
+ at BUILD_ENM_TRUE@e_nm_variant.c \
 @BUILD_ENM_TRUE at e_nm_util.c
 
 @BUILD_ENM_TRUE at libenm_la_LIBADD = \
@@ -299,6 +301,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/e_nm_ip4_config.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/e_nm_manager.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/e_nm_util.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/e_nm_variant.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/e_nms.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/e_nms_connection.Plo at am__quote@
 
diff --git a/src/lib/nm/e_nm.c b/src/lib/nm/e_nm.c
index 7672151..d8aa678 100644
--- a/src/lib/nm/e_nm.c
+++ b/src/lib/nm/e_nm.c
@@ -102,7 +102,9 @@ e_nm_get(int (*cb_func)(void *data, E_NM *nm), void *data)
   d->cb_func = OBJECT_CB(cb_func);
   d->data = data;
   d->property = properties;
+  d->service = E_NM_SERVICE;
   d->object = strdup(E_NM_PATH);
+  d->interface = E_NM_INTERFACE;
   d->reply = nmi;
 
   nmi->conn = e_dbus_bus_get(DBUS_BUS_SYSTEM);
@@ -113,7 +115,7 @@ e_nm_get(int (*cb_func)(void *data, E_NM *nm), void *data)
   ecore_list_append(nmi->handlers, e_nm_signal_handler_add(nmi->conn, "DeviceAdded", cb_device_added, nmi));
   ecore_list_append(nmi->handlers, e_nm_signal_handler_add(nmi->conn, "DeviceRemoved", cb_device_removed, nmi));
 
-  return e_nm_device_properties_get(nmi->conn, d->object, d->property->name, property, d) ? 1 : 0;
+  return property_get(nmi->conn, d);
 
 error:
   if (d) free(d);
diff --git a/src/lib/nm/e_nm_access_point.c b/src/lib/nm/e_nm_access_point.c
index e1e333b..d4d40f6 100644
--- a/src/lib/nm/e_nm_access_point.c
+++ b/src/lib/nm/e_nm_access_point.c
@@ -50,12 +50,14 @@ e_nm_access_point_get(E_NM *nm, const char *access_point,
   d->data = data;
   d->reply = ap;
   d->property = access_point_properties;
+  d->service = E_NM_SERVICE;
   d->object = strdup(access_point);
+  d->interface = E_NM_INTERFACE_ACCESSPOINT;
 
   ap->handlers = ecore_list_new();
   ecore_list_append(ap->handlers, e_nm_access_point_signal_handler_add(nmi->conn, access_point, "PropertiesChanged", cb_properties_changed, ap));
  
-  return e_nm_access_point_properties_get(nmi->conn, d->object, d->property->name, property, d) ? 1 : 0;
+  return property_get(nmi->conn, d);
 }
 
 EAPI void
diff --git a/src/lib/nm/e_nm_active_connection.c b/src/lib/nm/e_nm_active_connection.c
index cd2592e..aacf293 100644
--- a/src/lib/nm/e_nm_active_connection.c
+++ b/src/lib/nm/e_nm_active_connection.c
@@ -33,9 +33,11 @@ e_nm_active_connection_get(E_NM *nm, const char *connection,
   d->data = data;
   d->reply = conn;
   d->property = active_connection_properties;
+  d->service = E_NM_SERVICE;
   d->object = strdup(connection);
+  d->interface = E_NM_INTERFACE_CONNECTION_ACTIVE;
 
-  return e_nm_active_connection_properties_get(nmi->conn, d->object, d->property->name, property, d) ? 1 : 0;
+  return property_get(nmi->conn, d);
 }
 
 EAPI void
diff --git a/src/lib/nm/e_nm_device.c b/src/lib/nm/e_nm_device.c
index cfcd8ea..66d5743 100644
--- a/src/lib/nm/e_nm_device.c
+++ b/src/lib/nm/e_nm_device.c
@@ -166,15 +166,17 @@ property_device_type(Property_Data *data, DBusMessageIter *iter)
   {
     case E_NM_DEVICE_TYPE_WIRED:
       data->property = device_wired_properties;
+      data->interface = E_NM_INTERFACE_DEVICE_WIRED;
       ecore_list_append(dev->handlers, e_nm_device_wired_signal_handler_add(data->nmi->conn, dev->dev.udi, "PropertiesChanged", cb_wired_properties_changed, dev));
-      e_nm_device_wired_properties_get(data->nmi->conn, data->object, data->property->name, property, data);
+      property_get(data->nmi->conn, data);
       break;
     case E_NM_DEVICE_TYPE_WIRELESS:
       data->property = device_wireless_properties;
+      data->interface = E_NM_INTERFACE_DEVICE_WIRELESS;
       ecore_list_append(dev->handlers, e_nm_device_wireless_signal_handler_add(data->nmi->conn, dev->dev.udi, "PropertiesChanged", cb_wireless_properties_changed, dev));
       ecore_list_append(dev->handlers, e_nm_device_wireless_signal_handler_add(data->nmi->conn, dev->dev.udi, "AccessPointAdded", cb_wireless_access_point_added, dev));
       ecore_list_append(dev->handlers, e_nm_device_wireless_signal_handler_add(data->nmi->conn, dev->dev.udi, "AccessPointRemoved", cb_wireless_access_point_removed, dev));
-      e_nm_device_wireless_properties_get(data->nmi->conn, data->object, data->property->name, property, data);
+      property_get(data->nmi->conn, data);
       break;
     default:
       if (data->cb_func) data->cb_func(data->data, dev);
@@ -245,14 +247,11 @@ cb_access_points(void *data, void *reply, DBusError *err)
   list = ecore_list_new();
   ecore_list_free_cb_set(list, ECORE_FREE_CB(e_nm_access_point_free));
   d->reply = list;
-  ecore_list_append(list, (void *)-1);
   while ((ap = ecore_list_next(access_points)))
   {
     ecore_list_prepend(list, (void *)-1);
     e_nm_access_point_get(&(dev->nmi->nm), ap, cb_access_point, d);
   }
-  ecore_list_first_remove(list);
-  check_done(d, list);
 }
 
 EAPI int
@@ -273,13 +272,15 @@ e_nm_device_get(E_NM *nm, const char *device,
   d->data = data;
   d->reply = dev;
   d->property = device_properties;
+  d->service = E_NM_SERVICE;
   d->object = strdup(device);
+  d->interface = E_NM_INTERFACE_DEVICE;
 
   dev->handlers = ecore_list_new();
   ecore_list_append(dev->handlers, e_nm_device_signal_handler_add(nmi->conn, device, "StateChanged", cb_state_changed, dev));
   ecore_list_append(dev->handlers, e_nm_device_signal_handler_add(nmi->conn, device, "PropertiesChanged", cb_properties_changed, dev));
  
-  return e_nm_device_properties_get(nmi->conn, d->object, d->property->name, property, d) ? 1 : 0;
+  return property_get(nmi->conn, d);
 }
 
 EAPI void
diff --git a/src/lib/nm/e_nm_ip4_config.c b/src/lib/nm/e_nm_ip4_config.c
index 0ed424a..382175b 100644
--- a/src/lib/nm/e_nm_ip4_config.c
+++ b/src/lib/nm/e_nm_ip4_config.c
@@ -31,9 +31,11 @@ e_nm_ip4_config_get(E_NM *nm, const char *ip4_config,
   d->data = data;
   d->reply = config;
   d->property = ip4_config_properties;
+  d->service = E_NM_SERVICE;
   d->object = strdup(ip4_config);
+  d->interface = E_NM_INTERFACE_IP4CONFIG;
 
-  return e_nm_ip4_config_properties_get(nmi->conn, d->object, d->property->name, property, d) ? 1 : 0;
+  return property_get(nmi->conn, d);
 }
 
 EAPI void
diff --git a/src/lib/nm/e_nm_manager.c b/src/lib/nm/e_nm_manager.c
index 211af5c..db237de 100644
--- a/src/lib/nm/e_nm_manager.c
+++ b/src/lib/nm/e_nm_manager.c
@@ -57,14 +57,11 @@ cb_nm_devices(void *data, void *reply, DBusError *err)
   list = ecore_list_new();
   ecore_list_free_cb_set(list, ECORE_FREE_CB(e_nm_device_free));
   d->reply = list;
-  ecore_list_append(list, (void *)-1);
   while ((dev = ecore_list_next(devices)))
   {
     ecore_list_prepend(list, (void *)-1);
     e_nm_device_get(nm, dev, cb_nm_device, d);
   }
-  ecore_list_first_remove(list);
-  check_done(d, list);
 }
 
 /**
diff --git a/src/lib/nm/e_nm_private.h b/src/lib/nm/e_nm_private.h
index 99279b3..53224a0 100644
--- a/src/lib/nm/e_nm_private.h
+++ b/src/lib/nm/e_nm_private.h
@@ -2,44 +2,40 @@
 #define E_NM_PRIVATE_H
 
 #define E_NM_PATH "/org/freedesktop/NetworkManager"
-#define _E_NM_SERVICE "org.freedesktop.NetworkManager"
-#define _E_NM_INTERFACE "org.freedesktop.NetworkManager"
-#define _E_NM_INTERFACE_ACCESSPOINT "org.freedesktop.NetworkManager.AccessPoint"
-#define _E_NM_INTERFACE_DEVICE "org.freedesktop.NetworkManager.Device"
-#define _E_NM_INTERFACE_DEVICE_WIRELESS "org.freedesktop.NetworkManager.Device.Wireless"
-#define _E_NM_INTERFACE_DEVICE_WIRED "org.freedesktop.NetworkManager.Device.Wired"
-#define _E_NM_INTERFACE_IP4CONFIG "org.freedesktop.NetworkManager.IP4Config"
-#define _E_NM_INTERFACE_CONNECTION_ACTIVE "org.freedesktop.NetworkManager.Connection.Active"
-#define _E_NMS_PATH "/org/freedesktop/NetworkManagerSettings"
+#define E_NM_SERVICE "org.freedesktop.NetworkManager"
+#define E_NM_INTERFACE "org.freedesktop.NetworkManager"
+#define E_NM_INTERFACE_ACCESSPOINT "org.freedesktop.NetworkManager.AccessPoint"
+#define E_NM_INTERFACE_DEVICE "org.freedesktop.NetworkManager.Device"
+#define E_NM_INTERFACE_DEVICE_WIRELESS "org.freedesktop.NetworkManager.Device.Wireless"
+#define E_NM_INTERFACE_DEVICE_WIRED "org.freedesktop.NetworkManager.Device.Wired"
+#define E_NM_INTERFACE_IP4CONFIG "org.freedesktop.NetworkManager.IP4Config"
+#define E_NM_INTERFACE_CONNECTION_ACTIVE "org.freedesktop.NetworkManager.Connection.Active"
+#define E_NMS_PATH "/org/freedesktop/NetworkManagerSettings"
 #define E_NMS_SERVICE_SYSTEM "org.freedesktop.NetworkManagerSystemSettings"
 #define E_NMS_SERVICE_USER "org.freedesktop.NetworkManagerUserSettings"
-#define _E_NMS_INTERFACE "org.freedesktop.NetworkManagerSettings"
-#define _E_NMS_INTERFACE_CONNECTION "org.freedesktop.NetworkManagerSettings.Connection"
-#define _E_NMS_INTERFACE_CONNECTION_SECRETS "org.freedesktop.NetworkManagerSettings.Connection.Secrets"
-
-#define e_nm_call_new(member) dbus_message_new_method_call(_E_NM_SERVICE, E_NM_PATH, _E_NM_INTERFACE, member)
-#define e_nm_device_wireless_call_new(device, member) dbus_message_new_method_call(_E_NM_SERVICE, device, _E_NM_INTERFACE_DEVICE_WIRELESS, member)
-#define e_nms_call_new(service, member) dbus_message_new_method_call(service, _E_NMS_PATH, _E_NMS_INTERFACE, member)
-#define e_nms_connection_call_new(service, conn, member) dbus_message_new_method_call(service, conn, _E_NMS_INTERFACE_CONNECTION, member)
-#define e_nms_connection_secrets_call_new(service, conn, member) dbus_message_new_method_call(service, conn, _E_NMS_INTERFACE_CONNECTION_SECRETS, member)
-
-#define e_nm_properties_get(con, prop, cb, data) e_dbus_properties_get(con, _E_NM_SERVICE, E_NM_PATH, _E_NM_INTERFACE, prop, (E_DBus_Method_Return_Cb) cb, data)
-#define e_nm_properties_set(con, prop, type, value, cb, data) e_dbus_properties_set(con, _E_NM_SERVICE, E_NM_PATH, _E_NM_INTERFACE, prop, type, value, (E_DBus_Method_Return_Cb) cb, data)
-#define e_nm_access_point_properties_get(con, dev, prop, cb, data) e_dbus_properties_get(con, _E_NM_SERVICE, dev, _E_NM_INTERFACE_ACCESSPOINT, prop, (E_DBus_Method_Return_Cb) cb, data)
-#define e_nm_device_properties_get(con, dev, prop, cb, data) e_dbus_properties_get(con, _E_NM_SERVICE, dev, _E_NM_INTERFACE_DEVICE, prop, (E_DBus_Method_Return_Cb) cb, data)
-#define e_nm_device_wired_properties_get(con, dev, prop, cb, data) e_dbus_properties_get(con, _E_NM_SERVICE, dev, _E_NM_INTERFACE_DEVICE_WIRED, prop, (E_DBus_Method_Return_Cb) cb, data)
-#define e_nm_device_wireless_properties_get(con, dev, prop, cb, data) e_dbus_properties_get(con, _E_NM_SERVICE, dev, _E_NM_INTERFACE_DEVICE_WIRELESS, prop, (E_DBus_Method_Return_Cb) cb, data)
-#define e_nm_ip4_config_properties_get(con, dev, prop, cb, data) e_dbus_properties_get(con, _E_NM_SERVICE, dev, _E_NM_INTERFACE_IP4CONFIG, prop, (E_DBus_Method_Return_Cb) cb, data)
-#define e_nm_active_connection_properties_get(con, dev, prop, cb, data) e_dbus_properties_get(con, _E_NM_SERVICE, dev, _E_NM_INTERFACE_CONNECTION_ACTIVE, prop, (E_DBus_Method_Return_Cb) cb, data)
-
-#define e_nm_signal_handler_add(con, sig, cb, data) e_dbus_signal_handler_add(con, _E_NM_SERVICE, E_NM_PATH, _E_NM_INTERFACE, sig, cb, data)
-#define e_nm_access_point_signal_handler_add(con, dev, sig, cb, data) e_dbus_signal_handler_add(con, _E_NM_SERVICE, dev, _E_NM_INTERFACE_ACCESSPOINT, sig, cb, data)
-#define e_nm_device_signal_handler_add(con, dev, sig, cb, data) e_dbus_signal_handler_add(con, _E_NM_SERVICE, dev, _E_NM_INTERFACE_DEVICE, sig, cb, data)
-#define e_nm_device_wired_signal_handler_add(con, dev, sig, cb, data) e_dbus_signal_handler_add(con, _E_NM_SERVICE, dev, _E_NM_INTERFACE_DEVICE_WIRED, sig, cb, data)
-#define e_nm_device_wireless_signal_handler_add(con, dev, sig, cb, data) e_dbus_signal_handler_add(con, _E_NM_SERVICE, dev, _E_NM_INTERFACE_DEVICE_WIRELESS, sig, cb, data)
-
-#define e_nms_signal_handler_add(con, service, sig, cb, data) e_dbus_signal_handler_add(con, service, _E_NMS_PATH, _E_NMS_INTERFACE, sig, cb, data)
-#define e_nms_connection_signal_handler_add(con, service, dev, sig, cb, data) e_dbus_signal_handler_add(con, service, dev, _E_NMS_INTERFACE, sig, cb, data)
+#define E_NMS_INTERFACE "org.freedesktop.NetworkManagerSettings"
+#define E_NMS_INTERFACE_SYSTEM "org.freedesktop.NetworkManagerSettings.System"
+#define E_NMS_INTERFACE_CONNECTION "org.freedesktop.NetworkManagerSettings.Connection"
+#define E_NMS_INTERFACE_CONNECTION_SECRETS "org.freedesktop.NetworkManagerSettings.Connection.Secrets"
+
+#define e_nm_call_new(member) dbus_message_new_method_call(E_NM_SERVICE, E_NM_PATH, E_NM_INTERFACE, member)
+#define e_nm_device_wireless_call_new(device, member) dbus_message_new_method_call(E_NM_SERVICE, device, E_NM_INTERFACE_DEVICE_WIRELESS, member)
+#define e_nms_call_new(service, member) dbus_message_new_method_call(service, E_NMS_PATH, E_NMS_INTERFACE, member)
+#define e_nms_system_call_new(service, member) dbus_message_new_method_call(service, E_NMS_PATH, E_NMS_INTERFACE_SYSTEM, member)
+#define e_nms_connection_call_new(service, conn, member) dbus_message_new_method_call(service, conn, E_NMS_INTERFACE_CONNECTION, member)
+#define e_nms_connection_secrets_call_new(service, conn, member) dbus_message_new_method_call(service, conn, E_NMS_INTERFACE_CONNECTION_SECRETS, member)
+
+#define e_nm_properties_set(con, prop, type, value, cb, data) e_dbus_properties_set(con, E_NM_SERVICE, E_NM_PATH, E_NM_INTERFACE, prop, type, value, (E_DBus_Method_Return_Cb) cb, data)
+
+#define e_nm_signal_handler_add(con, sig, cb, data) e_dbus_signal_handler_add(con, E_NM_SERVICE, E_NM_PATH, E_NM_INTERFACE, sig, cb, data)
+#define e_nm_access_point_signal_handler_add(con, dev, sig, cb, data) e_dbus_signal_handler_add(con, E_NM_SERVICE, dev, E_NM_INTERFACE_ACCESSPOINT, sig, cb, data)
+#define e_nm_device_signal_handler_add(con, dev, sig, cb, data) e_dbus_signal_handler_add(con, E_NM_SERVICE, dev, E_NM_INTERFACE_DEVICE, sig, cb, data)
+#define e_nm_device_wired_signal_handler_add(con, dev, sig, cb, data) e_dbus_signal_handler_add(con, E_NM_SERVICE, dev, E_NM_INTERFACE_DEVICE_WIRED, sig, cb, data)
+#define e_nm_device_wireless_signal_handler_add(con, dev, sig, cb, data) e_dbus_signal_handler_add(con, E_NM_SERVICE, dev, E_NM_INTERFACE_DEVICE_WIRELESS, sig, cb, data)
+
+#define e_nms_signal_handler_add(con, service, sig, cb, data) e_dbus_signal_handler_add(con, service, E_NMS_PATH, E_NMS_INTERFACE, sig, cb, data)
+#define e_nms_system_signal_handler_add(con, service, sig, cb, data) e_dbus_signal_handler_add(con, service, E_NMS_PATH, E_NMS_INTERFACE_SYSTEM, sig, cb, data)
+#define e_nms_connection_signal_handler_add(con, service, dev, sig, cb, data) e_dbus_signal_handler_add(con, service, dev, E_NMS_INTERFACE_CONNECTION, sig, cb, data)
 
 typedef struct E_NM_Internal E_NM_Internal;
 struct E_NM_Internal
@@ -98,9 +94,12 @@ struct E_NM_IP4_Config_Internal
 typedef struct E_NMS_Internal E_NMS_Internal;
 struct E_NMS_Internal
 {
+  E_NMS nms;
+
   E_NM_Internal *nmi;
 
   int  (*new_connection)(E_NMS *nms, const char *service_name, const char *connection);
+  int  (*properties_changed)(E_NMS *nms);
   Ecore_List *handlers;
 
   void *data;
@@ -143,7 +142,9 @@ struct Property
 struct Property_Data
 {
   E_NM_Internal   *nmi;
+  const char      *service;
   char            *object;
+  const char      *interface;
   Object_Cb        cb_func;
   void            *reply;
   void            *data;
@@ -160,6 +161,7 @@ struct Reply_Data
   void  *reply;
 };
 
+int   property_get(E_DBus_Connection *conn, Property_Data *data);
 void  property(void *data, DBusMessage *msg, DBusError *err);
 void  parse_properties(void *data, const Property *properties, DBusMessage *msg);
 
diff --git a/src/lib/nm/e_nm_util.c b/src/lib/nm/e_nm_util.c
index 8b3f7e7..401de34 100644
--- a/src/lib/nm/e_nm_util.c
+++ b/src/lib/nm/e_nm_util.c
@@ -221,6 +221,13 @@ property_free(E_NM_Variant *var)
   free(var);
 }
 
+int
+property_get(E_DBus_Connection *conn, Property_Data *data)
+
+{
+  return e_dbus_properties_get(conn, data->service, data->object, data->interface, data->property->name, property, data) ? 1 : 0;
+}
+
 void
 property(void *data, DBusMessage *msg, DBusError *err)
 {
@@ -250,7 +257,7 @@ property(void *data, DBusMessage *msg, DBusError *err)
 
   d->property++;
   if (d->property->name)
-    e_nm_device_properties_get(d->nmi->conn, d->object, d->property->name, property, d);
+    e_dbus_properties_get(d->nmi->conn, d->service, d->object, d->interface, d->property->name, property, d);
   else
   {
     if (d->cb_func) d->cb_func(d->data, d->reply);
@@ -448,23 +455,21 @@ free_nm_object_path_list(void *data)
 Ecore_Hash *
 parse_settings(DBusMessage *msg)
 {
-  Ecore_Hash *settings;
+  Eina_Hash *settings;
   DBusMessageIter iter, a_iter;
 
   if (!dbus_message_has_signature(msg, "a{sa{sv}}")) return NULL;
 
   dbus_message_iter_init(msg, &iter);
 
-  settings = ecore_hash_new(ecore_str_hash, ecore_str_compare);
-  ecore_hash_free_key_cb_set(settings, free);
-  ecore_hash_free_value_cb_set(settings, ECORE_FREE_CB(ecore_hash_destroy));
+  settings = eina_hash_string_small_new(EINA_FREE_CB(eina_hash_free));
   dbus_message_iter_recurse(&iter, &a_iter);
   while (dbus_message_iter_get_arg_type(&a_iter) != DBUS_TYPE_INVALID)
   {
     DBusMessageIter  d_iter, a2_iter;
     E_NM_Variant   *prop;
     const char      *name;
-    Ecore_Hash      *value;
+    Eina_Hash      *value;
 
     dbus_message_iter_recurse(&a_iter, &d_iter);
     if (!check_arg_type(&d_iter, 's')) goto error;
@@ -474,10 +479,8 @@ parse_settings(DBusMessage *msg)
     if (!check_arg_type(&d_iter, 'a')) goto error;
     dbus_message_iter_recurse(&d_iter, &a2_iter);
 
-    value = ecore_hash_new(ecore_str_hash, ecore_str_compare);
-    ecore_hash_free_key_cb_set(value, free);
-    ecore_hash_free_value_cb_set(value, ECORE_FREE_CB(property_free));
-    ecore_hash_set(settings, strdup(name), value);
+    value = eina_hash_string_small_new(EINA_FREE_CB(property_free));
+    eina_hash_add(settings, name, value);
     while (dbus_message_iter_get_arg_type(&a2_iter) != DBUS_TYPE_INVALID)
     {
       dbus_message_iter_recurse(&a2_iter, &d_iter);
@@ -486,7 +489,7 @@ parse_settings(DBusMessage *msg)
       dbus_message_iter_next(&d_iter);
       if (!check_arg_type(&d_iter, 'v')) goto error;
       prop = property_variant(&d_iter, NULL, NULL);
-      if (prop) ecore_hash_set(value, strdup(name), prop);
+      if (prop) eina_hash_add(value, name, prop);
       dbus_message_iter_next(&a2_iter);
     }
 
@@ -495,7 +498,7 @@ parse_settings(DBusMessage *msg)
 
   return settings;
 error:
-  ecore_hash_destroy(settings);
+  eina_hash_free(settings);
   return NULL;
 }
 
@@ -527,3 +530,4 @@ ip4_address2str(unsigned int address)
            ((address >> 24) & 0xff));
   return buf;
 }
+
diff --git a/src/lib/nm/e_nm_variant.c b/src/lib/nm/e_nm_variant.c
new file mode 100644
index 0000000..84a541f
--- /dev/null
+++ b/src/lib/nm/e_nm_variant.c
@@ -0,0 +1,64 @@
+#include <string.h>
+
+#include <E_Nm.h>
+
+EAPI E_NM_Variant *
+e_nm_variant_new(int type, const void *value)
+{
+  E_NM_Variant *variant = NULL;
+
+  switch (type)
+  {
+    case 's':
+    case 'o':
+      variant = malloc(sizeof(E_NM_Variant));
+      variant->type = type;
+      variant->s = strdup(*(char **)value);
+      break;
+    case 'u':
+      variant = malloc(sizeof(E_NM_Variant));
+      variant->type = type;
+      variant->u = *(unsigned int *)value;
+      break;
+    case 'b':
+      variant = malloc(sizeof(E_NM_Variant));
+      variant->type = type;
+      variant->b = *(int *)value;
+      break;
+    case 'y':
+      variant = malloc(sizeof(E_NM_Variant));
+      variant->type = type;
+      variant->y = *(unsigned char *)value;
+      break;
+    case 't':
+      variant = malloc(sizeof(E_NM_Variant));
+      variant->type = type;
+      variant->t = *(unsigned long long *)value;
+      break;
+  }
+  return variant;
+}
+
+EAPI E_NM_Variant *
+e_nm_variant_array_new(int type, const void *value, int size)
+{
+  E_NM_Variant *variant = NULL;
+  int           i;
+
+  variant = malloc(sizeof(E_NM_Variant));
+  variant->type = 'a';
+  variant->a = ecore_list_new();
+  ecore_list_free_cb_set(variant->a, ECORE_FREE_CB(e_nm_variant_free));
+  for (i = 0; i < size; i++)
+    ecore_list_append(variant->a, e_nm_variant_new(type, &(value[i])));
+  return variant;
+}
+
+EAPI void
+e_nm_variant_free(E_NM_Variant *variant)
+{
+  if (variant->type == 'a') ecore_list_destroy(variant->a);
+  else if ((variant->type == 's') || (variant->type == 'o')) free(variant->s);
+  free(variant);
+}
+
diff --git a/src/lib/nm/e_nms.c b/src/lib/nm/e_nms.c
index afa6ea2..697f61e 100644
--- a/src/lib/nm/e_nms.c
+++ b/src/lib/nm/e_nms.c
@@ -3,52 +3,20 @@
 
 #include <string.h>
 
-static void
-cb_nms_user_connections(void *data, void *reply, DBusError *err)
-{
-  Reply_Data  *d;
-  E_NMS *nms;
-  Ecore_List *connections;
-  Ecore_List *list, *list2;
-  char *path;
-
-  d = data;
-  nms = d->object;
-  list = d->reply;
-  if (dbus_error_is_set(err))
-  {
-    printf("Error: %s - %s\n", err->name, err->message);
-    d->cb_func(d->data, NULL);
-    ecore_list_destroy(list);
-    free(d);
-    return;
-  }
-  list2 = ecore_list_new();
-  ecore_list_free_cb_set(list2, ECORE_FREE_CB(e_nms_connection_free));
-  while ((path = ecore_list_first_remove(list)))
-  {
-    ecore_list_append(list2, e_nms_connection_get(nms, E_NMS_SERVICE_SYSTEM, path));
-    free(path);
-  }
-  ecore_list_destroy(list);
- 
-  connections = reply;
-  ecore_list_first_goto(connections);
-  while ((path = ecore_list_next(connections)))
-    ecore_list_append(list2, e_nms_connection_get(nms, E_NMS_SERVICE_USER, path));
-  d->cb_func(d->data, list2);
-  free(d);
-}
+static const Property nms_properties[] = {
+  { .name = "UnmanagedDevices", .sig = "ao", .offset = offsetof(E_NMS, unmanaged_devices) },
+  { .name = "Hostname", .sig = "s", .offset = offsetof(E_NMS, hostname) },
+  { .name = NULL }
+};
 
 static void
-cb_nms_system_connections(void *data, void *reply, DBusError *err)
+cb_nms_connections(void *data, void *reply, DBusError *err)
 {
   Reply_Data  *d;
   E_NMS_Internal *nmsi;
   Ecore_List *connections;
   Ecore_List *list;
-  const char *conn;
-  DBusMessage *msg;
+  const char *path;
 
   d = data;
   nmsi = d->object;
@@ -60,22 +28,17 @@ cb_nms_system_connections(void *data, void *reply, DBusError *err)
     return;
   }
   list = ecore_list_new();
-  ecore_list_free_cb_set(list, free);
-  d->reply = list;
-
+  ecore_list_free_cb_set(list, ECORE_FREE_CB(e_nms_connection_free));
   connections = reply;
   ecore_list_first_goto(connections);
-  while ((conn = ecore_list_next(connections)))
-    ecore_list_append(list, strdup(conn));
-
-  msg = e_nms_call_new(E_NMS_SERVICE_USER, "ListConnections");
-
-  e_dbus_method_call_send(nmsi->nmi->conn, msg, cb_nm_object_path_list, cb_nms_user_connections, free_nm_object_path_list, -1, d);
-  dbus_message_unref(msg);
+  while ((path = ecore_list_next(connections)))
+    ecore_list_append(list, e_nms_connection_get(&(nmsi->nms), nmsi->nms.service_name, path));
+  d->cb_func(d->data, list);
+  free(d);
 }
 
 static void
-new_connection(const char *service_name, void *data, DBusMessage *msg)
+cb_new_connection(void *data, DBusMessage *msg)
 {
   E_NMS_Internal *nmsi;
   const char *conn;
@@ -92,33 +55,150 @@ new_connection(const char *service_name, void *data, DBusMessage *msg)
   }
 
   if (nmsi->new_connection)
-    nmsi->new_connection((E_NMS *)nmsi, service_name, conn);
+    nmsi->new_connection(&(nmsi->nms), nmsi->nms.service_name, conn);
+}
+
+static void
+cb_properties_changed(void *data, DBusMessage *msg)
+{
+  E_NMS_Internal *nmsi;
+  if (!msg || !data) return;
+
+  nmsi = data;
+  parse_properties(nmsi, nms_properties, msg);
+
+  if (nmsi->properties_changed)
+    nmsi->properties_changed(&(nmsi->nms));
+}
+
+static void
+add_basic(DBusMessageIter *iter, E_NM_Variant *variant)
+{
+  switch (variant->type)
+  {
+    case 'a':
+      printf("Error: No support for array of array\n");
+      break;
+    case 's':
+    case 'o':
+      dbus_message_iter_append_basic(iter, variant->type, &variant->s);
+      break;
+    case 'u':
+      dbus_message_iter_append_basic(iter, variant->type, &variant->u);
+      break;
+    case 'b':
+      dbus_message_iter_append_basic(iter, variant->type, &variant->b);
+      break;
+    case 'y':
+      dbus_message_iter_append_basic(iter, variant->type, &variant->y);
+      break;
+    case 't':
+      dbus_message_iter_append_basic(iter, variant->type, &variant->t);
+      break;
+  }
 }
 
 static void
-cb_new_system_connection(void *data, DBusMessage *msg)
+add_variant(DBusMessageIter *iter, E_NM_Variant *variant)
 {
-  new_connection(E_NMS_SERVICE_SYSTEM, data, msg);
+  DBusMessageIter v_iter;
+  char            sig[3];
+
+  switch (variant->type)
+  {
+    case 'a': {
+      E_NM_Variant    *subvar;
+      DBusMessageIter  a_iter;
+
+      if (!ecore_list_empty_is(variant->a))
+      {
+        subvar = ecore_list_first(variant->a);
+	sig[0] = 'a';
+        sig[1] = subvar->type;
+        sig[2] = 0;
+        dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, sig, &v_iter);
+        dbus_message_iter_open_container(&v_iter, DBUS_TYPE_ARRAY, sig, &a_iter);
+        ecore_list_first_goto(variant->a);
+        while ((subvar = ecore_list_next(variant->a)))
+          add_basic(&a_iter, subvar);
+        dbus_message_iter_close_container(&v_iter, &a_iter);
+        dbus_message_iter_close_container(iter, &v_iter);
+      }
+      break;
+    }
+    default:
+      sig[0] = variant->type;
+      sig[1] = 0;
+
+      dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, sig, &v_iter);
+      add_basic(&v_iter, variant);
+      dbus_message_iter_close_container(iter, &v_iter);
+      break;
+  }
 }
 
 static void
-cb_new_user_connection(void *data, DBusMessage *msg)
+add_value(void *value, void *data)
 {
-  new_connection(E_NMS_SERVICE_USER, data, msg);
+  Ecore_Hash_Node *node;
+  E_NM_Variant    *variant;
+  DBusMessageIter *iter, d_iter;
+
+  node = value;
+  iter = data;
+
+  dbus_message_iter_open_container(iter, DBUS_TYPE_DICT_ENTRY, NULL, &d_iter);
+  dbus_message_iter_append_basic(&d_iter, DBUS_TYPE_STRING, &node->key);
+  add_variant(&d_iter, node->value);
+  dbus_message_iter_close_container(iter, &d_iter);
 }
 
-EAPI E_NMS *
-e_nms_get(E_NM *nm)
+static void
+add_array(void *value, void *data)
+{
+  Ecore_Hash_Node *node;
+  DBusMessageIter *iter, d_iter, a_iter;
+
+  node = value;
+  iter = data;
+
+  dbus_message_iter_open_container(iter, DBUS_TYPE_DICT_ENTRY, NULL, &d_iter);
+  dbus_message_iter_append_basic(&d_iter, DBUS_TYPE_STRING, &node->key);
+  dbus_message_iter_open_container(&d_iter, DBUS_TYPE_ARRAY, "{sv}", &a_iter);
+  ecore_hash_for_each_node(node->value, add_value, &a_iter);
+  dbus_message_iter_close_container(&d_iter, &a_iter);
+  dbus_message_iter_close_container(iter, &d_iter);
+}
+
+EAPI int
+e_nms_get(E_NM *nm, E_NMS_Context context, int (*cb_func)(void *data, E_NMS *nms), void *data)
 {
   E_NMS_Internal *nmsi;
+  Property_Data     *d;
 
   nmsi = calloc(1, sizeof(E_NMS_Internal));
   nmsi->nmi = (E_NM_Internal *)nm;
   nmsi->handlers = ecore_list_new();
-  ecore_list_append(nmsi->handlers, e_nms_signal_handler_add(nmsi->nmi->conn, E_NMS_SERVICE_SYSTEM, "NewConnection", cb_new_system_connection, nmsi));
-  ecore_list_append(nmsi->handlers, e_nms_signal_handler_add(nmsi->nmi->conn, E_NMS_SERVICE_USER, "NewConnection", cb_new_user_connection, nmsi));
 
-  return (E_NMS *)nmsi;
+  d = calloc(1, sizeof(Property_Data));
+  d->nmi = nmsi->nmi;
+  d->cb_func = OBJECT_CB(cb_func);
+  d->data = data;
+  d->reply = nmsi;
+  d->property = nms_properties;
+  d->object = strdup(E_NMS_PATH);
+  d->interface = E_NMS_INTERFACE;
+  switch (context)
+  {
+    case E_NMS_CONTEXT_SYSTEM:
+      nmsi->nms.service_name = E_NMS_SERVICE_SYSTEM;
+      ecore_list_append(nmsi->handlers, e_nms_signal_handler_add(nmsi->nmi->conn, nmsi->nms.service_name, "NewConnection", cb_new_connection, nmsi));
+      ecore_list_append(nmsi->handlers, e_nms_system_signal_handler_add(nmsi->nmi->conn, nmsi->nms.service_name, "PropertiesChanged", cb_properties_changed, nmsi));
+      d->service = nmsi->nms.service_name;
+      //(*cb_func)(data, &(nmsi->nms));
+      return property_get(nmsi->nmi->conn, d);
+  }
+  return 0;
 }
 
 EAPI void
@@ -128,6 +208,8 @@ e_nms_free(E_NMS *nms)
   if (!nms) return;
   nmsi = (E_NMS_Internal *)nms;
 
+  if (nms->unmanaged_devices) ecore_list_destroy(nms->unmanaged_devices);
+  if (nms->hostname) free(nms->hostname);
   if (nmsi->handlers)
   {
     E_DBus_Signal_Handler *sh;
@@ -144,6 +226,16 @@ e_nms_dump(E_NMS *nms)
 {
   if (!nms) return;
   printf("E_NMS:\n");
+  printf("unmanaged_devices:\n");
+  if (nms->unmanaged_devices)
+  {
+    const char *dev;
+
+    ecore_list_first_goto(nms->unmanaged_devices);
+    while ((dev = ecore_list_next(nms->unmanaged_devices)))
+      printf(" - %s\n", dev);
+  }
+  printf("hostname         : %s\n", nms->hostname);
   printf("\n");
 }
 
@@ -161,9 +253,58 @@ e_nms_list_connections(E_NMS *nms, int (*cb_func)(void *data, Ecore_List *list),
   d->data = data;
   d->object = nmsi;
 
-  msg = e_nms_call_new(E_NMS_SERVICE_SYSTEM, "ListConnections");
+  msg = e_nms_call_new(nms->service_name, "ListConnections");
+
+  ret = e_dbus_method_call_send(nmsi->nmi->conn, msg, cb_nm_object_path_list, cb_nms_connections, free_nm_object_path_list, -1, d) ? 1 : 0;
+  dbus_message_unref(msg);
+  return ret;
+}
 
-  ret = e_dbus_method_call_send(nmsi->nmi->conn, msg, cb_nm_object_path_list, cb_nms_system_connections, free_nm_object_path_list, -1, d) ? 1 : 0;
+EAPI int
+e_nms_system_save_hostname(E_NMS *nms, const char *hostname)
+{
+  DBusMessage *msg;
+  E_NMS_Internal *nmsi;
+  int ret;
+
+  nmsi = (E_NMS_Internal *)nms;
+  msg = e_nms_system_call_new(nms->service_name, "SaveHostname");
+  dbus_message_append_args(msg, DBUS_TYPE_STRING, &hostname, DBUS_TYPE_INVALID);
+
+  ret = e_dbus_message_send(nmsi->nmi->conn, msg, NULL, -1, NULL) ? 1 : 0;
+  dbus_message_unref(msg);
+  return ret;
+}
+
+static void
+cb(void *data, DBusMessage *msg, DBusError *err)
+{
+  if (dbus_error_is_set(err))
+  {
+    printf("Error: %s - %s\n", err->name, err->message);
+  }
+  else
+  {
+    printf("Yay!\n");
+  }
+}
+
+EAPI int
+e_nms_system_add_connection(E_NMS *nms, Ecore_Hash *settings)
+{
+  DBusMessage     *msg;
+  DBusMessageIter  iter, a_iter;
+  E_NMS_Internal  *nmsi;
+  int              ret;
+
+  nmsi = (E_NMS_Internal *)nms;
+  msg = e_nms_system_call_new(nms->service_name, "AddConnection");
+  dbus_message_iter_init_append(msg, &iter);
+  dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "{sa{sv}}", &a_iter);
+  ecore_hash_for_each_node(settings, add_array, &a_iter);
+  dbus_message_iter_close_container(&iter, &a_iter);
+
+  ret = e_dbus_message_send(nmsi->nmi->conn, msg, cb, -1, NULL) ? 1 : 0;
   dbus_message_unref(msg);
   return ret;
 }
@@ -194,3 +335,13 @@ e_nms_callback_new_connection_set(E_NMS *nms, int (*cb_func)(E_NMS *nms, const c
   nmsi = (E_NMS_Internal *)nms;
   nmsi->new_connection = cb_func;
 }
+
+EAPI void
+e_nms_system_callback_properties_changed_set(E_NMS *nms, int (*cb_func)(E_NMS *nms))
+{
+  E_NMS_Internal *nmsi;
+
+  nmsi = (E_NMS_Internal *)nms;
+  nmsi->properties_changed = cb_func;
+}
+
diff --git a/src/lib/nm/e_nms_connection.c b/src/lib/nm/e_nms_connection.c
index f25db2d..037afcd 100644
--- a/src/lib/nm/e_nms_connection.c
+++ b/src/lib/nm/e_nms_connection.c
@@ -107,7 +107,7 @@ e_nms_connection_dump(E_NMS_Connection *conn)
 }
 
 EAPI int
-e_nms_connection_get_settings(E_NMS_Connection *connection, int (*cb_func)(void *data, Ecore_Hash *settings), void *data)
+e_nms_connection_get_settings(E_NMS_Connection *connection, int (*cb_func)(void *data, Eina_Hash *settings), void *data)
 {
   DBusMessage *msg;
   Reply_Data   *d;
@@ -128,7 +128,7 @@ e_nms_connection_get_settings(E_NMS_Connection *connection, int (*cb_func)(void
 }
 
 EAPI int
-e_nms_connection_secrets_get_secrets(E_NMS_Connection *connection, const char *setting_name, Ecore_List *hints, int request_new, int (*cb_func)(void *data, Ecore_Hash *secrets), void *data)
+e_nms_connection_secrets_get_secrets(E_NMS_Connection *connection, const char *setting_name, Ecore_List *hints, int request_new, int (*cb_func)(void *data, Eina_Hash *secrets), void *data)
 {
   DBusMessage      *msg;
   DBusMessageIter   iter, a_iter;
diff --git a/src/lib/notification/marshal.c b/src/lib/notification/marshal.c
index 9a0a8e2..f0db570 100644
--- a/src/lib/notification/marshal.c
+++ b/src/lib/notification/marshal.c
@@ -488,6 +488,7 @@ e_notify_unmarshal_notify_hints(E_Notification *n, DBusMessageIter *iter)
         }
       else if (!strcmp(key, "desktop-entry"))
         {
+          dbus_message_iter_get_basic(&variant, &s_val);
           e_notification_hint_desktop_set(n, s_val);
         }
       else if (!strcmp(key, "sound-file"))

-- 
D-Bus integration for EFL based applications



More information about the Pkg-e-commits mailing list