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