1 /*
2  * Copyright (c) 2021-2023 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 "dcamera_source_handler.h"
17 
18 #include "anonymous_string.h"
19 #include "dcamera_hisysevent_adapter.h"
20 #include "dcamera_source_callback.h"
21 #include "dcamera_source_handler_ipc.h"
22 #include "dcamera_source_load_callback.h"
23 #include "distributed_camera_constants.h"
24 #include "distributed_camera_errno.h"
25 #include "distributed_hardware_log.h"
26 #include "if_system_ability_manager.h"
27 #include "iservice_registry.h"
28 
29 namespace OHOS {
30 namespace DistributedHardware {
31 IMPLEMENT_SINGLE_INSTANCE(DCameraSourceHandler);
32 
DCameraSourceHandler()33 DCameraSourceHandler::DCameraSourceHandler()
34 {
35     DHLOGI("DCameraSourceHandler construct.");
36     callback_ = sptr<DCameraSourceCallback>(new DCameraSourceCallback());
37 }
38 
~DCameraSourceHandler()39 DCameraSourceHandler::~DCameraSourceHandler()
40 {
41     DHLOGI("~DCameraSourceHandler");
42 }
43 
InitSource(const std::string & params)44 int32_t DCameraSourceHandler::InitSource(const std::string& params)
45 {
46     DHLOGI("Start");
47     {
48         std::lock_guard<std::mutex> autoLock(producerMutex_);
49         if (state_ == DCAMERA_SA_STATE_START) {
50             return DCAMERA_OK;
51         }
52     }
53     sptr<ISystemAbilityManager> sm = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
54     if (sm == nullptr) {
55         DHLOGE("GetSourceLocalCamSrv GetSystemAbilityManager failed");
56         return DCAMERA_INIT_ERR;
57     }
58     ReportSaEvent(INIT_SA_EVENT, DISTRIBUTED_HARDWARE_CAMERA_SOURCE_SA_ID, "init source sa event.");
59     sptr<DCameraSourceLoadCallback> loadCallback(new DCameraSourceLoadCallback(params));
60     int32_t ret = sm->LoadSystemAbility(DISTRIBUTED_HARDWARE_CAMERA_SOURCE_SA_ID, loadCallback);
61     if (ret != ERR_OK) {
62         DHLOGE("systemAbilityId: %{public}d load failed, result code: %{public}d.",
63             DISTRIBUTED_HARDWARE_CAMERA_SOURCE_SA_ID, ret);
64         return DCAMERA_INIT_ERR;
65     }
66     {
67         uint32_t interval = 1;
68         std::unique_lock<std::mutex> lock(producerMutex_);
69         producerCon_.wait_for(lock, std::chrono::minutes(interval), [this] {
70             return (this->state_ == DCAMERA_SA_STATE_START);
71         });
72         if (state_ == DCAMERA_SA_STATE_STOP) {
73             DHLOGE("SourceSA Start failed!");
74             return DCAMERA_INIT_ERR;
75         }
76     }
77     DHLOGI("end, result: %{public}d", ret);
78     return DCAMERA_OK;
79 }
80 
FinishStartSA(const std::string & params)81 void DCameraSourceHandler::FinishStartSA(const std::string &params)
82 {
83     DCameraSourceHandlerIpc::GetInstance().Init();
84     sptr<IDistributedCameraSource> dCameraSourceSrv = DCameraSourceHandlerIpc::GetInstance().GetSourceLocalCamSrv();
85     if (dCameraSourceSrv == nullptr) {
86         DHLOGE("get Service failed");
87         return;
88     }
89 
90     dCameraSourceSrv->InitSource(params, callback_);
91     std::lock_guard<std::mutex> lock(producerMutex_);
92     state_ = DCAMERA_SA_STATE_START;
93     producerCon_.notify_one();
94 }
95 
FinishStartSAFailed(const int32_t systemAbilityId)96 void DCameraSourceHandler::FinishStartSAFailed(const int32_t systemAbilityId)
97 {
98     DHLOGE("SourceSA Start failed, systemAbilityId: %{public}d.", systemAbilityId);
99     std::unique_lock<std::mutex> lock(producerMutex_);
100     state_ = DCAMERA_SA_STATE_STOP;
101     producerCon_.notify_one();
102 }
103 
ReleaseSource()104 int32_t DCameraSourceHandler::ReleaseSource()
105 {
106     DHLOGI("Start");
107     sptr<IDistributedCameraSource> dCameraSourceSrv = DCameraSourceHandlerIpc::GetInstance().GetSourceLocalCamSrv();
108     if (dCameraSourceSrv == nullptr) {
109         DHLOGE("get Service failed");
110         return DCAMERA_INIT_ERR;
111     }
112     ReportSaEvent(RELEASE_SA_EVENT, DISTRIBUTED_HARDWARE_CAMERA_SOURCE_SA_ID, "release source sa event.");
113     dCameraSourceSrv->ReleaseSource();
114     DCameraSourceHandlerIpc::GetInstance().UnInit();
115     std::unique_lock<std::mutex> lock(producerMutex_);
116     state_ = DCAMERA_SA_STATE_STOP;
117     DHLOGI("end");
118     return DCAMERA_OK;
119 }
120 
RegisterDistributedHardware(const std::string & devId,const std::string & dhId,const EnableParam & param,std::shared_ptr<RegisterCallback> callback)121 int32_t DCameraSourceHandler::RegisterDistributedHardware(const std::string& devId, const std::string& dhId,
122     const EnableParam& param, std::shared_ptr<RegisterCallback> callback)
123 {
124     DHLOGI("devId: %{public}s dhId: %{public}s", GetAnonyString(devId).c_str(),
125         GetAnonyString(dhId).c_str());
126     if (callback == nullptr) {
127         DHLOGI("RegisterCallback is null.");
128         return DCAMERA_BAD_VALUE;
129     }
130     sptr<IDistributedCameraSource> dCameraSourceSrv = DCameraSourceHandlerIpc::GetInstance().GetSourceLocalCamSrv();
131     if (dCameraSourceSrv == nullptr) {
132         DHLOGE("get Service failed");
133         return DCAMERA_BAD_VALUE;
134     }
135 
136     std::string reqId = GetRandomID();
137     std::lock_guard<std::mutex> autoLock(optLock_);
138 
139     CHECK_AND_RETURN_RET_LOG(callback_ == nullptr, DCAMERA_BAD_VALUE, "ipc callback is null.");
140     callback_->PushRegCallback(reqId, callback);
141     int32_t ret = dCameraSourceSrv->RegisterDistributedHardware(devId, dhId, reqId, param);
142     if (ret != DCAMERA_OK) {
143         callback_->PopRegCallback(reqId);
144     }
145     DHLOGI("end, ret: %{public}d devId: %{public}s dhId: %{public}s version: %{public}s",
146         ret, GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str(), param.sinkVersion.c_str());
147     return ret;
148 }
149 
UnregisterDistributedHardware(const std::string & devId,const std::string & dhId,std::shared_ptr<UnregisterCallback> callback)150 int32_t DCameraSourceHandler::UnregisterDistributedHardware(const std::string& devId, const std::string& dhId,
151     std::shared_ptr<UnregisterCallback> callback)
152 {
153     DHLOGI("devId: %{public}s dhId: %{public}s", GetAnonyString(devId).c_str(),
154         GetAnonyString(dhId).c_str());
155     if (callback == nullptr) {
156         DHLOGI("UnregisterCallback is null.");
157         return DCAMERA_BAD_VALUE;
158     }
159     sptr<IDistributedCameraSource> dCameraSourceSrv = DCameraSourceHandlerIpc::GetInstance().GetSourceLocalCamSrv();
160     if (dCameraSourceSrv == nullptr) {
161         DHLOGE("get Service failed");
162         return DCAMERA_BAD_VALUE;
163     }
164 
165     std::string reqId = GetRandomID();
166     std::lock_guard<std::mutex> autoLock(optLock_);
167 
168     CHECK_AND_RETURN_RET_LOG(callback_ == nullptr, DCAMERA_BAD_VALUE, "ipc callback is null.");
169     callback_->PushUnregCallback(reqId, callback);
170     int32_t ret = dCameraSourceSrv->UnregisterDistributedHardware(devId, dhId, reqId);
171     if (ret != DCAMERA_OK) {
172         callback_->PopUnregCallback(reqId);
173     }
174     DHLOGI("end, ret: %{public}d devId: %{public}s dhId: %{public}s", ret,
175         GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str());
176     return ret;
177 }
178 
ConfigDistributedHardware(const std::string & devId,const std::string & dhId,const std::string & key,const std::string & value)179 int32_t DCameraSourceHandler::ConfigDistributedHardware(const std::string& devId, const std::string& dhId,
180     const std::string& key, const std::string& value)
181 {
182     return DCAMERA_OK;
183 }
184 
RegisterDistributedHardwareStateListener(std::shared_ptr<DistributedHardwareStateListener> listener)185 void DCameraSourceHandler::RegisterDistributedHardwareStateListener(
186     std::shared_ptr<DistributedHardwareStateListener> listener)
187 {
188     CHECK_AND_RETURN_LOG(callback_ == nullptr, "%{public}s", "ipc callback is null.");
189     callback_->RegisterStateListener(listener);
190 }
191 
UnregisterDistributedHardwareStateListener()192 void DCameraSourceHandler::UnregisterDistributedHardwareStateListener()
193 {
194     CHECK_AND_RETURN_LOG(callback_ == nullptr, "%{public}s", "ipc callback is null.");
195     callback_->UnRegisterStateListener();
196 }
197 
RegisterDataSyncTriggerListener(std::shared_ptr<DataSyncTriggerListener> listener)198 void DCameraSourceHandler::RegisterDataSyncTriggerListener(std::shared_ptr<DataSyncTriggerListener> listener)
199 {
200     CHECK_AND_RETURN_LOG(callback_ == nullptr, "%{public}s", "ipc callback is null.");
201     callback_->RegisterTriggerListener(listener);
202 }
203 
UnregisterDataSyncTriggerListener()204 void DCameraSourceHandler::UnregisterDataSyncTriggerListener()
205 {
206     CHECK_AND_RETURN_LOG(callback_ == nullptr, "%{public}s", "ipc callback is null.");
207     callback_->UnRegisterTriggerListener();
208 }
209 
SetSAState()210 void DCameraSourceHandler::SetSAState()
211 {
212     std::unique_lock<std::mutex> lock(producerMutex_);
213     state_ = DCAMERA_SA_STATE_STOP;
214 }
215 
GetSourceHardwareHandler()216 IDistributedHardwareSource *GetSourceHardwareHandler()
217 {
218     DHLOGI("DCameraSourceHandler GetSourceHardwareHandler Start");
219     return &DCameraSourceHandler::GetInstance();
220 }
221 } // namespace DistributedHardware
222 } // namespace OHOS
223