DXR is a code search and navigation tool aimed at making sense of large projects. It supports full-text and regex searches as well as structural queries.

Implementation

Mercurial (d38398e5144e)

VCS Links

BackgroundFileHandleChild

BackgroundFileRequestChild

BackgroundMutableFileChildBase

Macros

Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
 * You can obtain one at http://mozilla.org/MPL/2.0/. */

#ifndef mozilla_dom_filehandle_ActorsChild_h
#define mozilla_dom_filehandle_ActorsChild_h

#include "js/RootingAPI.h"
#include "mozilla/Attributes.h"
#include "mozilla/dom/FileHandleCommon.h"
#include "mozilla/dom/PBackgroundFileHandleChild.h"
#include "mozilla/dom/PBackgroundFileRequestChild.h"
#include "mozilla/dom/PBackgroundMutableFileChild.h"

class nsCString;

namespace mozilla {
namespace dom {

class FileHandleBase;
class FileRequestBase;
class MutableFileBase;

class BackgroundMutableFileChildBase
  : public ThreadObject
  , public PBackgroundMutableFileChild
{
protected:
  friend class MutableFileBase;

  RefPtr<MutableFileBase> mTemporaryStrongMutableFile;
  MutableFileBase* mMutableFile;

public:
  void
  EnsureDOMObject();

  MutableFileBase*
  GetDOMObject() const
  {
    AssertIsOnOwningThread();
    return mMutableFile;
  }

  void
  ReleaseDOMObject();

protected:
  BackgroundMutableFileChildBase(DEBUGONLY(PRThread* aOwningThread));

  ~BackgroundMutableFileChildBase();

  void
  SendDeleteMeInternal();

  virtual already_AddRefed<MutableFileBase>
  CreateMutableFile() = 0;

  // IPDL methods are only called by IPDL.
  virtual void
  ActorDestroy(ActorDestroyReason aWhy) override;

  virtual PBackgroundFileHandleChild*
  AllocPBackgroundFileHandleChild(const FileMode& aMode) override;

  virtual bool
  DeallocPBackgroundFileHandleChild(PBackgroundFileHandleChild* aActor)
                                    override;

  bool
  SendDeleteMe() = delete;
};

class BackgroundFileHandleChild
  : public ThreadObject
  , public PBackgroundFileHandleChild
{
  friend class BackgroundMutableFileChildBase;
  friend class MutableFileBase;

  // mTemporaryStrongFileHandle is strong and is only valid until the end of
  // NoteComplete() member function or until the NoteActorDestroyed() member
  // function is called.
  RefPtr<FileHandleBase> mTemporaryStrongFileHandle;

  // mFileHandle is weak and is valid until the NoteActorDestroyed() member
  // function is called.
  FileHandleBase* mFileHandle;

public:
  explicit BackgroundFileHandleChild(DEBUGONLY(PRThread* aOwningThread,)
                                     FileHandleBase* aFileHandle);

  void
  SendDeleteMeInternal();

private:
  ~BackgroundFileHandleChild();

  void
  NoteActorDestroyed();

  void
  NoteComplete();

  // IPDL methods are only called by IPDL.
  virtual void
  ActorDestroy(ActorDestroyReason aWhy) override;

  mozilla::ipc::IPCResult
  RecvComplete(const bool& aAborted) override;

  virtual PBackgroundFileRequestChild*
  AllocPBackgroundFileRequestChild(const FileRequestParams& aParams)
                                   override;

  virtual bool
  DeallocPBackgroundFileRequestChild(PBackgroundFileRequestChild* aActor)
                                     override;

  bool
  SendDeleteMe() = delete;
};

class BackgroundFileRequestChild final
  : public ThreadObject
  , public PBackgroundFileRequestChild
{
  friend class BackgroundFileHandleChild;
  friend class FileHandleBase;

  RefPtr<FileRequestBase> mFileRequest;
  RefPtr<FileHandleBase> mFileHandle;
  bool mActorDestroyed;

private:
  // Only created by FileHandleBase.
  explicit BackgroundFileRequestChild(DEBUGONLY(PRThread* aOwningThread,)
                                      FileRequestBase* aFileRequest);

  // Only destroyed by BackgroundFileHandleChild.
  ~BackgroundFileRequestChild();

  void
  HandleResponse(nsresult aResponse);

  void
  HandleResponse(const FileRequestGetFileResponse& aResponse);

  void
  HandleResponse(const nsCString& aResponse);

  void
  HandleResponse(const FileRequestMetadata& aResponse);

  void
  HandleResponse(JS::Handle<JS::Value> aResponse);

  // IPDL methods are only called by IPDL.
  virtual void
  ActorDestroy(ActorDestroyReason aWhy) override;

  virtual mozilla::ipc::IPCResult
  Recv__delete__(const FileRequestResponse& aResponse) override;

  virtual mozilla::ipc::IPCResult
  RecvProgress(const uint64_t& aProgress,
               const uint64_t& aProgressMax) override;
};

} // namespace dom
} // namespace mozilla

#endif // mozilla_dom_filehandle_ActorsChild_h