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