@@ -250,12 +250,96 @@ FFvariant ffSettingsGetXFConf(const char* channelName, const char* propertyName,
250
250
251
251
return FF_VARIANT_NULL ;
252
252
}
253
+
254
+ #define FF_DBUS_ITER_CONTINUE (dbus , iterator ) \
255
+ { \
256
+ if(!(dbus).lib->ffdbus_message_iter_next(iterator)) \
257
+ break; \
258
+ continue; \
259
+ }
260
+
261
+ FFvariant ffSettingsGetXFConfFirstMatch (const char * channelName , const char * propertyPrefix , FFvarianttype type , void * data , FFTestXfconfPropCallback * cb )
262
+ {
263
+ FFDBusData dbus ;
264
+ if (ffDBusLoadData (DBUS_BUS_SESSION , & dbus ) != NULL )
265
+ return FF_VARIANT_NULL ;
266
+
267
+ DBusMessage * reply = ffDBusGetMethodReply (& dbus , "org.xfce.Xfconf" , "/org/xfce/Xfconf" , "org.xfce.Xfconf" , "GetAllProperties" , channelName , propertyPrefix );
268
+ if (!reply )
269
+ return FF_VARIANT_NULL ;
270
+
271
+ DBusMessageIter rootIterator ;
272
+ if (!dbus .lib -> ffdbus_message_iter_init (reply , & rootIterator ))
273
+ {
274
+ dbus .lib -> ffdbus_message_unref (reply );
275
+ return FF_VARIANT_NULL ;
276
+ }
277
+
278
+ DBusMessageIter arrayIterator ;
279
+ dbus .lib -> ffdbus_message_iter_recurse (& rootIterator , & arrayIterator );
280
+
281
+ while (true)
282
+ {
283
+ if (dbus .lib -> ffdbus_message_iter_get_arg_type (& arrayIterator ) != DBUS_TYPE_DICT_ENTRY )
284
+ FF_DBUS_ITER_CONTINUE (dbus , & arrayIterator )
285
+
286
+ DBusMessageIter dictIterator ;
287
+ dbus .lib -> ffdbus_message_iter_recurse (& arrayIterator , & dictIterator );
288
+
289
+ const char * key ;
290
+ dbus .lib -> ffdbus_message_iter_get_basic (& dictIterator , & key );
291
+
292
+ if (cb (data , key )) FF_DBUS_ITER_CONTINUE (dbus , & arrayIterator )
293
+ dbus .lib -> ffdbus_message_iter_next (& dictIterator );
294
+
295
+ if (type == FF_VARIANT_TYPE_INT )
296
+ {
297
+ int32_t value ;
298
+ if (ffDBusGetInt (& dbus , & dictIterator , & value ))
299
+ {
300
+ dbus .lib -> ffdbus_message_unref (reply );
301
+ return (FFvariant ) { .intValue = value };
302
+ }
303
+ return FF_VARIANT_NULL ;
304
+ }
305
+
306
+ if (type == FF_VARIANT_TYPE_STRING )
307
+ {
308
+ FFstrbuf value = ffStrbufCreate ();
309
+ if (ffDBusGetString (& dbus , & dictIterator , & value ))
310
+ {
311
+ dbus .lib -> ffdbus_message_unref (reply );
312
+ return (FFvariant ) { .strValue = value .chars }; // Leaks value.chars
313
+ }
314
+ return FF_VARIANT_NULL ;
315
+ }
316
+
317
+ if (type == FF_VARIANT_TYPE_BOOL )
318
+ {
319
+ bool value ;
320
+ if (ffDBusGetBool (& dbus , & dictIterator , & value ))
321
+ {
322
+ dbus .lib -> ffdbus_message_unref (reply );
323
+ return (FFvariant ) { .boolValue = value , .boolValueSet = true };
324
+ }
325
+ }
326
+
327
+ return FF_VARIANT_NULL ;
328
+ }
329
+
330
+ return FF_VARIANT_NULL ;
331
+ }
253
332
#else //FF_HAVE_DBUS
254
333
FFvariant ffSettingsGetXFConf (const char * channelName , const char * propertyName , FFvarianttype type )
255
334
{
256
335
FF_UNUSED (channelName , propertyName , type )
257
336
return FF_VARIANT_NULL ;
258
337
}
338
+ FFvariant ffSettingsGetXFConfFirstMatch (const char * channelName , const char * propertyPrefix , FFvarianttype type , void * data , FFTestXfconfPropCallback * cb )
339
+ {
340
+ FF_UNUSED (channelName , propertyPrefix , type , data , cb );
341
+ return FF_VARIANT_NULL ;
342
+ }
259
343
#endif //FF_HAVE_DBUS
260
344
261
345
#ifdef FF_HAVE_SQLITE3
0 commit comments