michael@0: /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ michael@0: /* vim: set ts=2 et sw=2 tw=80: */ 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_quota_quotaobject_h__ michael@0: #define mozilla_dom_quota_quotaobject_h__ michael@0: michael@0: #include "mozilla/dom/quota/QuotaCommon.h" michael@0: michael@0: #include "nsDataHashtable.h" michael@0: michael@0: #include "PersistenceType.h" michael@0: michael@0: BEGIN_QUOTA_NAMESPACE michael@0: michael@0: class GroupInfo; michael@0: class GroupInfoPair; michael@0: class OriginInfo; michael@0: class QuotaManager; michael@0: michael@0: class QuotaObject michael@0: { michael@0: friend class OriginInfo; michael@0: friend class QuotaManager; michael@0: michael@0: public: michael@0: void michael@0: AddRef(); michael@0: michael@0: void michael@0: Release(); michael@0: michael@0: void michael@0: UpdateSize(int64_t aSize); michael@0: michael@0: bool michael@0: MaybeAllocateMoreSpace(int64_t aOffset, int32_t aCount); michael@0: michael@0: private: michael@0: QuotaObject(OriginInfo* aOriginInfo, const nsAString& aPath, int64_t aSize) michael@0: : mOriginInfo(aOriginInfo), mPath(aPath), mSize(aSize) michael@0: { michael@0: MOZ_COUNT_CTOR(QuotaObject); michael@0: } michael@0: michael@0: ~QuotaObject() michael@0: { michael@0: MOZ_COUNT_DTOR(QuotaObject); michael@0: } michael@0: michael@0: already_AddRefed michael@0: LockedAddRef() michael@0: { michael@0: AssertCurrentThreadOwnsQuotaMutex(); michael@0: michael@0: ++mRefCnt; michael@0: michael@0: nsRefPtr result = dont_AddRef(this); michael@0: return result.forget(); michael@0: } michael@0: michael@0: mozilla::ThreadSafeAutoRefCnt mRefCnt; michael@0: michael@0: OriginInfo* mOriginInfo; michael@0: nsString mPath; michael@0: int64_t mSize; michael@0: }; michael@0: michael@0: class OriginInfo MOZ_FINAL michael@0: { michael@0: friend class GroupInfo; michael@0: friend class QuotaManager; michael@0: friend class QuotaObject; michael@0: michael@0: public: michael@0: OriginInfo(GroupInfo* aGroupInfo, const nsACString& aOrigin, uint64_t aLimit, michael@0: uint64_t aUsage, int64_t aAccessTime) michael@0: : mGroupInfo(aGroupInfo), mOrigin(aOrigin), mLimit(aLimit), mUsage(aUsage), michael@0: mAccessTime(aAccessTime) michael@0: { michael@0: MOZ_COUNT_CTOR(OriginInfo); michael@0: } michael@0: michael@0: NS_INLINE_DECL_THREADSAFE_REFCOUNTING(OriginInfo) michael@0: michael@0: int64_t michael@0: AccessTime() const michael@0: { michael@0: return mAccessTime; michael@0: } michael@0: michael@0: private: michael@0: // Private destructor, to discourage deletion outside of Release(): michael@0: ~OriginInfo() michael@0: { michael@0: MOZ_COUNT_DTOR(OriginInfo); michael@0: } michael@0: michael@0: void michael@0: LockedDecreaseUsage(int64_t aSize); michael@0: michael@0: void michael@0: LockedUpdateAccessTime(int64_t aAccessTime) michael@0: { michael@0: AssertCurrentThreadOwnsQuotaMutex(); michael@0: michael@0: mAccessTime = aAccessTime; michael@0: } michael@0: michael@0: void michael@0: LockedClearOriginInfos() michael@0: { michael@0: AssertCurrentThreadOwnsQuotaMutex(); michael@0: michael@0: mQuotaObjects.EnumerateRead(ClearOriginInfoCallback, nullptr); michael@0: } michael@0: michael@0: static PLDHashOperator michael@0: ClearOriginInfoCallback(const nsAString& aKey, michael@0: QuotaObject* aValue, void* aUserArg); michael@0: michael@0: nsDataHashtable mQuotaObjects; michael@0: michael@0: GroupInfo* mGroupInfo; michael@0: nsCString mOrigin; michael@0: uint64_t mLimit; michael@0: uint64_t mUsage; michael@0: int64_t mAccessTime; michael@0: }; michael@0: michael@0: class OriginInfoLRUComparator michael@0: { michael@0: public: michael@0: bool michael@0: Equals(const OriginInfo* a, const OriginInfo* b) const michael@0: { michael@0: return michael@0: a && b ? a->AccessTime() == b->AccessTime() : !a && !b ? true : false; michael@0: } michael@0: michael@0: bool michael@0: LessThan(const OriginInfo* a, const OriginInfo* b) const michael@0: { michael@0: return a && b ? a->AccessTime() < b->AccessTime() : b ? true : false; michael@0: } michael@0: }; michael@0: michael@0: class GroupInfo MOZ_FINAL michael@0: { michael@0: friend class GroupInfoPair; michael@0: friend class OriginInfo; michael@0: friend class QuotaManager; michael@0: friend class QuotaObject; michael@0: michael@0: public: michael@0: GroupInfo(PersistenceType aPersistenceType, const nsACString& aGroup) michael@0: : mPersistenceType(aPersistenceType), mGroup(aGroup), mUsage(0) michael@0: { michael@0: MOZ_COUNT_CTOR(GroupInfo); michael@0: } michael@0: michael@0: NS_INLINE_DECL_THREADSAFE_REFCOUNTING(GroupInfo) michael@0: michael@0: bool michael@0: IsForPersistentStorage() const michael@0: { michael@0: return mPersistenceType == PERSISTENCE_TYPE_PERSISTENT; michael@0: } michael@0: michael@0: bool michael@0: IsForTemporaryStorage() const michael@0: { michael@0: return mPersistenceType == PERSISTENCE_TYPE_TEMPORARY; michael@0: } michael@0: michael@0: private: michael@0: // Private destructor, to discourage deletion outside of Release(): michael@0: ~GroupInfo() michael@0: { michael@0: MOZ_COUNT_DTOR(GroupInfo); michael@0: } michael@0: michael@0: already_AddRefed michael@0: LockedGetOriginInfo(const nsACString& aOrigin); michael@0: michael@0: void michael@0: LockedAddOriginInfo(OriginInfo* aOriginInfo); michael@0: michael@0: void michael@0: LockedRemoveOriginInfo(const nsACString& aOrigin); michael@0: michael@0: void michael@0: LockedRemoveOriginInfos(); michael@0: michael@0: void michael@0: LockedRemoveOriginInfosForPattern(const nsACString& aPattern); michael@0: michael@0: bool michael@0: LockedHasOriginInfos() michael@0: { michael@0: AssertCurrentThreadOwnsQuotaMutex(); michael@0: michael@0: return !mOriginInfos.IsEmpty(); michael@0: } michael@0: michael@0: nsTArray > mOriginInfos; michael@0: michael@0: PersistenceType mPersistenceType; michael@0: nsCString mGroup; michael@0: uint64_t mUsage; michael@0: }; michael@0: michael@0: class GroupInfoPair michael@0: { michael@0: friend class QuotaManager; michael@0: michael@0: public: michael@0: GroupInfoPair() michael@0: { michael@0: MOZ_COUNT_CTOR(GroupInfoPair); michael@0: } michael@0: michael@0: ~GroupInfoPair() michael@0: { michael@0: MOZ_COUNT_DTOR(GroupInfoPair); michael@0: } michael@0: michael@0: private: michael@0: already_AddRefed michael@0: LockedGetGroupInfo(PersistenceType aPersistenceType) michael@0: { michael@0: AssertCurrentThreadOwnsQuotaMutex(); michael@0: michael@0: nsRefPtr groupInfo = michael@0: GetGroupInfoForPersistenceType(aPersistenceType); michael@0: return groupInfo.forget(); michael@0: } michael@0: michael@0: void michael@0: LockedSetGroupInfo(GroupInfo* aGroupInfo) michael@0: { michael@0: AssertCurrentThreadOwnsQuotaMutex(); michael@0: michael@0: nsRefPtr& groupInfo = michael@0: GetGroupInfoForPersistenceType(aGroupInfo->mPersistenceType); michael@0: groupInfo = aGroupInfo; michael@0: } michael@0: michael@0: void michael@0: LockedClearGroupInfo(PersistenceType aPersistenceType) michael@0: { michael@0: AssertCurrentThreadOwnsQuotaMutex(); michael@0: michael@0: nsRefPtr& groupInfo = michael@0: GetGroupInfoForPersistenceType(aPersistenceType); michael@0: groupInfo = nullptr; michael@0: } michael@0: michael@0: bool michael@0: LockedHasGroupInfos() michael@0: { michael@0: AssertCurrentThreadOwnsQuotaMutex(); michael@0: michael@0: return mPersistentStorageGroupInfo || mTemporaryStorageGroupInfo; michael@0: } michael@0: michael@0: nsRefPtr& michael@0: GetGroupInfoForPersistenceType(PersistenceType aPersistenceType); michael@0: michael@0: nsRefPtr mPersistentStorageGroupInfo; michael@0: nsRefPtr mTemporaryStorageGroupInfo; michael@0: }; michael@0: michael@0: END_QUOTA_NAMESPACE michael@0: michael@0: #endif // mozilla_dom_quota_quotaobject_h__