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 michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #ifndef mozilla_dom_indexeddb_fileinfo_h__ michael@0: #define mozilla_dom_indexeddb_fileinfo_h__ michael@0: michael@0: #include "IndexedDatabase.h" michael@0: michael@0: #include "FileManager.h" michael@0: #include "IndexedDatabaseManager.h" michael@0: michael@0: BEGIN_INDEXEDDB_NAMESPACE michael@0: michael@0: class FileInfo michael@0: { michael@0: friend class FileManager; michael@0: michael@0: public: michael@0: FileInfo(FileManager* aFileManager) michael@0: : mFileManager(aFileManager) michael@0: { } michael@0: michael@0: virtual ~FileInfo() michael@0: { } michael@0: michael@0: static michael@0: FileInfo* Create(FileManager* aFileManager, int64_t aId); michael@0: michael@0: void AddRef() michael@0: { michael@0: if (IndexedDatabaseManager::IsClosed()) { michael@0: ++mRefCnt; michael@0: } michael@0: else { michael@0: UpdateReferences(mRefCnt, 1); michael@0: } michael@0: } michael@0: michael@0: void Release() michael@0: { michael@0: if (IndexedDatabaseManager::IsClosed()) { michael@0: nsrefcnt count = --mRefCnt; michael@0: if (count == 0) { michael@0: mRefCnt = 1; michael@0: delete this; michael@0: } michael@0: } michael@0: else { michael@0: UpdateReferences(mRefCnt, -1); michael@0: } michael@0: } michael@0: michael@0: void UpdateDBRefs(int32_t aDelta) michael@0: { michael@0: UpdateReferences(mDBRefCnt, aDelta); michael@0: } michael@0: michael@0: void ClearDBRefs() michael@0: { michael@0: UpdateReferences(mDBRefCnt, 0, true); michael@0: } michael@0: michael@0: void UpdateSliceRefs(int32_t aDelta) michael@0: { michael@0: UpdateReferences(mSliceRefCnt, aDelta); michael@0: } michael@0: michael@0: void GetReferences(int32_t* aRefCnt, int32_t* aDBRefCnt, michael@0: int32_t* aSliceRefCnt); michael@0: michael@0: FileManager* Manager() const michael@0: { michael@0: return mFileManager; michael@0: } michael@0: michael@0: virtual int64_t Id() const = 0; michael@0: michael@0: private: michael@0: void UpdateReferences(ThreadSafeAutoRefCnt& aRefCount, int32_t aDelta, michael@0: bool aClear = false); michael@0: void Cleanup(); michael@0: michael@0: ThreadSafeAutoRefCnt mRefCnt; michael@0: ThreadSafeAutoRefCnt mDBRefCnt; michael@0: ThreadSafeAutoRefCnt mSliceRefCnt; michael@0: michael@0: nsRefPtr mFileManager; michael@0: }; michael@0: michael@0: #define FILEINFO_SUBCLASS(_bits) \ michael@0: class FileInfo##_bits : public FileInfo \ michael@0: { \ michael@0: public: \ michael@0: FileInfo##_bits(FileManager* aFileManager, int##_bits##_t aId) \ michael@0: : FileInfo(aFileManager), mId(aId) \ michael@0: { } \ michael@0: \ michael@0: virtual int64_t Id() const \ michael@0: { \ michael@0: return mId; \ michael@0: } \ michael@0: \ michael@0: private: \ michael@0: int##_bits##_t mId; \ michael@0: }; michael@0: michael@0: FILEINFO_SUBCLASS(16) michael@0: FILEINFO_SUBCLASS(32) michael@0: FILEINFO_SUBCLASS(64) michael@0: michael@0: #undef FILEINFO_SUBCLASS michael@0: michael@0: END_INDEXEDDB_NAMESPACE michael@0: michael@0: #endif // mozilla_dom_indexeddb_fileinfo_h__