vpn-provider: Send ConnectionRemoved signal when needed
authorJukka Rissanen <jukka.rissanen@linux.intel.com>
Mon, 12 Nov 2012 12:07:46 +0000 (14:07 +0200)
committerPatrik Flykt <patrik.flykt@linux.intel.com>
Fri, 23 Nov 2012 10:58:52 +0000 (12:58 +0200)
vpn/vpn-provider.c

index c46c9b41564614681a24f4ad7fda6133936d5d6a..09b782aa09dcfcc19d63254cd4db1e92a665f8d9 100644 (file)
@@ -989,16 +989,52 @@ int __vpn_provider_connect(struct vpn_provider *provider)
        return err;
 }
 
+static void connection_removed_signal(struct vpn_provider *provider)
+{
+       DBusMessage *signal;
+       DBusMessageIter iter;
+
+       signal = dbus_message_new_signal(VPN_MANAGER_PATH,
+                       VPN_MANAGER_INTERFACE, "ConnectionRemoved");
+       if (signal == NULL)
+               return;
+
+       dbus_message_iter_init_append(signal, &iter);
+       dbus_message_iter_append_basic(&iter, DBUS_TYPE_OBJECT_PATH,
+                                                       &provider->path);
+       dbus_connection_send(connection, signal, NULL);
+       dbus_message_unref(signal);
+}
+
+static char *get_ident(const char *path)
+{
+       char *pos;
+
+       if (*path != '/')
+               return NULL;
+
+       pos = strrchr(path, '/');
+       if (pos == NULL)
+               return NULL;
+
+       return pos + 1;
+}
+
 int __vpn_provider_remove(const char *path)
 {
        struct vpn_provider *provider;
+       char *ident;
 
        DBG("path %s", path);
 
-       provider = vpn_provider_lookup(path);
+       ident = get_ident(path);
+
+       provider = vpn_provider_lookup(ident);
        if (provider != NULL) {
                DBG("Removing VPN %s", provider->identifier);
 
+               connection_removed_signal(provider);
+
                provider_unregister(provider);
                g_hash_table_remove(provider_hash, provider->identifier);
                return 0;