|
|
|
@ -49,36 +49,32 @@ |
|
|
|
/*****************************************************************************
|
|
|
|
* Local prototypes |
|
|
|
*****************************************************************************/ |
|
|
|
#ifdef HAVE_HAL_1 |
|
|
|
|
|
|
|
/* store relation between item id and udi for ejection */ |
|
|
|
struct udi_input_id_t |
|
|
|
{ |
|
|
|
char *psz_udi; |
|
|
|
input_item_t *p_item; |
|
|
|
}; |
|
|
|
#endif |
|
|
|
|
|
|
|
struct services_discovery_sys_t |
|
|
|
{ |
|
|
|
LibHalContext *p_ctx; |
|
|
|
#ifdef HAVE_HAL_1 |
|
|
|
DBusConnection *p_connection; |
|
|
|
int i_devices_number; |
|
|
|
struct udi_input_id_t **pp_devices; |
|
|
|
#endif |
|
|
|
}; |
|
|
|
static void Run ( services_discovery_t *p_intf ); |
|
|
|
|
|
|
|
static int Open ( vlc_object_t * ); |
|
|
|
static void Close( vlc_object_t * ); |
|
|
|
|
|
|
|
#ifdef HAVE_HAL_1 |
|
|
|
/* HAL callbacks */ |
|
|
|
void DeviceAdded( LibHalContext *p_ctx, const char *psz_udi ); |
|
|
|
void DeviceRemoved( LibHalContext *p_ctx, const char *psz_udi ); |
|
|
|
|
|
|
|
/* to retrieve p_sd in HAL callbacks */ |
|
|
|
services_discovery_t *p_sd_global; |
|
|
|
#endif |
|
|
|
|
|
|
|
/*****************************************************************************
|
|
|
|
* Module descriptor |
|
|
|
@ -105,19 +101,16 @@ static int Open( vlc_object_t *p_this ) |
|
|
|
if( !p_sys ) |
|
|
|
return VLC_ENOMEM; |
|
|
|
|
|
|
|
#ifdef HAVE_HAL_1 |
|
|
|
DBusError dbus_error; |
|
|
|
DBusConnection *p_connection; |
|
|
|
|
|
|
|
p_sd_global = p_sd; |
|
|
|
p_sys->i_devices_number = 0; |
|
|
|
p_sys->pp_devices = NULL; |
|
|
|
#endif |
|
|
|
|
|
|
|
p_sd->pf_run = Run; |
|
|
|
p_sd->p_sys = p_sys; |
|
|
|
|
|
|
|
#ifdef HAVE_HAL_1 |
|
|
|
dbus_error_init( &dbus_error ); |
|
|
|
|
|
|
|
p_sys->p_ctx = libhal_ctx_new(); |
|
|
|
@ -138,30 +131,21 @@ static int Open( vlc_object_t *p_this ) |
|
|
|
libhal_ctx_set_dbus_connection( p_sys->p_ctx, p_connection ); |
|
|
|
p_sys->p_connection = p_connection; |
|
|
|
if( !libhal_ctx_init( p_sys->p_ctx, &dbus_error ) ) |
|
|
|
#else |
|
|
|
if( !(p_sys->p_ctx = hal_initialize( NULL, FALSE ) ) ) |
|
|
|
#endif |
|
|
|
{ |
|
|
|
#ifdef HAVE_HAL_1 |
|
|
|
msg_Err( p_sd, "hal not available : %s", dbus_error.message ); |
|
|
|
dbus_error_free( &dbus_error ); |
|
|
|
#else |
|
|
|
msg_Err( p_sd, "hal not available" ); |
|
|
|
#endif |
|
|
|
free( p_sys ); |
|
|
|
return VLC_EGENERIC; |
|
|
|
} |
|
|
|
|
|
|
|
#ifdef HAVE_HAL_1 |
|
|
|
if( !libhal_ctx_set_device_added( p_sys->p_ctx, DeviceAdded ) || |
|
|
|
!libhal_ctx_set_device_removed( p_sys->p_ctx, DeviceRemoved ) ) |
|
|
|
{ |
|
|
|
msg_Err( p_sd, "unable to add callback" ); |
|
|
|
dbus_error_free( &dbus_error ); |
|
|
|
free( p_sys ); |
|
|
|
return VLC_EGENERIC; |
|
|
|
} |
|
|
|
#endif |
|
|
|
if( !libhal_ctx_set_device_added( p_sys->p_ctx, DeviceAdded ) || |
|
|
|
!libhal_ctx_set_device_removed( p_sys->p_ctx, DeviceRemoved ) ) |
|
|
|
{ |
|
|
|
msg_Err( p_sd, "unable to add callback" ); |
|
|
|
dbus_error_free( &dbus_error ); |
|
|
|
free( p_sys ); |
|
|
|
return VLC_EGENERIC; |
|
|
|
} |
|
|
|
|
|
|
|
services_discovery_SetLocalizedName( p_sd, _("Devices") ); |
|
|
|
|
|
|
|
@ -175,7 +159,7 @@ static void Close( vlc_object_t *p_this ) |
|
|
|
{ |
|
|
|
services_discovery_t *p_sd = ( services_discovery_t* )p_this; |
|
|
|
services_discovery_sys_t *p_sys = p_sd->p_sys; |
|
|
|
#ifdef HAVE_HAL_1 |
|
|
|
|
|
|
|
dbus_connection_unref( p_sys->p_connection ); |
|
|
|
struct udi_input_id_t *p_udi_entry; |
|
|
|
|
|
|
|
@ -188,20 +172,16 @@ static void Close( vlc_object_t *p_this ) |
|
|
|
free( p_udi_entry ); |
|
|
|
} |
|
|
|
p_sys->pp_devices = NULL; |
|
|
|
#endif |
|
|
|
|
|
|
|
free( p_sys ); |
|
|
|
} |
|
|
|
|
|
|
|
static void AddItem( services_discovery_t *p_sd, input_item_t * p_input |
|
|
|
#ifdef HAVE_HAL_1 |
|
|
|
, const char* psz_device |
|
|
|
#endif |
|
|
|
) |
|
|
|
static void AddItem( services_discovery_t *p_sd, input_item_t * p_input, |
|
|
|
const char* psz_device ) |
|
|
|
{ |
|
|
|
services_discovery_sys_t *p_sys = p_sd->p_sys; |
|
|
|
services_discovery_AddItem( p_sd, p_input, NULL /* no category */ ); |
|
|
|
|
|
|
|
#ifdef HAVE_HAL_1 |
|
|
|
struct udi_input_id_t *p_udi_entry; |
|
|
|
p_udi_entry = malloc( sizeof( struct udi_input_id_t ) ); |
|
|
|
if( !p_udi_entry ) |
|
|
|
@ -216,7 +196,6 @@ static void AddItem( services_discovery_t *p_sd, input_item_t * p_input |
|
|
|
vlc_gc_incref( p_input ); |
|
|
|
p_udi_entry->p_item = p_input; |
|
|
|
TAB_APPEND( p_sys->i_devices_number, p_sys->pp_devices, p_udi_entry ); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
static void AddDvd( services_discovery_t *p_sd, const char *psz_device ) |
|
|
|
@ -225,17 +204,12 @@ static void AddDvd( services_discovery_t *p_sd, const char *psz_device ) |
|
|
|
char *psz_uri; |
|
|
|
char *psz_blockdevice; |
|
|
|
input_item_t *p_input; |
|
|
|
#ifdef HAVE_HAL_1 |
|
|
|
|
|
|
|
psz_name = libhal_device_get_property_string( p_sd->p_sys->p_ctx, |
|
|
|
psz_device, "volume.label", NULL ); |
|
|
|
psz_blockdevice = libhal_device_get_property_string( p_sd->p_sys->p_ctx, |
|
|
|
psz_device, "block.device", NULL ); |
|
|
|
#else |
|
|
|
psz_name = hal_device_get_property_string( p_sd->p_sys->p_ctx, |
|
|
|
psz_device, "volume.label" ); |
|
|
|
psz_blockdevice = hal_device_get_property_string( p_sd->p_sys->p_ctx, |
|
|
|
psz_device, "block.device" ); |
|
|
|
#endif |
|
|
|
|
|
|
|
if( asprintf( &psz_uri, "dvd://%s", psz_blockdevice ) == -1 ) |
|
|
|
return; |
|
|
|
/* Create the playlist item here */ |
|
|
|
@ -245,15 +219,12 @@ static void AddDvd( services_discovery_t *p_sd, const char *psz_device ) |
|
|
|
{ |
|
|
|
return; |
|
|
|
} |
|
|
|
#ifdef HAVE_HAL_1 |
|
|
|
|
|
|
|
AddItem( p_sd, p_input, psz_device ); |
|
|
|
#else |
|
|
|
AddItem( p_sd, p_input ); |
|
|
|
#endif |
|
|
|
|
|
|
|
vlc_gc_decref( p_input ); |
|
|
|
} |
|
|
|
|
|
|
|
#ifdef HAVE_HAL_1 |
|
|
|
static void DelItem( services_discovery_t *p_sd, const char* psz_udi ) |
|
|
|
{ |
|
|
|
services_discovery_sys_t *p_sys = p_sd->p_sys; |
|
|
|
@ -271,20 +242,16 @@ static void DelItem( services_discovery_t *p_sd, const char* psz_udi ) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
#endif |
|
|
|
|
|
|
|
static void AddCdda( services_discovery_t *p_sd, const char *psz_device ) |
|
|
|
{ |
|
|
|
char *psz_uri; |
|
|
|
char *psz_blockdevice; |
|
|
|
input_item_t *p_input; |
|
|
|
#ifdef HAVE_HAL_1 |
|
|
|
|
|
|
|
psz_blockdevice = libhal_device_get_property_string( p_sd->p_sys->p_ctx, |
|
|
|
psz_device, "block.device", NULL ); |
|
|
|
#else |
|
|
|
psz_blockdevice = hal_device_get_property_string( p_sd->p_sys->p_ctx, |
|
|
|
psz_device, "block.device" ); |
|
|
|
#endif |
|
|
|
|
|
|
|
if( asprintf( &psz_uri, "cdda://%s", psz_blockdevice ) == -1 ) |
|
|
|
return; |
|
|
|
/* Create the item here */ |
|
|
|
@ -292,11 +259,9 @@ static void AddCdda( services_discovery_t *p_sd, const char *psz_device ) |
|
|
|
free( psz_uri ); |
|
|
|
if( !p_input ) |
|
|
|
return; |
|
|
|
#ifdef HAVE_HAL_1 |
|
|
|
|
|
|
|
AddItem( p_sd, p_input, psz_device ); |
|
|
|
#else |
|
|
|
AddItem( p_sd, p_input ); |
|
|
|
#endif |
|
|
|
|
|
|
|
vlc_gc_decref( p_input ); |
|
|
|
} |
|
|
|
|
|
|
|
@ -304,45 +269,26 @@ static void ParseDevice( services_discovery_t *p_sd, const char *psz_device ) |
|
|
|
{ |
|
|
|
char *psz_disc_type; |
|
|
|
services_discovery_sys_t *p_sys = p_sd->p_sys; |
|
|
|
#ifdef HAVE_HAL_1 |
|
|
|
|
|
|
|
if( libhal_device_property_exists( p_sys->p_ctx, psz_device, |
|
|
|
"volume.disc.type", NULL ) ) |
|
|
|
return; |
|
|
|
|
|
|
|
psz_disc_type = libhal_device_get_property_string( p_sys->p_ctx, |
|
|
|
psz_device, |
|
|
|
"volume.disc.type", |
|
|
|
NULL ); |
|
|
|
if( !strncmp( psz_disc_type, "dvd_r", 5 ) ) |
|
|
|
{ |
|
|
|
psz_disc_type = libhal_device_get_property_string( p_sys->p_ctx, |
|
|
|
psz_device, |
|
|
|
"volume.disc.type", |
|
|
|
NULL ); |
|
|
|
#else |
|
|
|
if( hal_device_property_exists( p_sys->p_ctx, psz_device, |
|
|
|
"volume.disc.type" ) ) |
|
|
|
if (libhal_device_get_property_bool( p_sys->p_ctx, psz_device, |
|
|
|
"volume.disc.is_videodvd", NULL ) ) |
|
|
|
AddDvd( p_sd, psz_device ); |
|
|
|
} |
|
|
|
else if( !strncmp( psz_disc_type, "cd_r", 4 ) ) |
|
|
|
{ |
|
|
|
psz_disc_type = hal_device_get_property_string( p_sys->p_ctx, |
|
|
|
psz_device, |
|
|
|
"volume.disc.type" ); |
|
|
|
#endif |
|
|
|
if( !strncmp( psz_disc_type, "dvd_r", 5 ) ) |
|
|
|
{ |
|
|
|
#ifdef HAVE_HAL_1 |
|
|
|
/* hal 0.2.9.7 (HAVE_HAL) has not is_videodvd
|
|
|
|
* but hal 0.5.0 (HAVE_HAL_1) has */ |
|
|
|
if (libhal_device_get_property_bool( p_sys->p_ctx, psz_device, |
|
|
|
"volume.disc.is_videodvd", NULL ) ) |
|
|
|
#endif |
|
|
|
AddDvd( p_sd, psz_device ); |
|
|
|
} |
|
|
|
else if( !strncmp( psz_disc_type, "cd_r", 4 ) ) |
|
|
|
{ |
|
|
|
#ifdef HAVE_HAL_1 |
|
|
|
if( libhal_device_get_property_bool( p_sys->p_ctx, psz_device, |
|
|
|
"volume.disc.has_audio" , NULL ) ) |
|
|
|
#else |
|
|
|
if( hal_device_get_property_bool( p_sys->p_ctx, psz_device, |
|
|
|
"volume.disc.has_audio" ) ) |
|
|
|
#endif |
|
|
|
{ |
|
|
|
AddCdda( p_sd, psz_device ); |
|
|
|
} |
|
|
|
} |
|
|
|
if( libhal_device_get_property_bool( p_sys->p_ctx, psz_device, |
|
|
|
"volume.disc.has_audio" , NULL ) ) |
|
|
|
AddCdda( p_sd, psz_device ); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@ -356,44 +302,30 @@ static void Run( services_discovery_t *p_sd ) |
|
|
|
services_discovery_sys_t *p_sys = p_sd->p_sys; |
|
|
|
|
|
|
|
/* parse existing devices first */ |
|
|
|
#ifdef HAVE_HAL_1 |
|
|
|
if( ( devices = libhal_get_all_devices( p_sys->p_ctx, &i_devices, NULL ) ) ) |
|
|
|
#else |
|
|
|
if( ( devices = hal_get_all_devices( p_sys->p_ctx, &i_devices ) ) ) |
|
|
|
#endif |
|
|
|
{ |
|
|
|
for( i = 0; i < i_devices; i++ ) |
|
|
|
{ |
|
|
|
ParseDevice( p_sd, devices[ i ] ); |
|
|
|
#ifdef HAVE_HAL_1 |
|
|
|
libhal_free_string( devices[ i ] ); |
|
|
|
#else |
|
|
|
hal_free_string( devices[ i ] ); |
|
|
|
#endif |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
#ifdef HAVE_HAL_1 |
|
|
|
while( !p_sd->b_die ) |
|
|
|
{ |
|
|
|
/* look for events on the bus, blocking 1 second */ |
|
|
|
dbus_connection_read_write_dispatch( p_sys->p_connection, 1000 ); |
|
|
|
/* HAL 0.5.8.1 can use libhal_ctx_get_dbus_connection(p_sys->p_ctx) */ |
|
|
|
/* look for events on the bus, blocking 1 second */ |
|
|
|
dbus_connection_read_write_dispatch( p_sys->p_connection, 1000 ); |
|
|
|
/* HAL 0.5.8.1 can use libhal_ctx_get_dbus_connection(p_sys->p_ctx) */ |
|
|
|
} |
|
|
|
#endif |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
#ifdef HAVE_HAL_1 |
|
|
|
void DeviceAdded( LibHalContext *p_ctx, const char *psz_udi ) |
|
|
|
{ |
|
|
|
VLC_UNUSED(p_ctx); |
|
|
|
ParseDevice( p_sd_global, psz_udi ); |
|
|
|
} |
|
|
|
|
|
|
|
void DeviceRemoved( LibHalContext *p_ctx, const char *psz_udi ) |
|
|
|
{ |
|
|
|
VLC_UNUSED(p_ctx); |
|
|
|
DelItem( p_sd_global, psz_udi ); |
|
|
|
} |
|
|
|
#endif |
|
|
|
|
|
|
|
|