@@ -33,10 +33,16 @@ static SDL_DBusContext dbus;
33
33
34
34
static int LoadDBUSSyms (void )
35
35
{
36
+ #define SDL_DBUS_SYM2_OPTIONAL (TYPE , x , y ) \
37
+ dbus.x = (TYPE)SDL_LoadFunction(dbus_handle, #y)
38
+
36
39
#define SDL_DBUS_SYM2 (TYPE , x , y ) \
37
40
if (!(dbus.x = (TYPE)SDL_LoadFunction(dbus_handle, #y))) \
38
41
return -1
39
42
43
+ #define SDL_DBUS_SYM_OPTIONAL (TYPE , x ) \
44
+ SDL_DBUS_SYM2_OPTIONAL(TYPE, x, dbus_##x)
45
+
40
46
#define SDL_DBUS_SYM (TYPE , x ) \
41
47
SDL_DBUS_SYM2(TYPE, x, dbus_##x)
42
48
@@ -77,6 +83,7 @@ static int LoadDBUSSyms(void)
77
83
SDL_DBUS_SYM (dbus_bool_t (* )(const DBusError * ), error_is_set );
78
84
SDL_DBUS_SYM (void (* )(DBusError * ), error_free );
79
85
SDL_DBUS_SYM (char * (* )(void ), get_local_machine_id );
86
+ SDL_DBUS_SYM_OPTIONAL (char * (* )(DBusError * ), try_get_local_machine_id );
80
87
SDL_DBUS_SYM (void (* )(void * ), free );
81
88
SDL_DBUS_SYM (void (* )(char * * ), free_string_array );
82
89
SDL_DBUS_SYM (void (* )(void ), shutdown );
@@ -360,31 +367,41 @@ void SDL_DBus_ScreensaverTickle(void)
360
367
}
361
368
}
362
369
363
- static SDL_bool SDL_DBus_AppendDictWithKeyValue (DBusMessageIter * iterInit , const char * key , const char * value )
370
+ static SDL_bool SDL_DBus_AppendDictWithKeysValues (DBusMessageIter * iterInit , const char * * keys , const char * * values , int count )
364
371
{
365
- DBusMessageIter iterDict , iterEntry , iterValue ;
372
+ DBusMessageIter iterDict ;
366
373
367
374
if (!dbus .message_iter_open_container (iterInit , DBUS_TYPE_ARRAY , "{sv}" , & iterDict )) {
368
375
goto failed ;
369
376
}
370
377
371
- if (!dbus .message_iter_open_container (& iterDict , DBUS_TYPE_DICT_ENTRY , NULL , & iterEntry )) {
372
- goto failed ;
373
- }
378
+ for (int i = 0 ; i < count ; i ++ ) {
379
+ DBusMessageIter iterEntry , iterValue ;
380
+ const char * key = keys [i ];
381
+ const char * value = values [i ];
374
382
375
- if (!dbus .message_iter_append_basic ( & iterEntry , DBUS_TYPE_STRING , & key )) {
376
- goto failed ;
377
- }
383
+ if (!dbus .message_iter_open_container ( & iterDict , DBUS_TYPE_DICT_ENTRY , NULL , & iterEntry )) {
384
+ goto failed ;
385
+ }
378
386
379
- if (!dbus .message_iter_open_container (& iterEntry , DBUS_TYPE_VARIANT , DBUS_TYPE_STRING_AS_STRING , & iterValue )) {
380
- goto failed ;
381
- }
387
+ if (!dbus .message_iter_append_basic (& iterEntry , DBUS_TYPE_STRING , & key )) {
388
+ goto failed ;
389
+ }
382
390
383
- if (!dbus .message_iter_append_basic (& iterValue , DBUS_TYPE_STRING , & value )) {
384
- goto failed ;
391
+ if (!dbus .message_iter_open_container (& iterEntry , DBUS_TYPE_VARIANT , DBUS_TYPE_STRING_AS_STRING , & iterValue )) {
392
+ goto failed ;
393
+ }
394
+
395
+ if (!dbus .message_iter_append_basic (& iterValue , DBUS_TYPE_STRING , & value )) {
396
+ goto failed ;
397
+ }
398
+
399
+ if (!dbus .message_iter_close_container (& iterEntry , & iterValue ) || !dbus .message_iter_close_container (& iterDict , & iterEntry )) {
400
+ goto failed ;
401
+ }
385
402
}
386
403
387
- if (!dbus .message_iter_close_container (& iterEntry , & iterValue ) || ! dbus . message_iter_close_container ( & iterDict , & iterEntry ) || ! dbus . message_iter_close_container ( iterInit , & iterDict )) {
404
+ if (!dbus .message_iter_close_container (iterInit , & iterDict )) {
388
405
goto failed ;
389
406
}
390
407
@@ -440,9 +457,17 @@ SDL_bool SDL_DBus_ScreensaverInhibit(SDL_bool inhibit)
440
457
}
441
458
442
459
dbus .message_iter_init_append (msg , & iterInit );
443
- if (!SDL_DBus_AppendDictWithKeyValue (& iterInit , key , reason )) {
444
- dbus .message_unref (msg );
445
- return SDL_FALSE ;
460
+
461
+ /* a{sv} */
462
+ {
463
+ const char * keys [1 ];
464
+ const char * values [1 ];
465
+ keys [0 ] = key ;
466
+ values [0 ] = reason ;
467
+ if (!SDL_DBus_AppendDictWithKeysValues (& iterInit , keys , values , 1 )) {
468
+ dbus .message_unref (msg );
469
+ return SDL_FALSE ;
470
+ }
446
471
}
447
472
448
473
if (SDL_DBus_CallWithBasicReply (dbus .session_conn , msg , DBUS_TYPE_OBJECT_PATH , & reply )) {
@@ -726,4 +751,38 @@ void SDL_DBus_PumpEvents(void)
726
751
}
727
752
}
728
753
}
754
+
755
+ /*
756
+ * Get the machine ID if possible. Result must be freed with dbus->free().
757
+ */
758
+ char * SDL_DBus_GetLocalMachineId (void )
759
+ {
760
+ DBusError err ;
761
+ char * result ;
762
+
763
+ dbus .error_init (& err );
764
+
765
+ if (dbus .try_get_local_machine_id ) {
766
+ /* Available since dbus 1.12.0, has proper error-handling */
767
+ result = dbus .try_get_local_machine_id (& err );
768
+ } else {
769
+ /* Available since time immemorial, but has no error-handling:
770
+ * if the machine ID can't be read, many versions of libdbus will
771
+ * treat that as a fatal mis-installation and abort() */
772
+ result = dbus .get_local_machine_id ();
773
+ }
774
+
775
+ if (result ) {
776
+ return result ;
777
+ }
778
+
779
+ if (dbus .error_is_set (& err )) {
780
+ SDL_SetError ("%s: %s" , err .name , err .message );
781
+ dbus .error_free (& err );
782
+ } else {
783
+ SDL_SetError ("Error getting D-Bus machine ID" );
784
+ }
785
+
786
+ return NULL ;
787
+ }
729
788
#endif
0 commit comments