Files
foobar2000-sdk/foobar2000/helpers/ProfileCache.h
2021-12-14 00:28:25 -07:00

40 lines
1.1 KiB
C++

#pragma once
namespace ProfileCache {
inline file::ptr FetchFile(const char * context, const char * name, const char * webURL, t_filetimestamp acceptableAge, abort_callback & abort) {
const double timeoutVal = 5;
auto path = core_api::pathInProfile( context );
auto fsLocal = filesystem::get(path);
fsLocal->make_directory(path, abort);
path.add_filename( name );
bool fetch = false;
file::ptr fLocal;
try {
fLocal = fsLocal->openWriteExisting(path, abort, timeoutVal );
fetch = fLocal->get_timestamp(abort) < filetimestamp_from_system_timer() - acceptableAge;
} catch(exception_io_not_found) {
fLocal = fsLocal->openWriteNew(path, abort, timeoutVal);
fetch = true;
}
if (fetch) {
try {
fLocal->resize(0, abort);
file::ptr fRemote;
filesystem::g_open(fRemote, webURL, filesystem::open_mode_read, abort);
file::g_transfer_file(fRemote, fLocal, abort );
} catch(exception_io) {
fLocal.release();
try {
retryOnSharingViolation(timeoutVal, abort, [&] {fsLocal->remove(path, abort);} );
} catch(...) {}
throw;
}
fLocal->seek(0, abort);
}
return fLocal;
}
};