• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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   }
RenamePolygon(RegularPolygon * value,const std::string & newName)223   ::ndk::ScopedAStatus RenamePolygon(RegularPolygon* value,
224                                      const std::string& newName) override {
225     value->name = newName;
226     return ::ndk::ScopedAStatus(AStatus_newOk());
227   }
RepeatBooleanArray(const std::vector<bool> & in_value,std::vector<bool> * out_repeated,std::vector<bool> * _aidl_return)228   ::ndk::ScopedAStatus RepeatBooleanArray(
229       const std::vector<bool>& in_value, std::vector<bool>* out_repeated,
230       std::vector<bool>* _aidl_return) override {
231     *out_repeated = in_value;
232     *_aidl_return = in_value;
233     return ::ndk::ScopedAStatus(AStatus_newOk());
234   }
RepeatByteArray(const std::vector<uint8_t> & in_value,std::vector<uint8_t> * out_repeated,std::vector<uint8_t> * _aidl_return)235   ::ndk::ScopedAStatus RepeatByteArray(const std::vector<uint8_t>& in_value,
236                                        std::vector<uint8_t>* out_repeated,
237                                        std::vector<uint8_t>* _aidl_return) override {
238     *out_repeated = in_value;
239     *_aidl_return = in_value;
240     return ::ndk::ScopedAStatus(AStatus_newOk());
241   }
RepeatCharArray(const std::vector<char16_t> & in_value,std::vector<char16_t> * out_repeated,std::vector<char16_t> * _aidl_return)242   ::ndk::ScopedAStatus RepeatCharArray(
243       const std::vector<char16_t>& in_value,
244       std::vector<char16_t>* out_repeated,
245       std::vector<char16_t>* _aidl_return) override {
246     *out_repeated = in_value;
247     *_aidl_return = in_value;
248     return ::ndk::ScopedAStatus(AStatus_newOk());
249   }
RepeatIntArray(const std::vector<int32_t> & in_value,std::vector<int32_t> * out_repeated,std::vector<int32_t> * _aidl_return)250   ::ndk::ScopedAStatus RepeatIntArray(
251       const std::vector<int32_t>& in_value, std::vector<int32_t>* out_repeated,
252       std::vector<int32_t>* _aidl_return) override {
253     *out_repeated = in_value;
254     *_aidl_return = in_value;
255     return ::ndk::ScopedAStatus(AStatus_newOk());
256   }
RepeatLongArray(const std::vector<int64_t> & in_value,std::vector<int64_t> * out_repeated,std::vector<int64_t> * _aidl_return)257   ::ndk::ScopedAStatus RepeatLongArray(
258       const std::vector<int64_t>& in_value, std::vector<int64_t>* out_repeated,
259       std::vector<int64_t>* _aidl_return) override {
260     *out_repeated = in_value;
261     *_aidl_return = in_value;
262     return ::ndk::ScopedAStatus(AStatus_newOk());
263   }
RepeatFloatArray(const std::vector<float> & in_value,std::vector<float> * out_repeated,std::vector<float> * _aidl_return)264   ::ndk::ScopedAStatus RepeatFloatArray(
265       const std::vector<float>& in_value, std::vector<float>* out_repeated,
266       std::vector<float>* _aidl_return) override {
267     *out_repeated = in_value;
268     *_aidl_return = in_value;
269     return ::ndk::ScopedAStatus(AStatus_newOk());
270   }
RepeatDoubleArray(const std::vector<double> & in_value,std::vector<double> * out_repeated,std::vector<double> * _aidl_return)271   ::ndk::ScopedAStatus RepeatDoubleArray(
272       const std::vector<double>& in_value, std::vector<double>* out_repeated,
273       std::vector<double>* _aidl_return) override {
274     *out_repeated = in_value;
275     *_aidl_return = in_value;
276     return ::ndk::ScopedAStatus(AStatus_newOk());
277   }
RepeatByteEnumArray(const std::vector<ByteEnum> & in_value,std::vector<ByteEnum> * out_repeated,std::vector<ByteEnum> * _aidl_return)278   ::ndk::ScopedAStatus RepeatByteEnumArray(const std::vector<ByteEnum>& in_value,
279                                            std::vector<ByteEnum>* out_repeated,
280                                            std::vector<ByteEnum>* _aidl_return) override {
281     *out_repeated = in_value;
282     *_aidl_return = in_value;
283     return ::ndk::ScopedAStatus(AStatus_newOk());
284   }
RepeatIntEnumArray(const std::vector<IntEnum> & in_value,std::vector<IntEnum> * out_repeated,std::vector<IntEnum> * _aidl_return)285   ::ndk::ScopedAStatus RepeatIntEnumArray(const std::vector<IntEnum>& in_value,
286                                           std::vector<IntEnum>* out_repeated,
287                                           std::vector<IntEnum>* _aidl_return) override {
288     *out_repeated = in_value;
289     *_aidl_return = in_value;
290     return ::ndk::ScopedAStatus(AStatus_newOk());
291   }
RepeatLongEnumArray(const std::vector<LongEnum> & in_value,std::vector<LongEnum> * out_repeated,std::vector<LongEnum> * _aidl_return)292   ::ndk::ScopedAStatus RepeatLongEnumArray(const std::vector<LongEnum>& in_value,
293                                            std::vector<LongEnum>* out_repeated,
294                                            std::vector<LongEnum>* _aidl_return) override {
295     *out_repeated = in_value;
296     *_aidl_return = in_value;
297     return ::ndk::ScopedAStatus(AStatus_newOk());
298   }
RepeatStringArray(const std::vector<std::string> & in_value,std::vector<std::string> * out_repeated,std::vector<std::string> * _aidl_return)299   ::ndk::ScopedAStatus RepeatStringArray(
300       const std::vector<std::string>& in_value,
301       std::vector<std::string>* out_repeated,
302       std::vector<std::string>* _aidl_return) override {
303     *out_repeated = in_value;
304     *_aidl_return = in_value;
305     return ::ndk::ScopedAStatus(AStatus_newOk());
306   }
RepeatRegularPolygonArray(const std::vector<RegularPolygon> & in_value,std::vector<RegularPolygon> * out_repeated,std::vector<RegularPolygon> * _aidl_return)307   ::ndk::ScopedAStatus RepeatRegularPolygonArray(
308       const std::vector<RegularPolygon>& in_value, std::vector<RegularPolygon>* out_repeated,
309       std::vector<RegularPolygon>* _aidl_return) override {
310     *out_repeated = in_value;
311     *_aidl_return = in_value;
312     return ::ndk::ScopedAStatus(AStatus_newOk());
313   }
314 
RepeatBinderArray(const std::vector<::ndk::SpAIBinder> & in_value,std::vector<::ndk::SpAIBinder> * out_repeated,std::vector<::ndk::SpAIBinder> * _aidl_return)315   ::ndk::ScopedAStatus RepeatBinderArray(const std::vector<::ndk::SpAIBinder>& in_value,
316                                          std::vector<::ndk::SpAIBinder>* out_repeated,
317                                          std::vector<::ndk::SpAIBinder>* _aidl_return) override {
318     *out_repeated = in_value;
319     *_aidl_return = in_value;
320     return ::ndk::ScopedAStatus(AStatus_newOk());
321   }
322 
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)323   ::ndk::ScopedAStatus RepeatInterfaceArray(
324       const std::vector<std::shared_ptr<IEmpty>>& in_value,
325       std::vector<std::shared_ptr<IEmpty>>* out_repeated,
326       std::vector<std::shared_ptr<IEmpty>>* _aidl_return) override {
327     *out_repeated = in_value;
328     *_aidl_return = in_value;
329     return ::ndk::ScopedAStatus(AStatus_newOk());
330   }
331 
Repeat2StringList(const std::vector<std::string> & in_input,std::vector<std::string> * out_repeated,std::vector<std::string> * _aidl_return)332   ::ndk::ScopedAStatus Repeat2StringList(const std::vector<std::string>& in_input,
333                                          std::vector<std::string>* out_repeated,
334                                          std::vector<std::string>* _aidl_return) override {
335     *out_repeated = std::vector<std::string>();
336     *_aidl_return = std::vector<std::string>();
337     for (int i = 0; i < 2; i++) {
338       for (auto& s : in_input) {
339         out_repeated->emplace_back(s);
340         _aidl_return->emplace_back(s);
341       }
342     }
343 
344     return ::ndk::ScopedAStatus(AStatus_newOk());
345   }
346 
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)347   ::ndk::ScopedAStatus Repeat2RegularPolygonList(
348       const std::vector<::aidl::test_package::RegularPolygon>& in_input,
349       std::vector<::aidl::test_package::RegularPolygon>* out_repeated,
350       std::vector<::aidl::test_package::RegularPolygon>* _aidl_return) override {
351     *out_repeated = std::vector<::aidl::test_package::RegularPolygon>();
352     *_aidl_return = std::vector<::aidl::test_package::RegularPolygon>();
353     for (int i = 0; i < 2; i++) {
354       for (auto& s : in_input) {
355         out_repeated->emplace_back(s);
356         _aidl_return->emplace_back(s);
357       }
358     }
359     return ::ndk::ScopedAStatus(AStatus_newOk());
360   }
361 
RepeatNullableBooleanArray(const std::optional<std::vector<bool>> & in_value,std::optional<std::vector<bool>> * _aidl_return)362   ::ndk::ScopedAStatus RepeatNullableBooleanArray(
363       const std::optional<std::vector<bool>>& in_value,
364       std::optional<std::vector<bool>>* _aidl_return) override {
365     *_aidl_return = in_value;
366     return ::ndk::ScopedAStatus(AStatus_newOk());
367   }
RepeatNullableByteArray(const std::optional<std::vector<uint8_t>> & in_value,std::optional<std::vector<uint8_t>> * _aidl_return)368   ::ndk::ScopedAStatus RepeatNullableByteArray(
369       const std::optional<std::vector<uint8_t>>& in_value,
370       std::optional<std::vector<uint8_t>>* _aidl_return) override {
371     *_aidl_return = in_value;
372     return ::ndk::ScopedAStatus(AStatus_newOk());
373   }
RepeatNullableCharArray(const std::optional<std::vector<char16_t>> & in_value,std::optional<std::vector<char16_t>> * _aidl_return)374   ::ndk::ScopedAStatus RepeatNullableCharArray(
375       const std::optional<std::vector<char16_t>>& in_value,
376       std::optional<std::vector<char16_t>>* _aidl_return) override {
377     *_aidl_return = in_value;
378     return ::ndk::ScopedAStatus(AStatus_newOk());
379   }
RepeatNullableIntArray(const std::optional<std::vector<int32_t>> & in_value,std::optional<std::vector<int32_t>> * _aidl_return)380   ::ndk::ScopedAStatus RepeatNullableIntArray(
381       const std::optional<std::vector<int32_t>>& in_value,
382       std::optional<std::vector<int32_t>>* _aidl_return) override {
383     *_aidl_return = in_value;
384     return ::ndk::ScopedAStatus(AStatus_newOk());
385   }
RepeatNullableLongArray(const std::optional<std::vector<int64_t>> & in_value,std::optional<std::vector<int64_t>> * _aidl_return)386   ::ndk::ScopedAStatus RepeatNullableLongArray(
387       const std::optional<std::vector<int64_t>>& in_value,
388       std::optional<std::vector<int64_t>>* _aidl_return) override {
389     *_aidl_return = in_value;
390     return ::ndk::ScopedAStatus(AStatus_newOk());
391   }
RepeatNullableFloatArray(const std::optional<std::vector<float>> & in_value,std::optional<std::vector<float>> * _aidl_return)392   ::ndk::ScopedAStatus RepeatNullableFloatArray(
393       const std::optional<std::vector<float>>& in_value,
394       std::optional<std::vector<float>>* _aidl_return) override {
395     *_aidl_return = in_value;
396     return ::ndk::ScopedAStatus(AStatus_newOk());
397   }
RepeatNullableDoubleArray(const std::optional<std::vector<double>> & in_value,std::optional<std::vector<double>> * _aidl_return)398   ::ndk::ScopedAStatus RepeatNullableDoubleArray(
399       const std::optional<std::vector<double>>& in_value,
400       std::optional<std::vector<double>>* _aidl_return) override {
401     *_aidl_return = in_value;
402     return ::ndk::ScopedAStatus(AStatus_newOk());
403   }
RepeatNullableByteEnumArray(const std::optional<std::vector<ByteEnum>> & in_value,std::optional<std::vector<ByteEnum>> * _aidl_return)404   ::ndk::ScopedAStatus RepeatNullableByteEnumArray(
405       const std::optional<std::vector<ByteEnum>>& in_value,
406       std::optional<std::vector<ByteEnum>>* _aidl_return) override {
407     *_aidl_return = in_value;
408     return ::ndk::ScopedAStatus(AStatus_newOk());
409   }
RepeatNullableIntEnumArray(const std::optional<std::vector<IntEnum>> & in_value,std::optional<std::vector<IntEnum>> * _aidl_return)410   ::ndk::ScopedAStatus RepeatNullableIntEnumArray(
411       const std::optional<std::vector<IntEnum>>& in_value,
412       std::optional<std::vector<IntEnum>>* _aidl_return) override {
413     *_aidl_return = in_value;
414     return ::ndk::ScopedAStatus(AStatus_newOk());
415   }
RepeatNullableLongEnumArray(const std::optional<std::vector<LongEnum>> & in_value,std::optional<std::vector<LongEnum>> * _aidl_return)416   ::ndk::ScopedAStatus RepeatNullableLongEnumArray(
417       const std::optional<std::vector<LongEnum>>& in_value,
418       std::optional<std::vector<LongEnum>>* _aidl_return) override {
419     *_aidl_return = in_value;
420     return ::ndk::ScopedAStatus(AStatus_newOk());
421   }
RepeatNullableStringArray(const std::optional<std::vector<std::optional<std::string>>> & in_value,std::optional<std::vector<std::optional<std::string>>> * _aidl_return)422   ::ndk::ScopedAStatus RepeatNullableStringArray(
423       const std::optional<std::vector<std::optional<std::string>>>& in_value,
424       std::optional<std::vector<std::optional<std::string>>>* _aidl_return) {
425     *_aidl_return = in_value;
426     return ::ndk::ScopedAStatus(AStatus_newOk());
427   }
RepeatNullableBinderArray(const std::optional<std::vector<::ndk::SpAIBinder>> & in_value,std::optional<std::vector<::ndk::SpAIBinder>> * _aidl_return)428   ::ndk::ScopedAStatus RepeatNullableBinderArray(
429       const std::optional<std::vector<::ndk::SpAIBinder>>& in_value,
430       std::optional<std::vector<::ndk::SpAIBinder>>* _aidl_return) override {
431     *_aidl_return = in_value;
432     return ::ndk::ScopedAStatus(AStatus_newOk());
433   }
RepeatNullableInterfaceArray(const std::optional<std::vector<std::shared_ptr<IEmpty>>> & in_value,std::optional<std::vector<std::shared_ptr<IEmpty>>> * _aidl_return)434   ::ndk::ScopedAStatus RepeatNullableInterfaceArray(
435       const std::optional<std::vector<std::shared_ptr<IEmpty>>>& in_value,
436       std::optional<std::vector<std::shared_ptr<IEmpty>>>* _aidl_return) override {
437     *_aidl_return = in_value;
438     return ::ndk::ScopedAStatus(AStatus_newOk());
439   }
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)440   ::ndk::ScopedAStatus DoubleRepeatNullableStringArray(
441       const std::optional<std::vector<std::optional<std::string>>>& in_value,
442       std::optional<std::vector<std::optional<std::string>>>* out_repeated,
443       std::optional<std::vector<std::optional<std::string>>>* _aidl_return)
444       override {
445     *out_repeated = in_value;
446     *_aidl_return = in_value;
447     return ::ndk::ScopedAStatus(AStatus_newOk());
448   }
449 
getICompatTest(::ndk::SpAIBinder * _aidl_return)450   ::ndk::ScopedAStatus getICompatTest(::ndk::SpAIBinder* _aidl_return) {
451     class MyCompatTest : public ::aidl::test_package::BnCompatTest {
452      public:
453       ::ndk::ScopedAStatus repeatBaz(const ::aidl::test_package::Baz& in_inBaz,
454                                      ::aidl::test_package::Baz* _aidl_return) override {
455         *_aidl_return = in_inBaz;
456         return ::ndk::ScopedAStatus(AStatus_newOk());
457       }
458 
459 #ifdef USING_VERSION_1
460       ::ndk::ScopedAStatus RepeatStringNullableLater(const std::string& in_value,
461                                                      std::string* _aidl_return) override {
462         *_aidl_return = in_value;
463         return ::ndk::ScopedAStatus(AStatus_newOk());
464       }
465 #else
466       ::ndk::ScopedAStatus RepeatStringNullableLater(
467           const std::optional<std::string>& in_value,
468           std::optional<std::string>* _aidl_return) override {
469         *_aidl_return = in_value;
470         return ::ndk::ScopedAStatus(AStatus_newOk());
471       }
472 #endif
473 
474 #ifndef USING_VERSION_1
475       ::ndk::ScopedAStatus NewMethodThatReturns10(int32_t* _aidl_return) override {
476         *_aidl_return = 10;
477         return ::ndk::ScopedAStatus(AStatus_newOk());
478       }
479 #endif
480     };
481     *_aidl_return = SharedRefBase::make<MyCompatTest>()->asBinder();
482     return ::ndk::ScopedAStatus(AStatus_newOk());
483   }
484 
getLegacyBinderTest(::ndk::SpAIBinder * _aidl_return)485   ::ndk::ScopedAStatus getLegacyBinderTest(::ndk::SpAIBinder* _aidl_return) {
486     *_aidl_return = ::ndk::SpAIBinder(AIBinder_new(kLegacyBinderClass, nullptr));
487     return ::ndk::ScopedAStatus(AStatus_newOk());
488   }
489 
RepeatExtendableParcelable(const::aidl::test_package::ExtendableParcelable & in_input,::aidl::test_package::ExtendableParcelable * out_output)490   ::ndk::ScopedAStatus RepeatExtendableParcelable(
491       const ::aidl::test_package::ExtendableParcelable& in_input,
492       ::aidl::test_package::ExtendableParcelable* out_output) {
493     RepeatExtendableParcelableWithoutExtension(in_input, out_output);
494     std::optional<MyExt> ext;
495     in_input.ext.getParcelable(&ext);
496     MyExt ext2;
497     ext2.a = ext->a;
498     ext2.b = ext->b;
499     out_output->ext.setParcelable(ext2);
500     return ::ndk::ScopedAStatus(AStatus_newOk());
501   }
502 
RepeatExtendableParcelableWithoutExtension(const::aidl::test_package::ExtendableParcelable & in_input,::aidl::test_package::ExtendableParcelable * out_output)503   ::ndk::ScopedAStatus RepeatExtendableParcelableWithoutExtension(
504       const ::aidl::test_package::ExtendableParcelable& in_input,
505       ::aidl::test_package::ExtendableParcelable* out_output) {
506     out_output->a = in_input.a;
507     out_output->b = in_input.b;
508     out_output->c = in_input.c;
509     return ::ndk::ScopedAStatus(AStatus_newOk());
510   }
511 
RepeatSimpleUnion(const SimpleUnion & in_u,SimpleUnion * _aidl_return)512   ::ndk::ScopedAStatus RepeatSimpleUnion(const SimpleUnion& in_u,
513                                          SimpleUnion* _aidl_return) override {
514     *_aidl_return = in_u;
515     return ::ndk::ScopedAStatus(AStatus_newOk());
516   }
517 
repeatFoo(const Foo & in_inFoo,Foo * _aidl_return)518   ::ndk::ScopedAStatus repeatFoo(const Foo& in_inFoo, Foo* _aidl_return) {
519     *_aidl_return = in_inFoo;
520     return ::ndk::ScopedAStatus(AStatus_newOk());
521   }
522 
renameFoo(Foo * in_foo,const std::string & in_name)523   ::ndk::ScopedAStatus renameFoo(Foo* in_foo, const std::string& in_name) {
524     in_foo->a = in_name;
525     return ::ndk::ScopedAStatus(AStatus_newOk());
526   }
527 
renameBar(Foo * in_foo,const std::string & in_name)528   ::ndk::ScopedAStatus renameBar(Foo* in_foo, const std::string& in_name) {
529     in_foo->d.a = in_name;
530     return ::ndk::ScopedAStatus(AStatus_newOk());
531   }
532 
getF(const Foo & foo,int32_t * _aidl_return)533   ::ndk::ScopedAStatus getF(const Foo& foo, int32_t* _aidl_return) {
534     *_aidl_return = foo.f;
535     return ::ndk::ScopedAStatus(AStatus_newOk());
536   }
537 
repeatGenericBar(const::aidl::test_package::GenericBar<int32_t> & in_inFoo,::aidl::test_package::GenericBar<int32_t> * _aidl_return)538   ::ndk::ScopedAStatus repeatGenericBar(const ::aidl::test_package::GenericBar<int32_t>& in_inFoo,
539                                         ::aidl::test_package::GenericBar<int32_t>* _aidl_return) {
540     *_aidl_return = in_inFoo;
541     return ::ndk::ScopedAStatus(AStatus_newOk());
542   }
543 };
544