#ifndef MessageSender_h
#define MessageSender_h
#include <wtf/Assertions.h>
#include "Connection.h"
namespace CoreIPC {
class MessageSender {
public:
virtual ~MessageSender();
template<typename U> bool send(const U& message)
{
return send(message, messageSenderDestinationID());
}
template<typename U> bool send(const U& message, uint64_t destinationID)
{
COMPILE_ASSERT(!U::isSync, AsyncMessageExpected);
OwnPtr<MessageEncoder> encoder = MessageEncoder::create(U::receiverName(), U::name(), destinationID);
encoder->encode(message);
return sendMessage(encoder.release());
}
template<typename U> bool sendSync(const U& message, const typename U::Reply& reply, double timeout = Connection::NoTimeout, unsigned syncSendFlags = 0)
{
COMPILE_ASSERT(U::isSync, SyncMessageExpected);
return sendSync(message, reply, messageSenderDestinationID(), timeout, syncSendFlags);
}
template<typename U> bool sendSync(const U& message, const typename U::Reply& reply, uint64_t destinationID, double timeout = Connection::NoTimeout, unsigned syncSendFlags = 0)
{
ASSERT(messageSenderConnection());
return messageSenderConnection()->sendSync(message, reply, destinationID, timeout, syncSendFlags);
}
bool sendMessage(PassOwnPtr<MessageEncoder>);
private:
virtual Connection* messageSenderConnection() = 0;
virtual uint64_t messageSenderDestinationID() = 0;
};
}
#endif // MessageSender_h