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