dbus-cxx
signature.h
Go to the documentation of this file.
1// SPDX-License-Identifier: LGPL-3.0-or-later OR BSD-3-Clause
2/***************************************************************************
3 * Copyright (C) 2009,2010 by Rick L. Vinyard, Jr. *
4 * rvinyard@cs.nmsu.edu *
5 * *
6 * This file is part of the dbus-cxx library. *
7 ***************************************************************************/
8#include <stdint.h>
9#include <dbus-cxx/path.h>
11#include <dbus-cxx/dbus-cxx-config.h>
12#include <any>
13#include <map>
14#include <memory>
15#include <ostream>
16#include <string>
17#include <vector>
18#include <stack>
19
20#include "enums.h"
21
22#ifndef DBUSCXX_SIGNATURE_H
23#define DBUSCXX_SIGNATURE_H
24
25#define DBUSCXX_TYPE_INVALID_AS_STRING "\0"
26#define DBUSCXX_TYPE_BYTE_AS_STRING "y"
27#define DBUSCXX_TYPE_BOOLEAN_AS_STRING "b"
28#define DBUSCXX_TYPE_INT16_AS_STRING "n"
29#define DBUSCXX_TYPE_UINT16_AS_STRING "q"
30#define DBUSCXX_TYPE_INT32_AS_STRING "i"
31#define DBUSCXX_TYPE_UINT32_AS_STRING "u"
32#define DBUSCXX_TYPE_INT64_AS_STRING "x"
33#define DBUSCXX_TYPE_UINT64_AS_STRING "t"
34#define DBUSCXX_TYPE_DOUBLE_AS_STRING "d"
35#define DBUSCXX_TYPE_STRING_AS_STRING "s"
36#define DBUSCXX_TYPE_SIGNATURE_AS_STRING "g"
37#define DBUSCXX_TYPE_OBJECT_PATH_AS_STRING "o"
38#define DBUSCXX_TYPE_VARIANT_AS_STRING "v"
39#define DBUSCXX_TYPE_UNIX_FD_AS_STRING "h"
40#define DBUSCXX_TYPE_ARRAY_AS_STRING "a"
41#define DBUSCXX_DICT_ENTRY_BEGIN_CHAR_AS_STRING "{"
42#define DBUSCXX_DICT_ENTRY_END_CHAR_AS_STRING "}"
43#define DBUSCXX_STRUCT_BEGIN_CHAR_AS_STRING "("
44#define DBUSCXX_STRUCT_END_CHAR_AS_STRING ")"
45
46namespace DBus {
47
48namespace priv {
53public:
54 typedef std::shared_ptr<SignatureNode> SignatureNodePointer;
55
57 m_dataType(data_type),
58 m_next(),
59 m_sub(){}
60
64};
65
66}
67
68class FileDescriptor;
69class Variant;
70template<typename... T> class MultipleReturn;
71
78class Signature {
79public:
81
83
84 typedef std::string::size_type size_type;
85
87
88 Signature();
89
90 Signature( const std::string& s, size_type pos = 0, size_type n = npos );
91
92 Signature( const char* );
93
94 Signature( const char* s, size_type n );
95
96 Signature( size_type n, char c );
97
98 // template<class InputIterator>
99 // Signature( InputIterator first, InputIterator last ): m_signature( first, last ) { }
100
101 ~Signature();
102
103 operator const std::string& () const;
104
105 const std::string& str() const;
106
107 Signature& operator=( const std::string& s );
108
109 Signature& operator=( const char* s );
110
111 bool operator==( const std::string& s ) const { return str() == s; }
112
113 iterator begin();
114
115 const_iterator begin() const;
116
117 iterator end();
118
119 const_iterator end() const;
120
122 bool is_valid() const;
123
125 bool is_singleton() const;
126
132 void print_tree( std::ostream* stream ) const;
133
134private:
135 void initialize();
136
138
140 std::string::const_iterator& itr,
141 std::stack<ContainerType>* container_stack,
142 bool& ok);
143
144 void print_node(
145 std::ostream* stream,
147 int spaces) const;
148
149private:
150 class priv_data;
151
152
153 std::shared_ptr<priv_data> m_priv;
154};
155
156template <typename... T>
157inline std::string signature( const std::tuple<T...>& );
158
159inline std::string signature( uint8_t ) { return DBUSCXX_TYPE_BYTE_AS_STRING; }
160inline std::string signature( bool ) { return DBUSCXX_TYPE_BOOLEAN_AS_STRING; }
161inline std::string signature( int16_t ) { return DBUSCXX_TYPE_INT16_AS_STRING; }
162inline std::string signature( uint16_t ) { return DBUSCXX_TYPE_UINT16_AS_STRING; }
163inline std::string signature( int32_t ) { return DBUSCXX_TYPE_INT32_AS_STRING; }
164inline std::string signature( uint32_t ) { return DBUSCXX_TYPE_UINT32_AS_STRING; }
165inline std::string signature( int64_t ) { return DBUSCXX_TYPE_INT64_AS_STRING; }
166inline std::string signature( uint64_t ) { return DBUSCXX_TYPE_UINT64_AS_STRING; }
167inline std::string signature( double ) { return DBUSCXX_TYPE_DOUBLE_AS_STRING; }
168inline std::string signature( std::string ) { return DBUSCXX_TYPE_STRING_AS_STRING; }
169inline std::string signature( Signature ) { return DBUSCXX_TYPE_SIGNATURE_AS_STRING; }
170inline std::string signature( Path ) { return DBUSCXX_TYPE_OBJECT_PATH_AS_STRING; }
171inline std::string signature( const DBus::Variant& ) { return DBUSCXX_TYPE_VARIANT_AS_STRING; }
172inline std::string signature( const std::shared_ptr<FileDescriptor> ) { return DBUSCXX_TYPE_UNIX_FD_AS_STRING; }
173template<typename... T>
175
176
177template <typename T> inline std::string signature( const std::vector<T>& ) { T t {}; return DBUSCXX_TYPE_ARRAY_AS_STRING + signature( t ); }
178
179template <typename Key, typename Data> inline std::string signature( const std::map<Key, Data>& ) {
180 Key k {}; Data d {};
181 std::string sig;
184 signature( k ) + signature( d ) +
186 return sig;
187}
188
189//Note: we need to have two different signature() methods for dictionaries; this is because
190//when introspecting, we need to use the normal signature() so that it comes up properly.
191//However, when we are sending out data, that signature would give us an extra array signature,
192//which is not good. Hence, this method is only used when we need to send out a dict
193template <typename Key, typename Data> inline std::string signature_dict_data( const std::map<Key, Data>& ) {
194 Key k {}; Data d {};
195 std::string sig;
197 signature( k ) + signature( d ) +
199 return sig;
200}
201
202template<typename... T_arg>
204
205namespace priv {
206/*
207 * dbus_signature class - signature of a given type
208 */
209template<typename... argn>
211
212template<> class dbus_signature<> {
213public:
214 std::string dbus_sig() const {
215 return "";
216 }
217};
218
219template<typename arg1, typename... argn>
220class dbus_signature<arg1, argn...> : public dbus_signature<argn...> {
221public:
222 std::string dbus_sig() const {
223 arg1 arg {};
225 }
226};
227
228} /* namespace priv */
229
230template<typename... T_arg>
231inline std::string signature( const std::tuple<T_arg...>& ) {
232 priv::dbus_signature<T_arg...> sig;
233
235 sig.dbus_sig() +
237}
238
239template<typename... T_arg>
241 priv::dbus_signature<T_arg...> sig;
242
243 return sig.dbus_sig();
244}
245
246inline
247std::ostream& operator<<( std::ostream& sout, const DBus::Signature& sig ) {
248 sout << "DBus::Signature[" << sig.str() << "]";
249 return sout;
250}
251
252}
253
254#endif
A FileDescriptor holds a UNIX file descriptor that can be passed between processes.
Definition: filedescriptor.h:21
Definition: multiplereturn.h:29
Represents a DBus Path.
Definition: path.h:21
A SignatureIterator allows you to iterate over a given DBus signature, and to extract useful informat...
Definition: signatureiterator.h:33
Represents a DBus signature.
Definition: signature.h:78
SignatureIterator iterator
Definition: signature.h:80
void print_tree(std::ostream *stream) const
Print the signature tree to the given ostream.
Definition: signature.cpp:260
const std::string & str() const
Definition: signature.cpp:71
iterator end()
Definition: signature.cpp:97
std::shared_ptr< priv_data > m_priv
Definition: signature.h:153
bool is_singleton() const
True if the signature is a valid DBus signature and contains exactly one complete type.
Definition: signature.cpp:109
void print_node(std::ostream *stream, priv::SignatureNode *node, int spaces) const
Definition: signature.cpp:275
~Signature()
Definition: signature.cpp:64
void initialize()
Definition: signature.cpp:288
const SignatureIterator const_iterator
Definition: signature.h:82
SignatureNodePointer create_signature_tree(std::string::const_iterator &itr, std::stack< ContainerType > *container_stack, bool &ok)
Definition: signature.cpp:116
bool is_valid() const
True if the signature is a valid DBus signature.
Definition: signature.cpp:105
Signature & operator=(const std::string &s)
Definition: signature.cpp:75
bool operator==(const std::string &s) const
Definition: signature.h:111
Signature()
Definition: signature.cpp:36
std::string::size_type size_type
Definition: signature.h:84
priv::SignatureNode::SignatureNodePointer SignatureNodePointer
Definition: signature.h:137
iterator begin()
Definition: signature.cpp:85
static const size_type npos
Definition: signature.h:86
A Variant is a type-safe union for DBus operations.
Definition: variant.h:42
Represents a single entry in our graph of the signature.
Definition: signature.h:52
std::shared_ptr< SignatureNode > SignatureNodePointer
Definition: signature.h:54
DataType m_dataType
Definition: signature.h:61
SignatureNode(DataType data_type)
Definition: signature.h:56
SignatureNodePointer m_next
Definition: signature.h:62
SignatureNodePointer m_sub
Definition: signature.h:63
std::string dbus_sig() const
Definition: signature.h:222
std::string dbus_sig() const
Definition: signature.h:214
Definition: signature.h:210
Global DBus namespace, where everything happens.
Definition: callmessage.cpp:18
std::string signature_multiple_return_data(const DBus::MultipleReturn< T_arg... > &)
Definition: signature.h:240
std::string signature_dict_data(const std::map< Key, Data > &)
Definition: signature.h:193
std::shared_ptr< DBus::Connection > operator<<(std::shared_ptr< DBus::Connection > ptr, std::shared_ptr< DBus::Message > msg)
Definition: connection.h:449
const Signature::size_type npos
Definition: signature.cpp:22
DataType
Definition: enums.h:52
std::string signature(const std::tuple< T... > &)
#define DBUSCXX_TYPE_DOUBLE_AS_STRING
Definition: signature.h:34
#define DBUSCXX_STRUCT_END_CHAR_AS_STRING
Definition: signature.h:44
#define DBUSCXX_STRUCT_BEGIN_CHAR_AS_STRING
Definition: signature.h:43
#define DBUSCXX_TYPE_INVALID_AS_STRING
Definition: signature.h:25
#define DBUSCXX_TYPE_INT16_AS_STRING
Definition: signature.h:28
#define DBUSCXX_TYPE_BYTE_AS_STRING
Definition: signature.h:26
#define DBUSCXX_TYPE_INT32_AS_STRING
Definition: signature.h:30
#define DBUSCXX_TYPE_ARRAY_AS_STRING
Definition: signature.h:40
#define DBUSCXX_TYPE_SIGNATURE_AS_STRING
Definition: signature.h:36
#define DBUSCXX_TYPE_VARIANT_AS_STRING
Definition: signature.h:38
#define DBUSCXX_TYPE_BOOLEAN_AS_STRING
Definition: signature.h:27
#define DBUSCXX_TYPE_STRING_AS_STRING
Definition: signature.h:35
#define DBUSCXX_DICT_ENTRY_END_CHAR_AS_STRING
Definition: signature.h:42
#define DBUSCXX_TYPE_UINT64_AS_STRING
Definition: signature.h:33
#define DBUSCXX_TYPE_UINT16_AS_STRING
Definition: signature.h:29
#define DBUSCXX_TYPE_OBJECT_PATH_AS_STRING
Definition: signature.h:37
#define DBUSCXX_DICT_ENTRY_BEGIN_CHAR_AS_STRING
Definition: signature.h:41
#define DBUSCXX_TYPE_UNIX_FD_AS_STRING
Definition: signature.h:39
#define DBUSCXX_TYPE_INT64_AS_STRING
Definition: signature.h:32
#define DBUSCXX_TYPE_UINT32_AS_STRING
Definition: signature.h:31