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