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 ObjectVTableMethod::ObjectVTableMethod(ObjectVTableBase *vtable,
18  const std::string &name,
19  const std::string &signature,
20  const std::string &ret,
21  ObjectMethod handler)
22  : d_ptr(std::make_unique<ObjectVTableMethodPrivate>(
23  vtable, name, signature, ret, std::move(handler))) {
24  vtable->addMethod(this);
25 }
26 
27 ObjectVTableMethod::~ObjectVTableMethod() {}
28 
29 FCITX_DEFINE_READ_ONLY_PROPERTY_PRIVATE(ObjectVTableMethod, std::string, name);
30 FCITX_DEFINE_READ_ONLY_PROPERTY_PRIVATE(ObjectVTableMethod, std::string,
31  signature);
32 FCITX_DEFINE_READ_ONLY_PROPERTY_PRIVATE(ObjectVTableMethod, std::string, ret);
33 FCITX_DEFINE_READ_ONLY_PROPERTY_PRIVATE(ObjectVTableMethod, ObjectVTableBase *,
34  vtable);
35 
36 const ObjectMethod &ObjectVTableMethod::handler() const {
37  FCITX_D();
38  if (d->closureHandler_) {
39  return d->closureHandler_;
40  }
41  return d->internalHandler_;
42 }
43 
44 void ObjectVTableMethod::setClosureFunction(ObjectMethodClosure closure) {
45  FCITX_D();
46  if (!closure) {
47  return;
48  }
49 
50  d->closureHandler_ = [d, closure = std::move(closure)](Message message) {
51  return closure(std::move(message), d->internalHandler_);
52  };
53 }
54 
55 ObjectVTableSignal::ObjectVTableSignal(ObjectVTableBase *vtable,
56  std::string name, std::string signature)
57  : d_ptr(std::make_unique<ObjectVTableSignalPrivate>(vtable, std::move(name),
58  std::move(signature))) {
59  vtable->addSignal(this);
60 }
61 
62 ObjectVTableSignal::~ObjectVTableSignal() {}
63 
64 Message ObjectVTableSignal::createSignal() {
65  FCITX_D();
66  return d->vtable_->bus()->createSignal(d->vtable_->path().c_str(),
67  d->vtable_->interface().c_str(),
68  d->name_.c_str());
69 }
70 
71 FCITX_DEFINE_READ_ONLY_PROPERTY_PRIVATE(ObjectVTableSignal, std::string, name);
72 FCITX_DEFINE_READ_ONLY_PROPERTY_PRIVATE(ObjectVTableSignal, std::string,
73  signature);
74 
75 ObjectVTableProperty::ObjectVTableProperty(ObjectVTableBase *vtable,
76  std::string name,
77  std::string signature,
78  PropertyGetMethod getMethod,
79  PropertyOptions options)
80  : d_ptr(std::make_unique<ObjectVTablePropertyPrivate>(
81  std::move(name), std::move(signature), std::move(getMethod),
82  options)) {
83  vtable->addProperty(this);
84 }
85 
86 ObjectVTableProperty::ObjectVTableProperty(
87  std::unique_ptr<ObjectVTablePropertyPrivate> d)
88  : d_ptr(std::move(d)) {}
89 
90 ObjectVTableProperty::~ObjectVTableProperty() {}
91 
92 FCITX_DEFINE_READ_ONLY_PROPERTY_PRIVATE(ObjectVTableProperty, std::string,
93  name);
94 FCITX_DEFINE_READ_ONLY_PROPERTY_PRIVATE(ObjectVTableProperty, std::string,
95  signature);
96 FCITX_DEFINE_READ_ONLY_PROPERTY_PRIVATE(ObjectVTableProperty, PropertyGetMethod,
97  getMethod);
98 FCITX_DEFINE_READ_ONLY_PROPERTY_PRIVATE(ObjectVTableProperty, bool, writable);
99 FCITX_DEFINE_READ_ONLY_PROPERTY_PRIVATE(ObjectVTableProperty, PropertyOptions,
100  options);
101 
102 ObjectVTableWritableProperty::ObjectVTableWritableProperty(
103  ObjectVTableBase *vtable, std::string name, std::string signature,
104  PropertyGetMethod getMethod, PropertySetMethod setMethod,
105  PropertyOptions options)
107  std::make_unique<ObjectVTableWritablePropertyPrivate>(
108  std::move(name), std::move(signature), std::move(getMethod),
109  std::move(setMethod), options)) {
110  vtable->addProperty(this);
111 }
112 
113 FCITX_DEFINE_READ_ONLY_PROPERTY_PRIVATE(ObjectVTableWritableProperty,
114  PropertySetMethod, setMethod);
115 
116 } // 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:260
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:287
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:232