1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
5 * You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #include "IDBFileHandle.h"
9 #include "mozilla/dom/file/File.h"
10 #include "mozilla/dom/quota/FileStreams.h"
11 #include "nsDOMClassInfoID.h"
13 #include "IDBDatabase.h"
15 USING_INDEXEDDB_NAMESPACE
21 already_AddRefed
<nsIFile
>
22 GetFileFor(FileInfo
* aFileInfo
)
25 FileManager
* fileManager
= aFileInfo
->Manager();
26 nsCOMPtr
<nsIFile
> directory
= fileManager
->GetDirectory();
27 NS_ENSURE_TRUE(directory
, nullptr);
29 nsCOMPtr
<nsIFile
> file
= fileManager
->GetFileForId(directory
,
31 NS_ENSURE_TRUE(file
, nullptr);
36 } // anonymous namespace
39 already_AddRefed
<IDBFileHandle
>
40 IDBFileHandle::Create(IDBDatabase
* aDatabase
,
41 const nsAString
& aName
,
42 const nsAString
& aType
,
43 already_AddRefed
<FileInfo
> aFileInfo
)
45 NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
47 nsRefPtr
<FileInfo
> fileInfo(aFileInfo
);
48 NS_ASSERTION(fileInfo
, "Null pointer!");
50 nsRefPtr
<IDBFileHandle
> newFile
= new IDBFileHandle();
52 newFile
->BindToOwner(aDatabase
);
54 newFile
->mFileStorage
= aDatabase
;
55 newFile
->mName
= aName
;
56 newFile
->mType
= aType
;
58 newFile
->mFile
= GetFileFor(fileInfo
);
59 NS_ENSURE_TRUE(newFile
->mFile
, nullptr);
60 newFile
->mFileName
.AppendInt(fileInfo
->Id());
62 fileInfo
.swap(newFile
->mFileInfo
);
64 return newFile
.forget();
67 already_AddRefed
<nsISupports
>
68 IDBFileHandle::CreateStream(nsIFile
* aFile
, bool aReadOnly
)
70 nsCOMPtr
<nsIOfflineStorage
> storage
= do_QueryInterface(mFileStorage
);
71 NS_ASSERTION(storage
, "This should always succeed!");
73 const nsACString
& origin
= storage
->Origin();
75 nsCOMPtr
<nsISupports
> result
;
78 nsRefPtr
<FileInputStream
> stream
= FileInputStream::Create(
79 origin
, aFile
, -1, -1, nsIFileInputStream::DEFER_OPEN
);
80 result
= NS_ISUPPORTS_CAST(nsIFileInputStream
*, stream
);
83 nsRefPtr
<FileStream
> stream
= FileStream::Create(
84 origin
, aFile
, -1, -1, nsIFileStream::DEFER_OPEN
);
85 result
= NS_ISUPPORTS_CAST(nsIFileStream
*, stream
);
87 NS_ENSURE_TRUE(result
, nullptr);
89 return result
.forget();
92 already_AddRefed
<nsIDOMFile
>
93 IDBFileHandle::CreateFileObject(mozilla::dom::file::LockedFile
* aLockedFile
,
96 nsCOMPtr
<nsIDOMFile
> file
= new mozilla::dom::file::File(
97 mName
, mType
, aFileSize
, mFile
, aLockedFile
, mFileInfo
);
102 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(IDBFileHandle
)
103 NS_INTERFACE_MAP_ENTRY(nsIIDBFileHandle
)
104 NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(IDBFileHandle
)
105 NS_INTERFACE_MAP_END_INHERITING(FileHandle
)
107 NS_IMPL_ADDREF_INHERITED(IDBFileHandle
, FileHandle
)
108 NS_IMPL_RELEASE_INHERITED(IDBFileHandle
, FileHandle
)
110 DOMCI_DATA(IDBFileHandle
, IDBFileHandle
)
113 IDBFileHandle::GetDatabase(nsIIDBDatabase
** aDatabase
)
115 NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
117 nsCOMPtr
<nsIIDBDatabase
> database
= do_QueryInterface(mFileStorage
);
118 NS_ASSERTION(database
, "This should always succeed!");
120 database
.forget(aDatabase
);