# include "tools/replay/filereader.h"
# include <fstream>
# include "common/util.h"
# include "system/hardware/hw.h"
# include "tools/replay/util.h"
std : : string cacheFilePath ( const std : : string & url ) {
static std : : string cache_path = [ ] {
const std : : string comma_cache = Path : : download_cache_root ( ) ;
util : : create_directories ( comma_cache , 0755 ) ;
return comma_cache . back ( ) = = ' / ' ? comma_cache : comma_cache + " / " ;
} ( ) ;
return cache_path + sha256 ( getUrlWithoutQuery ( url ) ) ;
}
std : : string FileReader : : read ( const std : : string & file , std : : atomic < bool > * abort ) {
const bool is_remote = file . find ( " https:// " ) = = 0 ;
const std : : string local_file = is_remote ? cacheFilePath ( file ) : file ;
std : : string result ;
if ( ( ! is_remote | | cache_to_local_ ) & & util : : file_exists ( local_file ) ) {
result = util : : read_file ( local_file ) ;
} else if ( is_remote ) {
result = download ( file , abort ) ;
if ( cache_to_local_ & & ! result . empty ( ) ) {
std : : ofstream fs ( local_file , std : : ios : : binary | std : : ios : : out ) ;
fs . write ( result . data ( ) , result . size ( ) ) ;
}
}
return result ;
}
std : : string FileReader : : download ( const std : : string & url , std : : atomic < bool > * abort ) {
for ( int i = 0 ; i < = max_retries_ & & ! ( abort & & * abort ) ; + + i ) {
if ( i > 0 ) {
rWarning ( " download failed, retrying %d " , i ) ;
util : : sleep_for ( 3000 ) ;
}
std : : string result = httpGet ( url , chunk_size_ , abort ) ;
if ( ! result . empty ( ) ) {
return result ;
}
}
return { } ;
}