michael@0: /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this file, michael@0: * You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #ifndef mozilla_dom_devicestorage_DeviceStorageRequestParent_h michael@0: #define mozilla_dom_devicestorage_DeviceStorageRequestParent_h michael@0: michael@0: #include "mozilla/Attributes.h" michael@0: #include "mozilla/dom/devicestorage/PDeviceStorageRequestParent.h" michael@0: #include "mozilla/dom/ContentChild.h" michael@0: #include "mozilla/dom/ContentParent.h" michael@0: michael@0: #include "nsThreadUtils.h" michael@0: #include "nsDeviceStorage.h" michael@0: #include "nsTArray.h" michael@0: michael@0: namespace mozilla { michael@0: namespace dom { michael@0: namespace devicestorage { michael@0: michael@0: class DeviceStorageRequestParent : public PDeviceStorageRequestParent michael@0: { michael@0: public: michael@0: DeviceStorageRequestParent(const DeviceStorageParams& aParams); michael@0: michael@0: NS_IMETHOD_(MozExternalRefCountType) AddRef(); michael@0: NS_IMETHOD_(MozExternalRefCountType) Release(); michael@0: michael@0: bool EnsureRequiredPermissions(mozilla::dom::ContentParent* aParent); michael@0: void Dispatch(); michael@0: michael@0: virtual void ActorDestroy(ActorDestroyReason); michael@0: michael@0: protected: michael@0: ~DeviceStorageRequestParent(); michael@0: michael@0: private: michael@0: ThreadSafeAutoRefCnt mRefCnt; michael@0: NS_DECL_OWNINGTHREAD michael@0: DeviceStorageParams mParams; michael@0: michael@0: class CancelableRunnable : public nsRunnable michael@0: { michael@0: public: michael@0: CancelableRunnable(DeviceStorageRequestParent* aParent) michael@0: : mParent(aParent) michael@0: { michael@0: mCanceled = !(mParent->AddRunnable(this)); michael@0: } michael@0: michael@0: virtual ~CancelableRunnable() { michael@0: } michael@0: michael@0: NS_IMETHOD Run() MOZ_OVERRIDE { michael@0: nsresult rv = NS_OK; michael@0: if (!mCanceled) { michael@0: rv = CancelableRun(); michael@0: mParent->RemoveRunnable(this); michael@0: } michael@0: return rv; michael@0: } michael@0: michael@0: void Cancel() { michael@0: mCanceled = true; michael@0: } michael@0: michael@0: virtual nsresult CancelableRun() = 0; michael@0: michael@0: protected: michael@0: nsRefPtr mParent; michael@0: private: michael@0: bool mCanceled; michael@0: }; michael@0: michael@0: class PostErrorEvent : public CancelableRunnable michael@0: { michael@0: public: michael@0: PostErrorEvent(DeviceStorageRequestParent* aParent, const char* aError); michael@0: virtual ~PostErrorEvent(); michael@0: virtual nsresult CancelableRun(); michael@0: private: michael@0: nsString mError; michael@0: }; michael@0: michael@0: class PostSuccessEvent : public CancelableRunnable michael@0: { michael@0: public: michael@0: PostSuccessEvent(DeviceStorageRequestParent* aParent); michael@0: virtual ~PostSuccessEvent(); michael@0: virtual nsresult CancelableRun(); michael@0: }; michael@0: michael@0: class PostBlobSuccessEvent : public CancelableRunnable michael@0: { michael@0: public: michael@0: PostBlobSuccessEvent(DeviceStorageRequestParent* aParent, DeviceStorageFile* aFile, uint32_t aLength, nsACString& aMimeType, uint64_t aLastModifiedDate); michael@0: virtual ~PostBlobSuccessEvent(); michael@0: virtual nsresult CancelableRun(); michael@0: private: michael@0: uint32_t mLength; michael@0: uint64_t mLastModificationDate; michael@0: nsRefPtr mFile; michael@0: nsCString mMimeType; michael@0: }; michael@0: michael@0: class PostEnumerationSuccessEvent : public CancelableRunnable michael@0: { michael@0: public: michael@0: PostEnumerationSuccessEvent(DeviceStorageRequestParent* aParent, michael@0: const nsAString& aStorageType, michael@0: const nsAString& aRelPath, michael@0: InfallibleTArray& aPaths); michael@0: virtual ~PostEnumerationSuccessEvent(); michael@0: virtual nsresult CancelableRun(); michael@0: private: michael@0: const nsString mStorageType; michael@0: const nsString mRelPath; michael@0: InfallibleTArray mPaths; michael@0: }; michael@0: michael@0: class CreateFdEvent : public CancelableRunnable michael@0: { michael@0: public: michael@0: CreateFdEvent(DeviceStorageRequestParent* aParent, DeviceStorageFile* aFile); michael@0: virtual ~CreateFdEvent(); michael@0: virtual nsresult CancelableRun(); michael@0: private: michael@0: nsRefPtr mFile; michael@0: }; michael@0: michael@0: class WriteFileEvent : public CancelableRunnable michael@0: { michael@0: public: michael@0: WriteFileEvent(DeviceStorageRequestParent* aParent, DeviceStorageFile* aFile, nsIInputStream* aInputStream); michael@0: virtual ~WriteFileEvent(); michael@0: virtual nsresult CancelableRun(); michael@0: private: michael@0: nsRefPtr mFile; michael@0: nsCOMPtr mInputStream; michael@0: }; michael@0: michael@0: class DeleteFileEvent : public CancelableRunnable michael@0: { michael@0: public: michael@0: DeleteFileEvent(DeviceStorageRequestParent* aParent, DeviceStorageFile* aFile); michael@0: virtual ~DeleteFileEvent(); michael@0: virtual nsresult CancelableRun(); michael@0: private: michael@0: nsRefPtr mFile; michael@0: }; michael@0: michael@0: class FreeSpaceFileEvent : public CancelableRunnable michael@0: { michael@0: public: michael@0: FreeSpaceFileEvent(DeviceStorageRequestParent* aParent, DeviceStorageFile* aFile); michael@0: virtual ~FreeSpaceFileEvent(); michael@0: virtual nsresult CancelableRun(); michael@0: private: michael@0: nsRefPtr mFile; michael@0: }; michael@0: michael@0: class UsedSpaceFileEvent : public CancelableRunnable michael@0: { michael@0: public: michael@0: UsedSpaceFileEvent(DeviceStorageRequestParent* aParent, DeviceStorageFile* aFile); michael@0: virtual ~UsedSpaceFileEvent(); michael@0: virtual nsresult CancelableRun(); michael@0: private: michael@0: nsRefPtr mFile; michael@0: }; michael@0: michael@0: class ReadFileEvent : public CancelableRunnable michael@0: { michael@0: public: michael@0: ReadFileEvent(DeviceStorageRequestParent* aParent, DeviceStorageFile* aFile); michael@0: virtual ~ReadFileEvent(); michael@0: virtual nsresult CancelableRun(); michael@0: private: michael@0: nsRefPtr mFile; michael@0: nsCString mMimeType; michael@0: }; michael@0: michael@0: class EnumerateFileEvent : public CancelableRunnable michael@0: { michael@0: public: michael@0: EnumerateFileEvent(DeviceStorageRequestParent* aParent, DeviceStorageFile* aFile, uint64_t aSince); michael@0: virtual ~EnumerateFileEvent(); michael@0: virtual nsresult CancelableRun(); michael@0: private: michael@0: nsRefPtr mFile; michael@0: uint64_t mSince; michael@0: }; michael@0: michael@0: class PostPathResultEvent : public CancelableRunnable michael@0: { michael@0: public: michael@0: PostPathResultEvent(DeviceStorageRequestParent* aParent, const nsAString& aPath); michael@0: virtual ~PostPathResultEvent(); michael@0: virtual nsresult CancelableRun(); michael@0: private: michael@0: nsRefPtr mFile; michael@0: nsString mPath; michael@0: }; michael@0: michael@0: class PostFileDescriptorResultEvent : public CancelableRunnable michael@0: { michael@0: public: michael@0: PostFileDescriptorResultEvent(DeviceStorageRequestParent* aParent, michael@0: const FileDescriptor& aFileDescriptor); michael@0: virtual ~PostFileDescriptorResultEvent(); michael@0: virtual nsresult CancelableRun(); michael@0: private: michael@0: nsRefPtr mFile; michael@0: FileDescriptor mFileDescriptor; michael@0: }; michael@0: michael@0: class PostFreeSpaceResultEvent : public CancelableRunnable michael@0: { michael@0: public: michael@0: PostFreeSpaceResultEvent(DeviceStorageRequestParent* aParent, michael@0: uint64_t aFreeSpace); michael@0: virtual ~PostFreeSpaceResultEvent(); michael@0: virtual nsresult CancelableRun(); michael@0: private: michael@0: uint64_t mFreeSpace; michael@0: }; michael@0: michael@0: class PostUsedSpaceResultEvent : public CancelableRunnable michael@0: { michael@0: public: michael@0: PostUsedSpaceResultEvent(DeviceStorageRequestParent* aParent, michael@0: const nsAString& aType, michael@0: uint64_t aUsedSpace); michael@0: virtual ~PostUsedSpaceResultEvent(); michael@0: virtual nsresult CancelableRun(); michael@0: private: michael@0: nsString mType; michael@0: uint64_t mUsedSpace; michael@0: }; michael@0: michael@0: class PostAvailableResultEvent : public CancelableRunnable michael@0: { michael@0: public: michael@0: PostAvailableResultEvent(DeviceStorageRequestParent* aParent, DeviceStorageFile* aFile); michael@0: virtual ~PostAvailableResultEvent(); michael@0: virtual nsresult CancelableRun(); michael@0: private: michael@0: nsRefPtr mFile; michael@0: }; michael@0: michael@0: class PostStatusResultEvent : public CancelableRunnable michael@0: { michael@0: public: michael@0: PostStatusResultEvent(DeviceStorageRequestParent* aParent, DeviceStorageFile* aFile); michael@0: virtual ~PostStatusResultEvent(); michael@0: virtual nsresult CancelableRun(); michael@0: private: michael@0: nsRefPtr mFile; michael@0: }; michael@0: michael@0: class PostFormatResultEvent : public CancelableRunnable michael@0: { michael@0: public: michael@0: PostFormatResultEvent(DeviceStorageRequestParent* aParent, DeviceStorageFile* aFile); michael@0: virtual ~PostFormatResultEvent(); michael@0: virtual nsresult CancelableRun(); michael@0: private: michael@0: nsRefPtr mFile; michael@0: }; michael@0: michael@0: class PostMountResultEvent : public CancelableRunnable michael@0: { michael@0: public: michael@0: PostMountResultEvent(DeviceStorageRequestParent* aParent, DeviceStorageFile* aFile); michael@0: virtual ~PostMountResultEvent(); michael@0: virtual nsresult CancelableRun(); michael@0: private: michael@0: nsRefPtr mFile; michael@0: }; michael@0: michael@0: class PostUnmountResultEvent : public CancelableRunnable michael@0: { michael@0: public: michael@0: PostUnmountResultEvent(DeviceStorageRequestParent* aParent, DeviceStorageFile* aFile); michael@0: virtual ~PostUnmountResultEvent(); michael@0: virtual nsresult CancelableRun(); michael@0: private: michael@0: nsRefPtr mFile; michael@0: }; michael@0: michael@0: protected: michael@0: bool AddRunnable(CancelableRunnable* aRunnable) { michael@0: MutexAutoLock lock(mMutex); michael@0: if (mActorDestoryed) michael@0: return false; michael@0: michael@0: mRunnables.AppendElement(aRunnable); michael@0: return true; michael@0: } michael@0: michael@0: void RemoveRunnable(CancelableRunnable* aRunnable) { michael@0: MutexAutoLock lock(mMutex); michael@0: mRunnables.RemoveElement(aRunnable); michael@0: } michael@0: michael@0: Mutex mMutex; michael@0: bool mActorDestoryed; michael@0: nsTArray > mRunnables; michael@0: }; michael@0: michael@0: } // namespace devicestorage michael@0: } // namespace dom michael@0: } // namespace mozilla michael@0: michael@0: #endif