| Index: ipc/ipc_message_utils.h
|
| diff --git a/ipc/ipc_message_utils.h b/ipc/ipc_message_utils.h
|
| index e1d4b4b25e3c2fb917afbcdd76327dd1c1d5ca1f..c941b2c5d34873f5530423a90d817a242c794453 100644
|
| --- a/ipc/ipc_message_utils.h
|
| +++ b/ipc/ipc_message_utils.h
|
| @@ -18,7 +18,7 @@
|
| #include "base/string16.h"
|
| #include "base/string_number_conversions.h"
|
| #include "base/string_util.h"
|
| -#include "base/time.h"
|
| +#include "base/utf_string_conversions.h"
|
| #include "base/tuple.h"
|
| #include "base/utf_string_conversions.h"
|
| #include "base/values.h"
|
| @@ -65,6 +65,13 @@ enum IPCMessageStart {
|
| LastMsgIndex
|
| };
|
|
|
| +class DictionaryValue;
|
| +class ListValue;
|
| +
|
| +namespace base {
|
| +class Time;
|
| +}
|
| +
|
| namespace IPC {
|
|
|
| //-----------------------------------------------------------------------------
|
| @@ -304,19 +311,9 @@ struct ParamTraits<wchar_t> {
|
| template <>
|
| struct ParamTraits<base::Time> {
|
| typedef base::Time param_type;
|
| - static void Write(Message* m, const param_type& p) {
|
| - ParamTraits<int64>::Write(m, p.ToInternalValue());
|
| - }
|
| - static bool Read(const Message* m, void** iter, param_type* r) {
|
| - int64 value;
|
| - if (!ParamTraits<int64>::Read(m, iter, &value))
|
| - return false;
|
| - *r = base::Time::FromInternalValue(value);
|
| - return true;
|
| - }
|
| - static void Log(const param_type& p, std::wstring* l) {
|
| - ParamTraits<int64>::Log(p.ToInternalValue(), l);
|
| - }
|
| + static void Write(Message* m, const param_type& p);
|
| + static bool Read(const Message* m, void** iter, param_type* r);
|
| + static void Log(const param_type& p, std::wstring* l);
|
| };
|
|
|
| #if defined(OS_WIN)
|
| @@ -363,6 +360,9 @@ struct ParamTraits<MSG> {
|
|
|
| return result;
|
| }
|
| + static void Log(const param_type& p, std::wstring* l) {
|
| + l->append(L"<MSG>");
|
| + }
|
| };
|
| #endif // defined(OS_WIN)
|
|
|
| @@ -1024,20 +1024,14 @@ template <class ParamType>
|
| class MessageWithTuple : public Message {
|
| public:
|
| typedef ParamType Param;
|
| - typedef typename ParamType::ParamTuple RefParam;
|
| + typedef typename TupleTypes<ParamType>::ParamTuple RefParam;
|
|
|
| - MessageWithTuple(int32 routing_id, uint32 type, const RefParam& p)
|
| - : Message(routing_id, type, PRIORITY_NORMAL) {
|
| - WriteParam(this, p);
|
| - }
|
| -
|
| - static bool Read(const Message* msg, Param* p) {
|
| - void* iter = NULL;
|
| - if (ReadParam(msg, &iter, p))
|
| - return true;
|
| - NOTREACHED() << "Error deserializing message " << msg->type();
|
| - return false;
|
| - }
|
| + // The constructor and the Read() method's templated implementations are in
|
| + // ipc_message_utils_impl.h. They subclass constructor and Log() methods call
|
| + // the templated versions of these and make sure there are instantiations in
|
| + // those translation units.
|
| + MessageWithTuple(int32 routing_id, uint32 type, const RefParam& p);
|
| + static bool Read(const Message* msg, Param* p);
|
|
|
| // Generic dispatcher. Should cover most cases.
|
| template<class T, class Method>
|
| @@ -1109,12 +1103,6 @@ class MessageWithTuple : public Message {
|
| return false;
|
| }
|
|
|
| - static void Log(const Message* msg, std::wstring* l) {
|
| - Param p;
|
| - if (Read(msg, &p))
|
| - LogParam(p, l);
|
| - }
|
| -
|
| // Functions used to do manual unpacking. Only used by the automation code,
|
| // these should go away once that code uses SyncChannel.
|
| template<typename TA, typename TB>
|
| @@ -1187,7 +1175,7 @@ template <class SendParamType, class ReplyParamType>
|
| class MessageWithReply : public SyncMessage {
|
| public:
|
| typedef SendParamType SendParam;
|
| - typedef typename SendParam::ParamTuple RefSendParam;
|
| + typedef typename TupleTypes<SendParam>::ParamTuple RefSendParam;
|
| typedef ReplyParamType ReplyParam;
|
|
|
| MessageWithReply(int32 routing_id, uint32 type,
|
| @@ -1214,7 +1202,7 @@ class MessageWithReply : public SyncMessage {
|
| } else {
|
| // This is an outgoing reply. Now that we have the output parameters, we
|
| // can finally log the message.
|
| - typename ReplyParam::ValueTuple p;
|
| + typename TupleTypes<ReplyParam>::ValueTuple p;
|
| void* iter = SyncMessage::GetDataIterator(msg);
|
| if (ReadParam(msg, &iter, &p))
|
| LogParam(p, l);
|
| @@ -1228,7 +1216,7 @@ class MessageWithReply : public SyncMessage {
|
| Message* reply = GenerateReply(msg);
|
| bool error;
|
| if (ReadParam(msg, &iter, &send_params)) {
|
| - typename ReplyParam::ValueTuple reply_params;
|
| + typename TupleTypes<ReplyParam>::ValueTuple reply_params;
|
| DispatchToMethod(obj, func, send_params, &reply_params);
|
| WriteParam(reply, reply_params);
|
| error = false;
|
|
|