xref: /aosp_15_r20/hardware/interfaces/tests/foo/1.0/default/Foo.cpp (revision 4d7e907c777eeecc4c5bd7cf640a754fac206ff7)
1*4d7e907cSAndroid Build Coastguard Worker 
2*4d7e907cSAndroid Build Coastguard Worker #define LOG_TAG "hidl_test"
3*4d7e907cSAndroid Build Coastguard Worker 
4*4d7e907cSAndroid Build Coastguard Worker #include "Foo.h"
5*4d7e907cSAndroid Build Coastguard Worker #include <android-base/logging.h>
6*4d7e907cSAndroid Build Coastguard Worker #include <hidl-test/FooHelper.h>
7*4d7e907cSAndroid Build Coastguard Worker #include <inttypes.h>
8*4d7e907cSAndroid Build Coastguard Worker #include <utils/Timers.h>
9*4d7e907cSAndroid Build Coastguard Worker 
10*4d7e907cSAndroid Build Coastguard Worker namespace android {
11*4d7e907cSAndroid Build Coastguard Worker namespace hardware {
12*4d7e907cSAndroid Build Coastguard Worker namespace tests {
13*4d7e907cSAndroid Build Coastguard Worker namespace foo {
14*4d7e907cSAndroid Build Coastguard Worker namespace V1_0 {
15*4d7e907cSAndroid Build Coastguard Worker namespace implementation {
16*4d7e907cSAndroid Build Coastguard Worker 
17*4d7e907cSAndroid Build Coastguard Worker // Methods from ::android::hardware::tests::foo::V1_0::IFoo follow.
convertToBoolIfSmall(Discriminator d,const hidl_vec<Union> & u,convertToBoolIfSmall_cb _hidl_cb)18*4d7e907cSAndroid Build Coastguard Worker Return<void> Foo::convertToBoolIfSmall(Discriminator d, const hidl_vec<Union>& u,
19*4d7e907cSAndroid Build Coastguard Worker                                        convertToBoolIfSmall_cb _hidl_cb) {
20*4d7e907cSAndroid Build Coastguard Worker     hidl_vec<ContainsUnion> res(u.size());
21*4d7e907cSAndroid Build Coastguard Worker     for (size_t i = 0; i < u.size(); i++) {
22*4d7e907cSAndroid Build Coastguard Worker         ContainsUnion& outValue = res[i];
23*4d7e907cSAndroid Build Coastguard Worker 
24*4d7e907cSAndroid Build Coastguard Worker         if (d == Discriminator::BOOL) {
25*4d7e907cSAndroid Build Coastguard Worker             outValue.discriminator = Discriminator::BOOL;
26*4d7e907cSAndroid Build Coastguard Worker             outValue.value.boolValue = u[i].boolValue;
27*4d7e907cSAndroid Build Coastguard Worker         } else {
28*4d7e907cSAndroid Build Coastguard Worker             uint64_t value = u[i].intValue;
29*4d7e907cSAndroid Build Coastguard Worker             if (value == 0 || value == 1) {
30*4d7e907cSAndroid Build Coastguard Worker                 outValue.discriminator = Discriminator::BOOL;
31*4d7e907cSAndroid Build Coastguard Worker                 outValue.value.boolValue = static_cast<bool>(value);
32*4d7e907cSAndroid Build Coastguard Worker             } else {
33*4d7e907cSAndroid Build Coastguard Worker                 outValue.discriminator = Discriminator::INT;
34*4d7e907cSAndroid Build Coastguard Worker                 outValue.value.intValue = value;
35*4d7e907cSAndroid Build Coastguard Worker             }
36*4d7e907cSAndroid Build Coastguard Worker         }
37*4d7e907cSAndroid Build Coastguard Worker     }
38*4d7e907cSAndroid Build Coastguard Worker     _hidl_cb(res);
39*4d7e907cSAndroid Build Coastguard Worker     return Void();
40*4d7e907cSAndroid Build Coastguard Worker }
41*4d7e907cSAndroid Build Coastguard Worker 
doThis(float param)42*4d7e907cSAndroid Build Coastguard Worker Return<void> Foo::doThis(float param) {
43*4d7e907cSAndroid Build Coastguard Worker     LOG(INFO) << "SERVER(Foo) doThis(" << param << ")";
44*4d7e907cSAndroid Build Coastguard Worker 
45*4d7e907cSAndroid Build Coastguard Worker     return Void();
46*4d7e907cSAndroid Build Coastguard Worker }
47*4d7e907cSAndroid Build Coastguard Worker 
doThatAndReturnSomething(int64_t param)48*4d7e907cSAndroid Build Coastguard Worker Return<int32_t> Foo::doThatAndReturnSomething(
49*4d7e907cSAndroid Build Coastguard Worker         int64_t param) {
50*4d7e907cSAndroid Build Coastguard Worker     LOG(INFO) << "SERVER(Foo) doThatAndReturnSomething(" << param << ")";
51*4d7e907cSAndroid Build Coastguard Worker 
52*4d7e907cSAndroid Build Coastguard Worker     return 666;
53*4d7e907cSAndroid Build Coastguard Worker }
54*4d7e907cSAndroid Build Coastguard Worker 
doQuiteABit(int32_t a,int64_t b,float c,double d)55*4d7e907cSAndroid Build Coastguard Worker Return<double> Foo::doQuiteABit(
56*4d7e907cSAndroid Build Coastguard Worker         int32_t a,
57*4d7e907cSAndroid Build Coastguard Worker         int64_t b,
58*4d7e907cSAndroid Build Coastguard Worker         float c,
59*4d7e907cSAndroid Build Coastguard Worker         double d) {
60*4d7e907cSAndroid Build Coastguard Worker     LOG(INFO) << "SERVER(Foo) doQuiteABit("
61*4d7e907cSAndroid Build Coastguard Worker               << a
62*4d7e907cSAndroid Build Coastguard Worker               << ", "
63*4d7e907cSAndroid Build Coastguard Worker               << b
64*4d7e907cSAndroid Build Coastguard Worker               << ", "
65*4d7e907cSAndroid Build Coastguard Worker               << c
66*4d7e907cSAndroid Build Coastguard Worker               << ", "
67*4d7e907cSAndroid Build Coastguard Worker               << d
68*4d7e907cSAndroid Build Coastguard Worker               << ")";
69*4d7e907cSAndroid Build Coastguard Worker 
70*4d7e907cSAndroid Build Coastguard Worker     return 666.5;
71*4d7e907cSAndroid Build Coastguard Worker }
72*4d7e907cSAndroid Build Coastguard Worker 
doSomethingElse(const hidl_array<int32_t,15> & param,doSomethingElse_cb _cb)73*4d7e907cSAndroid Build Coastguard Worker Return<void> Foo::doSomethingElse(
74*4d7e907cSAndroid Build Coastguard Worker         const hidl_array<int32_t, 15> &param, doSomethingElse_cb _cb) {
75*4d7e907cSAndroid Build Coastguard Worker     LOG(INFO) << "SERVER(Foo) doSomethingElse(...)";
76*4d7e907cSAndroid Build Coastguard Worker 
77*4d7e907cSAndroid Build Coastguard Worker     hidl_array<int32_t, 32> result;
78*4d7e907cSAndroid Build Coastguard Worker     for (size_t i = 0; i < 15; ++i) {
79*4d7e907cSAndroid Build Coastguard Worker         result[i] = 2 * param[i];
80*4d7e907cSAndroid Build Coastguard Worker         result[15 + i] = param[i];
81*4d7e907cSAndroid Build Coastguard Worker     }
82*4d7e907cSAndroid Build Coastguard Worker     result[30] = 1;
83*4d7e907cSAndroid Build Coastguard Worker     result[31] = 2;
84*4d7e907cSAndroid Build Coastguard Worker 
85*4d7e907cSAndroid Build Coastguard Worker     _cb(result);
86*4d7e907cSAndroid Build Coastguard Worker 
87*4d7e907cSAndroid Build Coastguard Worker     return Void();
88*4d7e907cSAndroid Build Coastguard Worker }
89*4d7e907cSAndroid Build Coastguard Worker 
doStuffAndReturnAString(doStuffAndReturnAString_cb _cb)90*4d7e907cSAndroid Build Coastguard Worker Return<void> Foo::doStuffAndReturnAString(
91*4d7e907cSAndroid Build Coastguard Worker         doStuffAndReturnAString_cb _cb) {
92*4d7e907cSAndroid Build Coastguard Worker     LOG(INFO) << "SERVER(Foo) doStuffAndReturnAString";
93*4d7e907cSAndroid Build Coastguard Worker 
94*4d7e907cSAndroid Build Coastguard Worker     _cb("Hello, world");
95*4d7e907cSAndroid Build Coastguard Worker 
96*4d7e907cSAndroid Build Coastguard Worker     return Void();
97*4d7e907cSAndroid Build Coastguard Worker }
98*4d7e907cSAndroid Build Coastguard Worker 
mapThisVector(const hidl_vec<int32_t> & param,mapThisVector_cb _cb)99*4d7e907cSAndroid Build Coastguard Worker Return<void> Foo::mapThisVector(
100*4d7e907cSAndroid Build Coastguard Worker         const hidl_vec<int32_t> &param, mapThisVector_cb _cb) {
101*4d7e907cSAndroid Build Coastguard Worker     LOG(INFO) << "SERVER(Foo) mapThisVector";
102*4d7e907cSAndroid Build Coastguard Worker 
103*4d7e907cSAndroid Build Coastguard Worker     hidl_vec<int32_t> out;
104*4d7e907cSAndroid Build Coastguard Worker     out.resize(param.size());
105*4d7e907cSAndroid Build Coastguard Worker 
106*4d7e907cSAndroid Build Coastguard Worker     for (size_t i = 0; i < out.size(); ++i) {
107*4d7e907cSAndroid Build Coastguard Worker         out[i] = param[i] * 2;
108*4d7e907cSAndroid Build Coastguard Worker     }
109*4d7e907cSAndroid Build Coastguard Worker 
110*4d7e907cSAndroid Build Coastguard Worker     _cb(out);
111*4d7e907cSAndroid Build Coastguard Worker 
112*4d7e907cSAndroid Build Coastguard Worker     return Void();
113*4d7e907cSAndroid Build Coastguard Worker }
114*4d7e907cSAndroid Build Coastguard Worker 
callMe(const sp<IFooCallback> & cb)115*4d7e907cSAndroid Build Coastguard Worker Return<void> Foo::callMe(
116*4d7e907cSAndroid Build Coastguard Worker         const sp<IFooCallback> &cb) {
117*4d7e907cSAndroid Build Coastguard Worker     LOG(INFO) << "SERVER(Foo) callMe " << cb.get();
118*4d7e907cSAndroid Build Coastguard Worker 
119*4d7e907cSAndroid Build Coastguard Worker     if (cb != NULL) {
120*4d7e907cSAndroid Build Coastguard Worker         hidl_array<nsecs_t, 3> c;
121*4d7e907cSAndroid Build Coastguard Worker         LOG(INFO) << "SERVER(Foo) callMe "
122*4d7e907cSAndroid Build Coastguard Worker                   << cb.get()
123*4d7e907cSAndroid Build Coastguard Worker                   << " calling IFooCallback::heyItsYou, should return immediately";
124*4d7e907cSAndroid Build Coastguard Worker         c[0] = systemTime();
125*4d7e907cSAndroid Build Coastguard Worker         cb->heyItsYou(cb);
126*4d7e907cSAndroid Build Coastguard Worker         c[0] = systemTime() - c[0];
127*4d7e907cSAndroid Build Coastguard Worker         LOG(INFO) << "SERVER(Foo) callMe "
128*4d7e907cSAndroid Build Coastguard Worker                   << cb.get()
129*4d7e907cSAndroid Build Coastguard Worker                   << " calling IFooCallback::heyItsYou, returned after"
130*4d7e907cSAndroid Build Coastguard Worker                   << c[0]
131*4d7e907cSAndroid Build Coastguard Worker                   << "ns";
132*4d7e907cSAndroid Build Coastguard Worker         LOG(INFO) << "SERVER(Foo) callMe "
133*4d7e907cSAndroid Build Coastguard Worker                   << cb.get()
134*4d7e907cSAndroid Build Coastguard Worker                   << " calling IFooCallback::heyItsYouIsntIt, should block for"
135*4d7e907cSAndroid Build Coastguard Worker                   << DELAY_S
136*4d7e907cSAndroid Build Coastguard Worker                   << " seconds";
137*4d7e907cSAndroid Build Coastguard Worker         c[1] = systemTime();
138*4d7e907cSAndroid Build Coastguard Worker         bool answer = cb->heyItsYouIsntIt(cb);
139*4d7e907cSAndroid Build Coastguard Worker         c[1] = systemTime() - c[1];
140*4d7e907cSAndroid Build Coastguard Worker 
141*4d7e907cSAndroid Build Coastguard Worker         LOG(INFO) << "SERVER(Foo) callMe "
142*4d7e907cSAndroid Build Coastguard Worker                   << cb.get()
143*4d7e907cSAndroid Build Coastguard Worker                   << " calling IFooCallback::heyItsYouIsntIt, responded with "
144*4d7e907cSAndroid Build Coastguard Worker                   << answer
145*4d7e907cSAndroid Build Coastguard Worker                   << " after "
146*4d7e907cSAndroid Build Coastguard Worker                   << c[1]
147*4d7e907cSAndroid Build Coastguard Worker                   << "ns";
148*4d7e907cSAndroid Build Coastguard Worker 
149*4d7e907cSAndroid Build Coastguard Worker         LOG(INFO) << "SERVER(Foo) callMe "
150*4d7e907cSAndroid Build Coastguard Worker                   << cb.get()
151*4d7e907cSAndroid Build Coastguard Worker                   << " calling IFooCallback::heyItsTheMeaningOfLife,"
152*4d7e907cSAndroid Build Coastguard Worker                   << " should return immediately";
153*4d7e907cSAndroid Build Coastguard Worker         c[2] = systemTime();
154*4d7e907cSAndroid Build Coastguard Worker         cb->heyItsTheMeaningOfLife(42);
155*4d7e907cSAndroid Build Coastguard Worker         c[2] = systemTime() - c[2];
156*4d7e907cSAndroid Build Coastguard Worker 
157*4d7e907cSAndroid Build Coastguard Worker         LOG(INFO) << "SERVER(Foo) callMe "
158*4d7e907cSAndroid Build Coastguard Worker                   << cb.get()
159*4d7e907cSAndroid Build Coastguard Worker                   << " cAfter call to IFooCallback::heyItsTheMeaningOfLife responded after "
160*4d7e907cSAndroid Build Coastguard Worker                   << c[2]
161*4d7e907cSAndroid Build Coastguard Worker                   << "ns";
162*4d7e907cSAndroid Build Coastguard Worker         LOG(INFO) << "SERVER(Foo) callMe "
163*4d7e907cSAndroid Build Coastguard Worker                   << cb.get()
164*4d7e907cSAndroid Build Coastguard Worker                   << " calling IFooCallback::youBlockedMeFor to report times";
165*4d7e907cSAndroid Build Coastguard Worker         cb->youBlockedMeFor(c);
166*4d7e907cSAndroid Build Coastguard Worker         LOG(INFO) << "SERVER(Foo) callMe "
167*4d7e907cSAndroid Build Coastguard Worker                   << cb.get()
168*4d7e907cSAndroid Build Coastguard Worker                   << " After call to IFooCallback::youBlockedMeFor";
169*4d7e907cSAndroid Build Coastguard Worker     }
170*4d7e907cSAndroid Build Coastguard Worker 
171*4d7e907cSAndroid Build Coastguard Worker     return Void();
172*4d7e907cSAndroid Build Coastguard Worker }
173*4d7e907cSAndroid Build Coastguard Worker 
useAnEnum(SomeEnum param)174*4d7e907cSAndroid Build Coastguard Worker Return<Foo::SomeEnum> Foo::useAnEnum(SomeEnum param) {
175*4d7e907cSAndroid Build Coastguard Worker     LOG(INFO) << "SERVER(Foo) useAnEnum " << (int)param;
176*4d7e907cSAndroid Build Coastguard Worker 
177*4d7e907cSAndroid Build Coastguard Worker     return SomeEnum::goober;
178*4d7e907cSAndroid Build Coastguard Worker }
179*4d7e907cSAndroid Build Coastguard Worker 
haveAGooberVec(const hidl_vec<Goober> & param)180*4d7e907cSAndroid Build Coastguard Worker Return<void> Foo::haveAGooberVec(const hidl_vec<Goober>& param) {
181*4d7e907cSAndroid Build Coastguard Worker     LOG(INFO) << "SERVER(Foo) haveAGooberVec &param = " << &param;
182*4d7e907cSAndroid Build Coastguard Worker 
183*4d7e907cSAndroid Build Coastguard Worker     return Void();
184*4d7e907cSAndroid Build Coastguard Worker }
185*4d7e907cSAndroid Build Coastguard Worker 
haveAGoober(const Goober & g)186*4d7e907cSAndroid Build Coastguard Worker Return<void> Foo::haveAGoober(const Goober &g) {
187*4d7e907cSAndroid Build Coastguard Worker     LOG(INFO) << "SERVER(Foo) haveaGoober g=" << &g;
188*4d7e907cSAndroid Build Coastguard Worker 
189*4d7e907cSAndroid Build Coastguard Worker     return Void();
190*4d7e907cSAndroid Build Coastguard Worker }
191*4d7e907cSAndroid Build Coastguard Worker 
haveAGooberArray(const hidl_array<Goober,20> &)192*4d7e907cSAndroid Build Coastguard Worker Return<void> Foo::haveAGooberArray(const hidl_array<Goober, 20> & /* lots */) {
193*4d7e907cSAndroid Build Coastguard Worker     LOG(INFO) << "SERVER(Foo) haveAGooberArray";
194*4d7e907cSAndroid Build Coastguard Worker 
195*4d7e907cSAndroid Build Coastguard Worker     return Void();
196*4d7e907cSAndroid Build Coastguard Worker }
197*4d7e907cSAndroid Build Coastguard Worker 
haveATypeFromAnotherFile(const Abc & def)198*4d7e907cSAndroid Build Coastguard Worker Return<void> Foo::haveATypeFromAnotherFile(const Abc &def) {
199*4d7e907cSAndroid Build Coastguard Worker     LOG(INFO) << "SERVER(Foo) haveATypeFromAnotherFile def=" << &def;
200*4d7e907cSAndroid Build Coastguard Worker 
201*4d7e907cSAndroid Build Coastguard Worker     return Void();
202*4d7e907cSAndroid Build Coastguard Worker }
203*4d7e907cSAndroid Build Coastguard Worker 
haveSomeStrings(const hidl_array<hidl_string,3> & array,haveSomeStrings_cb _cb)204*4d7e907cSAndroid Build Coastguard Worker Return<void> Foo::haveSomeStrings(
205*4d7e907cSAndroid Build Coastguard Worker         const hidl_array<hidl_string, 3> &array,
206*4d7e907cSAndroid Build Coastguard Worker         haveSomeStrings_cb _cb) {
207*4d7e907cSAndroid Build Coastguard Worker 
208*4d7e907cSAndroid Build Coastguard Worker     LOG(INFO) << "SERVER(Foo) haveSomeStrings([\""
209*4d7e907cSAndroid Build Coastguard Worker               << array[0].c_str()
210*4d7e907cSAndroid Build Coastguard Worker               << "\", \""
211*4d7e907cSAndroid Build Coastguard Worker               << array[1].c_str()
212*4d7e907cSAndroid Build Coastguard Worker               << "\", \""
213*4d7e907cSAndroid Build Coastguard Worker               << array[2].c_str()
214*4d7e907cSAndroid Build Coastguard Worker               << "\"])";
215*4d7e907cSAndroid Build Coastguard Worker 
216*4d7e907cSAndroid Build Coastguard Worker     hidl_array<hidl_string, 2> result;
217*4d7e907cSAndroid Build Coastguard Worker     result[0] = "Hello";
218*4d7e907cSAndroid Build Coastguard Worker     result[1] = "World";
219*4d7e907cSAndroid Build Coastguard Worker 
220*4d7e907cSAndroid Build Coastguard Worker     _cb(result);
221*4d7e907cSAndroid Build Coastguard Worker 
222*4d7e907cSAndroid Build Coastguard Worker     return Void();
223*4d7e907cSAndroid Build Coastguard Worker }
224*4d7e907cSAndroid Build Coastguard Worker 
haveAStringVec(const hidl_vec<hidl_string> & vector,haveAStringVec_cb _cb)225*4d7e907cSAndroid Build Coastguard Worker Return<void> Foo::haveAStringVec(
226*4d7e907cSAndroid Build Coastguard Worker         const hidl_vec<hidl_string> &vector,
227*4d7e907cSAndroid Build Coastguard Worker         haveAStringVec_cb _cb) {
228*4d7e907cSAndroid Build Coastguard Worker     LOG(INFO) << "SERVER(Foo) haveAStringVec([\""
229*4d7e907cSAndroid Build Coastguard Worker               << vector[0].c_str()
230*4d7e907cSAndroid Build Coastguard Worker               << "\", \""
231*4d7e907cSAndroid Build Coastguard Worker               << vector[1].c_str()
232*4d7e907cSAndroid Build Coastguard Worker               << "\", \""
233*4d7e907cSAndroid Build Coastguard Worker               << vector[2].c_str()
234*4d7e907cSAndroid Build Coastguard Worker               << "\"])";
235*4d7e907cSAndroid Build Coastguard Worker 
236*4d7e907cSAndroid Build Coastguard Worker     hidl_vec<hidl_string> result;
237*4d7e907cSAndroid Build Coastguard Worker     result.resize(2);
238*4d7e907cSAndroid Build Coastguard Worker 
239*4d7e907cSAndroid Build Coastguard Worker     result[0] = "Hello";
240*4d7e907cSAndroid Build Coastguard Worker     result[1] = "World";
241*4d7e907cSAndroid Build Coastguard Worker 
242*4d7e907cSAndroid Build Coastguard Worker     _cb(result);
243*4d7e907cSAndroid Build Coastguard Worker 
244*4d7e907cSAndroid Build Coastguard Worker     return Void();
245*4d7e907cSAndroid Build Coastguard Worker }
246*4d7e907cSAndroid Build Coastguard Worker 
transposeMe(const hidl_array<float,3,5> & in,transposeMe_cb _cb)247*4d7e907cSAndroid Build Coastguard Worker Return<void> Foo::transposeMe(
248*4d7e907cSAndroid Build Coastguard Worker         const hidl_array<float, 3, 5> &in, transposeMe_cb _cb) {
249*4d7e907cSAndroid Build Coastguard Worker     LOG(INFO) << "SERVER(Foo) transposeMe(" << to_string(in).c_str() << ")";
250*4d7e907cSAndroid Build Coastguard Worker 
251*4d7e907cSAndroid Build Coastguard Worker     hidl_array<float, 5, 3> out;
252*4d7e907cSAndroid Build Coastguard Worker     for (size_t i = 0; i < 5; ++i) {
253*4d7e907cSAndroid Build Coastguard Worker         for (size_t j = 0; j < 3; ++j) {
254*4d7e907cSAndroid Build Coastguard Worker             out[i][j] = in[j][i];
255*4d7e907cSAndroid Build Coastguard Worker         }
256*4d7e907cSAndroid Build Coastguard Worker     }
257*4d7e907cSAndroid Build Coastguard Worker 
258*4d7e907cSAndroid Build Coastguard Worker     LOG(INFO) << "SERVER(Foo) transposeMe returning " << to_string(out).c_str();
259*4d7e907cSAndroid Build Coastguard Worker 
260*4d7e907cSAndroid Build Coastguard Worker     _cb(out);
261*4d7e907cSAndroid Build Coastguard Worker 
262*4d7e907cSAndroid Build Coastguard Worker     return Void();
263*4d7e907cSAndroid Build Coastguard Worker }
264*4d7e907cSAndroid Build Coastguard Worker 
callingDrWho(const MultiDimensional & in,callingDrWho_cb _hidl_cb)265*4d7e907cSAndroid Build Coastguard Worker Return<void> Foo::callingDrWho(
266*4d7e907cSAndroid Build Coastguard Worker         const MultiDimensional &in, callingDrWho_cb _hidl_cb) {
267*4d7e907cSAndroid Build Coastguard Worker     LOG(INFO) << "SERVER(Foo) callingDrWho(" << MultiDimensionalToString(in).c_str() << ")";
268*4d7e907cSAndroid Build Coastguard Worker 
269*4d7e907cSAndroid Build Coastguard Worker     MultiDimensional out;
270*4d7e907cSAndroid Build Coastguard Worker     for (size_t i = 0; i < 5; ++i) {
271*4d7e907cSAndroid Build Coastguard Worker         for (size_t j = 0; j < 3; ++j) {
272*4d7e907cSAndroid Build Coastguard Worker             out.quuxMatrix[i][j].first = in.quuxMatrix[4 - i][2 - j].last;
273*4d7e907cSAndroid Build Coastguard Worker             out.quuxMatrix[i][j].last = in.quuxMatrix[4 - i][2 - j].first;
274*4d7e907cSAndroid Build Coastguard Worker         }
275*4d7e907cSAndroid Build Coastguard Worker     }
276*4d7e907cSAndroid Build Coastguard Worker 
277*4d7e907cSAndroid Build Coastguard Worker     _hidl_cb(out);
278*4d7e907cSAndroid Build Coastguard Worker 
279*4d7e907cSAndroid Build Coastguard Worker     return Void();
280*4d7e907cSAndroid Build Coastguard Worker }
281*4d7e907cSAndroid Build Coastguard Worker 
transpose(const StringMatrix5x3 & in,transpose_cb _hidl_cb)282*4d7e907cSAndroid Build Coastguard Worker Return<void> Foo::transpose(const StringMatrix5x3 &in, transpose_cb _hidl_cb) {
283*4d7e907cSAndroid Build Coastguard Worker     LOG(INFO) << "SERVER(Foo) transpose " << to_string(in);
284*4d7e907cSAndroid Build Coastguard Worker 
285*4d7e907cSAndroid Build Coastguard Worker     StringMatrix3x5 out;
286*4d7e907cSAndroid Build Coastguard Worker     for (size_t i = 0; i < 3; ++i) {
287*4d7e907cSAndroid Build Coastguard Worker         for (size_t j = 0; j < 5; ++j) {
288*4d7e907cSAndroid Build Coastguard Worker             out.s[i][j] = in.s[j][i];
289*4d7e907cSAndroid Build Coastguard Worker         }
290*4d7e907cSAndroid Build Coastguard Worker     }
291*4d7e907cSAndroid Build Coastguard Worker 
292*4d7e907cSAndroid Build Coastguard Worker     _hidl_cb(out);
293*4d7e907cSAndroid Build Coastguard Worker 
294*4d7e907cSAndroid Build Coastguard Worker     return Void();
295*4d7e907cSAndroid Build Coastguard Worker }
296*4d7e907cSAndroid Build Coastguard Worker 
transpose2(const hidl_array<hidl_string,5,3> & in,transpose2_cb _hidl_cb)297*4d7e907cSAndroid Build Coastguard Worker Return<void> Foo::transpose2(
298*4d7e907cSAndroid Build Coastguard Worker         const hidl_array<hidl_string, 5, 3> &in, transpose2_cb _hidl_cb) {
299*4d7e907cSAndroid Build Coastguard Worker     LOG(INFO) << "SERVER(Foo) transpose2 " << to_string(in);
300*4d7e907cSAndroid Build Coastguard Worker 
301*4d7e907cSAndroid Build Coastguard Worker     hidl_array<hidl_string, 3, 5> out;
302*4d7e907cSAndroid Build Coastguard Worker     for (size_t i = 0; i < 3; ++i) {
303*4d7e907cSAndroid Build Coastguard Worker         for (size_t j = 0; j < 5; ++j) {
304*4d7e907cSAndroid Build Coastguard Worker             out[i][j] = in[j][i];
305*4d7e907cSAndroid Build Coastguard Worker         }
306*4d7e907cSAndroid Build Coastguard Worker     }
307*4d7e907cSAndroid Build Coastguard Worker 
308*4d7e907cSAndroid Build Coastguard Worker     _hidl_cb(out);
309*4d7e907cSAndroid Build Coastguard Worker 
310*4d7e907cSAndroid Build Coastguard Worker     return Void();
311*4d7e907cSAndroid Build Coastguard Worker }
312*4d7e907cSAndroid Build Coastguard Worker 
sendVec(const hidl_vec<uint8_t> & data,sendVec_cb _hidl_cb)313*4d7e907cSAndroid Build Coastguard Worker Return<void> Foo::sendVec(
314*4d7e907cSAndroid Build Coastguard Worker         const hidl_vec<uint8_t> &data, sendVec_cb _hidl_cb) {
315*4d7e907cSAndroid Build Coastguard Worker     _hidl_cb(data);
316*4d7e907cSAndroid Build Coastguard Worker 
317*4d7e907cSAndroid Build Coastguard Worker     return Void();
318*4d7e907cSAndroid Build Coastguard Worker }
319*4d7e907cSAndroid Build Coastguard Worker 
sendVecVec(sendVecVec_cb _hidl_cb)320*4d7e907cSAndroid Build Coastguard Worker Return<void> Foo::sendVecVec(sendVecVec_cb _hidl_cb) {
321*4d7e907cSAndroid Build Coastguard Worker     hidl_vec<hidl_vec<uint8_t>> data;
322*4d7e907cSAndroid Build Coastguard Worker     _hidl_cb(data);
323*4d7e907cSAndroid Build Coastguard Worker 
324*4d7e907cSAndroid Build Coastguard Worker     return Void();
325*4d7e907cSAndroid Build Coastguard Worker }
326*4d7e907cSAndroid Build Coastguard Worker 
haveAVectorOfInterfaces(const hidl_vec<sp<ISimple>> & in,haveAVectorOfInterfaces_cb _hidl_cb)327*4d7e907cSAndroid Build Coastguard Worker Return<void> Foo::haveAVectorOfInterfaces(
328*4d7e907cSAndroid Build Coastguard Worker         const hidl_vec<sp<ISimple> > &in,
329*4d7e907cSAndroid Build Coastguard Worker         haveAVectorOfInterfaces_cb _hidl_cb) {
330*4d7e907cSAndroid Build Coastguard Worker     _hidl_cb(in);
331*4d7e907cSAndroid Build Coastguard Worker 
332*4d7e907cSAndroid Build Coastguard Worker     return Void();
333*4d7e907cSAndroid Build Coastguard Worker }
334*4d7e907cSAndroid Build Coastguard Worker 
haveAVectorOfGenericInterfaces(const hidl_vec<sp<android::hidl::base::V1_0::IBase>> & in,haveAVectorOfGenericInterfaces_cb _hidl_cb)335*4d7e907cSAndroid Build Coastguard Worker Return<void> Foo::haveAVectorOfGenericInterfaces(
336*4d7e907cSAndroid Build Coastguard Worker         const hidl_vec<sp<android::hidl::base::V1_0::IBase> > &in,
337*4d7e907cSAndroid Build Coastguard Worker         haveAVectorOfGenericInterfaces_cb _hidl_cb) {
338*4d7e907cSAndroid Build Coastguard Worker     _hidl_cb(in);
339*4d7e907cSAndroid Build Coastguard Worker     return Void();
340*4d7e907cSAndroid Build Coastguard Worker }
341*4d7e907cSAndroid Build Coastguard Worker 
createMyHandle(createMyHandle_cb _hidl_cb)342*4d7e907cSAndroid Build Coastguard Worker Return<void> Foo::createMyHandle(createMyHandle_cb _hidl_cb) {
343*4d7e907cSAndroid Build Coastguard Worker     native_handle_t* nh = native_handle_create(0, 10);
344*4d7e907cSAndroid Build Coastguard Worker     int data[] = {2,3,5,7,11,13,17,19,21,23};
345*4d7e907cSAndroid Build Coastguard Worker     CHECK(sizeof(data) == 10 * sizeof(int));
346*4d7e907cSAndroid Build Coastguard Worker     memcpy(nh->data, data, sizeof(data));
347*4d7e907cSAndroid Build Coastguard Worker     mHandles.push_back(nh);
348*4d7e907cSAndroid Build Coastguard Worker 
349*4d7e907cSAndroid Build Coastguard Worker     MyHandle h;
350*4d7e907cSAndroid Build Coastguard Worker     h.guard = 666;
351*4d7e907cSAndroid Build Coastguard Worker     h.h = nh;
352*4d7e907cSAndroid Build Coastguard Worker     _hidl_cb(h);
353*4d7e907cSAndroid Build Coastguard Worker     return Void();
354*4d7e907cSAndroid Build Coastguard Worker }
355*4d7e907cSAndroid Build Coastguard Worker 
createHandles(uint32_t size,createHandles_cb _hidl_cb)356*4d7e907cSAndroid Build Coastguard Worker Return<void> Foo::createHandles(uint32_t size, createHandles_cb _hidl_cb) {
357*4d7e907cSAndroid Build Coastguard Worker     hidl_vec<hidl_handle> handles;
358*4d7e907cSAndroid Build Coastguard Worker     handles.resize(size);
359*4d7e907cSAndroid Build Coastguard Worker     for(uint32_t i = 0; i < size; ++i) {
360*4d7e907cSAndroid Build Coastguard Worker         createMyHandle([&](const MyHandle& h) {
361*4d7e907cSAndroid Build Coastguard Worker             handles[i] = h.h;
362*4d7e907cSAndroid Build Coastguard Worker         });
363*4d7e907cSAndroid Build Coastguard Worker     }
364*4d7e907cSAndroid Build Coastguard Worker     _hidl_cb(handles);
365*4d7e907cSAndroid Build Coastguard Worker     return Void();
366*4d7e907cSAndroid Build Coastguard Worker }
367*4d7e907cSAndroid Build Coastguard Worker 
closeHandles()368*4d7e907cSAndroid Build Coastguard Worker Return<void> Foo::closeHandles() {
369*4d7e907cSAndroid Build Coastguard Worker     for(native_handle_t* h : mHandles) {
370*4d7e907cSAndroid Build Coastguard Worker         native_handle_delete(h);
371*4d7e907cSAndroid Build Coastguard Worker     }
372*4d7e907cSAndroid Build Coastguard Worker     mHandles.clear();
373*4d7e907cSAndroid Build Coastguard Worker     return Void();
374*4d7e907cSAndroid Build Coastguard Worker }
375*4d7e907cSAndroid Build Coastguard Worker 
echoNullInterface(const sp<IFooCallback> & cb,echoNullInterface_cb _hidl_cb)376*4d7e907cSAndroid Build Coastguard Worker Return<void> Foo::echoNullInterface(const sp<IFooCallback> &cb, echoNullInterface_cb _hidl_cb) {
377*4d7e907cSAndroid Build Coastguard Worker     _hidl_cb(cb == nullptr, cb);
378*4d7e907cSAndroid Build Coastguard Worker 
379*4d7e907cSAndroid Build Coastguard Worker     return Void();
380*4d7e907cSAndroid Build Coastguard Worker }
381*4d7e907cSAndroid Build Coastguard Worker 
repeatWithFmq(const IFoo::WithFmq & withFmq,repeatWithFmq_cb _hidl_cb)382*4d7e907cSAndroid Build Coastguard Worker Return<void> Foo::repeatWithFmq(const IFoo::WithFmq& withFmq, repeatWithFmq_cb _hidl_cb) {
383*4d7e907cSAndroid Build Coastguard Worker     _hidl_cb(withFmq);
384*4d7e907cSAndroid Build Coastguard Worker     return Void();
385*4d7e907cSAndroid Build Coastguard Worker }
386*4d7e907cSAndroid Build Coastguard Worker 
HIDL_FETCH_IFoo(const char *)387*4d7e907cSAndroid Build Coastguard Worker IFoo* HIDL_FETCH_IFoo(const char* /* name */) {
388*4d7e907cSAndroid Build Coastguard Worker     return new Foo();
389*4d7e907cSAndroid Build Coastguard Worker }
390*4d7e907cSAndroid Build Coastguard Worker 
391*4d7e907cSAndroid Build Coastguard Worker } // namespace implementation
392*4d7e907cSAndroid Build Coastguard Worker }  // namespace V1_0
393*4d7e907cSAndroid Build Coastguard Worker }  // namespace foo
394*4d7e907cSAndroid Build Coastguard Worker }  // namespace tests
395*4d7e907cSAndroid Build Coastguard Worker }  // namespace hardware
396*4d7e907cSAndroid Build Coastguard Worker }  // namespace android
397