Fcitx
objectvtable.cpp
1 /*
2  * SPDX-FileCopyrightText: 2016-2019 CSSlayer <wengxt@gmail.com>
3  *
4  * SPDX-License-Identifier: LGPL-2.1-or-later
5  *
6  */
7 #include "objectvtable.h"
8 #include <memory>
9 #include <string>
10 #include <utility>
11 #include "../macros.h"
12 #include "bus.h"
13 #include "objectvtable_p.h"
14 
15 namespace fcitx::dbus {
16 
17 MethodCallNoReply::MethodCallNoReply() = default;
18 
19 ObjectVTableMethod::ObjectVTableMethod(ObjectVTableBase *vtable,
20  const std::string &name,
21  const std::string &signature,
22  const std::string &ret,
23  ObjectMethod handler)
24  : d_ptr(std::make_unique<ObjectVTableMethodPrivate>(
25  vtable, name, signature, ret, std::move(handler))) {
26  vtable->addMethod(this);
27 }
28 
29 ObjectVTableMethod::~ObjectVTableMethod() {}
30 
31 FCITX_DEFINE_READ_ONLY_PROPERTY_PRIVATE(ObjectVTableMethod, std::string, name);
32 FCITX_DEFINE_READ_ONLY_PROPERTY_PRIVATE(ObjectVTableMethod, std::string,
33  signature);
34 FCITX_DEFINE_READ_ONLY_PROPERTY_PRIVATE(ObjectVTableMethod, std::string, ret);
35 FCITX_DEFINE_READ_ONLY_PROPERTY_PRIVATE(ObjectVTableMethod, ObjectVTableBase *,
36  vtable);
37 
38 const ObjectMethod &ObjectVTableMethod::handler() const {
39  FCITX_D();
40  if (d->closureHandler_) {
41  return d->closureHandler_;
42  }
43  return d->internalHandler_;
44 }
45 
46 void ObjectVTableMethod::setClosureFunction(ObjectMethodClosure closure) {
47  FCITX_D();
48  if (!closure) {
49  return;
50  }
51 
52  d->closureHandler_ = [d, closure = std::move(closure)](Message message) {
53  return closure(std::move(message), d->internalHandler_);
54  };
55 }
56 
57 ObjectVTableSignal::ObjectVTableSignal(ObjectVTableBase *vtable,
58  std::string name, std::string signature)
59  : d_ptr(std::make_unique<ObjectVTableSignalPrivate>(vtable, std::move(name),
60  std::move(signature))) {
61  vtable->addSignal(this);
62 }
63 
64 ObjectVTableSignal::~ObjectVTableSignal() {}
65 
66 Message ObjectVTableSignal::createSignal() {
67  FCITX_D();
68  return d->vtable_->bus()->createSignal(d->vtable_->path().c_str(),
69  d->vtable_->interface().c_str(),
70  d->name_.c_str());
71 }
72 
73 FCITX_DEFINE_READ_ONLY_PROPERTY_PRIVATE(ObjectVTableSignal, std::string, name);
74 FCITX_DEFINE_READ_ONLY_PROPERTY_PRIVATE(ObjectVTableSignal, std::string,
75  signature);
76 
77 ObjectVTableProperty::ObjectVTableProperty(ObjectVTableBase *vtable,
78  std::string name,
79  std::string signature,
80  PropertyGetMethod getMethod,
81  PropertyOptions options)
82  : d_ptr(std::make_unique<ObjectVTablePropertyPrivate>(
83  std::move(name), std::move(signature), std::move(getMethod),
84  options)) {
85  vtable->addProperty(this);
86 }
87 
88 ObjectVTableProperty::ObjectVTableProperty(
89  std::unique_ptr<ObjectVTablePropertyPrivate> d)
90  : d_ptr(std::move(d)) {}
91 
92 ObjectVTableProperty::~ObjectVTableProperty() {}
93 
94 FCITX_DEFINE_READ_ONLY_PROPERTY_PRIVATE(ObjectVTableProperty, std::string,
95  name);
96 FCITX_DEFINE_READ_ONLY_PROPERTY_PRIVATE(ObjectVTableProperty, std::string,
97  signature);
98 FCITX_DEFINE_READ_ONLY_PROPERTY_PRIVATE(ObjectVTableProperty, PropertyGetMethod,
99  getMethod);
100 FCITX_DEFINE_READ_ONLY_PROPERTY_PRIVATE(ObjectVTableProperty, bool, writable);
101 FCITX_DEFINE_READ_ONLY_PROPERTY_PRIVATE(ObjectVTableProperty, PropertyOptions,
102  options);
103 
104 ObjectVTableWritableProperty::ObjectVTableWritableProperty(
105  ObjectVTableBase *vtable, std::string name, std::string signature,
106  PropertyGetMethod getMethod, PropertySetMethod setMethod,
107  PropertyOptions options)
109  std::make_unique<ObjectVTableWritablePropertyPrivate>(
110  std::move(name), std::move(signature), std::move(getMethod),
111  std::move(setMethod), options)) {
112  vtable->addProperty(this);
113 }
114 
115 FCITX_DEFINE_READ_ONLY_PROPERTY_PRIVATE(ObjectVTableWritableProperty,
116  PropertySetMethod, setMethod);
117 
118 } // namespace fcitx::dbus
API for DBus bus.
Basic DBus type of a DBus message.
Definition: message.h:224
Register a DBus read-only property to current DBus VTable.
Definition: objectvtable.h:273
void setClosureFunction(ObjectMethodClosure closure)
Set a closure function to call the handler with in it.
Definition: matchrule.h:78
Register a DBus property to current DBus VTable.
Definition: objectvtable.h:300
High level API for dbus objects.
Class provides bit flag support for Enum.
Definition: flags.h:33
Register a DBus signal to current DBus VTable.
Definition: objectvtable.h:245