910e62b5创建于 1月15日历史提交
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROME_BROWSER_ASH_CROSAPI_LOCAL_PRINTER_ASH_H_
#define CHROME_BROWSER_ASH_CROSAPI_LOCAL_PRINTER_ASH_H_

#include <string>
#include <vector>

#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
#include "base/scoped_observation.h"
#include "chrome/browser/ash/printing/cups_print_job.h"
#include "chrome/browser/ash/printing/cups_print_job_manager.h"
#include "chrome/browser/ash/printing/cups_printers_manager.h"
#include "chrome/browser/ash/printing/print_servers_manager.h"
#include "chrome/browser/profiles/profile_manager_observer.h"
#include "chromeos/crosapi/mojom/local_printer.mojom.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/receiver_set.h"
#include "mojo/public/cpp/bindings/remote_set.h"

class Profile;
class ProfileManager;

namespace ash {
struct PrintServersConfig;

namespace printing {
class IppClientInfoCalculator;
}
}  // namespace ash

namespace chromeos {
class PpdProvider;
}  // namespace chromeos

namespace crosapi {

// Implements the crosapi interface for LocalPrinter. Lives in Ash-Chrome on the
// UI thread.
class LocalPrinterAsh : public mojom::LocalPrinter,
                        public ProfileManagerObserver,
                        public ash::CupsPrintJobManager::Observer,
                        public ash::PrintServersManager::Observer,
                        public ash::CupsPrintersManager::LocalPrintersObserver {
 public:
  LocalPrinterAsh();
  LocalPrinterAsh(const LocalPrinterAsh&) = delete;
  LocalPrinterAsh& operator=(const LocalPrinterAsh&) = delete;

  // As it observes browser context keyed services, this object must
  // be destroyed after said services are destroyed (which occurs in
  // ChromeBrowserMainParts::PostMainMessageLoopRun()). CrosapiAsh
  // is destroyed in ~ChromeBrowserMainParts() which occurs after
  // all browser context keyed services have been destroyed.
  ~LocalPrinterAsh() override;

  // The mojom PrintServersConfig object contains all information in the
  // PrintServersConfig object.
  static mojom::PrintServersConfigPtr ConfigToMojom(
      const ash::PrintServersConfig& config);

  void BindReceiver(mojo::PendingReceiver<mojom::LocalPrinter> receiver);

  // ProfileManagerObserver:
  void OnProfileAdded(Profile* profile) override;
  void OnProfileManagerDestroying() override;

  // ash::CupsPrintJobManager::Observer:
  void OnPrintJobCreated(base::WeakPtr<ash::CupsPrintJob> job) override;
  void OnPrintJobStarted(base::WeakPtr<ash::CupsPrintJob> job) override;
  void OnPrintJobUpdated(base::WeakPtr<ash::CupsPrintJob> job) override;
  void OnPrintJobSuspended(base::WeakPtr<ash::CupsPrintJob> job) override;
  void OnPrintJobResumed(base::WeakPtr<ash::CupsPrintJob> job) override;
  void OnPrintJobDone(base::WeakPtr<ash::CupsPrintJob> job) override;
  void OnPrintJobError(base::WeakPtr<ash::CupsPrintJob> job) override;
  void OnPrintJobCancelled(base::WeakPtr<ash::CupsPrintJob> job) override;

  // chromeos::PrintServersManager::Observer:
  void OnPrintServersChanged(const ash::PrintServersConfig& config) override;
  void OnServerPrintersChanged(
      const std::vector<ash::PrinterDetector::DetectedPrinter>&) override;

  // CupsPrintersManager::LocalPrintersObserver:
  void OnLocalPrintersUpdated() override;

  // crosapi::mojom::LocalPrinter:
  void GetPrinters(GetPrintersCallback callback) override;
  void GetCapability(const std::string& printer_id,
                     GetCapabilityCallback callback) override;
  void GetEulaUrl(const std::string& printer_id,
                  GetEulaUrlCallback callback) override;
  void GetStatus(const std::string& printer_id,
                 GetStatusCallback callback) override;
  void ShowSystemPrintSettings(
      ShowSystemPrintSettingsCallback callback) override;
  void CreatePrintJob(mojom::PrintJobPtr job,
                      CreatePrintJobCallback callback) override;
  void CancelPrintJob(const std::string& printer_id,
                      unsigned int job_id,
                      CancelPrintJobCallback callback) override;
  void GetPrintServersConfig(GetPrintServersConfigCallback callback) override;
  void ChoosePrintServers(const std::vector<std::string>& print_server_ids,
                          ChoosePrintServersCallback callback) override;
  void AddPrintServerObserver(
      mojo::PendingRemote<mojom::PrintServerObserver> remote,
      AddPrintServerObserverCallback callback) override;
  void GetPolicies(GetPoliciesCallback callback) override;
  void GetUsernamePerPolicy(GetUsernamePerPolicyCallback callback) override;
  void GetPrinterTypeDenyList(GetPrinterTypeDenyListCallback callback) override;
  void AddPrintJobObserver(mojo::PendingRemote<mojom::PrintJobObserver> remote,
                           mojom::PrintJobSource source,
                           AddPrintJobObserverCallback callback) override;
  void AddLocalPrintersObserver(
      mojo::PendingRemote<mojom::LocalPrintersObserver> remote,
      AddLocalPrintersObserverCallback callback) override;
  void GetOAuthAccessToken(const std::string& printer_id,
                           GetOAuthAccessTokenCallback callback) override;
  void GetIppClientInfo(const std::string& printer_id,
                        GetIppClientInfoCallback callback) override;

 private:
  void NotifyPrintJobUpdate(base::WeakPtr<ash::CupsPrintJob> job,
                            mojom::PrintJobStatus status);

  // Exposed so that unit tests can override them.
  virtual Profile* GetProfile();
  virtual scoped_refptr<chromeos::PpdProvider> CreatePpdProvider(
      Profile* profile);
  virtual ash::printing::IppClientInfoCalculator* GetIppClientInfoCalculator();

  base::ScopedObservation<ProfileManager, LocalPrinterAsh>
      profile_manager_observer_{this};

  bool observers_registered_ = false;

  std::unique_ptr<ash::printing::IppClientInfoCalculator>
      ipp_client_info_calculator_;

  // This class supports any number of connections. This allows the client to
  // have multiple, potentially thread-affine, remotes.
  mojo::ReceiverSet<mojom::LocalPrinter> receivers_;

  mojo::RemoteSet<mojom::PrintServerObserver> print_server_remotes_;

  // Remotes which observe all print jobs.
  mojo::RemoteSet<mojom::PrintJobObserver> print_job_remotes_;

  // Remotes which observe only extension print jobs.
  mojo::RemoteSet<mojom::PrintJobObserver> extension_print_job_remotes_;

  // Remotes which observe only IWA print jobs.
  mojo::RemoteSet<mojom::PrintJobObserver> iwa_print_job_remotes_;

  // Remotes which observe local printer updates.
  mojo::RemoteSet<mojom::LocalPrintersObserver>
      local_printers_observer_remotes_;
};

}  // namespace crosapi

#endif  // CHROME_BROWSER_ASH_CROSAPI_LOCAL_PRINTER_ASH_H_