dbus-cxx
variant.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) 2020 by Robert Middleton *
4 * robert.middleton@rm5248.com *
5 * *
6 * This file is part of the dbus-cxx library. *
7 ***************************************************************************/
8#ifndef DBUSCXX_VARIANT_H
9#define DBUSCXX_VARIANT_H
10
11#include <dbus-cxx/enums.h>
12#include <dbus-cxx/path.h>
13#include <dbus-cxx/signature.h>
14#include <dbus-cxx/dbus-cxx-config.h>
17#include <dbus-cxx/marshaling.h>
18#include <dbus-cxx/types.h>
19#include <dbus-cxx/error.h>
20#include <string>
21#include <any>
22#include <stdint.h>
23#include <ostream>
24#include <vector>
25#include <map>
26#include <tuple>
27
28namespace DBus {
29
30class MessageIterator;
31class FileDescriptor;
32
42class Variant {
43public:
44 Variant();
45 Variant( uint8_t byte );
46 Variant( bool b );
47 Variant( int16_t i );
48 Variant( uint16_t i );
49 Variant( int32_t i );
50 Variant( uint32_t i );
51 Variant( int64_t i );
52 Variant( uint64_t i );
53 Variant( double i );
54 Variant( const char* cstr );
55 Variant( std::string str );
56 explicit Variant( Signature sig );
57 explicit Variant( Path path );
58
59 template<typename T>
60 Variant( const std::vector<T>& vec ) :
62 m_signature( DBus::signature( vec ) ),
63 m_dataAlignment( 4 ) {
65
66 it << vec;
67 }
68
69 template<typename Key, typename Value>
70 Variant( const std::map<Key, Value>& map ) :
72 m_signature( DBus::signature( map ) ),
73 m_dataAlignment( 4 ) {
75
76 it << map;
77 }
78
79 template<typename ...T>
80 Variant( const std::tuple<T...>& tup ) :
82 m_signature( DBus::signature( tup ) ),
83 m_dataAlignment( 8 ) {
85 it << tup;
86 }
87
88 Variant( const Variant& other );
89 Variant( Variant&& other );
90 ~Variant();
91
92 Signature signature() const;
93
94 DataType type() const;
95
96 const std::vector<uint8_t>* marshaled() const;
97
98 int data_alignment() const;
99
100 bool operator==( const Variant& other ) const;
101
102 Variant& operator=( const Variant& other );
103
104 template <typename T>
105 std::vector<T> to_vector() {
107 throw ErrorBadVariantCast();
108 }
109 priv::VariantIterator vi( this );
110
111 std::vector<T> retval = vi;
112
113 return retval;
114 }
115
116 template <typename Key, typename Value>
117 std::map<Key, Value> to_map() {
119 throw ErrorBadVariantCast();
120 }
121 priv::VariantIterator vi( this );
122
123 std::map<Key, Value> retval = vi;
124
125 return retval;
126 }
127
128 template <typename ...T>
129 std::tuple<T...> to_tuple() {
131 throw ErrorBadVariantCast();
132 }
133 std::tuple<T...> tup;
134 priv::VariantIterator vi( this );
135
136 tup = vi;
137
138 return tup;
139 }
140
141 bool to_bool() const;
142 uint8_t to_uint8() const;
143 uint16_t to_uint16() const;
144 int16_t to_int16() const;
145 uint32_t to_uint32() const;
146 int32_t to_int32() const;
147 uint64_t to_uint64() const;
148 int64_t to_int64() const;
149 double to_double() const;
150 std::string to_string() const;
151 DBus::Path to_path() const;
153 Variant to_variant() const;
154
155 operator bool();
156 operator uint8_t();
157 operator uint16_t();
158 operator int16_t();
159 operator uint32_t();
160 operator int32_t();
161 operator uint64_t();
162 operator int64_t();
163 operator double();
164 operator std::string();
165 operator DBus::Path();
166 operator DBus::Signature();
167
168 template <typename T>
169 operator std::vector<T>() {
170 return to_vector<T>();
171 }
172
173 template <typename Key, typename Data>
174 operator std::map<Key, Data>() {
175 return to_map<Key, Data>();
176 }
177
178 template <typename... T>
179 operator std::tuple<T...>() {
180 return to_tuple<T...>();
181 }
182
186 [[deprecated]]
188
189 static Variant createFromDemarshal( Signature sig, std::shared_ptr<Demarshaling> demarshal, const std::vector<int>& filedescriptors, uint32_t depth );
190
196 static Variant createFromVariant( Variant& other );
197
198private:
199 void recurseArray( SignatureIterator iter, std::shared_ptr<Demarshaling> demarshal, Marshaling* marshal, const std::vector<int>& filedescriptors, uint32_t depth );
200 void recurseDictEntry( SignatureIterator iter, std::shared_ptr<Demarshaling> demarshal, Marshaling* marshal, uint32_t ending_offset, const std::vector<int>& filedescriptors, uint32_t depth );
201 void recurseStruct( SignatureIterator sigit, std::shared_ptr<Demarshaling> demarshal, Marshaling* marshal, const std::vector<int>& filedescriptors, uint32_t depth );
202 void remarshal(DataType dt, SignatureIterator sigit, std::shared_ptr<Demarshaling> demarshal, Marshaling* marshal, const std::vector<int>& filedescriptors, uint32_t depth);
203
207 [[deprecated]]
208 void recurseArray( MessageIterator iter, Marshaling* marshal );
212 [[deprecated]]
213 void recurseDictEntry( MessageIterator iter, Marshaling* marshal );
217 [[deprecated]]
218 void recurseStruct( MessageIterator iter, Marshaling* marshal );
219
220private:
223 std::vector<uint8_t> m_marshaled;
225
226 friend std::ostream& operator<<( std::ostream& os, const Variant& var );
229};
230
231} /* namespace DBus */
232
233#endif /* DBUSCXX_VARIANT_H */
Definition: error.h:439
Implements the marshaling algorithms on a given vector of data.
Definition: marshaling.h:27
Extraction iterator allowing values to be retrieved from a message.
Definition: messageiterator.h:56
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
A Variant is a type-safe union for DBus operations.
Definition: variant.h:42
std::map< Key, Value > to_map()
Definition: variant.h:117
int data_alignment() const
Definition: variant.cpp:463
int16_t to_int16() const
Definition: variant.cpp:514
uint8_t to_uint8() const
Definition: variant.cpp:496
friend std::ostream & operator<<(std::ostream &os, const Variant &var)
Definition: variant.cpp:654
Variant(const std::map< Key, Value > &map)
Definition: variant.h:70
bool to_bool() const
Definition: variant.cpp:487
static Variant createFromVariant(Variant &other)
Wrap variant 'other' inside of a new variant.
Definition: variant.cpp:734
DBus::Signature to_signature() const
Definition: variant.cpp:586
std::vector< T > to_vector()
Definition: variant.h:105
Variant to_variant() const
Definition: variant.cpp:595
DataType m_currentType
Definition: variant.h:221
static Variant createFromDemarshal(Signature sig, std::shared_ptr< Demarshaling > demarshal, const std::vector< int > &filedescriptors, uint32_t depth)
Definition: variant.cpp:155
static Variant createFromMessage(MessageIterator iter)
Obsolete, do not call.
Definition: variant.cpp:320
int32_t to_int32() const
Definition: variant.cpp:532
std::tuple< T... > to_tuple()
Definition: variant.h:129
int m_dataAlignment
Definition: variant.h:224
double to_double() const
Definition: variant.cpp:559
std::vector< uint8_t > m_marshaled
Definition: variant.h:223
void recurseDictEntry(SignatureIterator iter, std::shared_ptr< Demarshaling > demarshal, Marshaling *marshal, uint32_t ending_offset, const std::vector< int > &filedescriptors, uint32_t depth)
Definition: variant.cpp:292
int64_t to_int64() const
Definition: variant.cpp:550
uint16_t to_uint16() const
Definition: variant.cpp:505
std::string to_string() const
Definition: variant.cpp:568
uint32_t to_uint32() const
Definition: variant.cpp:523
void recurseArray(SignatureIterator iter, std::shared_ptr< Demarshaling > demarshal, Marshaling *marshal, const std::vector< int > &filedescriptors, uint32_t depth)
Definition: variant.cpp:261
const std::vector< uint8_t > * marshaled() const
Definition: variant.cpp:459
void recurseStruct(SignatureIterator sigit, std::shared_ptr< Demarshaling > demarshal, Marshaling *marshal, const std::vector< int > &filedescriptors, uint32_t depth)
Definition: variant.cpp:330
Signature signature() const
Definition: variant.cpp:147
Variant(const std::tuple< T... > &tup)
Definition: variant.h:80
void remarshal(DataType dt, SignatureIterator sigit, std::shared_ptr< Demarshaling > demarshal, Marshaling *marshal, const std::vector< int > &filedescriptors, uint32_t depth)
Definition: variant.cpp:349
Variant(const std::vector< T > &vec)
Definition: variant.h:60
Variant & operator=(const Variant &other)
Definition: variant.cpp:478
DBus::Path to_path() const
Definition: variant.cpp:577
DataType type() const
Definition: variant.cpp:151
bool operator==(const Variant &other) const
Definition: variant.cpp:467
uint64_t to_uint64() const
Definition: variant.cpp:541
Signature m_signature
Definition: variant.h:222
Variant()
Definition: variant.cpp:28
~Variant()
Definition: variant.cpp:145
Used to append a single, complete value to a Variant.
Definition: variantappenditerator.h:28
Definition: variantiterator.h:24
static int retval
Definition: glib-caller.cpp:7
Global DBus namespace, where everything happens.
Definition: callmessage.cpp:18
DataType
Definition: enums.h:52