static DWORD WINAPI hal_thread( void *arg ) { DBusError error; DBusConnection *dbc; LibHalContext *ctx; int i, num; char **list; if (!(ctx = p_libhal_ctx_new())) return 1; p_dbus_error_init( &error ); if (!(dbc = p_dbus_bus_get( DBUS_BUS_SYSTEM, &error ))) { WINE_WARN( "failed to get system dbus connection: %s\n", error.message ); p_dbus_error_free( &error ); return 1; } p_libhal_ctx_set_dbus_connection( ctx, dbc ); p_libhal_ctx_set_device_added( ctx, new_device ); p_libhal_ctx_set_device_removed( ctx, removed_device ); p_libhal_ctx_set_device_property_modified( ctx, property_modified ); if (!p_libhal_ctx_init( ctx, &error )) { WINE_WARN( "HAL context init failed: %s\n", error.message ); p_dbus_error_free( &error ); return 1; } /* retrieve all existing devices */ if (!(list = p_libhal_get_all_devices( ctx, &num, &error ))) p_dbus_error_free( &error ); else { for (i = 0; i < num; i++) new_device( ctx, list[i] ); p_libhal_free_string_array( list ); } __TRY { while (p_dbus_connection_read_write_dispatch( dbc, -1 )) /* nothing */ ; } __EXCEPT( assert_fault ) { WINE_WARN( "dbus assertion failure, disabling HAL support\n" ); return 1; } __ENDTRY; p_libhal_ctx_shutdown( ctx, &error ); p_dbus_error_free( &error ); /* just in case */ p_dbus_connection_close( dbc ); p_libhal_ctx_free( ctx ); return 0; }
static DWORD WINAPI dbus_thread( void *arg ) { static const char udisks_match[] = "type='signal'," "interface='org.freedesktop.UDisks'," "sender='org.freedesktop.UDisks'"; DBusError error; p_dbus_error_init( &error ); if (!(connection = p_dbus_bus_get( DBUS_BUS_SYSTEM, &error ))) { WARN( "failed to get system dbus connection: %s\n", error.message ); p_dbus_error_free( &error ); return 1; } if (p_dbus_connection_add_filter( connection, udisks_filter, NULL, NULL )) p_dbus_bus_add_match( connection, udisks_match, &error ); if (!udisks_enumerate_devices()) { p_dbus_bus_remove_match( connection, udisks_match, &error ); p_dbus_connection_remove_filter( connection, udisks_filter, NULL ); #ifdef SONAME_LIBHAL if (!hal_enumerate_devices()) { p_dbus_connection_close( connection ); p_dbus_error_free( &error ); return 1; } #endif } __TRY { while (p_dbus_connection_read_write_dispatch( connection, -1 )) /* nothing */ ; } __EXCEPT( assert_fault ) { WARN( "dbus assertion failure, disabling support\n" ); return 1; } __ENDTRY; p_dbus_connection_close( connection ); return 0; }
static DWORD WINAPI dbus_thread( void *arg ) { static const char udisks_match[] = "type='signal'," "interface='org.freedesktop.UDisks'," "sender='org.freedesktop.UDisks'"; static const char udisks2_match_interfaces[] = "type='signal'," "interface='org.freedesktop.DBus.ObjectManager'," "path='/org/freedesktop/UDisks2'"; static const char udisks2_match_properties[] = "type='signal'," "interface='org.freedesktop.DBus.Properties'"; DBusError error; p_dbus_error_init( &error ); if (!(connection = p_dbus_bus_get( DBUS_BUS_SYSTEM, &error ))) { WARN( "failed to get system dbus connection: %s\n", error.message ); p_dbus_error_free( &error ); return 1; } /* first try UDisks2 */ p_dbus_connection_add_filter( connection, udisks_filter, NULL, NULL ); p_dbus_bus_add_match( connection, udisks2_match_interfaces, &error ); p_dbus_bus_add_match( connection, udisks2_match_properties, &error ); if (udisks2_add_devices( NULL )) goto found; p_dbus_bus_remove_match( connection, udisks2_match_interfaces, &error ); p_dbus_bus_remove_match( connection, udisks2_match_properties, &error ); /* then try UDisks */ p_dbus_bus_add_match( connection, udisks_match, &error ); if (udisks_enumerate_devices()) goto found; p_dbus_bus_remove_match( connection, udisks_match, &error ); p_dbus_connection_remove_filter( connection, udisks_filter, NULL ); /* then finally HAL */ #ifdef SONAME_LIBHAL if (!hal_enumerate_devices()) { p_dbus_error_free( &error ); return 1; } #endif found: __TRY { while (p_dbus_connection_read_write_dispatch( connection, -1 )) /* nothing */ ; } __EXCEPT( assert_fault ) { WARN( "dbus assertion failure, disabling support\n" ); return 1; } __ENDTRY; return 0; }