| 256 | }; |
| 257 | |
| 258 | std::optional<Response> parseResponse( DBusMessage* msg ) |
| 259 | { |
| 260 | Response result; |
| 261 | |
| 262 | DBusMessageIter iter; |
| 263 | dbus_message_iter_init( msg, &iter ); |
| 264 | |
| 265 | if ( dbus_message_iter_get_arg_type( &iter ) != DBUS_TYPE_UINT32 ) |
| 266 | return {}; |
| 267 | dbus_message_iter_get_basic( &iter, &result.code ); |
| 268 | if ( result.code != Response::Succeeded ) |
| 269 | return result; |
| 270 | |
| 271 | dbus_message_iter_next( &iter ); |
| 272 | |
| 273 | if ( dbus_message_iter_get_arg_type( &iter ) != DBUS_TYPE_ARRAY ) |
| 274 | return {}; |
| 275 | DBusMessageIter dict; |
| 276 | dbus_message_iter_recurse( &iter, &dict ); |
| 277 | do |
| 278 | { |
| 279 | if ( dbus_message_iter_get_arg_type( &dict ) != DBUS_TYPE_DICT_ENTRY ) |
| 280 | return {}; |
| 281 | DBusMessageIter entry; |
| 282 | dbus_message_iter_recurse( &dict, &entry ); |
| 283 | |
| 284 | if ( dbus_message_iter_get_arg_type( &entry ) != DBUS_TYPE_STRING ) |
| 285 | return {}; |
| 286 | const char* key; |
| 287 | dbus_message_iter_get_basic( &entry, &key ); |
| 288 | |
| 289 | if ( !dbus_message_iter_next( &entry ) ) |
| 290 | break; |
| 291 | |
| 292 | if ( dbus_message_iter_get_arg_type( &entry ) != DBUS_TYPE_VARIANT ) |
| 293 | return {}; |
| 294 | DBusMessageIter varIter; |
| 295 | dbus_message_iter_recurse( &entry, &varIter ); |
| 296 | if ( strcmp( key, "uris" ) == 0 ) |
| 297 | { |
| 298 | if ( dbus_message_iter_get_arg_type( &varIter ) != DBUS_TYPE_ARRAY ) |
| 299 | return {}; |
| 300 | DBusMessageIter arrIter; |
| 301 | dbus_message_iter_recurse( &varIter, &arrIter ); |
| 302 | do |
| 303 | { |
| 304 | if ( dbus_message_iter_get_arg_type( &arrIter ) != DBUS_TYPE_STRING ) |
| 305 | return {}; |
| 306 | const char* uri; |
| 307 | dbus_message_iter_get_basic( &arrIter, &uri ); |
| 308 | result.uris.emplace_back( uri ); |
| 309 | } |
| 310 | while ( dbus_message_iter_next( &arrIter ) ); |
| 311 | } |
| 312 | else if ( strcmp( key, "current_filter" ) == 0 ) |
| 313 | { |
| 314 | if ( dbus_message_iter_get_arg_type( &varIter ) != DBUS_TYPE_STRUCT ) |
| 315 | return {}; |