blob: 0fe8a9a9747ec8bfe9f39d9a680a190663d95870 [file] [log] [blame]
// Copyright 2021 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 CHROME_UPDATER_CHECK_FOR_UPDATES_TASK_H_
#define CHROME_UPDATER_CHECK_FOR_UPDATES_TASK_H_
#include <string>
#include <vector>
#include "base/callback.h"
#include "base/files/file_path.h"
#include "base/memory/scoped_refptr.h"
#include "base/sequence_checker.h"
#include "base/version.h"
#include "chrome/updater/update_service.h"
namespace update_client {
class Configurator;
class UpdateClient;
enum class Error;
} // namespace update_client
namespace updater {
class PersistedData;
class CheckForUpdatesTask
: public base::RefCountedThreadSafe<CheckForUpdatesTask> {
public:
CheckForUpdatesTask(
scoped_refptr<update_client::Configurator> config,
base::OnceCallback<void(UpdateService::Callback)> update_checker,
base::OnceClosure callback);
void Run();
// Provides a way to remove apps from the persisted data if the app is no
// longer installed on the machine.
void UnregisterMissingApps();
private:
friend class base::RefCountedThreadSafe<CheckForUpdatesTask>;
virtual ~CheckForUpdatesTask();
struct AppInfo {
AppInfo(const std::string& app_id,
const base::Version& app_version,
const base::FilePath& ecp)
: app_id_(app_id), app_version_(app_version), ecp_(ecp) {}
std::string app_id_;
base::Version app_version_;
base::FilePath ecp_;
};
struct PingInfo {
PingInfo(const std::string& app_id,
const base::Version& app_version,
int ping_reason)
: app_id_(app_id),
app_version_(app_version),
ping_reason_(ping_reason) {}
std::string app_id_;
base::Version app_version_;
int ping_reason_;
};
// Returns a list of apps registered with the updater.
std::vector<AppInfo> GetRegisteredApps();
// Returns a list of apps that need to be unregistered.
std::vector<PingInfo> GetAppIDsToRemove(const std::vector<AppInfo>& apps);
// Callback to run after a `MaybeCheckForUpdates` has finished.
// Triggers the completion of the whole task.
void MaybeCheckForUpdatesDone();
// Unregisters the apps in `app_ids_to_remove` and starts an update check
// if necessary.
void RemoveAppIDsAndSendUninstallPings(
const std::vector<PingInfo>& app_ids_to_remove);
// After an uninstall ping has been processed, reduces the number of pings
// that we need to wait on before checking for updates.
void UninstallPingSent(update_client::Error error);
// Returns true if there are uninstall ping tasks which haven't finished.
// Returns false if `number_of_pings_remaining_` is 0.
// `number_of_pings_remaining_` is only updated on the tasks's sequence.
bool WaitingOnUninstallPings() const;
// Checks for updates of all registered applications if it has been longer
// than the last check time by NextCheckDelay() amount defined in the
// config.
void MaybeCheckForUpdates();
// Callback to run after `UnregisterMissingApps` has finished.
// Triggers `MaybeCheckForUpdates`.
void UnregisterMissingAppsDone();
SEQUENCE_CHECKER(sequence_checker_);
scoped_refptr<update_client::Configurator> config_;
base::OnceCallback<void(UpdateService::Callback)> update_checker_;
scoped_refptr<updater::PersistedData> persisted_data_;
scoped_refptr<update_client::UpdateClient> update_client_;
base::OnceClosure callback_;
int number_of_pings_remaining_;
};
} // namespace updater
#endif // CHROME_UPDATER_CHECK_FOR_UPDATES_TASK_H_