1 /*
2  * Copyright (c) 2022-2024 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 "daudio_ipc_callback.h"
17 
18 #include "daudio_constants.h"
19 #include "daudio_errorcode.h"
20 #include "daudio_log.h"
21 #include "daudio_util.h"
22 
23 #undef DH_LOG_TAG
24 #define DH_LOG_TAG "DAudioIpcCallback"
25 
26 namespace OHOS {
27 namespace DistributedHardware {
OnNotifyRegResult(const std::string & devId,const std::string & dhId,const std::string & reqId,int32_t status,const std::string & resultData)28 int32_t DAudioIpcCallback::OnNotifyRegResult(const std::string &devId, const std::string &dhId,
29     const std::string &reqId, int32_t status, const std::string &resultData)
30 {
31     DHLOGI("On notify the registration result, devId: %{public}s, dhId: %{public}s, status: %{public}d, "
32         "resultData: %{public}s, reqId: %{public}s", GetAnonyString(devId).c_str(), dhId.c_str(),
33         status, resultData.c_str(), reqId.c_str());
34 
35     if (devId.length() > DAUDIO_MAX_DEVICE_ID_LEN || dhId.length() > DAUDIO_MAX_DEVICE_ID_LEN ||
36         reqId.length() > DAUDIO_MAX_DEVICE_ID_LEN) {
37         return ERR_DH_AUDIO_SA_DEVID_ILLEGAL;
38     }
39     std::lock_guard<std::mutex> registerLck(registerMapMtx_);
40     auto iter = registerCallbackMap_.find(reqId);
41     if (iter != registerCallbackMap_.end()) {
42         std::string reduceDhId = dhId;
43         if (iter->second != nullptr) {
44             iter->second->OnRegisterResult(devId, reduceDhId, status, resultData);
45         }
46         registerCallbackMap_.erase(reqId);
47         return DH_SUCCESS;
48     }
49 
50     return ERR_DH_AUDIO_SA_CALLBACK_NOT_FOUND;
51 }
52 
OnNotifyUnregResult(const std::string & devId,const std::string & dhId,const std::string & reqId,int32_t status,const std::string & resultData)53 int32_t DAudioIpcCallback::OnNotifyUnregResult(const std::string &devId, const std::string &dhId,
54     const std::string &reqId, int32_t status, const std::string &resultData)
55 {
56     DHLOGI("On notify the unregistration result, devId: %{public}s, dhId: %{public}s, status: %{public}d, "
57         "resultData: %{public}s, reqId: %{public}s", GetAnonyString(devId).c_str(), dhId.c_str(),
58         status, resultData.c_str(), reqId.c_str());
59 
60     if (devId.length() > DAUDIO_MAX_DEVICE_ID_LEN || dhId.length() > DAUDIO_MAX_DEVICE_ID_LEN ||
61         reqId.length() > DAUDIO_MAX_DEVICE_ID_LEN) {
62         return ERR_DH_AUDIO_SA_DEVID_ILLEGAL;
63     }
64     std::lock_guard<std::mutex> registerLck(unregisterMapMtx_);
65     auto iter = unregisterCallbackMap_.find(reqId);
66     if (iter != unregisterCallbackMap_.end()) {
67         std::string reduceDhId = dhId;
68         if (iter->second != nullptr) {
69             iter->second->OnUnregisterResult(devId, reduceDhId, status, resultData);
70         }
71         unregisterCallbackMap_.erase(reqId);
72         return DH_SUCCESS;
73     }
74     return ERR_DH_AUDIO_SA_CALLBACK_NOT_FOUND;
75 }
76 
OnHardwareStateChanged(const std::string & devId,const std::string & dhId,int32_t status)77 int32_t DAudioIpcCallback::OnHardwareStateChanged(const std::string &devId, const std::string &dhId, int32_t status)
78 {
79     DHLOGI("On hardware state changed, devId: %{public}s, dhId: %{public}s, status: %{public}d",
80         GetAnonyString(devId).c_str(), dhId.c_str(), status);
81 
82     if (devId.length() > DAUDIO_MAX_DEVICE_ID_LEN || dhId.length() > DAUDIO_MAX_DEVICE_ID_LEN) {
83         return ERR_DH_AUDIO_SA_DEVID_ILLEGAL;
84     }
85     std::lock_guard<std::mutex> stateLck(stateListenerMtx_);
86     if (stateListener_ == nullptr) {
87         DHLOGE("State listener is null.");
88         return ERR_DH_AUDIO_NULLPTR;
89     }
90     BusinessState currentState = static_cast<BusinessState>(status);
91     stateListener_->OnStateChanged(devId, dhId, currentState);
92     return DH_SUCCESS;
93 }
94 
OnDataSyncTrigger(const std::string & devId)95 int32_t DAudioIpcCallback::OnDataSyncTrigger(const std::string &devId)
96 {
97     DHLOGI("On data sync trigger, devId: %{public}s", GetAnonyString(devId).c_str());
98 
99     if (devId.length() > DAUDIO_MAX_DEVICE_ID_LEN) {
100         return ERR_DH_AUDIO_SA_DEVID_ILLEGAL;
101     }
102     std::lock_guard<std::mutex> triggerLck(triggerListenerMtx_);
103     if (triggerListener_ == nullptr) {
104         DHLOGE("Trigger listener is null.");
105         return ERR_DH_AUDIO_NULLPTR;
106     }
107     triggerListener_->OnDataSyncTrigger(devId);
108     return DH_SUCCESS;
109 }
110 
PushRegisterCallback(const std::string & reqId,const std::shared_ptr<RegisterCallback> & callback)111 void DAudioIpcCallback::PushRegisterCallback(const std::string &reqId,
112     const std::shared_ptr<RegisterCallback> &callback)
113 {
114     DHLOGD("Push register callback, reqId: %{public}s", reqId.c_str());
115     std::lock_guard<std::mutex> registerLck(registerMapMtx_);
116     registerCallbackMap_.emplace(reqId, callback);
117 }
118 
PopRegisterCallback(const std::string & reqId)119 void DAudioIpcCallback::PopRegisterCallback(const std::string &reqId)
120 {
121     DHLOGD("Pop register callback, reqId: %{public}s", reqId.c_str());
122     std::lock_guard<std::mutex> registerLck(registerMapMtx_);
123     registerCallbackMap_.erase(reqId);
124 }
125 
PushUnregisterCallback(const std::string & reqId,const std::shared_ptr<UnregisterCallback> & callback)126 void DAudioIpcCallback::PushUnregisterCallback(const std::string &reqId,
127     const std::shared_ptr<UnregisterCallback> &callback)
128 {
129     DHLOGD("Push unregister callback, reqId: %{public}s", reqId.c_str());
130     std::lock_guard<std::mutex> registerLck(unregisterMapMtx_);
131     unregisterCallbackMap_.emplace(reqId, callback);
132 }
133 
PopUnregisterCallback(const std::string & reqId)134 void DAudioIpcCallback::PopUnregisterCallback(const std::string &reqId)
135 {
136     DHLOGD("Pop unregister callback, reqId: %{public}s", reqId.c_str());
137     std::lock_guard<std::mutex> registerLck(unregisterMapMtx_);
138     unregisterCallbackMap_.erase(reqId);
139 }
140 
RegisterStateListener(const std::shared_ptr<DistributedHardwareStateListener> & listener)141 void DAudioIpcCallback::RegisterStateListener(const std::shared_ptr<DistributedHardwareStateListener> &listener)
142 {
143     DHLOGD("Register state listener.");
144     std::lock_guard<std::mutex> stateLck(stateListenerMtx_);
145     stateListener_ = listener;
146 }
147 
UnRegisterStateListener()148 void DAudioIpcCallback::UnRegisterStateListener()
149 {
150     DHLOGD("UnRegister state listener.");
151     std::lock_guard<std::mutex> stateLck(stateListenerMtx_);
152     stateListener_ = nullptr;
153 }
154 
RegisterTriggerListener(const std::shared_ptr<DataSyncTriggerListener> & listener)155 void DAudioIpcCallback::RegisterTriggerListener(const std::shared_ptr<DataSyncTriggerListener> &listener)
156 {
157     DHLOGD("Register trigger listener.");
158     std::lock_guard<std::mutex> triggerLck(triggerListenerMtx_);
159     triggerListener_ = listener;
160 }
161 
UnRegisterTriggerListener()162 void DAudioIpcCallback::UnRegisterTriggerListener()
163 {
164     DHLOGD("UnRegister trigger listener.");
165     std::lock_guard<std::mutex> triggerLck(triggerListenerMtx_);
166     triggerListener_ = nullptr;
167 }
168 } // DistributedHardware
169 } // OHOS