xref: /aosp_15_r20/external/libchrome/ipc/ipc_mojo_param_traits.cc (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
1*635a8641SAndroid Build Coastguard Worker // Copyright 2015 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker 
5*635a8641SAndroid Build Coastguard Worker #include "ipc/ipc_mojo_param_traits.h"
6*635a8641SAndroid Build Coastguard Worker 
7*635a8641SAndroid Build Coastguard Worker #include "ipc/ipc_message_utils.h"
8*635a8641SAndroid Build Coastguard Worker #include "ipc/ipc_mojo_handle_attachment.h"
9*635a8641SAndroid Build Coastguard Worker #include "ipc/ipc_mojo_message_helper.h"
10*635a8641SAndroid Build Coastguard Worker 
11*635a8641SAndroid Build Coastguard Worker namespace IPC {
12*635a8641SAndroid Build Coastguard Worker 
Write(base::Pickle * m,const param_type & p)13*635a8641SAndroid Build Coastguard Worker void ParamTraits<mojo::MessagePipeHandle>::Write(base::Pickle* m,
14*635a8641SAndroid Build Coastguard Worker                                                  const param_type& p) {
15*635a8641SAndroid Build Coastguard Worker   WriteParam(m, p.is_valid());
16*635a8641SAndroid Build Coastguard Worker   if (p.is_valid())
17*635a8641SAndroid Build Coastguard Worker     MojoMessageHelper::WriteMessagePipeTo(m, mojo::ScopedMessagePipeHandle(p));
18*635a8641SAndroid Build Coastguard Worker }
19*635a8641SAndroid Build Coastguard Worker 
Read(const base::Pickle * m,base::PickleIterator * iter,param_type * r)20*635a8641SAndroid Build Coastguard Worker bool ParamTraits<mojo::MessagePipeHandle>::Read(const base::Pickle* m,
21*635a8641SAndroid Build Coastguard Worker                                                 base::PickleIterator* iter,
22*635a8641SAndroid Build Coastguard Worker                                                 param_type* r) {
23*635a8641SAndroid Build Coastguard Worker   bool is_valid;
24*635a8641SAndroid Build Coastguard Worker   if (!ReadParam(m, iter, &is_valid))
25*635a8641SAndroid Build Coastguard Worker     return false;
26*635a8641SAndroid Build Coastguard Worker   if (!is_valid)
27*635a8641SAndroid Build Coastguard Worker     return true;
28*635a8641SAndroid Build Coastguard Worker 
29*635a8641SAndroid Build Coastguard Worker   mojo::ScopedMessagePipeHandle handle;
30*635a8641SAndroid Build Coastguard Worker   if (!MojoMessageHelper::ReadMessagePipeFrom(m, iter, &handle))
31*635a8641SAndroid Build Coastguard Worker     return false;
32*635a8641SAndroid Build Coastguard Worker   DCHECK(handle.is_valid());
33*635a8641SAndroid Build Coastguard Worker   *r = handle.release();
34*635a8641SAndroid Build Coastguard Worker   return true;
35*635a8641SAndroid Build Coastguard Worker }
36*635a8641SAndroid Build Coastguard Worker 
Log(const param_type & p,std::string * l)37*635a8641SAndroid Build Coastguard Worker void ParamTraits<mojo::MessagePipeHandle>::Log(const param_type& p,
38*635a8641SAndroid Build Coastguard Worker                                                std::string* l) {
39*635a8641SAndroid Build Coastguard Worker   l->append("mojo::MessagePipeHandle(");
40*635a8641SAndroid Build Coastguard Worker   LogParam(p.value(), l);
41*635a8641SAndroid Build Coastguard Worker   l->append(")");
42*635a8641SAndroid Build Coastguard Worker }
43*635a8641SAndroid Build Coastguard Worker 
Write(base::Pickle * m,const param_type & p)44*635a8641SAndroid Build Coastguard Worker void ParamTraits<mojo::DataPipeConsumerHandle>::Write(base::Pickle* m,
45*635a8641SAndroid Build Coastguard Worker                                                       const param_type& p) {
46*635a8641SAndroid Build Coastguard Worker   WriteParam(m, p.is_valid());
47*635a8641SAndroid Build Coastguard Worker   if (!p.is_valid())
48*635a8641SAndroid Build Coastguard Worker     return;
49*635a8641SAndroid Build Coastguard Worker 
50*635a8641SAndroid Build Coastguard Worker   m->WriteAttachment(new internal::MojoHandleAttachment(
51*635a8641SAndroid Build Coastguard Worker       mojo::ScopedHandle::From(mojo::ScopedDataPipeConsumerHandle(p))));
52*635a8641SAndroid Build Coastguard Worker }
53*635a8641SAndroid Build Coastguard Worker 
Read(const base::Pickle * m,base::PickleIterator * iter,param_type * r)54*635a8641SAndroid Build Coastguard Worker bool ParamTraits<mojo::DataPipeConsumerHandle>::Read(const base::Pickle* m,
55*635a8641SAndroid Build Coastguard Worker                                                      base::PickleIterator* iter,
56*635a8641SAndroid Build Coastguard Worker                                                      param_type* r) {
57*635a8641SAndroid Build Coastguard Worker   bool is_valid;
58*635a8641SAndroid Build Coastguard Worker   if (!ReadParam(m, iter, &is_valid))
59*635a8641SAndroid Build Coastguard Worker     return false;
60*635a8641SAndroid Build Coastguard Worker   if (!is_valid)
61*635a8641SAndroid Build Coastguard Worker     return true;
62*635a8641SAndroid Build Coastguard Worker 
63*635a8641SAndroid Build Coastguard Worker   scoped_refptr<base::Pickle::Attachment> attachment;
64*635a8641SAndroid Build Coastguard Worker   if (!m->ReadAttachment(iter, &attachment)) {
65*635a8641SAndroid Build Coastguard Worker     DLOG(ERROR) << "Failed to read attachment for message pipe.";
66*635a8641SAndroid Build Coastguard Worker     return false;
67*635a8641SAndroid Build Coastguard Worker   }
68*635a8641SAndroid Build Coastguard Worker 
69*635a8641SAndroid Build Coastguard Worker   MessageAttachment::Type type =
70*635a8641SAndroid Build Coastguard Worker       static_cast<MessageAttachment*>(attachment.get())->GetType();
71*635a8641SAndroid Build Coastguard Worker   if (type != MessageAttachment::Type::MOJO_HANDLE) {
72*635a8641SAndroid Build Coastguard Worker     DLOG(ERROR) << "Unexpected attachment type:" << static_cast<int>(type);
73*635a8641SAndroid Build Coastguard Worker     return false;
74*635a8641SAndroid Build Coastguard Worker   }
75*635a8641SAndroid Build Coastguard Worker 
76*635a8641SAndroid Build Coastguard Worker   mojo::ScopedDataPipeConsumerHandle handle;
77*635a8641SAndroid Build Coastguard Worker   handle.reset(mojo::DataPipeConsumerHandle(
78*635a8641SAndroid Build Coastguard Worker       static_cast<internal::MojoHandleAttachment*>(attachment.get())
79*635a8641SAndroid Build Coastguard Worker           ->TakeHandle()
80*635a8641SAndroid Build Coastguard Worker           .release()
81*635a8641SAndroid Build Coastguard Worker           .value()));
82*635a8641SAndroid Build Coastguard Worker   DCHECK(handle.is_valid());
83*635a8641SAndroid Build Coastguard Worker   *r = handle.release();
84*635a8641SAndroid Build Coastguard Worker   return true;
85*635a8641SAndroid Build Coastguard Worker }
86*635a8641SAndroid Build Coastguard Worker 
Log(const param_type & p,std::string * l)87*635a8641SAndroid Build Coastguard Worker void ParamTraits<mojo::DataPipeConsumerHandle>::Log(const param_type& p,
88*635a8641SAndroid Build Coastguard Worker                                                     std::string* l) {
89*635a8641SAndroid Build Coastguard Worker   l->append("mojo::DataPipeConsumerHandle(");
90*635a8641SAndroid Build Coastguard Worker   LogParam(p.value(), l);
91*635a8641SAndroid Build Coastguard Worker   l->append(")");
92*635a8641SAndroid Build Coastguard Worker }
93*635a8641SAndroid Build Coastguard Worker 
94*635a8641SAndroid Build Coastguard Worker }  // namespace IPC
95