1 /*
2  * Copyright (c) 2020-2022 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 "hdf_base.h"
10 #include "hdf_io_service.h"
11 #include "hdf_log.h"
12 #include "hdf_sbuf.h"
13 
14 #define HDF_LOG_TAG hdf_devmgr_adapter
15 
HdfLoadDriverByServiceName(const char * serviceName)16 int32_t HdfLoadDriverByServiceName(const char *serviceName)
17 {
18     int32_t ret = HDF_FAILURE;
19     struct HdfSBuf *data = NULL;
20     if (serviceName == NULL || strcmp(serviceName, DEV_MGR_NODE) == 0) {
21         return ret;
22     }
23     struct HdfIoService *ioService = HdfIoServiceBind(DEV_MGR_NODE);
24     if (ioService == NULL) {
25         HDF_LOGE("HdfLoadDriverByServiceName failed to get %{public}s service", DEV_MGR_NODE);
26         return ret;
27     }
28     data = HdfSbufObtainDefaultSize();
29     if (data == NULL) {
30         HDF_LOGE("HdfLoadDriverByServiceName failed to obtain sbuf data");
31         ret = HDF_DEV_ERR_NO_MEMORY;
32         goto OUT;
33     }
34     if (!HdfSbufWriteString(data, serviceName)) {
35         HDF_LOGE("HdfLoadDriverByServiceName failed to write sbuf");
36         ret = HDF_FAILURE;
37         goto OUT;
38     }
39     ret = ioService->dispatcher->Dispatch(&ioService->object, DEVMGR_LOAD_SERVICE, data, NULL);
40     if (ret != HDF_SUCCESS) {
41         HDF_LOGE("HdfLoadDriverByServiceName failed to load khdf driver %{public}s", serviceName);
42     }
43 OUT:
44     HdfIoServiceRecycle(ioService);
45     HdfSbufRecycle(data);
46     return ret;
47 }
48 
HdfGetServiceNameByDeviceClass(DeviceClass deviceClass,struct HdfSBuf * reply)49 int32_t HdfGetServiceNameByDeviceClass(DeviceClass deviceClass, struct HdfSBuf *reply)
50 {
51     int32_t ret = HDF_FAILURE;
52     struct HdfSBuf *data = NULL;
53     if (reply == NULL) {
54         HDF_LOGE("%{public}s input reply is null", __func__);
55         return ret;
56     }
57     struct HdfIoService *ioService = HdfIoServiceBind(DEV_MGR_NODE);
58     if (ioService == NULL) {
59         HDF_LOGE("HdfGetServiceNameByDeviceClass failed to get %{public}s service", DEV_MGR_NODE);
60         return ret;
61     }
62     data = HdfSbufObtainDefaultSize();
63     if (data == NULL) {
64         HDF_LOGE("HdfGetServiceNameByDeviceClass failed to obtain sbuf data");
65         ret = HDF_DEV_ERR_NO_MEMORY;
66         goto OUT;
67     }
68     if (!HdfSbufWriteInt32(data, deviceClass)) {
69         HDF_LOGE("HdfGetServiceNameByDeviceClass failed to write sbuf");
70         ret = HDF_FAILURE;
71         goto OUT;
72     }
73     ret = ioService->dispatcher->Dispatch(&ioService->object, DEVMGR_GET_SERVICE, data, reply);
74     if (ret != HDF_SUCCESS) {
75         HDF_LOGE("HdfGetServiceNameByDeviceClass failed to query service by class");
76     }
77 OUT:
78     HdfIoServiceRecycle(ioService);
79     HdfSbufRecycle(data);
80     return ret;
81 }
82 
HdfListAllService(struct HdfSBuf * reply)83 int32_t HdfListAllService(struct HdfSBuf *reply)
84 {
85     int32_t ret = HDF_FAILURE;
86     if (reply == NULL) {
87         HDF_LOGE("HdfListAllService input reply is null");
88         return ret;
89     }
90     struct HdfIoService *ioService = HdfIoServiceBind(DEV_MGR_NODE);
91     if (ioService == NULL) {
92         HDF_LOGE("HdfListAllService failed to get %{public}s service", DEV_MGR_NODE);
93         return ret;
94     }
95 
96     ret = ioService->dispatcher->Dispatch(&ioService->object, DEVMGR_LIST_ALL_SERVICE, NULL, reply);
97     if (ret != HDF_SUCCESS) {
98         HDF_LOGE("failed to list all service info");
99     }
100     HdfIoServiceRecycle(ioService);
101     return ret;
102 }
103 
HdfListAllDevice(struct HdfSBuf * reply)104 int32_t HdfListAllDevice(struct HdfSBuf *reply)
105 {
106     int32_t ret = HDF_FAILURE;
107     if (reply == NULL) {
108         HDF_LOGE("HdfListAllDevice input reply is null");
109         return ret;
110     }
111     struct HdfIoService *ioService = HdfIoServiceBind(DEV_MGR_NODE);
112     if (ioService == NULL) {
113         HDF_LOGE("HdfListAllDevice failed to get %{public}s service", DEV_MGR_NODE);
114         return ret;
115     }
116 
117     ret = ioService->dispatcher->Dispatch(&ioService->object, DEVMGR_LIST_ALL_DEVICE, NULL, reply);
118     if (ret != HDF_SUCCESS) {
119         HDF_LOGE("failed to list all device info");
120     }
121     HdfIoServiceRecycle(ioService);
122     return ret;
123 }
124