• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "devmgr_service_proxy.h"
17 #include "devhost_service_stub.h"
18 #include "device_token_stub.h"
19 #include "devmgr_service.h"
20 #include "devmgr_service_stub.h"
21 #include "devsvc_manager_clnt.h"
22 #include "hdf_base.h"
23 #include "hdf_log.h"
24 #include "hdf_sbuf.h"
25 #include "osal_mem.h"
26 
27 #define HDF_LOG_TAG devmgr_service_proxy
28 
DevmgrServiceProxyAttachDeviceHost(struct IDevmgrService * inst,uint16_t hostId,struct IDevHostService * service)29 int DevmgrServiceProxyAttachDeviceHost(struct IDevmgrService *inst, uint16_t hostId, struct IDevHostService *service)
30 {
31     int status = HDF_FAILURE;
32     struct HdfSBuf *data = HdfSbufTypedObtain(SBUF_IPC);
33     struct HdfSBuf *reply = HdfSbufTypedObtain(SBUF_IPC);
34     struct HdfRemoteDispatcher *dipatcher = NULL;
35     struct HdfRemoteService *remoteService = NULL;
36     struct DevmgrServiceProxy *serviceProxy = (struct DevmgrServiceProxy *)inst;
37     struct DevHostServiceStub *hostStub = (struct DevHostServiceStub *)service;
38     if ((serviceProxy->remote == NULL) || (data == NULL) || (reply == NULL)) {
39         HDF_LOGE("DevmgrServiceProxyAttachDeviceHost failed, host id is %{public}u", hostId);
40         goto FINISHED;
41     }
42     remoteService = serviceProxy->remote;
43     dipatcher = remoteService->dispatcher;
44     if (!HdfRemoteServiceWriteInterfaceToken(remoteService, data) ||
45         !HdfSbufWriteInt32(data, hostId) ||
46         HdfSbufWriteRemoteService(data, hostStub->remote) != HDF_SUCCESS) {
47         HDF_LOGE("failed to attach host, write sbuf error");
48         goto FINISHED;
49     }
50     status = dipatcher->Dispatch(remoteService, DEVMGR_SERVICE_ATTACH_DEVICE_HOST, data, reply);
51     HDF_LOGI("Attach device host dispatch finish, status is %{public}d", status);
52 FINISHED:
53     if (reply != NULL) {
54         HdfSbufRecycle(reply);
55     }
56     if (data != NULL) {
57         HdfSbufRecycle(data);
58     }
59     return status;
60 }
61 
DevmgrServiceProxyAttachDevice(struct IDevmgrService * inst,struct IHdfDeviceToken * token)62 int DevmgrServiceProxyAttachDevice(struct IDevmgrService *inst, struct IHdfDeviceToken *token)
63 {
64     int status = HDF_FAILURE;
65     struct HdfSBuf *data = HdfSbufTypedObtain(SBUF_IPC);
66     struct HdfSBuf *reply = HdfSbufTypedObtain(SBUF_IPC);
67     struct DevmgrServiceProxy *serviceProxy = (struct DevmgrServiceProxy *)inst;
68     if (serviceProxy == NULL || serviceProxy->remote == NULL || data == NULL || reply == NULL || token == NULL) {
69         HDF_LOGE("DevmgrServiceProxyAttachDevice failed");
70         goto FINISHED;
71     }
72     struct HdfRemoteService *remoteService = serviceProxy->remote;
73     if (!HdfRemoteServiceWriteInterfaceToken(remoteService, data) || !HdfSbufWriteInt32(data, token->devid)) {
74         goto FINISHED;
75     }
76 
77     status = remoteService->dispatcher->Dispatch(remoteService, DEVMGR_SERVICE_ATTACH_DEVICE, data, reply);
78 FINISHED:
79     if (reply != NULL) {
80         HdfSbufRecycle(reply);
81     }
82     if (data != NULL) {
83         HdfSbufRecycle(data);
84     }
85     return status;
86 }
87 
DevmgrServiceProxyDetachDevice(struct IDevmgrService * inst,devid_t devid)88 int DevmgrServiceProxyDetachDevice(struct IDevmgrService *inst, devid_t devid)
89 {
90     int status = HDF_FAILURE;
91     struct HdfSBuf *data = HdfSbufTypedObtain(SBUF_IPC);
92     struct HdfSBuf *reply = HdfSbufTypedObtain(SBUF_IPC);
93     struct DevmgrServiceProxy *serviceProxy = (struct DevmgrServiceProxy *)inst;
94     if (serviceProxy == NULL || serviceProxy->remote == NULL || data == NULL || reply == NULL) {
95         HDF_LOGE("DevmgrServiceProxyDetachDevice failed");
96         goto FINISHED;
97     }
98     struct HdfRemoteService *remoteService = serviceProxy->remote;
99     if (!HdfRemoteServiceWriteInterfaceToken(remoteService, data) || !HdfSbufWriteInt32(data, devid)) {
100         goto FINISHED;
101     }
102 
103     status = remoteService->dispatcher->Dispatch(remoteService, DEVMGR_SERVICE_DETACH_DEVICE, data, reply);
104 FINISHED:
105     if (reply != NULL) {
106         HdfSbufRecycle(reply);
107     }
108     if (data != NULL) {
109         HdfSbufRecycle(data);
110     }
111     return status;
112 }
DevmgrServiceProxyLoadDevice(struct IDevmgrService * inst,const char * svcName)113 int DevmgrServiceProxyLoadDevice(struct IDevmgrService *inst, const char *svcName)
114 {
115     struct DevmgrServiceProxy *serviceProxy = (struct DevmgrServiceProxy *)inst;
116     if (serviceProxy == NULL || serviceProxy->remote == NULL || svcName == NULL) {
117         HDF_LOGE("DevmgrServiceProxyLoadDevice failed");
118         return HDF_ERR_INVALID_PARAM;
119     }
120 
121     struct HdfSBuf *data = HdfSbufTypedObtain(SBUF_IPC);
122     struct HdfRemoteService *remoteService = serviceProxy->remote;
123     if (!HdfRemoteServiceWriteInterfaceToken(remoteService, data) || !HdfSbufWriteString(data, svcName)) {
124         HdfSbufRecycle(data);
125         return HDF_FAILURE;
126     }
127 
128     int status = remoteService->dispatcher->Dispatch(remoteService, DEVMGR_SERVICE_LOAD_DEVICE, data, NULL);
129     HdfSbufRecycle(data);
130     return status;
131 }
132 
DevmgrServiceProxyUnLoadDevice(struct IDevmgrService * inst,const char * svcName)133 int DevmgrServiceProxyUnLoadDevice(struct IDevmgrService *inst, const char *svcName)
134 {
135     struct DevmgrServiceProxy *serviceProxy = (struct DevmgrServiceProxy *)inst;
136     if (serviceProxy == NULL || serviceProxy->remote == NULL || svcName == NULL) {
137         HDF_LOGE("DevmgrServiceProxyLoadDevice failed");
138         return HDF_ERR_INVALID_PARAM;
139     }
140 
141     struct HdfSBuf *data = HdfSbufTypedObtain(SBUF_IPC);
142     struct HdfRemoteService *remoteService = serviceProxy->remote;
143     if (!HdfRemoteServiceWriteInterfaceToken(remoteService, data) || !HdfSbufWriteString(data, svcName)) {
144         HdfSbufRecycle(data);
145         return HDF_FAILURE;
146     }
147 
148     int status = remoteService->dispatcher->Dispatch(remoteService, DEVMGR_SERVICE_UNLOAD_DEVICE, data, NULL);
149 
150     HdfSbufRecycle(data);
151     return status;
152 }
153 
DevmgrServiceProxyConstruct(struct DevmgrServiceProxy * inst)154 static void DevmgrServiceProxyConstruct(struct DevmgrServiceProxy *inst)
155 {
156     struct IDevmgrService *pvtbl = (struct IDevmgrService *)inst;
157     pvtbl->AttachDeviceHost = DevmgrServiceProxyAttachDeviceHost;
158     pvtbl->AttachDevice = DevmgrServiceProxyAttachDevice;
159     pvtbl->DetachDevice = DevmgrServiceProxyDetachDevice;
160     pvtbl->LoadDevice = DevmgrServiceProxyLoadDevice;
161     pvtbl->UnloadDevice = DevmgrServiceProxyUnLoadDevice;
162     pvtbl->StartService = NULL;
163 }
164 
DevmgrServiceProxyObtain(struct HdfRemoteService * service)165 static struct IDevmgrService *DevmgrServiceProxyObtain(struct HdfRemoteService *service)
166 {
167     if (service != NULL) {
168         struct DevmgrServiceProxy *demgrServicProxy =
169             (struct DevmgrServiceProxy *)OsalMemCalloc(sizeof(struct DevmgrServiceProxy));
170         if (demgrServicProxy != NULL) {
171             demgrServicProxy->remote = service;
172             DevmgrServiceProxyConstruct(demgrServicProxy);
173             return &demgrServicProxy->super;
174         }
175     }
176     HDF_LOGE("DevmgrServiceProxyObtain failed");
177     return NULL;
178 }
179 
DevmgrServiceProxyCreate(void)180 struct HdfObject *DevmgrServiceProxyCreate(void)
181 {
182     static struct IDevmgrService *instance = NULL;
183     if (instance != NULL) {
184         return (struct HdfObject *)instance;
185     }
186     struct IDevSvcManager *serviceManagerIf = NULL;
187     struct DevSvcManagerClnt *serviceManager = (struct DevSvcManagerClnt *)DevSvcManagerClntGetInstance();
188     if ((serviceManager == NULL) || (serviceManager->devSvcMgrIf == NULL)) {
189         HDF_LOGE("Fail to Create Service Manager Client");
190         return NULL;
191     }
192     serviceManagerIf = serviceManager->devSvcMgrIf;
193     if (serviceManagerIf->GetService == NULL) {
194         HDF_LOGE("Get Service is not implement!!!");
195         return NULL;
196     }
197     struct HdfRemoteService *remote =
198         (struct HdfRemoteService *)serviceManagerIf->GetService(serviceManagerIf, DEVICE_MANAGER_SERVICE);
199     if (remote != NULL) {
200         if (!HdfRemoteServiceSetInterfaceDesc(remote, "HDI.IDeviceManager.V1_0")) {
201             HDF_LOGE("%{public}s: failed to init interface desc", __func__);
202             HdfRemoteServiceRecycle(remote);
203             return NULL;
204         }
205         instance = DevmgrServiceProxyObtain(remote);
206     }
207 
208     return (struct HdfObject *)instance;
209 }
210 
DevmgrServiceProxyRelease(struct HdfObject * object)211 void DevmgrServiceProxyRelease(struct HdfObject *object)
212 {
213     struct DevmgrServiceProxy *instance = (struct DevmgrServiceProxy *)object;
214     if (instance != NULL) {
215         if (instance->remote != NULL) {
216             HdfRemoteServiceRecycle(instance->remote);
217             instance->remote = NULL;
218         }
219         OsalMemFree(instance);
220     }
221 }
222