1 /*
2 * Copyright (c) 2020-2021 Huawei Device Co., Ltd.
3 *
4 * HDF is dual licensed: you can use it either under the terms of
5 * the GPL, or the BSD license, at your option.
6 * See the LICENSE file in the root of this repository for complete details.
7 */
8
9 #include "devsvc_manager_clnt.h"
10 #include "hdf_log.h"
11 #include "hdf_object_manager.h"
12
13 #define HDF_LOG_TAG devsvc_manager_clnt
14
DevSvcManagerClntAddService(const char * svcName,uint16_t devClass,struct HdfDeviceObject * service,const char * servinfo)15 int DevSvcManagerClntAddService(const char *svcName, uint16_t devClass,
16 struct HdfDeviceObject *service, const char *servinfo)
17 {
18 struct DevSvcManagerClnt *devSvcMgrClnt = DevSvcManagerClntGetInstance();
19 struct IDevSvcManager *serviceManager = NULL;
20 if (devSvcMgrClnt == NULL) {
21 HDF_LOGE("failed to add service, client is null");
22 return HDF_FAILURE;
23 }
24 if (devClass >= DEVICE_CLASS_MAX) {
25 HDF_LOGE("failed to add service, invalid class");
26 return HDF_FAILURE;
27 }
28
29 serviceManager = devSvcMgrClnt->devSvcMgrIf;
30 if (serviceManager == NULL || serviceManager->AddService == NULL) {
31 HDF_LOGE("serviceManager AddService function is null");
32 return HDF_FAILURE;
33 }
34 return serviceManager->AddService(serviceManager, svcName, devClass, service, servinfo);
35 }
36
DevSvcManagerClntUpdateService(const char * svcName,uint16_t devClass,struct HdfDeviceObject * service,const char * servinfo)37 int DevSvcManagerClntUpdateService(const char *svcName, uint16_t devClass,
38 struct HdfDeviceObject *service, const char *servinfo)
39 {
40 struct DevSvcManagerClnt *devSvcMgrClnt = DevSvcManagerClntGetInstance();
41 struct IDevSvcManager *serviceManager = NULL;
42 if (devSvcMgrClnt == NULL) {
43 HDF_LOGE("failed to add service, client is null");
44 return HDF_FAILURE;
45 }
46 if (devClass >= DEVICE_CLASS_MAX) {
47 HDF_LOGE("failed to add service, invalid class");
48 return HDF_FAILURE;
49 }
50
51 serviceManager = devSvcMgrClnt->devSvcMgrIf;
52 if (serviceManager == NULL || serviceManager->UpdateService == NULL) {
53 HDF_LOGE("serviceManager UpdateService function is null");
54 return HDF_FAILURE;
55 }
56 return serviceManager->UpdateService(serviceManager, svcName, devClass, service, servinfo);
57 }
58
DevSvcManagerClntGetService(const char * svcName)59 const struct HdfObject *DevSvcManagerClntGetService(const char *svcName)
60 {
61 struct DevSvcManagerClnt *devSvcMgrClnt = DevSvcManagerClntGetInstance();
62 struct IDevSvcManager *serviceManager = NULL;
63 if (devSvcMgrClnt == NULL) {
64 HDF_LOGE("failed to get service, client is null");
65 return NULL;
66 }
67
68 serviceManager = devSvcMgrClnt->devSvcMgrIf;
69 if (serviceManager == NULL || serviceManager->GetService == NULL) {
70 HDF_LOGE("serviceManager GetService function is null");
71 return NULL;
72 }
73 return serviceManager->GetService(serviceManager, svcName);
74 }
75
DevSvcManagerClntGetDeviceObject(const char * svcName)76 struct HdfDeviceObject *DevSvcManagerClntGetDeviceObject(const char *svcName)
77 {
78 struct DevSvcManagerClnt *devSvcMgrClnt = DevSvcManagerClntGetInstance();
79 struct IDevSvcManager *serviceManager = NULL;
80 if (devSvcMgrClnt == NULL) {
81 HDF_LOGE("failed to get device object, client is null");
82 return NULL;
83 }
84
85 serviceManager = devSvcMgrClnt->devSvcMgrIf;
86 if (serviceManager == NULL || serviceManager->GetObject == NULL) {
87 HDF_LOGE("failed to get device object, method not implement");
88 return NULL;
89 }
90 return serviceManager->GetObject(serviceManager, svcName);
91 }
92
DevSvcManagerClntSubscribeService(const char * svcName,struct SubscriberCallback callback)93 int DevSvcManagerClntSubscribeService(const char *svcName, struct SubscriberCallback callback)
94 {
95 struct DevSvcManagerClnt *devSvcMgrClnt = DevSvcManagerClntGetInstance();
96 struct IDevSvcManager *serviceManager = NULL;
97 if (devSvcMgrClnt == NULL) {
98 HDF_LOGE("failed to subscribe service, client is null");
99 return HDF_FAILURE;
100 }
101
102 serviceManager = devSvcMgrClnt->devSvcMgrIf;
103 if (serviceManager == NULL || serviceManager->SubscribeService == NULL) {
104 HDF_LOGE("failed to subscribe service, method not implement");
105 return HDF_FAILURE;
106 }
107 return serviceManager->SubscribeService(serviceManager, svcName, callback);
108 }
109
DevSvcManagerClntUnsubscribeService(const char * svcName)110 int DevSvcManagerClntUnsubscribeService(const char *svcName)
111 {
112 struct DevSvcManagerClnt *devSvcMgrClnt = DevSvcManagerClntGetInstance();
113 struct IDevSvcManager *serviceManager = NULL;
114 if (devSvcMgrClnt == NULL) {
115 HDF_LOGE("failed to unsubscribe service, client is null");
116 return HDF_FAILURE;
117 }
118
119 serviceManager = devSvcMgrClnt->devSvcMgrIf;
120 if (serviceManager == NULL || serviceManager->UnsubscribeService == NULL) {
121 HDF_LOGE("failed to unsubscribe service, method not implement");
122 return HDF_FAILURE;
123 }
124 return serviceManager->UnsubscribeService(serviceManager, svcName);
125 }
126
DevSvcManagerClntRemoveService(const char * svcName)127 void DevSvcManagerClntRemoveService(const char *svcName)
128 {
129 struct DevSvcManagerClnt *devSvcMgrClnt = DevSvcManagerClntGetInstance();
130 struct IDevSvcManager *serviceManager = NULL;
131 if (devSvcMgrClnt == NULL) {
132 HDF_LOGE("failed to remove service, devSvcMgrClnt is null");
133 return;
134 }
135
136 serviceManager = devSvcMgrClnt->devSvcMgrIf;
137 if (serviceManager == NULL || serviceManager->RemoveService == NULL) {
138 return;
139 }
140 serviceManager->RemoveService(serviceManager, svcName);
141 }
142
DevSvcManagerClntConstruct(struct DevSvcManagerClnt * inst)143 static void DevSvcManagerClntConstruct(struct DevSvcManagerClnt *inst)
144 {
145 inst->devSvcMgrIf = (struct IDevSvcManager *)HdfObjectManagerGetObject(HDF_OBJECT_ID_DEVSVC_MANAGER);
146 }
147
DevSvcManagerClntGetInstance()148 struct DevSvcManagerClnt *DevSvcManagerClntGetInstance()
149 {
150 static struct DevSvcManagerClnt *instance = NULL;
151 if (instance == NULL) {
152 static struct DevSvcManagerClnt singletonInstance;
153 DevSvcManagerClntConstruct(&singletonInstance);
154 instance = &singletonInstance;
155 }
156 return instance;
157 }
158
DevSvcManagerClntFreeInstance(struct DevSvcManagerClnt * instance)159 void DevSvcManagerClntFreeInstance(struct DevSvcManagerClnt *instance)
160 {
161 if (instance != NULL) {
162 HdfObjectManagerFreeObject((struct HdfObject *)instance->devSvcMgrIf);
163 }
164 }
165
166