| // Copyright 2020 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. |
| |
| #include "chrome/browser/chromeos/scanning/scan_service.h" |
| |
| #include <utility> |
| |
| #include "base/bind.h" |
| #include "base/check.h" |
| #include "base/strings/utf_string_conversions.h" |
| #include "chrome/browser/chromeos/scanning/lorgnette_scanner_manager.h" |
| #include "chrome/browser/chromeos/scanning/scanning_type_converters.h" |
| |
| namespace chromeos { |
| |
| namespace { |
| |
| namespace mojo_ipc = scanning::mojom; |
| |
| } // namespace |
| |
| ScanService::ScanService(LorgnetteScannerManager* lorgnette_scanner_manager) |
| : lorgnette_scanner_manager_(lorgnette_scanner_manager) { |
| DCHECK(lorgnette_scanner_manager_); |
| } |
| |
| ScanService::~ScanService() = default; |
| |
| void ScanService::GetScanners(GetScannersCallback callback) { |
| lorgnette_scanner_manager_->GetScannerNames( |
| base::BindOnce(&ScanService::OnScannerNamesReceived, |
| weak_ptr_factory_.GetWeakPtr(), std::move(callback))); |
| } |
| |
| void ScanService::GetScannerCapabilities( |
| const base::UnguessableToken& scanner_id, |
| GetScannerCapabilitiesCallback callback) { |
| const auto it = scanner_names_.find(scanner_id); |
| if (it == scanner_names_.end()) { |
| LOG(ERROR) << "Failed to find scanner name using the given scanner id."; |
| std::move(callback).Run(mojo_ipc::ScannerCapabilities::New()); |
| return; |
| } |
| |
| lorgnette_scanner_manager_->GetScannerCapabilities( |
| it->second, |
| base::BindOnce(&ScanService::OnScannerCapabilitiesReceived, |
| weak_ptr_factory_.GetWeakPtr(), std::move(callback))); |
| } |
| |
| void ScanService::BindInterface( |
| mojo::PendingReceiver<mojo_ipc::ScanService> pending_receiver) { |
| receiver_.Bind(std::move(pending_receiver)); |
| } |
| |
| void ScanService::Shutdown() { |
| lorgnette_scanner_manager_ = nullptr; |
| receiver_.reset(); |
| weak_ptr_factory_.InvalidateWeakPtrs(); |
| } |
| |
| void ScanService::OnScannerNamesReceived( |
| GetScannersCallback callback, |
| std::vector<std::string> scanner_names) { |
| scanner_names_.clear(); |
| scanner_names_.reserve(scanner_names.size()); |
| std::vector<mojo_ipc::ScannerPtr> scanners; |
| scanners.reserve(scanner_names.size()); |
| for (const auto& name : scanner_names) { |
| base::UnguessableToken id = base::UnguessableToken::Create(); |
| scanner_names_[id] = name; |
| scanners.push_back(mojo_ipc::Scanner::New(id, base::UTF8ToUTF16(name))); |
| } |
| |
| std::move(callback).Run(std::move(scanners)); |
| } |
| |
| void ScanService::OnScannerCapabilitiesReceived( |
| GetScannerCapabilitiesCallback callback, |
| const base::Optional<lorgnette::ScannerCapabilities>& capabilities) { |
| if (!capabilities) { |
| LOG(ERROR) << "Failed to get scanner capabilities."; |
| std::move(callback).Run(mojo_ipc::ScannerCapabilities::New()); |
| return; |
| } |
| |
| std::move(callback).Run( |
| mojo::ConvertTo<mojo_ipc::ScannerCapabilitiesPtr>(capabilities.value())); |
| } |
| |
| } // namespace chromeos |