• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2015 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 <map>
18 #include <sstream>
19 #include <string>
20 #include <vector>
21 
22 #include <unistd.h>
23 
24 #include <android-base/unique_fd.h>
25 #include <binder/IInterface.h>
26 #include <binder/IPCThreadState.h>
27 #include <binder/IServiceManager.h>
28 #include <binder/ProcessState.h>
29 #include <binder/Status.h>
30 #include <binder/Value.h>
31 #include <utils/Errors.h>
32 #include <utils/Log.h>
33 #include <utils/Looper.h>
34 #include <utils/StrongPointer.h>
35 
36 #include "android/aidl/tests/BnTestService.h"
37 #include "android/aidl/tests/ITestService.h"
38 
39 #include "android/aidl/tests/BnNamedCallback.h"
40 #include "android/aidl/tests/INamedCallback.h"
41 
42 // Used implicitly.
43 #undef LOG_TAG
44 #define LOG_TAG "aidl_native_service"
45 
46 // libbase
47 using android::base::unique_fd;
48 
49 // libutils:
50 using android::Looper;
51 using android::LooperCallback;
52 using android::OK;
53 using android::sp;
54 using android::String16;
55 
56 // libbinder:
57 using android::BnInterface;
58 using android::defaultServiceManager;
59 using android::IInterface;
60 using android::IPCThreadState;
61 using android::Parcel;
62 using android::ProcessState;
63 using android::binder::Status;
64 
65 // Generated code:
66 using android::aidl::tests::BnNamedCallback;
67 using android::aidl::tests::BnTestService;
68 using android::aidl::tests::INamedCallback;
69 using android::aidl::tests::SimpleParcelable;
70 using android::os::PersistableBundle;
71 using android::binder::Map;
72 
73 // Standard library
74 using std::map;
75 using std::string;
76 using std::unique_ptr;
77 using std::vector;
78 
79 namespace {
80 
81 class BinderCallback : public LooperCallback {
82  public:
BinderCallback()83   BinderCallback() {}
~BinderCallback()84   ~BinderCallback() override {}
85 
handleEvent(int,int,void *)86   int handleEvent(int /* fd */, int /* events */, void* /* data */) override {
87     IPCThreadState::self()->handlePolledCommands();
88     return 1;  // Continue receiving callbacks.
89   }
90 };
91 
92 class NamedCallback : public BnNamedCallback {
93  public:
NamedCallback(String16 name)94   explicit NamedCallback(String16 name) : name_(name) {}
95 
GetName(String16 * ret)96   Status GetName(String16* ret) {
97     *ret = name_;
98     return Status::ok();
99   }
100 
101  private:
102   String16 name_;
103 };
104 
105 class NativeService : public BnTestService {
106  public:
NativeService()107   NativeService() {}
108   virtual ~NativeService() = default;
109 
LogRepeatedStringToken(const String16 & token)110   void LogRepeatedStringToken(const String16& token) {
111     ALOGI("Repeating '%s' of length=%zu", android::String8(token).string(),
112           token.size());
113   }
114 
115   template <typename T>
LogRepeatedToken(const T & token)116   void LogRepeatedToken(const T& token) {
117     std::ostringstream token_str;
118     token_str << token;
119     ALOGI("Repeating token %s", token_str.str().c_str());
120   }
121 
LogRepeatedMapToken(const Map & token)122   void LogRepeatedMapToken(const Map& token) {
123     ALOGI("Repeating Map with %d elements", (int)token.size());
124   }
125 
RepeatBoolean(bool token,bool * _aidl_return)126   Status RepeatBoolean(bool token, bool* _aidl_return) override {
127     LogRepeatedToken(token ? 1 : 0);
128     *_aidl_return = token;
129     return Status::ok();
130   }
RepeatByte(int8_t token,int8_t * _aidl_return)131   Status RepeatByte(int8_t token, int8_t* _aidl_return) override {
132     LogRepeatedToken(token);
133     *_aidl_return = token;
134     return Status::ok();
135   }
RepeatChar(char16_t token,char16_t * _aidl_return)136   Status RepeatChar(char16_t token, char16_t* _aidl_return) override {
137     LogRepeatedStringToken(String16(&token, 1));
138     *_aidl_return = token;
139     return Status::ok();
140   }
RepeatInt(int32_t token,int32_t * _aidl_return)141   Status RepeatInt(int32_t token, int32_t* _aidl_return) override {
142     LogRepeatedToken(token);
143     *_aidl_return = token;
144     return Status::ok();
145   }
RepeatLong(int64_t token,int64_t * _aidl_return)146   Status RepeatLong(int64_t token, int64_t* _aidl_return) override {
147     LogRepeatedToken(token);
148     *_aidl_return = token;
149     return Status::ok();
150   }
RepeatFloat(float token,float * _aidl_return)151   Status RepeatFloat(float token, float* _aidl_return) override {
152     LogRepeatedToken(token);
153     *_aidl_return = token;
154     return Status::ok();
155   }
RepeatDouble(double token,double * _aidl_return)156   Status RepeatDouble(double token, double* _aidl_return) override {
157     LogRepeatedToken(token);
158     *_aidl_return = token;
159     return Status::ok();
160   }
RepeatString(const String16 & token,String16 * _aidl_return)161   Status RepeatString(const String16& token, String16* _aidl_return) override {
162     LogRepeatedStringToken(token);
163     *_aidl_return = token;
164     return Status::ok();
165   }
RepeatMap(const Map & token,Map * _aidl_return)166   Status RepeatMap(const Map& token, Map* _aidl_return) override {
167     LogRepeatedMapToken(token);
168     *_aidl_return = token;
169     return Status::ok();
170   }
171 
RepeatSimpleParcelable(const SimpleParcelable & input,SimpleParcelable * repeat,SimpleParcelable * _aidl_return)172   Status RepeatSimpleParcelable(const SimpleParcelable& input,
173                                 SimpleParcelable* repeat,
174                                 SimpleParcelable* _aidl_return) override {
175     ALOGI("Repeated a SimpleParcelable %s", input.toString().c_str());
176     *repeat = input;
177     *_aidl_return = input;
178     return Status::ok();
179   }
180 
RepeatPersistableBundle(const PersistableBundle & input,PersistableBundle * _aidl_return)181   Status RepeatPersistableBundle(const PersistableBundle& input,
182                                  PersistableBundle* _aidl_return) override {
183     ALOGI("Repeated a PersistableBundle");
184     *_aidl_return = input;
185     return Status::ok();
186   }
187 
188   template <typename T>
ReverseArray(const vector<T> & input,vector<T> * repeated,vector<T> * _aidl_return)189   Status ReverseArray(const vector<T>& input, vector<T>* repeated,
190                       vector<T>* _aidl_return) {
191     ALOGI("Reversing array of length %zu", input.size());
192     *repeated = input;
193     *_aidl_return = input;
194     std::reverse(_aidl_return->begin(), _aidl_return->end());
195     return Status::ok();
196   }
197 
198   template<typename T>
RepeatNullable(const unique_ptr<T> & input,unique_ptr<T> * _aidl_return)199   Status RepeatNullable(const unique_ptr<T>& input,
200                         unique_ptr<T>* _aidl_return) {
201     ALOGI("Repeating nullable value");
202 
203     _aidl_return->reset();
204     if (input) {
205       _aidl_return->reset(new T(*input));
206     }
207 
208     return Status::ok();
209   }
210 
ReverseBoolean(const vector<bool> & input,vector<bool> * repeated,vector<bool> * _aidl_return)211   Status ReverseBoolean(const vector<bool>& input,
212                         vector<bool>* repeated,
213                         vector<bool>* _aidl_return) override {
214     return ReverseArray(input, repeated, _aidl_return);
215   }
ReverseByte(const vector<uint8_t> & input,vector<uint8_t> * repeated,vector<uint8_t> * _aidl_return)216   Status ReverseByte(const vector<uint8_t>& input,
217                      vector<uint8_t>* repeated,
218                      vector<uint8_t>* _aidl_return) override {
219     return ReverseArray(input, repeated, _aidl_return);
220   }
ReverseChar(const vector<char16_t> & input,vector<char16_t> * repeated,vector<char16_t> * _aidl_return)221   Status ReverseChar(const vector<char16_t>& input,
222                      vector<char16_t>* repeated,
223                      vector<char16_t>* _aidl_return) override {
224     return ReverseArray(input, repeated, _aidl_return);
225   }
ReverseInt(const vector<int32_t> & input,vector<int32_t> * repeated,vector<int32_t> * _aidl_return)226   Status ReverseInt(const vector<int32_t>& input,
227                     vector<int32_t>* repeated,
228                     vector<int32_t>* _aidl_return) override {
229     return ReverseArray(input, repeated, _aidl_return);
230   }
ReverseLong(const vector<int64_t> & input,vector<int64_t> * repeated,vector<int64_t> * _aidl_return)231   Status ReverseLong(const vector<int64_t>& input,
232                      vector<int64_t>* repeated,
233                      vector<int64_t>* _aidl_return) override {
234     return ReverseArray(input, repeated, _aidl_return);
235   }
ReverseFloat(const vector<float> & input,vector<float> * repeated,vector<float> * _aidl_return)236   Status ReverseFloat(const vector<float>& input,
237                       vector<float>* repeated,
238                       vector<float>* _aidl_return) override {
239     return ReverseArray(input, repeated, _aidl_return);
240   }
ReverseDouble(const vector<double> & input,vector<double> * repeated,vector<double> * _aidl_return)241   Status ReverseDouble(const vector<double>& input,
242                        vector<double>* repeated,
243                        vector<double>* _aidl_return) override {
244     return ReverseArray(input, repeated, _aidl_return);
245   }
ReverseString(const vector<String16> & input,vector<String16> * repeated,vector<String16> * _aidl_return)246   Status ReverseString(const vector<String16>& input,
247                        vector<String16>* repeated,
248                        vector<String16>* _aidl_return) override {
249     return ReverseArray(input, repeated, _aidl_return);
250   }
ReverseSimpleParcelables(const vector<SimpleParcelable> & input,vector<SimpleParcelable> * repeated,vector<SimpleParcelable> * _aidl_return)251   Status ReverseSimpleParcelables(
252       const vector<SimpleParcelable>& input,
253       vector<SimpleParcelable>* repeated,
254       vector<SimpleParcelable>* _aidl_return) override {
255     return ReverseArray(input, repeated, _aidl_return);
256   }
ReversePersistableBundles(const vector<PersistableBundle> & input,vector<PersistableBundle> * repeated,vector<PersistableBundle> * _aidl_return)257   Status ReversePersistableBundles(
258       const vector<PersistableBundle>& input,
259       vector<PersistableBundle>* repeated,
260       vector<PersistableBundle>* _aidl_return) override {
261     return ReverseArray(input, repeated, _aidl_return);
262   }
263 
GetOtherTestService(const String16 & name,sp<INamedCallback> * returned_service)264   Status GetOtherTestService(const String16& name,
265                              sp<INamedCallback>* returned_service) override {
266     if (service_map_.find(name) == service_map_.end()) {
267       sp<INamedCallback> new_item(new NamedCallback(name));
268       service_map_[name] = new_item;
269     }
270 
271     *returned_service = service_map_[name];
272     return Status::ok();
273   }
274 
VerifyName(const sp<INamedCallback> & service,const String16 & name,bool * returned_value)275   Status VerifyName(const sp<INamedCallback>& service, const String16& name,
276                     bool* returned_value) override {
277     String16 foundName;
278     Status status = service->GetName(&foundName);
279 
280     if (status.isOk()) {
281       *returned_value = foundName == name;
282     }
283 
284     return status;
285   }
286 
ReverseStringList(const vector<String16> & input,vector<String16> * repeated,vector<String16> * _aidl_return)287   Status ReverseStringList(const vector<String16>& input,
288                            vector<String16>* repeated,
289                            vector<String16>* _aidl_return) override {
290     return ReverseArray(input, repeated, _aidl_return);
291   }
292 
ReverseNamedCallbackList(const vector<sp<IBinder>> & input,vector<sp<IBinder>> * repeated,vector<sp<IBinder>> * _aidl_return)293   Status ReverseNamedCallbackList(const vector<sp<IBinder>>& input,
294                                   vector<sp<IBinder>>* repeated,
295                                   vector<sp<IBinder>>* _aidl_return) override {
296     return ReverseArray(input, repeated, _aidl_return);
297   }
298 
RepeatFileDescriptor(const unique_fd & read,unique_fd * _aidl_return)299   Status RepeatFileDescriptor(const unique_fd& read,
300                               unique_fd* _aidl_return) override {
301     ALOGE("Repeating file descriptor");
302     *_aidl_return = unique_fd(dup(read.get()));
303     return Status::ok();
304   }
305 
ReverseFileDescriptorArray(const vector<unique_fd> & input,vector<unique_fd> * repeated,vector<unique_fd> * _aidl_return)306   Status ReverseFileDescriptorArray(const vector<unique_fd>& input,
307                                     vector<unique_fd>* repeated,
308                                     vector<unique_fd>* _aidl_return) override {
309     ALOGI("Reversing descriptor array of length %zu", input.size());
310     for (const auto& item : input) {
311       repeated->push_back(unique_fd(dup(item.get())));
312       _aidl_return->push_back(unique_fd(dup(item.get())));
313     }
314     std::reverse(_aidl_return->begin(), _aidl_return->end());
315     return Status::ok();
316   }
317 
ThrowServiceException(int code)318   Status ThrowServiceException(int code) override {
319     return Status::fromServiceSpecificError(code);
320   }
321 
RepeatNullableIntArray(const unique_ptr<vector<int32_t>> & input,unique_ptr<vector<int32_t>> * _aidl_return)322   Status RepeatNullableIntArray(const unique_ptr<vector<int32_t>>& input,
323                                 unique_ptr<vector<int32_t>>* _aidl_return) {
324     return RepeatNullable(input, _aidl_return);
325   }
326 
RepeatNullableStringList(const unique_ptr<vector<unique_ptr<String16>>> & input,unique_ptr<vector<unique_ptr<String16>>> * _aidl_return)327   Status RepeatNullableStringList(
328              const unique_ptr<vector<unique_ptr<String16>>>& input,
329              unique_ptr<vector<unique_ptr<String16>>>* _aidl_return) {
330     ALOGI("Repeating nullable string list");
331     if (!input) {
332       _aidl_return->reset();
333       return Status::ok();
334     }
335 
336     _aidl_return->reset(new vector<unique_ptr<String16>>);
337 
338     for (const auto& item : *input) {
339       if (!item) {
340         (*_aidl_return)->emplace_back(nullptr);
341       } else {
342         (*_aidl_return)->emplace_back(new String16(*item));
343       }
344     }
345 
346     return Status::ok();
347   }
348 
RepeatNullableString(const unique_ptr<String16> & input,unique_ptr<String16> * _aidl_return)349   Status RepeatNullableString(const unique_ptr<String16>& input,
350                               unique_ptr<String16>* _aidl_return) {
351     return RepeatNullable(input, _aidl_return);
352   }
353 
RepeatNullableParcelable(const unique_ptr<SimpleParcelable> & input,unique_ptr<SimpleParcelable> * _aidl_return)354   Status RepeatNullableParcelable(const unique_ptr<SimpleParcelable>& input,
355                               unique_ptr<SimpleParcelable>* _aidl_return) {
356     return RepeatNullable(input, _aidl_return);
357   }
358 
TakesAnIBinder(const sp<IBinder> & input)359   Status TakesAnIBinder(const sp<IBinder>& input) override {
360     (void)input;
361     return Status::ok();
362   }
TakesAnIBinderList(const vector<sp<IBinder>> & input)363   Status TakesAnIBinderList(const vector<sp<IBinder>>& input) override {
364     (void)input;
365     return Status::ok();
366   }
TakesANullableIBinder(const sp<IBinder> & input)367   Status TakesANullableIBinder(const sp<IBinder>& input) {
368     (void)input;
369     return Status::ok();
370   }
TakesANullableIBinderList(const unique_ptr<vector<sp<IBinder>>> & input)371   Status TakesANullableIBinderList(const unique_ptr<vector<sp<IBinder>>>& input) {
372     (void)input;
373     return Status::ok();
374   }
375 
RepeatUtf8CppString(const string & token,string * _aidl_return)376   Status RepeatUtf8CppString(const string& token,
377                              string* _aidl_return) override {
378     ALOGI("Repeating utf8 string '%s' of length=%zu", token.c_str(), token.size());
379     *_aidl_return = token;
380     return Status::ok();
381   }
382 
RepeatNullableUtf8CppString(const unique_ptr<string> & token,unique_ptr<string> * _aidl_return)383   Status RepeatNullableUtf8CppString(
384       const unique_ptr<string>& token,
385       unique_ptr<string>* _aidl_return) override {
386     if (!token) {
387       ALOGI("Received null @utf8InCpp string");
388       return Status::ok();
389     }
390     ALOGI("Repeating utf8 string '%s' of length=%zu",
391           token->c_str(), token->size());
392     _aidl_return->reset(new string(*token));
393     return Status::ok();
394   }
395 
ReverseUtf8CppString(const vector<string> & input,vector<string> * repeated,vector<string> * _aidl_return)396   Status ReverseUtf8CppString(const vector<string>& input,
397                               vector<string>* repeated,
398                               vector<string>* _aidl_return) {
399     return ReverseArray(input, repeated, _aidl_return);
400   }
401 
ReverseUtf8CppStringList(const unique_ptr<vector<unique_ptr<::string>>> & input,unique_ptr<vector<unique_ptr<string>>> * repeated,unique_ptr<vector<unique_ptr<string>>> * _aidl_return)402   Status ReverseUtf8CppStringList(
403       const unique_ptr<vector<unique_ptr<::string>>>& input,
404       unique_ptr<vector<unique_ptr<string>>>* repeated,
405       unique_ptr<vector<unique_ptr<string>>>* _aidl_return) {
406     if (!input) {
407       ALOGI("Received null list of utf8 strings");
408       return Status::ok();
409     }
410     _aidl_return->reset(new vector<unique_ptr<string>>);
411     repeated->reset(new vector<unique_ptr<string>>);
412 
413     for (const auto& item : *input) {
414       (*repeated)->emplace_back(nullptr);
415       (*_aidl_return)->emplace_back(nullptr);
416       if (item) {
417         (*repeated)->back().reset(new string(*item));
418         (*_aidl_return)->back().reset(new string(*item));
419       }
420     }
421     std::reverse((*_aidl_return)->begin(), (*_aidl_return)->end());
422 
423     return Status::ok();
424   }
425 
GetCallback(bool return_null,sp<INamedCallback> * ret)426   Status GetCallback(bool return_null, sp<INamedCallback>* ret) {
427     if (!return_null) {
428       return GetOtherTestService(String16("ABT: always be testing"), ret);
429     }
430     return Status::ok();
431   }
432 
433  private:
434   map<String16, sp<INamedCallback>> service_map_;
435 };
436 
Run()437 int Run() {
438   android::sp<NativeService> service = new NativeService;
439   sp<Looper> looper(Looper::prepare(0 /* opts */));
440 
441   int binder_fd = -1;
442   ProcessState::self()->setThreadPoolMaxThreadCount(0);
443   IPCThreadState::self()->disableBackgroundScheduling(true);
444   IPCThreadState::self()->setupPolling(&binder_fd);
445   ALOGI("Got binder FD %d", binder_fd);
446   if (binder_fd < 0) return -1;
447 
448   sp<BinderCallback> cb(new BinderCallback);
449   if (looper->addFd(binder_fd, Looper::POLL_CALLBACK, Looper::EVENT_INPUT, cb,
450                     nullptr) != 1) {
451     ALOGE("Failed to add binder FD to Looper");
452     return -1;
453   }
454 
455   defaultServiceManager()->addService(service->getInterfaceDescriptor(),
456                                       service);
457 
458   ALOGI("Entering loop");
459   while (true) {
460     const int result = looper->pollAll(-1 /* timeoutMillis */);
461     ALOGI("Looper returned %d", result);
462   }
463   return 0;
464 }
465 
466 }  // namespace
467 
main(int,char * [])468 int main(int /* argc */, char* /* argv */ []) {
469   return Run();
470 }
471