1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
|
// 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.
#include "components/services/on_device_translation/on_device_translation_service.h"
#include <memory>
#include "base/types/pass_key.h"
#include "components/services/on_device_translation/public/mojom/on_device_translation_service.mojom.h"
#include "components/services/on_device_translation/public/mojom/translator.mojom.h"
#include "components/services/on_device_translation/translate_kit_client.h"
#include "mojo/public/cpp/bindings/self_owned_receiver.h"
namespace on_device_translation {
// TranslateKitTranslator provides translation functionalities based on the
// Translator from TranslateKitClient.
class TranslateKitTranslator : public mojom::Translator {
public:
explicit TranslateKitTranslator(TranslateKitClient::Translator* translator)
: translator_(translator) {
CHECK(translator_);
}
~TranslateKitTranslator() override = default;
// Not copyable.
TranslateKitTranslator(const TranslateKitTranslator&) = delete;
TranslateKitTranslator& operator=(const TranslateKitTranslator&) = delete;
// `mojom::Translator` overrides:
void Translate(const std::string& input,
TranslateCallback translate_callback) override {
CHECK(translator_);
std::move(translate_callback).Run(translator_->Translate(input));
}
private:
// Owned by the TranslateKitClient managed by OnDeviceTranslationService.
// The lifetime must be longer than this instance.
raw_ptr<TranslateKitClient::Translator> translator_;
};
// static
std::unique_ptr<OnDeviceTranslationService>
OnDeviceTranslationService::CreateForTesting(
mojo::PendingReceiver<mojom::OnDeviceTranslationService> receiver,
std::unique_ptr<TranslateKitClient> client) {
return std::make_unique<OnDeviceTranslationService>(
std::move(receiver), std::move(client),
base::PassKey<OnDeviceTranslationService>());
}
OnDeviceTranslationService::OnDeviceTranslationService(
mojo::PendingReceiver<mojom::OnDeviceTranslationService> receiver)
: receiver_(this, std::move(receiver)),
client_(TranslateKitClient::Get()) {}
OnDeviceTranslationService::OnDeviceTranslationService(
mojo::PendingReceiver<mojom::OnDeviceTranslationService> receiver,
std::unique_ptr<TranslateKitClient> client,
base::PassKey<OnDeviceTranslationService>)
: receiver_(this, std::move(receiver)),
owning_client_for_testing_(std::move(client)),
client_(owning_client_for_testing_.get()) {}
OnDeviceTranslationService::~OnDeviceTranslationService() = default;
void OnDeviceTranslationService::SetServiceConfig(
mojom::OnDeviceTranslationServiceConfigPtr config) {
client_->SetConfig(std::move(config));
}
void OnDeviceTranslationService::CreateTranslator(
const std::string& source_lang,
const std::string& target_lang,
mojo::PendingReceiver<on_device_translation::mojom::Translator> receiver,
CreateTranslatorCallback create_translator_callback) {
auto maybe_translator = client_->GetTranslator(source_lang, target_lang);
if (!maybe_translator.has_value()) {
std::move(create_translator_callback).Run(maybe_translator.error());
return;
}
translators_.Add(
std::make_unique<TranslateKitTranslator>(maybe_translator.value()),
std::move(receiver));
std::move(create_translator_callback)
.Run(mojom::CreateTranslatorResult::kSuccess);
}
void OnDeviceTranslationService::CanTranslate(
const std::string& source_lang,
const std::string& target_lang,
CanTranslateCallback can_translate_callback) {
std::move(can_translate_callback)
.Run(client_->CanTranslate(source_lang, target_lang));
}
} // namespace on_device_translation
|