| // Copyright 2017 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef IPC_IPC_MESSAGE_PROTOBUF_UTILS_H_ |
| #define IPC_IPC_MESSAGE_PROTOBUF_UTILS_H_ |
| |
| #include"build/build_config.h" |
| |
| #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<classRepeatedFieldLike,classStorageType> |
| structRepeatedFieldParamTraits{ |
| typedefRepeatedFieldLike param_type; |
| staticvoidWrite(base::Pickle* m,const param_type& p){ |
| WriteParam(m, p.size()); |
| for(int i=0; i< p.size(); i++) |
| WriteParam(m, p.Get(i)); |
| } |
| staticboolRead(constbase::Pickle* m, |
| base::PickleIterator* iter, |
| param_type* r){ |
| size_t size; |
| if(!iter->ReadLength(&size)) |
| returnfalse; |
| // Avoid integer overflow / assertion failure in Reserve() function. |
| if(size> INT_MAX/sizeof(StorageType)) |
| returnfalse; |
| r->Reserve(size); |
| for(size_t i=0; i< size; i++){ |
| if(!ReadParam(m, iter, r->Add())) |
| returnfalse; |
| } |
| returntrue; |
| } |
| staticvoidLog(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> |
| structParamTraits<google::protobuf::RepeatedField<P>>: |
| RepeatedFieldParamTraits<google::protobuf::RepeatedField<P>, P>{}; |
| |
| template<class P> |
| structParamTraits<google::protobuf::RepeatedPtrField<P>>: |
| RepeatedFieldParamTraits<google::protobuf::RepeatedPtrField<P>,void*>{}; |
| |
| }// namespace IPC |
| |
| #endif// IPC_IPC_MESSAGE_PROTOBUF_UTILS_H_ |