HalDevice * hal_device_store_match_key_value_int (HalDeviceStore *store, const char *key, int value) { GSList *iter; g_return_val_if_fail (store != NULL, NULL); g_return_val_if_fail (key != NULL, NULL); for (iter = store->devices; iter != NULL; iter = iter->next) { HalDevice *d = HAL_DEVICE (iter->data); int type; if (!hal_device_has_property (d, key)) continue; type = hal_device_property_get_type (d, key); if (type != HAL_PROPERTY_TYPE_INT32) continue; if (hal_device_property_get_int (d, key) == value) return d; } return NULL; }
GSList * hal_device_store_match_multiple_key_value_string (HalDeviceStore *store, const char *key, const char *value) { GSList *iter; GSList *matches = NULL; g_return_val_if_fail (store != NULL, NULL); g_return_val_if_fail (key != NULL, NULL); g_return_val_if_fail (value != NULL, NULL); for (iter = store->devices; iter != NULL; iter = iter->next) { HalDevice *d = HAL_DEVICE (iter->data); int type; if (!hal_device_has_property (d, key)) continue; type = hal_device_property_get_type (d, key); if (type != HAL_PROPERTY_TYPE_STRING) continue; if (strcmp (hal_device_property_get_string (d, key), value) == 0) matches = g_slist_prepend (matches, d); } return matches; }
/* generate hotplug event for each device in this branch */ void devinfo_remove_branch (gchar *devfs_path, HalDevice *d) { GSList *i; GSList *children; HalDevice *child; char *child_devfs_path; if (d == NULL) { d = hal_device_store_match_key_value_string (hald_get_gdl (), "solaris.devfs_path", devfs_path); if (d == NULL) return; } HAL_INFO (("remove_branch: %s %s\n", devfs_path, hal_device_get_udi (d))); /* first remove children */ children = hal_device_store_match_multiple_key_value_string (hald_get_gdl(), "info.parent", hal_device_get_udi (d)); for (i = children; i != NULL; i = g_slist_next (i)) { child = HAL_DEVICE (i->data); HAL_INFO (("remove_branch: child %s\n", hal_device_get_udi (child))); devinfo_remove_branch ((gchar *)hal_device_property_get_string (child, "solaris.devfs_path"), child); } g_slist_free (children); HAL_INFO (("remove_branch: done with children")); /* then remove self */ HAL_INFO (("remove_branch: queueing %s", devfs_path)); devinfo_remove_enqueue (devfs_path, NULL); }
void hal_device_store_foreach (HalDeviceStore *store, HalDeviceStoreForeachFn callback, gpointer user_data) { GSList *iter; g_return_if_fail (store != NULL); g_return_if_fail (callback != NULL); for (iter = store->devices; iter != NULL; iter = iter->next) { HalDevice *d = HAL_DEVICE (iter->data); gboolean cont; cont = callback (store, d, user_data); if (cont == FALSE) return; } }
HalDevice * hal_device_store_match_key_value_string (HalDeviceStore *store, const char *key, const char *value) { GSList *iter; GSList *devices; GHashTable *index; g_return_val_if_fail (store != NULL, NULL); g_return_val_if_fail (key != NULL, NULL); g_return_val_if_fail (value != NULL, NULL); index = g_hash_table_lookup (store->property_index, key); if (index) { devices = g_hash_table_lookup (index, value); if (devices) return (HalDevice*) devices->data; else return NULL; } else { for (iter = store->devices; iter != NULL; iter = iter->next) { HalDevice *d = HAL_DEVICE (iter->data); int type; if (!hal_device_has_property (d, key)) continue; type = hal_device_property_get_type (d, key); if (type != HAL_PROPERTY_TYPE_STRING) continue; if (strcmp (hal_device_property_get_string (d, key), value) == 0) return d; } } return NULL; }