// Copyright 2024 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_EXTENSION_PRINTER_SERVICE_ASH_H_
#define CHROME_BROWSER_ASH_CROSAPI_EXTENSION_PRINTER_SERVICE_ASH_H_
#include <map>
#include <string>
#include "base/memory/ref_counted_memory.h"
#include "base/memory/weak_ptr.h"
#include "base/unguessable_token.h"
#include "base/values.h"
#include "chromeos/crosapi/mojom/extension_printer.mojom.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/receiver_set.h"
namespace crosapi {
// Bridge between ash-chrome's ExtensionPrinterHandlerAdapterAsh and
// lacros-chrome's ExtensionPrinterServiceProvider.
class ExtensionPrinterServiceAsh : public mojom::ExtensionPrinterService {
public:
using AddedPrintersCallback =
base::RepeatingCallback<void(base::Value::List printers)>;
using GetPrintersDoneCallback = base::OnceClosure;
using GetCapabilityCallback = base::OnceCallback<void(::base::Value::Dict)>;
using StartPrintCallback = base::OnceCallback<void(mojom::StartPrintStatus)>;
using GetPrinterInfoCallback = base::OnceCallback<void(::base::Value::Dict)>;
ExtensionPrinterServiceAsh();
ExtensionPrinterServiceAsh(const ExtensionPrinterServiceAsh&) = delete;
ExtensionPrinterServiceAsh& operator=(const ExtensionPrinterServiceAsh&) =
delete;
~ExtensionPrinterServiceAsh() override;
void BindReceiver(
mojo::PendingReceiver<mojom::ExtensionPrinterService> pending_receiver);
// mojom::ExtensionPrinterService:
void RegisterServiceProvider(
mojo::PendingRemote<mojom::ExtensionPrinterServiceProvider> provider)
override;
void PrintersAdded(const base::UnguessableToken& request_id,
base::Value::List printers,
bool is_done) override;
// Called when an ExtensionPrinterServiceProvider is disconnected.
void ExtensionPrinterServiceProviderDisconnected();
void StartGetPrinters(AddedPrintersCallback added_printers_callback,
GetPrintersDoneCallback done_callback);
void Reset();
void StartGetCapability(const std::string& destination_id,
GetCapabilityCallback callback);
void StartPrint(const std::u16string& job_title,
base::Value::Dict settings,
scoped_refptr<base::RefCountedMemory> print_data,
StartPrintCallback callback);
void StartGrantPrinterAccess(const std::string& printer_id,
GetPrinterInfoCallback callback);
// Returns true if a pending get printer request is found.
bool HasAnyPendingGetPrintersRequests() const;
// Returns true if a pending get printer request is found with |request_id|.
bool HasPendingGetPrintersRequestForTesting(
base::UnguessableToken& request_id) const;
bool HasProviderForTesting() const;
private:
// Returns true iff there is any registered ExtensionPrinterServiceProvider.
bool HasProvider() const;
void ClearPendingRequests();
// Supports any number of connections.
mojo::ReceiverSet<mojom::ExtensionPrinterService> receivers_;
// The ExtensionPrinterServiceProvider from Lacros. The
// ExtensionPrinterServiceProvider only supports Lacros primary profile for
// extension printer service.
mojo::Remote<mojom::ExtensionPrinterServiceProvider> service_provider_;
// Keeps a mapping between request_id and the corresponding
// AddedPrintersCallback.
std::map<base::UnguessableToken, AddedPrintersCallback>
pending_printers_added_callbacks_;
// Keeps a mapping between request_id and the corresponding
// GetPrintersDoneCallback.
std::map<base::UnguessableToken, GetPrintersDoneCallback>
pending_get_printers_done_callbacks_;
// There may be more than one printer extensions installed. Each one will
// report printers separately. Cache their printer counts and record the total
// when all extensions have reported.
std::map<base::UnguessableToken, size_t> total_printers_so_far_;
base::WeakPtrFactory<ExtensionPrinterServiceAsh> weak_ptr_factory_{this};
};
} // namespace crosapi
#endif // CHROME_BROWSER_ASH_CROSAPI_EXTENSION_PRINTER_SERVICE_ASH_H_