diff options
Diffstat (limited to 'dom/base/MutableBlobStorage.h')
-rw-r--r-- | dom/base/MutableBlobStorage.h | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/dom/base/MutableBlobStorage.h b/dom/base/MutableBlobStorage.h new file mode 100644 index 000000000..fad391b16 --- /dev/null +++ b/dom/base/MutableBlobStorage.h @@ -0,0 +1,107 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* 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_dom_MutableBlobStorage_h +#define mozilla_dom_MutableBlobStorage_h + +#include "mozilla/RefPtr.h" +#include "prio.h" + +namespace mozilla { + +class TaskQueue; + +namespace dom { + +class Blob; +class BlobImpl; +class MutableBlobStorage; + +class MutableBlobStorageCallback +{ +public: + NS_IMETHOD_(MozExternalRefCountType) AddRef(void) = 0; + + NS_IMETHOD_(MozExternalRefCountType) Release(void) = 0; + + virtual void BlobStoreCompleted(MutableBlobStorage* aBlobStorage, + Blob* aBlob, + nsresult aRv) = 0; +}; + +// This class is main-thread only. +class MutableBlobStorage final +{ +public: + NS_INLINE_DECL_THREADSAFE_REFCOUNTING(MutableBlobStorage); + + enum MutableBlobStorageType + { + eOnlyInMemory, + eCouldBeInTemporaryFile, + }; + + explicit MutableBlobStorage(MutableBlobStorageType aType); + + nsresult Append(const void* aData, uint32_t aLength); + + // This method can be called just once. + // The callback will be called when the Blob is ready. + // The return value is the total size of the blob, when created. + uint64_t GetBlobWhenReady(nsISupports* aParent, + const nsACString& aContentType, + MutableBlobStorageCallback* aCallback); + + void TemporaryFileCreated(PRFileDesc* aFD); + + void CreateBlobAndRespond(already_AddRefed<nsISupports> aParent, + const nsACString& aContentType, + already_AddRefed<MutableBlobStorageCallback> aCallback); + + void ErrorPropagated(nsresult aRv); + +private: + ~MutableBlobStorage(); + + bool ExpandBufferSize(uint64_t aSize); + + bool ShouldBeTemporaryStorage(uint64_t aSize) const; + + nsresult MaybeCreateTemporaryFile(); + + void DispatchToIOThread(already_AddRefed<nsIRunnable> aRunnable); + + // All these variables are touched on the main thread only. + + void* mData; + uint64_t mDataLen; + uint64_t mDataBufferLen; + + enum StorageState { + eKeepInMemory, + eInMemory, + eWaitingForTemporaryFile, + eInTemporaryFile, + eClosed + }; + + StorageState mStorageState; + + PRFileDesc* mFD; + + nsresult mErrorResult; + + RefPtr<TaskQueue> mTaskQueue; + + nsCOMPtr<nsISupports> mPendingParent; + nsCString mPendingContentType; + RefPtr<MutableBlobStorageCallback> mPendingCallback; +}; + +} // namespace dom +} // namespace mozilla + +#endif // mozilla_dom_MutableBlobStorage_h |