diff options
author | Ondrej Čerman <ondrej.cerman@gmail.com> | 2019-06-30 00:50:29 +0200 |
---|---|---|
committer | Leandro A. F. Pereira <leandro@hardinfo.org> | 2019-06-30 08:15:00 -0700 |
commit | 8566bac1587d0c2cba28484ea3bc04dfe6e207fe (patch) | |
tree | 7f1a0e003bfaefb6fd31f93be220ee3764e36d8a | |
parent | 2bf1a0317f479ee32f3a16be3f1bc22a99709da7 (diff) |
devices/storage: Better storage media labels
-rw-r--r-- | hardinfo/udisks2_util.c | 19 | ||||
-rw-r--r-- | includes/udisks2_util.h | 2 | ||||
-rw-r--r-- | modules/devices/storage.c | 91 |
3 files changed, 84 insertions, 28 deletions
diff --git a/hardinfo/udisks2_util.c b/hardinfo/udisks2_util.c index 02b70e9f..65d5efd2 100644 --- a/hardinfo/udisks2_util.c +++ b/hardinfo/udisks2_util.c @@ -238,7 +238,7 @@ void udiskd_free(udiskd *u) { g_free(u->partition_table); g_free(u->partitions); g_free(u->media); - g_free(u->media_compatibility); + g_strfreev(u->media_compatibility); g_free(u); } } @@ -283,7 +283,7 @@ gpointer get_udisks2_drive_info(const char *blockdev, GDBusProxy *block, GDBusPr GVariantIter *iter; const gchar *str, *part; udiskd *u = NULL; - + gsize n, i; u = udiskd_new(); u->block_dev = g_strdup(blockdev); @@ -333,14 +333,15 @@ gpointer get_udisks2_drive_info(const char *blockdev, GDBusProxy *block, GDBusPr v = get_dbus_property(drive, UDISKS2_DRIVE_INTERFACE, "MediaCompatibility"); if (v){ g_variant_get(v, "as", &iter); - while (g_variant_iter_loop (iter, "s", &str)){ - if (u->media_compatibility == NULL){ - u->media_compatibility = g_strdup(str); - } - else{ - u->media_compatibility = h_strdup_cprintf(", %s", u->media_compatibility, str); - } + n = g_variant_iter_n_children(iter); + u->media_compatibility = g_malloc0_n(n + 1, sizeof(gchar*)); + + i = 0; + while (g_variant_iter_loop (iter, "s", &str) && i < n){ + u->media_compatibility[i] = g_strdup(str); + i++; } + g_variant_iter_free (iter); g_variant_unref(v); } diff --git a/includes/udisks2_util.h b/includes/udisks2_util.h index df72e830..8a57a825 100644 --- a/includes/udisks2_util.h +++ b/includes/udisks2_util.h @@ -12,7 +12,7 @@ typedef struct udiskd { gint32 rotation_rate; gint64 size; gchar *media; - gchar *media_compatibility; + gchar **media_compatibility; gboolean pm_supported; gboolean aam_supported; gboolean apm_supported; diff --git a/modules/devices/storage.c b/modules/devices/storage.c index 0a86ec24..db48b6c2 100644 --- a/modules/devices/storage.c +++ b/modules/devices/storage.c @@ -28,19 +28,50 @@ gboolean __scan_udisks2_devices(void) { GSList *node, *drives; udiskd *disk; gchar *udisks2_storage_list = NULL, *features = NULL, *moreinfo = NULL; - gchar *devid, *label; - const gchar *url, *vendor_str, *icon; - int n = 0, i; + gchar *devid, *label, *media_comp = NULL; + const gchar *url, *vendor_str, *media_label, *icon, *media_curr = NULL; + int n = 0, i, j; + // http://storaged.org/doc/udisks2-api/latest/gdbus-org.freedesktop.UDisks2.Drive.html#gdbus-property-org-freedesktop-UDisks2-Drive.MediaCompatibility static struct { - char *media_prefix; + char *media; + char *label; char *icon; - } media2icon[] = { - { "thumb", "usbfldisk"}, - { "flash", "usbfldisk"}, - { "floppy", "media-floppy"}, - { "optical", "cdrom"}, - { NULL, NULL} + } media_info[] = { + { "thumb", "Thumb-drive", "usbfldisk" }, + { "flash", "Flash Card", "usbfldisk" }, + { "flash_cf", "CompactFlash", "usbfldisk" }, + { "flash_ms", "MemoryStick", "usbfldisk" }, + { "flash_sm", "SmartMedia", "usbfldisk" }, + { "flash_sd", "SD", "usbfldisk" }, + { "flash_sdhc", "SDHC", "usbfldisk" }, + { "flash_sdxc", "SDXC", "usbfldisk" }, + { "flash_mmc", "MMC", "usbfldisk" }, + { "floppy", "Floppy Disk", "media-floppy" }, + { "floppy_zip", "Zip Disk", "media-floppy" }, + { "floppy_jaz", "Jaz Disk", "media-floppy" }, + { "optical", "Optical Disc", "cdrom" }, + { "optical_cd", "CD-ROM", "cdrom" }, + { "optical_cd_r", "CD-R", "cdrom" }, + { "optical_cd_rw", "CD-RW", "cdrom" }, + { "optical_dvd", "DVD-ROM", "cdrom" }, + { "optical_dvd_r", "DVD-R", "cdrom" }, + { "optical_dvd_rw", "DVD-RW", "cdrom" }, + { "optical_dvd_ram", "DVD-RAM", "cdrom" }, + { "optical_dvd_plus_r", "DVD+R" , "cdrom" }, + { "optical_dvd_plus_rw", "DVD+RW" , "cdrom" }, + { "optical_dvd_plus_r_dl", "DVD+R DL", "cdrom" }, + { "optical_dvd_plus_rw_dl", "DVD+RW DL", "cdrom" }, + { "optical_bd", "BD-ROM", "cdrom" }, + { "optical_bd_r", "BD-R", "cdrom" }, + { "optical_bd_re", "BD-RE", "cdrom" }, + { "optical_hddvd", "HD DVD-ROM", "cdrom" }, + { "optical_hddvd_r", "HD DVD-R", "cdrom" }, + { "optical_hddvd_rw", "HD DVD-RW", "cdrom" }, + { "optical_mo", "MO Disc", "cdrom" }, + { "optical_mrw", "MRW Media", "cdrom" }, + { "optical_mrw_w", "MRW Media (write)", "cdrom" }, + { NULL, NULL } }; moreinfo_del_with_prefix("DEV:UDISKS"); @@ -61,15 +92,38 @@ gboolean __scan_udisks2_devices(void) { } icon = NULL; - if (disk->media_compatibility){ - for (i = 0; media2icon[i].media_prefix != NULL; i++) { - if (g_str_has_prefix(disk->media_compatibility, - media2icon[i].media_prefix)) { - icon = media2icon[i].icon; + + if (disk->media){ + media_curr = disk->media_compatibility[i]; + for (j = 0; media_info[j].media != NULL; j++) { + if (g_strcmp0(disk->media, media_info[j].media) == 0) { + media_curr = media_info[j].label; break; } } } + + if (disk->media_compatibility){ + for (i = 0; disk->media_compatibility[i] != NULL; i++){ + media_label = disk->media_compatibility[i]; + + for (j = 0; media_info[j].media != NULL; j++) { + if (g_strcmp0(disk->media_compatibility[i], media_info[j].media) == 0) { + media_label = media_info[j].label; + if (icon == NULL) + icon = media_info[j].icon; + break; + } + } + + if (media_comp == NULL){ + media_comp = g_strdup(media_label); + } + else{ + media_comp = h_strdup_cprintf(", %s", media_comp, media_label); + } + } + } if (icon == NULL && disk->ejectable && g_strcmp0(disk->connection_bus, "usb") == 0) { icon = "usbfldisk"; } @@ -128,12 +182,12 @@ gboolean __scan_udisks2_devices(void) { if (disk->rotation_rate > 0) { moreinfo = h_strdup_cprintf(_("Rotation Rate=%d\n"), moreinfo, disk->rotation_rate); } - if (disk->media_compatibility || disk->media) { + if (media_comp || media_curr) { moreinfo = h_strdup_cprintf(_("Media=%s\n" "Media compatibility=%s\n"), moreinfo, - disk->media ? disk->media : _("(None)"), - disk->media_compatibility ? disk->media_compatibility : _("(Unknown)")); + media_curr ? media_curr : _("(None)"), + media_comp ? media_comp : _("(Unknown)")); } if (disk->connection_bus && strlen(disk->connection_bus) > 0) { moreinfo = h_strdup_cprintf(_("Connection bus=%s\n"), moreinfo, disk->connection_bus); @@ -163,6 +217,7 @@ gboolean __scan_udisks2_devices(void) { g_free(devid); g_free(features); g_free(label); + g_free(media_comp); features = NULL; moreinfo = NULL; |