You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

1194 lines
46 KiB

/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/*
* Copyright (C) 2012 David Zeuthen <zeuthen@gmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General
* Public License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307, USA.
*/
#include "config.h"
#include <glib/gi18n-lib.h>
#include "udisksobjectinfo.h"
#include "udisksclient.h"
#include "udisks-generated.h"
/**
* SECTION:udisksobjectinfo
* @title: UDisksObjectInfo
* @short_description: Detailed information about objects
*
* Detailed information about the D-Bus interfaces (such as
* #UDisksBlock and #UDisksDrive) on a #UDisksObject that is suitable
* to display in an user interface. Use
* udisks_client_get_object_info() to get #UDisksObjectInfo objects.
* Note that #UDisksObjectInfo is an immutable object; once it has
* been created it cannot be modified further.
*
* The <link
* linkend="gdbus-property-org-freedesktop-UDisks2-Block.HintName">HintName</link>
* and/or <link
* linkend="gdbus-property-org-freedesktop-UDisks2-Block.HintName">HintIconName</link>
* propreties on associated #UDisksBlock interfaces (if any) may
* influence what udisks_object_info_get_icon() and
* udisks_object_info_get_media_icon() returns.
*
* The value return by udisks_object_info_get_one_liner() is designed
* to contain enough information such that it is all that needs to be
* shown about the object. As a result for e.g. block devices or
* drives it contains the special device device
* e.g. <filename>/dev/sda</filename>.
*
* Since: 2.1
*/
/**
* UDisksObjectInfo:
*
* The #UDisksObjectInfo structure contains only private data and
* should only be accessed using the provided API.
*
* Since: 2.1
*/
struct _UDisksObjectInfo
{
GObject parent_instance;
UDisksObject *object;
gchar *name;
gchar *description;
GIcon *icon;
GIcon *icon_symbolic;
gchar *media_description;
GIcon *media_icon;
GIcon *media_icon_symbolic;
gchar *one_liner;
gchar *sort_key;
};
typedef struct _UDisksObjectInfoClass UDisksObjectInfoClass;
struct _UDisksObjectInfoClass
{
GObjectClass parent_class;
};
G_DEFINE_TYPE (UDisksObjectInfo, udisks_object_info, G_TYPE_OBJECT);
/* ---------------------------------------------------------------------------------------------------- */
static void
udisks_object_info_finalize (GObject *object)
{
UDisksObjectInfo *info = UDISKS_OBJECT_INFO (object);
g_clear_object (&info->object);
g_free (info->name);
g_free (info->description);
g_clear_object (&info->icon);
g_clear_object (&info->icon_symbolic);
g_free (info->media_description);
g_clear_object (&info->media_icon);
g_clear_object (&info->media_icon_symbolic);
g_free (info->one_liner);
g_free (info->sort_key);
G_OBJECT_CLASS (udisks_object_info_parent_class)->finalize (object);
}
static void
udisks_object_info_init (UDisksObjectInfo *info)
{
}
static void
udisks_object_info_class_init (UDisksObjectInfoClass *klass)
{
GObjectClass *gobject_class;
gobject_class = G_OBJECT_CLASS (klass);
gobject_class->finalize = udisks_object_info_finalize;
}
static UDisksObjectInfo *
udisks_object_info_new (UDisksObject *object)
{
UDisksObjectInfo *ret;
g_return_val_if_fail (object == NULL || UDISKS_IS_OBJECT (object), NULL);
ret = g_object_new (UDISKS_TYPE_OBJECT_INFO, NULL);
ret->object = object != NULL ? g_object_ref (object) : NULL;
return ret;
}
/* ---------------------------------------------------------------------------------------------------- */
typedef enum
{
DRIVE_TYPE_UNSET,
DRIVE_TYPE_DRIVE,
DRIVE_TYPE_DISK,
DRIVE_TYPE_CARD,
DRIVE_TYPE_DISC
} DriveType;
static const struct
{
const gchar *id;
const gchar *media_name;
const gchar *media_family;
const gchar *media_icon;
const gchar *media_icon_symbolic;
DriveType media_type;
const gchar *drive_icon;
const gchar *drive_icon_symbolic;
} media_data[] =
{
/* Translators: 'Thumb' here refers to "USB thumb drive", see http://en.wikipedia.org/wiki/Thumb_drive */
{"thumb", NC_("media-type", "Thumb"), NC_("media-type", "Thumb"), "media-removable", "media-removable-symbolic", DRIVE_TYPE_DRIVE, "media-removable", "media-removable-symbolic"},
{"floppy", NC_("media-type", "Floppy"), NC_("media-type", "Floppy"), "media-floppy", "media-floppy-symbolic", DRIVE_TYPE_DISK, "drive-removable-media-floppy", "drive-removable-media-symbolic"},
{"floppy_zip", NC_("media-type", "Zip"), NC_("media-type", "Zip"), "media-floppy-jaz", "media-floppy-symbolic", DRIVE_TYPE_DISK, "drive-removable-media-floppy-jaz", "drive-removable-media-symbolic"},
{"floppy_jaz", NC_("media-type", "Jaz"), NC_("media-type", "Jaz"), "media-floppy-zip", "media-floppy-symbolic", DRIVE_TYPE_DISK, "drive-removable-media-floppy-zip", "drive-removable-media-symbolic"},
{"flash", NC_("media-type", "Flash"), NC_("media-type", "Flash"), "media-flash", "media-flash-symbolic", DRIVE_TYPE_CARD, "drive-removable-media-flash", "drive-removable-media-symbolic"},
{"flash_ms", NC_("media-type", "MemoryStick"), NC_("media-type", "MemoryStick"), "media-flash-ms", "media-flash-symbolic", DRIVE_TYPE_CARD, "drive-removable-media-flash-ms", "drive-removable-media-symbolic"},
{"flash_sm", NC_("media-type", "SmartMedia"), NC_("media-type", "SmartMedia"), "media-flash-sm", "media-flash-symbolic", DRIVE_TYPE_CARD, "drive-removable-media-flash-sm", "drive-removable-media-symbolic"},
{"flash_cf", NC_("media-type", "CompactFlash"), NC_("media-type", "CompactFlash"), "media-flash-cf", "media-flash-symbolic", DRIVE_TYPE_CARD, "drive-removable-media-flash-cf", "drive-removable-media-symbolic"},
{"flash_mmc", NC_("media-type", "MMC"), NC_("media-type", "SD"), "media-flash-mmc", "media-flash-symbolic", DRIVE_TYPE_CARD, "drive-removable-media-flash-mmc", "drive-removable-media-symbolic"},
{"flash_sd", NC_("media-type", "SD"), NC_("media-type", "SD"), "media-flash-sd", "media-flash-symbolic", DRIVE_TYPE_CARD, "drive-removable-media-flash-sd", "drive-removable-media-symbolic"},
{"flash_sdxc", NC_("media-type", "SDXC"), NC_("media-type", "SD"), "media-flash-sd-xc", "media-flash-symbolic", DRIVE_TYPE_CARD, "drive-removable-media-flash-sd-xc", "drive-removable-media-symbolic"},
{"flash_sdhc", NC_("media-type", "SDHC"), NC_("media-type", "SD"), "media-flash-sd-hc", "media-flash-symbolic", DRIVE_TYPE_CARD, "drive-removable-media-flash-sd-hc", "drive-removable-media-symbolic"},
{"optical_cd", NC_("media-type", "CD-ROM"), NC_("media-type", "CD"), "media-optical-cd-rom", "media-optical-symbolic", DRIVE_TYPE_DISC, "drive-optical", "drive-optical-symbolic"},
{"optical_cd_r", NC_("media-type", "CD-R"), NC_("media-type", "CD"), "media-optical-cd-r", "media-optical-symbolic", DRIVE_TYPE_DISC, "drive-optical-recorder", "drive-optical-symbolic"},
{"optical_cd_rw", NC_("media-type", "CD-RW"), NC_("media-type", "CD"), "media-optical-cd-rw", "media-optical-symbolic", DRIVE_TYPE_DISC, "drive-optical-recorder", "drive-optical-symbolic"},
{"optical_dvd", NC_("media-type", "DVD"), NC_("media-type", "DVD"), "media-optical-dvd-rom", "media-optical-symbolic", DRIVE_TYPE_DISC, "drive-optical", "drive-optical-symbolic"},
{"optical_dvd_r", NC_("media-type", "DVD-R"), NC_("media-type", "DVD"), "media-optical-dvd-r", "media-optical-symbolic", DRIVE_TYPE_DISC, "drive-optical-recorder", "drive-optical-symbolic"},
{"optical_dvd_rw", NC_("media-type", "DVD-RW"), NC_("media-type", "DVD"), "media-optical-dvd-rw", "media-optical-symbolic", DRIVE_TYPE_DISC, "drive-optical-recorder", "drive-optical-symbolic"},
{"optical_dvd_ram", NC_("media-type", "DVD-RAM"), NC_("media-type", "DVD"), "media-optical-dvd-ram", "media-optical-symbolic", DRIVE_TYPE_DISC, "drive-optical-recorder", "drive-optical-symbolic"},
{"optical_dvd_plus_r", NC_("media-type", "DVD+R"), NC_("media-type", "DVD"), "media-optical-dvd-r-plus", "media-optical-symbolic", DRIVE_TYPE_DISC, "drive-optical-recorder", "drive-optical-symbolic"},
{"optical_dvd_plus_rw", NC_("media-type", "DVD+RW"), NC_("media-type", "DVD"), "media-optical-dvd-rw-plus", "media-optical-symbolic", DRIVE_TYPE_DISC, "drive-optical-recorder", "drive-optical-symbolic"},
{"optical_dvd_plus_r_dl", NC_("media-type", "DVD+R DL"), NC_("media-type", "DVD"), "media-optical-dvd-dl-r-plus", "media-optical-symbolic", DRIVE_TYPE_DISC, "drive-optical-recorder", "drive-optical-symbolic"},
{"optical_dvd_plus_rw_dl", NC_("media-type", "DVD+RW DL"), NC_("media-type", "DVD"), "media-optical-dvd-dl-r-plus", "media-optical-symbolic", DRIVE_TYPE_DISC, "drive-optical-recorder", "drive-optical-symbolic"},
{"optical_bd", NC_("media-type", "BD-ROM"), NC_("media-type", "Blu-Ray"), "media-optical-bd-rom", "media-optical-symbolic", DRIVE_TYPE_DISC, "drive-optical", "drive-optical-symbolic"},
{"optical_bd_r", NC_("media-type", "BD-R"), NC_("media-type", "Blu-Ray"), "media-optical-bd-r", "media-optical-symbolic", DRIVE_TYPE_DISC, "drive-optical-recorder", "drive-optical-symbolic"},
{"optical_bd_re", NC_("media-type", "BD-RE"), NC_("media-type", "Blu-Ray"), "media-optical-bd-re", "media-optical-symbolic", DRIVE_TYPE_DISC, "drive-optical-recorder", "drive-optical-symbolic"},
{"optical_hddvd", NC_("media-type", "HDDVD"), NC_("media-type", "HDDVD"), "media-optical-hddvd-rom", "media-optical-symbolic", DRIVE_TYPE_DISC, "drive-optical", "drive-optical-symbolic"},
{"optical_hddvd_r", NC_("media-type", "HDDVD-R"), NC_("media-type", "HDDVD"), "media-optical-hddvd-r", "media-optical-symbolic", DRIVE_TYPE_DISC, "drive-optical-recorder", "drive-optical-symbolic"},
{"optical_hddvd_rw", NC_("media-type", "HDDVD-RW"), NC_("media-type", "HDDVD"), "media-optical-hddvd-rw", "media-optical-symbolic", DRIVE_TYPE_DISC, "drive-optical-recorder", "drive-optical-symbolic"},
{"optical_mo", NC_("media-type", "MO"), NC_("media-type", "CD"), "media-optical-mo", "media-optical-symbolic", DRIVE_TYPE_DISC, "drive-optical", "drive-optical-symbolic"},
{"optical_mrw", NC_("media-type", "MRW"), NC_("media-type", "CD"), "media-optical-mrw", "media-optical-symbolic", DRIVE_TYPE_DISC, "drive-optical-recorder", "drive-optical-symbolic"},
{"optical_mrw_w", NC_("media-type", "MRW-W"), NC_("media-type", "CD"), "media-optical-mrw-w", "media-optical-symbolic", DRIVE_TYPE_DISC, "drive-optical-recorder", "drive-optical-symbolic"},
};
/* ---------------------------------------------------------------------------------------------------- */
static const gchar *
last_segment (const gchar *str)
{
const gchar *ret = NULL;
gint n;
gint len;
if (str == NULL)
goto out;
len = strlen (str);
if (len == 0)
{
ret = str;
goto out;
}
for (n = len - 1; n >= 0; --n)
{
if (str[n] == '/' && n < len - 1)
{
ret = str + n + 1;
goto out;
}
}
ret = str;
out:
return ret;
}
static void
udisks_client_get_object_info_for_block (UDisksClient *client,
UDisksBlock *block,
UDisksPartition *partition,
UDisksObjectInfo *info)
{
guint64 size = 0;
gchar *size_str = NULL;
gchar *s;
size = udisks_block_get_size (block);
if (size > 0)
size_str = udisks_client_get_size_for_display (client, size, FALSE, FALSE);
info->icon = g_themed_icon_new_with_default_fallbacks ("drive-removable-media");
info->icon_symbolic = g_themed_icon_new_with_default_fallbacks ("drive-removable-media-symbolic");
info->name = udisks_block_dup_preferred_device (block);
if (size_str != NULL)
{
info->description = g_strdup_printf (_("%s Block Device"), size_str);
}
else
{
info->description = g_strdup (_("Block Device"));
}
if (partition != NULL)
{
/* Translators: Used to describe a partition of a block device.
* The %u is the partition number.
* The %s is the description for the block device (e.g. "5 GB Block Device").
*/
s = g_strdup_printf (C_("part-block", "Partition %u of %s"),
udisks_partition_get_number (partition), info->description);
g_free (info->description);
info->description = s;
}
/* Translators: String used for one-liner description of a block device.
* The first %s is the description of the object (e.g. "50 GB Block Device").
* The second %s is the special device file (e.g. "/dev/sda2").
*/
info->one_liner = g_strdup_printf (C_("one-liner-block", "%s (%s)"),
info->description,
udisks_block_get_preferred_device (block));
info->sort_key = g_strdup_printf ("02_block_%s_%u",
last_segment (g_dbus_object_get_object_path (G_DBUS_OBJECT (info->object))),
partition != NULL ? udisks_partition_get_number (partition) : 0);
}
/* ---------------------------------------------------------------------------------------------------- */
static void
udisks_client_get_object_info_for_loop (UDisksClient *client,
UDisksLoop *loop,
UDisksBlock *block,
UDisksPartition *partition,
UDisksObjectInfo *info)
{
guint64 size = 0;
gchar *size_str = NULL;
gchar *s;
size = udisks_block_get_size (block);
if (size > 0)
size_str = udisks_client_get_size_for_display (client, size, FALSE, FALSE);
info->icon = g_themed_icon_new_with_default_fallbacks ("drive-removable-media");
info->icon_symbolic = g_themed_icon_new_with_default_fallbacks ("drive-removable-media-symbolic");
info->name = udisks_loop_dup_backing_file (loop);
if (size_str != NULL)
{
info->description = g_strdup_printf (_("%s Loop Device"), size_str);
}
else
{
info->description = g_strdup (_("Loop Device"));
}
if (partition != NULL)
{
/* Translators: Used to describe a partition of a loop device.
* The %u is the partition number.
* The %s is the description for the loop device (e.g. "5 GB Loop Device").
*/
s = g_strdup_printf (C_("part-loop", "Partition %u of %s"),
udisks_partition_get_number (partition), info->description);
g_free (info->description);
info->description = s;
}
/* Translators: String used for one-liner description of a loop device.
* The first %s is the description of the object (e.g. "2 GB Loop Device").
* The second %s is the name of the backing file (e.g. "/home/davidz/file.iso").
* The third %s is the special device file (e.g. "/dev/loop2").
*/
info->one_liner = g_strdup_printf (C_("one-liner-loop", "%s — %s (%s)"),
info->description,
info->name,
udisks_block_get_preferred_device (block));
info->sort_key = g_strdup_printf ("03_loop_%s_%u",
last_segment (g_dbus_object_get_object_path (G_DBUS_OBJECT (info->object))),
partition != NULL ? udisks_partition_get_number (partition) : 0);
}
/* ---------------------------------------------------------------------------------------------------- */
static const gchar *
format_mdraid_level (const gchar *level)
{
const gchar *ret = NULL;
if (g_strcmp0 (level, "raid0") == 0)
ret = C_("mdraid-desc", "RAID-0 Array");
else if (g_strcmp0 (level, "raid1") == 0)
ret = C_("mdraid-desc", "RAID-1 Array");
else if (g_strcmp0 (level, "raid4") == 0)
ret = C_("mdraid-desc", "RAID-4 Array");
else if (g_strcmp0 (level, "raid5") == 0)
ret = C_("mdraid-desc", "RAID-5 Array");
else if (g_strcmp0 (level, "raid6") == 0)
ret = C_("mdraid-desc", "RAID-6 Array");
else if (g_strcmp0 (level, "raid10") == 0)
ret = C_("mdraid-desc", "RAID-10 Array");
else
ret = C_("mdraid-desc", "RAID Array");
return ret;
}
static void
udisks_client_get_object_info_for_mdraid (UDisksClient *client,
UDisksMDRaid *mdraid,
UDisksPartition *partition,
UDisksObjectInfo *info)
{
UDisksBlock *block = NULL;
guint64 size = 0;
gchar *size_str = NULL;
const gchar *name;
const gchar *level;
gchar *s;
block = udisks_client_get_block_for_mdraid (client, mdraid);
size = udisks_mdraid_get_size (mdraid);
if (size > 0)
size_str = udisks_client_get_size_for_display (client, size, FALSE, FALSE);
name = udisks_mdraid_get_name (mdraid);
s = strstr (name, ":");
if (s != NULL && strlen (s) > 1)
info->name = g_strdup (s + 1);
else
info->name = g_strdup (name);
info->icon = g_themed_icon_new_with_default_fallbacks ("drive-multidisk");
info->icon_symbolic = g_themed_icon_new_with_default_fallbacks ("drive-multidisk-symbolic");
level = udisks_mdraid_get_level (mdraid);
if (size_str != NULL)
{
/* Translators: Used to format the description for a RAID array.
* The first %s is the size (e.g. '42.0 GB').
* The second %s is the level (e.g. 'RAID-5 Array').
*/
info->description = g_strdup_printf (C_("mdraid-desc", "%s %s"),
size_str,
format_mdraid_level (level));
}
else
{
info->description = g_strdup (format_mdraid_level (level));
}
if (partition != NULL)
{
/* Translators: Used to describe a partition of a RAID Array.
* The %u is the partition number.
* The %s is the description for the drive (e.g. "2 TB RAID-5").
*/
s = g_strdup_printf (C_("part-raid", "Partition %u of %s"),
udisks_partition_get_number (partition), info->description);
g_free (info->description);
info->description = s;
}
if (strlen (info->name) > 0)
{
if (block != NULL)
{
/* Translators: String used for one-liner description of running RAID array.
* The first %s is the array name (e.g. "AlphaGo").
* The second %s is the size and level (e.g. "2 TB RAID-5").
* The third %s is the special device file (e.g. "/dev/sda").
*/
info->one_liner = g_strdup_printf (C_("one-liner-mdraid-running", "%s — %s (%s)"),
info->name,
info->description,
udisks_block_get_preferred_device (block));
}
else
{
/* Translators: String used for one-liner description of non-running RAID array.
* The first %s is the array name (e.g. "AlphaGo").
* The second %s is the size and level (e.g. "2 TB RAID-5").
*/
info->one_liner = g_strdup_printf (C_("one-liner-mdraid-not-running", "%s — %s"),
info->name,
info->description);
}
}
else
{
if (block != NULL)
{
/* Translators: String used for one-liner description of running RAID array w/o a name.
* The first %s is the array name (e.g. "AlphaGo").
* The second %s is the size and level (e.g. "2 TB RAID-5").
* The third %s is the special device file (e.g. "/dev/sda").
*/
info->one_liner = g_strdup_printf (C_("one-liner-mdraid-no-name-running", "%s — %s"),
info->description,
udisks_block_get_preferred_device (block));
}
else
{
/* Translators: String used for one-liner description of non-running RAID array w/o a name.
* The first %s is the array name (e.g. "AlphaGo").
* The second %s is the size and level (e.g. "2 TB RAID-5").
*/
info->one_liner = g_strdup_printf (C_("one-liner-mdraid-no-name-not-running", "%s"),
info->description);
}
}
g_clear_object (&block);
info->sort_key = g_strdup_printf ("01_mdraid_%s_%u", udisks_mdraid_get_uuid (mdraid),
partition != NULL ? udisks_partition_get_number (partition) : 0);
}
/* ---------------------------------------------------------------------------------------------------- */
static gboolean
strv_has (const gchar * const *haystack,
const gchar *needle)
{
gboolean ret;
guint n;
ret = FALSE;
for (n = 0; haystack != NULL && haystack[n] != NULL; n++)
{
if (g_strcmp0 (haystack[n], needle) == 0)
{
ret = TRUE;
goto out;
}
}
out:
return ret;
}
/* ---------------------------------------------------------------------------------------------------- */
static void
udisks_client_get_object_info_for_drive (UDisksClient *client,
UDisksDrive *drive,
UDisksPartition *partition,
UDisksObjectInfo *info)
{
const gchar *vendor;
const gchar *model;
const gchar *media;
const gchar *const *media_compat;
gboolean media_available;
gboolean media_removable;
gint rotation_rate;
guint64 size;
gchar *size_str;
guint n;
GString *desc_str;
DriveType desc_type;
gchar *hyphenated_connection_bus;
const gchar *connection_bus;
UDisksBlock *block = NULL;
gchar *s;
const gchar *cs;
UDisksBlock *block_for_partition = NULL;
g_return_if_fail (UDISKS_IS_DRIVE (drive));
size_str = NULL;
vendor = udisks_drive_get_vendor (drive);
model = udisks_drive_get_model (drive);
size = udisks_drive_get_size (drive);
media_removable = udisks_drive_get_media_removable (drive);
media_available = udisks_drive_get_media_available (drive);
rotation_rate = udisks_drive_get_rotation_rate (drive);
if (size > 0)
size_str = udisks_client_get_size_for_display (client, size, FALSE, FALSE);
media = udisks_drive_get_media (drive);
media_compat = udisks_drive_get_media_compatibility (drive);
connection_bus = udisks_drive_get_connection_bus (drive);
if (strlen (connection_bus) > 0)
hyphenated_connection_bus = g_strdup_printf ("-%s", connection_bus);
else
hyphenated_connection_bus = g_strdup ("");
/* Name is easy - that's just "$vendor $model" */
if (strlen (vendor) == 0)
vendor = NULL;
if (strlen (model) == 0)
model = NULL;
info->name = g_strdup_printf ("%s%s%s",
vendor != NULL ? vendor : "",
vendor != NULL ? " " : "",
model != NULL ? model : "");
desc_type = DRIVE_TYPE_UNSET;
desc_str = g_string_new (NULL);
for (n = 0; n < G_N_ELEMENTS (media_data) - 1; n++)
{
/* media_compat */
if (strv_has (media_compat, media_data[n].id))
{
if (info->icon == NULL)
info->icon = g_themed_icon_new_with_default_fallbacks (media_data[n].drive_icon);
if (info->icon_symbolic == NULL)
info->icon_symbolic = g_themed_icon_new_with_default_fallbacks (media_data[n].drive_icon_symbolic);
if (strstr (desc_str->str, media_data[n].media_family) == NULL)
{
if (desc_str->len > 0)
g_string_append (desc_str, "/");
g_string_append (desc_str, g_dpgettext2 (GETTEXT_PACKAGE, "media-type", media_data[n].media_family));
}
desc_type = media_data[n].media_type;
}
if (media_removable && media_available)
{
/* media */
if (g_strcmp0 (media, media_data[n].id) == 0)
{
if (info->media_description == NULL)
{
switch (media_data[n].media_type)
{
case DRIVE_TYPE_UNSET:
g_assert_not_reached ();
break;
case DRIVE_TYPE_DRIVE:
/* Translators: Used to describe drive without removable media. The %s is the type, e.g. 'Thumb' */
info->media_description = g_strdup_printf (C_("drive-with-fixed-media", "%s Drive"), g_dpgettext2 (GETTEXT_PACKAGE, "media-type", media_data[n].media_name));
break;
case DRIVE_TYPE_DISK:
/* Translators: Used to describe generic media. The %s is the type, e.g. 'Zip' or 'Floppy' */
info->media_description = g_strdup_printf (C_("drive-with-generic-media", "%s Disk"), g_dpgettext2 (GETTEXT_PACKAGE, "media-type", media_data[n].media_name));
break;
case DRIVE_TYPE_CARD:
/* Translators: Used to describe flash media. The %s is the type, e.g. 'SD' or 'CompactFlash' */
info->media_description = g_strdup_printf (C_("flash-media", "%s Card"), g_dpgettext2 (GETTEXT_PACKAGE, "media-type", media_data[n].media_name));
break;
case DRIVE_TYPE_DISC:
/* Translators: Used to describe optical discs. The %s is the type, e.g. 'CD-R' or 'DVD-ROM' */
info->media_description = g_strdup_printf (C_("optical-media", "%s Disc"), g_dpgettext2 (GETTEXT_PACKAGE, "media-type", media_data[n].media_name));
break;
}
}
if (info->media_icon == NULL)
info->media_icon = g_themed_icon_new_with_default_fallbacks (media_data[n].media_icon);
if (info->media_icon_symbolic == NULL)
info->media_icon_symbolic = g_themed_icon_new_with_default_fallbacks (media_data[n].media_icon_symbolic);
}
}
}
switch (desc_type)
{
case DRIVE_TYPE_UNSET:
if (media_removable)
{
if (size_str != NULL)
{
/* Translators: Used to describe a drive. The %s is the size, e.g. '20 GB' */
info->description = g_strdup_printf (C_("drive-with-size", "%s Drive"), size_str);
}
else
{
/* Translators: Used to describe a drive we know very little about (removable media or size not known) */
info->description = g_strdup (C_("generic-drive", "Drive"));
}
}
else
{
if (rotation_rate == 0)
{
if (size_str != NULL)
{
/* Translators: Used to describe a non-rotating drive (rotation rate either unknown
* or it's a solid-state drive). The %s is the size, e.g. '20 GB'. */
info->description = g_strdup_printf (C_("disk-non-rotational", "%s Disk"), size_str);
}
else
{
/* Translators: Used to describe a non-rotating drive (rotation rate either unknown
* or it's a solid-state drive). The drive is either using removable media or its
* size not known. */
info->description = g_strdup (C_("disk-non-rotational", "Disk"));
}
}
else
{
if (size_str != NULL)
{
/* Translators: Used to describe a hard-disk drive (HDD). The %s is the size, e.g. '20 GB'. */
info->description = g_strdup_printf (C_("disk-hdd", "%s Hard Disk"), size_str);
}
else
{
/* Translators: Used to describe a hard-disk drive (HDD) (removable media or size not known) */
info->description = g_strdup (C_("disk-hdd", "Hard Disk"));
}
}
}
break;
case DRIVE_TYPE_CARD:
/* Translators: Used to describe a card reader. The %s is the card type e.g. 'CompactFlash'. */
info->description = g_strdup_printf (C_("drive-card-reader", "%s Card Reader"), desc_str->str);
break;
case DRIVE_TYPE_DRIVE: /* explicit fall-through */
case DRIVE_TYPE_DISK: /* explicit fall-through */
case DRIVE_TYPE_DISC:
if (!media_removable && size_str != NULL)
{
/* Translators: Used to describe drive. The first %s is the size e.g. '20 GB' and the
* second %s is the drive type e.g. 'Thumb'.
*/
info->description = g_strdup_printf (C_("drive-with-size-and-type", "%s %s Drive"), size_str, desc_str->str);
}
else
{
/* Translators: Used to describe drive. The first %s is the drive type e.g. 'Thumb'.
*/
info->description = g_strdup_printf (C_("drive-with-type", "%s Drive"), desc_str->str);
}
break;
}
g_string_free (desc_str, TRUE);
/* fallback for icon */
if (info->icon == NULL)
{
if (media_removable)
{
s = g_strdup_printf ("drive-removable-media%s", hyphenated_connection_bus);
}
else
{
if (rotation_rate == 0)
s = g_strdup_printf ("drive-harddisk-solidstate%s", hyphenated_connection_bus);
else
s = g_strdup_printf ("drive-harddisk%s", hyphenated_connection_bus);
}
info->icon = g_themed_icon_new_with_default_fallbacks (s);
g_free (s);
}
/* fallback for icon_symbolic */
if (info->icon_symbolic == NULL)
{
if (media_removable)
{
s = g_strdup_printf ("drive-removable-media%s-symbolic", hyphenated_connection_bus);
}
else
{
if (rotation_rate == 0)
s = g_strdup_printf ("drive-harddisk-solidstate%s-symbolic", hyphenated_connection_bus);
else
s = g_strdup_printf ("drive-harddisk%s-symbolic", hyphenated_connection_bus);
}
info->icon_symbolic = g_themed_icon_new_with_default_fallbacks (s);
g_free (s);
}
/* fallback for media_icon */
if (media_available && info->media_icon == NULL)
{
if (media_removable)
{
s = g_strdup_printf ("drive-removable-media%s", hyphenated_connection_bus);
}
else
{
if (rotation_rate == 0)
s = g_strdup_printf ("drive-harddisk-solidstate%s", hyphenated_connection_bus);
else
s = g_strdup_printf ("drive-harddisk%s", hyphenated_connection_bus);
}
info->media_icon = g_themed_icon_new_with_default_fallbacks (s);
g_free (s);
}
/* fallback for media_icon_symbolic */
if (media_available && info->media_icon_symbolic == NULL)
{
if (media_removable)
{
s = g_strdup_printf ("drive-removable-media%s-symbolic", hyphenated_connection_bus);
}
else
{
if (rotation_rate == 0)
s = g_strdup_printf ("drive-harddisk-solidstate%s-symbolic", hyphenated_connection_bus);
else
s = g_strdup_printf ("drive-harddisk%s-symbolic", hyphenated_connection_bus);
}
info->media_icon_symbolic = g_themed_icon_new_with_default_fallbacks (s);
g_free (s);
}
/* prepend a qualifier to the media description, based on the disc state */
if (udisks_drive_get_optical_blank (drive))
{
/* Translators: String used for a blank disc. The %s is the disc type e.g. "CD-RW Disc" */
s = g_strdup_printf (C_("optical-media", "Blank %s"), info->media_description);
g_free (info->media_description);
info->media_description = s;
}
else if (udisks_drive_get_optical_num_audio_tracks (drive) > 0 &&
udisks_drive_get_optical_num_data_tracks (drive) > 0)
{
/* Translators: String used for a mixed disc. The %s is the disc type e.g. "CD-ROM Disc" */
s = g_strdup_printf (C_("optical-media", "Mixed %s"), info->media_description);
g_free (info->media_description);
info->media_description = s;
}
else if (udisks_drive_get_optical_num_audio_tracks (drive) > 0 &&
udisks_drive_get_optical_num_data_tracks (drive) == 0)
{
/* Translators: String used for an audio disc. The %s is the disc type e.g. "CD-ROM Disc" */
s = g_strdup_printf (C_("optical-media", "Audio %s"), info->media_description);
g_free (info->media_description);
info->media_description = s;
}
/* Apply UDISKS_NAME, UDISKS_ICON_NAME, UDISKS_SYMBOLIC_ICON_NAME hints, if available */
block = udisks_client_get_block_for_drive (client, drive, TRUE);
if (block != NULL)
{
cs = udisks_block_get_hint_name (block);
if (cs != NULL && strlen (cs) > 0)
{
g_free (info->description);
g_free (info->media_description);
info->description = g_strdup (cs);
info->media_description = g_strdup (cs);
}
cs = udisks_block_get_hint_icon_name (block);
if (cs != NULL && strlen (cs) > 0)
{
g_clear_object (&info->icon);
g_clear_object (&info->media_icon);
info->icon = g_themed_icon_new_with_default_fallbacks (cs);
info->media_icon = g_themed_icon_new_with_default_fallbacks (cs);
}
cs = udisks_block_get_hint_symbolic_icon_name (block);
if (cs != NULL && strlen (cs) > 0)
{
g_clear_object (&info->icon_symbolic);
g_clear_object (&info->media_icon_symbolic);
info->icon_symbolic = g_themed_icon_new_with_default_fallbacks (cs);
info->media_icon_symbolic = g_themed_icon_new_with_default_fallbacks (cs);
}
}
if (partition != NULL)
{
GDBusObject *object_for_partition;
object_for_partition = g_dbus_interface_get_object (G_DBUS_INTERFACE (partition));
if (object_for_partition != NULL)
block_for_partition = udisks_object_peek_block (UDISKS_OBJECT (object_for_partition));
}
if (block_for_partition == NULL)
block_for_partition = block;
if (partition != NULL)
{
/* Translators: Used to describe a partition of a drive.
* The %u is the partition number.
* The %s is the description for the drive (e.g. "2 GB Thumb Drive").
*/
s = g_strdup_printf (C_("part-drive", "Partition %u of %s"),
udisks_partition_get_number (partition), info->description);
g_free (info->description);
info->description = s;
}
/* calculate and set one-liner */
if (block != NULL)
{
const gchar *drive_revision = udisks_drive_get_revision (drive);
if (strlen (drive_revision) > 0)
{
/* Translators: String used for one-liner description of drive.
* The first %s is the description of the object (e.g. "80 GB Disk" or "Partition 2 of 2 GB Thumb Drive").
* The second %s is the name of the object (e.g. "INTEL SSDSA2MH080G1GC").
* The third %s is the fw revision (e.g "45ABX21").
* The fourth %s is the special device file (e.g. "/dev/sda").
*/
info->one_liner = g_strdup_printf (C_("one-liner-drive", "%s — %s [%s] (%s)"),
info->description,
info->name,
drive_revision,
udisks_block_get_preferred_device (block_for_partition));
}
else
{
/* Translators: String used for one-liner description of drive w/o known fw revision.
* The first %s is the description of the object (e.g. "80 GB Disk").
* The second %s is the name of the object (e.g. "INTEL SSDSA2MH080G1GC").
* The third %s is the special device file (e.g. "/dev/sda").
*/
info->one_liner = g_strdup_printf (C_("one-liner-drive", "%s — %s (%s)"),
info->description,
info->name,
udisks_block_get_preferred_device (block_for_partition));
}
}
g_free (hyphenated_connection_bus);
g_free (size_str);
info->sort_key = g_strdup_printf ("00_drive_%s", udisks_drive_get_sort_key (drive));
g_clear_object (&block);
}
/**
* udisks_client_get_object_info:
* @client: A #UDisksClient.
* @object: A #UDisksObject.
*
* Gets information about a #UDisksObject instance that is suitable to
* present in an user interface. Information is returned in the
* #UDisksObjectInfo object and is localized.
*
* Returns: (transfer full): A #UDisksObjectInfo instance that should be freed with g_object_unref().
*
* Since: 2.1
*/
UDisksObjectInfo *
udisks_client_get_object_info (UDisksClient *client,
UDisksObject *object)
{
UDisksObjectInfo *ret = NULL;
UDisksDrive *drive = NULL;
UDisksBlock *block = NULL;
UDisksPartition *partition = NULL;
UDisksMDRaid *mdraid = NULL;
UDisksLoop *loop = NULL;
g_return_val_if_fail (UDISKS_IS_CLIENT (client), NULL);
g_return_val_if_fail (UDISKS_IS_OBJECT (object), NULL);
ret = udisks_object_info_new (object);
drive = udisks_object_get_drive (object);
block = udisks_object_get_block (object);
loop = udisks_object_get_loop (object);
partition = udisks_object_get_partition (object);
mdraid = udisks_object_get_mdraid (object);
if (drive != NULL)
{
udisks_client_get_object_info_for_drive (client, drive, NULL, ret);
}
else if (mdraid != NULL)
{
udisks_client_get_object_info_for_mdraid (client, mdraid, NULL, ret);
}
else if (block != NULL)
{
drive = udisks_client_get_drive_for_block (client, block);
if (drive != NULL)
{
udisks_client_get_object_info_for_drive (client, drive, partition, ret);
goto out;
}
mdraid = udisks_client_get_mdraid_for_block (client, block);
if (mdraid != NULL)
{
udisks_client_get_object_info_for_mdraid (client, mdraid, partition, ret);
goto out;
}
if (loop != NULL)
udisks_client_get_object_info_for_loop (client, loop, block, partition, ret);
else
udisks_client_get_object_info_for_block (client, block, partition, ret);
}
out:
g_clear_object (&loop);
g_clear_object (&mdraid);
g_clear_object (&partition);
g_clear_object (&block);
g_clear_object (&drive);
#if 0
/* for debugging */
g_print ("%s -> dd='%s', md='%s', ol='%s' and di='%s', mi='%s' sk='%s'\n",
g_dbus_object_get_object_path (G_DBUS_OBJECT (object)),
ret->description,
ret->media_description,
ret->one_liner,
ret->icon == NULL ? "" : g_icon_to_string (ret->icon),
ret->media_icon == NULL ? "" : g_icon_to_string (ret->media_icon),
ret->sort_key);
#endif
return ret;
}
/* ---------------------------------------------------------------------------------------------------- */
static gpointer
_g_object_ref0 (gpointer object)
{
if (object != NULL)
return g_object_ref (G_OBJECT (object));
else
return NULL;
}
/**
* udisks_client_get_drive_info:
* @client: A #UDisksClient.
* @drive: A #UDisksDrive.
* @out_name: (out) (allow-none): Return location for name or %NULL.
* @out_description: (out) (allow-none): Return location for description or %NULL.
* @out_drive_icon: (out) (allow-none): Return location for icon representing the drive or %NULL.
* @out_media_description: (out) (allow-none): Return location for description of the media or %NULL.
* @out_media_icon: (out) (allow-none): Return location for icon representing the media or %NULL.
*
* Gets information about a #UDisksDrive object that is suitable to
* present in an user interface. The returned strings are localized.
*
* Deprecated: 2.1: Use udisks_client_get_object_info() instead.
*/
void
udisks_client_get_drive_info (UDisksClient *client,
UDisksDrive *drive,
gchar **out_name,
gchar **out_description,
GIcon **out_icon,
gchar **out_media_description,
GIcon **out_media_icon)
{
UDisksObjectInfo *info;
g_return_if_fail (UDISKS_IS_CLIENT (client));
g_return_if_fail (UDISKS_IS_DRIVE (drive));
info = udisks_object_info_new (NULL);
udisks_client_get_object_info_for_drive (client, drive, NULL, info);
if (out_name != NULL)
*out_name = g_strdup (info->name);
if (out_description != NULL)
*out_description = g_strdup (info->description);
if (out_icon != NULL)
*out_icon = _g_object_ref0 (info->icon);
if (out_media_description != NULL)
*out_media_description = g_strdup (info->media_description);
if (out_media_icon != NULL)
*out_media_icon = _g_object_ref0 (info->media_icon);
g_object_unref (info);
}
/* ---------------------------------------------------------------------------------------------------- */
/**
* udisks_object_info_get_object:
* @info: A #UDisksObjectInfo.
*
* Gets the #UDisksObject that @info is for
*
* Returns: (transfer none): The object - do not free or unref, the reference belongs to @info.
*
* Since: 2.1
*/
UDisksObject *
udisks_object_info_get_object (UDisksObjectInfo *info)
{
g_return_val_if_fail (UDISKS_IS_OBJECT_INFO (info), NULL);
return info->object;
}
/**
* udisks_object_info_get_name:
* @info: A #UDisksObjectInfo.
*
* Gets the name.
*
* Returns: (transfer none): The value or %NULL. Do not free or unref, the value belongs to @info.
*
* Since: 2.1
*/
const gchar *
udisks_object_info_get_name (UDisksObjectInfo *info)
{
g_return_val_if_fail (UDISKS_IS_OBJECT_INFO (info), NULL);
return info->name;
}
/**
* udisks_object_info_get_description:
* @info: A #UDisksObjectInfo.
*
* Gets the description.
*
* Returns: (transfer none): The value or %NULL. Do not free or unref, the value belongs to @info.
*
* Since: 2.1
*/
const gchar *
udisks_object_info_get_description (UDisksObjectInfo *info)
{
g_return_val_if_fail (UDISKS_IS_OBJECT_INFO (info), NULL);
return info->description;
}
/**
* udisks_object_info_get_icon:
* @info: A #UDisksObjectInfo.
*
* Gets the icon.
*
* Returns: (transfer none): The value or %NULL. Do not free or unref, the value belongs to @info.
*
* Since: 2.1
*/
GIcon *
udisks_object_info_get_icon (UDisksObjectInfo *info)
{
g_return_val_if_fail (UDISKS_IS_OBJECT_INFO (info), NULL);
return info->icon;
}
/**
* udisks_object_info_get_icon_symbolic:
* @info: A #UDisksObjectInfo.
*
* Gets the symbolic icon.
*
* Returns: (transfer none): The value or %NULL. Do not free or unref, the value belongs to @info.
*
* Since: 2.1
*/
GIcon *
udisks_object_info_get_icon_symbolic (UDisksObjectInfo *info)
{
g_return_val_if_fail (UDISKS_IS_OBJECT_INFO (info), NULL);
return info->icon_symbolic;
}
/**
* udisks_object_info_get_media_description:
* @info: A #UDisksObjectInfo.
*
* Gets the media description.
*
* Returns: (transfer none): The value or %NULL. Do not free or unref, the value belongs to @info.
*
* Since: 2.1
*/
const gchar *
udisks_object_info_get_media_description (UDisksObjectInfo *info)
{
g_return_val_if_fail (UDISKS_IS_OBJECT_INFO (info), NULL);
return info->media_description;
}
/**
* udisks_object_info_get_media_icon:
* @info: A #UDisksObjectInfo.
*
* Gets the media icon.
*
* Returns: (transfer none): The value or %NULL. Do not free or unref, the value belongs to @info.
*
* Since: 2.1
*/
GIcon *
udisks_object_info_get_media_icon (UDisksObjectInfo *info)
{
g_return_val_if_fail (UDISKS_IS_OBJECT_INFO (info), NULL);
return info->media_icon;
}
/**
* udisks_object_info_get_media_icon_symbolic:
* @info: A #UDisksObjectInfo.
*
* Gets the symbolic media icon.
*
* Returns: (transfer none): The value or %NULL. Do not free or unref, the value belongs to @info.
*
* Since: 2.1
*/
GIcon *
udisks_object_info_get_media_icon_symbolic (UDisksObjectInfo *info)
{
g_return_val_if_fail (UDISKS_IS_OBJECT_INFO (info), NULL);
return info->media_icon_symbolic;
}
/**
* udisks_object_info_get_one_liner:
* @info: A #UDisksObjectInfo.
*
* Gets a one-line description.
*
* Returns: (transfer none): The value or %NULL. Do not free or unref, the value belongs to @info.
*
* Since: 2.1
*/
const gchar *
udisks_object_info_get_one_liner (UDisksObjectInfo *info)
{
g_return_val_if_fail (UDISKS_IS_OBJECT_INFO (info), NULL);
return info->one_liner;
}
/**
* udisks_object_info_get_sort_key:
* @info: A #UDisksObjectInfo.
*
* Gets the sort-key for @info. This can be used with g_strcmp0() to
* sort objects.
*
* Returns: (transfer none): The sort key or %NULL. Do not free or unref, the value belongs to @info.
*
* Since: 2.1
*/
const gchar *
udisks_object_info_get_sort_key (UDisksObjectInfo *info)
{
g_return_val_if_fail (UDISKS_IS_OBJECT_INFO (info), NULL);
return info->sort_key;
}