1/* 2 * Copyright (c) 2021-2022 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 "status_receiver_impl.h" 17 18#include "app_log_wrapper.h" 19 20namespace OHOS { 21namespace AppExecFwk { 22namespace { 23const int32_t MINIMUM_WAITTING_TIME = 180; // 3 mins 24} // namespace 25 26StatusReceiverImpl::StatusReceiverImpl(int32_t waittingTime) : waittingTime_(waittingTime) 27{ 28 APP_LOGI("create status receiver instance"); 29} 30 31StatusReceiverImpl::StatusReceiverImpl() : waittingTime_(MINIMUM_WAITTING_TIME) 32{ 33 APP_LOGI("create status receiver instance"); 34} 35 36StatusReceiverImpl::~StatusReceiverImpl() 37{ 38 APP_LOGI("destroy status receiver instance"); 39} 40 41void StatusReceiverImpl::OnFinished(const int32_t resultCode, const std::string &resultMsg) 42{ 43 APP_LOGI("on finished result is %{public}d, %{public}s", resultCode, resultMsg.c_str()); 44 std::lock_guard<std::mutex> lock(setValueMutex_); 45 if (!isSetValue) { 46 isSetValue = true; 47 resultCodeSignal_.set_value(resultCode); 48 resultMsgSignal_.set_value(resultMsg); 49 } else { 50 APP_LOGW("resultCodeSignal_ is set"); 51 } 52} 53 54void StatusReceiverImpl::OnStatusNotify(const int progress) 55{ 56 APP_LOGI("on OnStatusNotify is %{public}d", progress); 57} 58 59int32_t StatusReceiverImpl::GetResultCode() const 60{ 61 auto future = resultCodeSignal_.get_future(); 62 if (future.wait_for(std::chrono::seconds(waittingTime_)) == std::future_status::ready) { 63 int32_t resultCode = future.get(); 64 return resultCode; 65 } 66 return ERR_OPERATION_TIME_OUT; 67} 68 69std::string StatusReceiverImpl::GetResultMsg() const 70{ 71 auto future = resultMsgSignal_.get_future(); 72 if (future.wait_for(std::chrono::seconds(waittingTime_)) == std::future_status::ready) { 73 std::string resultMsg = future.get(); 74 return resultMsg; 75 } 76 return ""; 77} 78} // namespace AppExecFwk 79} // namespace OHOS