1190978c3Sopenharmony_ci/* 2190978c3Sopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd. 3190978c3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4190978c3Sopenharmony_ci * you may not use this file except in compliance with the License. 5190978c3Sopenharmony_ci * You may obtain a copy of the License at 6190978c3Sopenharmony_ci * 7190978c3Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8190978c3Sopenharmony_ci * 9190978c3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10190978c3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11190978c3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12190978c3Sopenharmony_ci * See the License for the specific language governing permissions and 13190978c3Sopenharmony_ci * limitations under the License. 14190978c3Sopenharmony_ci */ 15190978c3Sopenharmony_ci 16190978c3Sopenharmony_ci#ifndef UPDATER_THREAD_H 17190978c3Sopenharmony_ci#define UPDATER_THREAD_H 18190978c3Sopenharmony_ci 19190978c3Sopenharmony_ci#include <atomic> 20190978c3Sopenharmony_ci#include <functional> 21190978c3Sopenharmony_ci#include <thread> 22190978c3Sopenharmony_ci#include <file_utils.h> 23190978c3Sopenharmony_ci#include "curl/curl.h" 24190978c3Sopenharmony_ci 25190978c3Sopenharmony_ci#include "progress.h" 26190978c3Sopenharmony_ci 27190978c3Sopenharmony_cinamespace OHOS { 28190978c3Sopenharmony_cinamespace UpdateEngine { 29190978c3Sopenharmony_ci#define ENGINE_CHECK_NO_LOG(retCode, exper) \ 30190978c3Sopenharmony_ci if (!(retCode)) { \ 31190978c3Sopenharmony_ci exper; \ 32190978c3Sopenharmony_ci } 33190978c3Sopenharmony_ci 34190978c3Sopenharmony_ciconstexpr uint32_t DOWNLOAD_FINISH_PERCENT = 100; 35190978c3Sopenharmony_ciconstexpr uint32_t DOWNLOAD_PERIOD_PERCENT = 1; 36190978c3Sopenharmony_ciconstexpr int32_t TIMEOUT_FOR_DOWNLOAD = 600; 37190978c3Sopenharmony_ci#ifndef UPDATER_UT 38190978c3Sopenharmony_ciconstexpr int32_t TIMEOUT_FOR_CONNECT = 10; 39190978c3Sopenharmony_ci#else 40190978c3Sopenharmony_ciconstexpr int32_t TIMEOUT_FOR_CONNECT = 1; 41190978c3Sopenharmony_ci#endif 42190978c3Sopenharmony_ci 43190978c3Sopenharmony_ciclass ProgressThread { 44190978c3Sopenharmony_cipublic: 45190978c3Sopenharmony_ci ProgressThread() = default; 46190978c3Sopenharmony_ci virtual ~ProgressThread(); 47190978c3Sopenharmony_ci static bool isNoNet_; 48190978c3Sopenharmony_ci static bool isCancel_; 49190978c3Sopenharmony_ciprotected: 50190978c3Sopenharmony_ci int32_t StartProgress(); 51190978c3Sopenharmony_ci void StopProgress(); 52190978c3Sopenharmony_ci void QuitDownloadThread(); 53190978c3Sopenharmony_ci void ExecuteThreadFunc(); 54190978c3Sopenharmony_ci 55190978c3Sopenharmony_ci virtual bool ProcessThreadExecute() = 0; 56190978c3Sopenharmony_ci virtual void ProcessThreadExit() = 0; 57190978c3Sopenharmony_ci 58190978c3Sopenharmony_ciprivate: 59190978c3Sopenharmony_ci std::thread *pDealThread_ { nullptr }; 60190978c3Sopenharmony_ci std::mutex mutex_; 61190978c3Sopenharmony_ci std::condition_variable condition_; 62190978c3Sopenharmony_ci bool isWake_ = false; 63190978c3Sopenharmony_ci bool isExitThread_ = false; 64190978c3Sopenharmony_ci}; 65190978c3Sopenharmony_ci 66190978c3Sopenharmony_ciclass DownloadThread : public ProgressThread { 67190978c3Sopenharmony_cipublic: 68190978c3Sopenharmony_ci using ProgressCallback = std::function<void (const std::string serverUrl, const std::string &fileName, 69190978c3Sopenharmony_ci const Progress &progress)>; 70190978c3Sopenharmony_ci explicit DownloadThread(ProgressCallback callback) : ProgressThread(), callback_(callback) {} 71190978c3Sopenharmony_ci ~DownloadThread() override 72190978c3Sopenharmony_ci { 73190978c3Sopenharmony_ci ProgressThread::QuitDownloadThread(); 74190978c3Sopenharmony_ci } 75190978c3Sopenharmony_ci 76190978c3Sopenharmony_ci int32_t StartDownload(const std::string &fileName, const std::string &url); 77190978c3Sopenharmony_ci void StopDownload(); 78190978c3Sopenharmony_ci 79190978c3Sopenharmony_ci static size_t GetLocalFileLength(const std::string &fileName); 80190978c3Sopenharmony_ci static size_t WriteFunc(void *ptr, size_t size, size_t nmemb, const void *stream); 81190978c3Sopenharmony_ci static int32_t DownloadProgress(const void *localData, 82190978c3Sopenharmony_ci double dlTotal, double dlNow, double ulTotal, double ulNow); 83190978c3Sopenharmony_ci 84190978c3Sopenharmony_ci double GetPackageSize() 85190978c3Sopenharmony_ci { 86190978c3Sopenharmony_ci packageSize_ = GetLocalFileLength(downloadFileName_); 87190978c3Sopenharmony_ci return static_cast<double>(packageSize_); 88190978c3Sopenharmony_ci }; 89190978c3Sopenharmony_ci 90190978c3Sopenharmony_ciprotected: 91190978c3Sopenharmony_ci bool ProcessThreadExecute() override; 92190978c3Sopenharmony_ci void ProcessThreadExit() override; 93190978c3Sopenharmony_ci int32_t DownloadCallback(uint32_t percent, UpgradeStatus status, const std::string &error); 94190978c3Sopenharmony_ci static FILE* FileOpen(const std::string &fileName, const std::string &mode); 95190978c3Sopenharmony_ci 96190978c3Sopenharmony_ciprivate: 97190978c3Sopenharmony_ci Progress downloadProgress_ {}; 98190978c3Sopenharmony_ci ProgressCallback callback_; 99190978c3Sopenharmony_ci CURL *downloadHandle_ { nullptr }; 100190978c3Sopenharmony_ci FILE *downloadFile_ { nullptr }; 101190978c3Sopenharmony_ci std::string serverUrl_; 102190978c3Sopenharmony_ci std::atomic<bool> exitDownload_ { false }; 103190978c3Sopenharmony_ci size_t packageSize_ { 1 }; 104190978c3Sopenharmony_ci std::string downloadFileName_; 105190978c3Sopenharmony_ci bool DealAbnormal(uint32_t percent); 106190978c3Sopenharmony_ci}; 107190978c3Sopenharmony_ci} // namespace UpdateEngine 108190978c3Sopenharmony_ci} // namespace OHOS 109190978c3Sopenharmony_ci#endif // UPDATER_THREAD_H 110