blob: fd0e485185392045d3bd78b264cdc41e54e13bf3 [file] [log] [blame]
Martijn Coenen72110162016-08-19 14:28:25 +02001/*
2 * Copyright (C) 2016 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#define LOG_TAG "HwServiceManager"
18
19#include <hidl/IServiceManager.h>
20#include <hidl/Static.h>
Martijn Coenenbb5e9bb2016-09-01 01:36:18 +020021#include <hidl/Status.h>
Martijn Coenen72110162016-08-19 14:28:25 +020022
23#include <utils/Log.h>
24#include <hwbinder/IPCThreadState.h>
25#include <hwbinder/Parcel.h>
26#include <hwbinder/Static.h>
27#include <utils/String8.h>
28#include <utils/SystemClock.h>
29
30#include <unistd.h>
31
32
33namespace android {
34namespace hardware {
35sp<IServiceManager> defaultServiceManager()
36{
37 if (gDefaultServiceManager != NULL) return gDefaultServiceManager;
38
39 {
40 AutoMutex _l(gDefaultServiceManagerLock);
41 while (gDefaultServiceManager == NULL) {
Martijn Coenenc28f1152016-08-22 14:06:56 +020042 gDefaultServiceManager = interface_cast<IHwServiceManager>(
Martijn Coenen72110162016-08-19 14:28:25 +020043 ProcessState::self()->getContextObject(NULL));
44 if (gDefaultServiceManager == NULL)
45 sleep(1);
46 }
47 }
48
49 return gDefaultServiceManager;
50}
51
52// ----------------------------------------------------------------------
53
Martijn Coenenc28f1152016-08-22 14:06:56 +020054class BpServiceManager : public BpInterface<IHwServiceManager>
Martijn Coenen72110162016-08-19 14:28:25 +020055{
56public:
57 explicit BpServiceManager(const sp<IBinder>& impl)
Martijn Coenenc28f1152016-08-22 14:06:56 +020058 : BpInterface<IHwServiceManager>(impl)
Martijn Coenen72110162016-08-19 14:28:25 +020059 {
60 }
61
62 virtual sp<IBinder> getService(const String16& name, const hidl_version& version) const
63 {
64 unsigned n;
65 for (n = 0; n < 5; n++){
66 sp<IBinder> svc = checkService(name, version);
67 if (svc != NULL) return svc;
68 ALOGI("Waiting for service %s...\n", String8(name).string());
69 sleep(1);
70 }
71 return NULL;
72 }
73
74 virtual sp<IBinder> checkService( const String16& name, const hidl_version& version) const
75 {
76 Parcel data, reply;
Martijn Coenenc28f1152016-08-22 14:06:56 +020077 data.writeInterfaceToken(getInterfaceDescriptor());
Martijn Coenen72110162016-08-19 14:28:25 +020078 data.writeString16(name);
79 version.writeToParcel(data);
80 remote()->transact(CHECK_SERVICE_TRANSACTION, data, &reply);
81 return reply.readStrongBinder();
82 }
83
84 virtual status_t addService(const String16& name,
85 const sp<IBinder>& service, const hidl_version& version,
86 bool allowIsolated)
87 {
88 Parcel data, reply;
Martijn Coenenc28f1152016-08-22 14:06:56 +020089 data.writeInterfaceToken(getInterfaceDescriptor());
Martijn Coenen72110162016-08-19 14:28:25 +020090 data.writeString16(name);
91 data.writeStrongBinder(service);
92 version.writeToParcel(data);
93 data.writeInt32(allowIsolated ? 1 : 0);
94 status_t err = remote()->transact(ADD_SERVICE_TRANSACTION, data, &reply);
Martijn Coenenbb5e9bb2016-09-01 01:36:18 +020095 if (err == NO_ERROR) {
96 Status status;
97 status.readFromParcel(reply);
98 return status.exceptionCode();
99 } else {
100 return err;
101 }
Martijn Coenen72110162016-08-19 14:28:25 +0200102 }
103
104 virtual Vector<String16> listServices()
105 {
106 Vector<String16> res;
107 int n = 0;
108
109 for (;;) {
110 Parcel data, reply;
Martijn Coenenc28f1152016-08-22 14:06:56 +0200111 data.writeInterfaceToken(getInterfaceDescriptor());
Martijn Coenen72110162016-08-19 14:28:25 +0200112 data.writeInt32(n++);
113 status_t err = remote()->transact(LIST_SERVICES_TRANSACTION, data, &reply);
114 if (err != NO_ERROR)
115 break;
116 res.add(reply.readString16());
117 }
118 return res;
119 }
120};
121
122IMPLEMENT_HWBINDER_META_INTERFACE(ServiceManager, "android.hardware.IServiceManager");
123
124}; // namespace hardware
125}; // namespace android