1 /* 2 * Copyright (c) 2021 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 #ifndef UPDATER_THREAD_H 17 #define UPDATER_THREAD_H 18 19 #include <atomic> 20 #include <functional> 21 #include <thread> 22 #include <file_utils.h> 23 #include "curl/curl.h" 24 25 #include "progress.h" 26 27 namespace OHOS { 28 namespace UpdateEngine { 29 #define ENGINE_CHECK_NO_LOG(retCode, exper) \ 30 if (!(retCode)) { \ 31 exper; \ 32 } 33 34 constexpr uint32_t DOWNLOAD_FINISH_PERCENT = 100; 35 constexpr uint32_t DOWNLOAD_PERIOD_PERCENT = 1; 36 constexpr int32_t TIMEOUT_FOR_DOWNLOAD = 600; 37 #ifndef UPDATER_UT 38 constexpr int32_t TIMEOUT_FOR_CONNECT = 10; 39 #else 40 constexpr int32_t TIMEOUT_FOR_CONNECT = 1; 41 #endif 42 43 class ProgressThread { 44 public: 45 ProgressThread() = default; 46 virtual ~ProgressThread(); 47 static bool isNoNet_; 48 static bool isCancel_; 49 protected: 50 int32_t StartProgress(); 51 void StopProgress(); 52 void QuitDownloadThread(); 53 void ExecuteThreadFunc(); 54 55 virtual bool ProcessThreadExecute() = 0; 56 virtual void ProcessThreadExit() = 0; 57 58 private: 59 std::thread *pDealThread_ { nullptr }; 60 std::mutex mutex_; 61 std::condition_variable condition_; 62 bool isWake_ = false; 63 bool isExitThread_ = false; 64 }; 65 66 class DownloadThread : public ProgressThread { 67 public: 68 using ProgressCallback = std::function<void (const std::string serverUrl, const std::string &fileName, 69 const Progress &progress)>; DownloadThread(ProgressCallback callback)70 explicit DownloadThread(ProgressCallback callback) : ProgressThread(), callback_(callback) {} ~DownloadThread()71 ~DownloadThread() override 72 { 73 ProgressThread::QuitDownloadThread(); 74 } 75 76 int32_t StartDownload(const std::string &fileName, const std::string &url); 77 void StopDownload(); 78 79 static size_t GetLocalFileLength(const std::string &fileName); 80 static size_t WriteFunc(void *ptr, size_t size, size_t nmemb, const void *stream); 81 static int32_t DownloadProgress(const void *localData, 82 double dlTotal, double dlNow, double ulTotal, double ulNow); 83 GetPackageSize()84 double GetPackageSize() 85 { 86 packageSize_ = GetLocalFileLength(downloadFileName_); 87 return static_cast<double>(packageSize_); 88 }; 89 90 protected: 91 bool ProcessThreadExecute() override; 92 void ProcessThreadExit() override; 93 int32_t DownloadCallback(uint32_t percent, UpgradeStatus status, const std::string &error); 94 static FILE* FileOpen(const std::string &fileName, const std::string &mode); 95 96 private: 97 Progress downloadProgress_ {}; 98 ProgressCallback callback_; 99 CURL *downloadHandle_ { nullptr }; 100 FILE *downloadFile_ { nullptr }; 101 std::string serverUrl_; 102 std::atomic<bool> exitDownload_ { false }; 103 size_t packageSize_ { 1 }; 104 std::string downloadFileName_; 105 bool DealAbnormal(uint32_t percent); 106 }; 107 } // namespace UpdateEngine 108 } // namespace OHOS 109 #endif // UPDATER_THREAD_H 110