diff options
Diffstat (limited to 'dom/system/gonk/Volume.h')
-rw-r--r-- | dom/system/gonk/Volume.h | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/dom/system/gonk/Volume.h b/dom/system/gonk/Volume.h new file mode 100644 index 000000000..821292a9a --- /dev/null +++ b/dom/system/gonk/Volume.h @@ -0,0 +1,157 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef mozilla_system_volume_h__ +#define mozilla_system_volume_h__ + +#include "VolumeCommand.h" +#include "nsIVolume.h" +#include "nsString.h" +#include "mozilla/Observer.h" +#include "nsISupportsImpl.h" +#include "nsWhitespaceTokenizer.h" + +namespace mozilla { +namespace system { + +/*************************************************************************** +* +* There is an instance of the Volume class for each volume reported +* from vold. +* +* Each volume originates from the /system/etv/vold.fstab file. +* +***************************************************************************/ + +class Volume; + +#define DEBUG_VOLUME_OBSERVER 0 + +#if DEBUG_VOLUME_OBSERVER +class VolumeObserverList : public mozilla::ObserverList<Volume*> +{ +public: + void Broadcast(Volume* const& aVolume); +}; +#else +typedef mozilla::ObserverList<Volume*> VolumeObserverList; +#endif + +class Volume final +{ +public: + NS_INLINE_DECL_REFCOUNTING(Volume) + + Volume(const nsCSubstring& aVolumeName); + + typedef long STATE; // States are now defined in nsIVolume.idl + + static const char* StateStr(STATE aState) { return NS_VolumeStateStr(aState); } + const char* StateStr() const { return StateStr(mState); } + STATE State() const { return mState; } + + const nsCString& Name() const { return mName; } + const char* NameStr() const { return mName.get(); } + + void Dump(const char* aLabel) const; + + // The mount point is the name of the directory where the volume is mounted. + // (i.e. path that leads to the files stored on the volume). + const nsCString& MountPoint() const { return mMountPoint; } + + uint32_t Id() const { return mId; } + + int32_t MountGeneration() const { return mMountGeneration; } + bool IsMountLocked() const { return mMountLocked; } + bool MediaPresent() const { return mMediaPresent; } + bool CanBeShared() const { return mCanBeShared; } + bool CanBeFormatted() const { return CanBeShared(); } + bool CanBeMounted() const { return CanBeShared(); } + bool IsSharingEnabled() const { return mCanBeShared && mSharingEnabled; } + bool IsFormatRequested() const { return CanBeFormatted() && mFormatRequested; } + bool IsMountRequested() const { return CanBeMounted() && mMountRequested; } + bool IsUnmountRequested() const { return CanBeMounted() && mUnmountRequested; } + bool IsSharing() const { return mIsSharing; } + bool IsFormatting() const { return mIsFormatting; } + bool IsUnmounting() const { return mIsUnmounting; } + bool IsRemovable() const { return mIsRemovable; } + bool IsHotSwappable() const { return mIsHotSwappable; } + + void SetFakeVolume(const nsACString& aMountPoint); + + void SetSharingEnabled(bool aSharingEnabled); + void SetFormatRequested(bool aFormatRequested); + void SetMountRequested(bool aMountRequested); + void SetUnmountRequested(bool aUnmountRequested); + + typedef mozilla::Observer<Volume *> EventObserver; + + // NOTE: that observers must live in the IOThread. + static void RegisterVolumeObserver(EventObserver* aObserver, const char* aName); + static void UnregisterVolumeObserver(EventObserver* aObserver, const char* aName); + +protected: + ~Volume() {} + +private: + friend class AutoMounter; // Calls StartXxx + friend class nsVolume; // Calls UpdateMountLock + friend class VolumeManager; // Calls HandleVoldResponse + friend class VolumeListCallback; // Calls SetMountPoint, SetState + + // The StartXxx functions will queue up a command to the VolumeManager. + // You can queue up as many commands as you like, and aCallback will + // be called as each one completes. + void StartMount(VolumeResponseCallback* aCallback); + void StartUnmount(VolumeResponseCallback* aCallback); + void StartFormat(VolumeResponseCallback* aCallback); + void StartShare(VolumeResponseCallback* aCallback); + void StartUnshare(VolumeResponseCallback* aCallback); + + void SetIsSharing(bool aIsSharing); + void SetIsFormatting(bool aIsFormatting); + void SetIsUnmounting(bool aIsUnmounting); + void SetIsRemovable(bool aIsRemovable); + void SetIsHotSwappable(bool aIsHotSwappable); + void SetState(STATE aNewState); + void SetMediaPresent(bool aMediaPresent); + void SetMountPoint(const nsCSubstring& aMountPoint); + void StartCommand(VolumeCommand* aCommand); + + void ResolveAndSetMountPoint(const nsCSubstring& aMountPoint); + + bool BoolConfigValue(const nsCString& aConfigValue, bool& aBoolValue); + void SetConfig(const nsCString& aConfigName, const nsCString& aConfigValue); + + void HandleVoldResponse(int aResponseCode, nsCWhitespaceTokenizer& aTokenizer); + + static void UpdateMountLock(const nsACString& aVolumeName, + const int32_t& aMountGeneration, + const bool& aMountLocked); + + bool mMediaPresent; + STATE mState; + const nsCString mName; + nsCString mMountPoint; + int32_t mMountGeneration; + bool mMountLocked; + bool mSharingEnabled; + bool mFormatRequested; + bool mMountRequested; + bool mUnmountRequested; + bool mCanBeShared; + bool mIsSharing; + bool mIsFormatting; + bool mIsUnmounting; + bool mIsRemovable; + bool mIsHotSwappable; + uint32_t mId; // Unique ID (used by MTP) + + static VolumeObserverList sEventObserverList; +}; + +} // system +} // mozilla + +#endif // mozilla_system_volumemanager_h__ |