aboutsummaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
authorOndrej Čerman <10187350+ocerman@users.noreply.github.com>2018-11-30 13:59:34 +0100
committerLeandro A. F. Pereira <leandro@hardinfo.org>2018-11-30 04:59:34 -0800
commit5c32c60b3b4bb92fbfd5dd8c465c1f38f063660a (patch)
treea72d011c49b090d0f489231f4105d0d3cd904661 /modules
parentb52f767d80719185a62d959be46ba15fdb8f8f85 (diff)
devices/usb: Add USB interfaces and device icons
* devices/usb: Added support for USB interfaces * devices/usb: added icons for usb devices * tabs -> spaces
Diffstat (limited to 'modules')
-rw-r--r--modules/devices.c2
-rw-r--r--modules/devices/usb.c115
2 files changed, 112 insertions, 5 deletions
diff --git a/modules/devices.c b/modules/devices.c
index d875aa93..fa474180 100644
--- a/modules/devices.c
+++ b/modules/devices.c
@@ -743,7 +743,7 @@ gchar *callback_usb()
return g_strdup_printf("%s"
"[$ShellParam$]\n"
"ViewType=1\n"
- "ReloadInterval=5000\n", usb_list);
+ "ReloadInterval=5000\n%s", usb_list, usb_icons);
}
diff --git a/modules/devices/usb.c b/modules/devices/usb.c
index fe6ce01d..bf1c1762 100644
--- a/modules/devices/usb.c
+++ b/modules/devices/usb.c
@@ -23,12 +23,87 @@
#include "usb_util.h"
gchar *usb_list = NULL;
+gchar *usb_icons = NULL;
#define UNKIFNULL_AC(f) (f != NULL) ? f : _("(Unknown)");
+#define IARR_END -2
+#define IARR_ANY -1
+
+static struct {
+ int class;
+ char *icon;
+} usb_class_icons[] = {
+ { 0x1, "audio"}, /* Audio */
+ { 0x2, "modem"}, /* Communications and CDC Control */
+ { 0x3, "inputdevices"}, /* HID (Human Interface Device) */
+ { 0x6, "camera-photo"}, /* Still Imaging */
+ { 0x7, "printer"}, /* Printer */
+ { 0x8, "media-removable"}, /* Mass storage */
+ { 0x9, "module"}, /* Hub */
+ { 0xe, "camera-web"}, /* Video */
+ {IARR_END, NULL}
+};
+
+static struct {
+ int class, subclass, protocol;
+ char *icon;
+} usb_type_icons[] = {
+ { 0x2, 0x6, IARR_ANY, "network-interface"}, /* Ethernet Networking Control Model */
+ { 0x3, 0x1, 0x1, "keyboard"}, /* Keyboard */
+ { 0x3, 0x1, 0x2, "mouse"}, /* Mouse */
+ {0xe0, 0x1, 0x1, "bluetooth"}, /* Bluetooth Programming Interface */
+ {IARR_END, IARR_END, IARR_END, NULL},
+};
+
+static const char* get_class_icon(int class){
+ int i = 0;
+ while (usb_class_icons[i].class != IARR_END) {
+ if (usb_class_icons[i].class == class) {
+ return usb_class_icons[i].icon;
+ }
+ i++;
+ }
+ return NULL;
+}
+
+static const char* get_usbif_icon(const usbi *usbif) {
+ int i = 0;
+ while (usb_type_icons[i].class != IARR_END) {
+ if (usb_type_icons[i].class == usbif->if_class && usb_type_icons[i].subclass == usbif->if_subclass &&
+ (usb_type_icons[i].protocol == IARR_ANY || usb_type_icons[i].protocol == usbif->if_protocol)) {
+
+ return usb_type_icons[i].icon;
+ }
+ i++;
+ }
+
+ return get_class_icon(usbif->if_class);
+}
+
+static const char* get_usbdev_icon(const usbd *u) {
+ const char * icon = NULL;
+ usbi *curr_if;
+
+ curr_if = u->if_list;
+ while (icon == NULL && curr_if != NULL){
+ icon = get_usbif_icon(curr_if);
+ curr_if = curr_if->next;
+ }
+
+ if (icon == NULL){
+ icon = get_class_icon(u->dev_class);
+ }
+
+ return icon;
+}
static void _usb_dev(const usbd *u) {
- gchar *name, *key, *v_str, *str;
+ gchar *name, *key, *v_str, *label, *str;
gchar *product, *vendor, *dev_class_str, *dev_subclass_str; /* don't free */
+ gchar *if_class_str, *if_subclass_str, *if_protocol_str; /* don't free */
+ gchar *interfaces = strdup("");
+ usbi *i;
+ const char* icon;
vendor = UNKIFNULL_AC(u->vendor);
product = UNKIFNULL_AC(u->product);
@@ -37,8 +112,11 @@ static void _usb_dev(const usbd *u) {
name = g_strdup_printf("%s %s", vendor, product);
key = g_strdup_printf("USB%03d:%03d:%03d", u->bus, u->dev, 0);
+ label = g_strdup_printf("%03d:%03d", u->bus, u->dev);
+ icon = get_usbdev_icon(u);
- usb_list = h_strdup_cprintf("$%s$%03d:%03d=%s\n", usb_list, key, u->bus, u->dev, name);
+ usb_list = h_strdup_cprintf("$%s$%s=%s\n", usb_list, key, label, name);
+ usb_icons = h_strdup_cprintf("Icon$%s$%s=%s.png\n", usb_icons, key, label, icon ? icon: "usb");
const gchar *v_url = vendor_get_url(vendor);
const gchar *v_name = vendor_get_name(vendor);
@@ -48,6 +126,27 @@ static void _usb_dev(const usbd *u) {
v_str = g_strdup_printf("%s", vendor );
}
+ if (u->if_list != NULL) {
+ i = u->if_list;
+ while (i != NULL){
+ if_class_str = UNKIFNULL_AC(i->if_class_str);
+ if_subclass_str = UNKIFNULL_AC(i->if_subclass_str);
+ if_protocol_str = UNKIFNULL_AC(i->if_protocol_str);
+
+ interfaces = h_strdup_cprintf("[%s %d]\n"
+ /* Class */ "%s=[%d] %s\n"
+ /* Sub-class */ "%s=[%d] %s\n"
+ /* Protocol */ "%s=[%d] %s\n",
+ interfaces,
+ _("Interface"), i->if_number,
+ _("Class"), i->if_class, if_class_str,
+ _("Sub-class"), i->if_subclass, if_subclass_str,
+ _("Protocol"), i->if_protocol, if_protocol_str
+ );
+ i = i->next;
+ }
+ }
+
str = g_strdup_printf("[%s]\n"
/* Product */ "%s=[0x%04x] %s\n"
/* Manufacturer */ "%s=[0x%04x] %s\n"
@@ -58,7 +157,8 @@ static void _usb_dev(const usbd *u) {
/* Dev Version */ "%s=%s\n"
"[%s]\n"
/* Bus */ "%s=%03d\n"
- /* Device */ "%s=%03d\n",
+ /* Device */ "%s=%03d\n"
+ /* Interfaces */ "%s",
_("Device Information"),
_("Product"), u->product_id, product,
_("Vendor"), u->vendor_id, v_str,
@@ -69,7 +169,8 @@ static void _usb_dev(const usbd *u) {
_("Device Version"), u->device_version,
_("Connection"),
_("Bus"), u->bus,
- _("Device"), u->dev
+ _("Device"), u->dev,
+ interfaces
);
moreinfo_add_with_prefix("DEV", key, str); /* str now owned by morinfo */
@@ -77,6 +178,8 @@ static void _usb_dev(const usbd *u) {
g_free(v_str);
g_free(name);
g_free(key);
+ g_free(label);
+ g_free(interfaces);
}
void __scan_usb(void) {
@@ -89,6 +192,10 @@ void __scan_usb(void) {
moreinfo_del_with_prefix("DEV:USB");
g_free(usb_list);
}
+ if (usb_icons){
+ g_free(usb_icons);
+ usb_icons = NULL;
+ }
usb_list = g_strdup_printf("[%s]\n", _("USB Devices"));
if (c > 0) {