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