+static void add_common_properties(struct connman_element *element,
+ DBusMessageIter *dict)
+{
+ const char *address = NULL, *netmask = NULL, *gateway = NULL;
+ GSList *list;
+
+ connman_element_get_value(element,
+ CONNMAN_PROPERTY_ID_IPV4_ADDRESS, &address);
+ connman_element_get_value(element,
+ CONNMAN_PROPERTY_ID_IPV4_NETMASK, &netmask);
+ connman_element_get_value(element,
+ CONNMAN_PROPERTY_ID_IPV4_GATEWAY, &gateway);
+
+ if (element->priority > 0)
+ connman_dbus_dict_append_variant(dict, "Priority",
+ DBUS_TYPE_UINT16, &element->priority);
+
+ if (address != NULL)
+ connman_dbus_dict_append_variant(dict, "IPv4.Address",
+ DBUS_TYPE_STRING, &address);
+ if (netmask != NULL)
+ connman_dbus_dict_append_variant(dict, "IPv4.Netmask",
+ DBUS_TYPE_STRING, &netmask);
+ if (gateway != NULL)
+ connman_dbus_dict_append_variant(dict, "IPv4.Gateway",
+ DBUS_TYPE_STRING, &gateway);
+
+ if (element->wifi.security != NULL) {
+ const char *passphrase = "";
+
+ connman_dbus_dict_append_variant(dict, "WiFi.Security",
+ DBUS_TYPE_STRING, &element->wifi.security);
+
+ if (element->wifi.passphrase != NULL)
+ passphrase = element->wifi.passphrase;
+
+ connman_dbus_dict_append_variant(dict, "WiFi.Passphrase",
+ DBUS_TYPE_STRING, &passphrase);
+ }
+
+ __connman_element_lock(element);
+
+ for (list = element->properties; list; list = list->next) {
+ struct connman_property *property = list->data;
+
+ append_property(dict, property);
+ }
+
+ __connman_element_unlock(element);
+}
+
+static void set_common_property(struct connman_element *element,
+ const char *name, DBusMessageIter *value)
+{
+ GSList *list;
+
+ if (g_str_equal(name, "Priority") == TRUE) {
+ dbus_message_iter_get_basic(value, &element->priority);
+ return;
+ }
+
+ __connman_element_lock(element);
+
+ for (list = element->properties; list; list = list->next) {
+ struct connman_property *property = list->data;
+ const char *str;
+
+ if (g_str_equal(property->name, name) == FALSE)
+ continue;
+
+ if (property->flags & CONNMAN_PROPERTY_FLAG_STATIC)
+ continue;
+
+ property->flags &= ~CONNMAN_PROPERTY_FLAG_REFERENCE;
+
+ if (property->type == DBUS_TYPE_STRING) {
+ dbus_message_iter_get_basic(value, &str);
+ g_free(property->value);
+ property->value = g_strdup(str);
+ } else
+ property->value = NULL;
+ }
+
+ __connman_element_unlock(element);
+}
+
+static DBusMessage *do_update(DBusConnection *conn,
+ DBusMessage *msg, void *data)
+{
+ struct connman_element *element = data;
+
+ DBG("conn %p", conn);
+
+ if (element->enabled == FALSE)
+ return __connman_error_failed(msg);
+
+ if (element->driver && element->driver->update) {
+ DBG("Calling update callback");
+ if (element->driver->update(element) < 0)
+ return __connman_error_failed(msg);
+
+ }
+
+ return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
+}
+
+static DBusMessage *do_enable(DBusConnection *conn,
+ DBusMessage *msg, void *data)
+{
+ struct connman_element *element = data;
+
+ DBG("conn %p", conn);
+
+ if (element->enabled == TRUE)
+ return __connman_error_failed(msg);
+
+ if (element->driver && element->driver->enable) {
+ DBG("Calling enable callback");
+ if (element->driver->enable(element) < 0)
+ return __connman_error_failed(msg);
+ }
+
+ element->enabled = TRUE;
+
+#if 0
+ g_dbus_emit_signal(connection, CONNMAN_MANAGER_PATH,
+ CONNMAN_MANAGER_INTERFACE, "ElementUpdated",
+ DBUS_TYPE_OBJECT_PATH, &element->path,
+ DBUS_TYPE_INVALID);
+#endif
+
+ return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
+}
+
+static DBusMessage *do_disable(DBusConnection *conn,
+ DBusMessage *msg, void *data)
+{
+ struct connman_element *element = data;
+
+ DBG("conn %p", conn);
+
+ if (element->enabled == FALSE)
+ return __connman_error_failed(msg);
+
+ if (element->driver && element->driver->disable) {
+ DBG("Calling disable callback");
+ if (element->driver->disable(element) < 0)
+ return __connman_error_failed(msg);
+ }
+
+ element->enabled = FALSE;
+
+#if 0
+ g_dbus_emit_signal(connection, CONNMAN_MANAGER_PATH,
+ CONNMAN_MANAGER_INTERFACE, "ElementUpdated",
+ DBUS_TYPE_OBJECT_PATH, &element->path,
+ DBUS_TYPE_INVALID);
+#endif
+
+ return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
+}
+
+static void append_networks(struct connman_element *element,
+ DBusMessageIter *dict)
+{
+ DBusMessageIter entry, value, iter;
+ const char *key = "Networks";
+
+ if (element->subtype != CONNMAN_ELEMENT_SUBTYPE_WIFI &&
+ element->subtype != CONNMAN_ELEMENT_SUBTYPE_WIMAX)
+ return;
+
+ dbus_message_iter_open_container(dict, DBUS_TYPE_DICT_ENTRY,
+ NULL, &entry);
+
+ dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &key);
+
+ dbus_message_iter_open_container(&entry, DBUS_TYPE_VARIANT,
+ DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_OBJECT_PATH_AS_STRING,
+ &value);
+
+ dbus_message_iter_open_container(&value, DBUS_TYPE_ARRAY,
+ DBUS_TYPE_OBJECT_PATH_AS_STRING, &iter);
+
+ __connman_element_list(element, CONNMAN_ELEMENT_TYPE_NETWORK, &iter);
+
+ dbus_message_iter_close_container(&value, &iter);
+
+ dbus_message_iter_close_container(&entry, &value);
+
+ dbus_message_iter_close_container(dict, &entry);
+}
+
+static DBusMessage *device_get_properties(DBusConnection *conn,