dom/file/FileHandle.cpp

branch
TOR_BUG_9701
changeset 10
ac0c01689b40
equal deleted inserted replaced
-1:000000000000 0:c4ecf1cf33c2
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/. */
6
7 #include "FileHandle.h"
8
9 #include "nsContentUtils.h"
10 #include "nsDOMClassInfoID.h"
11 #include "nsNetUtil.h"
12
13 #include "nsIDOMFile.h"
14 #include "nsIFileStorage.h"
15
16 #include "File.h"
17 #include "FileRequest.h"
18 #include "FileService.h"
19 #include "LockedFile.h"
20 #include "MetadataHelper.h"
21 #include "mozilla/dom/FileHandleBinding.h"
22
23 using namespace mozilla;
24 using namespace mozilla::dom;
25 USING_FILE_NAMESPACE
26
27 namespace {
28
29 class GetFileHelper : public MetadataHelper
30 {
31 public:
32 GetFileHelper(LockedFile* aLockedFile,
33 FileRequest* aFileRequest,
34 MetadataParameters* aParams,
35 FileHandle* aFileHandle)
36 : MetadataHelper(aLockedFile, aFileRequest, aParams),
37 mFileHandle(aFileHandle)
38 { }
39
40 virtual nsresult
41 GetSuccessResult(JSContext* aCx,
42 JS::MutableHandle<JS::Value> aVal) MOZ_OVERRIDE;
43
44 virtual void
45 ReleaseObjects() MOZ_OVERRIDE
46 {
47 mFileHandle = nullptr;
48
49 MetadataHelper::ReleaseObjects();
50 }
51
52 private:
53 nsRefPtr<FileHandle> mFileHandle;
54 };
55
56 } // anonymous namespace
57
58 NS_IMPL_CYCLE_COLLECTION_INHERITED(FileHandle, DOMEventTargetHelper,
59 mFileStorage)
60
61 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(FileHandle)
62 NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
63
64 NS_IMPL_ADDREF_INHERITED(FileHandle, DOMEventTargetHelper)
65 NS_IMPL_RELEASE_INHERITED(FileHandle, DOMEventTargetHelper)
66
67 // static
68 already_AddRefed<FileHandle>
69 FileHandle::Create(nsPIDOMWindow* aWindow,
70 nsIFileStorage* aFileStorage,
71 nsIFile* aFile)
72 {
73 MOZ_ASSERT(NS_IsMainThread(), "Wrong thread!");
74
75 nsRefPtr<FileHandle> newFileHandle = new FileHandle(aWindow);
76
77 newFileHandle->mFileStorage = aFileStorage;
78 nsresult rv = aFile->GetLeafName(newFileHandle->mName);
79 if (NS_WARN_IF(NS_FAILED(rv))) {
80 return nullptr;
81 }
82
83 newFileHandle->mFile = aFile;
84 newFileHandle->mFileName = newFileHandle->mName;
85
86 return newFileHandle.forget();
87 }
88
89 // virtual
90 already_AddRefed<nsISupports>
91 FileHandle::CreateStream(nsIFile* aFile, bool aReadOnly)
92 {
93 nsresult rv;
94
95 if (aReadOnly) {
96 nsCOMPtr<nsIInputStream> stream;
97 rv = NS_NewLocalFileInputStream(getter_AddRefs(stream), aFile, -1, -1,
98 nsIFileInputStream::DEFER_OPEN);
99 if (NS_WARN_IF(NS_FAILED(rv))) {
100 return nullptr;
101 }
102 return stream.forget();
103 }
104
105 nsCOMPtr<nsIFileStream> stream;
106 rv = NS_NewLocalFileStream(getter_AddRefs(stream), aFile, -1, -1,
107 nsIFileStream::DEFER_OPEN);
108 if (NS_WARN_IF(NS_FAILED(rv))) {
109 return nullptr;
110 }
111 return stream.forget();
112 }
113
114 // virtual
115 already_AddRefed<nsIDOMFile>
116 FileHandle::CreateFileObject(LockedFile* aLockedFile, uint32_t aFileSize)
117 {
118 nsCOMPtr<nsIDOMFile> file =
119 new File(mName, mType, aFileSize, mFile, aLockedFile);
120
121 return file.forget();
122 }
123
124 // virtual
125 JSObject*
126 FileHandle::WrapObject(JSContext* aCx)
127 {
128 return FileHandleBinding::Wrap(aCx, this);
129 }
130
131 already_AddRefed<LockedFile>
132 FileHandle::Open(FileMode aMode, ErrorResult& aError)
133 {
134 MOZ_ASSERT(NS_IsMainThread());
135
136 if (FileService::IsShuttingDown() || mFileStorage->IsShuttingDown()) {
137 aError.Throw(NS_ERROR_DOM_FILEHANDLE_UNKNOWN_ERR);
138 return nullptr;
139 }
140
141 nsRefPtr<LockedFile> lockedFile = LockedFile::Create(this, aMode);
142 if (!lockedFile) {
143 aError.Throw(NS_ERROR_DOM_FILEHANDLE_UNKNOWN_ERR);
144 return nullptr;
145 }
146
147 return lockedFile.forget();
148 }
149
150 already_AddRefed<DOMRequest>
151 FileHandle::GetFile(ErrorResult& aError)
152 {
153 MOZ_ASSERT(NS_IsMainThread());
154
155 // Do nothing if the window is closed
156 if (!GetOwner()) {
157 return nullptr;
158 }
159
160 nsRefPtr<LockedFile> lockedFile =
161 LockedFile::Create(this, FileMode::Readonly, LockedFile::PARALLEL);
162 if (!lockedFile) {
163 aError.Throw(NS_ERROR_DOM_FILEHANDLE_UNKNOWN_ERR);
164 return nullptr;
165 }
166
167 nsRefPtr<FileRequest> request =
168 FileRequest::Create(GetOwner(), lockedFile, /* aWrapAsDOMRequest */ true);
169
170 nsRefPtr<MetadataParameters> params = new MetadataParameters(true, false);
171
172 nsRefPtr<GetFileHelper> helper =
173 new GetFileHelper(lockedFile, request, params, this);
174
175 nsresult rv = helper->Enqueue();
176 if (NS_FAILED(rv)) {
177 aError.Throw(NS_ERROR_DOM_FILEHANDLE_UNKNOWN_ERR);
178 return nullptr;
179 }
180
181 return request.forget();
182 }
183
184 nsresult
185 GetFileHelper::GetSuccessResult(JSContext* aCx,
186 JS::MutableHandle<JS::Value> aVal)
187 {
188 nsCOMPtr<nsIDOMFile> domFile =
189 mFileHandle->CreateFileObject(mLockedFile, mParams->Size());
190
191 nsresult rv =
192 nsContentUtils::WrapNative(aCx, domFile, &NS_GET_IID(nsIDOMFile), aVal);
193 NS_ENSURE_SUCCESS(rv, NS_ERROR_DOM_FILEHANDLE_UNKNOWN_ERR);
194 return NS_OK;
195 }

mercurial