Index: ipc/ipc_message_repeated_field_utils.h |
diff --git a/ipc/ipc_message_repeated_field_utils.h b/ipc/ipc_message_repeated_field_utils.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..49416ed536637c3ae50d556c70d2eccf4b5ec5c9 |
--- /dev/null |
+++ b/ipc/ipc_message_repeated_field_utils.h |
@@ -0,0 +1,68 @@ |
+// Copyright 2017 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef IPC_IPC_MESSAGE_REPEATED_FIELD_UTILS_H_ |
+#define IPC_IPC_MESSAGE_REPEATED_FIELD_UTILS_H_ |
+ |
+#include "build/build_config.h" |
+ |
+#if defined(OS_NACL_NONSFI) |
+static_assert(false, |
+ "ipc_message_repeated_field_utils is not able to work with " |
+ "nacl_nonsfi configuration."); |
+#endif |
+ |
+#include "base/pickle.h" |
+#include "ipc/ipc_param_traits.h" |
+#include "ipc/ipc_message_utils.h" |
+#include "third_party/protobuf/src/google/protobuf/repeated_field.h" |
+ |
+namespace IPC { |
+ |
+template <template<class> class RepeatedFieldLike, class P> |
dcheng
2017/07/10 18:38:10
Is it important to include the template<class> her
Hzj_jie
2017/07/10 23:53:37
These two comments are conflict :)
If we prefer to
dcheng
2017/07/11 05:38:59
Hmm. I guess I don't really care if we Reserve().
Hzj_jie
2017/07/11 05:59:02
Why cannot we use base::Pickle::payload_size() to
|
+struct RepeatedFieldParamTraits { |
+ typedef RepeatedFieldLike<P> param_type; |
+ static void GetSize(base::PickleSizer* sizer, const param_type& p) { |
+ GetParamSize(sizer, p.size()); |
+ for (int i = 0; i < p.size(); i++) |
+ GetParamSize(sizer, p.Get(i)); |
+ } |
+ static void Write(base::Pickle* m, const param_type& p) { |
+ WriteParam(m, p.size()); |
+ for (int i = 0; i < p.size(); i++) |
+ WriteParam(m, p.Get(i)); |
+ } |
+ static bool Read(const base::Pickle* m, |
+ base::PickleIterator* iter, |
+ param_type* r) { |
+ int size; |
+ // ReadLength() checks for < 0 itself. |
+ if (!iter->ReadLength(&size)) |
+ return false; |
+ for (int i = 0; i < size; i++) { |
dcheng
2017/07/10 18:38:10
Nit: let's keep the original logic to do bounds ch
Hzj_jie
2017/07/10 23:53:37
Done.
|
+ if (!ReadParam(m, iter, r->Add())) |
+ return false; |
+ } |
+ return true; |
+ } |
+ static void Log(const param_type& p, std::string* l) { |
+ for (int i = 0; i < p.size(); ++i) { |
+ if (i != 0) |
+ l->append(" "); |
+ LogParam(p.Get(i), l); |
+ } |
+ } |
+}; |
+ |
+template <class P> |
+struct ParamTraits<google::protobuf::RepeatedField<P>> : |
+ RepeatedFieldParamTraits<google::protobuf::RepeatedField, P> {}; |
+ |
+template <class P> |
+struct ParamTraits<google::protobuf::RepeatedPtrField<P>> : |
+ RepeatedFieldParamTraits<google::protobuf::RepeatedPtrField, P> {}; |
+ |
+} // namespace IPC |
+ |
+#endif // IPC_IPC_MESSAGE_REPEATED_FIELD_UTILS_H_ |