/src/mozilla-central/xpcom/io/FileDescriptorFile.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
2 | | /* vim: set ts=8 sts=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 |
5 | | * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
6 | | |
7 | | #include "FileDescriptorFile.h" |
8 | | |
9 | | #include "mozilla/ipc/FileDescriptorUtils.h" |
10 | | #include "mozilla/ipc/URIUtils.h" |
11 | | #include "mozilla/net/NeckoChild.h" |
12 | | #include "nsIFileURL.h" |
13 | | #include "nsNetUtil.h" |
14 | | #include "nsProxyRelease.h" |
15 | | #include "nsThreadUtils.h" |
16 | | #include "private/pprio.h" |
17 | | #include "SerializedLoadContext.h" |
18 | | |
19 | | namespace mozilla { |
20 | | namespace net { |
21 | | |
22 | | NS_IMPL_ISUPPORTS(FileDescriptorFile, nsIFile) |
23 | | |
24 | | LazyLogModule gFDFileLog("FDFile"); |
25 | | #undef DBG |
26 | 0 | #define DBG(...) MOZ_LOG(gFDFileLog, LogLevel::Debug, (__VA_ARGS__)) |
27 | | |
28 | | FileDescriptorFile::FileDescriptorFile(const FileDescriptor& aFD, |
29 | | nsIFile* aFile) |
30 | 0 | { |
31 | 0 | MOZ_ASSERT(aFD.IsValid()); |
32 | 0 | auto platformHandle = aFD.ClonePlatformHandle(); |
33 | 0 | mFD = FileDescriptor(platformHandle.get()); |
34 | 0 | mFile = aFile; |
35 | 0 | } |
36 | | |
37 | | FileDescriptorFile::FileDescriptorFile(const FileDescriptorFile& aOther) |
38 | 0 | { |
39 | 0 | auto platformHandle = aOther.mFD.ClonePlatformHandle(); |
40 | 0 | mFD = FileDescriptor(platformHandle.get()); |
41 | 0 | aOther.mFile->Clone(getter_AddRefs(mFile)); |
42 | 0 | } |
43 | | |
44 | | //----------------------------------------------------------------------------- |
45 | | // FileDescriptorFile::nsIFile functions that we override logic for |
46 | | //----------------------------------------------------------------------------- |
47 | | |
48 | | NS_IMETHODIMP |
49 | | FileDescriptorFile::Clone(nsIFile** aFileOut) |
50 | 0 | { |
51 | 0 | RefPtr<FileDescriptorFile> fdFile = new FileDescriptorFile(*this); |
52 | 0 | fdFile.forget(aFileOut); |
53 | 0 | return NS_OK; |
54 | 0 | } |
55 | | |
56 | | NS_IMETHODIMP |
57 | | FileDescriptorFile::OpenNSPRFileDesc(int32_t aFlags, int32_t aMode, |
58 | | PRFileDesc** aRetval) |
59 | 0 | { |
60 | 0 | // Remove optional OS_READAHEAD flag so we test against PR_RDONLY |
61 | 0 | aFlags &= ~nsIFile::OS_READAHEAD; |
62 | 0 |
|
63 | 0 | // Remove optional/deprecated DELETE_ON_CLOSE flag |
64 | 0 | aFlags &= ~nsIFile::DELETE_ON_CLOSE; |
65 | 0 |
|
66 | 0 | // All other flags require write access to the file and |
67 | 0 | // this implementation only provides read access. |
68 | 0 | if (aFlags != PR_RDONLY) { |
69 | 0 | DBG("OpenNSPRFileDesc flags error (%" PRIu32 ")\n", aFlags); |
70 | 0 | return NS_ERROR_NOT_AVAILABLE; |
71 | 0 | } |
72 | 0 |
|
73 | 0 | if (!mFD.IsValid()) { |
74 | 0 | DBG("OpenNSPRFileDesc error: no file descriptor\n"); |
75 | 0 | return NS_ERROR_NOT_AVAILABLE; |
76 | 0 | } |
77 | 0 |
|
78 | 0 | auto platformHandle = mFD.ClonePlatformHandle(); |
79 | 0 | *aRetval = PR_ImportFile(PROsfd(platformHandle.release())); |
80 | 0 |
|
81 | 0 | if (!*aRetval) { |
82 | 0 | DBG("OpenNSPRFileDesc Clone failure\n"); |
83 | 0 | return NS_ERROR_NOT_AVAILABLE; |
84 | 0 | } |
85 | 0 |
|
86 | 0 | return NS_OK; |
87 | 0 | } |
88 | | |
89 | | //----------------------------------------------------------------------------- |
90 | | // FileDescriptorFile::nsIFile functions that we delegate to underlying nsIFile |
91 | | //----------------------------------------------------------------------------- |
92 | | |
93 | | nsresult |
94 | | FileDescriptorFile::GetLeafName(nsAString& aLeafName) |
95 | 0 | { |
96 | 0 | return mFile->GetLeafName(aLeafName); |
97 | 0 | } |
98 | | |
99 | | NS_IMETHODIMP |
100 | | FileDescriptorFile::GetNativeLeafName(nsACString& aLeafName) |
101 | 0 | { |
102 | 0 | return mFile->GetNativeLeafName(aLeafName); |
103 | 0 | } |
104 | | |
105 | | nsresult |
106 | | FileDescriptorFile::GetTarget(nsAString& aRetVal) |
107 | 0 | { |
108 | 0 | return mFile->GetTarget(aRetVal); |
109 | 0 | } |
110 | | |
111 | | NS_IMETHODIMP |
112 | | FileDescriptorFile::GetNativeTarget(nsACString& aRetVal) |
113 | 0 | { |
114 | 0 | return mFile->GetNativeTarget(aRetVal); |
115 | 0 | } |
116 | | |
117 | | nsresult |
118 | | FileDescriptorFile::GetPath(nsAString& aRetVal) |
119 | 0 | { |
120 | 0 | return mFile->GetPath(aRetVal); |
121 | 0 | } |
122 | | |
123 | | PathString |
124 | | FileDescriptorFile::NativePath() |
125 | 0 | { |
126 | 0 | return mFile->NativePath(); |
127 | 0 | } |
128 | | |
129 | | NS_IMETHODIMP |
130 | | FileDescriptorFile::Equals(nsIFile* aOther, bool* aRetVal) |
131 | 0 | { |
132 | 0 | return mFile->Equals(aOther, aRetVal); |
133 | 0 | } |
134 | | |
135 | | NS_IMETHODIMP |
136 | | FileDescriptorFile::Contains(nsIFile* aOther, bool* aRetVal) |
137 | 0 | { |
138 | 0 | return mFile->Contains(aOther, aRetVal); |
139 | 0 | } |
140 | | |
141 | | NS_IMETHODIMP |
142 | | FileDescriptorFile::GetParent(nsIFile** aParent) |
143 | 0 | { |
144 | 0 | return mFile->GetParent(aParent); |
145 | 0 | } |
146 | | |
147 | | NS_IMETHODIMP |
148 | | FileDescriptorFile::GetFollowLinks(bool* aFollowLinks) |
149 | 0 | { |
150 | 0 | return mFile->GetFollowLinks(aFollowLinks); |
151 | 0 | } |
152 | | |
153 | | NS_IMETHODIMP |
154 | | FileDescriptorFile::GetPersistentDescriptor(nsACString& aPersistentDescriptor) |
155 | 0 | { |
156 | 0 | return mFile->GetPersistentDescriptor(aPersistentDescriptor); |
157 | 0 | } |
158 | | |
159 | | //----------------------------------------------------------------------------- |
160 | | // FileDescriptorFile::nsIFile functions that are not currently supported |
161 | | //----------------------------------------------------------------------------- |
162 | | |
163 | | nsresult |
164 | | FileDescriptorFile::Append(const nsAString& aNode) |
165 | 0 | { |
166 | 0 | return NS_ERROR_NOT_IMPLEMENTED; |
167 | 0 | } |
168 | | |
169 | | NS_IMETHODIMP |
170 | | FileDescriptorFile::AppendNative(const nsACString& aFragment) |
171 | 0 | { |
172 | 0 | return NS_ERROR_NOT_IMPLEMENTED; |
173 | 0 | } |
174 | | |
175 | | NS_IMETHODIMP |
176 | | FileDescriptorFile::Normalize() |
177 | 0 | { |
178 | 0 | return NS_ERROR_NOT_IMPLEMENTED; |
179 | 0 | } |
180 | | |
181 | | NS_IMETHODIMP |
182 | | FileDescriptorFile::Create(uint32_t aType, uint32_t aPermissions) |
183 | 0 | { |
184 | 0 | return NS_ERROR_NOT_IMPLEMENTED; |
185 | 0 | } |
186 | | |
187 | | nsresult |
188 | | FileDescriptorFile::SetLeafName(const nsAString& aLeafName) |
189 | 0 | { |
190 | 0 | return NS_ERROR_NOT_IMPLEMENTED; |
191 | 0 | } |
192 | | |
193 | | NS_IMETHODIMP |
194 | | FileDescriptorFile::SetNativeLeafName(const nsACString& aLeafName) |
195 | 0 | { |
196 | 0 | return NS_ERROR_NOT_IMPLEMENTED; |
197 | 0 | } |
198 | | |
199 | | nsresult |
200 | | FileDescriptorFile::InitWithPath(const nsAString& aPath) |
201 | 0 | { |
202 | 0 | return NS_ERROR_NOT_IMPLEMENTED; |
203 | 0 | } |
204 | | |
205 | | NS_IMETHODIMP |
206 | | FileDescriptorFile::InitWithNativePath(const nsACString& aPath) |
207 | 0 | { |
208 | 0 | return NS_ERROR_NOT_IMPLEMENTED; |
209 | 0 | } |
210 | | |
211 | | NS_IMETHODIMP |
212 | | FileDescriptorFile::InitWithFile(nsIFile* aFile) |
213 | 0 | { |
214 | 0 | return NS_ERROR_NOT_IMPLEMENTED; |
215 | 0 | } |
216 | | |
217 | | NS_IMETHODIMP |
218 | | FileDescriptorFile::SetFollowLinks(bool aFollowLinks) |
219 | 0 | { |
220 | 0 | return NS_ERROR_NOT_IMPLEMENTED; |
221 | 0 | } |
222 | | |
223 | | nsresult |
224 | | FileDescriptorFile::AppendRelativePath(const nsAString& aNode) |
225 | 0 | { |
226 | 0 | return NS_ERROR_NOT_IMPLEMENTED; |
227 | 0 | } |
228 | | |
229 | | NS_IMETHODIMP |
230 | | FileDescriptorFile::AppendRelativeNativePath(const nsACString& aFragment) |
231 | 0 | { |
232 | 0 | return NS_ERROR_NOT_IMPLEMENTED; |
233 | 0 | } |
234 | | |
235 | | NS_IMETHODIMP |
236 | | FileDescriptorFile::SetPersistentDescriptor(const nsACString& aPersistentDescriptor) |
237 | 0 | { |
238 | 0 | return NS_ERROR_NOT_IMPLEMENTED; |
239 | 0 | } |
240 | | |
241 | | NS_IMETHODIMP |
242 | | FileDescriptorFile::GetRelativeDescriptor(nsIFile* aFromFile, |
243 | | nsACString& aRetVal) |
244 | 0 | { |
245 | 0 | return NS_ERROR_NOT_IMPLEMENTED; |
246 | 0 | } |
247 | | |
248 | | NS_IMETHODIMP |
249 | | FileDescriptorFile::SetRelativeDescriptor(nsIFile* aFromFile, |
250 | | const nsACString& aRelativeDesc) |
251 | 0 | { |
252 | 0 | return NS_ERROR_NOT_IMPLEMENTED; |
253 | 0 | } |
254 | | |
255 | | NS_IMETHODIMP |
256 | | FileDescriptorFile::GetRelativePath(nsIFile* aFromFile, nsACString& aRetVal) |
257 | 0 | { |
258 | 0 | return NS_ERROR_NOT_IMPLEMENTED; |
259 | 0 | } |
260 | | |
261 | | NS_IMETHODIMP |
262 | | FileDescriptorFile::SetRelativePath(nsIFile* aFromFile, |
263 | | const nsACString& aRelativePath) |
264 | 0 | { |
265 | 0 | return NS_ERROR_NOT_IMPLEMENTED; |
266 | 0 | } |
267 | | |
268 | | nsresult |
269 | | FileDescriptorFile::CopyTo(nsIFile* aNewParentDir, const nsAString& aNewName) |
270 | 0 | { |
271 | 0 | return NS_ERROR_NOT_IMPLEMENTED; |
272 | 0 | } |
273 | | |
274 | | NS_IMETHODIMP |
275 | | FileDescriptorFile::CopyToNative(nsIFile* aNewParent, |
276 | | const nsACString& aNewName) |
277 | 0 | { |
278 | 0 | return NS_ERROR_NOT_IMPLEMENTED; |
279 | 0 | } |
280 | | |
281 | | nsresult |
282 | | FileDescriptorFile::CopyToFollowingLinks(nsIFile* aNewParentDir, |
283 | | const nsAString& aNewName) |
284 | 0 | { |
285 | 0 | return NS_ERROR_NOT_IMPLEMENTED; |
286 | 0 | } |
287 | | |
288 | | NS_IMETHODIMP |
289 | | FileDescriptorFile::CopyToFollowingLinksNative(nsIFile* aNewParent, |
290 | | const nsACString& aNewName) |
291 | 0 | { |
292 | 0 | return NS_ERROR_NOT_IMPLEMENTED; |
293 | 0 | } |
294 | | |
295 | | nsresult |
296 | | FileDescriptorFile::MoveTo(nsIFile* aNewParentDir, const nsAString& aNewName) |
297 | 0 | { |
298 | 0 | return NS_ERROR_NOT_IMPLEMENTED; |
299 | 0 | } |
300 | | |
301 | | NS_IMETHODIMP |
302 | | FileDescriptorFile::MoveToNative(nsIFile* aNewParent, |
303 | | const nsACString& aNewName) |
304 | 0 | { |
305 | 0 | return NS_ERROR_NOT_IMPLEMENTED; |
306 | 0 | } |
307 | | |
308 | | NS_IMETHODIMP |
309 | | FileDescriptorFile::RenameTo(nsIFile* aNewParentDir, const nsAString& aNewName) |
310 | 0 | { |
311 | 0 | return NS_ERROR_NOT_IMPLEMENTED; |
312 | 0 | } |
313 | | |
314 | | NS_IMETHODIMP |
315 | | FileDescriptorFile::RenameToNative(nsIFile* aNewParentDir, |
316 | | const nsACString& aNewName) |
317 | 0 | { |
318 | 0 | return NS_ERROR_NOT_IMPLEMENTED; |
319 | 0 | } |
320 | | |
321 | | NS_IMETHODIMP |
322 | | FileDescriptorFile::Remove(bool aRecursive) |
323 | 0 | { |
324 | 0 | return NS_ERROR_NOT_IMPLEMENTED; |
325 | 0 | } |
326 | | |
327 | | NS_IMETHODIMP |
328 | | FileDescriptorFile::GetPermissions(uint32_t* aPermissions) |
329 | 0 | { |
330 | 0 | return NS_ERROR_NOT_IMPLEMENTED; |
331 | 0 | } |
332 | | |
333 | | NS_IMETHODIMP |
334 | | FileDescriptorFile::SetPermissions(uint32_t aPermissions) |
335 | 0 | { |
336 | 0 | return NS_ERROR_NOT_IMPLEMENTED; |
337 | 0 | } |
338 | | |
339 | | NS_IMETHODIMP |
340 | | FileDescriptorFile::GetPermissionsOfLink(uint32_t* aPermissionsOfLink) |
341 | 0 | { |
342 | 0 | return NS_ERROR_NOT_IMPLEMENTED; |
343 | 0 | } |
344 | | |
345 | | NS_IMETHODIMP |
346 | | FileDescriptorFile::SetPermissionsOfLink(uint32_t aPermissions) |
347 | 0 | { |
348 | 0 | return NS_ERROR_NOT_IMPLEMENTED; |
349 | 0 | } |
350 | | |
351 | | NS_IMETHODIMP |
352 | | FileDescriptorFile::GetLastModifiedTime(PRTime* aLastModTime) |
353 | 0 | { |
354 | 0 | return NS_ERROR_NOT_IMPLEMENTED; |
355 | 0 | } |
356 | | |
357 | | NS_IMETHODIMP |
358 | | FileDescriptorFile::SetLastModifiedTime(PRTime aLastModTime) |
359 | 0 | { |
360 | 0 | return NS_ERROR_NOT_IMPLEMENTED; |
361 | 0 | } |
362 | | |
363 | | NS_IMETHODIMP |
364 | | FileDescriptorFile::GetLastModifiedTimeOfLink(PRTime* aLastModTimeOfLink) |
365 | 0 | { |
366 | 0 | return NS_ERROR_NOT_IMPLEMENTED; |
367 | 0 | } |
368 | | |
369 | | NS_IMETHODIMP |
370 | | FileDescriptorFile::SetLastModifiedTimeOfLink(PRTime aLastModTimeOfLink) |
371 | 0 | { |
372 | 0 | return NS_ERROR_NOT_IMPLEMENTED; |
373 | 0 | } |
374 | | |
375 | | NS_IMETHODIMP |
376 | | FileDescriptorFile::GetFileSize(int64_t* aFileSize) |
377 | 0 | { |
378 | 0 | return NS_ERROR_NOT_IMPLEMENTED; |
379 | 0 | } |
380 | | |
381 | | NS_IMETHODIMP |
382 | | FileDescriptorFile::SetFileSize(int64_t aFileSize) |
383 | 0 | { |
384 | 0 | return NS_ERROR_NOT_IMPLEMENTED; |
385 | 0 | } |
386 | | |
387 | | NS_IMETHODIMP |
388 | | FileDescriptorFile::GetFileSizeOfLink(int64_t* aFileSize) |
389 | 0 | { |
390 | 0 | return NS_ERROR_NOT_IMPLEMENTED; |
391 | 0 | } |
392 | | |
393 | | NS_IMETHODIMP |
394 | | FileDescriptorFile::Exists(bool* aRetVal) |
395 | 0 | { |
396 | 0 | return NS_ERROR_NOT_IMPLEMENTED; |
397 | 0 | } |
398 | | |
399 | | NS_IMETHODIMP |
400 | | FileDescriptorFile::IsWritable(bool* aRetVal) |
401 | 0 | { |
402 | 0 | return NS_ERROR_NOT_IMPLEMENTED; |
403 | 0 | } |
404 | | |
405 | | NS_IMETHODIMP |
406 | | FileDescriptorFile::IsReadable(bool* aRetVal) |
407 | 0 | { |
408 | 0 | return NS_ERROR_NOT_IMPLEMENTED; |
409 | 0 | } |
410 | | |
411 | | NS_IMETHODIMP |
412 | | FileDescriptorFile::IsExecutable(bool* aRetVal) |
413 | 0 | { |
414 | 0 | return NS_ERROR_NOT_IMPLEMENTED; |
415 | 0 | } |
416 | | |
417 | | NS_IMETHODIMP |
418 | | FileDescriptorFile::IsHidden(bool* aRetVal) |
419 | 0 | { |
420 | 0 | return NS_ERROR_NOT_IMPLEMENTED; |
421 | 0 | } |
422 | | |
423 | | NS_IMETHODIMP |
424 | | FileDescriptorFile::IsDirectory(bool* aRetVal) |
425 | 0 | { |
426 | 0 | return NS_ERROR_NOT_IMPLEMENTED; |
427 | 0 | } |
428 | | |
429 | | NS_IMETHODIMP |
430 | | FileDescriptorFile::IsFile(bool* aRetVal) |
431 | 0 | { |
432 | 0 | return NS_ERROR_NOT_IMPLEMENTED; |
433 | 0 | } |
434 | | |
435 | | NS_IMETHODIMP |
436 | | FileDescriptorFile::IsSymlink(bool* aRetVal) |
437 | 0 | { |
438 | 0 | return NS_ERROR_NOT_IMPLEMENTED; |
439 | 0 | } |
440 | | |
441 | | NS_IMETHODIMP |
442 | | FileDescriptorFile::IsSpecial(bool* aRetVal) |
443 | 0 | { |
444 | 0 | return NS_ERROR_NOT_IMPLEMENTED; |
445 | 0 | } |
446 | | |
447 | | NS_IMETHODIMP |
448 | | FileDescriptorFile::CreateUnique(uint32_t aType, uint32_t aAttributes) |
449 | 0 | { |
450 | 0 | return NS_ERROR_NOT_IMPLEMENTED; |
451 | 0 | } |
452 | | |
453 | | NS_IMETHODIMP |
454 | | FileDescriptorFile::GetDirectoryEntriesImpl(nsIDirectoryEnumerator** aEntries) |
455 | 0 | { |
456 | 0 | return NS_ERROR_NOT_IMPLEMENTED; |
457 | 0 | } |
458 | | |
459 | | NS_IMETHODIMP |
460 | | FileDescriptorFile::OpenANSIFileDesc(const char* aMode, FILE** aRetVal) |
461 | 0 | { |
462 | 0 | return NS_ERROR_NOT_IMPLEMENTED; |
463 | 0 | } |
464 | | |
465 | | NS_IMETHODIMP |
466 | | FileDescriptorFile::Load(PRLibrary** aRetVal) |
467 | 0 | { |
468 | 0 | return NS_ERROR_NOT_IMPLEMENTED; |
469 | 0 | } |
470 | | |
471 | | NS_IMETHODIMP |
472 | | FileDescriptorFile::GetDiskSpaceAvailable(int64_t* aDiskSpaceAvailable) |
473 | 0 | { |
474 | 0 | return NS_ERROR_NOT_IMPLEMENTED; |
475 | 0 | } |
476 | | |
477 | | NS_IMETHODIMP |
478 | | FileDescriptorFile::Reveal() |
479 | 0 | { |
480 | 0 | return NS_ERROR_NOT_IMPLEMENTED; |
481 | 0 | } |
482 | | |
483 | | NS_IMETHODIMP |
484 | | FileDescriptorFile::Launch() |
485 | 0 | { |
486 | 0 | return NS_ERROR_NOT_IMPLEMENTED; |
487 | 0 | } |
488 | | |
489 | | } // namespace net |
490 | | } // namespace mozilla |