netwerk/ipc/RemoteOpenFileChild.cpp

Thu, 15 Jan 2015 21:03:48 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 15 Jan 2015 21:03:48 +0100
branch
TOR_BUG_9701
changeset 11
deefc01c0e14
permissions
-rw-r--r--

Integrate friendly tips from Tor colleagues to make (or not) 4.5 alpha 3;
This includes removal of overloaded (but unused) methods, and addition of
a overlooked call to DataStruct::SetData(nsISupports, uint32_t, bool.)

     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/. */
     7 #include "RemoteOpenFileChild.h"
     9 #include "mozilla/unused.h"
    10 #include "mozilla/ipc/FileDescriptor.h"
    11 #include "mozilla/ipc/FileDescriptorUtils.h"
    12 #include "mozilla/ipc/URIUtils.h"
    13 #include "mozilla/net/NeckoChild.h"
    14 #include "nsThreadUtils.h"
    15 #include "nsJARProtocolHandler.h"
    16 #include "nsIRemoteOpenFileListener.h"
    17 #include "nsProxyRelease.h"
    19 // needed to alloc/free NSPR file descriptors
    20 #include "private/pprio.h"
    22 using namespace mozilla::ipc;
    24 namespace mozilla {
    25 namespace net {
    27 //-----------------------------------------------------------------------------
    28 // Helper class to dispatch events async on windows/OSX
    29 //-----------------------------------------------------------------------------
    31 class CallsListenerInNewEvent : public nsRunnable
    32 {
    33 public:
    34     CallsListenerInNewEvent(nsIRemoteOpenFileListener *aListener, nsresult aRv)
    35       : mListener(aListener), mRV(aRv)
    36     {
    37         MOZ_ASSERT(NS_IsMainThread());
    38         MOZ_ASSERT(aListener);
    39     }
    41     void Dispatch()
    42     {
    43         MOZ_ASSERT(NS_IsMainThread());
    45         nsresult rv = NS_DispatchToCurrentThread(this);
    46         NS_ENSURE_SUCCESS_VOID(rv);
    47     }
    49 private:
    50     NS_IMETHOD Run()
    51     {
    52         MOZ_ASSERT(NS_IsMainThread());
    53         MOZ_ASSERT(mListener);
    55         mListener->OnRemoteFileOpenComplete(mRV);
    56         return NS_OK;
    57     }
    59     nsCOMPtr<nsIRemoteOpenFileListener> mListener;
    60     nsresult mRV;
    61 };
    63 //-----------------------------------------------------------------------------
    64 // RemoteOpenFileChild
    65 //-----------------------------------------------------------------------------
    67 NS_IMPL_ISUPPORTS(RemoteOpenFileChild,
    68                   nsIFile,
    69                   nsIHashable,
    70                   nsICachedFileDescriptorListener)
    72 RemoteOpenFileChild::RemoteOpenFileChild(const RemoteOpenFileChild& other)
    73   : mTabChild(other.mTabChild)
    74   , mNSPRFileDesc(other.mNSPRFileDesc)
    75   , mAsyncOpenCalled(other.mAsyncOpenCalled)
    76   , mNSPROpenCalled(other.mNSPROpenCalled)
    77 {
    78   // Note: don't clone mListener or we'll have a refcount leak.
    79   other.mURI->Clone(getter_AddRefs(mURI));
    80   if (other.mAppURI) {
    81     other.mAppURI->Clone(getter_AddRefs(mAppURI));
    82   }
    83   other.mFile->Clone(getter_AddRefs(mFile));
    84 }
    86 RemoteOpenFileChild::~RemoteOpenFileChild()
    87 {
    88   if (NS_IsMainThread()) {
    89     if (mListener) {
    90       NotifyListener(NS_ERROR_UNEXPECTED);
    91     }
    92   } else {
    93     nsCOMPtr<nsIThread> mainThread = do_GetMainThread();
    94     if (mainThread) {
    95       MOZ_ALWAYS_TRUE(NS_SUCCEEDED(NS_ProxyRelease(mainThread, mURI, true)));
    96       MOZ_ALWAYS_TRUE(NS_SUCCEEDED(NS_ProxyRelease(mainThread, mAppURI, true)));
    97       MOZ_ALWAYS_TRUE(NS_SUCCEEDED(NS_ProxyRelease(mainThread, mListener,
    98                                                    true)));
   100       TabChild* tabChild;
   101       mTabChild.forget(&tabChild);
   103       if (tabChild) {
   104         nsCOMPtr<nsIRunnable> runnable =
   105           NS_NewNonOwningRunnableMethod(tabChild, &TabChild::Release);
   106         MOZ_ASSERT(runnable);
   108         MOZ_ALWAYS_TRUE(NS_SUCCEEDED(mainThread->Dispatch(runnable,
   109                                                           NS_DISPATCH_NORMAL)));
   110       }
   111     } else {
   112       using mozilla::unused;
   114       NS_WARNING("RemoteOpenFileChild released after thread shutdown, leaking "
   115                  "its members!");
   117       unused << mURI.forget();
   118       unused << mAppURI.forget();
   119       unused << mListener.forget();
   120       unused << mTabChild.forget();
   121     }
   122   }
   124   if (mNSPRFileDesc) {
   125     // If we handed out fd we shouldn't have pointer to it any more.
   126     MOZ_ASSERT(!mNSPROpenCalled);
   127     // PR_Close both closes the file and deallocates the PRFileDesc
   128     PR_Close(mNSPRFileDesc);
   129   }
   130 }
   132 nsresult
   133 RemoteOpenFileChild::Init(nsIURI* aRemoteOpenUri, nsIURI* aAppUri)
   134 {
   135   if (!aRemoteOpenUri) {
   136     return NS_ERROR_INVALID_ARG;
   137   }
   139   if (aAppUri) {
   140     aAppUri->Clone(getter_AddRefs(mAppURI));
   141   }
   143   nsAutoCString scheme;
   144   nsresult rv = aRemoteOpenUri->GetScheme(scheme);
   145   NS_ENSURE_SUCCESS(rv, rv);
   147   if (!scheme.EqualsLiteral("remoteopenfile")) {
   148     return NS_ERROR_INVALID_ARG;
   149   }
   151   // scheme of URI is not file:// so this is not a nsIFileURL.  Convert to one.
   152   nsCOMPtr<nsIURI> clonedURI;
   153   rv = aRemoteOpenUri->Clone(getter_AddRefs(clonedURI));
   154   NS_ENSURE_SUCCESS(rv, rv);
   156   clonedURI->SetScheme(NS_LITERAL_CSTRING("file"));
   157   nsAutoCString spec;
   158   clonedURI->GetSpec(spec);
   160   rv = NS_NewURI(getter_AddRefs(mURI), spec);
   161   NS_ENSURE_SUCCESS(rv, rv);
   163   // Get nsIFile
   164   nsCOMPtr<nsIFileURL> fileURL = do_QueryInterface(mURI);
   165   if (!fileURL) {
   166     return NS_ERROR_UNEXPECTED;
   167   }
   169   rv = fileURL->GetFile(getter_AddRefs(mFile));
   170   NS_ENSURE_SUCCESS(rv, rv);
   172   return NS_OK;
   173 }
   175 nsresult
   176 RemoteOpenFileChild::AsyncRemoteFileOpen(int32_t aFlags,
   177                                          nsIRemoteOpenFileListener* aListener,
   178                                          nsITabChild* aTabChild)
   179 {
   180   if (!mFile) {
   181     return NS_ERROR_NOT_INITIALIZED;
   182   }
   184   if (!aListener) {
   185     return NS_ERROR_INVALID_ARG;
   186   }
   188   if (mAsyncOpenCalled) {
   189     return NS_ERROR_ALREADY_OPENED;
   190   }
   192   if (aFlags != PR_RDONLY) {
   193     return NS_ERROR_NOT_AVAILABLE;
   194   }
   196   mTabChild = static_cast<TabChild*>(aTabChild);
   198   if (MissingRequiredTabChild(mTabChild, "remoteopenfile")) {
   199     return NS_ERROR_ILLEGAL_VALUE;
   200   }
   202 #if defined(XP_WIN) || defined(MOZ_WIDGET_COCOA)
   203   // Windows/OSX desktop builds skip remoting, and just open file in child
   204   // process when asked for NSPR handle
   205   nsRefPtr<CallsListenerInNewEvent> runnable =
   206     new CallsListenerInNewEvent(aListener, NS_OK);
   207   runnable->Dispatch();
   209   mAsyncOpenCalled = true;
   210   return NS_OK;
   211 #else
   212   nsString path;
   213   if (NS_FAILED(mFile->GetPath(path))) {
   214     MOZ_CRASH("Couldn't get path from file!");
   215   }
   217   if (mTabChild) {
   218     if (mTabChild->GetCachedFileDescriptor(path, this)) {
   219       // The file descriptor was found in the cache and OnCachedFileDescriptor()
   220       // will be called with it.
   221       return NS_OK;
   222     }
   223   }
   225   URIParams uri;
   226   SerializeURI(mURI, uri);
   227   OptionalURIParams appUri;
   228   SerializeURI(mAppURI, appUri);
   230   gNeckoChild->SendPRemoteOpenFileConstructor(this, uri, appUri);
   232   // The chrome process now has a logical ref to us until it calls Send__delete.
   233   AddIPDLReference();
   235   mListener = aListener;
   236   mAsyncOpenCalled = true;
   237   return NS_OK;
   238 #endif
   239 }
   241 void
   242 RemoteOpenFileChild::OnCachedFileDescriptor(const nsAString& aPath,
   243                                             const FileDescriptor& aFD)
   244 {
   245 #ifdef DEBUG
   246   if (!aPath.IsEmpty()) {
   247     MOZ_ASSERT(mFile);
   249     nsString path;
   250     MOZ_ASSERT(NS_SUCCEEDED(mFile->GetPath(path)));
   251     MOZ_ASSERT(path == aPath, "Paths don't match!");
   252   }
   253 #endif
   255   HandleFileDescriptorAndNotifyListener(aFD, /* aFromRecvDelete */ false);
   256 }
   258 void
   259 RemoteOpenFileChild::HandleFileDescriptorAndNotifyListener(
   260                                                       const FileDescriptor& aFD,
   261                                                       bool aFromRecvDelete)
   262 {
   263 #if defined(XP_WIN) || defined(MOZ_WIDGET_COCOA)
   264   MOZ_CRASH("OS X and Windows shouldn't be doing IPDL here");
   265 #else
   266   if (!mListener) {
   267     // We already notified our listener (either in response to a cached file
   268     // descriptor callback or through the normal messaging mechanism). Close the
   269     // file descriptor if it is valid.
   270     if (aFD.IsValid()) {
   271       nsRefPtr<CloseFileRunnable> runnable = new CloseFileRunnable(aFD);
   272       runnable->Dispatch();
   273     }
   274     return;
   275   }
   277   MOZ_ASSERT(!mNSPRFileDesc);
   279   nsRefPtr<TabChild> tabChild;
   280   mTabChild.swap(tabChild);
   282   // If RemoteOpenFile reply (Recv__delete__) for app's application.zip comes
   283   // back sooner than the parent-pushed fd (TabChild::RecvCacheFileDescriptor())
   284   // have TabChild cancel running callbacks, since we'll call them in
   285   // NotifyListener.
   286   if (tabChild && aFromRecvDelete) {
   287     nsString path;
   288     if (NS_FAILED(mFile->GetPath(path))) {
   289       MOZ_CRASH("Couldn't get path from file!");
   290     }
   292     tabChild->CancelCachedFileDescriptorCallback(path, this);
   293   }
   295   if (aFD.IsValid()) {
   296     mNSPRFileDesc = PR_ImportFile(aFD.PlatformHandle());
   297     if (!mNSPRFileDesc) {
   298       NS_WARNING("Failed to import file handle!");
   299     }
   300   }
   302   NotifyListener(mNSPRFileDesc ? NS_OK : NS_ERROR_FILE_NOT_FOUND);
   303 #endif
   304 }
   306 void
   307 RemoteOpenFileChild::NotifyListener(nsresult aResult)
   308 {
   309   MOZ_ASSERT(mListener);
   310   mListener->OnRemoteFileOpenComplete(aResult);
   311   mListener = nullptr;     // release ref to listener
   313   nsRefPtr<nsJARProtocolHandler> handler(gJarHandler);
   314   NS_WARN_IF_FALSE(handler, "nsJARProtocolHandler is already gone!");
   316   if (handler) {
   317     handler->RemoteOpenFileComplete(this, aResult);
   318   }
   319 }
   321 //-----------------------------------------------------------------------------
   322 // RemoteOpenFileChild::PRemoteOpenFileChild
   323 //-----------------------------------------------------------------------------
   325 bool
   326 RemoteOpenFileChild::Recv__delete__(const FileDescriptor& aFD)
   327 {
   328 #if defined(XP_WIN) || defined(MOZ_WIDGET_COCOA)
   329   NS_NOTREACHED("OS X and Windows shouldn't be doing IPDL here");
   330 #else
   331   HandleFileDescriptorAndNotifyListener(aFD, /* aFromRecvDelete */ true);
   332 #endif
   334   return true;
   335 }
   337 //-----------------------------------------------------------------------------
   338 // RemoteOpenFileChild::nsIFile functions that we override logic for
   339 //-----------------------------------------------------------------------------
   341 NS_IMETHODIMP
   342 RemoteOpenFileChild::Clone(nsIFile **file)
   343 {
   344   *file = new RemoteOpenFileChild(*this);
   345   NS_ADDREF(*file);
   347   // if we transferred ownership of file to clone, forget our pointer.
   348   if (mNSPRFileDesc) {
   349     mNSPRFileDesc = nullptr;
   350   }
   352   return NS_OK;
   353 }
   355 /* The main event: get file descriptor from parent process
   356  */
   357 NS_IMETHODIMP
   358 RemoteOpenFileChild::OpenNSPRFileDesc(int32_t aFlags, int32_t aMode,
   359                                       PRFileDesc **aRetval)
   360 {
   361 #if defined(XP_WIN) || defined(MOZ_WIDGET_COCOA)
   362   // Windows and OSX builds: just open nsIFile locally.
   363   return mFile->OpenNSPRFileDesc(aFlags, aMode, aRetval);
   365 #else
   366   if (aFlags != PR_RDONLY) {
   367     return NS_ERROR_NOT_AVAILABLE;
   368   }
   370   // Unlike regular nsIFile we can't (easily) support multiple open()s.
   371   if (mNSPROpenCalled) {
   372     return NS_ERROR_ALREADY_OPENED;
   373   }
   375   if (!mNSPRFileDesc) {
   376     // client skipped AsyncRemoteFileOpen() or didn't wait for result, or this
   377     // object has been cloned
   378     return NS_ERROR_NOT_AVAILABLE;
   379   }
   381   // hand off ownership (i.e responsibility to PR_Close() file handle) to caller
   382   *aRetval = mNSPRFileDesc;
   383   mNSPRFileDesc = nullptr;
   384   mNSPROpenCalled = true;
   386   return NS_OK;
   387 #endif
   388 }
   391 //-----------------------------------------------------------------------------
   392 // RemoteOpenFileChild::nsIFile functions that we delegate to underlying nsIFile
   393 //-----------------------------------------------------------------------------
   395 nsresult
   396 RemoteOpenFileChild::GetLeafName(nsAString &aLeafName)
   397 {
   398   return mFile->GetLeafName(aLeafName);
   399 }
   401 NS_IMETHODIMP
   402 RemoteOpenFileChild::GetNativeLeafName(nsACString &aLeafName)
   403 {
   404   return mFile->GetNativeLeafName(aLeafName);
   405 }
   407 nsresult
   408 RemoteOpenFileChild::GetTarget(nsAString &_retval)
   409 {
   410   return mFile->GetTarget(_retval);
   411 }
   413 NS_IMETHODIMP
   414 RemoteOpenFileChild::GetNativeTarget(nsACString &_retval)
   415 {
   416   return mFile->GetNativeTarget(_retval);
   417 }
   419 nsresult
   420 RemoteOpenFileChild::GetPath(nsAString &_retval)
   421 {
   422   return mFile->GetPath(_retval);
   423 }
   425 NS_IMETHODIMP
   426 RemoteOpenFileChild::GetNativePath(nsACString &_retval)
   427 {
   428   return mFile->GetNativePath(_retval);
   429 }
   431 NS_IMETHODIMP
   432 RemoteOpenFileChild::Equals(nsIFile *inFile, bool *_retval)
   433 {
   434   return mFile->Equals(inFile, _retval);
   435 }
   437 NS_IMETHODIMP
   438 RemoteOpenFileChild::Contains(nsIFile *inFile, bool recur, bool *_retval)
   439 {
   440   return mFile->Contains(inFile, recur, _retval);
   441 }
   443 NS_IMETHODIMP
   444 RemoteOpenFileChild::GetParent(nsIFile **aParent)
   445 {
   446   return mFile->GetParent(aParent);
   447 }
   449 NS_IMETHODIMP
   450 RemoteOpenFileChild::GetFollowLinks(bool *aFollowLinks)
   451 {
   452   return mFile->GetFollowLinks(aFollowLinks);
   453 }
   455 //-----------------------------------------------------------------------------
   456 // RemoteOpenFileChild::nsIFile functions that are not currently supported
   457 //-----------------------------------------------------------------------------
   459 nsresult
   460 RemoteOpenFileChild::Append(const nsAString &node)
   461 {
   462   return NS_ERROR_NOT_IMPLEMENTED;
   463 }
   465 NS_IMETHODIMP
   466 RemoteOpenFileChild::AppendNative(const nsACString &fragment)
   467 {
   468   return NS_ERROR_NOT_IMPLEMENTED;
   469 }
   471 NS_IMETHODIMP
   472 RemoteOpenFileChild::Normalize()
   473 {
   474   return NS_ERROR_NOT_IMPLEMENTED;
   475 }
   477 NS_IMETHODIMP
   478 RemoteOpenFileChild::Create(uint32_t type, uint32_t permissions)
   479 {
   480   return NS_ERROR_NOT_IMPLEMENTED;
   481 }
   483 nsresult
   484 RemoteOpenFileChild::SetLeafName(const nsAString &aLeafName)
   485 {
   486   return NS_ERROR_NOT_IMPLEMENTED;
   487 }
   489 NS_IMETHODIMP
   490 RemoteOpenFileChild::SetNativeLeafName(const nsACString &aLeafName)
   491 {
   492   return NS_ERROR_NOT_IMPLEMENTED;
   493 }
   495 nsresult
   496 RemoteOpenFileChild::InitWithPath(const nsAString &filePath)
   497 {
   498   return NS_ERROR_NOT_IMPLEMENTED;
   499 }
   501 NS_IMETHODIMP
   502 RemoteOpenFileChild::InitWithNativePath(const nsACString &filePath)
   503 {
   504   return NS_ERROR_NOT_IMPLEMENTED;
   505 }
   507 NS_IMETHODIMP
   508 RemoteOpenFileChild::InitWithFile(nsIFile *aFile)
   509 {
   510   return NS_ERROR_NOT_IMPLEMENTED;
   511 }
   513 NS_IMETHODIMP
   514 RemoteOpenFileChild::SetFollowLinks(bool aFollowLinks)
   515 {
   516   return NS_ERROR_NOT_IMPLEMENTED;
   517 }
   519 nsresult  
   520 RemoteOpenFileChild::AppendRelativePath(const nsAString &node)
   521 {
   522   return NS_ERROR_NOT_IMPLEMENTED;
   523 }
   525 NS_IMETHODIMP
   526 RemoteOpenFileChild::AppendRelativeNativePath(const nsACString &fragment)
   527 {
   528   return NS_ERROR_NOT_IMPLEMENTED;
   529 }
   531 NS_IMETHODIMP
   532 RemoteOpenFileChild::GetPersistentDescriptor(nsACString &aPersistentDescriptor)
   533 {
   534   return NS_ERROR_NOT_IMPLEMENTED;
   535 }
   537 NS_IMETHODIMP
   538 RemoteOpenFileChild::SetPersistentDescriptor(const nsACString &aPersistentDescriptor)
   539 {
   540   return NS_ERROR_NOT_IMPLEMENTED;
   541 }
   543 NS_IMETHODIMP
   544 RemoteOpenFileChild::GetRelativeDescriptor(nsIFile *fromFile, nsACString& _retval)
   545 {
   546   return NS_ERROR_NOT_IMPLEMENTED;
   547 }
   549 NS_IMETHODIMP
   550 RemoteOpenFileChild::SetRelativeDescriptor(nsIFile *fromFile,
   551                                    const nsACString& relativeDesc)
   552 {
   553   return NS_ERROR_NOT_IMPLEMENTED;
   554 }
   556 nsresult
   557 RemoteOpenFileChild::CopyTo(nsIFile *newParentDir, const nsAString &newName)
   558 {
   559   return NS_ERROR_NOT_IMPLEMENTED;
   560 }
   562 NS_IMETHODIMP
   563 RemoteOpenFileChild::CopyToNative(nsIFile *newParent, const nsACString &newName)
   564 {
   565   return NS_ERROR_NOT_IMPLEMENTED;
   566 }
   568 nsresult
   569 RemoteOpenFileChild::CopyToFollowingLinks(nsIFile *newParentDir,
   570                                   const nsAString &newName)
   571 {
   572   return NS_ERROR_NOT_IMPLEMENTED;
   573 }
   575 NS_IMETHODIMP
   576 RemoteOpenFileChild::CopyToFollowingLinksNative(nsIFile *newParent,
   577                                         const nsACString &newName)
   578 {
   579   return NS_ERROR_NOT_IMPLEMENTED;
   580 }
   582 nsresult
   583 RemoteOpenFileChild::MoveTo(nsIFile *newParentDir, const nsAString &newName)
   584 {
   585   return NS_ERROR_NOT_IMPLEMENTED;
   586 }
   588 NS_IMETHODIMP
   589 RemoteOpenFileChild::MoveToNative(nsIFile *newParent, const nsACString &newName)
   590 {
   591   return NS_ERROR_NOT_IMPLEMENTED;
   592 }
   594 NS_IMETHODIMP
   595 RemoteOpenFileChild::RenameTo(nsIFile *newParentDir, const nsAString &newName)
   596 {
   597   return NS_ERROR_NOT_IMPLEMENTED;
   598 }
   600 NS_IMETHODIMP
   601 RemoteOpenFileChild::Remove(bool recursive)
   602 {
   603   return NS_ERROR_NOT_IMPLEMENTED;
   604 }
   606 NS_IMETHODIMP
   607 RemoteOpenFileChild::GetPermissions(uint32_t *aPermissions)
   608 {
   609   return NS_ERROR_NOT_IMPLEMENTED;
   610 }
   612 NS_IMETHODIMP
   613 RemoteOpenFileChild::SetPermissions(uint32_t aPermissions)
   614 {
   615   return NS_ERROR_NOT_IMPLEMENTED;
   616 }
   618 NS_IMETHODIMP
   619 RemoteOpenFileChild::GetPermissionsOfLink(uint32_t *aPermissionsOfLink)
   620 {
   621   return NS_ERROR_NOT_IMPLEMENTED;
   622 }
   624 NS_IMETHODIMP
   625 RemoteOpenFileChild::SetPermissionsOfLink(uint32_t aPermissions)
   626 {
   627   return NS_ERROR_NOT_IMPLEMENTED;
   628 }
   630 NS_IMETHODIMP
   631 RemoteOpenFileChild::GetLastModifiedTime(PRTime *aLastModTime)
   632 {
   633   return NS_ERROR_NOT_IMPLEMENTED;
   634 }
   636 NS_IMETHODIMP
   637 RemoteOpenFileChild::SetLastModifiedTime(PRTime aLastModTime)
   638 {
   639   return NS_ERROR_NOT_IMPLEMENTED;
   640 }
   642 NS_IMETHODIMP
   643 RemoteOpenFileChild::GetLastModifiedTimeOfLink(PRTime *aLastModTimeOfLink)
   644 {
   645   return NS_ERROR_NOT_IMPLEMENTED;
   646 }
   648 NS_IMETHODIMP
   649 RemoteOpenFileChild::SetLastModifiedTimeOfLink(PRTime aLastModTimeOfLink)
   650 {
   651   return NS_ERROR_NOT_IMPLEMENTED;
   652 }
   654 NS_IMETHODIMP
   655 RemoteOpenFileChild::GetFileSize(int64_t *aFileSize)
   656 {
   657   return NS_ERROR_NOT_IMPLEMENTED;
   658 }
   660 NS_IMETHODIMP
   661 RemoteOpenFileChild::SetFileSize(int64_t aFileSize)
   662 {
   663   return NS_ERROR_NOT_IMPLEMENTED;
   664 }
   666 NS_IMETHODIMP
   667 RemoteOpenFileChild::GetFileSizeOfLink(int64_t *aFileSize)
   668 {
   669   return NS_ERROR_NOT_IMPLEMENTED;
   670 }
   672 NS_IMETHODIMP
   673 RemoteOpenFileChild::Exists(bool *_retval)
   674 {
   675   return NS_ERROR_NOT_IMPLEMENTED;
   676 }
   678 NS_IMETHODIMP
   679 RemoteOpenFileChild::IsWritable(bool *_retval)
   680 {
   681   return NS_ERROR_NOT_IMPLEMENTED;
   682 }
   684 NS_IMETHODIMP
   685 RemoteOpenFileChild::IsReadable(bool *_retval)
   686 {
   687   return NS_ERROR_NOT_IMPLEMENTED;
   688 }
   690 NS_IMETHODIMP
   691 RemoteOpenFileChild::IsExecutable(bool *_retval)
   692 {
   693   return NS_ERROR_NOT_IMPLEMENTED;
   694 }
   696 NS_IMETHODIMP
   697 RemoteOpenFileChild::IsHidden(bool *_retval)
   698 {
   699   return NS_ERROR_NOT_IMPLEMENTED;
   700 }
   702 NS_IMETHODIMP
   703 RemoteOpenFileChild::IsDirectory(bool *_retval)
   704 {
   705   return NS_ERROR_NOT_IMPLEMENTED;
   706 }
   708 NS_IMETHODIMP
   709 RemoteOpenFileChild::IsFile(bool *_retval)
   710 {
   711   return NS_ERROR_NOT_IMPLEMENTED;
   712 }
   714 NS_IMETHODIMP
   715 RemoteOpenFileChild::IsSymlink(bool *_retval)
   716 {
   717   return NS_ERROR_NOT_IMPLEMENTED;
   718 }
   720 NS_IMETHODIMP
   721 RemoteOpenFileChild::IsSpecial(bool *_retval)
   722 {
   723   return NS_ERROR_NOT_IMPLEMENTED;
   724 }
   726 NS_IMETHODIMP
   727 RemoteOpenFileChild::CreateUnique(uint32_t type, uint32_t attributes)
   728 {
   729   return NS_ERROR_NOT_IMPLEMENTED;
   730 }
   732 NS_IMETHODIMP
   733 RemoteOpenFileChild::GetDirectoryEntries(nsISimpleEnumerator **entries)
   734 {
   735   return NS_ERROR_NOT_IMPLEMENTED;
   736 }
   738 NS_IMETHODIMP
   739 RemoteOpenFileChild::OpenANSIFileDesc(const char *mode, FILE **_retval)
   740 {
   741   // TODO: can implement using fdopen()?
   742   return NS_ERROR_NOT_IMPLEMENTED;
   743 }
   745 NS_IMETHODIMP
   746 RemoteOpenFileChild::Load(PRLibrary **_retval)
   747 {
   748   return NS_ERROR_NOT_IMPLEMENTED;
   749 }
   751 NS_IMETHODIMP
   752 RemoteOpenFileChild::GetDiskSpaceAvailable(int64_t *aDiskSpaceAvailable)
   753 {
   754   return NS_ERROR_NOT_IMPLEMENTED;
   755 }
   757 NS_IMETHODIMP
   758 RemoteOpenFileChild::Reveal()
   759 {
   760   return NS_ERROR_NOT_IMPLEMENTED;
   761 }
   763 NS_IMETHODIMP
   764 RemoteOpenFileChild::Launch()
   765 {
   766   return NS_ERROR_NOT_IMPLEMENTED;
   767 }
   769 //-----------------------------------------------------------------------------
   770 // RemoteOpenFileChild::nsIHashable functions that we delegate to underlying nsIFile
   771 //-----------------------------------------------------------------------------
   773 NS_IMETHODIMP
   774 RemoteOpenFileChild::Equals(nsIHashable* aOther, bool *aResult)
   775 {
   776   nsCOMPtr<nsIHashable> hashable = do_QueryInterface(mFile);
   778   MOZ_ASSERT(hashable);
   780   if (hashable) {
   781     return hashable->Equals(aOther, aResult);
   782   }
   783   return NS_ERROR_UNEXPECTED;
   784 }
   786 NS_IMETHODIMP
   787 RemoteOpenFileChild::GetHashCode(uint32_t *aResult)
   788 {
   789   nsCOMPtr<nsIHashable> hashable = do_QueryInterface(mFile);
   791   MOZ_ASSERT(hashable);
   793   if (hashable) {
   794     return hashable->GetHashCode(aResult);
   795   }
   796   return NS_ERROR_UNEXPECTED;
   797 }
   799 } // namespace net
   800 } // namespace mozilla

mercurial