/* 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_volumemanager_h__ #define mozilla_system_volumemanager_h__ #include #include #include "base/message_loop.h" #include "mozilla/FileUtils.h" #include "mozilla/Observer.h" #include "mozilla/RefPtr.h" #include "nsString.h" #include "nsTArray.h" #include "Volume.h" #include "VolumeCommand.h" namespace mozilla { namespace system { /*************************************************************************** * * All of the public API mentioned in this file (unless otherwise * mentioned) must run from the IOThread. * ***************************************************************************/ /*************************************************************************** * * The VolumeManager class is a front-end for android's vold service. * * Vold uses a unix socket interface and accepts null-terminated string * commands. The following commands were determined by examining the vold * source code: * * volume list * volume mount * volume unmount [force] * volume debug [on|off] * volume format * volume share * volume unshare * volume shared * * is the name of the volume as used in /system/etc/vold.fstab * is ums * * dump * * share status (Determines if a particular sharing method is available) * (GB only - not available in ICS) * * storage users (??? always crashes vold ???) * * asec list * asec ...lots more... * * obb list * obb ...lots more... * * xwarp enable * xwarp disable * xwarp status * * There is also a command line tool called vdc, which can be used to send * the above commands to vold. * * Currently, only the volume list, share/unshare, and mount/unmount * commands are being used. * ***************************************************************************/ class VolumeManager : public MessageLoopForIO::Watcher, public RefCounted { public: typedef nsTArray > VolumeArray; VolumeManager(); virtual ~VolumeManager(); //----------------------------------------------------------------------- // // State related methods. // // The VolumeManager starts off in the STARTING state. Once a connection // is established with vold, it asks for a list of volumes, and once the // volume list has been received, then the VolumeManager enters the // VOLUMES_READY state. // // If vold crashes, then the VolumeManager will once again enter the // STARTING state and try to reestablish a connection with vold. enum STATE { UNINITIALIZED, STARTING, VOLUMES_READY }; static STATE State(); static const char *StateStr(STATE aState); static const char *StateStr() { return StateStr(State()); } class StateChangedEvent { public: StateChangedEvent() {} }; typedef mozilla::Observer StateObserver; typedef mozilla::ObserverList StateObserverList; static void RegisterStateObserver(StateObserver *aObserver); static void UnregisterStateObserver(StateObserver *aObserver); //----------------------------------------------------------------------- static void Start(); static VolumeArray::size_type NumVolumes(); static TemporaryRef GetVolume(VolumeArray::index_type aIndex); static TemporaryRef FindVolumeByName(const nsCSubstring &aName); static TemporaryRef FindAddVolumeByName(const nsCSubstring &aName); static void PostCommand(VolumeCommand *aCommand); protected: virtual void OnFileCanReadWithoutBlocking(int aFd); virtual void OnFileCanWriteWithoutBlocking(int aFd); private: bool OpenSocket(); friend class VolumeListCallback; // Calls SetState static void SetState(STATE aNewState); void Restart(); void WriteCommandData(); void HandleBroadcast(int aResponseCode, nsCString &aResponseLine); typedef std::queue > CommandQueue; static STATE mState; static StateObserverList mStateObserverList; static const int kRcvBufSize = 1024; ScopedClose mSocket; VolumeArray mVolumeArray; CommandQueue mCommands; bool mCommandPending; char mRcvBuf[kRcvBufSize]; size_t mRcvIdx; MessageLoopForIO::FileDescriptorWatcher mReadWatcher; MessageLoopForIO::FileDescriptorWatcher mWriteWatcher; RefPtr mBroadcastCallback; }; /*************************************************************************** * * The initialization/shutdown functions do not need to be called from * the IOThread context. * ***************************************************************************/ /** * Initialize the Volume Manager. On initialization, the VolumeManager will * attempt to connect with vold and collect the list of volumes that vold * knows about. */ void InitVolumeManager(); /** * Shuts down the Volume Manager. */ void ShutdownVolumeManager(); } // system } // mozilla #endif // mozilla_system_volumemanager_h__