file_fetcher.h revision 2c131bbf81d8c02ade163b939c96e44aa93765e9
12c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo// 22c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo// Copyright (C) 2016 The Android Open Source Project 32c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo// 42c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo// Licensed under the Apache License, Version 2.0 (the "License"); 52c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo// you may not use this file except in compliance with the License. 62c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo// You may obtain a copy of the License at 72c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo// 82c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo// http://www.apache.org/licenses/LICENSE-2.0 92c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo// 102c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo// Unless required by applicable law or agreed to in writing, software 112c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo// distributed under the License is distributed on an "AS IS" BASIS, 122c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo// See the License for the specific language governing permissions and 142c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo// limitations under the License. 152c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo// 162c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo 172c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo#ifndef UPDATE_ENGINE_COMMON_FILE_FETCHER_H_ 182c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo#define UPDATE_ENGINE_COMMON_FILE_FETCHER_H_ 192c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo 202c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo#include <memory> 212c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo#include <string> 222c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo#include <utility> 232c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo 242c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo#include <base/logging.h> 252c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo#include <base/macros.h> 262c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo#include <brillo/message_loops/message_loop.h> 272c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo#include <brillo/streams/stream.h> 282c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo 292c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo#include "update_engine/common/http_fetcher.h" 302c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo 312c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo// This is a concrete implementation of HttpFetcher that reads files 322c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo// asynchronously. 332c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo 342c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymonamespace chromeos_update_engine { 352c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo 362c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymoclass FileFetcher : public HttpFetcher { 372c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo public: 382c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo // Returns whether the passed url is supported. 392c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo static bool SupportedUrl(const std::string& url); 402c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo 412c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo FileFetcher() : HttpFetcher(nullptr) {} 422c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo 432c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo // Cleans up all internal state. Does not notify delegate. 442c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo ~FileFetcher() override; 452c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo 462c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo // HttpFetcher overrides. 472c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo void SetOffset(off_t offset) override { offset_ = offset; } 482c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo void SetLength(size_t length) override { data_length_ = length; } 492c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo void UnsetLength() override { SetLength(0); } 502c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo 512c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo // Begins the transfer if it hasn't already begun. 522c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo void BeginTransfer(const std::string& url) override; 532c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo 542c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo // If the transfer is in progress, aborts the transfer early. The transfer 552c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo // cannot be resumed. 562c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo void TerminateTransfer() override; 572c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo 582c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo // Ignore all extra headers for files. 592c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo void SetHeader(const std::string& header_name, 602c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo const std::string& header_value) override {}; 612c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo 622c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo // Suspend the asynchronous file read. 632c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo void Pause() override; 642c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo 652c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo // Resume the suspended file read. 662c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo void Unpause() override; 672c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo 682c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo size_t GetBytesDownloaded() override { 692c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo return static_cast<size_t>(bytes_copied_); 702c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo } 712c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo 722c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo // Ignore all the time limits for files. 732c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo void set_low_speed_limit(int low_speed_bps, int low_speed_sec) override {} 742c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo void set_connect_timeout(int connect_timeout_seconds) override {} 752c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo void set_max_retry_count(int max_retry_count) override {} 762c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo 772c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo private: 782c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo // Cleans up the fetcher, resetting its status to a newly constructed one. 792c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo void CleanUp(); 802c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo 812c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo // Schedule a new asynchronous read if the stream is not paused and no other 822c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo // read is in process. This method can be called at any point. 832c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo void ScheduleRead(); 842c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo 852c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo // Called from the main loop when a single read from |stream_| succeeds or 862c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo // fails, calling OnReadDoneCallback() and OnReadErrorCallback() respectively. 872c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo void OnReadDoneCallback(size_t bytes_read); 882c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo void OnReadErrorCallback(const brillo::Error* error); 892c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo 902c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo // Whether the transfer was started and didn't finish yet. 912c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo bool transfer_in_progress_{false}; 922c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo 932c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo // Whether the transfer is paused. 942c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo bool transfer_paused_{false}; 952c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo 962c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo // Whether there's an ongoing asynchronous read. When this value is true, the 972c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo // the |buffer_| is being used by the |stream_|. 982c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo bool ongoing_read_{false}; 992c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo 1002c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo // Total number of bytes copied. 1012c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo uint64_t bytes_copied_{0}; 1022c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo 1032c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo // The offset inside the file where the read should start. 1042c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo uint64_t offset_{0}; 1052c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo 1062c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo // The length of the data or -1 if unknown (will read until EOF). 1072c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo int64_t data_length_{-1}; 1082c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo 1092c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo brillo::StreamPtr stream_; 1102c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo 1112c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo // The buffer used for reading from the stream. 1122c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo brillo::Blob buffer_; 1132c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo 1142c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo DISALLOW_COPY_AND_ASSIGN(FileFetcher); 1152c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo}; 1162c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo 1172c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo} // namespace chromeos_update_engine 1182c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo 1192c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo#endif // UPDATE_ENGINE_COMMON_FILE_FETCHER_H_ 120