diff options
Diffstat (limited to 'ipc/glue/MessageLink.h')
-rw-r--r-- | ipc/glue/MessageLink.h | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/ipc/glue/MessageLink.h b/ipc/glue/MessageLink.h new file mode 100644 index 000000000..d0e05fc63 --- /dev/null +++ b/ipc/glue/MessageLink.h @@ -0,0 +1,133 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: sw=4 ts=4 et : + */ +/* 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 ipc_glue_MessageLink_h +#define ipc_glue_MessageLink_h 1 + +#include "base/basictypes.h" +#include "base/message_loop.h" + +#include "mozilla/WeakPtr.h" +#include "mozilla/ipc/Transport.h" + +namespace mozilla { +namespace ipc { + +class MessageChannel; + +struct HasResultCodes +{ + enum Result { + MsgProcessed, + MsgDropped, + MsgNotKnown, + MsgNotAllowed, + MsgPayloadError, + MsgProcessingError, + MsgRouteError, + MsgValueError + }; +}; + +enum Side { + ParentSide, + ChildSide, + UnknownSide +}; + +class MessageLink +{ + public: + typedef IPC::Message Message; + + explicit MessageLink(MessageChannel *aChan); + virtual ~MessageLink(); + + // n.b.: These methods all require that the channel monitor is + // held when they are invoked. + virtual void EchoMessage(Message *msg) = 0; + virtual void SendMessage(Message *msg) = 0; + virtual void SendClose() = 0; + + virtual bool Unsound_IsClosed() const = 0; + virtual uint32_t Unsound_NumQueuedMessages() const = 0; + + protected: + MessageChannel *mChan; +}; + +class ProcessLink + : public MessageLink, + public Transport::Listener +{ + void OnCloseChannel(); + void OnChannelOpened(); + void OnTakeConnectedChannel(); + void OnEchoMessage(Message* msg); + + void AssertIOThread() const + { + MOZ_ASSERT(mIOLoop == MessageLoop::current(), + "not on I/O thread!"); + } + + public: + explicit ProcessLink(MessageChannel *chan); + virtual ~ProcessLink(); + + // The ProcessLink will register itself as the IPC::Channel::Listener on the + // transport passed here. If the transport already has a listener registered + // then a listener chain will be established (the ProcessLink listener + // methods will be called first and may call some methods on the original + // listener as well). Once the channel is closed (either via normal shutdown + // or a pipe error) the chain will be destroyed and the original listener + // will again be registered. + void Open(Transport* aTransport, MessageLoop *aIOLoop, Side aSide); + + // Run on the I/O thread, only when using inter-process link. + // These methods acquire the monitor and forward to the + // similarly named methods in AsyncChannel below + // (OnMessageReceivedFromLink(), etc) + virtual void OnMessageReceived(Message&& msg) override; + virtual void OnChannelConnected(int32_t peer_pid) override; + virtual void OnChannelError() override; + + virtual void EchoMessage(Message *msg) override; + virtual void SendMessage(Message *msg) override; + virtual void SendClose() override; + + virtual bool Unsound_IsClosed() const override; + virtual uint32_t Unsound_NumQueuedMessages() const override; + + protected: + Transport* mTransport; + MessageLoop* mIOLoop; // thread where IO happens + Transport::Listener* mExistingListener; // channel's previous listener +}; + +class ThreadLink : public MessageLink +{ + public: + ThreadLink(MessageChannel *aChan, MessageChannel *aTargetChan); + virtual ~ThreadLink(); + + virtual void EchoMessage(Message *msg) override; + virtual void SendMessage(Message *msg) override; + virtual void SendClose() override; + + virtual bool Unsound_IsClosed() const override; + virtual uint32_t Unsound_NumQueuedMessages() const override; + + protected: + MessageChannel* mTargetChan; +}; + +} // namespace ipc +} // namespace mozilla + +#endif // ifndef ipc_glue_MessageLink_h + |