1 /*
2 * Copyright (c) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include <iservice_registry.h>
17 #include <iremote_stub.h>
18 #include <hdf_base.h>
19 #include <hdf_log.h>
20 #include "iservmgr_hdi.h"
21
22 namespace OHOS {
23 namespace HDI {
24 namespace ServiceManager {
25 namespace V1_0 {
26 constexpr int DEVICE_SERVICE_MANAGER_SA_ID = 5100;
27 constexpr int DEVSVC_MANAGER_GET_SERVICE = 3;
28 constexpr int DEVSVC_MANAGER_REGISER_SVCLISTENER = 4;
29 constexpr int DEVSVC_MANAGER_UNREGISER_SVCLISTENER = 5;
30
31 class ServiceManagerProxy : public IRemoteProxy<IServiceManager> {
32 public:
ServiceManagerProxy(const sptr<IRemoteObject> & impl)33 explicit ServiceManagerProxy(const sptr<IRemoteObject>& impl) : IRemoteProxy<IServiceManager>(impl) {}
~ServiceManagerProxy()34 ~ServiceManagerProxy() {}
35
36 virtual sptr<IRemoteObject> GetService(const char* serviceName) override;
37 virtual int32_t RegisterServiceStatusListener(::OHOS::sptr<IServStatListener> listener,
38 uint16_t deviceClass) override;
39 virtual int32_t UnregisterServiceStatusListener(::OHOS::sptr<IServStatListener> listener) override;
40 private:
41 static inline BrokerDelegator<ServiceManagerProxy> delegator_;
42 };
43
Get()44 sptr<IServiceManager> IServiceManager::Get()
45 {
46 auto saManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
47 if (saManager == nullptr) {
48 HDF_LOGE("failed to get sa manager");
49 return nullptr;
50 }
51 sptr<IRemoteObject> remote = saManager->GetSystemAbility(DEVICE_SERVICE_MANAGER_SA_ID);
52 if (remote != nullptr) {
53 return iface_cast<IServiceManager>(remote);
54 }
55
56 HDF_LOGE("failed to get sa hdf service manager");
57 return nullptr;
58 }
59
RegisterServiceStatusListener(::OHOS::sptr<IServStatListener> listener,uint16_t deviceClass)60 int32_t ServiceManagerProxy::RegisterServiceStatusListener(::OHOS::sptr<IServStatListener> listener,
61 uint16_t deviceClass)
62 {
63 MessageParcel data;
64 MessageParcel reply;
65 MessageOption option;
66
67 if (!data.WriteInterfaceToken(ServiceManagerProxy::GetDescriptor()) ||
68 !data.WriteUint16(deviceClass) ||
69 !data.WriteRemoteObject(listener->AsObject())) {
70 return HDF_FAILURE;
71 }
72
73 int status = Remote()->SendRequest(DEVSVC_MANAGER_REGISER_SVCLISTENER, data, reply, option);
74 if (status) {
75 HDF_LOGE("failed to register servstat listener, %{public}d", status);
76 }
77 return status;
78 }
79
UnregisterServiceStatusListener(::OHOS::sptr<IServStatListener> listener)80 int32_t ServiceManagerProxy::UnregisterServiceStatusListener(::OHOS::sptr<IServStatListener> listener)
81 {
82 MessageParcel data;
83 MessageParcel reply;
84 MessageOption option;
85
86 if (!data.WriteInterfaceToken(ServiceManagerProxy::GetDescriptor()) ||
87 !data.WriteRemoteObject(listener->AsObject())) {
88 return HDF_FAILURE;
89 }
90
91 int status = Remote()->SendRequest(DEVSVC_MANAGER_UNREGISER_SVCLISTENER, data, reply, option);
92 if (status) {
93 HDF_LOGE("failed to unregister servstat listener, %{public}d", status);
94 }
95 return status;
96 }
97
GetService(const char * serviceName)98 sptr<IRemoteObject> ServiceManagerProxy::GetService(const char* serviceName)
99 {
100 MessageParcel data;
101 MessageParcel reply;
102 if (!data.WriteInterfaceToken(ServiceManagerProxy::GetDescriptor()) || !data.WriteCString(serviceName)) {
103 return nullptr;
104 }
105
106 MessageOption option;
107 int status = Remote()->SendRequest(DEVSVC_MANAGER_GET_SERVICE, data, reply, option);
108 if (status) {
109 HDF_LOGE("get hdi service %{public}s failed, %{public}d", serviceName, status);
110 return nullptr;
111 }
112 HDF_LOGD("get hdi service %{public}s success ", serviceName);
113 return reply.ReadRemoteObject();
114 }
115 } // namespace V1_0
116 } // namespace ServiceManager
117 } // namespace HDI
118 } // namespace OHOS