1*6777b538SAndroid Build Coastguard Worker // Copyright 2017 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef IPC_IPC_MESSAGE_PROTOBUF_UTILS_H_ 6*6777b538SAndroid Build Coastguard Worker #define IPC_IPC_MESSAGE_PROTOBUF_UTILS_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h" 9*6777b538SAndroid Build Coastguard Worker 10*6777b538SAndroid Build Coastguard Worker #include "base/pickle.h" 11*6777b538SAndroid Build Coastguard Worker #include "ipc/ipc_param_traits.h" 12*6777b538SAndroid Build Coastguard Worker #include "ipc/ipc_message_utils.h" 13*6777b538SAndroid Build Coastguard Worker #include "third_party/protobuf/src/google/protobuf/repeated_field.h" 14*6777b538SAndroid Build Coastguard Worker 15*6777b538SAndroid Build Coastguard Worker namespace IPC { 16*6777b538SAndroid Build Coastguard Worker 17*6777b538SAndroid Build Coastguard Worker template <class RepeatedFieldLike, class StorageType> 18*6777b538SAndroid Build Coastguard Worker struct RepeatedFieldParamTraits { 19*6777b538SAndroid Build Coastguard Worker typedef RepeatedFieldLike param_type; WriteRepeatedFieldParamTraits20*6777b538SAndroid Build Coastguard Worker static void Write(base::Pickle* m, const param_type& p) { 21*6777b538SAndroid Build Coastguard Worker WriteParam(m, p.size()); 22*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < p.size(); i++) 23*6777b538SAndroid Build Coastguard Worker WriteParam(m, p.Get(i)); 24*6777b538SAndroid Build Coastguard Worker } ReadRepeatedFieldParamTraits25*6777b538SAndroid Build Coastguard Worker static bool Read(const base::Pickle* m, 26*6777b538SAndroid Build Coastguard Worker base::PickleIterator* iter, 27*6777b538SAndroid Build Coastguard Worker param_type* r) { 28*6777b538SAndroid Build Coastguard Worker size_t size; 29*6777b538SAndroid Build Coastguard Worker if (!iter->ReadLength(&size)) 30*6777b538SAndroid Build Coastguard Worker return false; 31*6777b538SAndroid Build Coastguard Worker // Avoid integer overflow / assertion failure in Reserve() function. 32*6777b538SAndroid Build Coastguard Worker if (size > INT_MAX / sizeof(StorageType)) 33*6777b538SAndroid Build Coastguard Worker return false; 34*6777b538SAndroid Build Coastguard Worker r->Reserve(size); 35*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < size; i++) { 36*6777b538SAndroid Build Coastguard Worker if (!ReadParam(m, iter, r->Add())) 37*6777b538SAndroid Build Coastguard Worker return false; 38*6777b538SAndroid Build Coastguard Worker } 39*6777b538SAndroid Build Coastguard Worker return true; 40*6777b538SAndroid Build Coastguard Worker } LogRepeatedFieldParamTraits41*6777b538SAndroid Build Coastguard Worker static void Log(const param_type& p, std::string* l) { 42*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < p.size(); ++i) { 43*6777b538SAndroid Build Coastguard Worker if (i != 0) 44*6777b538SAndroid Build Coastguard Worker l->append(" "); 45*6777b538SAndroid Build Coastguard Worker LogParam(p.Get(i), l); 46*6777b538SAndroid Build Coastguard Worker } 47*6777b538SAndroid Build Coastguard Worker } 48*6777b538SAndroid Build Coastguard Worker }; 49*6777b538SAndroid Build Coastguard Worker 50*6777b538SAndroid Build Coastguard Worker template <class P> 51*6777b538SAndroid Build Coastguard Worker struct ParamTraits<google::protobuf::RepeatedField<P>> : 52*6777b538SAndroid Build Coastguard Worker RepeatedFieldParamTraits<google::protobuf::RepeatedField<P>, P> {}; 53*6777b538SAndroid Build Coastguard Worker 54*6777b538SAndroid Build Coastguard Worker template <class P> 55*6777b538SAndroid Build Coastguard Worker struct ParamTraits<google::protobuf::RepeatedPtrField<P>> : 56*6777b538SAndroid Build Coastguard Worker RepeatedFieldParamTraits<google::protobuf::RepeatedPtrField<P>, void*> {}; 57*6777b538SAndroid Build Coastguard Worker 58*6777b538SAndroid Build Coastguard Worker } // namespace IPC 59*6777b538SAndroid Build Coastguard Worker 60*6777b538SAndroid Build Coastguard Worker #endif // IPC_IPC_MESSAGE_PROTOBUF_UTILS_H_ 61