blob: 656ff85de7eb406e3fbd449d15d1f62044975794 [file] [log] [blame]
// Copyright 2018 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_BROWSER_CHROMEOS_POLICY_ARC_APP_INSTALL_EVENT_LOG_MANAGER_H_
#define CHROME_BROWSER_CHROMEOS_POLICY_ARC_APP_INSTALL_EVENT_LOG_MANAGER_H_
#include <memory>
#include <set>
#include <string>
#include "chrome/browser/chromeos/policy/app_install_event_logger.h"
#include "chrome/browser/chromeos/policy/arc_app_install_event_log.h"
#include "chrome/browser/chromeos/policy/arc_app_install_event_log_uploader.h"
#include "chrome/browser/chromeos/policy/install_event_log_manager.h"
#include "components/policy/proto/device_management_backend.pb.h"
class Profile;
namespace policy {
// Owns an |ArcAppInstallEventLog| for log storage and an
// |AppInstallEventLogger| for log collection. The |ArcAppInstallEventUploader|
// is passed to the constructor and must outlive |this|.
class ArcAppInstallEventLogManager
: public InstallEventLogManagerBase,
public AppInstallEventLogger::Delegate,
public ArcAppInstallEventLogUploader::Delegate {
public:
// All accesses to the |profile|'s app push-install event log file must use
// the same |log_task_runner_wrapper| to ensure correct I/O serialization.
// |uploader| must outlive |this|.
ArcAppInstallEventLogManager(LogTaskRunnerWrapper* log_task_runner_wrapper,
ArcAppInstallEventLogUploader* uploader,
Profile* profile);
// Posts a task to |log_task_runner_| that stores the log to file and destroys
// |log_|. |log_| thus outlives |this| but any pending callbacks are canceled
// by invalidating weak pointers.
~ArcAppInstallEventLogManager() override;
// Clears all data related to the app-install event log for |profile|. Must
// not be called while an |ArcAppInstallEventLogManager| exists for |profile|.
// This method and any other accesses to the |profile|'s app push-install
// event log must use the same |log_task_runner_wrapper| to ensure correct I/O
// serialization.
static void Clear(LogTaskRunnerWrapper* log_task_runner_wrapper,
Profile* profile);
// AppInstallEventLogger::Delegate:
void Add(
const std::set<std::string>& packages,
const enterprise_management::AppInstallReportLogEvent& event) override;
void GetAndroidId(
AppInstallEventLogger::Delegate::AndroidIdCallback) const override;
// ArcAppInstallEventLogUploader::Delegate:
void SerializeForUpload(
ArcAppInstallEventLogUploader::Delegate::SerializationCallback callback)
override;
void OnUploadSuccess() override;
private:
// Once created, |ArcLog| runs in the background and must be accessed and
// eventually destroyed via |log_task_runner_|. |ArcLog| outlives its parent
// and stores the current log to disk in its destructor.
// TODO(crbub/1092387): Remove this class to handle sequence checking in
// ArcAppInstallEventLog.
class ArcLog : public InstallEventLogManagerBase::InstallLog<
enterprise_management::AppInstallReportLogEvent,
ArcAppInstallEventLog> {
public:
ArcLog();
// Stores the current log to disk.
~ArcLog() override;
// Serializes the log to a protobuf for upload.
std::unique_ptr<enterprise_management::AppInstallReportRequest> Serialize();
private:
// Ensures that methods are not called from the wrong thread.
SEQUENCE_CHECKER(sequence_checker_);
};
// |AppLogUpload| is owned by |owner_| and |owner_| outlives it.
class AppLogUpload : public InstallEventLogManagerBase::LogUpload {
public:
explicit AppLogUpload(ArcAppInstallEventLogManager* owner);
~AppLogUpload() override;
void StoreLog() override;
void RequestUploadForUploader() override;
private:
ArcAppInstallEventLogManager* owner_;
};
// Uploads logs to the server.
ArcAppInstallEventLogUploader* const uploader_;
// Helper that owns the log store. Once created, must only be accessed via
// |log_task_runner_|. Outlives |this| and ensures the extension log is stored
// to disk in its destructor.
std::unique_ptr<ArcLog> log_;
// Handles storing the logs and preparing them for upload.
std::unique_ptr<AppLogUpload> app_log_upload_;
// Collects log events and passes them to |this|.
std::unique_ptr<AppInstallEventLogger> logger_;
};
} // namespace policy
#endif // CHROME_BROWSER_CHROMEOS_POLICY_ARC_APP_INSTALL_EVENT_LOG_MANAGER_H_