#ifndef CHROME_UPDATER_PERSISTED_DATA_H_
#define CHROME_UPDATER_PERSISTED_DATA_H_
#include <memory>
#include <optional>
#include <string>
#include <vector>
#include "base/memory/raw_ptr.h"
#include "base/memory/ref_counted.h"
#include "base/sequence_checker.h"
#include "base/time/time.h"
#include "base/values.h"
#include "chrome/updater/registration_data.h"
#include "chrome/updater/updater_scope.h"
#include "components/update_client/persisted_data.h"
#if BUILDFLAG(IS_WIN)
#include <windows.h>
#endif
class PrefService;
class PrefRegistrySimple;
namespace base {
class FilePath;
class Version;
}
namespace update_client {
class ActivityDataService;
struct CategorizedError;
}
namespace updater {
class PersistedData : public base::RefCountedThreadSafe<PersistedData>,
public update_client::PersistedData {
public:
PersistedData(
UpdaterScope scope,
PrefService* pref_service,
std::unique_ptr<update_client::ActivityDataService> activity_service);
PersistedData(const PersistedData&) = delete;
PersistedData& operator=(const PersistedData&) = delete;
base::FilePath GetProductVersionPath(const std::string& id) const;
void SetProductVersionPath(const std::string& id, const base::FilePath& path);
std::string GetProductVersionKey(const std::string& id) const;
void SetProductVersionKey(const std::string& id, const std::string& value);
base::FilePath GetExistenceCheckerPath(const std::string& id) const;
void SetExistenceCheckerPath(const std::string& id,
const base::FilePath& ecp);
std::string GetBrandCode(const std::string& id);
void SetBrandCode(const std::string& id, const std::string& bc);
base::FilePath GetBrandPath(const std::string& id) const;
void SetBrandPath(const std::string& id, const base::FilePath& bp);
std::string GetAP(const std::string& id);
void SetAP(const std::string& id, const std::string& ap);
base::FilePath GetAPPath(const std::string& id) const;
void SetAPPath(const std::string& id, const base::FilePath& path);
std::string GetAPKey(const std::string& id) const;
void SetAPKey(const std::string& id, const std::string& value);
std::string GetLang(const std::string& id);
void SetLang(const std::string& id, const std::string& lang);
void RegisterApp(const RegistrationRequest& rq);
bool HasApp(const std::string& id);
bool RemoveApp(const std::string& id);
std::vector<std::string> GetAppIds() const;
bool GetHadApps() const;
void SetHadApps();
struct Cookie {
std::string value;
base::Time expiration;
auto operator<=>(const Cookie&) const = default;
};
std::optional<Cookie> GetRemoteLoggingCookie() const;
void SetRemoteLoggingCookie(const Cookie& logging_cookie);
void ClearRemoteLoggingCookie();
base::Time GetNextAllowedLoggingAttemptTime() const;
void SetNextAllowedLoggingAttemptTime(base::Time time);
bool GetEulaRequired() const;
void SetEulaRequired(bool eula_required);
base::Time GetLastChecked() const;
void SetLastChecked(base::Time time);
base::Time GetLastStarted() const;
void SetLastStarted(base::Time time);
#if BUILDFLAG(IS_WIN)
std::optional<OSVERSIONINFOEX> GetLastOSVersion() const;
void SetLastOSVersion();
#endif
base::Version GetProductVersion(const std::string& id) const override;
void SetProductVersion(const std::string& id,
const base::Version& pv) override;
base::Version GetMaxPreviousProductVersion(
const std::string& id) const override;
void SetMaxPreviousProductVersion(const std::string& id,
const base::Version& max_version) override;
std::string GetFingerprint(const std::string& id) const override;
void SetFingerprint(const std::string& id, const std::string& fp) override;
int GetDateLastActive(const std::string& id) const override;
int GetDaysSinceLastActive(const std::string& id) const override;
void SetDateLastActive(const std::string& id, int dla) override;
int GetDateLastRollCall(const std::string& id) const override;
int GetDaysSinceLastRollCall(const std::string& id) const override;
void SetDateLastRollCall(const std::string& id, int dlrc) override;
std::string GetCohort(const std::string& id) const override;
void SetCohort(const std::string& id, const std::string& cohort) override;
std::string GetCohortName(const std::string& id) const override;
void SetCohortName(const std::string& id,
const std::string& cohort_name) override;
std::string GetCohortHint(const std::string& id) const override;
void SetCohortHint(const std::string& id,
const std::string& cohort_hint) override;
std::string GetPingFreshness(const std::string& id) const override;
void SetDateLastData(const std::vector<std::string>& ids,
int datenum,
base::OnceClosure callback) override;
int GetInstallDate(const std::string& id) const override;
void SetInstallDate(const std::string& id, int install_date) override;
std::string GetInstallId(const std::string& app_id) const override;
void SetInstallId(const std::string& app_id,
const std::string& install_id) override;
void GetActiveBits(const std::vector<std::string>& ids,
base::OnceCallback<void(const std::set<std::string>&)>
callback) const override;
base::Time GetThrottleUpdatesUntil() const override;
void SetThrottleUpdatesUntil(base::Time time) override;
void SetLastUpdateCheckError(
const update_client::CategorizedError& error) override;
private:
friend class base::RefCountedThreadSafe<PersistedData>;
~PersistedData() override;
const base::Value::Dict* GetAppKey(const std::string& id) const;
base::Value::Dict* GetOrCreateAppKey(const std::string& id,
base::Value::Dict& root);
std::optional<int> GetInteger(const std::string& id,
const std::string& key) const;
void SetInteger(const std::string& id, const std::string& key, int value);
std::string GetString(const std::string& id, const std::string& key) const;
void SetString(const std::string& id,
const std::string& key,
const std::string& value);
SEQUENCE_CHECKER(sequence_checker_);
const UpdaterScope scope_;
raw_ptr<PrefService, DanglingUntriaged> pref_service_ = nullptr;
std::unique_ptr<update_client::PersistedData> delegate_;
};
void RegisterPersistedDataPrefs(scoped_refptr<PrefRegistrySimple> registry);
void MigrateObsoletePersistedDataPrefs(PrefService* pref_service);
}
#endif