blob: bee859fe4f5dbdfccf0904c2378216e801235895 [file] [log] [blame]
Andrew Moylanff6be512018-07-03 11:05:01 +10001// Copyright 2018 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef ML_MACHINE_LEARNING_SERVICE_IMPL_H_
6#define ML_MACHINE_LEARNING_SERVICE_IMPL_H_
7
Michael Martisa74af932018-08-13 16:52:36 +10008#include <map>
alanlxlcb1f8562018-11-01 15:16:11 +11009#include <memory>
Michael Martisa74af932018-08-13 16:52:36 +100010#include <string>
Honglin Yu7b6c1192020-09-16 10:07:17 +100011#include <vector>
Michael Martisa74af932018-08-13 16:52:36 +100012
Andrew Moylanff6be512018-07-03 11:05:01 +100013#include <base/callback_forward.h>
14#include <base/macros.h>
Charles Zhaod4fb7b62020-08-25 17:21:58 +100015#include <dbus/bus.h>
Andrew Moylanb481af72020-07-09 15:22:00 +100016#include <mojo/public/cpp/bindings/pending_receiver.h>
17#include <mojo/public/cpp/bindings/receiver.h>
18#include <mojo/public/cpp/bindings/receiver_set.h>
Honglin Yu7b6c1192020-09-16 10:07:17 +100019#include <mojo/public/cpp/platform/platform_channel.h>
Andrew Moylanff6be512018-07-03 11:05:01 +100020
Charles Zhaod4fb7b62020-08-25 17:21:58 +100021#include "ml/dlcservice_client.h"
Michael Martisa74af932018-08-13 16:52:36 +100022#include "ml/model_metadata.h"
Hidehiko Abeaa488c32018-08-31 23:49:41 +090023#include "ml/mojom/machine_learning_service.mojom.h"
Andrew Moylanff6be512018-07-03 11:05:01 +100024
25namespace ml {
26
27class MachineLearningServiceImpl
28 : public chromeos::machine_learning::mojom::MachineLearningService {
29 public:
Andrew Moylanb481af72020-07-09 15:22:00 +100030 // Creates an instance bound to `pipe`. The specified `disconnect_handler`
31 // will be invoked if the binding encounters a connection error or is closed.
Charles Zhaod4fb7b62020-08-25 17:21:58 +100032 // The `bus` is used to construct `dlcservice_client_` if it is not nullptr.
hschamd13deea2021-03-08 09:46:15 +090033 MachineLearningServiceImpl(
34 mojo::PendingReceiver<
35 chromeos::machine_learning::mojom::MachineLearningService> receiver,
36 base::Closure disconnect_handler,
37 dbus::Bus* bus = nullptr);
Jing Wang961b8af2020-10-26 12:40:35 +110038
Michael Martisa74af932018-08-13 16:52:36 +100039 protected:
40 // Testing constructor that allows overriding of the model dir. Should not be
41 // used outside of tests.
hschamd13deea2021-03-08 09:46:15 +090042 MachineLearningServiceImpl(
43 mojo::PendingReceiver<
44 chromeos::machine_learning::mojom::MachineLearningService> receiver,
45 base::Closure disconnect_handler,
46 const std::string& model_dir);
Qijiang Fan6bc59e12020-11-11 02:51:06 +090047 MachineLearningServiceImpl(const MachineLearningServiceImpl&) = delete;
48 MachineLearningServiceImpl& operator=(const MachineLearningServiceImpl&) =
49 delete;
Michael Martisa74af932018-08-13 16:52:36 +100050
Andrew Moylanff6be512018-07-03 11:05:01 +100051 private:
52 // chromeos::machine_learning::mojom::MachineLearningService:
Andrew Moylanb481af72020-07-09 15:22:00 +100053 void Clone(mojo::PendingReceiver<
54 chromeos::machine_learning::mojom::MachineLearningService>
55 receiver) override;
Honglin Yu0ed72352019-08-27 17:42:01 +100056 void LoadBuiltinModel(
57 chromeos::machine_learning::mojom::BuiltinModelSpecPtr spec,
Andrew Moylanb481af72020-07-09 15:22:00 +100058 mojo::PendingReceiver<chromeos::machine_learning::mojom::Model> receiver,
Qijiang Fan5d381a02020-04-19 23:42:37 +090059 LoadBuiltinModelCallback callback) override;
Honglin Yu0ed72352019-08-27 17:42:01 +100060 void LoadFlatBufferModel(
61 chromeos::machine_learning::mojom::FlatBufferModelSpecPtr spec,
Andrew Moylanb481af72020-07-09 15:22:00 +100062 mojo::PendingReceiver<chromeos::machine_learning::mojom::Model> receiver,
Qijiang Fan5d381a02020-04-19 23:42:37 +090063 LoadFlatBufferModelCallback callback) override;
Honglin Yuf33dce32019-12-05 15:10:39 +110064 void LoadTextClassifier(
Andrew Moylanb481af72020-07-09 15:22:00 +100065 mojo::PendingReceiver<chromeos::machine_learning::mojom::TextClassifier>
66 receiver,
Honglin Yuf33dce32019-12-05 15:10:39 +110067 LoadTextClassifierCallback callback) override;
Charles Zhao6d467e62020-08-31 10:02:03 +100068 void LoadHandwritingModel(
69 chromeos::machine_learning::mojom::HandwritingRecognizerSpecPtr spec,
70 mojo::PendingReceiver<
71 chromeos::machine_learning::mojom::HandwritingRecognizer> receiver,
72 LoadHandwritingModelCallback callback) override;
charleszhao05c5a4a2020-06-09 16:49:54 +100073 void LoadHandwritingModelWithSpec(
74 chromeos::machine_learning::mojom::HandwritingRecognizerSpecPtr spec,
Andrew Moylanb481af72020-07-09 15:22:00 +100075 mojo::PendingReceiver<
76 chromeos::machine_learning::mojom::HandwritingRecognizer> receiver,
Charles Zhaoc882eb02020-07-27 10:02:35 +100077 LoadHandwritingModelWithSpecCallback callback) override;
Honglin Yud2204272020-08-26 14:21:37 +100078 void LoadSpeechRecognizer(
79 chromeos::machine_learning::mojom::SodaConfigPtr spec,
80 mojo::PendingRemote<chromeos::machine_learning::mojom::SodaClient>
81 soda_client,
82 mojo::PendingReceiver<chromeos::machine_learning::mojom::SodaRecognizer>
83 soda_recognizer,
84 LoadSpeechRecognizerCallback callback) override;
Jing Wang961b8af2020-10-26 12:40:35 +110085 void LoadGrammarChecker(
86 mojo::PendingReceiver<chromeos::machine_learning::mojom::GrammarChecker>
87 receiver,
88 LoadGrammarCheckerCallback callback) override;
Curtis McMullanf11584f2021-01-13 12:21:36 +110089 void LoadTextSuggester(
90 mojo::PendingReceiver<chromeos::machine_learning::mojom::TextSuggester>
91 receiver,
92 LoadTextSuggesterCallback callback) override;
Honglin Yu0f5b21d2021-04-06 23:39:04 +100093 void LoadWebPlatformHandwritingModel(
94 chromeos::machine_learning::web_platform::mojom::
95 HandwritingModelConstraintPtr constraint,
96 mojo::PendingReceiver<chromeos::machine_learning::web_platform::mojom::
97 HandwritingRecognizer> receiver,
98 LoadWebPlatformHandwritingModelCallback callback) override;
charleszhao05c5a4a2020-06-09 16:49:54 +100099
Honglin Yu0ed72352019-08-27 17:42:01 +1000100 // Metadata required to load builtin models. Initialized at construction.
101 const std::map<chromeos::machine_learning::mojom::BuiltinModelId,
102 BuiltinModelMetadata>
103 builtin_model_metadata_;
104
Michael Martisa74af932018-08-13 16:52:36 +1000105 const std::string model_dir_;
Andrew Moylanff6be512018-07-03 11:05:01 +1000106
Charles Zhaod4fb7b62020-08-25 17:21:58 +1000107 // DlcserviceClient used to communicate with DlcService.
108 std::unique_ptr<DlcserviceClient> dlcservice_client_;
109
Andrew Moylanb481af72020-07-09 15:22:00 +1000110 // Primordial receiver bootstrapped over D-Bus. Once opened, is never closed.
111 mojo::Receiver<chromeos::machine_learning::mojom::MachineLearningService>
112 receiver_;
Andrew Moylanff6be512018-07-03 11:05:01 +1000113
Andrew Moylanb481af72020-07-09 15:22:00 +1000114 // Additional receivers bound via `Clone`.
115 mojo::ReceiverSet<chromeos::machine_learning::mojom::MachineLearningService>
116 clone_receivers_;
Honglin Yu7b6c1192020-09-16 10:07:17 +1000117
118 // Primordial remotes to the worker process.
119 // Can not use `mojo::RemoteSet` in Chrome OS for the moment.
120 std::vector<
121 mojo::Remote<chromeos::machine_learning::mojom::MachineLearningService>>
122 worker_remotes_;
123
124 // Holds the platform channels used in bootstrapping mojo connection
125 // between the manager and worker processes.
126 std::vector<mojo::PlatformChannel> internal_channels;
Andrew Moylanff6be512018-07-03 11:05:01 +1000127};
128
129} // namespace ml
130
131#endif // ML_MACHINE_LEARNING_SERVICE_IMPL_H_