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/. */
7 #include "FileDescriptorFile.h"
9 #include "mozilla/ipc/FileDescriptorUtils.h"
10 #include "mozilla/ipc/URIUtils.h"
11 #include "mozilla/net/NeckoChild.h"
12 #include "nsNetUtil.h"
13 #include "nsProxyRelease.h"
14 #include "nsThreadUtils.h"
15 #include "private/pprio.h"
16 #include "SerializedLoadContext.h"
21 NS_IMPL_ISUPPORTS(FileDescriptorFile
, nsIFile
)
23 LazyLogModule
gFDFileLog("FDFile");
25 #define DBG(...) MOZ_LOG(gFDFileLog, LogLevel::Debug, (__VA_ARGS__))
27 FileDescriptorFile::FileDescriptorFile(const FileDescriptor
& aFD
,
29 MOZ_ASSERT(aFD
.IsValid());
30 auto platformHandle
= aFD
.ClonePlatformHandle();
31 mFD
= FileDescriptor(platformHandle
.get());
35 FileDescriptorFile::FileDescriptorFile(const FileDescriptorFile
& aOther
) {
36 auto platformHandle
= aOther
.mFD
.ClonePlatformHandle();
37 mFD
= FileDescriptor(platformHandle
.get());
38 aOther
.mFile
->Clone(getter_AddRefs(mFile
));
41 //-----------------------------------------------------------------------------
42 // FileDescriptorFile::nsIFile functions that we override logic for
43 //-----------------------------------------------------------------------------
46 FileDescriptorFile::Clone(nsIFile
** aFileOut
) {
47 RefPtr
<FileDescriptorFile
> fdFile
= new FileDescriptorFile(*this);
48 fdFile
.forget(aFileOut
);
53 FileDescriptorFile::OpenNSPRFileDesc(int32_t aFlags
, int32_t aMode
,
54 PRFileDesc
** aRetval
) {
55 // Remove optional OS_READAHEAD flag so we test against PR_RDONLY
56 aFlags
&= ~nsIFile::OS_READAHEAD
;
58 // Remove optional/deprecated DELETE_ON_CLOSE flag
59 aFlags
&= ~nsIFile::DELETE_ON_CLOSE
;
61 // All other flags require write access to the file and
62 // this implementation only provides read access.
63 if (aFlags
!= PR_RDONLY
) {
64 DBG("OpenNSPRFileDesc flags error (%" PRIu32
")\n", aFlags
);
65 return NS_ERROR_NOT_AVAILABLE
;
69 DBG("OpenNSPRFileDesc error: no file descriptor\n");
70 return NS_ERROR_NOT_AVAILABLE
;
73 auto platformHandle
= mFD
.ClonePlatformHandle();
74 *aRetval
= PR_ImportFile(PROsfd(platformHandle
.release()));
77 DBG("OpenNSPRFileDesc Clone failure\n");
78 return NS_ERROR_NOT_AVAILABLE
;
84 //-----------------------------------------------------------------------------
85 // FileDescriptorFile::nsIFile functions that we delegate to underlying nsIFile
86 //-----------------------------------------------------------------------------
88 nsresult
FileDescriptorFile::GetLeafName(nsAString
& aLeafName
) {
89 return mFile
->GetLeafName(aLeafName
);
93 FileDescriptorFile::GetNativeLeafName(nsACString
& aLeafName
) {
94 return mFile
->GetNativeLeafName(aLeafName
);
97 NS_IMETHODIMP
FileDescriptorFile::GetDisplayName(nsAString
& aLeafName
) {
98 return mFile
->GetDisplayName(aLeafName
);
101 nsresult
FileDescriptorFile::GetTarget(nsAString
& aRetVal
) {
102 return mFile
->GetTarget(aRetVal
);
106 FileDescriptorFile::GetNativeTarget(nsACString
& aRetVal
) {
107 return mFile
->GetNativeTarget(aRetVal
);
110 nsresult
FileDescriptorFile::GetPath(nsAString
& aRetVal
) {
111 return mFile
->GetPath(aRetVal
);
114 PathString
FileDescriptorFile::NativePath() { return mFile
->NativePath(); }
117 FileDescriptorFile::Equals(nsIFile
* aOther
, bool* aRetVal
) {
118 return mFile
->Equals(aOther
, aRetVal
);
122 FileDescriptorFile::Contains(nsIFile
* aOther
, bool* aRetVal
) {
123 return mFile
->Contains(aOther
, aRetVal
);
127 FileDescriptorFile::GetParent(nsIFile
** aParent
) {
128 return mFile
->GetParent(aParent
);
132 FileDescriptorFile::GetPersistentDescriptor(nsACString
& aPersistentDescriptor
) {
133 return mFile
->GetPersistentDescriptor(aPersistentDescriptor
);
136 //-----------------------------------------------------------------------------
137 // FileDescriptorFile::nsIFile functions that are not currently supported
138 //-----------------------------------------------------------------------------
140 nsresult
FileDescriptorFile::Append(const nsAString
& aNode
) {
141 return NS_ERROR_NOT_IMPLEMENTED
;
145 FileDescriptorFile::AppendNative(const nsACString
& aFragment
) {
146 return NS_ERROR_NOT_IMPLEMENTED
;
150 FileDescriptorFile::Normalize() { return NS_ERROR_NOT_IMPLEMENTED
; }
153 FileDescriptorFile::Create(uint32_t aType
, uint32_t aPermissions
,
154 bool aSkipAncestors
) {
155 return NS_ERROR_NOT_IMPLEMENTED
;
158 nsresult
FileDescriptorFile::SetLeafName(const nsAString
& aLeafName
) {
159 return NS_ERROR_NOT_IMPLEMENTED
;
163 FileDescriptorFile::SetNativeLeafName(const nsACString
& aLeafName
) {
164 return NS_ERROR_NOT_IMPLEMENTED
;
167 nsresult
FileDescriptorFile::InitWithPath(const nsAString
& aPath
) {
168 return NS_ERROR_NOT_IMPLEMENTED
;
172 FileDescriptorFile::InitWithNativePath(const nsACString
& aPath
) {
173 return NS_ERROR_NOT_IMPLEMENTED
;
177 FileDescriptorFile::InitWithFile(nsIFile
* aFile
) {
178 return NS_ERROR_NOT_IMPLEMENTED
;
181 nsresult
FileDescriptorFile::AppendRelativePath(const nsAString
& aNode
) {
182 return NS_ERROR_NOT_IMPLEMENTED
;
186 FileDescriptorFile::AppendRelativeNativePath(const nsACString
& aFragment
) {
187 return NS_ERROR_NOT_IMPLEMENTED
;
191 FileDescriptorFile::SetPersistentDescriptor(
192 const nsACString
& aPersistentDescriptor
) {
193 return NS_ERROR_NOT_IMPLEMENTED
;
197 FileDescriptorFile::GetRelativeDescriptor(nsIFile
* aFromFile
,
198 nsACString
& aRetVal
) {
199 return NS_ERROR_NOT_IMPLEMENTED
;
203 FileDescriptorFile::SetRelativeDescriptor(nsIFile
* aFromFile
,
204 const nsACString
& aRelativeDesc
) {
205 return NS_ERROR_NOT_IMPLEMENTED
;
209 FileDescriptorFile::GetRelativePath(nsIFile
* aFromFile
, nsACString
& aRetVal
) {
210 return NS_ERROR_NOT_IMPLEMENTED
;
214 FileDescriptorFile::SetRelativePath(nsIFile
* aFromFile
,
215 const nsACString
& aRelativePath
) {
216 return NS_ERROR_NOT_IMPLEMENTED
;
219 nsresult
FileDescriptorFile::CopyTo(nsIFile
* aNewParentDir
,
220 const nsAString
& aNewName
) {
221 return NS_ERROR_NOT_IMPLEMENTED
;
225 FileDescriptorFile::CopyToNative(nsIFile
* aNewParent
,
226 const nsACString
& aNewName
) {
227 return NS_ERROR_NOT_IMPLEMENTED
;
230 nsresult
FileDescriptorFile::CopyToFollowingLinks(nsIFile
* aNewParentDir
,
231 const nsAString
& aNewName
) {
232 return NS_ERROR_NOT_IMPLEMENTED
;
236 FileDescriptorFile::CopyToFollowingLinksNative(nsIFile
* aNewParent
,
237 const nsACString
& aNewName
) {
238 return NS_ERROR_NOT_IMPLEMENTED
;
241 nsresult
FileDescriptorFile::MoveTo(nsIFile
* aNewParentDir
,
242 const nsAString
& aNewName
) {
243 return NS_ERROR_NOT_IMPLEMENTED
;
247 FileDescriptorFile::MoveToNative(nsIFile
* aNewParent
,
248 const nsACString
& aNewName
) {
249 return NS_ERROR_NOT_IMPLEMENTED
;
253 FileDescriptorFile::MoveToFollowingLinks(nsIFile
* aNewParent
,
254 const nsAString
& aNewName
) {
255 return NS_ERROR_NOT_IMPLEMENTED
;
259 FileDescriptorFile::MoveToFollowingLinksNative(nsIFile
* aNewParent
,
260 const nsACString
& aNewName
) {
261 return NS_ERROR_NOT_IMPLEMENTED
;
265 FileDescriptorFile::RenameTo(nsIFile
* aNewParentDir
,
266 const nsAString
& aNewName
) {
267 return NS_ERROR_NOT_IMPLEMENTED
;
271 FileDescriptorFile::RenameToNative(nsIFile
* aNewParentDir
,
272 const nsACString
& aNewName
) {
273 return NS_ERROR_NOT_IMPLEMENTED
;
277 FileDescriptorFile::Remove(bool aRecursive
, uint32_t* aRemoveCount
) {
278 return NS_ERROR_NOT_IMPLEMENTED
;
282 FileDescriptorFile::GetPermissions(uint32_t* aPermissions
) {
283 return NS_ERROR_NOT_IMPLEMENTED
;
287 FileDescriptorFile::SetPermissions(uint32_t aPermissions
) {
288 return NS_ERROR_NOT_IMPLEMENTED
;
292 FileDescriptorFile::GetPermissionsOfLink(uint32_t* aPermissionsOfLink
) {
293 return NS_ERROR_NOT_IMPLEMENTED
;
297 FileDescriptorFile::SetPermissionsOfLink(uint32_t aPermissions
) {
298 return NS_ERROR_NOT_IMPLEMENTED
;
302 FileDescriptorFile::GetLastAccessedTime(PRTime
* aLastAccessedTime
) {
303 return NS_ERROR_NOT_IMPLEMENTED
;
307 FileDescriptorFile::SetLastAccessedTime(PRTime aLastAccessedTime
) {
308 return NS_ERROR_NOT_IMPLEMENTED
;
312 FileDescriptorFile::GetLastAccessedTimeOfLink(PRTime
* aLastAccessedTime
) {
313 return NS_ERROR_NOT_IMPLEMENTED
;
317 FileDescriptorFile::SetLastAccessedTimeOfLink(PRTime aLastAccessedTime
) {
318 return NS_ERROR_NOT_IMPLEMENTED
;
322 FileDescriptorFile::GetLastModifiedTime(PRTime
* aLastModTime
) {
323 return NS_ERROR_NOT_IMPLEMENTED
;
327 FileDescriptorFile::SetLastModifiedTime(PRTime aLastModTime
) {
328 return NS_ERROR_NOT_IMPLEMENTED
;
332 FileDescriptorFile::GetLastModifiedTimeOfLink(PRTime
* aLastModTimeOfLink
) {
333 return NS_ERROR_NOT_IMPLEMENTED
;
337 FileDescriptorFile::SetLastModifiedTimeOfLink(PRTime aLastModTimeOfLink
) {
338 return NS_ERROR_NOT_IMPLEMENTED
;
342 FileDescriptorFile::GetCreationTime(PRTime
* aCreationTime
) {
343 return NS_ERROR_NOT_IMPLEMENTED
;
347 FileDescriptorFile::GetCreationTimeOfLink(PRTime
* aCreationTime
) {
348 return NS_ERROR_NOT_IMPLEMENTED
;
352 FileDescriptorFile::GetFileSize(int64_t* aFileSize
) {
353 return NS_ERROR_NOT_IMPLEMENTED
;
357 FileDescriptorFile::SetFileSize(int64_t aFileSize
) {
358 return NS_ERROR_NOT_IMPLEMENTED
;
362 FileDescriptorFile::GetFileSizeOfLink(int64_t* aFileSize
) {
363 return NS_ERROR_NOT_IMPLEMENTED
;
367 FileDescriptorFile::Exists(bool* aRetVal
) { return NS_ERROR_NOT_IMPLEMENTED
; }
370 FileDescriptorFile::IsWritable(bool* aRetVal
) {
371 return NS_ERROR_NOT_IMPLEMENTED
;
375 FileDescriptorFile::IsReadable(bool* aRetVal
) {
376 return NS_ERROR_NOT_IMPLEMENTED
;
380 FileDescriptorFile::IsExecutable(bool* aRetVal
) {
381 return NS_ERROR_NOT_IMPLEMENTED
;
385 FileDescriptorFile::IsHidden(bool* aRetVal
) { return NS_ERROR_NOT_IMPLEMENTED
; }
388 FileDescriptorFile::IsDirectory(bool* aRetVal
) {
389 return NS_ERROR_NOT_IMPLEMENTED
;
393 FileDescriptorFile::IsFile(bool* aRetVal
) { return NS_ERROR_NOT_IMPLEMENTED
; }
396 FileDescriptorFile::IsSymlink(bool* aRetVal
) {
397 return NS_ERROR_NOT_IMPLEMENTED
;
401 FileDescriptorFile::IsSpecial(bool* aRetVal
) {
402 return NS_ERROR_NOT_IMPLEMENTED
;
406 FileDescriptorFile::CreateUnique(uint32_t aType
, uint32_t aAttributes
) {
407 return NS_ERROR_NOT_IMPLEMENTED
;
411 FileDescriptorFile::GetDirectoryEntriesImpl(nsIDirectoryEnumerator
** aEntries
) {
412 return NS_ERROR_NOT_IMPLEMENTED
;
416 FileDescriptorFile::OpenANSIFileDesc(const char* aMode
, FILE** aRetVal
) {
417 return NS_ERROR_NOT_IMPLEMENTED
;
421 FileDescriptorFile::Load(PRLibrary
** aRetVal
) {
422 return NS_ERROR_NOT_IMPLEMENTED
;
426 FileDescriptorFile::GetDiskSpaceAvailable(int64_t* aDiskSpaceAvailable
) {
427 return NS_ERROR_NOT_IMPLEMENTED
;
431 FileDescriptorFile::GetDiskCapacity(int64_t* aDiskCapacity
) {
432 return NS_ERROR_NOT_IMPLEMENTED
;
436 FileDescriptorFile::Reveal() { return NS_ERROR_NOT_IMPLEMENTED
; }
439 FileDescriptorFile::Launch() { return NS_ERROR_NOT_IMPLEMENTED
; }
442 } // namespace mozilla