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 }