blob: bc36efb2b9e68d4eb629d39826f9066355aae80b [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_QUIRKS_QUIRKS_CLIENT_H_
#define COMPONENTS_QUIRKS_QUIRKS_CLIENT_H_
#include <memory>
#include "base/files/file_path.h"
#include "base/macros.h"
#include "base/threading/thread_checker.h"
#include "base/timer/timer.h"
#include "net/base/backoff_entry.h"
namespace network {
class SimpleURLLoader;
}
namespace quirks {
class QuirksManager;
// See declaration in quirks_manager.h.
using RequestFinishedCallback =
base::Callback<void(const base::FilePath&, bool)>;
// Handles downloading icc and other display data files from Quirks Server.
class QuirksClient {
public:
QuirksClient(int64_t product_id,
const std::string& display_name,
const RequestFinishedCallback& on_request_finished,
QuirksManager* manager);
~QuirksClient();
void StartDownload();
int64_t product_id() const { return product_id_; }
private:
void OnDownloadComplete(std::unique_ptr<std::string> response_body);
// Send callback and tell manager to delete |this|.
void Shutdown(bool success);
// Schedules a retry.
void Retry();
// Translates json with base64-encoded data (|result|) into raw |data|.
bool ParseResult(const std::string& result, std::string* data);
// ID of display to request from Quirks Server.
const int64_t product_id_;
// Human-readable name to send to Quirks Server.
const std::string display_name_;
// Callback supplied by caller.
const RequestFinishedCallback on_request_finished_;
// Weak pointer owned by manager, guaranteed to outlive this client object.
QuirksManager* manager_;
// Full path to icc file.
const base::FilePath icc_path_;
// The class is expected to run on UI thread.
base::ThreadChecker thread_checker_;
// This loader is used to download icc file.
std::unique_ptr<network::SimpleURLLoader> url_loader_;
// Pending retry.
base::OneShotTimer request_scheduled_;
// Controls exponential backoff of time between server checks.
net::BackoffEntry backoff_entry_;
// Factory for callbacks.
base::WeakPtrFactory<QuirksClient> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(QuirksClient);
};
} // namespace quirks
#endif // COMPONENTS_QUIRKS_QUIRKS_CLIENT_H_