1 /*
2  * Copyright (C) 2018 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include <aidl/test_package/BnCompatTest.h>
18 #include <aidl/test_package/BnTest.h>
19 #include <aidl/test_package/MyExt.h>
20 #include <aidl/test_package/SimpleUnion.h>
21 #include <stdio.h>
22 #include <unistd.h>
23 
24 #include <condition_variable>
25 #include <mutex>
26 
27 #include "legacy_binder.h"
28 #include "utilities.h"
29 
30 using ::aidl::test_package::Bar;
31 using ::aidl::test_package::Baz;
32 using ::aidl::test_package::ByteEnum;
33 using ::aidl::test_package::ExtendableParcelable;
34 using ::aidl::test_package::Foo;
35 using ::aidl::test_package::IEmpty;
36 using ::aidl::test_package::IntEnum;
37 using ::aidl::test_package::LongEnum;
38 using ::aidl::test_package::MyExt;
39 using ::aidl::test_package::RegularPolygon;
40 using ::aidl::test_package::SimpleUnion;
41 
42 class MyTest : public ::aidl::test_package::BnTest,
43                public ThisShouldBeDestroyed {
44  public:
dump(int fd,const char ** args,uint32_t numArgs)45   binder_status_t dump(int fd, const char** args, uint32_t numArgs) override {
46     for (uint32_t i = 0; i < numArgs; i++) {
47       dprintf(fd, "%s", args[i]);
48     }
49     fsync(fd);
50     return STATUS_OK;
51   }
52 
GetName(std::string * _aidl_return)53   ::ndk::ScopedAStatus GetName(std::string* _aidl_return) override {
54     *_aidl_return = "CPP";
55     return ::ndk::ScopedAStatus(AStatus_newOk());
56   }
TestVoidReturn()57   ::ndk::ScopedAStatus TestVoidReturn() override {
58     return ::ndk::ScopedAStatus(AStatus_newOk());
59   }
TestOneway()60   ::ndk::ScopedAStatus TestOneway() override {
61     // This return code should be ignored since it is oneway.
62     return ::ndk::ScopedAStatus(AStatus_fromStatus(STATUS_UNKNOWN_ERROR));
63   }
64 
GiveMeMyCallingPid(int32_t * _aidl_return)65   ::ndk::ScopedAStatus GiveMeMyCallingPid(int32_t* _aidl_return) override {
66     *_aidl_return = AIBinder_getCallingPid();
67     return ::ndk::ScopedAStatus(AStatus_newOk());
68   }
GiveMeMyCallingUid(int32_t * _aidl_return)69   ::ndk::ScopedAStatus GiveMeMyCallingUid(int32_t* _aidl_return) override {
70     *_aidl_return = AIBinder_getCallingUid();
71     return ::ndk::ScopedAStatus(AStatus_newOk());
72   }
73 
74  private:
75   bool mCached = false;
76   std::mutex mCachedMutex;
77   std::condition_variable mCachedCondition;
78   int mCachedPid = -1;
79   int mCachedUid = -1;
80 
81  public:
CacheCallingInfoFromOneway()82   ::ndk::ScopedAStatus CacheCallingInfoFromOneway() override {
83     std::unique_lock<std::mutex> l(mCachedMutex);
84     mCached = true;
85     mCachedPid = AIBinder_getCallingPid();
86     mCachedUid = AIBinder_getCallingUid();
87     mCachedCondition.notify_all();
88 
89     return ::ndk::ScopedAStatus(AStatus_newOk());
90   }
GiveMeMyCallingPidFromOneway(int32_t * _aidl_return)91   ::ndk::ScopedAStatus GiveMeMyCallingPidFromOneway(
92       int32_t* _aidl_return) override {
93     std::unique_lock<std::mutex> l(mCachedMutex);
94     mCachedCondition.wait(l, [&] { return mCached; });
95 
96     *_aidl_return = mCachedPid;
97     return ::ndk::ScopedAStatus(AStatus_newOk());
98   }
GiveMeMyCallingUidFromOneway(int32_t * _aidl_return)99   ::ndk::ScopedAStatus GiveMeMyCallingUidFromOneway(
100       int32_t* _aidl_return) override {
101     std::unique_lock<std::mutex> l(mCachedMutex);
102     mCachedCondition.wait(l, [&] { return mCached; });
103 
104     *_aidl_return = mCachedUid;
105     return ::ndk::ScopedAStatus(AStatus_newOk());
106   }
RepeatInt(int32_t in_value,int32_t * _aidl_return)107   ::ndk::ScopedAStatus RepeatInt(int32_t in_value,
108                                  int32_t* _aidl_return) override {
109     *_aidl_return = in_value;
110     return ::ndk::ScopedAStatus(AStatus_newOk());
111   }
RepeatLong(int64_t in_value,int64_t * _aidl_return)112   ::ndk::ScopedAStatus RepeatLong(int64_t in_value,
113                                   int64_t* _aidl_return) override {
114     *_aidl_return = in_value;
115     return ::ndk::ScopedAStatus(AStatus_newOk());
116   }
RepeatFloat(float in_value,float * _aidl_return)117   ::ndk::ScopedAStatus RepeatFloat(float in_value,
118                                    float* _aidl_return) override {
119     *_aidl_return = in_value;
120     return ::ndk::ScopedAStatus(AStatus_newOk());
121   }
RepeatDouble(double in_value,double * _aidl_return)122   ::ndk::ScopedAStatus RepeatDouble(double in_value,
123                                     double* _aidl_return) override {
124     *_aidl_return = in_value;
125     return ::ndk::ScopedAStatus(AStatus_newOk());
126   }
RepeatBoolean(bool in_value,bool * _aidl_return)127   ::ndk::ScopedAStatus RepeatBoolean(bool in_value,
128                                      bool* _aidl_return) override {
129     *_aidl_return = in_value;
130     return ::ndk::ScopedAStatus(AStatus_newOk());
131   }
RepeatChar(char16_t in_value,char16_t * _aidl_return)132   ::ndk::ScopedAStatus RepeatChar(char16_t in_value,
133                                   char16_t* _aidl_return) override {
134     *_aidl_return = in_value;
135     return ::ndk::ScopedAStatus(AStatus_newOk());
136   }
RepeatByte(int8_t in_value,int8_t * _aidl_return)137   ::ndk::ScopedAStatus RepeatByte(int8_t in_value,
138                                   int8_t* _aidl_return) override {
139     *_aidl_return = in_value;
140     return ::ndk::ScopedAStatus(AStatus_newOk());
141   }
RepeatByteEnum(ByteEnum in_value,ByteEnum * _aidl_return)142   ::ndk::ScopedAStatus RepeatByteEnum(ByteEnum in_value, ByteEnum* _aidl_return) override {
143     *_aidl_return = in_value;
144     return ::ndk::ScopedAStatus(AStatus_newOk());
145   }
RepeatIntEnum(IntEnum in_value,IntEnum * _aidl_return)146   ::ndk::ScopedAStatus RepeatIntEnum(IntEnum in_value, IntEnum* _aidl_return) override {
147     *_aidl_return = in_value;
148     return ::ndk::ScopedAStatus(AStatus_newOk());
149   }
RepeatLongEnum(LongEnum in_value,LongEnum * _aidl_return)150   ::ndk::ScopedAStatus RepeatLongEnum(LongEnum in_value, LongEnum* _aidl_return) override {
151     *_aidl_return = in_value;
152     return ::ndk::ScopedAStatus(AStatus_newOk());
153   }
RepeatBinder(const::ndk::SpAIBinder & in_value,::ndk::SpAIBinder * _aidl_return)154   ::ndk::ScopedAStatus RepeatBinder(const ::ndk::SpAIBinder& in_value,
155                                     ::ndk::SpAIBinder* _aidl_return) override {
156     *_aidl_return = in_value;
157     return ::ndk::ScopedAStatus(AStatus_newOk());
158   }
RepeatNullableBinder(const::ndk::SpAIBinder & in_value,::ndk::SpAIBinder * _aidl_return)159   ::ndk::ScopedAStatus RepeatNullableBinder(
160       const ::ndk::SpAIBinder& in_value,
161       ::ndk::SpAIBinder* _aidl_return) override {
162     *_aidl_return = in_value;
163     return ::ndk::ScopedAStatus(AStatus_newOk());
164   }
RepeatInterface(const std::shared_ptr<IEmpty> & in_value,std::shared_ptr<IEmpty> * _aidl_return)165   ::ndk::ScopedAStatus RepeatInterface(
166       const std::shared_ptr<IEmpty>& in_value,
167       std::shared_ptr<IEmpty>* _aidl_return) override {
168     *_aidl_return = in_value;
169     return ::ndk::ScopedAStatus(AStatus_newOk());
170   }
RepeatNullableInterface(const std::shared_ptr<IEmpty> & in_value,std::shared_ptr<IEmpty> * _aidl_return)171   ::ndk::ScopedAStatus RepeatNullableInterface(
172       const std::shared_ptr<IEmpty>& in_value,
173       std::shared_ptr<IEmpty>* _aidl_return) override {
174     *_aidl_return = in_value;
175     return ::ndk::ScopedAStatus(AStatus_newOk());
176   }
RepeatFd(const::ndk::ScopedFileDescriptor & in_value,::ndk::ScopedFileDescriptor * _aidl_return)177   ::ndk::ScopedAStatus RepeatFd(
178       const ::ndk::ScopedFileDescriptor& in_value,
179       ::ndk::ScopedFileDescriptor* _aidl_return) override {
180     *_aidl_return = in_value.dup();
181     return ::ndk::ScopedAStatus(AStatus_newOk());
182   }
183 
RepeatFdArray(const std::vector<::ndk::ScopedFileDescriptor> & in_input,std::vector<::ndk::ScopedFileDescriptor> * out_repeated,std::vector<::ndk::ScopedFileDescriptor> * _aidl_return)184   ::ndk::ScopedAStatus RepeatFdArray(
185       const std::vector<::ndk::ScopedFileDescriptor>& in_input,
186       std::vector<::ndk::ScopedFileDescriptor>* out_repeated,
187       std::vector<::ndk::ScopedFileDescriptor>* _aidl_return) override {
188     out_repeated->clear();
189     for (auto& fd : in_input) {
190       out_repeated->emplace_back(dup(fd.get()));
191       _aidl_return->emplace_back(dup(fd.get()));
192     }
193     return ::ndk::ScopedAStatus(AStatus_newOk());
194   }
195 
RepeatNullableFd(const::ndk::ScopedFileDescriptor & in_value,::ndk::ScopedFileDescriptor * _aidl_return)196   ::ndk::ScopedAStatus RepeatNullableFd(
197       const ::ndk::ScopedFileDescriptor& in_value,
198       ::ndk::ScopedFileDescriptor* _aidl_return) override {
199     _aidl_return->set(dup(in_value.get()));
200     return ::ndk::ScopedAStatus(AStatus_newOk());
201   }
RepeatString(const std::string & in_value,std::string * _aidl_return)202   ::ndk::ScopedAStatus RepeatString(const std::string& in_value,
203                                     std::string* _aidl_return) override {
204     *_aidl_return = in_value;
205     return ::ndk::ScopedAStatus(AStatus_newOk());
206   }
RepeatNullableString(const std::optional<std::string> & in_value,std::optional<std::string> * _aidl_return)207   ::ndk::ScopedAStatus RepeatNullableString(
208       const std::optional<std::string>& in_value,
209       std::optional<std::string>* _aidl_return) override {
210     *_aidl_return = in_value;
211     return ::ndk::ScopedAStatus(AStatus_newOk());
212   }
RepeatPolygon(const RegularPolygon & in_value,RegularPolygon * _aidl_return)213   ::ndk::ScopedAStatus RepeatPolygon(const RegularPolygon& in_value,
214                                      RegularPolygon* _aidl_return) override {
215     *_aidl_return = in_value;
216     return ::ndk::ScopedAStatus(AStatus_newOk());
217   }
RepeatNullablePolygon(const std::optional<RegularPolygon> & in_value,std::optional<RegularPolygon> * _aidl_return)218   ::ndk::ScopedAStatus RepeatNullablePolygon(const std::optional<RegularPolygon>& in_value,
219                                              std::optional<RegularPolygon>* _aidl_return) override {
220     *_aidl_return = in_value;
221     return ::ndk::ScopedAStatus(AStatus_newOk());
222   }
RepeatPersistableBundle(const::aidl::android::os::PersistableBundle & in_input,::aidl::android::os::PersistableBundle * _aidl_return)223   ::ndk::ScopedAStatus RepeatPersistableBundle(
224       const ::aidl::android::os::PersistableBundle& in_input,
225       ::aidl::android::os::PersistableBundle* _aidl_return) {
226     *_aidl_return = in_input;
227     return ::ndk::ScopedAStatus(AStatus_newOk());
228   }
RenamePolygon(RegularPolygon * value,const std::string & newName)229   ::ndk::ScopedAStatus RenamePolygon(RegularPolygon* value,
230                                      const std::string& newName) override {
231     value->name = newName;
232     return ::ndk::ScopedAStatus(AStatus_newOk());
233   }
RepeatBooleanArray(const std::vector<bool> & in_value,std::vector<bool> * out_repeated,std::vector<bool> * _aidl_return)234   ::ndk::ScopedAStatus RepeatBooleanArray(
235       const std::vector<bool>& in_value, std::vector<bool>* out_repeated,
236       std::vector<bool>* _aidl_return) override {
237     *out_repeated = in_value;
238     *_aidl_return = in_value;
239     return ::ndk::ScopedAStatus(AStatus_newOk());
240   }
RepeatByteArray(const std::vector<uint8_t> & in_value,std::vector<uint8_t> * out_repeated,std::vector<uint8_t> * _aidl_return)241   ::ndk::ScopedAStatus RepeatByteArray(const std::vector<uint8_t>& in_value,
242                                        std::vector<uint8_t>* out_repeated,
243                                        std::vector<uint8_t>* _aidl_return) override {
244     *out_repeated = in_value;
245     *_aidl_return = in_value;
246     return ::ndk::ScopedAStatus(AStatus_newOk());
247   }
RepeatCharArray(const std::vector<char16_t> & in_value,std::vector<char16_t> * out_repeated,std::vector<char16_t> * _aidl_return)248   ::ndk::ScopedAStatus RepeatCharArray(
249       const std::vector<char16_t>& in_value,
250       std::vector<char16_t>* out_repeated,
251       std::vector<char16_t>* _aidl_return) override {
252     *out_repeated = in_value;
253     *_aidl_return = in_value;
254     return ::ndk::ScopedAStatus(AStatus_newOk());
255   }
RepeatIntArray(const std::vector<int32_t> & in_value,std::vector<int32_t> * out_repeated,std::vector<int32_t> * _aidl_return)256   ::ndk::ScopedAStatus RepeatIntArray(
257       const std::vector<int32_t>& in_value, std::vector<int32_t>* out_repeated,
258       std::vector<int32_t>* _aidl_return) override {
259     *out_repeated = in_value;
260     *_aidl_return = in_value;
261     return ::ndk::ScopedAStatus(AStatus_newOk());
262   }
RepeatLongArray(const std::vector<int64_t> & in_value,std::vector<int64_t> * out_repeated,std::vector<int64_t> * _aidl_return)263   ::ndk::ScopedAStatus RepeatLongArray(
264       const std::vector<int64_t>& in_value, std::vector<int64_t>* out_repeated,
265       std::vector<int64_t>* _aidl_return) override {
266     *out_repeated = in_value;
267     *_aidl_return = in_value;
268     return ::ndk::ScopedAStatus(AStatus_newOk());
269   }
RepeatFloatArray(const std::vector<float> & in_value,std::vector<float> * out_repeated,std::vector<float> * _aidl_return)270   ::ndk::ScopedAStatus RepeatFloatArray(
271       const std::vector<float>& in_value, std::vector<float>* out_repeated,
272       std::vector<float>* _aidl_return) override {
273     *out_repeated = in_value;
274     *_aidl_return = in_value;
275     return ::ndk::ScopedAStatus(AStatus_newOk());
276   }
RepeatDoubleArray(const std::vector<double> & in_value,std::vector<double> * out_repeated,std::vector<double> * _aidl_return)277   ::ndk::ScopedAStatus RepeatDoubleArray(
278       const std::vector<double>& in_value, std::vector<double>* out_repeated,
279       std::vector<double>* _aidl_return) override {
280     *out_repeated = in_value;
281     *_aidl_return = in_value;
282     return ::ndk::ScopedAStatus(AStatus_newOk());
283   }
RepeatByteEnumArray(const std::vector<ByteEnum> & in_value,std::vector<ByteEnum> * out_repeated,std::vector<ByteEnum> * _aidl_return)284   ::ndk::ScopedAStatus RepeatByteEnumArray(const std::vector<ByteEnum>& in_value,
285                                            std::vector<ByteEnum>* out_repeated,
286                                            std::vector<ByteEnum>* _aidl_return) override {
287     *out_repeated = in_value;
288     *_aidl_return = in_value;
289     return ::ndk::ScopedAStatus(AStatus_newOk());
290   }
RepeatIntEnumArray(const std::vector<IntEnum> & in_value,std::vector<IntEnum> * out_repeated,std::vector<IntEnum> * _aidl_return)291   ::ndk::ScopedAStatus RepeatIntEnumArray(const std::vector<IntEnum>& in_value,
292                                           std::vector<IntEnum>* out_repeated,
293                                           std::vector<IntEnum>* _aidl_return) override {
294     *out_repeated = in_value;
295     *_aidl_return = in_value;
296     return ::ndk::ScopedAStatus(AStatus_newOk());
297   }
RepeatLongEnumArray(const std::vector<LongEnum> & in_value,std::vector<LongEnum> * out_repeated,std::vector<LongEnum> * _aidl_return)298   ::ndk::ScopedAStatus RepeatLongEnumArray(const std::vector<LongEnum>& in_value,
299                                            std::vector<LongEnum>* out_repeated,
300                                            std::vector<LongEnum>* _aidl_return) override {
301     *out_repeated = in_value;
302     *_aidl_return = in_value;
303     return ::ndk::ScopedAStatus(AStatus_newOk());
304   }
RepeatStringArray(const std::vector<std::string> & in_value,std::vector<std::string> * out_repeated,std::vector<std::string> * _aidl_return)305   ::ndk::ScopedAStatus RepeatStringArray(
306       const std::vector<std::string>& in_value,
307       std::vector<std::string>* out_repeated,
308       std::vector<std::string>* _aidl_return) override {
309     *out_repeated = in_value;
310     *_aidl_return = in_value;
311     return ::ndk::ScopedAStatus(AStatus_newOk());
312   }
RepeatRegularPolygonArray(const std::vector<RegularPolygon> & in_value,std::vector<RegularPolygon> * out_repeated,std::vector<RegularPolygon> * _aidl_return)313   ::ndk::ScopedAStatus RepeatRegularPolygonArray(
314       const std::vector<RegularPolygon>& in_value, std::vector<RegularPolygon>* out_repeated,
315       std::vector<RegularPolygon>* _aidl_return) override {
316     *out_repeated = in_value;
317     *_aidl_return = in_value;
318     return ::ndk::ScopedAStatus(AStatus_newOk());
319   }
320 
RepeatBinderArray(const std::vector<::ndk::SpAIBinder> & in_value,std::vector<::ndk::SpAIBinder> * out_repeated,std::vector<::ndk::SpAIBinder> * _aidl_return)321   ::ndk::ScopedAStatus RepeatBinderArray(const std::vector<::ndk::SpAIBinder>& in_value,
322                                          std::vector<::ndk::SpAIBinder>* out_repeated,
323                                          std::vector<::ndk::SpAIBinder>* _aidl_return) override {
324     *out_repeated = in_value;
325     *_aidl_return = in_value;
326     return ::ndk::ScopedAStatus(AStatus_newOk());
327   }
328 
RepeatInterfaceArray(const std::vector<std::shared_ptr<IEmpty>> & in_value,std::vector<std::shared_ptr<IEmpty>> * out_repeated,std::vector<std::shared_ptr<IEmpty>> * _aidl_return)329   ::ndk::ScopedAStatus RepeatInterfaceArray(
330       const std::vector<std::shared_ptr<IEmpty>>& in_value,
331       std::vector<std::shared_ptr<IEmpty>>* out_repeated,
332       std::vector<std::shared_ptr<IEmpty>>* _aidl_return) override {
333     *out_repeated = in_value;
334     *_aidl_return = in_value;
335     return ::ndk::ScopedAStatus(AStatus_newOk());
336   }
337 
Repeat2StringList(const std::vector<std::string> & in_input,std::vector<std::string> * out_repeated,std::vector<std::string> * _aidl_return)338   ::ndk::ScopedAStatus Repeat2StringList(const std::vector<std::string>& in_input,
339                                          std::vector<std::string>* out_repeated,
340                                          std::vector<std::string>* _aidl_return) override {
341     *out_repeated = std::vector<std::string>();
342     *_aidl_return = std::vector<std::string>();
343     for (int i = 0; i < 2; i++) {
344       for (auto& s : in_input) {
345         out_repeated->emplace_back(s);
346         _aidl_return->emplace_back(s);
347       }
348     }
349 
350     return ::ndk::ScopedAStatus(AStatus_newOk());
351   }
352 
Repeat2RegularPolygonList(const std::vector<::aidl::test_package::RegularPolygon> & in_input,std::vector<::aidl::test_package::RegularPolygon> * out_repeated,std::vector<::aidl::test_package::RegularPolygon> * _aidl_return)353   ::ndk::ScopedAStatus Repeat2RegularPolygonList(
354       const std::vector<::aidl::test_package::RegularPolygon>& in_input,
355       std::vector<::aidl::test_package::RegularPolygon>* out_repeated,
356       std::vector<::aidl::test_package::RegularPolygon>* _aidl_return) override {
357     *out_repeated = std::vector<::aidl::test_package::RegularPolygon>();
358     *_aidl_return = std::vector<::aidl::test_package::RegularPolygon>();
359     for (int i = 0; i < 2; i++) {
360       for (auto& s : in_input) {
361         out_repeated->emplace_back(s);
362         _aidl_return->emplace_back(s);
363       }
364     }
365     return ::ndk::ScopedAStatus(AStatus_newOk());
366   }
367 
RepeatNullableBooleanArray(const std::optional<std::vector<bool>> & in_value,std::optional<std::vector<bool>> * _aidl_return)368   ::ndk::ScopedAStatus RepeatNullableBooleanArray(
369       const std::optional<std::vector<bool>>& in_value,
370       std::optional<std::vector<bool>>* _aidl_return) override {
371     *_aidl_return = in_value;
372     return ::ndk::ScopedAStatus(AStatus_newOk());
373   }
RepeatNullableByteArray(const std::optional<std::vector<uint8_t>> & in_value,std::optional<std::vector<uint8_t>> * _aidl_return)374   ::ndk::ScopedAStatus RepeatNullableByteArray(
375       const std::optional<std::vector<uint8_t>>& in_value,
376       std::optional<std::vector<uint8_t>>* _aidl_return) override {
377     *_aidl_return = in_value;
378     return ::ndk::ScopedAStatus(AStatus_newOk());
379   }
RepeatNullableCharArray(const std::optional<std::vector<char16_t>> & in_value,std::optional<std::vector<char16_t>> * _aidl_return)380   ::ndk::ScopedAStatus RepeatNullableCharArray(
381       const std::optional<std::vector<char16_t>>& in_value,
382       std::optional<std::vector<char16_t>>* _aidl_return) override {
383     *_aidl_return = in_value;
384     return ::ndk::ScopedAStatus(AStatus_newOk());
385   }
RepeatNullableIntArray(const std::optional<std::vector<int32_t>> & in_value,std::optional<std::vector<int32_t>> * _aidl_return)386   ::ndk::ScopedAStatus RepeatNullableIntArray(
387       const std::optional<std::vector<int32_t>>& in_value,
388       std::optional<std::vector<int32_t>>* _aidl_return) override {
389     *_aidl_return = in_value;
390     return ::ndk::ScopedAStatus(AStatus_newOk());
391   }
RepeatNullableLongArray(const std::optional<std::vector<int64_t>> & in_value,std::optional<std::vector<int64_t>> * _aidl_return)392   ::ndk::ScopedAStatus RepeatNullableLongArray(
393       const std::optional<std::vector<int64_t>>& in_value,
394       std::optional<std::vector<int64_t>>* _aidl_return) override {
395     *_aidl_return = in_value;
396     return ::ndk::ScopedAStatus(AStatus_newOk());
397   }
RepeatNullableFloatArray(const std::optional<std::vector<float>> & in_value,std::optional<std::vector<float>> * _aidl_return)398   ::ndk::ScopedAStatus RepeatNullableFloatArray(
399       const std::optional<std::vector<float>>& in_value,
400       std::optional<std::vector<float>>* _aidl_return) override {
401     *_aidl_return = in_value;
402     return ::ndk::ScopedAStatus(AStatus_newOk());
403   }
RepeatNullableDoubleArray(const std::optional<std::vector<double>> & in_value,std::optional<std::vector<double>> * _aidl_return)404   ::ndk::ScopedAStatus RepeatNullableDoubleArray(
405       const std::optional<std::vector<double>>& in_value,
406       std::optional<std::vector<double>>* _aidl_return) override {
407     *_aidl_return = in_value;
408     return ::ndk::ScopedAStatus(AStatus_newOk());
409   }
RepeatNullableByteEnumArray(const std::optional<std::vector<ByteEnum>> & in_value,std::optional<std::vector<ByteEnum>> * _aidl_return)410   ::ndk::ScopedAStatus RepeatNullableByteEnumArray(
411       const std::optional<std::vector<ByteEnum>>& in_value,
412       std::optional<std::vector<ByteEnum>>* _aidl_return) override {
413     *_aidl_return = in_value;
414     return ::ndk::ScopedAStatus(AStatus_newOk());
415   }
RepeatNullableIntEnumArray(const std::optional<std::vector<IntEnum>> & in_value,std::optional<std::vector<IntEnum>> * _aidl_return)416   ::ndk::ScopedAStatus RepeatNullableIntEnumArray(
417       const std::optional<std::vector<IntEnum>>& in_value,
418       std::optional<std::vector<IntEnum>>* _aidl_return) override {
419     *_aidl_return = in_value;
420     return ::ndk::ScopedAStatus(AStatus_newOk());
421   }
RepeatNullableLongEnumArray(const std::optional<std::vector<LongEnum>> & in_value,std::optional<std::vector<LongEnum>> * _aidl_return)422   ::ndk::ScopedAStatus RepeatNullableLongEnumArray(
423       const std::optional<std::vector<LongEnum>>& in_value,
424       std::optional<std::vector<LongEnum>>* _aidl_return) override {
425     *_aidl_return = in_value;
426     return ::ndk::ScopedAStatus(AStatus_newOk());
427   }
RepeatNullableStringArray(const std::optional<std::vector<std::optional<std::string>>> & in_value,std::optional<std::vector<std::optional<std::string>>> * _aidl_return)428   ::ndk::ScopedAStatus RepeatNullableStringArray(
429       const std::optional<std::vector<std::optional<std::string>>>& in_value,
430       std::optional<std::vector<std::optional<std::string>>>* _aidl_return) {
431     *_aidl_return = in_value;
432     return ::ndk::ScopedAStatus(AStatus_newOk());
433   }
RepeatNullableBinderArray(const std::optional<std::vector<::ndk::SpAIBinder>> & in_value,std::optional<std::vector<::ndk::SpAIBinder>> * _aidl_return)434   ::ndk::ScopedAStatus RepeatNullableBinderArray(
435       const std::optional<std::vector<::ndk::SpAIBinder>>& in_value,
436       std::optional<std::vector<::ndk::SpAIBinder>>* _aidl_return) override {
437     *_aidl_return = in_value;
438     return ::ndk::ScopedAStatus(AStatus_newOk());
439   }
RepeatNullableInterfaceArray(const std::optional<std::vector<std::shared_ptr<IEmpty>>> & in_value,std::optional<std::vector<std::shared_ptr<IEmpty>>> * _aidl_return)440   ::ndk::ScopedAStatus RepeatNullableInterfaceArray(
441       const std::optional<std::vector<std::shared_ptr<IEmpty>>>& in_value,
442       std::optional<std::vector<std::shared_ptr<IEmpty>>>* _aidl_return) override {
443     *_aidl_return = in_value;
444     return ::ndk::ScopedAStatus(AStatus_newOk());
445   }
DoubleRepeatNullableStringArray(const std::optional<std::vector<std::optional<std::string>>> & in_value,std::optional<std::vector<std::optional<std::string>>> * out_repeated,std::optional<std::vector<std::optional<std::string>>> * _aidl_return)446   ::ndk::ScopedAStatus DoubleRepeatNullableStringArray(
447       const std::optional<std::vector<std::optional<std::string>>>& in_value,
448       std::optional<std::vector<std::optional<std::string>>>* out_repeated,
449       std::optional<std::vector<std::optional<std::string>>>* _aidl_return)
450       override {
451     *out_repeated = in_value;
452     *_aidl_return = in_value;
453     return ::ndk::ScopedAStatus(AStatus_newOk());
454   }
455 
getICompatTest(::ndk::SpAIBinder * _aidl_return)456   ::ndk::ScopedAStatus getICompatTest(::ndk::SpAIBinder* _aidl_return) {
457     class MyCompatTest : public ::aidl::test_package::BnCompatTest {
458      public:
459       ::ndk::ScopedAStatus repeatBaz(const ::aidl::test_package::Baz& in_inBaz,
460                                      ::aidl::test_package::Baz* _aidl_return) override {
461         *_aidl_return = in_inBaz;
462         return ::ndk::ScopedAStatus(AStatus_newOk());
463       }
464 
465 #ifdef USING_VERSION_1
466       ::ndk::ScopedAStatus RepeatStringNullableLater(const std::string& in_value,
467                                                      std::string* _aidl_return) override {
468         *_aidl_return = in_value;
469         return ::ndk::ScopedAStatus(AStatus_newOk());
470       }
471 #else
472       ::ndk::ScopedAStatus RepeatStringNullableLater(
473           const std::optional<std::string>& in_value,
474           std::optional<std::string>* _aidl_return) override {
475         *_aidl_return = in_value;
476         return ::ndk::ScopedAStatus(AStatus_newOk());
477       }
478 #endif
479 
480 #ifndef USING_VERSION_1
481       ::ndk::ScopedAStatus NewMethodThatReturns10(int32_t* _aidl_return) override {
482         *_aidl_return = 10;
483         return ::ndk::ScopedAStatus(AStatus_newOk());
484       }
485 #endif
486     };
487     *_aidl_return = SharedRefBase::make<MyCompatTest>()->asBinder();
488     return ::ndk::ScopedAStatus(AStatus_newOk());
489   }
490 
getLegacyBinderTest(::ndk::SpAIBinder * _aidl_return)491   ::ndk::ScopedAStatus getLegacyBinderTest(::ndk::SpAIBinder* _aidl_return) {
492     *_aidl_return = ::ndk::SpAIBinder(AIBinder_new(kLegacyBinderClass, nullptr));
493     return ::ndk::ScopedAStatus(AStatus_newOk());
494   }
495 
RepeatExtendableParcelable(const::aidl::test_package::ExtendableParcelable & in_input,::aidl::test_package::ExtendableParcelable * out_output)496   ::ndk::ScopedAStatus RepeatExtendableParcelable(
497       const ::aidl::test_package::ExtendableParcelable& in_input,
498       ::aidl::test_package::ExtendableParcelable* out_output) {
499     RepeatExtendableParcelableWithoutExtension(in_input, out_output);
500     std::optional<MyExt> ext;
501     in_input.ext.getParcelable(&ext);
502     MyExt ext2;
503     ext2.a = ext->a;
504     ext2.b = ext->b;
505     out_output->ext.setParcelable(ext2);
506     return ::ndk::ScopedAStatus(AStatus_newOk());
507   }
508 
RepeatExtendableParcelableWithoutExtension(const::aidl::test_package::ExtendableParcelable & in_input,::aidl::test_package::ExtendableParcelable * out_output)509   ::ndk::ScopedAStatus RepeatExtendableParcelableWithoutExtension(
510       const ::aidl::test_package::ExtendableParcelable& in_input,
511       ::aidl::test_package::ExtendableParcelable* out_output) {
512     out_output->a = in_input.a;
513     out_output->b = in_input.b;
514     out_output->c = in_input.c;
515     return ::ndk::ScopedAStatus(AStatus_newOk());
516   }
517 
RepeatSimpleUnion(const SimpleUnion & in_u,SimpleUnion * _aidl_return)518   ::ndk::ScopedAStatus RepeatSimpleUnion(const SimpleUnion& in_u,
519                                          SimpleUnion* _aidl_return) override {
520     *_aidl_return = in_u;
521     return ::ndk::ScopedAStatus(AStatus_newOk());
522   }
523 
repeatFoo(const Foo & in_inFoo,Foo * _aidl_return)524   ::ndk::ScopedAStatus repeatFoo(const Foo& in_inFoo, Foo* _aidl_return) {
525     *_aidl_return = in_inFoo;
526     return ::ndk::ScopedAStatus(AStatus_newOk());
527   }
528 
renameFoo(Foo * in_foo,const std::string & in_name)529   ::ndk::ScopedAStatus renameFoo(Foo* in_foo, const std::string& in_name) {
530     in_foo->a = in_name;
531     return ::ndk::ScopedAStatus(AStatus_newOk());
532   }
533 
renameBar(Foo * in_foo,const std::string & in_name)534   ::ndk::ScopedAStatus renameBar(Foo* in_foo, const std::string& in_name) {
535     in_foo->d.a = in_name;
536     return ::ndk::ScopedAStatus(AStatus_newOk());
537   }
538 
getF(const Foo & foo,int32_t * _aidl_return)539   ::ndk::ScopedAStatus getF(const Foo& foo, int32_t* _aidl_return) {
540     *_aidl_return = foo.f;
541     return ::ndk::ScopedAStatus(AStatus_newOk());
542   }
543 
repeatGenericBar(const::aidl::test_package::GenericBar<int32_t> & in_inFoo,::aidl::test_package::GenericBar<int32_t> * _aidl_return)544   ::ndk::ScopedAStatus repeatGenericBar(const ::aidl::test_package::GenericBar<int32_t>& in_inFoo,
545                                         ::aidl::test_package::GenericBar<int32_t>* _aidl_return) {
546     *_aidl_return = in_inFoo;
547     return ::ndk::ScopedAStatus(AStatus_newOk());
548   }
549 };
550