1 /*
2  * Copyright (c) 2021-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 "dcamera_sink_handler.h"
17 
18 #include <chrono>
19 #include <new>
20 #include <string>
21 
22 #include "anonymous_string.h"
23 #include "dcamera_hisysevent_adapter.h"
24 #include "dcamera_sink_handler_ipc.h"
25 #include "dcamera_sink_load_callback.h"
26 #include "distributed_camera_constants.h"
27 #include "distributed_camera_errno.h"
28 #include "distributed_hardware_log.h"
29 #include "if_system_ability_manager.h"
30 #include "iservice_registry.h"
31 #include "idistributed_camera_sink.h"
32 #include "isystem_ability_load_callback.h"
33 #include "refbase.h"
34 
35 namespace OHOS {
36 namespace DistributedHardware {
37 IMPLEMENT_SINGLE_INSTANCE(DCameraSinkHandler);
38 
DCameraSinkHandler()39 DCameraSinkHandler::DCameraSinkHandler()
40 {
41     DHLOGI("DCameraSinkHandler ctor.");
42     if (!dCameraSinkCallback_) {
43         dCameraSinkCallback_ = sptr<DCameraSinkCallback>(new DCameraSinkCallback());
44     }
45 }
46 
~DCameraSinkHandler()47 DCameraSinkHandler::~DCameraSinkHandler()
48 {
49     DHLOGI("~DCameraSinkHandler");
50 }
51 
InitSink(const std::string & params)52 int32_t DCameraSinkHandler::InitSink(const std::string& params)
53 {
54     DHLOGI("start");
55     {
56         std::lock_guard<std::mutex> autoLock(producerMutex_);
57         if (state_ == DCAMERA_SA_STATE_START) {
58             return DCAMERA_OK;
59         }
60     }
61 
62     sptr<ISystemAbilityManager> sm = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
63     if (sm == nullptr) {
64         DHLOGE("GetSourceLocalCamSrv GetSystemAbilityManager failed");
65         return DCAMERA_INIT_ERR;
66     }
67     ReportSaEvent(INIT_SA_EVENT, DISTRIBUTED_HARDWARE_CAMERA_SINK_SA_ID, "init sink sa event.");
68     sptr<DCameraSinkLoadCallback> loadCallback(new DCameraSinkLoadCallback(params));
69     int32_t ret = sm->LoadSystemAbility(DISTRIBUTED_HARDWARE_CAMERA_SINK_SA_ID, loadCallback);
70     if (ret != DCAMERA_OK) {
71         DHLOGE("systemAbilityId: %{public}d load filed, result code: %{public}d.",
72             DISTRIBUTED_HARDWARE_CAMERA_SINK_SA_ID, ret);
73         return DCAMERA_INIT_ERR;
74     }
75     {
76         uint32_t interval = 1;
77         std::unique_lock<std::mutex> lock(producerMutex_);
78         producerCon_.wait_for(lock, std::chrono::minutes(interval), [this] {
79             return (this->state_ == DCAMERA_SA_STATE_START);
80         });
81         if (state_ == DCAMERA_SA_STATE_STOP) {
82             DHLOGE("SinkSA Start failed!");
83             return DCAMERA_INIT_ERR;
84         }
85     }
86     DHLOGI("end, result: %{public}d", ret);
87     return DCAMERA_OK;
88 }
89 
FinishStartSA(const std::string & params)90 void DCameraSinkHandler::FinishStartSA(const std::string& params)
91 {
92     DCameraSinkHandlerIpc::GetInstance().Init();
93     sptr<IDistributedCameraSink> dCameraSinkSrv = DCameraSinkHandlerIpc::GetInstance().GetSinkLocalCamSrv();
94     if (dCameraSinkSrv == nullptr) {
95         DHLOGE("get Service failed");
96         return;
97     }
98     dCameraSinkSrv->InitSink(params, dCameraSinkCallback_);
99     std::unique_lock<std::mutex> lock(producerMutex_);
100     state_ = DCAMERA_SA_STATE_START;
101     producerCon_.notify_one();
102 }
103 
FinishStartSAFailed(const int32_t systemAbilityId)104 void DCameraSinkHandler::FinishStartSAFailed(const int32_t systemAbilityId)
105 {
106     DHLOGI("SinkSA Start failed, systemAbilityId: %{public}d.", systemAbilityId);
107     std::unique_lock<std::mutex> lock(producerMutex_);
108     state_ = DCAMERA_SA_STATE_STOP;
109     producerCon_.notify_one();
110 }
111 
ReleaseSink()112 int32_t DCameraSinkHandler::ReleaseSink()
113 {
114     DHLOGI("start");
115     sptr<IDistributedCameraSink> dCameraSinkSrv = DCameraSinkHandlerIpc::GetInstance().GetSinkLocalCamSrv();
116     if (dCameraSinkSrv == nullptr) {
117         DHLOGE("get Service failed");
118         return DCAMERA_BAD_VALUE;
119     }
120 
121     ReportSaEvent(RELEASE_SA_EVENT, DISTRIBUTED_HARDWARE_CAMERA_SINK_SA_ID, "release sink sa event.");
122     int32_t ret = dCameraSinkSrv->ReleaseSink();
123     if (ret != DCAMERA_OK) {
124         DHLOGE("sink service release failed, ret: %{public}d", ret);
125         return ret;
126     }
127 
128     DCameraSinkHandlerIpc::GetInstance().UnInit();
129     std::unique_lock<std::mutex> lock(producerMutex_);
130     state_ = DCAMERA_SA_STATE_STOP;
131     DHLOGI("success");
132     return DCAMERA_OK;
133 }
134 
SubscribeLocalHardware(const std::string & dhId,const std::string & parameters)135 int32_t DCameraSinkHandler::SubscribeLocalHardware(const std::string& dhId, const std::string& parameters)
136 {
137     DHLOGI("dhId: %{public}s", GetAnonyString(dhId).c_str());
138     sptr<IDistributedCameraSink> dCameraSinkSrv = DCameraSinkHandlerIpc::GetInstance().GetSinkLocalCamSrv();
139     if (dCameraSinkSrv == nullptr) {
140         DHLOGE("get Service failed");
141         return DCAMERA_BAD_VALUE;
142     }
143     return dCameraSinkSrv->SubscribeLocalHardware(dhId, parameters);
144 }
145 
UnsubscribeLocalHardware(const std::string & dhId)146 int32_t DCameraSinkHandler::UnsubscribeLocalHardware(const std::string& dhId)
147 {
148     DHLOGI("dhId: %{public}s", GetAnonyString(dhId).c_str());
149     sptr<IDistributedCameraSink> dCameraSinkSrv = DCameraSinkHandlerIpc::GetInstance().GetSinkLocalCamSrv();
150     if (dCameraSinkSrv == nullptr) {
151         DHLOGE("get Service failed");
152         return DCAMERA_BAD_VALUE;
153     }
154     return dCameraSinkSrv->UnsubscribeLocalHardware(dhId);
155 }
156 
RegisterPrivacyResources(std::shared_ptr<PrivacyResourcesListener> listener)157 int32_t DCameraSinkHandler::RegisterPrivacyResources(std::shared_ptr<PrivacyResourcesListener> listener)
158 {
159     DHLOGI("RegisterPrivacyResources start.");
160     CHECK_AND_RETURN_RET_LOG(dCameraSinkCallback_ == nullptr, DCAMERA_BAD_VALUE, "get sinkCallback failed");
161     dCameraSinkCallback_->PushPrivacyResCallback(listener);
162     return DCAMERA_OK;
163 }
164 
PauseDistributedHardware(const std::string & networkId)165 int32_t DCameraSinkHandler::PauseDistributedHardware(const std::string &networkId)
166 {
167     DHLOGI("pause distributed hardware.");
168     sptr<IDistributedCameraSink> dCameraSinkSrv = DCameraSinkHandlerIpc::GetInstance().GetSinkLocalCamSrv();
169     if (dCameraSinkSrv == nullptr) {
170         DHLOGE("get Service failed");
171         return DCAMERA_BAD_VALUE;
172     }
173     return dCameraSinkSrv->PauseDistributedHardware(networkId);
174 }
175 
ResumeDistributedHardware(const std::string & networkId)176 int32_t DCameraSinkHandler::ResumeDistributedHardware(const std::string &networkId)
177 {
178     DHLOGI("resume distributed hardware.");
179     sptr<IDistributedCameraSink> dCameraSinkSrv = DCameraSinkHandlerIpc::GetInstance().GetSinkLocalCamSrv();
180     if (dCameraSinkSrv == nullptr) {
181         DHLOGE("get Service failed");
182         return DCAMERA_BAD_VALUE;
183     }
184     return dCameraSinkSrv->ResumeDistributedHardware(networkId);
185 }
186 
StopDistributedHardware(const std::string & networkId)187 int32_t DCameraSinkHandler::StopDistributedHardware(const std::string &networkId)
188 {
189     DHLOGI("stop distributed hardware.");
190     sptr<IDistributedCameraSink> dCameraSinkSrv = DCameraSinkHandlerIpc::GetInstance().GetSinkLocalCamSrv();
191     if (dCameraSinkSrv == nullptr) {
192         DHLOGE("get Service failed");
193         return DCAMERA_BAD_VALUE;
194     }
195     return dCameraSinkSrv->StopDistributedHardware(networkId);
196 }
197 
SetSAState()198 void DCameraSinkHandler::SetSAState()
199 {
200     std::unique_lock<std::mutex> lock(producerMutex_);
201     state_ = DCAMERA_SA_STATE_STOP;
202 }
203 
GetSinkHardwareHandler()204 IDistributedHardwareSink *GetSinkHardwareHandler()
205 {
206     DHLOGI("DCameraSinkHandler::GetSinkHardwareHandler");
207     return &DCameraSinkHandler::GetInstance();
208 }
209 } // namespace DistributedHardware
210 } // namespace OHOS