summaryrefslogtreecommitdiff
path: root/monitor/gphoto2/hal-pool.c
diff options
context:
space:
mode:
authorChristian Kellner <gicmo@src.gnome.org>2008-09-24 12:46:09 +0000
committerChristian Kellner <gicmo@src.gnome.org>2008-09-24 12:46:09 +0000
commitd01d71d8f36809983b174f0b7d62d20bedf33a74 (patch)
tree4b825dc642cb6eb9a060e54bf8d69288fbee4904 /monitor/gphoto2/hal-pool.c
parent953132a87aed73507042a6279b343523741a1800 (diff)
downloadgvfs-GVFS_1_0_1_svn2027.tar.gz
Wrong branchGVFS_1_0_1_svn2027
svn path=/tags/GVFS_1_0_1; revision=2026
Diffstat (limited to 'monitor/gphoto2/hal-pool.c')
-rw-r--r--monitor/gphoto2/hal-pool.c458
1 files changed, 0 insertions, 458 deletions
diff --git a/monitor/gphoto2/hal-pool.c b/monitor/gphoto2/hal-pool.c
deleted file mode 100644
index 770effd9..00000000
--- a/monitor/gphoto2/hal-pool.c
+++ /dev/null
@@ -1,458 +0,0 @@
-/* hal-pool.c
- *
- * Copyright (C) 2007 David Zeuthen
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public License
- * as published by the Free Software Foundation; either version 2 of
- * the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <config.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/time.h>
-
-#include <gdbusutils.h>
-
-#include "hal-pool.h"
-#include "hal-marshal.h"
-
-enum {
- DEVICE_ADDED,
- DEVICE_REMOVED,
- DEVICE_PROPERTY_CHANGED,
- DEVICE_CONDITION,
- LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL] = { 0 };
-
-struct _HalPoolPrivate
-{
- char **cap_only;
-
- DBusConnection *dbus_connection;
- LibHalContext *hal_ctx;
- GHashTable *devices;
-};
-
-G_DEFINE_TYPE (HalPool, hal_pool, G_TYPE_OBJECT)
-
-static void
-hal_pool_finalize (HalPool *pool)
-{
- g_strfreev (pool->priv->cap_only);
-
- dbus_bus_remove_match (pool->priv->dbus_connection,
- "type='signal',"
- "interface='org.freedesktop.Hal.Device',"
- "sender='org.freedesktop.Hal'", NULL);
- libhal_ctx_shutdown (pool->priv->hal_ctx, NULL);
- dbus_connection_close (pool->priv->dbus_connection);
- dbus_connection_unref (pool->priv->dbus_connection);
-
- if (G_OBJECT_CLASS (hal_pool_parent_class)->finalize)
- (* G_OBJECT_CLASS (hal_pool_parent_class)->finalize) (G_OBJECT (pool));
-}
-
-static void
-hal_pool_class_init (HalPoolClass *klass)
-{
- GObjectClass *obj_class = (GObjectClass *) klass;
-
- obj_class->finalize = (GObjectFinalizeFunc) hal_pool_finalize;
-
- g_type_class_ref (HAL_TYPE_DEVICE);
-
- signals[DEVICE_ADDED] =
- g_signal_new ("device_added",
- G_TYPE_FROM_CLASS (klass),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (HalPoolClass, device_added),
- NULL, NULL,
- g_cclosure_marshal_VOID__OBJECT,
- G_TYPE_NONE, 1,
- HAL_TYPE_DEVICE);
-
- signals[DEVICE_REMOVED] =
- g_signal_new ("device_removed",
- G_TYPE_FROM_CLASS (klass),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (HalPoolClass, device_removed),
- NULL, NULL,
- g_cclosure_marshal_VOID__OBJECT,
- G_TYPE_NONE, 1,
- HAL_TYPE_DEVICE);
-
- signals[DEVICE_PROPERTY_CHANGED] =
- g_signal_new ("device_property_changed",
- G_TYPE_FROM_CLASS (klass),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (HalPoolClass, device_property_changed),
- NULL, NULL,
- hal_marshal_VOID__OBJECT_STRING,
- G_TYPE_NONE, 2,
- HAL_TYPE_DEVICE,
- G_TYPE_STRING);
-
- signals[DEVICE_CONDITION] =
- g_signal_new ("device_condition",
- G_TYPE_FROM_CLASS (klass),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (HalPoolClass, device_condition),
- NULL, NULL,
- hal_marshal_VOID__OBJECT_STRING_STRING,
- G_TYPE_NONE, 3,
- HAL_TYPE_DEVICE,
- G_TYPE_STRING,
- G_TYPE_STRING);
-}
-
-static void
-hal_pool_init (HalPool *pool)
-{
- pool->priv = g_new0 (HalPoolPrivate, 1);
- pool->priv->hal_ctx = NULL;
-}
-
-static gboolean
-has_cap_only (HalPool *pool, HalDevice *device)
-{
- const char *subsys;
- unsigned int n;
-
- for (n = 0; pool->priv->cap_only != NULL && pool->priv->cap_only[n] != NULL; n++)
- {
- if (hal_device_has_capability (device, pool->priv->cap_only[n]))
- return TRUE;
-
- subsys = hal_device_get_property_string (device, "info.subsystem");
-
- if (subsys != NULL && strcmp (subsys, pool->priv->cap_only[n]) == 0)
- return TRUE;
- }
-
- return FALSE;
-}
-
-static void
-hal_pool_add_device_by_udi (HalPool *pool,
- const char *udi,
- gboolean emit_signal)
-{
- HalDevice *device;
-
- device = hal_device_new_from_udi (pool->priv->hal_ctx, udi);
- if (device != NULL)
- {
- if (!has_cap_only (pool, device))
- g_object_unref (device);
- else
- {
- g_hash_table_insert (pool->priv->devices, g_strdup (udi), device);
- if (emit_signal)
- g_signal_emit (pool, signals[DEVICE_ADDED], 0, device);
- }
- }
-}
-
-#ifdef HAVE_HAL_FAST_INIT
-static void
-hal_pool_add_device_by_udi_and_properties (HalPool *pool,
- char *udi,
- LibHalPropertySet *properties,
- gboolean emit_signal)
-{
- HalDevice *device;
-
- device = hal_device_new_from_udi_and_properties (pool->priv->hal_ctx, udi, properties);
- if (device != NULL)
- {
- if (!has_cap_only (pool, device))
- g_object_unref (device);
- else
- {
- g_hash_table_insert (pool->priv->devices, g_strdup (udi), device);
- if (emit_signal)
- g_signal_emit (pool, signals[DEVICE_ADDED], 0, device);
- }
- }
-}
-#endif
-
-static void
-_hal_device_added (LibHalContext *hal_ctx, const char *udi)
-{
- HalPool *pool;
-
- pool = HAL_POOL (libhal_ctx_get_user_data (hal_ctx));
- hal_pool_add_device_by_udi (pool, udi, TRUE);
-}
-
-static void
-_hal_device_removed (LibHalContext *hal_ctx, const char *udi)
-{
- HalPool *pool;
- HalDevice *device;
-
- pool = HAL_POOL (libhal_ctx_get_user_data (hal_ctx));
- if ((device = hal_pool_get_device_by_udi (pool, udi)) != NULL)
- {
- g_object_ref (device);
- g_hash_table_remove (pool->priv->devices, udi);
- g_signal_emit (pool, signals[DEVICE_REMOVED], 0, device);
- g_object_unref (device);
- }
-}
-
-void
-_hal_device_hal_property_changed (HalDevice *device, const char *key);
-
-void
-_hal_device_hal_condition (HalDevice *device, const char *name, const char *detail);
-
-static void
-_hal_property_modified (LibHalContext *ctx,
- const char *udi,
- const char *key,
- dbus_bool_t is_removed,
- dbus_bool_t is_added)
-{
- HalPool *pool;
- HalDevice *device;
-
- pool = HAL_POOL (libhal_ctx_get_user_data (ctx));
-
- device = hal_pool_get_device_by_udi (pool, udi);
- if (device != NULL)
- {
- _hal_device_hal_property_changed (device, key);
- g_signal_emit (pool, signals[DEVICE_PROPERTY_CHANGED], 0, device, key);
- }
-}
-
-static void
-_hal_condition (LibHalContext *ctx,
- const char *udi,
- const char *condition_name,
- const char *condition_detail)
-{
- HalPool *pool;
- HalDevice *device;
-
- pool = HAL_POOL (libhal_ctx_get_user_data (ctx));
-
- device = hal_pool_get_device_by_udi (pool, udi);
- if (device != NULL)
- {
- _hal_device_hal_condition (device, condition_name, condition_detail);
- g_signal_emit (pool, signals[DEVICE_CONDITION], 0, device, condition_name, condition_detail);
- }
-}
-
-LibHalContext *
-hal_pool_get_hal_ctx (HalPool *pool)
-{
- return pool->priv->hal_ctx;
-}
-
-DBusConnection *
-hal_pool_get_dbus_connection (HalPool *pool)
-{
- return pool->priv->dbus_connection;
-}
-
-HalPool *
-hal_pool_new (char **cap_only)
-{
- int i;
- char **devices;
- int num_devices;
- HalPool *pool;
- LibHalContext *hal_ctx;
- DBusError error;
- DBusConnection *dbus_connection;
-#ifdef HAVE_HAL_FAST_INIT
- LibHalPropertySet **properties;
-#endif
-
- pool = NULL;
-
- dbus_error_init (&error);
- /* see discussion on gtk-devel-list (Subject: Re: gvfs hal volume monitoring backend) on
- * why this is private
- */
- dbus_connection = dbus_bus_get_private (DBUS_BUS_SYSTEM, &error);
- if (dbus_error_is_set (&error))
- {
- dbus_error_free (&error);
- goto out;
- }
-
- dbus_connection_set_exit_on_disconnect (dbus_connection, FALSE);
-
- hal_ctx = libhal_ctx_new ();
- if (hal_ctx == NULL)
- {
- dbus_connection_close (dbus_connection);
- dbus_connection_unref (dbus_connection);
- goto out;
- }
-
- _g_dbus_connection_integrate_with_main (dbus_connection);
- libhal_ctx_set_dbus_connection (hal_ctx, dbus_connection);
-
- if (!libhal_ctx_init (hal_ctx, &error))
- {
- dbus_connection_close (dbus_connection);
- dbus_connection_unref (dbus_connection);
- dbus_error_free (&error);
- goto out;
- }
-
- pool = HAL_POOL (g_object_new (HAL_TYPE_POOL, NULL));
- pool->priv->dbus_connection = dbus_connection;
- pool->priv->hal_ctx = hal_ctx;
- pool->priv->devices = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);
- pool->priv->cap_only = g_strdupv (cap_only);
-
- /* Gah, unfortunately we have to watch all devices as HAL's PropertyModified signal
- * doesn't include the capabilities...
- */
- dbus_bus_add_match (dbus_connection,
- "type='signal',"
- "interface='org.freedesktop.Hal.Device',"
- "sender='org.freedesktop.Hal'", NULL);
- libhal_ctx_set_device_added (hal_ctx, _hal_device_added);
- libhal_ctx_set_device_removed (hal_ctx, _hal_device_removed);
- libhal_ctx_set_device_property_modified (hal_ctx, _hal_property_modified);
- libhal_ctx_set_device_condition (hal_ctx, _hal_condition);
- libhal_ctx_set_user_data (hal_ctx, pool);
-
-#ifdef HAVE_HAL_FAST_INIT
- /* First try new O(1) algorithm to get all devices and properties in a single call..
- *
- * This method is only available in post hal 0.5.10.
- */
- if (libhal_get_all_devices_with_properties (pool->priv->hal_ctx,
- &num_devices,
- &devices,
- &properties,
- NULL))
- {
- for (i = 0; i < num_devices; i++)
- hal_pool_add_device_by_udi_and_properties (pool, devices[i], properties[i], FALSE);
- libhal_free_string_array (devices);
- free (properties); /* hal_pool_add_device_by_udi_and_properties steals the given properties */
- goto out;
- }
-#endif
-
- /* fallback to using O(n) algorithm; will work on any hal 0.5.x release */
- devices = libhal_get_all_devices (pool->priv->hal_ctx, &num_devices, NULL);
- if (devices != NULL)
- {
- for (i = 0; i < num_devices; i++)
- {
- char *device_udi;
- device_udi = devices[i];
- hal_pool_add_device_by_udi (pool, device_udi, FALSE);
- }
- libhal_free_string_array (devices);
- goto out;
- }
-
- /* FAIL! */
-
- g_object_unref (pool);
- return NULL;
-
- out:
- return pool;
-}
-
-HalDevice *
-hal_pool_get_device_by_udi (HalPool *pool, const char *udi)
-{
- return g_hash_table_lookup (pool->priv->devices, udi);
-}
-
-HalDevice *
-hal_pool_get_device_by_capability_and_string (HalPool *pool,
- const char *capability,
- const char *key,
- const char *value)
-{
- GList *i;
- GList *devices;
- HalDevice *result;
-
- result = NULL;
- devices = NULL;
-
- if (pool->priv->devices == NULL)
- goto out;
-
- devices = g_hash_table_get_values (pool->priv->devices);
- for (i = devices; i != NULL; i = i->next)
- {
- HalDevice *d = i->data;
- const char *s;
-
- if (!hal_device_has_capability (d, capability))
- continue;
-
- s = hal_device_get_property_string (d, key);
- if (s == NULL)
- continue;
-
- if (strcmp (s, value) == 0)
- {
- result = d;
- goto out;
- }
- }
-
-out:
- if (devices != NULL)
- g_list_free (devices);
- return result;
-}
-
-GList *
-hal_pool_find_by_capability (HalPool *pool, const char *capability)
-{
- GList *i;
- GList *j;
- GList *devices;
-
- devices = NULL;
-
- if (pool->priv->devices == NULL)
- goto out;
-
- devices = g_hash_table_get_values (pool->priv->devices);
- for (i = devices; i != NULL; i = j)
- {
- HalDevice *d = i->data;
-
- j = i->next;
-
- if (!hal_device_has_capability (d, capability))
- devices = g_list_delete_link (devices, i);
- }
-
- out:
- return devices;
-}