From 6dce39846999951353c2e866019a79d568c99dfa Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Mon, 25 Jul 2011 18:42:24 +0100 Subject: the beginnings of the udev work --- src/udev-mgr.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 63 insertions(+), 5 deletions(-) (limited to 'src/udev-mgr.c') diff --git a/src/udev-mgr.c b/src/udev-mgr.c index 6575ca5..b5c1936 100644 --- a/src/udev-mgr.c +++ b/src/udev-mgr.c @@ -18,21 +18,63 @@ with this program. If not, see . */ #include "udev-mgr.h" +#include + +static void udevice_mgr_device_list_iterator (gpointer data, + gpointer userdata); +static void udev_mgr_uevent_cb (GUdevClient *client, + gchar *action, + GUdevDevice *device, + gpointer user_data); +struct _UdevMgr +{ + GObject parent_instance; + DbusmenuMenuitem* scanner_item; + DbusmenuMenuitem* webcam_item; + GUdevClient* client; +}; G_DEFINE_TYPE (UdevMgr, udev_mgr, G_TYPE_OBJECT); static void -udev_mgr_init (UdevMgr *object) +udev_mgr_init (UdevMgr* self) +{ + self->client = NULL; + const gchar *subsystems[1] = {"usb"}; + self->client = g_udev_client_new (subsystems); + const gchar* usb_subsystem = "usb"; + + GList* devices_available = g_udev_client_query_by_subsystem (self->client, + usb_subsystem); + + if (FALSE){ + g_list_foreach (devices_available, udevice_mgr_device_list_iterator, self); + } + //g_list_free (devices_available); + if (FALSE){ + g_signal_connect (G_OBJECT (self->client), + "u-event", + G_CALLBACK (udev_mgr_uevent_cb), + self); + } +} + +static void +udevice_mgr_device_list_iterator (gpointer data, gpointer userdata) { - /* TODO: Add initialization code here */ + g_return_if_fail (G_UDEV_IS_DEVICE (data)); + GUdevDevice* device = G_UDEV_DEVICE (data); + const gchar* name = g_udev_device_get_name (device); + + g_debug ("UDEV MGR - the name of the device = %s", name); + // for now tidy up here. + g_object_unref (device); } static void udev_mgr_finalize (GObject *object) { - /* TODO: Add deinitalization code here */ - G_OBJECT_CLASS (udev_mgr_parent_class)->finalize (object); } @@ -40,7 +82,23 @@ static void udev_mgr_class_init (UdevMgrClass *klass) { GObjectClass* object_class = G_OBJECT_CLASS (klass); - object_class->finalize = udev_mgr_finalize; } +static void udev_mgr_uevent_cb (GUdevClient *client, + gchar *action, + GUdevDevice *device, + gpointer user_data) +{ + g_debug ("just received a UEVENT with an action : %s", action); + g_return_if_fail (UDEV_IS_MGR (user_data)); +} + +UdevMgr* udev_mgr_new (DbusmenuMenuitem* scanner, + DbusmenuMenuitem* webcam) +{ + UdevMgr* mgr = g_object_new (UDEV_TYPE_MGR, NULL); + mgr->scanner_item = scanner; + mgr->webcam_item = webcam; + return mgr; +} -- cgit v1.2.3 From bdfda68f33615dd7f24b35f425c44c9ef63a1675 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Tue, 26 Jul 2011 12:48:56 +0100 Subject: fixed gudev segfault --- src/udev-mgr.c | 40 +++++++++++++++++++--------------------- 1 file changed, 19 insertions(+), 21 deletions(-) (limited to 'src/udev-mgr.c') diff --git a/src/udev-mgr.c b/src/udev-mgr.c index b5c1936..e100f16 100644 --- a/src/udev-mgr.c +++ b/src/udev-mgr.c @@ -26,6 +26,7 @@ static void udev_mgr_uevent_cb (GUdevClient *client, gchar *action, GUdevDevice *device, gpointer user_data); + struct _UdevMgr { GObject parent_instance; @@ -34,6 +35,8 @@ struct _UdevMgr GUdevClient* client; }; +const char *subsystems[1] = {"usb"}; +const gchar* usb_subsystem = "usb"; G_DEFINE_TYPE (UdevMgr, udev_mgr, G_TYPE_OBJECT); @@ -41,37 +44,19 @@ static void udev_mgr_init (UdevMgr* self) { self->client = NULL; - const gchar *subsystems[1] = {"usb"}; self->client = g_udev_client_new (subsystems); - const gchar* usb_subsystem = "usb"; GList* devices_available = g_udev_client_query_by_subsystem (self->client, usb_subsystem); - if (FALSE){ - g_list_foreach (devices_available, udevice_mgr_device_list_iterator, self); - } - //g_list_free (devices_available); - if (FALSE){ + g_list_foreach (devices_available, udevice_mgr_device_list_iterator, self); + g_list_free (devices_available); g_signal_connect (G_OBJECT (self->client), - "u-event", + "uevent", G_CALLBACK (udev_mgr_uevent_cb), self); - } } -static void -udevice_mgr_device_list_iterator (gpointer data, gpointer userdata) -{ - g_return_if_fail (G_UDEV_IS_DEVICE (data)); - GUdevDevice* device = G_UDEV_DEVICE (data); - const gchar* name = g_udev_device_get_name (device); - - g_debug ("UDEV MGR - the name of the device = %s", name); - // for now tidy up here. - g_object_unref (device); -} - static void udev_mgr_finalize (GObject *object) { @@ -85,6 +70,18 @@ udev_mgr_class_init (UdevMgrClass *klass) object_class->finalize = udev_mgr_finalize; } +static void +udevice_mgr_device_list_iterator (gpointer data, gpointer userdata) +{ + g_return_if_fail (G_UDEV_IS_DEVICE (data)); + GUdevDevice* device = G_UDEV_DEVICE (data); + const gchar* name = g_udev_device_get_name (device); + + g_debug ("UDEV MGR - the name of the device = %s", name); + // for now tidy up here. + g_object_unref (device); +} + static void udev_mgr_uevent_cb (GUdevClient *client, gchar *action, GUdevDevice *device, @@ -94,6 +91,7 @@ static void udev_mgr_uevent_cb (GUdevClient *client, g_return_if_fail (UDEV_IS_MGR (user_data)); } + UdevMgr* udev_mgr_new (DbusmenuMenuitem* scanner, DbusmenuMenuitem* webcam) { -- cgit v1.2.3 From e3b36473ed5400c60f4f08b8cc88bc4e384f3b32 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Tue, 26 Jul 2011 16:38:53 +0100 Subject: research trace for devices in udev --- src/udev-mgr.c | 42 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) (limited to 'src/udev-mgr.c') diff --git a/src/udev-mgr.c b/src/udev-mgr.c index e100f16..4dde1b8 100644 --- a/src/udev-mgr.c +++ b/src/udev-mgr.c @@ -20,6 +20,11 @@ with this program. If not, see . #include "udev-mgr.h" #include +#include +#include +#include +#include + static void udevice_mgr_device_list_iterator (gpointer data, gpointer userdata); static void udev_mgr_uevent_cb (GUdevClient *client, @@ -87,8 +92,43 @@ static void udev_mgr_uevent_cb (GUdevClient *client, GUdevDevice *device, gpointer user_data) { - g_debug ("just received a UEVENT with an action : %s", action); g_return_if_fail (UDEV_IS_MGR (user_data)); + + g_debug ("just received a UEVENT with an action : %s", action); + + const gchar* vendor; + const gchar* product; + const gchar* number; + + vendor = g_udev_device_get_property (device, "ID_VENDOR_ID"); + product = g_udev_device_get_property (device, "ID_MODEL_ID"); + number = g_udev_device_get_number (device); + g_debug ("device vendor id %s and product id of %s and number of %s", + g_strdup(vendor), + g_strdup(product), + g_strdup(number)); + + const gchar *const *list; + const gchar *const *iter; + char propstr[500]; + guint32 namelen = 0, i; + + list = g_udev_device_get_property_keys(device); + + for (iter = list; iter && *iter; iter++) { + if (strlen(*iter) > namelen) + namelen = strlen(*iter); + } + namelen++; + + for (iter = list; iter && *iter; iter++) { + strcpy(propstr, *iter); + strcat(propstr, ":"); + for (i = 0; i < namelen - strlen(*iter); i++) + strcat(propstr, " "); + strcat(propstr, g_udev_device_get_property(device, *iter)); + g_debug("%s", propstr); + } } -- cgit v1.2.3 From 8e8a2b83bd5e5f5d293a64bfb5e5a163b80fad0d Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Tue, 26 Jul 2011 18:23:59 +0100 Subject: pattern established as to how to handle these sane rules --- src/udev-mgr.c | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) (limited to 'src/udev-mgr.c') diff --git a/src/udev-mgr.c b/src/udev-mgr.c index 4dde1b8..31ccb63 100644 --- a/src/udev-mgr.c +++ b/src/udev-mgr.c @@ -17,27 +17,29 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#include "udev-mgr.h" #include - +// TEMP #include #include #include #include +#include "udev-mgr.h" +#include "sane-rules.h" + static void udevice_mgr_device_list_iterator (gpointer data, gpointer userdata); static void udev_mgr_uevent_cb (GUdevClient *client, gchar *action, GUdevDevice *device, - gpointer user_data); - + gpointer user_data); struct _UdevMgr { GObject parent_instance; DbusmenuMenuitem* scanner_item; DbusmenuMenuitem* webcam_item; GUdevClient* client; + GHashTable* supported_scanners; }; const char *subsystems[1] = {"usb"}; @@ -45,12 +47,24 @@ const gchar* usb_subsystem = "usb"; G_DEFINE_TYPE (UdevMgr, udev_mgr, G_TYPE_OBJECT); +static void +test_usb_scanners(gpointer data, gpointer user_data) +{ + gchar* model = (gchar*)data; + g_debug ("in hash table for epsom model %s was found", model); +} + static void udev_mgr_init (UdevMgr* self) { self->client = NULL; - self->client = g_udev_client_new (subsystems); - + self->supported_scanners = NULL; + + self->client = g_udev_client_new (subsystems); + self->supported_scanners = g_hash_table_new (g_str_hash, g_str_equal); + populate_usb_scanners(self->supported_scanners); + GList* epsom = g_hash_table_lookup(self->supported_scanners, "04b8"); + g_list_foreach(epsom, test_usb_scanners, NULL); GList* devices_available = g_udev_client_query_by_subsystem (self->client, usb_subsystem); @@ -62,6 +76,7 @@ udev_mgr_init (UdevMgr* self) self); } + static void udev_mgr_finalize (GObject *object) { -- cgit v1.2.3 From b806cc0e1da3010055c196de59eff15ced2a51b5 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Wed, 27 Jul 2011 12:50:24 +0100 Subject: udev scanner detection working at startup --- src/udev-mgr.c | 52 +++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 45 insertions(+), 7 deletions(-) (limited to 'src/udev-mgr.c') diff --git a/src/udev-mgr.c b/src/udev-mgr.c index 31ccb63..8a5f539 100644 --- a/src/udev-mgr.c +++ b/src/udev-mgr.c @@ -18,6 +18,7 @@ with this program. If not, see . */ #include + // TEMP #include #include @@ -32,7 +33,10 @@ static void udevice_mgr_device_list_iterator (gpointer data, static void udev_mgr_uevent_cb (GUdevClient *client, gchar *action, GUdevDevice *device, - gpointer user_data); + gpointer user_data); +/*static gboolean udev_mgr_compare_models (gconstpointer data1, + gconstpointer data2); +*/ struct _UdevMgr { GObject parent_instance; @@ -47,12 +51,12 @@ const gchar* usb_subsystem = "usb"; G_DEFINE_TYPE (UdevMgr, udev_mgr, G_TYPE_OBJECT); -static void +/*static void test_usb_scanners(gpointer data, gpointer user_data) { gchar* model = (gchar*)data; g_debug ("in hash table for epsom model %s was found", model); -} +}*/ static void udev_mgr_init (UdevMgr* self) @@ -63,8 +67,6 @@ udev_mgr_init (UdevMgr* self) self->client = g_udev_client_new (subsystems); self->supported_scanners = g_hash_table_new (g_str_hash, g_str_equal); populate_usb_scanners(self->supported_scanners); - GList* epsom = g_hash_table_lookup(self->supported_scanners, "04b8"); - g_list_foreach(epsom, test_usb_scanners, NULL); GList* devices_available = g_udev_client_query_by_subsystem (self->client, usb_subsystem); @@ -94,11 +96,40 @@ static void udevice_mgr_device_list_iterator (gpointer data, gpointer userdata) { g_return_if_fail (G_UDEV_IS_DEVICE (data)); + g_return_if_fail (UDEV_IS_MGR (userdata)); + + UdevMgr* self = UDEV_MGR (userdata); + GUdevDevice* device = G_UDEV_DEVICE (data); + const gchar* name = g_udev_device_get_name (device); - g_debug ("UDEV MGR - the name of the device = %s", name); - // for now tidy up here. + const gchar* vendor = NULL; + const gchar* product = NULL; + GList* vendor_list = NULL; + + vendor = g_udev_device_get_property (device, "ID_VENDOR_ID"); + + if (vendor == NULL){ + g_object_unref (device); + return; + } + + product = g_udev_device_get_property (device, "ID_MODEL_ID"); + vendor_list = g_hash_table_lookup(self->supported_scanners, (gpointer)vendor); + + GList* model = NULL; + + if (vendor_list != NULL){ + model = g_list_find_custom(vendor_list, product, (GCompareFunc)g_strcmp0); + if (model == NULL){ + g_debug ("CANT FIND THE MODEL %s FOR VENDOR %s", product, vendor); + } + else{ + dbusmenu_menuitem + g_debug ("WE HAVE A SUCCESSFUL MATCH!"); + } + } g_object_unref (device); } @@ -118,6 +149,7 @@ static void udev_mgr_uevent_cb (GUdevClient *client, vendor = g_udev_device_get_property (device, "ID_VENDOR_ID"); product = g_udev_device_get_property (device, "ID_MODEL_ID"); number = g_udev_device_get_number (device); + g_debug ("device vendor id %s and product id of %s and number of %s", g_strdup(vendor), g_strdup(product), @@ -146,6 +178,12 @@ static void udev_mgr_uevent_cb (GUdevClient *client, } } +/*static gboolean +udev_mgr_compare_models (gconstpointer data1, + gconstpointer data2) +{ + return FALSE; +}*/ UdevMgr* udev_mgr_new (DbusmenuMenuitem* scanner, DbusmenuMenuitem* webcam) -- cgit v1.2.3 From b4fd0a59df355527593522e66120a12778af11b2 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Wed, 27 Jul 2011 16:15:36 +0100 Subject: refactor with a more generic utility function --- src/udev-mgr.c | 50 +++++++++++++++++++++++++++++++------------------- 1 file changed, 31 insertions(+), 19 deletions(-) (limited to 'src/udev-mgr.c') diff --git a/src/udev-mgr.c b/src/udev-mgr.c index 8a5f539..80e49dd 100644 --- a/src/udev-mgr.c +++ b/src/udev-mgr.c @@ -34,9 +34,8 @@ static void udev_mgr_uevent_cb (GUdevClient *client, gchar *action, GUdevDevice *device, gpointer user_data); -/*static gboolean udev_mgr_compare_models (gconstpointer data1, - gconstpointer data2); -*/ +static void udev_mgr_update_menuitems (UdevMgr* self); + struct _UdevMgr { GObject parent_instance; @@ -44,6 +43,7 @@ struct _UdevMgr DbusmenuMenuitem* webcam_item; GUdevClient* client; GHashTable* supported_scanners; + gint scanners_present; }; const char *subsystems[1] = {"usb"}; @@ -63,15 +63,11 @@ udev_mgr_init (UdevMgr* self) { self->client = NULL; self->supported_scanners = NULL; - + self->scanners_present = 0; + self->client = g_udev_client_new (subsystems); self->supported_scanners = g_hash_table_new (g_str_hash, g_str_equal); populate_usb_scanners(self->supported_scanners); - GList* devices_available = g_udev_client_query_by_subsystem (self->client, - usb_subsystem); - - g_list_foreach (devices_available, udevice_mgr_device_list_iterator, self); - g_list_free (devices_available); g_signal_connect (G_OBJECT (self->client), "uevent", G_CALLBACK (udev_mgr_uevent_cb), @@ -101,9 +97,7 @@ udevice_mgr_device_list_iterator (gpointer data, gpointer userdata) UdevMgr* self = UDEV_MGR (userdata); GUdevDevice* device = G_UDEV_DEVICE (data); - - const gchar* name = g_udev_device_get_name (device); - + const gchar* vendor = NULL; const gchar* product = NULL; GList* vendor_list = NULL; @@ -126,13 +120,22 @@ udevice_mgr_device_list_iterator (gpointer data, gpointer userdata) g_debug ("CANT FIND THE MODEL %s FOR VENDOR %s", product, vendor); } else{ - dbusmenu_menuitem + self->scanners_present += 1; g_debug ("WE HAVE A SUCCESSFUL MATCH!"); - } + } } + g_debug ("JUST SET SCANNERS TO TRUE"); g_object_unref (device); } + +static void udev_mgr_update_menuitems (UdevMgr* self) +{ + dbusmenu_menuitem_property_set_bool (self->scanner_item, + DBUSMENU_MENUITEM_PROP_VISIBLE, + self->scanners_present > 0); +} + static void udev_mgr_uevent_cb (GUdevClient *client, gchar *action, GUdevDevice *device, @@ -178,12 +181,12 @@ static void udev_mgr_uevent_cb (GUdevClient *client, } } -/*static gboolean -udev_mgr_compare_models (gconstpointer data1, - gconstpointer data2) +static gboolean +udev_mgr_is_this_a_supported_scanner (UdevMgr* self, + GUdevDevice *device) { - return FALSE; -}*/ + +} UdevMgr* udev_mgr_new (DbusmenuMenuitem* scanner, DbusmenuMenuitem* webcam) @@ -191,5 +194,14 @@ UdevMgr* udev_mgr_new (DbusmenuMenuitem* scanner, UdevMgr* mgr = g_object_new (UDEV_TYPE_MGR, NULL); mgr->scanner_item = scanner; mgr->webcam_item = webcam; + + GList* devices_available = g_udev_client_query_by_subsystem (mgr->client, + usb_subsystem); + + g_list_foreach (devices_available, + udevice_mgr_device_list_iterator, + mgr); + g_list_free (devices_available); + udev_mgr_update_menuitems (mgr); return mgr; } -- cgit v1.2.3 From 764a81d40737fdb3acb76103c7c895b77e18d300 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Wed, 27 Jul 2011 17:23:28 +0100 Subject: convenience method added to handle the insertion and startup detection of scanners --- src/udev-mgr.c | 81 +++++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 66 insertions(+), 15 deletions(-) (limited to 'src/udev-mgr.c') diff --git a/src/udev-mgr.c b/src/udev-mgr.c index 80e49dd..f4b357d 100644 --- a/src/udev-mgr.c +++ b/src/udev-mgr.c @@ -35,7 +35,10 @@ static void udev_mgr_uevent_cb (GUdevClient *client, GUdevDevice *device, gpointer user_data); static void udev_mgr_update_menuitems (UdevMgr* self); - +static void udev_mgr_check_if_device_is_supported (UdevMgr* self, + GUdevDevice *device, + UdevMgrDeviceAction action); + struct _UdevMgr { GObject parent_instance; @@ -43,10 +46,10 @@ struct _UdevMgr DbusmenuMenuitem* webcam_item; GUdevClient* client; GHashTable* supported_scanners; - gint scanners_present; + GHashTable* scanners_present; }; -const char *subsystems[1] = {"usb"}; +const char *subsystems[2] = {"usb", "scsi"}; const gchar* usb_subsystem = "usb"; G_DEFINE_TYPE (UdevMgr, udev_mgr, G_TYPE_OBJECT); @@ -63,21 +66,23 @@ udev_mgr_init (UdevMgr* self) { self->client = NULL; self->supported_scanners = NULL; - self->scanners_present = 0; - + self->scanners_present = NULL; + self->client = g_udev_client_new (subsystems); self->supported_scanners = g_hash_table_new (g_str_hash, g_str_equal); + self->scanners_present = g_hash_table_new (g_str_hash, g_str_equal); + populate_usb_scanners(self->supported_scanners); g_signal_connect (G_OBJECT (self->client), "uevent", G_CALLBACK (udev_mgr_uevent_cb), self); } - static void udev_mgr_finalize (GObject *object) { + // TODO tidy up hashtables. G_OBJECT_CLASS (udev_mgr_parent_class)->finalize (object); } @@ -97,8 +102,9 @@ udevice_mgr_device_list_iterator (gpointer data, gpointer userdata) UdevMgr* self = UDEV_MGR (userdata); GUdevDevice* device = G_UDEV_DEVICE (data); - - const gchar* vendor = NULL; + udev_mgr_check_if_device_is_supported (self, device, ADD); + + /*const gchar* vendor = NULL; const gchar* product = NULL; GList* vendor_list = NULL; @@ -124,7 +130,7 @@ udevice_mgr_device_list_iterator (gpointer data, gpointer userdata) g_debug ("WE HAVE A SUCCESSFUL MATCH!"); } } - g_debug ("JUST SET SCANNERS TO TRUE"); + g_debug ("JUST SET SCANNERS TO TRUE");*/ g_object_unref (device); } @@ -133,7 +139,7 @@ static void udev_mgr_update_menuitems (UdevMgr* self) { dbusmenu_menuitem_property_set_bool (self->scanner_item, DBUSMENU_MENUITEM_PROP_VISIBLE, - self->scanners_present > 0); + g_hash_table_size (self->scanners_present) > 0); } static void udev_mgr_uevent_cb (GUdevClient *client, @@ -142,9 +148,15 @@ static void udev_mgr_uevent_cb (GUdevClient *client, gpointer user_data) { g_return_if_fail (UDEV_IS_MGR (user_data)); - + UdevMgr* self = UDEV_MGR (user_data); g_debug ("just received a UEVENT with an action : %s", action); + + UdevMgrDeviceAction udev_mgr_action = ADD; + if (g_strcmp0 (action, "remove") == 0){ + udev_mgr_action = REMOVE; + } + udev_mgr_check_if_device_is_supported (self, device, udev_mgr_action); const gchar* vendor; const gchar* product; const gchar* number; @@ -178,14 +190,53 @@ static void udev_mgr_uevent_cb (GUdevClient *client, strcat(propstr, " "); strcat(propstr, g_udev_device_get_property(device, *iter)); g_debug("%s", propstr); - } + } } -static gboolean -udev_mgr_is_this_a_supported_scanner (UdevMgr* self, - GUdevDevice *device) +static void +udev_mgr_check_if_device_is_supported (UdevMgr* self, + GUdevDevice *device, + UdevMgrDeviceAction action) { + const gchar* vendor = NULL; + vendor = g_udev_device_get_property (device, "ID_VENDOR_ID"); + if (vendor == NULL) + return; + + GList* vendor_list = NULL; + vendor_list = g_hash_table_lookup (self->supported_scanners, + (gpointer)vendor); + if (vendor_list == NULL) + return; + + const gchar* model_id = NULL; + model_id = g_udev_device_get_property (device, "ID_MODEL_ID"); + + if (model_id == NULL) + return; + + GList* model_entry = NULL; + model_entry = g_list_find_custom(vendor_list, model_id, (GCompareFunc)g_strcmp0); + + if (model_entry != NULL){ + if (action == REMOVE){ + // TODO handle the case where its removed + // remove it if present from the hash and call update_menuitems + } + else{ + g_hash_table_insert (self->scanners_present, + g_strdup(vendor), + g_strdup(model_id)); + } + } + // DEBUG purposes. + if (model_entry == NULL){ + g_debug ("CANT FIND THE MODEL %s FOR VENDOR %s", model_id, vendor); + } + else{ + g_debug ("WE HAVE A SUCCESSFUL MATCH!"); + } } UdevMgr* udev_mgr_new (DbusmenuMenuitem* scanner, -- cgit v1.2.3 From 933bbfd1c0ea8b59c9d40ad85584e97fcfe8f874 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Tue, 2 Aug 2011 18:14:54 +0100 Subject: certain usb webcams sorted --- src/udev-mgr.c | 100 ++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 84 insertions(+), 16 deletions(-) (limited to 'src/udev-mgr.c') diff --git a/src/udev-mgr.c b/src/udev-mgr.c index f4b357d..5a455d1 100644 --- a/src/udev-mgr.c +++ b/src/udev-mgr.c @@ -35,17 +35,21 @@ static void udev_mgr_uevent_cb (GUdevClient *client, GUdevDevice *device, gpointer user_data); static void udev_mgr_update_menuitems (UdevMgr* self); -static void udev_mgr_check_if_device_is_supported (UdevMgr* self, - GUdevDevice *device, - UdevMgrDeviceAction action); - +static void udev_mgr_check_if_usb_device_is_supported (UdevMgr* self, + GUdevDevice *device, + UdevMgrDeviceAction action); + +static void udev_mgr_check_if_scsi_device_is_supported (UdevMgr* self, + GUdevDevice *device, + UdevMgrDeviceAction action); + struct _UdevMgr { GObject parent_instance; DbusmenuMenuitem* scanner_item; DbusmenuMenuitem* webcam_item; GUdevClient* client; - GHashTable* supported_scanners; + GHashTable* supported_usb_scanners; GHashTable* scanners_present; }; @@ -65,14 +69,14 @@ static void udev_mgr_init (UdevMgr* self) { self->client = NULL; - self->supported_scanners = NULL; + self->supported_usb_scanners = NULL; self->scanners_present = NULL; self->client = g_udev_client_new (subsystems); - self->supported_scanners = g_hash_table_new (g_str_hash, g_str_equal); + self->supported_usb_scanners = g_hash_table_new (g_str_hash, g_str_equal); self->scanners_present = g_hash_table_new (g_str_hash, g_str_equal); - populate_usb_scanners(self->supported_scanners); + populate_usb_scanners(self->supported_usb_scanners); g_signal_connect (G_OBJECT (self->client), "uevent", G_CALLBACK (udev_mgr_uevent_cb), @@ -102,7 +106,7 @@ udevice_mgr_device_list_iterator (gpointer data, gpointer userdata) UdevMgr* self = UDEV_MGR (userdata); GUdevDevice* device = G_UDEV_DEVICE (data); - udev_mgr_check_if_device_is_supported (self, device, ADD); + udev_mgr_check_if_usb_device_is_supported (self, device, ADD); /*const gchar* vendor = NULL; const gchar* product = NULL; @@ -149,6 +153,8 @@ static void udev_mgr_uevent_cb (GUdevClient *client, { g_return_if_fail (UDEV_IS_MGR (user_data)); UdevMgr* self = UDEV_MGR (user_data); + g_return_if_fail (device != NULL); + g_debug ("just received a UEVENT with an action : %s", action); UdevMgrDeviceAction udev_mgr_action = ADD; @@ -156,7 +162,56 @@ static void udev_mgr_uevent_cb (GUdevClient *client, if (g_strcmp0 (action, "remove") == 0){ udev_mgr_action = REMOVE; } - udev_mgr_check_if_device_is_supported (self, device, udev_mgr_action); + const gchar* subsystem = NULL; + const gchar* device_type = NULL; + + device_type = g_udev_device_get_devtype (device); + subsystem = g_udev_device_get_subsystem (device); + + g_debug ("And the subsystem is %s", subsystem); + g_debug ("And the device_type is %s", device_type); + + if (g_strcmp0 (subsystem, "usb") == 0){ + if ( g_udev_device_has_property (device, "ID_USB_INTERFACES")){ + const gchar* id_usb_interfaces = NULL; + id_usb_interfaces = g_udev_device_get_property (device, "ID_USB_INTERFACES"); + + GError* error = NULL; + GMatchInfo *match_info = NULL; + GRegex* webcam_regex = NULL; + + webcam_regex = g_regex_new (":0e[0-9]{4}:*", + 0, + 0, + &error); + // This seems to be case with certain webcams + //#":ff[f|0]{4} + if (error != NULL){ + g_debug ("Errors creating the regex : %s", error->message); + } + gboolean result = g_regex_match (webcam_regex, + id_usb_interfaces, + 0, + & match_info); + + g_debug ("we have found the id usb interfaces : %s", id_usb_interfaces); + + if (result == TRUE){ + g_debug ("SUCCESSFUL MATCH"); + } + else { + g_debug ("NO MATCH"); + } + } + + udev_mgr_check_if_usb_device_is_supported (self, device, udev_mgr_action); + } + else if (g_strcmp0 (subsystem, "scsi") == 0){ + udev_mgr_check_if_scsi_device_is_supported (self, device, udev_mgr_action); + } + + return; + const gchar* vendor; const gchar* product; const gchar* number; @@ -193,19 +248,31 @@ static void udev_mgr_uevent_cb (GUdevClient *client, } } + +static void +udev_mgr_check_if_scsi_device_is_supported (UdevMgr* self, + GUdevDevice *device, + UdevMgrDeviceAction action) +{ +} + static void -udev_mgr_check_if_device_is_supported (UdevMgr* self, - GUdevDevice *device, - UdevMgrDeviceAction action) +udev_mgr_check_if_usb_device_is_supported (UdevMgr* self, + GUdevDevice *device, + UdevMgrDeviceAction action) { + g_debug ("got a uevent"); const gchar* vendor = NULL; + vendor = g_udev_device_get_property (device, "ID_VENDOR_ID"); if (vendor == NULL) return; + g_debug ("vendor = %s", vendor); + GList* vendor_list = NULL; - vendor_list = g_hash_table_lookup (self->supported_scanners, + vendor_list = g_hash_table_lookup (self->supported_usb_scanners, (gpointer)vendor); if (vendor_list == NULL) return; @@ -223,8 +290,10 @@ udev_mgr_check_if_device_is_supported (UdevMgr* self, if (action == REMOVE){ // TODO handle the case where its removed // remove it if present from the hash and call update_menuitems - } + } else{ + // TODO: populate it with the name of the device + // this will be needed for the menuitem g_hash_table_insert (self->scanners_present, g_strdup(vendor), g_strdup(model_id)); @@ -248,7 +317,6 @@ UdevMgr* udev_mgr_new (DbusmenuMenuitem* scanner, GList* devices_available = g_udev_client_query_by_subsystem (mgr->client, usb_subsystem); - g_list_foreach (devices_available, udevice_mgr_device_list_iterator, mgr); -- cgit v1.2.3 From 88d74cf2b768eda753cd2bc85013203be6d9ca3b Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Wed, 3 Aug 2011 17:26:12 +0100 Subject: webcams working nicely --- src/udev-mgr.c | 211 ++++++++++++++++++++++++++++++--------------------------- 1 file changed, 113 insertions(+), 98 deletions(-) (limited to 'src/udev-mgr.c') diff --git a/src/udev-mgr.c b/src/udev-mgr.c index 5a455d1..5c650b6 100644 --- a/src/udev-mgr.c +++ b/src/udev-mgr.c @@ -42,6 +42,14 @@ static void udev_mgr_check_if_usb_device_is_supported (UdevMgr* self, static void udev_mgr_check_if_scsi_device_is_supported (UdevMgr* self, GUdevDevice *device, UdevMgrDeviceAction action); +static void udev_mgr_handle_webcam (UdevMgr* self, + GUdevDevice* device, + UdevMgrDeviceAction action); + +static void debug_device (UdevMgr* self, + GUdevDevice* device, + UdevMgrDeviceAction action); + struct _UdevMgr { @@ -51,19 +59,15 @@ struct _UdevMgr GUdevClient* client; GHashTable* supported_usb_scanners; GHashTable* scanners_present; + GHashTable* webcams_present; }; -const char *subsystems[2] = {"usb", "scsi"}; +const char *subsystems[3] = {"usb", "scsi", "video4linux"}; const gchar* usb_subsystem = "usb"; +const gchar* video4linux_subsystem = "video4linux"; -G_DEFINE_TYPE (UdevMgr, udev_mgr, G_TYPE_OBJECT); -/*static void -test_usb_scanners(gpointer data, gpointer user_data) -{ - gchar* model = (gchar*)data; - g_debug ("in hash table for epsom model %s was found", model); -}*/ +G_DEFINE_TYPE (UdevMgr, udev_mgr, G_TYPE_OBJECT); static void udev_mgr_init (UdevMgr* self) @@ -71,12 +75,16 @@ udev_mgr_init (UdevMgr* self) self->client = NULL; self->supported_usb_scanners = NULL; self->scanners_present = NULL; - + self->webcams_present = NULL; + self->client = g_udev_client_new (subsystems); self->supported_usb_scanners = g_hash_table_new (g_str_hash, g_str_equal); self->scanners_present = g_hash_table_new (g_str_hash, g_str_equal); + self->webcams_present = g_hash_table_new (g_str_hash, g_str_equal); + // load into memory all supported scanners ... populate_usb_scanners(self->supported_usb_scanners); + g_signal_connect (G_OBJECT (self->client), "uevent", G_CALLBACK (udev_mgr_uevent_cb), @@ -106,35 +114,16 @@ udevice_mgr_device_list_iterator (gpointer data, gpointer userdata) UdevMgr* self = UDEV_MGR (userdata); GUdevDevice* device = G_UDEV_DEVICE (data); - udev_mgr_check_if_usb_device_is_supported (self, device, ADD); - /*const gchar* vendor = NULL; - const gchar* product = NULL; - GList* vendor_list = NULL; - - vendor = g_udev_device_get_property (device, "ID_VENDOR_ID"); - - if (vendor == NULL){ - g_object_unref (device); - return; - } + const gchar* subsystem = NULL; + subsystem = g_udev_device_get_subsystem (device); - product = g_udev_device_get_property (device, "ID_MODEL_ID"); - vendor_list = g_hash_table_lookup(self->supported_scanners, (gpointer)vendor); - - GList* model = NULL; - - if (vendor_list != NULL){ - model = g_list_find_custom(vendor_list, product, (GCompareFunc)g_strcmp0); - if (model == NULL){ - g_debug ("CANT FIND THE MODEL %s FOR VENDOR %s", product, vendor); - } - else{ - self->scanners_present += 1; - g_debug ("WE HAVE A SUCCESSFUL MATCH!"); - } + if (g_strcmp0 (subsystem, "usb") == 0){ + udev_mgr_check_if_usb_device_is_supported (self, device, ADD); + } + else if (g_strcmp0 (subsystem, "video4linux") == 0){ + udev_mgr_handle_webcam (self, device, ADD); } - g_debug ("JUST SET SCANNERS TO TRUE");*/ g_object_unref (device); } @@ -144,6 +133,11 @@ static void udev_mgr_update_menuitems (UdevMgr* self) dbusmenu_menuitem_property_set_bool (self->scanner_item, DBUSMENU_MENUITEM_PROP_VISIBLE, g_hash_table_size (self->scanners_present) > 0); + + dbusmenu_menuitem_property_set_bool (self->webcam_item, + DBUSMENU_MENUITEM_PROP_VISIBLE, + g_hash_table_size (self->webcams_present) > 0); + } static void udev_mgr_uevent_cb (GUdevClient *client, @@ -162,68 +156,79 @@ static void udev_mgr_uevent_cb (GUdevClient *client, if (g_strcmp0 (action, "remove") == 0){ udev_mgr_action = REMOVE; } - const gchar* subsystem = NULL; - const gchar* device_type = NULL; - device_type = g_udev_device_get_devtype (device); + const gchar* subsystem = NULL; subsystem = g_udev_device_get_subsystem (device); - g_debug ("And the subsystem is %s", subsystem); - g_debug ("And the device_type is %s", device_type); - if (g_strcmp0 (subsystem, "usb") == 0){ - if ( g_udev_device_has_property (device, "ID_USB_INTERFACES")){ - const gchar* id_usb_interfaces = NULL; - id_usb_interfaces = g_udev_device_get_property (device, "ID_USB_INTERFACES"); - - GError* error = NULL; - GMatchInfo *match_info = NULL; - GRegex* webcam_regex = NULL; - - webcam_regex = g_regex_new (":0e[0-9]{4}:*", - 0, - 0, - &error); - // This seems to be case with certain webcams - //#":ff[f|0]{4} - if (error != NULL){ - g_debug ("Errors creating the regex : %s", error->message); - } - gboolean result = g_regex_match (webcam_regex, - id_usb_interfaces, - 0, - & match_info); - - g_debug ("we have found the id usb interfaces : %s", id_usb_interfaces); - - if (result == TRUE){ - g_debug ("SUCCESSFUL MATCH"); - } - else { - g_debug ("NO MATCH"); - } - } - - udev_mgr_check_if_usb_device_is_supported (self, device, udev_mgr_action); + udev_mgr_check_if_usb_device_is_supported (self, + device, + udev_mgr_action); + } + else if (g_strcmp0 (subsystem, "video4linux") == 0){ + udev_mgr_handle_webcam (self, device, udev_mgr_action); } else if (g_strcmp0 (subsystem, "scsi") == 0){ udev_mgr_check_if_scsi_device_is_supported (self, device, udev_mgr_action); } +} + +static void +udev_mgr_handle_webcam (UdevMgr* self, + GUdevDevice* device, + UdevMgrDeviceAction action) +{ + if (FALSE) + debug_device (self, device, action); + + const gchar* vendor; + const gchar* product; - return; + vendor = g_udev_device_get_property (device, "ID_VENDOR_ID"); + product = g_udev_device_get_property (device, "ID_MODEL_ID"); + if (action == REMOVE){ + if (g_hash_table_lookup (self->webcams_present, product) == NULL){ + g_warning ("Got a remove event on a webcam device but we don't have that device in our webcam cache"); + return; + } + g_hash_table_remove (self->webcams_present, + g_strdup (product)); + + } + else { + if (g_hash_table_lookup (self->webcams_present, product) != NULL){ + g_warning ("Got an ADD event on a webcam device but we already have that device in our webcam cache"); + return; + } + g_hash_table_insert (self->webcams_present, + g_strdup (product), + g_strdup (vendor)); + + } + udev_mgr_update_menuitems (self); +} + +static void +debug_device (UdevMgr* self, + GUdevDevice* device, + UdevMgrDeviceAction action) +{ const gchar* vendor; const gchar* product; const gchar* number; + const gchar* name; vendor = g_udev_device_get_property (device, "ID_VENDOR_ID"); product = g_udev_device_get_property (device, "ID_MODEL_ID"); number = g_udev_device_get_number (device); - - g_debug ("device vendor id %s and product id of %s and number of %s", + name = g_udev_device_get_name (device); + + g_debug ("device vendor id %s , product id of %s , number of %s and name of %s", g_strdup(vendor), g_strdup(product), - g_strdup(number)); + g_strdup(number), + g_strdup(name)); const gchar *const *list; const gchar *const *iter; @@ -245,7 +250,7 @@ static void udev_mgr_uevent_cb (GUdevClient *client, strcat(propstr, " "); strcat(propstr, g_udev_device_get_property(device, *iter)); g_debug("%s", propstr); - } + } } @@ -261,7 +266,6 @@ udev_mgr_check_if_usb_device_is_supported (UdevMgr* self, GUdevDevice *device, UdevMgrDeviceAction action) { - g_debug ("got a uevent"); const gchar* vendor = NULL; vendor = g_udev_device_get_property (device, "ID_VENDOR_ID"); @@ -288,24 +292,25 @@ udev_mgr_check_if_usb_device_is_supported (UdevMgr* self, if (model_entry != NULL){ if (action == REMOVE){ - // TODO handle the case where its removed - // remove it if present from the hash and call update_menuitems + if (g_hash_table_lookup (self->scanners_present, g_strdup(vendor)) == NULL){ + g_warning ("Got an REMOVE event on a scanner device but we dont have that device in our scanners cache"); + } + else{ + g_hash_table_remove (self->scanners_present, g_strdup(vendor)); + } } else{ - // TODO: populate it with the name of the device - // this will be needed for the menuitem - g_hash_table_insert (self->scanners_present, - g_strdup(vendor), - g_strdup(model_id)); + if (g_hash_table_lookup (self->scanners_present, g_strdup(vendor)) != NULL){ + g_warning ("Got an ADD event on a scanner device but we already have that device in our scanners cache"); + } + else{ + g_hash_table_insert (self->scanners_present, + g_strdup(vendor), + g_strdup(model_id)); + } } + udev_mgr_update_menuitems (self); } - // DEBUG purposes. - if (model_entry == NULL){ - g_debug ("CANT FIND THE MODEL %s FOR VENDOR %s", model_id, vendor); - } - else{ - g_debug ("WE HAVE A SUCCESSFUL MATCH!"); - } } UdevMgr* udev_mgr_new (DbusmenuMenuitem* scanner, @@ -315,12 +320,22 @@ UdevMgr* udev_mgr_new (DbusmenuMenuitem* scanner, mgr->scanner_item = scanner; mgr->webcam_item = webcam; - GList* devices_available = g_udev_client_query_by_subsystem (mgr->client, + GList* usb_devices_available = g_udev_client_query_by_subsystem (mgr->client, usb_subsystem); - g_list_foreach (devices_available, + g_list_foreach (usb_devices_available, + udevice_mgr_device_list_iterator, + mgr); + + g_list_free (usb_devices_available); + + GList* video_devices_available = g_udev_client_query_by_subsystem (mgr->client, + video4linux_subsystem); + g_list_foreach (video_devices_available, udevice_mgr_device_list_iterator, mgr); - g_list_free (devices_available); - udev_mgr_update_menuitems (mgr); + + g_list_free (video_devices_available); + + //udev_mgr_update_menuitems (mgr); return mgr; } -- cgit v1.2.3 From 85e9bcfb399e489eaa6fbf467f940baa69239bf2 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Wed, 3 Aug 2011 18:01:32 +0100 Subject: refactor of the udev mgr - working nicely --- src/udev-mgr.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/udev-mgr.c') diff --git a/src/udev-mgr.c b/src/udev-mgr.c index 5c650b6..6ddd97d 100644 --- a/src/udev-mgr.c +++ b/src/udev-mgr.c @@ -203,8 +203,7 @@ udev_mgr_handle_webcam (UdevMgr* self, } g_hash_table_insert (self->webcams_present, g_strdup (product), - g_strdup (vendor)); - + g_strdup (vendor)); } udev_mgr_update_menuitems (self); } @@ -267,6 +266,7 @@ udev_mgr_check_if_usb_device_is_supported (UdevMgr* self, UdevMgrDeviceAction action) { const gchar* vendor = NULL; + debug_device (self, device, action); vendor = g_udev_device_get_property (device, "ID_VENDOR_ID"); -- cgit v1.2.3 From 6ec15c2d51f83a10f81d94ad1be2da8761c9553c Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Thu, 4 Aug 2011 11:59:50 +0100 Subject: add scsi scanner detection support --- src/udev-mgr.c | 127 ++++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 99 insertions(+), 28 deletions(-) (limited to 'src/udev-mgr.c') diff --git a/src/udev-mgr.c b/src/udev-mgr.c index 6ddd97d..d110304 100644 --- a/src/udev-mgr.c +++ b/src/udev-mgr.c @@ -37,19 +37,17 @@ static void udev_mgr_uevent_cb (GUdevClient *client, static void udev_mgr_update_menuitems (UdevMgr* self); static void udev_mgr_check_if_usb_device_is_supported (UdevMgr* self, GUdevDevice *device, - UdevMgrDeviceAction action); - -static void udev_mgr_check_if_scsi_device_is_supported (UdevMgr* self, - GUdevDevice *device, - UdevMgrDeviceAction action); + UdevMgrDeviceAction action); static void udev_mgr_handle_webcam (UdevMgr* self, GUdevDevice* device, - UdevMgrDeviceAction action); - + UdevMgrDeviceAction action); +static void udev_mgr_handle_scsi_device (UdevMgr* self, + GUdevDevice* device, + UdevMgrDeviceAction action); + static void debug_device (UdevMgr* self, GUdevDevice* device, UdevMgrDeviceAction action); - struct _UdevMgr { @@ -58,12 +56,14 @@ struct _UdevMgr DbusmenuMenuitem* webcam_item; GUdevClient* client; GHashTable* supported_usb_scanners; + GHashTable* supported_scsi_scanners; GHashTable* scanners_present; GHashTable* webcams_present; }; const char *subsystems[3] = {"usb", "scsi", "video4linux"}; const gchar* usb_subsystem = "usb"; +const gchar* scsi_subsystem = "scsi"; const gchar* video4linux_subsystem = "video4linux"; @@ -76,15 +76,29 @@ udev_mgr_init (UdevMgr* self) self->supported_usb_scanners = NULL; self->scanners_present = NULL; self->webcams_present = NULL; - + g_debug ("About to create hash tables"); self->client = g_udev_client_new (subsystems); - self->supported_usb_scanners = g_hash_table_new (g_str_hash, g_str_equal); - self->scanners_present = g_hash_table_new (g_str_hash, g_str_equal); - self->webcams_present = g_hash_table_new (g_str_hash, g_str_equal); + self->supported_usb_scanners = g_hash_table_new_full (g_str_hash, + g_str_equal, + g_free, + g_free); + self->supported_scsi_scanners = g_hash_table_new_full (g_str_hash, + g_str_equal, + g_free, + g_free); + self->scanners_present = g_hash_table_new_full (g_str_hash, + g_str_equal, + g_free, + g_free); + self->webcams_present = g_hash_table_new_full (g_str_hash, + g_str_equal, + g_free, + g_free); + g_debug ("After creating hash tables"); // load into memory all supported scanners ... - populate_usb_scanners(self->supported_usb_scanners); - + populate_usb_scanners (self->supported_usb_scanners); + populate_scsi_scanners (self->supported_scsi_scanners); g_signal_connect (G_OBJECT (self->client), "uevent", G_CALLBACK (udev_mgr_uevent_cb), @@ -124,6 +138,10 @@ udevice_mgr_device_list_iterator (gpointer data, gpointer userdata) else if (g_strcmp0 (subsystem, "video4linux") == 0){ udev_mgr_handle_webcam (self, device, ADD); } + else if (g_strcmp0 (subsystem, "scsi") == 0){ + udev_mgr_handle_scsi_device (self, device, ADD); + } + g_object_unref (device); } @@ -169,10 +187,11 @@ static void udev_mgr_uevent_cb (GUdevClient *client, udev_mgr_handle_webcam (self, device, udev_mgr_action); } else if (g_strcmp0 (subsystem, "scsi") == 0){ - udev_mgr_check_if_scsi_device_is_supported (self, device, udev_mgr_action); + udev_mgr_handle_scsi_device (self, device, udev_mgr_action); } } + static void udev_mgr_handle_webcam (UdevMgr* self, GUdevDevice* device, @@ -193,7 +212,7 @@ udev_mgr_handle_webcam (UdevMgr* self, return; } g_hash_table_remove (self->webcams_present, - g_strdup (product)); + product); } else { @@ -252,13 +271,55 @@ debug_device (UdevMgr* self, } } - -static void -udev_mgr_check_if_scsi_device_is_supported (UdevMgr* self, - GUdevDevice *device, - UdevMgrDeviceAction action) +static void udev_mgr_handle_scsi_device (UdevMgr* self, + GUdevDevice* device, + UdevMgrDeviceAction action) { -} + const gchar* vendor = NULL; + vendor = g_udev_device_get_property (device, "VENDOR"); + + if (vendor == NULL) + return; + + GList* vendor_list = NULL; + vendor_list = g_hash_table_lookup (self->supported_scsi_scanners, + (gpointer)vendor); + if (vendor_list == NULL) + return; + + const gchar* model_id = NULL; + model_id = g_udev_device_get_property (device, "MODEL"); + + if (model_id == NULL) + return; + + GList* model_entry = NULL; + model_entry = g_list_find_custom (vendor_list, + model_id, + (GCompareFunc)g_strcmp0); + + if (model_entry != NULL){ + if (action == REMOVE){ + if (g_hash_table_lookup (self->scanners_present, g_strdup(vendor)) == NULL){ + g_warning ("Got an REMOVE event on a scanner device but we dont have that device in our scanners cache"); + } + else{ + g_hash_table_remove (self->scanners_present, vendor); + } + } + else{ + if (g_hash_table_lookup (self->scanners_present, g_strdup(vendor)) != NULL){ + g_warning ("Got an ADD event on a scanner device but we already have that device in our scanners cache"); + } + else{ + g_hash_table_insert (self->scanners_present, + g_strdup(vendor), + g_strdup(model_id)); + } + } + udev_mgr_update_menuitems (self); + } +} static void udev_mgr_check_if_usb_device_is_supported (UdevMgr* self, @@ -273,7 +334,7 @@ udev_mgr_check_if_usb_device_is_supported (UdevMgr* self, if (vendor == NULL) return; - g_debug ("vendor = %s", vendor); + //g_debug ("vendor = %s", vendor); GList* vendor_list = NULL; vendor_list = g_hash_table_lookup (self->supported_usb_scanners, @@ -296,7 +357,7 @@ udev_mgr_check_if_usb_device_is_supported (UdevMgr* self, g_warning ("Got an REMOVE event on a scanner device but we dont have that device in our scanners cache"); } else{ - g_hash_table_remove (self->scanners_present, g_strdup(vendor)); + g_hash_table_remove (self->scanners_present, vendor); } } else{ @@ -319,15 +380,17 @@ UdevMgr* udev_mgr_new (DbusmenuMenuitem* scanner, UdevMgr* mgr = g_object_new (UDEV_TYPE_MGR, NULL); mgr->scanner_item = scanner; mgr->webcam_item = webcam; - + + // Check for USB devices GList* usb_devices_available = g_udev_client_query_by_subsystem (mgr->client, - usb_subsystem); + usb_subsystem); g_list_foreach (usb_devices_available, udevice_mgr_device_list_iterator, mgr); g_list_free (usb_devices_available); - + + // Check for webcams GList* video_devices_available = g_udev_client_query_by_subsystem (mgr->client, video4linux_subsystem); g_list_foreach (video_devices_available, @@ -335,7 +398,15 @@ UdevMgr* udev_mgr_new (DbusmenuMenuitem* scanner, mgr); g_list_free (video_devices_available); + + // Check for SCSI devices + GList* scsi_devices_available = g_udev_client_query_by_subsystem (mgr->client, + scsi_subsystem); + g_list_foreach (scsi_devices_available, + udevice_mgr_device_list_iterator, + mgr); + + g_list_free (usb_devices_available); - //udev_mgr_update_menuitems (mgr); return mgr; } -- cgit v1.2.3 From 9cf6aa224e626832f2b4c1e4e53d5fd604484396 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Thu, 4 Aug 2011 13:05:39 +0100 Subject: stop leaking tonnes of glists --- src/udev-mgr.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/udev-mgr.c') diff --git a/src/udev-mgr.c b/src/udev-mgr.c index d110304..6749157 100644 --- a/src/udev-mgr.c +++ b/src/udev-mgr.c @@ -81,11 +81,11 @@ udev_mgr_init (UdevMgr* self) self->supported_usb_scanners = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, - g_free); + (GDestroyNotify)g_list_free); self->supported_scsi_scanners = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, - g_free); + (GDestroyNotify)g_list_free); self->scanners_present = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, -- cgit v1.2.3 From 5ba9266a7798e03013af14d4e5003725151e665e Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Thu, 4 Aug 2011 13:33:06 +0100 Subject: destroying hash tables in finalize --- src/udev-mgr.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'src/udev-mgr.c') diff --git a/src/udev-mgr.c b/src/udev-mgr.c index 6749157..df491aa 100644 --- a/src/udev-mgr.c +++ b/src/udev-mgr.c @@ -76,7 +76,6 @@ udev_mgr_init (UdevMgr* self) self->supported_usb_scanners = NULL; self->scanners_present = NULL; self->webcams_present = NULL; - g_debug ("About to create hash tables"); self->client = g_udev_client_new (subsystems); self->supported_usb_scanners = g_hash_table_new_full (g_str_hash, g_str_equal, @@ -94,7 +93,6 @@ udev_mgr_init (UdevMgr* self) g_str_equal, g_free, g_free); - g_debug ("After creating hash tables"); // load into memory all supported scanners ... populate_usb_scanners (self->supported_usb_scanners); @@ -108,7 +106,11 @@ udev_mgr_init (UdevMgr* self) static void udev_mgr_finalize (GObject *object) { - // TODO tidy up hashtables. + UdevMgr* self = UDEV_MGR (object); + g_hash_table_destroy (self->supported_scsi_scanners); + g_hash_table_destroy (self->supported_usb_scanners); + g_hash_table_destroy (self->scanners_present); + g_hash_table_destroy (self->webcams_present); G_OBJECT_CLASS (udev_mgr_parent_class)->finalize (object); } -- cgit v1.2.3 From 7ccf396039ca441059913c9caa407d4662ed7b19 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Fri, 5 Aug 2011 10:20:17 +0100 Subject: cater for scsi type 3 and 6 devices --- src/udev-mgr.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'src/udev-mgr.c') diff --git a/src/udev-mgr.c b/src/udev-mgr.c index df491aa..cbb7dcb 100644 --- a/src/udev-mgr.c +++ b/src/udev-mgr.c @@ -277,6 +277,24 @@ static void udev_mgr_handle_scsi_device (UdevMgr* self, GUdevDevice* device, UdevMgrDeviceAction action) { + const gchar* type = NULL; + type = g_udev_device_get_property (device, "TYPE"); + // apparently anything thats type 3 and SCSI is a Scanner + if (g_strcmp0 (type, "6") == 0){ + gchar* random_scanner_name = g_strdup_printf("%p--scanner", self); + g_hash_table_insert (self->scanners_present, + g_strdup(random_scanner_name), + g_strdup("Scanner")); + g_free (random_scanner_name); + udev_mgr_update_menuitems (self); + return; + } + + // We only care about type 3 for the special cases below + if (g_strcmp0 (type, "3") != 0){ + return; + } + const gchar* vendor = NULL; vendor = g_udev_device_get_property (device, "VENDOR"); -- cgit v1.2.3 From 014e2b2a3582f3e823e61e23d391c68b474e16b4 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Tue, 9 Aug 2011 11:32:05 +0100 Subject: fixed memory leaks --- src/udev-mgr.c | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) (limited to 'src/udev-mgr.c') diff --git a/src/udev-mgr.c b/src/udev-mgr.c index cbb7dcb..5ac286e 100644 --- a/src/udev-mgr.c +++ b/src/udev-mgr.c @@ -45,9 +45,14 @@ static void udev_mgr_handle_scsi_device (UdevMgr* self, GUdevDevice* device, UdevMgrDeviceAction action); +static void udev_mgr_cleanup_lists(gpointer data, gpointer self); +static void udev_mgr_cleanup_entries(gpointer data, gpointer self); + + static void debug_device (UdevMgr* self, GUdevDevice* device, UdevMgrDeviceAction action); + struct _UdevMgr { @@ -80,11 +85,11 @@ udev_mgr_init (UdevMgr* self) self->supported_usb_scanners = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, - (GDestroyNotify)g_list_free); + (GDestroyNotify)udev_mgr_cleanup_lists); self->supported_scsi_scanners = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, - (GDestroyNotify)g_list_free); + (GDestroyNotify)udev_mgr_cleanup_lists); self->scanners_present = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, @@ -103,6 +108,21 @@ udev_mgr_init (UdevMgr* self) self); } +static void +udev_mgr_cleanup_lists(gpointer data, gpointer self) +{ + GList* scanners = (GList*)data; + g_list_foreach (scanners, udev_mgr_cleanup_entries, NULL); + g_list_free(scanners); +} + +static void +udev_mgr_cleanup_entries(gpointer data, gpointer self) +{ + gchar* entry = (gchar*)data; + g_free(entry); +} + static void udev_mgr_finalize (GObject *object) { @@ -283,9 +303,8 @@ static void udev_mgr_handle_scsi_device (UdevMgr* self, if (g_strcmp0 (type, "6") == 0){ gchar* random_scanner_name = g_strdup_printf("%p--scanner", self); g_hash_table_insert (self->scanners_present, - g_strdup(random_scanner_name), + random_scanner_name, g_strdup("Scanner")); - g_free (random_scanner_name); udev_mgr_update_menuitems (self); return; } -- cgit v1.2.3 From ddd4474c7cf18706f5ea43e0319488f4d0358226 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Tue, 9 Aug 2011 12:35:18 +0100 Subject: segfault found and fixed --- src/udev-mgr.c | 55 ++++++++++++++++++++++++++++++------------------------- 1 file changed, 30 insertions(+), 25 deletions(-) (limited to 'src/udev-mgr.c') diff --git a/src/udev-mgr.c b/src/udev-mgr.c index 5ac286e..e3328ec 100644 --- a/src/udev-mgr.c +++ b/src/udev-mgr.c @@ -151,7 +151,7 @@ udevice_mgr_device_list_iterator (gpointer data, gpointer userdata) GUdevDevice* device = G_UDEV_DEVICE (data); - const gchar* subsystem = NULL; + const gchar* subsystem = NULL; subsystem = g_udev_device_get_subsystem (device); if (g_strcmp0 (subsystem, "usb") == 0){ @@ -421,31 +421,36 @@ UdevMgr* udev_mgr_new (DbusmenuMenuitem* scanner, mgr->webcam_item = webcam; // Check for USB devices - GList* usb_devices_available = g_udev_client_query_by_subsystem (mgr->client, - usb_subsystem); - g_list_foreach (usb_devices_available, - udevice_mgr_device_list_iterator, - mgr); - - g_list_free (usb_devices_available); - + GList* usb_devices_available = NULL; + usb_devices_available = g_udev_client_query_by_subsystem (mgr->client, + usb_subsystem); + if (usb_devices_available != NULL){ + g_list_foreach (usb_devices_available, + udevice_mgr_device_list_iterator, + mgr); + + g_list_free (usb_devices_available); + } // Check for webcams - GList* video_devices_available = g_udev_client_query_by_subsystem (mgr->client, - video4linux_subsystem); - g_list_foreach (video_devices_available, - udevice_mgr_device_list_iterator, - mgr); - - g_list_free (video_devices_available); - + GList* video_devices_available = NULL; + video_devices_available = g_udev_client_query_by_subsystem (mgr->client, + video4linux_subsystem); + if (video_devices_available != NULL){ + g_list_foreach (video_devices_available, + udevice_mgr_device_list_iterator, + mgr); + + g_list_free (video_devices_available); + } // Check for SCSI devices - GList* scsi_devices_available = g_udev_client_query_by_subsystem (mgr->client, - scsi_subsystem); - g_list_foreach (scsi_devices_available, - udevice_mgr_device_list_iterator, - mgr); - - g_list_free (usb_devices_available); - + GList* scsi_devices_available = NULL; + scsi_devices_available = g_udev_client_query_by_subsystem (mgr->client, + scsi_subsystem); + if (scsi_devices_available != NULL){ + g_list_foreach (scsi_devices_available, + udevice_mgr_device_list_iterator, + mgr); + g_list_free (scsi_devices_available); + } return mgr; } -- cgit v1.2.3