annotate 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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #pragma once
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 namespace ProfileCache {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 inline file::ptr FetchFile(const char * context, const char * name, const char * webURL, t_filetimestamp acceptableAge, abort_callback & abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 const double timeoutVal = 5;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 auto path = core_api::pathInProfile( context );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 auto fsLocal = filesystem::get(path);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 fsLocal->make_directory(path, abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 path.add_filename( name );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 bool fetch = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 file::ptr fLocal;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 fLocal = fsLocal->openWriteExisting(path, abort, timeoutVal );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 fetch = fLocal->get_timestamp(abort) < filetimestamp_from_system_timer() - acceptableAge;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 } catch(exception_io_not_found const &) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 fLocal = fsLocal->openWriteNew(path, abort, timeoutVal);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 fetch = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 if (fetch) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 fLocal->resize(0, abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 file::ptr fRemote;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 filesystem::g_open(fRemote, webURL, filesystem::open_mode_read, abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 file::g_transfer_file(fRemote, fLocal, abort );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 } catch(exception_io const &) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 fLocal.release();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 retryOnSharingViolation(timeoutVal, abort, [&] {fsLocal->remove(path, abort);} );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 } catch(...) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 throw;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 fLocal->seek(0, abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 return fLocal;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 };