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