Add initial support for LookupService helper method
authorMarcel Holtmann <marcel@holtmann.org>
Thu, 13 May 2010 12:24:32 +0000 (14:24 +0200)
committerMarcel Holtmann <marcel@holtmann.org>
Thu, 13 May 2010 12:24:32 +0000 (14:24 +0200)
Makefile.am
doc/manager-api.txt
src/connman.h
src/manager.c
src/service.c
test/find-service [new file with mode: 0755]

index 6be9e48..4797b87 100644 (file)
@@ -143,7 +143,7 @@ test_scripts = test/get-state test/list-profiles test/list-services \
                test/test-manager test/test-connman test/monitor-connman \
                test/connect-vpn test/disconnect-vpn test/list-providers \
                test/monitor-manager test/test-counter test/set-ip-method \
-               test/set-nameservers test/set-domains
+               test/set-nameservers test/set-domains test/find-service
 
 if TEST
 testdir = $(pkglibdir)/test
index 8eaeded..1aeb055 100644 (file)
@@ -69,6 +69,20 @@ Methods              dict GetProperties()
 
                        Possible Errors: [service].Error.InvalidArguments
 
+               object LookupService(string pattern)
+
+                       Lookup a service matching the specific pattern.
+
+                       Examples are interface names like "eth0", "wlan0"
+                       etc. or service names like "hotspot" etc.
+
+                       In case of multiple services match the the pattern
+                       an error is returned.
+
+                       Possible Errors: [service].Error.InvalidArguments
+                                        [service].Error.NotUnique
+                                        [service].Error.NotFound
+
                object ConnectService(dict network)
 
                        Connect to a network specified by the given
index 9cdd71e..0ddb3ad 100644 (file)
@@ -413,6 +413,7 @@ int __connman_service_indicate_error(struct connman_service *service,
                                        enum connman_service_error error);
 int __connman_service_indicate_default(struct connman_service *service);
 
+int __connman_service_lookup(const char *pattern, const char **path);
 int __connman_service_connect(struct connman_service *service);
 int __connman_service_disconnect(struct connman_service *service);
 int __connman_service_create_and_connect(DBusMessage *msg);
index 6561a78..b806ba2 100644 (file)
@@ -413,6 +413,25 @@ static DBusMessage *disable_technology(DBusConnection *conn,
        return NULL;
 }
 
+static DBusMessage *lookup_service(DBusConnection *conn,
+                                       DBusMessage *msg, void *data)
+{
+       const char *pattern, *path;
+       int err;
+
+       DBG("conn %p", conn);
+
+       dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &pattern,
+                                                       DBUS_TYPE_INVALID);
+
+       err = __connman_service_lookup(pattern, &path);
+       if (err < 0)
+               return __connman_error_failed(msg, -err);
+
+       return g_dbus_create_reply(msg, DBUS_TYPE_STRING, &path,
+                                                       DBUS_TYPE_INVALID);
+}
+
 static DBusMessage *connect_service(DBusConnection *conn,
                                        DBusMessage *msg, void *data)
 {
@@ -596,6 +615,7 @@ static GDBusMethodTable manager_methods[] = {
                                                G_DBUS_METHOD_FLAG_ASYNC },
        { "DisableTechnology", "s",     "",      disable_technology,
                                                G_DBUS_METHOD_FLAG_ASYNC },
+       { "LookupService",     "s",     "o",     lookup_service,    },
        { "ConnectService",    "a{sv}", "o",     connect_service,
                                                G_DBUS_METHOD_FLAG_ASYNC },
        { "ConnectProvider",   "a{sv}", "o",     connect_provider,
index 7c34923..c333818 100644 (file)
@@ -2115,6 +2115,34 @@ int __connman_service_disconnect(struct connman_service *service)
 }
 
 /**
+ * __connman_service_lookup:
+ * @pattern: search pattern
+ * @path: return object path
+ *
+ * Look up a service path from a search pattern
+ */
+int __connman_service_lookup(const char *pattern, const char **path)
+{
+       GHashTableIter iter;
+       gpointer key, value;
+
+       g_hash_table_iter_init(&iter, service_hash);
+
+       while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
+               GSequenceIter *iter = value;
+               struct connman_service *service = g_sequence_get(iter);
+
+               if (g_strcmp0(service->identifier, pattern) == 0 ||
+                               g_strcmp0(service->name, pattern) == 0) {
+                       *path = (const char *) service->path;
+                       return 0;
+               }
+       }
+
+       return -ENXIO;
+}
+
+/**
  * lookup_by_identifier:
  * @identifier: service identifier
  *
diff --git a/test/find-service b/test/find-service
new file mode 100755 (executable)
index 0000000..e9aad17
--- /dev/null
@@ -0,0 +1,17 @@
+#!/usr/bin/python
+
+import sys
+import dbus
+
+if (len(sys.argv) < 2):
+       print "Usage: %s <pattern>" % (sys.argv[0])
+       sys.exit(1)
+
+bus = dbus.SystemBus()
+
+manager = dbus.Interface(bus.get_object('org.moblin.connman', '/'),
+                                       'org.moblin.connman.Manager')
+
+path = manager.LookupService(sys.argv[1])
+
+print "Service is %s" % (path)