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;