summaryrefslogtreecommitdiffstats
path: root/dom/indexedDB/FileManager.h
blob: da917f431b7cbf2d6410dbfd0517aae7aa2f5270 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
/* -*- 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_indexeddb_filemanager_h__
#define mozilla_dom_indexeddb_filemanager_h__

#include "mozilla/Attributes.h"
#include "mozilla/dom/quota/PersistenceType.h"
#include "nsDataHashtable.h"
#include "nsHashKeys.h"
#include "nsISupportsImpl.h"

class nsIFile;
class mozIStorageConnection;

namespace mozilla {
namespace dom {
namespace indexedDB {

class FileInfo;

// Implemented in ActorsParent.cpp.
class FileManager final
{
  friend class FileInfo;

  typedef mozilla::dom::quota::PersistenceType PersistenceType;

  PersistenceType mPersistenceType;
  nsCString mGroup;
  nsCString mOrigin;
  nsString mDatabaseName;

  nsString mDirectoryPath;
  nsString mJournalDirectoryPath;

  int64_t mLastFileId;

  // Protected by IndexedDatabaseManager::FileMutex()
  nsDataHashtable<nsUint64HashKey, FileInfo*> mFileInfos;

  const bool mIsApp;
  const bool mEnforcingQuota;
  bool mInvalidated;

public:
  static already_AddRefed<nsIFile>
  GetFileForId(nsIFile* aDirectory, int64_t aId);

  static already_AddRefed<nsIFile>
  GetCheckedFileForId(nsIFile* aDirectory, int64_t aId);

  static nsresult
  InitDirectory(nsIFile* aDirectory,
                nsIFile* aDatabaseFile,
                PersistenceType aPersistenceType,
                const nsACString& aGroup,
                const nsACString& aOrigin,
                uint32_t aTelemetryId);

  static nsresult
  GetUsage(nsIFile* aDirectory, uint64_t* aUsage);

  FileManager(PersistenceType aPersistenceType,
              const nsACString& aGroup,
              const nsACString& aOrigin,
              bool aIsApp,
              const nsAString& aDatabaseName,
              bool aEnforcingQuota);

  PersistenceType
  Type() const
  {
    return mPersistenceType;
  }

  const nsACString&
  Group() const
  {
    return mGroup;
  }

  const nsACString&
  Origin() const
  {
    return mOrigin;
  }

  bool
  IsApp() const
  {
    return mIsApp;
  }

  const nsAString&
  DatabaseName() const
  {
    return mDatabaseName;
  }

  bool
  EnforcingQuota() const
  {
    return mEnforcingQuota;
  }

  bool
  Invalidated() const
  {
    return mInvalidated;
  }

  nsresult
  Init(nsIFile* aDirectory, mozIStorageConnection* aConnection);

  nsresult
  Invalidate();

  already_AddRefed<nsIFile>
  GetDirectory();

  already_AddRefed<nsIFile>
  GetCheckedDirectory();

  already_AddRefed<nsIFile>
  GetJournalDirectory();

  already_AddRefed<nsIFile>
  EnsureJournalDirectory();

  already_AddRefed<FileInfo>
  GetFileInfo(int64_t aId);

  already_AddRefed<FileInfo>
  GetNewFileInfo();

  NS_INLINE_DECL_THREADSAFE_REFCOUNTING(FileManager)

private:
  ~FileManager();
};

} // namespace indexedDB
} // namespace dom
} // namespace mozilla

#endif // mozilla_dom_indexeddb_filemanager_h__