Index: ipc/ipc_message_utils.h |
diff --git a/ipc/ipc_message_utils.h b/ipc/ipc_message_utils.h |
index 5654e75683225086252483f51c8aac5eac7a0cd3..d8b660740d8b67d1c739efe44be20c950a1f153b 100644 |
--- a/ipc/ipc_message_utils.h |
+++ b/ipc/ipc_message_utils.h |
@@ -100,6 +100,12 @@ struct NoParams { |
}; |
template <class P> |
+static inline void GetParamSize(base::PickleSizer* sizer, const P& p) { |
+ typedef typename SimilarTypeTraits<P>::Type Type; |
+ ParamTraits<Type>::GetSize(sizer, static_cast<const Type&>(p)); |
+} |
+ |
+template <class P> |
static inline void WriteParam(base::Pickle* m, const P& p) { |
typedef typename SimilarTypeTraits<P>::Type Type; |
ParamTraits<Type>::Write(m, static_cast<const Type& >(p)); |
@@ -124,6 +130,9 @@ static inline void LogParam(const P& p, std::string* l) { |
template <> |
struct ParamTraits<bool> { |
typedef bool param_type; |
+ static void GetSize(base::PickleSizer* sizer, const param_type& p) { |
+ sizer->AddBool(); |
+ } |
static void Write(base::Pickle* m, const param_type& p) { m->WriteBool(p); } |
static bool Read(const base::Pickle* m, |
base::PickleIterator* iter, |
@@ -136,6 +145,7 @@ struct ParamTraits<bool> { |
template <> |
struct IPC_EXPORT ParamTraits<signed char> { |
typedef signed char param_type; |
+ static void GetSize(base::PickleSizer* sizer, const param_type& p); |
static void Write(base::Pickle* m, const param_type& p); |
static bool Read(const base::Pickle* m, |
base::PickleIterator* iter, |
@@ -146,6 +156,7 @@ struct IPC_EXPORT ParamTraits<signed char> { |
template <> |
struct IPC_EXPORT ParamTraits<unsigned char> { |
typedef unsigned char param_type; |
+ static void GetSize(base::PickleSizer* sizer, const param_type& p); |
static void Write(base::Pickle* m, const param_type& p); |
static bool Read(const base::Pickle* m, |
base::PickleIterator* iter, |
@@ -156,6 +167,7 @@ struct IPC_EXPORT ParamTraits<unsigned char> { |
template <> |
struct IPC_EXPORT ParamTraits<unsigned short> { |
typedef unsigned short param_type; |
+ static void GetSize(base::PickleSizer* sizer, const param_type& p); |
static void Write(base::Pickle* m, const param_type& p); |
static bool Read(const base::Pickle* m, |
base::PickleIterator* iter, |
@@ -166,6 +178,9 @@ struct IPC_EXPORT ParamTraits<unsigned short> { |
template <> |
struct ParamTraits<int> { |
typedef int param_type; |
+ static void GetSize(base::PickleSizer* sizer, const param_type& p) { |
+ sizer->AddInt(); |
+ } |
static void Write(base::Pickle* m, const param_type& p) { m->WriteInt(p); } |
static bool Read(const base::Pickle* m, |
base::PickleIterator* iter, |
@@ -178,6 +193,9 @@ struct ParamTraits<int> { |
template <> |
struct ParamTraits<unsigned int> { |
typedef unsigned int param_type; |
+ static void GetSize(base::PickleSizer* sizer, const param_type& p) { |
+ sizer->AddInt(); |
+ } |
static void Write(base::Pickle* m, const param_type& p) { m->WriteInt(p); } |
static bool Read(const base::Pickle* m, |
base::PickleIterator* iter, |
@@ -190,6 +208,9 @@ struct ParamTraits<unsigned int> { |
template <> |
struct ParamTraits<long> { |
typedef long param_type; |
+ static void GetSize(base::PickleSizer* sizer, const param_type& p) { |
+ sizer->AddLongUsingDangerousNonPortableLessPersistableForm(); |
+ } |
static void Write(base::Pickle* m, const param_type& p) { |
m->WriteLongUsingDangerousNonPortableLessPersistableForm(p); |
} |
@@ -204,6 +225,9 @@ struct ParamTraits<long> { |
template <> |
struct ParamTraits<unsigned long> { |
typedef unsigned long param_type; |
+ static void GetSize(base::PickleSizer* sizer, const param_type& p) { |
+ sizer->AddLongUsingDangerousNonPortableLessPersistableForm(); |
+ } |
static void Write(base::Pickle* m, const param_type& p) { |
m->WriteLongUsingDangerousNonPortableLessPersistableForm(p); |
} |
@@ -218,6 +242,9 @@ struct ParamTraits<unsigned long> { |
template <> |
struct ParamTraits<long long> { |
typedef long long param_type; |
+ static void GetSize(base::PickleSizer* sizer, const param_type& p) { |
+ sizer->AddInt64(); |
+ } |
static void Write(base::Pickle* m, const param_type& p) { |
m->WriteInt64(static_cast<int64_t>(p)); |
} |
@@ -232,6 +259,9 @@ struct ParamTraits<long long> { |
template <> |
struct ParamTraits<unsigned long long> { |
typedef unsigned long long param_type; |
+ static void GetSize(base::PickleSizer* sizer, const param_type& p) { |
+ sizer->AddInt64(); |
+ } |
static void Write(base::Pickle* m, const param_type& p) { m->WriteInt64(p); } |
static bool Read(const base::Pickle* m, |
base::PickleIterator* iter, |
@@ -247,6 +277,9 @@ struct ParamTraits<unsigned long long> { |
template <> |
struct IPC_EXPORT ParamTraits<float> { |
typedef float param_type; |
+ static void GetSize(base::PickleSizer* sizer, const param_type& p) { |
+ sizer->AddFloat(); |
+ } |
static void Write(base::Pickle* m, const param_type& p) { m->WriteFloat(p); } |
static bool Read(const base::Pickle* m, |
base::PickleIterator* iter, |
@@ -259,6 +292,7 @@ struct IPC_EXPORT ParamTraits<float> { |
template <> |
struct IPC_EXPORT ParamTraits<double> { |
typedef double param_type; |
+ static void GetSize(base::PickleSizer* sizer, const param_type& p); |
static void Write(base::Pickle* m, const param_type& p); |
static bool Read(const base::Pickle* m, |
base::PickleIterator* iter, |
@@ -271,6 +305,9 @@ struct IPC_EXPORT ParamTraits<double> { |
template <> |
struct ParamTraits<std::string> { |
typedef std::string param_type; |
+ static void GetSize(base::PickleSizer* sizer, const param_type& p) { |
+ sizer->AddString(p); |
+ } |
static void Write(base::Pickle* m, const param_type& p) { m->WriteString(p); } |
static bool Read(const base::Pickle* m, |
base::PickleIterator* iter, |
@@ -283,6 +320,9 @@ struct ParamTraits<std::string> { |
template <> |
struct ParamTraits<base::string16> { |
typedef base::string16 param_type; |
+ static void GetSize(base::PickleSizer* sizer, const param_type& p) { |
+ sizer->AddString16(p); |
+ } |
static void Write(base::Pickle* m, const param_type& p) { |
m->WriteString16(p); |
} |
@@ -297,6 +337,7 @@ struct ParamTraits<base::string16> { |
template <> |
struct IPC_EXPORT ParamTraits<std::vector<char> > { |
typedef std::vector<char> param_type; |
+ static void GetSize(base::PickleSizer* sizer, const param_type& p); |
static void Write(base::Pickle* m, const param_type& p); |
static bool Read(const base::Pickle*, |
base::PickleIterator* iter, |
@@ -307,6 +348,7 @@ struct IPC_EXPORT ParamTraits<std::vector<char> > { |
template <> |
struct IPC_EXPORT ParamTraits<std::vector<unsigned char> > { |
typedef std::vector<unsigned char> param_type; |
+ static void GetSize(base::PickleSizer* sizer, const param_type& p); |
static void Write(base::Pickle* m, const param_type& p); |
static bool Read(const base::Pickle* m, |
base::PickleIterator* iter, |
@@ -317,6 +359,7 @@ struct IPC_EXPORT ParamTraits<std::vector<unsigned char> > { |
template <> |
struct IPC_EXPORT ParamTraits<std::vector<bool> > { |
typedef std::vector<bool> param_type; |
+ static void GetSize(base::PickleSizer* sizer, const param_type& p); |
static void Write(base::Pickle* m, const param_type& p); |
static bool Read(const base::Pickle* m, |
base::PickleIterator* iter, |
@@ -327,6 +370,11 @@ struct IPC_EXPORT ParamTraits<std::vector<bool> > { |
template <class P> |
struct ParamTraits<std::vector<P> > { |
typedef std::vector<P> param_type; |
+ static void GetSize(base::PickleSizer* sizer, const param_type& p) { |
+ GetParamSize(sizer, static_cast<int>(p.size())); |
+ for (size_t i = 0; i < p.size(); i++) |
+ GetParamSize(sizer, p[i]); |
+ } |
static void Write(base::Pickle* m, const param_type& p) { |
WriteParam(m, static_cast<int>(p.size())); |
for (size_t i = 0; i < p.size(); i++) |
@@ -361,6 +409,12 @@ struct ParamTraits<std::vector<P> > { |
template <class P> |
struct ParamTraits<std::set<P> > { |
typedef std::set<P> param_type; |
+ static void GetSize(base::PickleSizer* sizer, const param_type& p) { |
+ GetParamSize(sizer, static_cast<int>(p.size())); |
+ typename param_type::const_iterator iter; |
+ for (iter = p.begin(); iter != p.end(); ++iter) |
+ GetParamSize(sizer, *iter); |
+ } |
static void Write(base::Pickle* m, const param_type& p) { |
WriteParam(m, static_cast<int>(p.size())); |
typename param_type::const_iterator iter; |
@@ -389,6 +443,14 @@ struct ParamTraits<std::set<P> > { |
template <class K, class V, class C, class A> |
struct ParamTraits<std::map<K, V, C, A> > { |
typedef std::map<K, V, C, A> param_type; |
+ static void GetSize(base::PickleSizer* sizer, const param_type& p) { |
+ GetParamSize(sizer, static_cast<int>(p.size())); |
+ typename param_type::const_iterator iter; |
+ for (iter = p.begin(); iter != p.end(); ++iter) { |
+ GetParamSize(sizer, iter->first); |
+ GetParamSize(sizer, iter->second); |
+ } |
+ } |
static void Write(base::Pickle* m, const param_type& p) { |
WriteParam(m, static_cast<int>(p.size())); |
typename param_type::const_iterator iter; |
@@ -421,6 +483,10 @@ struct ParamTraits<std::map<K, V, C, A> > { |
template <class A, class B> |
struct ParamTraits<std::pair<A, B> > { |
typedef std::pair<A, B> param_type; |
+ static void GetSize(base::PickleSizer* sizer, const param_type& p) { |
+ GetParamSize(sizer, p.first); |
+ GetParamSize(sizer, p.second); |
+ } |
static void Write(base::Pickle* m, const param_type& p) { |
WriteParam(m, p.first); |
WriteParam(m, p.second); |
@@ -455,6 +521,7 @@ struct IPC_EXPORT ParamTraits<BrokerableAttachment::AttachmentId> { |
template <> |
struct IPC_EXPORT ParamTraits<base::DictionaryValue> { |
typedef base::DictionaryValue param_type; |
+ static void GetSize(base::PickleSizer* sizer, const param_type& p); |
static void Write(base::Pickle* m, const param_type& p); |
static bool Read(const base::Pickle* m, |
base::PickleIterator* iter, |
@@ -504,6 +571,7 @@ struct IPC_EXPORT ParamTraits<base::SharedMemoryHandle> { |
template <> |
struct IPC_EXPORT ParamTraits<base::FilePath> { |
typedef base::FilePath param_type; |
+ static void GetSize(base::PickleSizer* sizer, const param_type& p); |
static void Write(base::Pickle* m, const param_type& p); |
static bool Read(const base::Pickle* m, |
base::PickleIterator* iter, |
@@ -514,6 +582,7 @@ struct IPC_EXPORT ParamTraits<base::FilePath> { |
template <> |
struct IPC_EXPORT ParamTraits<base::ListValue> { |
typedef base::ListValue param_type; |
+ static void GetSize(base::PickleSizer* sizer, const param_type& p); |
static void Write(base::Pickle* m, const param_type& p); |
static bool Read(const base::Pickle* m, |
base::PickleIterator* iter, |
@@ -524,6 +593,7 @@ struct IPC_EXPORT ParamTraits<base::ListValue> { |
template <> |
struct IPC_EXPORT ParamTraits<base::NullableString16> { |
typedef base::NullableString16 param_type; |
+ static void GetSize(base::PickleSizer* sizer, const param_type& p); |
static void Write(base::Pickle* m, const param_type& p); |
static bool Read(const base::Pickle* m, |
base::PickleIterator* iter, |
@@ -534,6 +604,7 @@ struct IPC_EXPORT ParamTraits<base::NullableString16> { |
template <> |
struct IPC_EXPORT ParamTraits<base::File::Info> { |
typedef base::File::Info param_type; |
+ static void GetSize(base::PickleSizer* sizer, const param_type& p); |
static void Write(base::Pickle* m, const param_type& p); |
static bool Read(const base::Pickle* m, |
base::PickleIterator* iter, |
@@ -556,6 +627,7 @@ struct SimilarTypeTraits<HWND> { |
template <> |
struct IPC_EXPORT ParamTraits<base::Time> { |
typedef base::Time param_type; |
+ static void GetSize(base::PickleSizer* sizer, const param_type& p); |
static void Write(base::Pickle* m, const param_type& p); |
static bool Read(const base::Pickle* m, |
base::PickleIterator* iter, |
@@ -566,6 +638,7 @@ struct IPC_EXPORT ParamTraits<base::Time> { |
template <> |
struct IPC_EXPORT ParamTraits<base::TimeDelta> { |
typedef base::TimeDelta param_type; |
+ static void GetSize(base::PickleSizer* sizer, const param_type& p); |
static void Write(base::Pickle* m, const param_type& p); |
static bool Read(const base::Pickle* m, |
base::PickleIterator* iter, |
@@ -576,6 +649,7 @@ struct IPC_EXPORT ParamTraits<base::TimeDelta> { |
template <> |
struct IPC_EXPORT ParamTraits<base::TimeTicks> { |
typedef base::TimeTicks param_type; |
+ static void GetSize(base::PickleSizer* sizer, const param_type& p); |
static void Write(base::Pickle* m, const param_type& p); |
static bool Read(const base::Pickle* m, |
base::PickleIterator* iter, |
@@ -586,6 +660,7 @@ struct IPC_EXPORT ParamTraits<base::TimeTicks> { |
template <> |
struct ParamTraits<base::Tuple<>> { |
typedef base::Tuple<> param_type; |
+ static void GetSize(base::PickleSizer* sizer, const param_type& p) {} |
static void Write(base::Pickle* m, const param_type& p) {} |
static bool Read(const base::Pickle* m, |
base::PickleIterator* iter, |
@@ -599,6 +674,9 @@ struct ParamTraits<base::Tuple<>> { |
template <class A> |
struct ParamTraits<base::Tuple<A>> { |
typedef base::Tuple<A> param_type; |
+ static void GetSize(base::PickleSizer* sizer, const param_type& p) { |
+ GetParamSize(sizer, base::get<0>(p)); |
+ } |
static void Write(base::Pickle* m, const param_type& p) { |
WriteParam(m, base::get<0>(p)); |
} |
@@ -615,6 +693,10 @@ struct ParamTraits<base::Tuple<A>> { |
template <class A, class B> |
struct ParamTraits<base::Tuple<A, B>> { |
typedef base::Tuple<A, B> param_type; |
+ static void GetSize(base::PickleSizer* sizer, const param_type& p) { |
+ GetParamSize(sizer, base::get<0>(p)); |
+ GetParamSize(sizer, base::get<1>(p)); |
+ } |
static void Write(base::Pickle* m, const param_type& p) { |
WriteParam(m, base::get<0>(p)); |
WriteParam(m, base::get<1>(p)); |
@@ -635,6 +717,11 @@ struct ParamTraits<base::Tuple<A, B>> { |
template <class A, class B, class C> |
struct ParamTraits<base::Tuple<A, B, C>> { |
typedef base::Tuple<A, B, C> param_type; |
+ static void GetSize(base::PickleSizer* sizer, const param_type& p) { |
+ GetParamSize(sizer, base::get<0>(p)); |
+ GetParamSize(sizer, base::get<1>(p)); |
+ GetParamSize(sizer, base::get<2>(p)); |
+ } |
static void Write(base::Pickle* m, const param_type& p) { |
WriteParam(m, base::get<0>(p)); |
WriteParam(m, base::get<1>(p)); |
@@ -659,6 +746,12 @@ struct ParamTraits<base::Tuple<A, B, C>> { |
template <class A, class B, class C, class D> |
struct ParamTraits<base::Tuple<A, B, C, D>> { |
typedef base::Tuple<A, B, C, D> param_type; |
+ static void GetSize(base::PickleSizer* sizer, const param_type& p) { |
+ GetParamSize(sizer, base::get<0>(p)); |
+ GetParamSize(sizer, base::get<1>(p)); |
+ GetParamSize(sizer, base::get<2>(p)); |
+ GetParamSize(sizer, base::get<3>(p)); |
+ } |
static void Write(base::Pickle* m, const param_type& p) { |
WriteParam(m, base::get<0>(p)); |
WriteParam(m, base::get<1>(p)); |
@@ -687,6 +780,13 @@ struct ParamTraits<base::Tuple<A, B, C, D>> { |
template <class A, class B, class C, class D, class E> |
struct ParamTraits<base::Tuple<A, B, C, D, E>> { |
typedef base::Tuple<A, B, C, D, E> param_type; |
+ static void GetSize(base::PickleSizer* sizer, const param_type& p) { |
+ GetParamSize(sizer, base::get<0>(p)); |
+ GetParamSize(sizer, base::get<1>(p)); |
+ GetParamSize(sizer, base::get<2>(p)); |
+ GetParamSize(sizer, base::get<3>(p)); |
+ GetParamSize(sizer, base::get<4>(p)); |
+ } |
static void Write(base::Pickle* m, const param_type& p) { |
WriteParam(m, base::get<0>(p)); |
WriteParam(m, base::get<1>(p)); |
@@ -752,6 +852,11 @@ struct ParamTraits<ScopedVector<P> > { |
template <class P, size_t stack_capacity> |
struct ParamTraits<base::StackVector<P, stack_capacity> > { |
typedef base::StackVector<P, stack_capacity> param_type; |
+ static void GetSize(base::PickleSizer* sizer, const param_type& p) { |
+ GetParamSize(sizer, static_cast<int>(p->size())); |
+ for (size_t i = 0; i < p->size(); i++) |
+ GetParamSize(sizer, p[i]); |
+ } |
static void Write(base::Pickle* m, const param_type& p) { |
WriteParam(m, static_cast<int>(p->size())); |
for (size_t i = 0; i < p->size(); i++) |
@@ -792,6 +897,14 @@ struct ParamTraits<base::SmallMap<NormalMap, kArraySize, EqualKey, MapInit> > { |
typedef base::SmallMap<NormalMap, kArraySize, EqualKey, MapInit> param_type; |
typedef typename param_type::key_type K; |
typedef typename param_type::data_type V; |
+ static void GetSize(base::PickleSizer* sizer, const param_type& p) { |
+ GetParamSize(sizer, static_cast<int>(p.size())); |
+ typename param_type::const_iterator iter; |
+ for (iter = p.begin(); iter != p.end(); ++iter) { |
+ GetParamSize(sizer, iter->first); |
+ GetParamSize(sizer, iter->second); |
+ } |
+ } |
static void Write(base::Pickle* m, const param_type& p) { |
WriteParam(m, static_cast<int>(p.size())); |
typename param_type::const_iterator iter; |
@@ -824,6 +937,12 @@ struct ParamTraits<base::SmallMap<NormalMap, kArraySize, EqualKey, MapInit> > { |
template <class P> |
struct ParamTraits<scoped_ptr<P> > { |
typedef scoped_ptr<P> param_type; |
+ static void GetSize(base::PickleSizer* sizer, const param_type& p) { |
+ bool valid = !!p; |
+ GetParamSize(sizer, valid); |
+ if (valid) |
+ GetParamSize(sizer, *p); |
+ } |
static void Write(base::Pickle* m, const param_type& p) { |
bool valid = !!p; |
WriteParam(m, valid); |
@@ -875,6 +994,7 @@ struct IPC_EXPORT ParamTraits<IPC::ChannelHandle> { |
template <> |
struct IPC_EXPORT ParamTraits<LogData> { |
typedef LogData param_type; |
+ static void GetSize(base::PickleSizer* sizer, const param_type& p); |
static void Write(base::Pickle* m, const param_type& p); |
static bool Read(const base::Pickle* m, |
base::PickleIterator* iter, |
@@ -897,6 +1017,7 @@ struct IPC_EXPORT ParamTraits<Message> { |
template <> |
struct IPC_EXPORT ParamTraits<HANDLE> { |
typedef HANDLE param_type; |
+ static void GetSize(base::PickleSizer* sizer, const param_type& p); |
static void Write(base::Pickle* m, const param_type& p); |
static bool Read(const base::Pickle* m, |
base::PickleIterator* iter, |
@@ -907,6 +1028,7 @@ struct IPC_EXPORT ParamTraits<HANDLE> { |
template <> |
struct IPC_EXPORT ParamTraits<LOGFONT> { |
typedef LOGFONT param_type; |
+ static void GetSize(base::PickleSizer* sizer, const param_type& p); |
static void Write(base::Pickle* m, const param_type& p); |
static bool Read(const base::Pickle* m, |
base::PickleIterator* iter, |
@@ -917,6 +1039,7 @@ struct IPC_EXPORT ParamTraits<LOGFONT> { |
template <> |
struct IPC_EXPORT ParamTraits<MSG> { |
typedef MSG param_type; |
+ static void GetSize(base::PickleSizer* sizer, const param_type& p); |
static void Write(base::Pickle* m, const param_type& p); |
static bool Read(const base::Pickle* m, |
base::PickleIterator* iter, |