Mercurial > foo_out_sdl
diff foosdk/sdk/foobar2000/helpers/ProfileCache.h @ 1:20d02a178406 default tip
*: check in everything else
yay
| author | Paper <paper@tflc.us> |
|---|---|
| date | Mon, 05 Jan 2026 02:15:46 -0500 |
| parents | |
| children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/foosdk/sdk/foobar2000/helpers/ProfileCache.h Mon Jan 05 02:15:46 2026 -0500 @@ -0,0 +1,39 @@ +#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 const &) { + 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 const &) { + fLocal.release(); + try { + retryOnSharingViolation(timeoutVal, abort, [&] {fsLocal->remove(path, abort);} ); + } catch(...) {} + throw; + } + fLocal->seek(0, abort); + } + return fLocal; + } +};
