| Index: chrome/browser/chromeos/cros/mount_library.cc
|
| diff --git a/chrome/browser/chromeos/cros/mount_library.cc b/chrome/browser/chromeos/cros/mount_library.cc
|
| index e99edf28ea84352b6675204e4365338ce3464c32..16cec4aec0513073da1cc54a71dd8c128103763f 100644
|
| --- a/chrome/browser/chromeos/cros/mount_library.cc
|
| +++ b/chrome/browser/chromeos/cros/mount_library.cc
|
| @@ -9,97 +9,140 @@
|
| #include "chrome/browser/chrome_thread.h"
|
| #include "chrome/browser/chromeos/cros/cros_library.h"
|
|
|
| -// Allows InvokeLater without adding refcounting. This class is a Singleton and
|
| -// won't be deleted until it's last InvokeLater is run.
|
| -DISABLE_RUNNABLE_METHOD_REFCOUNT(chromeos::MountLibraryImpl);
|
| -
|
| namespace chromeos {
|
|
|
| -void MountLibraryImpl::AddObserver(Observer* observer) {
|
| - observers_.AddObserver(observer);
|
| -}
|
| +class MountLibraryImpl : public MountLibrary {
|
| + public:
|
| + MountLibraryImpl() : mount_status_connection_(NULL) {
|
| + if (CrosLibrary::Get()->EnsureLoaded()) {
|
| + Init();
|
| + } else {
|
| + LOG(ERROR) << "Cros Library has not been loaded";
|
| + }
|
| + }
|
|
|
| -void MountLibraryImpl::RemoveObserver(Observer* observer) {
|
| - observers_.RemoveObserver(observer);
|
| -}
|
| + ~MountLibraryImpl() {
|
| + if (mount_status_connection_) {
|
| + DisconnectMountStatus(mount_status_connection_);
|
| + }
|
| + }
|
|
|
| -bool MountLibraryImpl::MountPath(const char* device_path) {
|
| - return MountDevicePath(device_path);
|
| -}
|
| + void AddObserver(Observer* observer) {
|
| + observers_.AddObserver(observer);
|
| + }
|
|
|
| -void MountLibraryImpl::ParseDisks(const MountStatus& status) {
|
| - disks_.clear();
|
| - for (int i = 0; i < status.size; i++) {
|
| - std::string path;
|
| - std::string mountpath;
|
| - std::string systempath;
|
| - bool parent;
|
| - bool hasmedia;
|
| - if (status.disks[i].path != NULL) {
|
| - path = status.disks[i].path;
|
| - }
|
| - if (status.disks[i].mountpath != NULL) {
|
| - mountpath = status.disks[i].mountpath;
|
| - }
|
| - if (status.disks[i].systempath != NULL) {
|
| - systempath = status.disks[i].systempath;
|
| + void RemoveObserver(Observer* observer) {
|
| + observers_.RemoveObserver(observer);
|
| + }
|
| +
|
| + bool MountPath(const char* device_path) {
|
| + return MountDevicePath(device_path);
|
| + }
|
| +
|
| + const DiskVector& disks() const { return disks_; }
|
| +
|
| + private:
|
| + void ParseDisks(const MountStatus& status) {
|
| + disks_.clear();
|
| + for (int i = 0; i < status.size; i++) {
|
| + std::string path;
|
| + std::string mountpath;
|
| + std::string systempath;
|
| + bool parent;
|
| + bool hasmedia;
|
| + if (status.disks[i].path != NULL) {
|
| + path = status.disks[i].path;
|
| + }
|
| + if (status.disks[i].mountpath != NULL) {
|
| + mountpath = status.disks[i].mountpath;
|
| + }
|
| + if (status.disks[i].systempath != NULL) {
|
| + systempath = status.disks[i].systempath;
|
| + }
|
| + parent = status.disks[i].isparent;
|
| + hasmedia = status.disks[i].hasmedia;
|
| + disks_.push_back(Disk(path,
|
| + mountpath,
|
| + systempath,
|
| + parent,
|
| + hasmedia));
|
| }
|
| - parent = status.disks[i].isparent;
|
| - hasmedia = status.disks[i].hasmedia;
|
| - disks_.push_back(Disk(path,
|
| - mountpath,
|
| - systempath,
|
| - parent,
|
| - hasmedia));
|
| }
|
| -}
|
|
|
| -MountLibraryImpl::MountLibraryImpl() : mount_status_connection_(NULL) {
|
| - if (CrosLibrary::Get()->EnsureLoaded()) {
|
| - Init();
|
| - } else {
|
| - LOG(ERROR) << "Cros Library has not been loaded";
|
| + static void MountStatusChangedHandler(void* object,
|
| + const MountStatus& status,
|
| + MountEventType evt,
|
| + const char* path) {
|
| + MountLibraryImpl* mount = static_cast<MountLibraryImpl*>(object);
|
| + std::string devicepath = path;
|
| + mount->ParseDisks(status);
|
| + mount->UpdateMountStatus(status, evt, devicepath);
|
| }
|
| -}
|
|
|
| -MountLibraryImpl::~MountLibraryImpl() {
|
| - if (mount_status_connection_) {
|
| - DisconnectMountStatus(mount_status_connection_);
|
| + void Init() {
|
| + // Getting the monitor status so that the daemon starts up.
|
| + MountStatus* mount = RetrieveMountInformation();
|
| + if (!mount) {
|
| + LOG(ERROR) << "Failed to retrieve mount information";
|
| + return;
|
| + }
|
| + ParseDisks(*mount);
|
| + FreeMountStatus(mount);
|
| +
|
| + mount_status_connection_ = MonitorMountStatus(
|
| + &MountStatusChangedHandler, this);
|
| }
|
| -}
|
|
|
| -// static
|
| -void MountLibraryImpl::MountStatusChangedHandler(void* object,
|
| - const MountStatus& status,
|
| - MountEventType evt,
|
| - const char* path) {
|
| - MountLibraryImpl* mount = static_cast<MountLibraryImpl*>(object);
|
| - std::string devicepath = path;
|
| - mount->ParseDisks(status);
|
| - mount->UpdateMountStatus(status, evt, devicepath);
|
| -}
|
| + void UpdateMountStatus(const MountStatus& status,
|
| + MountEventType evt,
|
| + const std::string& path) {
|
| + // Make sure we run on UI thread.
|
| + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
|
|
|
| -void MountLibraryImpl::Init() {
|
| - // Getting the monitor status so that the daemon starts up.
|
| - MountStatus* mount = RetrieveMountInformation();
|
| - if (!mount) {
|
| - LOG(ERROR) << "Failed to retrieve mount information";
|
| - return;
|
| + FOR_EACH_OBSERVER(
|
| + Observer, observers_, MountChanged(this, evt, path));
|
| }
|
| - ParseDisks(*mount);
|
| - FreeMountStatus(mount);
|
| + ObserverList<Observer> observers_;
|
|
|
| - mount_status_connection_ = MonitorMountStatus(
|
| - &MountStatusChangedHandler, this);
|
| -}
|
| + // A reference to the mount api, to allow callbacks when the mount
|
| + // status changes.
|
| + MountStatusConnection mount_status_connection_;
|
| +
|
| + // The list of disks found.
|
| + DiskVector disks_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(MountLibraryImpl);
|
| +};
|
|
|
| -void MountLibraryImpl::UpdateMountStatus(const MountStatus& status,
|
| - MountEventType evt,
|
| - const std::string& path) {
|
| - // Make sure we run on UI thread.
|
| - DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
|
| +class MountLibraryStubImpl : public MountLibrary {
|
| + public:
|
| + MountLibraryStubImpl() {}
|
| + virtual ~MountLibraryStubImpl() {}
|
|
|
| - FOR_EACH_OBSERVER(Observer, observers_, MountChanged(this, evt, path));
|
| + // MountLibrary overrides.
|
| + virtual void AddObserver(Observer* observer) {}
|
| + virtual void RemoveObserver(Observer* observer) {}
|
| + virtual const DiskVector& disks() const { return disks_; }
|
| + virtual bool MountPath(const char* device_path) { return false; }
|
| +
|
| + private:
|
| + // The list of disks found.
|
| + DiskVector disks_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(MountLibraryStubImpl);
|
| +};
|
| +
|
| +// static
|
| +MountLibrary* MountLibrary::GetImpl(bool stub) {
|
| + if (stub)
|
| + return new MountLibraryStubImpl();
|
| + else
|
| + return new MountLibraryImpl();
|
| }
|
|
|
| } // namespace chromeos
|
| +
|
| +// Allows InvokeLater without adding refcounting. This class is a Singleton and
|
| +// won't be deleted until it's last InvokeLater is run.
|
| +DISABLE_RUNNABLE_METHOD_REFCOUNT(chromeos::MountLibraryImpl);
|
| +
|
|
|