#ifndef MessageSender_h
#define MessageSender_h
#include <wtf/Assertions.h>
#include "Connection.h"
namespace IPC {
class MessageSender {
public:
virtual ~MessageSender();
template<typename U> bool send(const U& message)
{
return send(message, messageSenderDestinationID(), 0);
}
template<typename U> bool send(const U& message, uint64_t destinationID, unsigned messageSendFlags = 0)
{
static_assert(!U::isSync, "Message is sync!");
auto encoder = std::make_unique<MessageEncoder>(U::receiverName(), U::name(), destinationID);
encoder->encode(message.arguments());
return sendMessage(WTF::move(encoder), messageSendFlags);
}
template<typename T>
bool sendSync(T&& message, typename T::Reply&& reply, std::chrono::milliseconds timeout = std::chrono::milliseconds::max(), unsigned syncSendFlags = 0)
{
static_assert(T::isSync, "Message is not sync!");
return sendSync(std::forward<T>(message), WTF::move(reply), messageSenderDestinationID(), timeout, syncSendFlags);
}
template<typename T>
bool sendSync(T&& message, typename T::Reply&& reply, uint64_t destinationID, std::chrono::milliseconds timeout = std::chrono::milliseconds::max(), unsigned syncSendFlags = 0)
{
ASSERT(messageSenderConnection());
return messageSenderConnection()->sendSync(WTF::move(message), WTF::move(reply), destinationID, timeout, syncSendFlags);
}
virtual bool sendMessage(std::unique_ptr<MessageEncoder>, unsigned messageSendFlags);
private:
virtual Connection* messageSenderConnection() = 0;
virtual uint64_t messageSenderDestinationID() = 0;
};
}
#endif // MessageSender_h