summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--hardinfo/udisks2_util.c19
-rw-r--r--includes/udisks2_util.h2
-rw-r--r--modules/devices/storage.c91
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;