1  /*
2   * Copyright (c) 2021-2022 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 <hdf_dlist.h>
17  #include <hdf_log.h>
18  #include <hdf_remote_service.h>
19  #include <hdf_service_status_inner.h>
20  #include <osal_mem.h>
21  
22  #define SERVSTAT_LISTENER_INTERFACE_DESCRIPTOR "HDI.IServiceStatusListener.V1_0"
23  #define HDF_LOG_TAG servstat_listener
24  
25  struct ServstatListenerStub {
26      struct ServiceStatusListener listener;
27      struct HdfRemoteService *remote;
28  };
29  
ServstatListenerStubRemoteDispatch(struct HdfRemoteService * remote,int cmdid,struct HdfSBuf * data,struct HdfSBuf * reply)30  int ServstatListenerStubRemoteDispatch(
31      struct HdfRemoteService *remote, int cmdid, struct HdfSBuf *data, struct HdfSBuf *reply)
32  {
33      (void)reply;
34      struct ServstatListenerStub *stub = (struct ServstatListenerStub *)remote;
35      struct ServiceStatus status;
36  
37      if (cmdid != SERVIE_STATUS_LISTENER_NOTIFY) {
38          return HDF_ERR_NOT_SUPPORT;
39      }
40      if (!HdfRemoteServiceCheckInterfaceToken(stub->remote, data)) {
41          HDF_LOGE("failed to check interface");
42          return HDF_ERR_INVALID_PARAM;
43      }
44      if (ServiceStatusUnMarshalling(&status, data) != HDF_SUCCESS) {
45          return HDF_ERR_INVALID_PARAM;
46      }
47      HDF_LOGI("ServstatListenerStubRemoteDispatch: service name %{public}s", status.serviceName);
48  
49      if (stub->listener.callback != NULL) {
50          stub->listener.callback(&stub->listener, &status);
51          return HDF_SUCCESS;
52      }
53      return HDF_ERR_INVALID_OBJECT;
54  }
55  
ServiceStatusListenerMarshalling(struct ServiceStatusListener * listener,struct HdfSBuf * buf)56  int ServiceStatusListenerMarshalling(struct ServiceStatusListener *listener, struct HdfSBuf *buf)
57  {
58      if (listener == NULL || buf == NULL) {
59          return HDF_ERR_INVALID_PARAM;
60      }
61  
62      struct ServstatListenerStub *listenerStub = CONTAINER_OF(listener, struct ServstatListenerStub, listener);
63      if (listenerStub->remote == NULL) {
64          return HDF_ERR_INVALID_OBJECT;
65      }
66      return HdfSbufWriteRemoteService(buf, listenerStub->remote);
67  }
68  
HdiServiceStatusListenerNewInstance(void)69  struct ServiceStatusListener *HdiServiceStatusListenerNewInstance(void)
70  {
71      struct ServstatListenerStub *stub = OsalMemCalloc(sizeof(struct ServstatListenerStub));
72      if (stub == NULL) {
73          return NULL;
74      }
75      static struct HdfRemoteDispatcher remoteDispatch = {
76          .Dispatch = ServstatListenerStubRemoteDispatch,
77      };
78  
79      stub->remote = HdfRemoteServiceObtain((struct HdfObject *)stub, &remoteDispatch);
80      if (stub->remote == NULL) {
81          OsalMemFree(stub);
82          return NULL;
83      }
84      if (!HdfRemoteServiceSetInterfaceDesc(stub->remote, SERVSTAT_LISTENER_INTERFACE_DESCRIPTOR)) {
85          HdfRemoteServiceRecycle(stub->remote);
86          stub->remote = NULL;
87          OsalMemFree(stub);
88          return NULL;
89      }
90      return &stub->listener;
91  }
92  
HdiServiceStatusListenerFree(struct ServiceStatusListener * listener)93  void HdiServiceStatusListenerFree(struct ServiceStatusListener *listener)
94  {
95      if (listener == NULL) {
96          return;
97      }
98  
99      struct ServstatListenerStub *stub = CONTAINER_OF(listener, struct ServstatListenerStub, listener);
100      HdfRemoteServiceRecycle(stub->remote);
101      OsalMemFree(stub);
102  }