diff options
author | Simon Quigley <tsimonq2@ubuntu.com> | 2017-06-19 14:38:30 -0500 |
---|---|---|
committer | Simon Quigley <tsimonq2@ubuntu.com> | 2017-06-19 14:38:30 -0500 |
commit | 8c1612d32c5682a86216adb8c8d11ce715fe5475 (patch) | |
tree | 2a51954d577955c8ad19e517e4c7b6b8972982e4 /usb.c | |
parent | 0864b0a8e6f0b0983c3536931cfbad1414137d6b (diff) |
Import Upstream version 0.3.6
Diffstat (limited to 'usb.c')
-rw-r--r-- | usb.c | 216 |
1 files changed, 216 insertions, 0 deletions
@@ -0,0 +1,216 @@ +/* + * Hardware Information, version 0.3 + * Copyright (C) 2003 Leandro Pereira <leandro@linuxmag.com.br> + * + * May be modified and/or distributed under the terms of GNU GPL version 2. + */ + +#include "hardinfo.h" +#include "usb.h" + +gboolean usb_update(gpointer data) +{ + MainWindow *mainwindow = (MainWindow*)data; + GtkCTreeNode *node; + USBDevice *usb; + + if(!mainwindow) return FALSE; + + gtk_clist_freeze(GTK_CLIST(mainwindow->ctree)); + + usb = hi_scan_usb(); + + if (usb != NULL) { + node = tree_group_new(mainwindow, _("USB Devices"), USB); + for (; usb != NULL; usb = usb->next) { + hi_insert_generic(usb, USB); + if (!usb->product) + usb->product = g_strdup_printf + (_("Unknown device (%s)"), usb->class); + + tree_insert_item(mainwindow, node, usb->product, + generic_devices); + } + } + + gtk_clist_thaw(GTK_CLIST(mainwindow->ctree)); + + return TRUE; +} + +USBDevice *hi_scan_usb(void) +{ + FILE *proc_usb; + gchar buffer[64]; + gint n=0; + USBDevice *usb_dev, *usb; + struct stat st; + + usb = NULL; + + if (stat("/proc/bus/usb/devices", &st)) return NULL; + + proc_usb = fopen("/proc/bus/usb/devices", "r"); + while(fgets(buffer, 64, proc_usb)){ + if (strstr(buffer, "Manufacturer=")) { + gchar *buf = buffer; + gboolean lock = FALSE; + gpointer start, end; + + for (; buf != NULL; buf++) { + if (lock && *buf == '\n') { + end = buf; + break; + } else if (!lock && *buf == '=') { + start = buf+1; + lock = TRUE; + } + } + + buf = end; + *buf = 0; + buf = start; + + usb->vendor = g_strdup(buf); + } else if (strstr(buffer, "Product=")) { + gchar *buf = buffer; + gboolean lock = FALSE; + gpointer start, end; + + for (; buf != NULL; buf++) { + if (lock && *buf == '\n') { + end = buf; + break; + } else if (!lock && *buf == '=') { + start = buf+1; + lock = TRUE; + } + } + + buf = end; + *buf=0; + buf = start; + + usb_dev->product = g_strdup(buf); + } else if (!strncmp(buffer, "D: Ve", 6)) { + gchar *buf = buffer; + gpointer start; + gfloat version; + gint class_id; + + usb_dev = g_new0(USBDevice, 1); + usb_dev->next = usb; + usb = usb_dev; + + buf+=4; + + sscanf(buf, "Ver =%f Cls=%d", &version, &class_id); + + usb_dev->version = version; + usb_dev->class_id= class_id; + + walk_until('('); + start = buf+1; + buf+=6; + *buf = 0; + buf = start; + + usb_dev->class = g_strdup(buf); + n++; + } else if (!strncmp(buffer, "P: Ve", 6)) { + gchar *buf = buffer; + gint vendor_id, prod_id; + gfloat rev; + + buf+=4; + + sscanf(buf, "Vendor=%x ProdID=%x Rev= %f", + &vendor_id, &prod_id, &rev); + + usb_dev->vendor_id = vendor_id; + usb_dev->prod_id = prod_id; + usb_dev->revision = rev; + } + } + fclose(proc_usb); + + return usb; +} + +void hi_show_usb_info(MainWindow *mainwindow, USBDevice *device) +{ + GtkWidget *hbox, *vbox, *label; + gchar *buf; +#ifdef GTK2 + GtkWidget *pixmap; + + pixmap = gtk_image_new_from_file(IMG_PREFIX "usb.png"); + gtk_widget_show(pixmap); +#endif + + if(!device) return; + + hbox = gtk_hbox_new(FALSE, 2); + gtk_container_set_border_width(GTK_CONTAINER(hbox), 4); + gtk_widget_show(hbox); + + if(mainwindow->framec) + gtk_widget_destroy(mainwindow->framec); + + gtk_container_add(GTK_CONTAINER(mainwindow->frame), hbox); + mainwindow->framec = hbox; + + gtk_frame_set_label(GTK_FRAME(mainwindow->frame), _("USB Device")); + +#ifdef GTK2 + gtk_box_pack_start(GTK_BOX(hbox), pixmap, FALSE, FALSE, 0); +#endif + + vbox = gtk_vbox_new(FALSE, 2); + gtk_widget_show(vbox); + gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0); + +#ifdef GTK2 + buf = g_strdup_printf("<b>%s</b>", device->product); + label = gtk_label_new(buf); + gtk_label_set_use_markup(GTK_LABEL(label), TRUE); + gtk_label_set_selectable(GTK_LABEL(label), TRUE); + + g_free(buf); +#else + label = gtk_label_new(device->product); +#endif + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + + if (device->vendor) { + buf = g_strdup_printf(_("Manufacturer: %s"), device->vendor); + label = gtk_label_new(buf); + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + g_free(buf); + } + + buf = g_strdup_printf(_("Class: %s (%d)"), device->class, device->class_id); + label = gtk_label_new(buf); + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + g_free(buf); + + buf = g_strdup_printf(_("Version: %.2f, Revision: %.2f"), device->version, device->revision); + label = gtk_label_new(buf); + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + g_free(buf); + + if(!device->prod_id) return; + + buf = g_strdup_printf(_("Vendor ID: 0x%X, Product ID: 0x%X"), + device->vendor_id, device->prod_id); + label = gtk_label_new(buf); + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + g_free(buf); + +} + |