/* * Copyright 2011-2016, Haiku, Inc. All Rights Reserved. * Distributed under the terms of the MIT License. */ #ifndef SOCKET_MESSENGER_H #define SOCKET_MESSENGER_H #include class BMessage; class BMessenger; class BSocketMessenger { public: BSocketMessenger(); BSocketMessenger( const BNetworkAddress& address, bigtime_t timeout = B_INFINITE_TIMEOUT); // adopt an existing already connected socket. BSocketMessenger(const BSocket& socket); virtual ~BSocketMessenger(); void Unset(); status_t SetTo(const BNetworkAddress& address, bigtime_t timeout = B_INFINITE_TIMEOUT); status_t SetTo(const BSocketMessenger& target, bigtime_t timeout = B_INFINITE_TIMEOUT); status_t InitCheck() const { return fInitStatus; } const BNetworkAddress& Address() const { return fSocket.Peer(); } virtual status_t SendMessage(const BMessage& message); virtual status_t SendMessage(const BMessage& message, BMessage& _reply, bigtime_t timeout = B_INFINITE_TIMEOUT); virtual status_t SendMessage(const BMessage& message, BMessenger& replyTarget, bigtime_t timeout = B_INFINITE_TIMEOUT); virtual status_t SendReply(const BMessage& message, const BMessage& reply); // wait for unsolicited message on socket virtual status_t ReceiveMessage(BMessage& _message, bigtime_t timeout = B_INFINITE_TIMEOUT); private: struct Private; private: BSocketMessenger(const BSocketMessenger&); BSocketMessenger& operator=(const BSocketMessenger&); void _Init(); status_t _WaitForMessage(bigtime_t timeout); status_t _SendMessage(const BMessage& message); status_t _ReadMessage(BMessage& _message); status_t _ReadReply(int64 replyID, BMessage& _reply, bigtime_t timeout); static status_t _MessageReader(void* arg); private: Private* fPrivateData; BSocket fSocket; status_t fInitStatus; }; #endif // SOCKET_MESSENGER_H