blob: 5bb6b92482a85f465f0dd8f3093aff01c09ba89f [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;
Martijn Coenen277f0612016-09-06 16:40:20 +020038 if (access("/dev/hwbinder", F_OK) != 0) {
39 // HwBinder not available on this device or not accessible to
40 // this process.
41 return nullptr;
42 }
Martijn Coenen72110162016-08-19 14:28:25 +020043 {
44 AutoMutex _l(gDefaultServiceManagerLock);
45 while (gDefaultServiceManager == NULL) {
Martijn Coenenc28f1152016-08-22 14:06:56 +020046 gDefaultServiceManager = interface_cast<IHwServiceManager>(
Martijn Coenen72110162016-08-19 14:28:25 +020047 ProcessState::self()->getContextObject(NULL));
48 if (gDefaultServiceManager == NULL)
49 sleep(1);
50 }
51 }
52
53 return gDefaultServiceManager;
54}
55
56// ----------------------------------------------------------------------
57
Martijn Coenenc28f1152016-08-22 14:06:56 +020058class BpServiceManager : public BpInterface<IHwServiceManager>
Martijn Coenen72110162016-08-19 14:28:25 +020059{
60public:
61 explicit BpServiceManager(const sp<IBinder>& impl)
Martijn Coenenc28f1152016-08-22 14:06:56 +020062 : BpInterface<IHwServiceManager>(impl)
Martijn Coenen72110162016-08-19 14:28:25 +020063 {
64 }
65
66 virtual sp<IBinder> getService(const String16& name, const hidl_version& version) const
67 {
68 unsigned n;
69 for (n = 0; n < 5; n++){
70 sp<IBinder> svc = checkService(name, version);
71 if (svc != NULL) return svc;
72 ALOGI("Waiting for service %s...\n", String8(name).string());
73 sleep(1);
74 }
75 return NULL;
76 }
77
78 virtual sp<IBinder> checkService( const String16& name, const hidl_version& version) const
79 {
80 Parcel data, reply;
Martijn Coenenc28f1152016-08-22 14:06:56 +020081 data.writeInterfaceToken(getInterfaceDescriptor());
Martijn Coenen72110162016-08-19 14:28:25 +020082 data.writeString16(name);
83 version.writeToParcel(data);
84 remote()->transact(CHECK_SERVICE_TRANSACTION, data, &reply);
85 return reply.readStrongBinder();
86 }
87
88 virtual status_t addService(const String16& name,
89 const sp<IBinder>& service, const hidl_version& version,
90 bool allowIsolated)
91 {
92 Parcel data, reply;
Martijn Coenenc28f1152016-08-22 14:06:56 +020093 data.writeInterfaceToken(getInterfaceDescriptor());
Martijn Coenen72110162016-08-19 14:28:25 +020094 data.writeString16(name);
95 data.writeStrongBinder(service);
96 version.writeToParcel(data);
97 data.writeInt32(allowIsolated ? 1 : 0);
98 status_t err = remote()->transact(ADD_SERVICE_TRANSACTION, data, &reply);
Martijn Coenenbb5e9bb2016-09-01 01:36:18 +020099 if (err == NO_ERROR) {
100 Status status;
101 status.readFromParcel(reply);
102 return status.exceptionCode();
103 } else {
104 return err;
105 }
Martijn Coenen72110162016-08-19 14:28:25 +0200106 }
107
108 virtual Vector<String16> listServices()
109 {
110 Vector<String16> res;
111 int n = 0;
112
113 for (;;) {
114 Parcel data, reply;
Martijn Coenenc28f1152016-08-22 14:06:56 +0200115 data.writeInterfaceToken(getInterfaceDescriptor());
Martijn Coenen72110162016-08-19 14:28:25 +0200116 data.writeInt32(n++);
117 status_t err = remote()->transact(LIST_SERVICES_TRANSACTION, data, &reply);
118 if (err != NO_ERROR)
119 break;
120 res.add(reply.readString16());
121 }
122 return res;
123 }
124};
125
126IMPLEMENT_HWBINDER_META_INTERFACE(ServiceManager, "android.hardware.IServiceManager");
127
128}; // namespace hardware
129}; // namespace android