static int BrowseShare( stream_t *p_access, input_item_node_t *p_node ) { access_sys_t *p_sys = p_access->p_sys; smb_share_list shares; const char *psz_name; size_t share_count; int i_ret = VLC_SUCCESS; if( smb_share_get_list( p_sys->p_session, &shares, &share_count ) != DSM_SUCCESS ) return VLC_EGENERIC; struct vlc_readdir_helper rdh; vlc_readdir_helper_init( &rdh, p_access, p_node ); for( size_t i = 0; i < share_count && i_ret == VLC_SUCCESS; i++ ) { psz_name = smb_share_list_at( shares, i ); if( psz_name[strlen( psz_name ) - 1] == '$') continue; i_ret = add_item( p_access, &rdh, psz_name, ITEM_TYPE_DIRECTORY ); } vlc_readdir_helper_finish( &rdh, i_ret == VLC_SUCCESS ); smb_share_list_destroy( shares ); return i_ret; }
static input_item_t* BrowseShare( access_t *p_access ) { access_sys_t *p_sys = p_access->p_sys; const char *psz_name; input_item_t *p_item = NULL; if( !p_sys->i_browse_count ) { size_t i_count; if( smb_share_get_list( p_sys->p_session, &p_sys->shares, &i_count ) != DSM_SUCCESS ) return NULL; else p_sys->i_browse_count = i_count; } for( ; !p_item && p_sys->i_browse_idx < p_sys->i_browse_count ; p_sys->i_browse_idx++ ) { psz_name = smb_share_list_at( p_sys->shares, p_sys->i_browse_idx ); if( psz_name[strlen( psz_name ) - 1] == '$') continue; p_item = new_item( p_access, psz_name, ITEM_TYPE_DIRECTORY ); if( !p_item ) return NULL; } return p_item; }