зеркало из https://github.com/mozilla/gecko-dev.git
97 строки
2.5 KiB
C++
97 строки
2.5 KiB
C++
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
|
/* 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_ipc_IPCStreamDestination_h
|
|
#define mozilla_ipc_IPCStreamDestination_h
|
|
|
|
#include "mozilla/AlreadyAddRefed.h"
|
|
#include "nsIRunnable.h"
|
|
#include "nsIThread.h"
|
|
|
|
class nsIInputStream;
|
|
class nsIAsyncInputStream;
|
|
class nsIAsyncOutputStream;
|
|
|
|
namespace mozilla {
|
|
|
|
namespace wr {
|
|
struct ByteBuffer;
|
|
} // namespace wr
|
|
|
|
namespace ipc {
|
|
|
|
class PChildToParentStreamParent;
|
|
class PParentToChildStreamChild;
|
|
|
|
// On the destination side, you must simply call TakeReader() upon receiving a
|
|
// reference to the IPCStream{Child,Parent} actor. You do not need to maintain
|
|
// a reference to the actor itself.
|
|
class IPCStreamDestination {
|
|
public:
|
|
static IPCStreamDestination* Cast(PChildToParentStreamParent* aActor);
|
|
|
|
static IPCStreamDestination* Cast(PParentToChildStreamChild* aActor);
|
|
|
|
void SetDelayedStart(bool aDelayedStart);
|
|
|
|
void SetLength(int64_t aLength);
|
|
|
|
already_AddRefed<nsIInputStream> TakeReader();
|
|
|
|
bool IsOnOwningThread() const;
|
|
|
|
void DispatchRunnable(already_AddRefed<nsIRunnable>&& aRunnable);
|
|
|
|
protected:
|
|
IPCStreamDestination();
|
|
virtual ~IPCStreamDestination();
|
|
|
|
nsresult Initialize();
|
|
|
|
// The implementation of the actor should call these methods.
|
|
|
|
void ActorDestroyed();
|
|
|
|
void BufferReceived(const wr::ByteBuffer& aBuffer);
|
|
|
|
void CloseReceived(nsresult aRv);
|
|
|
|
#ifdef DEBUG
|
|
bool HasDelayedStart() const { return mDelayedStart; }
|
|
#endif
|
|
|
|
// These methods will be implemented by the actor.
|
|
|
|
virtual void StartReading() = 0;
|
|
|
|
virtual void RequestClose(nsresult aRv) = 0;
|
|
|
|
virtual void TerminateDestination() = 0;
|
|
|
|
private:
|
|
nsCOMPtr<nsIAsyncInputStream> mReader;
|
|
nsCOMPtr<nsIAsyncOutputStream> mWriter;
|
|
|
|
// This is created by TakeReader() if we need to delay the reading of data.
|
|
// We keep a reference to the stream in order to inform it when the actor goes
|
|
// away. If that happens, the reading of data will not be possible anymore.
|
|
class DelayedStartInputStream;
|
|
RefPtr<DelayedStartInputStream> mDelayedStartInputStream;
|
|
int64_t mLength = -1;
|
|
|
|
nsCOMPtr<nsIThread> mOwningThread;
|
|
bool mDelayedStart;
|
|
|
|
#ifdef MOZ_DEBUG
|
|
bool mLengthSet;
|
|
#endif
|
|
};
|
|
|
|
} // namespace ipc
|
|
} // namespace mozilla
|
|
|
|
#endif // mozilla_ipc_IPCStreamDestination_h
|