// -*- Mode: C++; indent-tabs-mode: nil; tab-width: 2 -*- /* * Copyright (C) 2012 Canonical Ltd * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as * published by the Free Software Foundation. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * Authored by: Andrea Azzarone */ #include #include #include #include "VolumeImp.h" namespace unity { namespace launcher { // // Start private implementation // class VolumeImp::Impl : public sigc::trackable { public: Impl(glib::Object const& volume, VolumeImp* parent) : parent_(parent) , volume_(volume) { signal_volume_changed_.Connect(volume_, "changed", [this] (GVolume*) { parent_->changed.emit(); }); signal_volume_removed_.Connect(volume_, "removed", [this] (GVolume*) { parent_->removed.emit(); }); } bool CanBeEjected() const { return g_volume_can_eject(volume_) != FALSE; } bool CanBeFormatted() const { return !GetUnixDevicePath().empty(); } bool CanBeRemoved() const { glib::Object drive(g_volume_get_drive(volume_)); return drive && g_drive_is_media_removable(drive) != FALSE; } bool CanBeStopped() const { glib::Object drive(g_volume_get_drive(volume_)); return drive && g_drive_can_stop(drive) != FALSE; } std::string GetName() const { return glib::String(g_volume_get_name(volume_)).Str(); } std::string GetIconName() const { glib::Object icon(g_volume_get_icon(volume_)); return glib::String(g_icon_to_string(icon)).Str(); } std::string GetIdentifier() const { glib::String label(g_volume_get_identifier(volume_, G_VOLUME_IDENTIFIER_KIND_LABEL)); glib::String uuid(g_volume_get_identifier(volume_, G_VOLUME_IDENTIFIER_KIND_UUID)); if (!label && !uuid) return GetName(); else return uuid.Str() + "-" + label.Str(); } std::string GetUnixDevicePath() const { glib::String ret(g_volume_get_identifier(volume_, G_VOLUME_IDENTIFIER_KIND_UNIX_DEVICE)); return ret.Str(); } bool HasSiblings() const { glib::Object drive(g_volume_get_drive(volume_)); if (!drive) return false; GList* volumes = g_drive_get_volumes(drive); bool has_sibilings = volumes && volumes->next; if (volumes) g_list_free_full(volumes, g_object_unref); return has_sibilings; } bool IsMounted() const { glib::Object mount(g_volume_get_mount(volume_)); return static_cast(mount); } bool IsShadowed() const { glib::Object mount(g_volume_get_mount(volume_)); return mount ? g_mount_is_shadowed(mount) : false; } void Eject() { if (!CanBeEjected()) return; glib::Object mount_op(gtk_mount_operation_new(nullptr)); g_volume_eject_with_operation(volume_, G_MOUNT_UNMOUNT_NONE, mount_op, cancellable_, [] (GObject* object, GAsyncResult* res, gpointer data) { if (g_volume_eject_with_operation_finish(G_VOLUME(object), res, nullptr)) static_cast(data)->parent_->ejected.emit(); }, this); } void Mount() { glib::Object mount_op(gtk_mount_operation_new(nullptr)); g_volume_mount(volume_, G_MOUNT_MOUNT_NONE, mount_op, cancellable_, [] (GObject* object, GAsyncResult* res, gpointer data) { if (g_volume_mount_finish(G_VOLUME(object), res, nullptr)) static_cast(data)->parent_->mounted.emit(); }, this); } std::string GetUri() const { glib::Object mount(g_volume_get_mount(volume_)); if (!mount.IsType(G_TYPE_MOUNT)) return std::string(); glib::Object root(g_mount_get_root(mount)); if (!root.IsType(G_TYPE_FILE)) return std::string(); return glib::String(g_file_get_uri(root)).Str(); } void StopDrive() { if (!CanBeStopped()) return; glib::Object drive(g_volume_get_drive(volume_)); glib::Object mount_op(gtk_mount_operation_new(NULL)); g_drive_stop(drive, G_MOUNT_UNMOUNT_NONE, mount_op, cancellable_, [] (GObject* object, GAsyncResult* res, gpointer data) { if (g_drive_stop_finish(G_DRIVE(object), res, nullptr)) static_cast(data)->parent_->stopped.emit(); }, this); } void Unmount() { if (!IsMounted()) return; glib::Object mount(g_volume_get_mount(volume_)); glib::Object op(gtk_mount_operation_new(nullptr)); g_mount_unmount_with_operation(mount, G_MOUNT_UNMOUNT_NONE, op, cancellable_, [] (GObject* object, GAsyncResult* res, gpointer data) { if (g_mount_unmount_with_operation_finish(G_MOUNT(object), res, nullptr)) static_cast(data)->parent_->unmounted.emit(); }, this); } VolumeImp* parent_; glib::Cancellable cancellable_; glib::Object volume_; glib::Signal signal_volume_changed_; glib::Signal signal_volume_removed_; }; // // End private implementation // VolumeImp::VolumeImp(glib::Object const& volume) : pimpl(new Impl(volume, this)) {} VolumeImp::~VolumeImp() {} bool VolumeImp::CanBeEjected() const { return pimpl->CanBeEjected(); } bool VolumeImp::CanBeFormatted() const { return pimpl->CanBeFormatted(); } bool VolumeImp::CanBeRemoved() const { return pimpl->CanBeRemoved(); } bool VolumeImp::CanBeStopped() const { return pimpl->CanBeStopped(); } std::string VolumeImp::GetName() const { return pimpl->GetName(); } std::string VolumeImp::GetIconName() const { return pimpl->GetIconName(); } std::string VolumeImp::GetIdentifier() const { return pimpl->GetIdentifier(); } std::string VolumeImp::GetUnixDevicePath() const { return pimpl->GetUnixDevicePath(); } std::string VolumeImp::GetUri() const { return pimpl->GetUri(); } bool VolumeImp::HasSiblings() const { return pimpl->HasSiblings(); } bool VolumeImp::IsMounted() const { return pimpl->IsMounted(); } bool VolumeImp::IsShadowed() const { return pimpl->IsShadowed(); } void VolumeImp::Mount() { pimpl->Mount(); } void VolumeImp::Eject() { pimpl->Eject(); } void VolumeImp::StopDrive() { pimpl->StopDrive(); } void VolumeImp::Unmount() { pimpl->Unmount(); } } // namespace launcher } // namespace unity