1 /*
2 * Copyright (c) 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 "ioservstat_listener.h"
10 #include "hdf_service_status_inner.h"
11 #include "osal_mem.h"
12
OnIoServiceEventReceive(struct HdfDevEventlistener * listener,struct HdfIoService * service,uint32_t id,struct HdfSBuf * data)13 static int OnIoServiceEventReceive(
14 struct HdfDevEventlistener *listener, struct HdfIoService *service, uint32_t id, struct HdfSBuf *data)
15 {
16 if (listener == NULL || service == NULL || data == NULL) {
17 return HDF_ERR_INVALID_PARAM;
18 }
19 (void)id;
20 struct ServiceStatus status = { 0 };
21 if (ServiceStatusUnMarshalling(&status, data) != HDF_SUCCESS) {
22 return HDF_ERR_INVALID_PARAM;
23 }
24
25 struct IoServiceStatusListener *statusListener = listener->priv;
26 if (statusListener->svcstatListener.callback != NULL &&
27 (statusListener->deviceClass & status.deviceClass)) {
28 statusListener->svcstatListener.callback(&statusListener->svcstatListener, &status);
29 }
30
31 return HDF_SUCCESS;
32 }
33
IoServiceStatusListenerNewInstance(void)34 struct ServiceStatusListener *IoServiceStatusListenerNewInstance(void)
35 {
36 struct IoServiceStatusListener *listener = OsalMemCalloc(sizeof(struct IoServiceStatusListener));
37 if (listener == NULL) {
38 return NULL;
39 }
40
41 listener->ioservListener.onReceive = OnIoServiceEventReceive;
42 listener->ioservListener.priv = (void *)listener;
43
44 return &listener->svcstatListener;
45 }
46
IoServiceStatusListenerFree(struct ServiceStatusListener * listener)47 void IoServiceStatusListenerFree(struct ServiceStatusListener *listener)
48 {
49 if (listener == NULL) {
50 return;
51 }
52 struct IoServiceStatusListener *ioservListener
53 = CONTAINER_OF(listener, struct IoServiceStatusListener, svcstatListener);
54 OsalMemFree(ioservListener);
55 }