IPC::Message -> base::Pickle
This changes consumers of IPC::Message to generally refer
refer to base::Pickle instead when performing serialization
and deserialization operations. The few specific instances
where the IPC::Message interface (Read/WriteAttachent) is
needed can safely be static_cast'd, as IPC::Message is the
only public subclass of base::Pickle.
The purpose of this change is to facilitate the transition
to Mojo IPC, as we've trained the Mojo bindings layer to
use existing ParamTraits<T> parameterized over base::Pickle.
To support this base::Pickle has had some stub interfaces
added for WriteAttachment and ReadAttachment, along with a
Pickle::Attachment.
A follow-up patch will add sizing traits to the standard
IPC_STRUCT macros, enabling the majority of Chrome IPC
structs to be carried over Mojo message pipes as-is.
BUG=577685
R=jam@chromium.org
Review URL: https://codereview.chromium.org/1659003003
Cr-Commit-Position: refs/heads/master@{#373323}
CrOS-Libchrome-Original-Commit: 502c94ff1a9f99b5c4ecfe700415cc4ed14228dd
diff --git a/ipc/ipc_message_utils.cc b/ipc/ipc_message_utils.cc
index 277c2ff..6c829c2 100644
--- a/ipc/ipc_message_utils.cc
+++ b/ipc/ipc_message_utils.cc
@@ -67,12 +67,12 @@
#endif
}
-bool ReadValue(const Message* m,
+bool ReadValue(const base::Pickle* m,
base::PickleIterator* iter,
base::Value** value,
int recursion);
-void WriteValue(Message* m, const base::Value* value, int recursion) {
+void WriteValue(base::Pickle* m, const base::Value* value, int recursion) {
bool result;
if (recursion > kMaxRecursionDepth) {
LOG(WARNING) << "Max recursion depth hit in WriteValue.";
@@ -145,7 +145,7 @@
// Helper for ReadValue that reads a DictionaryValue into a pre-allocated
// object.
-bool ReadDictionaryValue(const Message* m,
+bool ReadDictionaryValue(const base::Pickle* m,
base::PickleIterator* iter,
base::DictionaryValue* value,
int recursion) {
@@ -167,7 +167,7 @@
// Helper for ReadValue that reads a ReadListValue into a pre-allocated
// object.
-bool ReadListValue(const Message* m,
+bool ReadListValue(const base::Pickle* m,
base::PickleIterator* iter,
base::ListValue* value,
int recursion) {
@@ -185,7 +185,7 @@
return true;
}
-bool ReadValue(const Message* m,
+bool ReadValue(const base::Pickle* m,
base::PickleIterator* iter,
base::Value** value,
int recursion) {
@@ -278,13 +278,13 @@
l->append(p ? "true" : "false");
}
-void ParamTraits<signed char>::Write(Message* m, const param_type& p) {
+void ParamTraits<signed char>::Write(base::Pickle* m, const param_type& p) {
m->WriteBytes(&p, sizeof(param_type));
}
-bool ParamTraits<signed char>::Read(const Message* m,
- base::PickleIterator* iter,
- param_type* r) {
+bool ParamTraits<signed char>::Read(const base::Pickle* m,
+ base::PickleIterator* iter,
+ param_type* r) {
const char* data;
if (!iter->ReadBytes(&data, sizeof(param_type)))
return false;
@@ -296,11 +296,11 @@
l->append(base::IntToString(p));
}
-void ParamTraits<unsigned char>::Write(Message* m, const param_type& p) {
+void ParamTraits<unsigned char>::Write(base::Pickle* m, const param_type& p) {
m->WriteBytes(&p, sizeof(param_type));
}
-bool ParamTraits<unsigned char>::Read(const Message* m,
+bool ParamTraits<unsigned char>::Read(const base::Pickle* m,
base::PickleIterator* iter,
param_type* r) {
const char* data;
@@ -314,11 +314,11 @@
l->append(base::UintToString(p));
}
-void ParamTraits<unsigned short>::Write(Message* m, const param_type& p) {
+void ParamTraits<unsigned short>::Write(base::Pickle* m, const param_type& p) {
m->WriteBytes(&p, sizeof(param_type));
}
-bool ParamTraits<unsigned short>::Read(const Message* m,
+bool ParamTraits<unsigned short>::Read(const base::Pickle* m,
base::PickleIterator* iter,
param_type* r) {
const char* data;
@@ -360,11 +360,11 @@
l->append(base::StringPrintf("%e", p));
}
-void ParamTraits<double>::Write(Message* m, const param_type& p) {
+void ParamTraits<double>::Write(base::Pickle* m, const param_type& p) {
m->WriteBytes(reinterpret_cast<const char*>(&p), sizeof(param_type));
}
-bool ParamTraits<double>::Read(const Message* m,
+bool ParamTraits<double>::Read(const base::Pickle* m,
base::PickleIterator* iter,
param_type* r) {
const char *data;
@@ -389,7 +389,8 @@
l->append(base::UTF16ToUTF8(p));
}
-void ParamTraits<std::vector<char> >::Write(Message* m, const param_type& p) {
+void ParamTraits<std::vector<char>>::Write(base::Pickle* m,
+ const param_type& p) {
if (p.empty()) {
m->WriteData(NULL, 0);
} else {
@@ -397,7 +398,7 @@
}
}
-bool ParamTraits<std::vector<char>>::Read(const Message* m,
+bool ParamTraits<std::vector<char>>::Read(const base::Pickle* m,
base::PickleIterator* iter,
param_type* r) {
const char *data;
@@ -414,8 +415,8 @@
LogBytes(p, l);
}
-void ParamTraits<std::vector<unsigned char> >::Write(Message* m,
- const param_type& p) {
+void ParamTraits<std::vector<unsigned char>>::Write(base::Pickle* m,
+ const param_type& p) {
if (p.empty()) {
m->WriteData(NULL, 0);
} else {
@@ -424,7 +425,7 @@
}
}
-bool ParamTraits<std::vector<unsigned char>>::Read(const Message* m,
+bool ParamTraits<std::vector<unsigned char>>::Read(const base::Pickle* m,
base::PickleIterator* iter,
param_type* r) {
const char *data;
@@ -442,7 +443,8 @@
LogBytes(p, l);
}
-void ParamTraits<std::vector<bool> >::Write(Message* m, const param_type& p) {
+void ParamTraits<std::vector<bool>>::Write(base::Pickle* m,
+ const param_type& p) {
WriteParam(m, static_cast<int>(p.size()));
// Cast to bool below is required because libc++'s
// vector<bool>::const_reference is different from bool, and we want to avoid
@@ -451,7 +453,7 @@
WriteParam(m, static_cast<bool>(p[i]));
}
-bool ParamTraits<std::vector<bool>>::Read(const Message* m,
+bool ParamTraits<std::vector<bool>>::Read(const base::Pickle* m,
base::PickleIterator* iter,
param_type* r) {
int size;
@@ -477,13 +479,13 @@
}
void ParamTraits<BrokerableAttachment::AttachmentId>::Write(
- Message* m,
+ base::Pickle* m,
const param_type& p) {
m->WriteBytes(p.nonce, BrokerableAttachment::kNonceSize);
}
bool ParamTraits<BrokerableAttachment::AttachmentId>::Read(
- const Message* m,
+ const base::Pickle* m,
base::PickleIterator* iter,
param_type* r) {
const char* data;
@@ -498,12 +500,12 @@
l->append(base::HexEncode(p.nonce, BrokerableAttachment::kNonceSize));
}
-void ParamTraits<base::DictionaryValue>::Write(Message* m,
+void ParamTraits<base::DictionaryValue>::Write(base::Pickle* m,
const param_type& p) {
WriteValue(m, &p, 0);
}
-bool ParamTraits<base::DictionaryValue>::Read(const Message* m,
+bool ParamTraits<base::DictionaryValue>::Read(const base::Pickle* m,
base::PickleIterator* iter,
param_type* r) {
int type;
@@ -521,7 +523,8 @@
}
#if defined(OS_POSIX)
-void ParamTraits<base::FileDescriptor>::Write(Message* m, const param_type& p) {
+void ParamTraits<base::FileDescriptor>::Write(base::Pickle* m,
+ const param_type& p) {
const bool valid = p.fd >= 0;
WriteParam(m, valid);
@@ -538,7 +541,7 @@
}
}
-bool ParamTraits<base::FileDescriptor>::Read(const Message* m,
+bool ParamTraits<base::FileDescriptor>::Read(const base::Pickle* m,
base::PickleIterator* iter,
param_type* r) {
*r = base::FileDescriptor();
@@ -551,11 +554,13 @@
if (!valid)
return true;
- scoped_refptr<MessageAttachment> attachment;
+ scoped_refptr<base::Pickle::Attachment> attachment;
if (!m->ReadAttachment(iter, &attachment))
return false;
- *r = base::FileDescriptor(attachment->TakePlatformFile(), true);
+ *r = base::FileDescriptor(
+ static_cast<MessageAttachment*>(attachment.get())->TakePlatformFile(),
+ true);
return true;
}
@@ -570,7 +575,7 @@
#endif // defined(OS_POSIX)
#if defined(OS_MACOSX) && !defined(OS_IOS)
-void ParamTraits<base::SharedMemoryHandle>::Write(Message* m,
+void ParamTraits<base::SharedMemoryHandle>::Write(base::Pickle* m,
const param_type& p) {
m->WriteInt(p.GetType());
@@ -595,7 +600,7 @@
}
}
-bool ParamTraits<base::SharedMemoryHandle>::Read(const Message* m,
+bool ParamTraits<base::SharedMemoryHandle>::Read(const base::Pickle* m,
base::PickleIterator* iter,
param_type* r) {
base::SharedMemoryHandle::TypeWireFormat type;
@@ -658,7 +663,7 @@
}
#elif defined(OS_WIN)
-void ParamTraits<base::SharedMemoryHandle>::Write(Message* m,
+void ParamTraits<base::SharedMemoryHandle>::Write(base::Pickle* m,
const param_type& p) {
m->WriteBool(p.NeedsBrokering());
@@ -675,7 +680,7 @@
}
}
-bool ParamTraits<base::SharedMemoryHandle>::Read(const Message* m,
+bool ParamTraits<base::SharedMemoryHandle>::Read(const base::Pickle* m,
base::PickleIterator* iter,
param_type* r) {
bool needs_brokering;
@@ -707,11 +712,11 @@
}
#endif // defined(OS_MACOSX) && !defined(OS_IOS)
-void ParamTraits<base::FilePath>::Write(Message* m, const param_type& p) {
+void ParamTraits<base::FilePath>::Write(base::Pickle* m, const param_type& p) {
p.WriteToPickle(m);
}
-bool ParamTraits<base::FilePath>::Read(const Message* m,
+bool ParamTraits<base::FilePath>::Read(const base::Pickle* m,
base::PickleIterator* iter,
param_type* r) {
return r->ReadFromPickle(iter);
@@ -721,11 +726,11 @@
ParamTraits<base::FilePath::StringType>::Log(p.value(), l);
}
-void ParamTraits<base::ListValue>::Write(Message* m, const param_type& p) {
+void ParamTraits<base::ListValue>::Write(base::Pickle* m, const param_type& p) {
WriteValue(m, &p, 0);
}
-bool ParamTraits<base::ListValue>::Read(const Message* m,
+bool ParamTraits<base::ListValue>::Read(const base::Pickle* m,
base::PickleIterator* iter,
param_type* r) {
int type;
@@ -741,13 +746,13 @@
l->append(json);
}
-void ParamTraits<base::NullableString16>::Write(Message* m,
+void ParamTraits<base::NullableString16>::Write(base::Pickle* m,
const param_type& p) {
WriteParam(m, p.string());
WriteParam(m, p.is_null());
}
-bool ParamTraits<base::NullableString16>::Read(const Message* m,
+bool ParamTraits<base::NullableString16>::Read(const base::Pickle* m,
base::PickleIterator* iter,
param_type* r) {
base::string16 string;
@@ -769,7 +774,7 @@
l->append(")");
}
-void ParamTraits<base::File::Info>::Write(Message* m,
+void ParamTraits<base::File::Info>::Write(base::Pickle* m,
const param_type& p) {
WriteParam(m, p.size);
WriteParam(m, p.is_directory);
@@ -778,7 +783,7 @@
WriteParam(m, p.creation_time.ToDoubleT());
}
-bool ParamTraits<base::File::Info>::Read(const Message* m,
+bool ParamTraits<base::File::Info>::Read(const base::Pickle* m,
base::PickleIterator* iter,
param_type* p) {
double last_modified, last_accessed, creation_time;
@@ -809,11 +814,11 @@
l->append(")");
}
-void ParamTraits<base::Time>::Write(Message* m, const param_type& p) {
+void ParamTraits<base::Time>::Write(base::Pickle* m, const param_type& p) {
ParamTraits<int64_t>::Write(m, p.ToInternalValue());
}
-bool ParamTraits<base::Time>::Read(const Message* m,
+bool ParamTraits<base::Time>::Read(const base::Pickle* m,
base::PickleIterator* iter,
param_type* r) {
int64_t value;
@@ -827,11 +832,11 @@
ParamTraits<int64_t>::Log(p.ToInternalValue(), l);
}
-void ParamTraits<base::TimeDelta>::Write(Message* m, const param_type& p) {
+void ParamTraits<base::TimeDelta>::Write(base::Pickle* m, const param_type& p) {
ParamTraits<int64_t>::Write(m, p.ToInternalValue());
}
-bool ParamTraits<base::TimeDelta>::Read(const Message* m,
+bool ParamTraits<base::TimeDelta>::Read(const base::Pickle* m,
base::PickleIterator* iter,
param_type* r) {
int64_t value;
@@ -846,11 +851,11 @@
ParamTraits<int64_t>::Log(p.ToInternalValue(), l);
}
-void ParamTraits<base::TimeTicks>::Write(Message* m, const param_type& p) {
+void ParamTraits<base::TimeTicks>::Write(base::Pickle* m, const param_type& p) {
ParamTraits<int64_t>::Write(m, p.ToInternalValue());
}
-bool ParamTraits<base::TimeTicks>::Read(const Message* m,
+bool ParamTraits<base::TimeTicks>::Read(const base::Pickle* m,
base::PickleIterator* iter,
param_type* r) {
int64_t value;
@@ -865,7 +870,8 @@
ParamTraits<int64_t>::Log(p.ToInternalValue(), l);
}
-void ParamTraits<IPC::ChannelHandle>::Write(Message* m, const param_type& p) {
+void ParamTraits<IPC::ChannelHandle>::Write(base::Pickle* m,
+ const param_type& p) {
#if defined(OS_WIN)
// On Windows marshalling pipe handle is not supported.
DCHECK(p.pipe.handle == NULL);
@@ -876,7 +882,7 @@
#endif
}
-bool ParamTraits<IPC::ChannelHandle>::Read(const Message* m,
+bool ParamTraits<IPC::ChannelHandle>::Read(const base::Pickle* m,
base::PickleIterator* iter,
param_type* r) {
return ReadParam(m, iter, &r->name)
@@ -896,7 +902,7 @@
l->append(")");
}
-void ParamTraits<LogData>::Write(Message* m, const param_type& p) {
+void ParamTraits<LogData>::Write(base::Pickle* m, const param_type& p) {
WriteParam(m, p.channel);
WriteParam(m, p.routing_id);
WriteParam(m, p.type);
@@ -908,7 +914,7 @@
WriteParam(m, p.params);
}
-bool ParamTraits<LogData>::Read(const Message* m,
+bool ParamTraits<LogData>::Read(const base::Pickle* m,
base::PickleIterator* iter,
param_type* r) {
return
@@ -927,7 +933,7 @@
// Doesn't make sense to implement this!
}
-void ParamTraits<Message>::Write(Message* m, const Message& p) {
+void ParamTraits<Message>::Write(base::Pickle* m, const Message& p) {
#if defined(OS_POSIX)
// We don't serialize the file descriptors in the nested message, so there
// better not be any.
@@ -950,7 +956,7 @@
m->WriteData(p.payload(), static_cast<uint32_t>(p.payload_size()));
}
-bool ParamTraits<Message>::Read(const Message* m,
+bool ParamTraits<Message>::Read(const base::Pickle* m,
base::PickleIterator* iter,
Message* r) {
uint32_t routing_id, type, flags;
@@ -975,11 +981,11 @@
#if defined(OS_WIN)
// Note that HWNDs/HANDLE/HCURSOR/HACCEL etc are always 32 bits, even on 64
// bit systems. That's why we use the Windows macros to convert to 32 bits.
-void ParamTraits<HANDLE>::Write(Message* m, const param_type& p) {
+void ParamTraits<HANDLE>::Write(base::Pickle* m, const param_type& p) {
m->WriteInt(HandleToLong(p));
}
-bool ParamTraits<HANDLE>::Read(const Message* m,
+bool ParamTraits<HANDLE>::Read(const base::Pickle* m,
base::PickleIterator* iter,
param_type* r) {
int32_t temp;
@@ -993,11 +999,11 @@
l->append(base::StringPrintf("0x%p", p));
}
-void ParamTraits<LOGFONT>::Write(Message* m, const param_type& p) {
+void ParamTraits<LOGFONT>::Write(base::Pickle* m, const param_type& p) {
m->WriteData(reinterpret_cast<const char*>(&p), sizeof(LOGFONT));
}
-bool ParamTraits<LOGFONT>::Read(const Message* m,
+bool ParamTraits<LOGFONT>::Read(const base::Pickle* m,
base::PickleIterator* iter,
param_type* r) {
const char *data;
@@ -1018,11 +1024,11 @@
l->append(base::StringPrintf("<LOGFONT>"));
}
-void ParamTraits<MSG>::Write(Message* m, const param_type& p) {
+void ParamTraits<MSG>::Write(base::Pickle* m, const param_type& p) {
m->WriteData(reinterpret_cast<const char*>(&p), sizeof(MSG));
}
-bool ParamTraits<MSG>::Read(const Message* m,
+bool ParamTraits<MSG>::Read(const base::Pickle* m,
base::PickleIterator* iter,
param_type* r) {
const char *data;