Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(464)

Unified Diff: ipc/ipc_message_utils.cc

Issue 1655333002: Add message sizing to basic IPC traits and struct macros. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@with-pickles
Patch Set: include ArrayHeader in size (oops!) and ensure the buffer doesn't relocate Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ipc/ipc_message_utils.h ('k') | ipc/ipc_message_utils_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ipc/ipc_message_utils.cc
diff --git a/ipc/ipc_message_utils.cc b/ipc/ipc_message_utils.cc
index 6c829c2d72a42602285cc19153df95a43ae51d2f..639ceddab7c6ebcc4d5088f4266b49f25eddaa4f 100644
--- a/ipc/ipc_message_utils.cc
+++ b/ipc/ipc_message_utils.cc
@@ -72,6 +72,65 @@ bool ReadValue(const base::Pickle* m,
base::Value** value,
int recursion);
+void GetValueSize(base::PickleSizer* sizer,
+ const base::Value* value,
+ int recursion) {
+ if (recursion > kMaxRecursionDepth) {
+ LOG(WARNING) << "Max recursion depth hit in GetValueSize.";
+ return;
+ }
+
+ sizer->AddInt();
+ switch (value->GetType()) {
+ case base::Value::TYPE_NULL:
+ break;
+ case base::Value::TYPE_BOOLEAN:
+ sizer->AddBool();
+ break;
+ case base::Value::TYPE_INTEGER:
+ sizer->AddInt();
+ break;
+ case base::Value::TYPE_DOUBLE:
+ sizer->AddDouble();
+ break;
+ case base::Value::TYPE_STRING: {
+ const base::StringValue* result;
+ value->GetAsString(&result);
+ DCHECK(result);
+ GetParamSize(sizer, result->GetString());
+ break;
+ }
+ case base::Value::TYPE_BINARY: {
+ const base::BinaryValue* binary =
+ static_cast<const base::BinaryValue*>(value);
+ sizer->AddData(static_cast<int>(binary->GetSize()));
+ break;
+ }
+ case base::Value::TYPE_DICTIONARY: {
+ sizer->AddInt();
+ const base::DictionaryValue* dict =
+ static_cast<const base::DictionaryValue*>(value);
+ for (base::DictionaryValue::Iterator it(*dict); !it.IsAtEnd();
+ it.Advance()) {
+ GetParamSize(sizer, it.key());
+ GetValueSize(sizer, &it.value(), recursion + 1);
+ }
+ break;
+ }
+ case base::Value::TYPE_LIST: {
+ sizer->AddInt();
+ const base::ListValue* list = static_cast<const base::ListValue*>(value);
+ for (base::ListValue::const_iterator it = list->begin();
+ it != list->end(); ++it) {
+ GetValueSize(sizer, *it, recursion + 1);
+ }
+ break;
+ }
+ default:
+ NOTREACHED() << "Invalid base::Value type.";
+ }
+}
+
void WriteValue(base::Pickle* m, const base::Value* value, int recursion) {
bool result;
if (recursion > kMaxRecursionDepth) {
@@ -278,6 +337,11 @@ void ParamTraits<bool>::Log(const param_type& p, std::string* l) {
l->append(p ? "true" : "false");
}
+void ParamTraits<signed char>::GetSize(base::PickleSizer* sizer,
+ const param_type& p) {
+ sizer->AddBytes(sizeof(param_type));
+}
+
void ParamTraits<signed char>::Write(base::Pickle* m, const param_type& p) {
m->WriteBytes(&p, sizeof(param_type));
}
@@ -296,6 +360,11 @@ void ParamTraits<signed char>::Log(const param_type& p, std::string* l) {
l->append(base::IntToString(p));
}
+void ParamTraits<unsigned char>::GetSize(base::PickleSizer* sizer,
+ const param_type& p) {
+ sizer->AddBytes(sizeof(param_type));
+}
+
void ParamTraits<unsigned char>::Write(base::Pickle* m, const param_type& p) {
m->WriteBytes(&p, sizeof(param_type));
}
@@ -314,6 +383,11 @@ void ParamTraits<unsigned char>::Log(const param_type& p, std::string* l) {
l->append(base::UintToString(p));
}
+void ParamTraits<unsigned short>::GetSize(base::PickleSizer* sizer,
+ const param_type& p) {
+ sizer->AddBytes(sizeof(param_type));
+}
+
void ParamTraits<unsigned short>::Write(base::Pickle* m, const param_type& p) {
m->WriteBytes(&p, sizeof(param_type));
}
@@ -360,6 +434,11 @@ void ParamTraits<float>::Log(const param_type& p, std::string* l) {
l->append(base::StringPrintf("%e", p));
}
+void ParamTraits<double>::GetSize(base::PickleSizer* sizer,
+ const param_type& p) {
+ sizer->AddBytes(sizeof(param_type));
+}
+
void ParamTraits<double>::Write(base::Pickle* m, const param_type& p) {
m->WriteBytes(reinterpret_cast<const char*>(&p), sizeof(param_type));
}
@@ -389,6 +468,11 @@ void ParamTraits<base::string16>::Log(const param_type& p, std::string* l) {
l->append(base::UTF16ToUTF8(p));
}
+void ParamTraits<std::vector<char>>::GetSize(base::PickleSizer* sizer,
+ const param_type& p) {
+ sizer->AddData(static_cast<int>(p.size()));
+}
+
void ParamTraits<std::vector<char>>::Write(base::Pickle* m,
const param_type& p) {
if (p.empty()) {
@@ -415,6 +499,11 @@ void ParamTraits<std::vector<char> >::Log(const param_type& p, std::string* l) {
LogBytes(p, l);
}
+void ParamTraits<std::vector<unsigned char>>::GetSize(base::PickleSizer* sizer,
+ const param_type& p) {
+ sizer->AddData(static_cast<int>(p.size()));
+}
+
void ParamTraits<std::vector<unsigned char>>::Write(base::Pickle* m,
const param_type& p) {
if (p.empty()) {
@@ -443,6 +532,13 @@ void ParamTraits<std::vector<unsigned char> >::Log(const param_type& p,
LogBytes(p, l);
}
+void ParamTraits<std::vector<bool>>::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, static_cast<bool>(p[i]));
+}
+
void ParamTraits<std::vector<bool>>::Write(base::Pickle* m,
const param_type& p) {
WriteParam(m, static_cast<int>(p.size()));
@@ -500,6 +596,11 @@ void ParamTraits<BrokerableAttachment::AttachmentId>::Log(const param_type& p,
l->append(base::HexEncode(p.nonce, BrokerableAttachment::kNonceSize));
}
+void ParamTraits<base::DictionaryValue>::GetSize(base::PickleSizer* sizer,
+ const param_type& p) {
+ GetValueSize(sizer, &p, 0);
+}
+
void ParamTraits<base::DictionaryValue>::Write(base::Pickle* m,
const param_type& p) {
WriteValue(m, &p, 0);
@@ -712,6 +813,11 @@ void ParamTraits<base::SharedMemoryHandle>::Log(const param_type& p,
}
#endif // defined(OS_MACOSX) && !defined(OS_IOS)
+void ParamTraits<base::FilePath>::GetSize(base::PickleSizer* sizer,
+ const param_type& p) {
+ p.GetSizeForPickle(sizer);
+}
+
void ParamTraits<base::FilePath>::Write(base::Pickle* m, const param_type& p) {
p.WriteToPickle(m);
}
@@ -726,6 +832,11 @@ void ParamTraits<base::FilePath>::Log(const param_type& p, std::string* l) {
ParamTraits<base::FilePath::StringType>::Log(p.value(), l);
}
+void ParamTraits<base::ListValue>::GetSize(base::PickleSizer* sizer,
+ const param_type& p) {
+ GetValueSize(sizer, &p, 0);
+}
+
void ParamTraits<base::ListValue>::Write(base::Pickle* m, const param_type& p) {
WriteValue(m, &p, 0);
}
@@ -746,6 +857,12 @@ void ParamTraits<base::ListValue>::Log(const param_type& p, std::string* l) {
l->append(json);
}
+void ParamTraits<base::NullableString16>::GetSize(base::PickleSizer* sizer,
+ const param_type& p) {
+ GetParamSize(sizer, p.string());
+ GetParamSize(sizer, p.is_null());
+}
+
void ParamTraits<base::NullableString16>::Write(base::Pickle* m,
const param_type& p) {
WriteParam(m, p.string());
@@ -774,6 +891,15 @@ void ParamTraits<base::NullableString16>::Log(const param_type& p,
l->append(")");
}
+void ParamTraits<base::File::Info>::GetSize(base::PickleSizer* sizer,
+ const param_type& p) {
+ GetParamSize(sizer, p.size);
+ GetParamSize(sizer, p.is_directory);
+ GetParamSize(sizer, p.last_modified.ToDoubleT());
+ GetParamSize(sizer, p.last_accessed.ToDoubleT());
+ GetParamSize(sizer, p.creation_time.ToDoubleT());
+}
+
void ParamTraits<base::File::Info>::Write(base::Pickle* m,
const param_type& p) {
WriteParam(m, p.size);
@@ -814,6 +940,11 @@ void ParamTraits<base::File::Info>::Log(const param_type& p,
l->append(")");
}
+void ParamTraits<base::Time>::GetSize(base::PickleSizer* sizer,
+ const param_type& p) {
+ sizer->AddInt64();
+}
+
void ParamTraits<base::Time>::Write(base::Pickle* m, const param_type& p) {
ParamTraits<int64_t>::Write(m, p.ToInternalValue());
}
@@ -832,6 +963,11 @@ void ParamTraits<base::Time>::Log(const param_type& p, std::string* l) {
ParamTraits<int64_t>::Log(p.ToInternalValue(), l);
}
+void ParamTraits<base::TimeDelta>::GetSize(base::PickleSizer* sizer,
+ const param_type& p) {
+ sizer->AddInt64();
+}
+
void ParamTraits<base::TimeDelta>::Write(base::Pickle* m, const param_type& p) {
ParamTraits<int64_t>::Write(m, p.ToInternalValue());
}
@@ -851,6 +987,11 @@ void ParamTraits<base::TimeDelta>::Log(const param_type& p, std::string* l) {
ParamTraits<int64_t>::Log(p.ToInternalValue(), l);
}
+void ParamTraits<base::TimeTicks>::GetSize(base::PickleSizer* sizer,
+ const param_type& p) {
+ sizer->AddInt64();
+}
+
void ParamTraits<base::TimeTicks>::Write(base::Pickle* m, const param_type& p) {
ParamTraits<int64_t>::Write(m, p.ToInternalValue());
}
@@ -902,6 +1043,19 @@ void ParamTraits<IPC::ChannelHandle>::Log(const param_type& p,
l->append(")");
}
+void ParamTraits<LogData>::GetSize(base::PickleSizer* sizer,
+ const param_type& p) {
+ GetParamSize(sizer, p.channel);
+ GetParamSize(sizer, p.routing_id);
+ GetParamSize(sizer, p.type);
+ GetParamSize(sizer, p.flags);
+ GetParamSize(sizer, p.sent);
+ GetParamSize(sizer, p.receive);
+ GetParamSize(sizer, p.dispatch);
+ GetParamSize(sizer, p.message_name);
+ GetParamSize(sizer, p.params);
+}
+
void ParamTraits<LogData>::Write(base::Pickle* m, const param_type& p) {
WriteParam(m, p.channel);
WriteParam(m, p.routing_id);
@@ -979,6 +1133,11 @@ void ParamTraits<Message>::Log(const Message& p, std::string* l) {
}
#if defined(OS_WIN)
+void ParamTraits<HANDLE>::GetSize(base::PickleSizer* sizer,
+ const param_type& p) {
+ sizer->AddInt();
+}
+
// 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(base::Pickle* m, const param_type& p) {
@@ -999,6 +1158,11 @@ void ParamTraits<HANDLE>::Log(const param_type& p, std::string* l) {
l->append(base::StringPrintf("0x%p", p));
}
+void ParamTraits<LOGFONT>::GetSize(base::PickleSizer* sizer,
+ const param_type& p) {
+ sizer->AddData(sizeof(LOGFONT));
+}
+
void ParamTraits<LOGFONT>::Write(base::Pickle* m, const param_type& p) {
m->WriteData(reinterpret_cast<const char*>(&p), sizeof(LOGFONT));
}
@@ -1024,6 +1188,10 @@ void ParamTraits<LOGFONT>::Log(const param_type& p, std::string* l) {
l->append(base::StringPrintf("<LOGFONT>"));
}
+void ParamTraits<MSG>::GetSize(base::PickleSizer* sizer, const param_type& p) {
+ sizer->AddData(sizeof(MSG));
+}
+
void ParamTraits<MSG>::Write(base::Pickle* m, const param_type& p) {
m->WriteData(reinterpret_cast<const char*>(&p), sizeof(MSG));
}
« no previous file with comments | « ipc/ipc_message_utils.h ('k') | ipc/ipc_message_utils_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698