annotate foosdk/sdk/foobar2000/helpers/win32_misc.cpp @ 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 #include "StdAfx.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 #include "win32_misc.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #ifdef FOOBAR2000_MOBILE_WINDOWS
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 #include <pfc/pp-winapi.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 #include <SDK/modeless_dialog.h>
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 mutexScope::mutexScope(HANDLE hMutex_, abort_callback & abort) : hMutex(hMutex_) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 HANDLE h[2] = { hMutex, abort.get_abort_event() };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 switch (WaitForMultipleObjectsEx(2, h, FALSE, INFINITE, FALSE)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 case WAIT_OBJECT_0:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 break; // and enter
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 case WAIT_OBJECT_0 + 1:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 throw exception_aborted();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 default:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 uBugCheck();
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 mutexScope::~mutexScope() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 ReleaseMutex(hMutex);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 CMutex::CMutex(const TCHAR * name) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 WIN32_OP_CRITICAL("CreateMutex", m_hMutex = CreateMutex(NULL, FALSE, name));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 CMutex::~CMutex() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 CloseHandle(m_hMutex);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 void CMutex::AcquireByHandle(HANDLE hMutex, abort_callback & aborter) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 SetLastError(0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 HANDLE hWait[2] = { hMutex, aborter.get_abort_event() };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 switch (WaitForMultipleObjects(2, hWait, FALSE, INFINITE)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 case WAIT_FAILED:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 WIN32_OP_FAIL_CRITICAL("WaitForSingleObject");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 case WAIT_OBJECT_0:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 case WAIT_OBJECT_0 + 1:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 PFC_ASSERT(aborter.is_aborting());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 throw exception_aborted();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 default:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 uBugCheck();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 void CMutex::Acquire(abort_callback& aborter) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 AcquireByHandle(Handle(), aborter);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 void CMutex::Release() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 ReleaseMutex(Handle());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 CMutexScope::CMutexScope(CMutex & mutex, DWORD timeOutMS, const char * timeOutBugMsg) : m_mutex(mutex) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 SetLastError(0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 const unsigned div = 4;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 for (unsigned walk = 0; walk < div; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 switch (WaitForSingleObject(m_mutex.Handle(), timeOutMS / div)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 case WAIT_FAILED:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 WIN32_OP_FAIL_CRITICAL("WaitForSingleObject");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 case WAIT_OBJECT_0:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 case WAIT_TIMEOUT:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 default:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 uBugCheck();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 TRACK_CODE(timeOutBugMsg, uBugCheck());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 CMutexScope::CMutexScope(CMutex & mutex) : m_mutex(mutex) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 SetLastError(0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 switch (WaitForSingleObject(m_mutex.Handle(), INFINITE)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 case WAIT_FAILED:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 WIN32_OP_FAIL_CRITICAL("WaitForSingleObject");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 case WAIT_OBJECT_0:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 default:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 uBugCheck();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 CMutexScope::CMutexScope(CMutex & mutex, abort_callback & aborter) : m_mutex(mutex) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 mutex.Acquire(aborter);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 CMutexScope::~CMutexScope() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 ReleaseMutex(m_mutex.Handle());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 #ifdef FOOBAR2000_DESKTOP_WINDOWS
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 void registerclass_scope_delayed::toggle_on(UINT p_style,WNDPROC p_wndproc,int p_clsextra,int p_wndextra,HICON p_icon,HCURSOR p_cursor,HBRUSH p_background,const TCHAR * p_class_name,const TCHAR * p_menu_name) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 toggle_off();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 WNDCLASS wc = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 wc.style = p_style;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 wc.lpfnWndProc = p_wndproc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 wc.cbClsExtra = p_clsextra;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 wc.cbWndExtra = p_wndextra;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 wc.hInstance = core_api::get_my_instance();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 wc.hIcon = p_icon;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 wc.hCursor = p_cursor;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 wc.hbrBackground = p_background;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 wc.lpszMenuName = p_menu_name;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 wc.lpszClassName = p_class_name;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 WIN32_OP_CRITICAL("RegisterClass", (m_class = RegisterClass(&wc)) != 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 void registerclass_scope_delayed::toggle_off() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 if (m_class != 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 UnregisterClass((LPCTSTR)m_class,core_api::get_my_instance());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 m_class = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 void CModelessDialogEntry::Set(HWND p_new) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 auto api = modeless_dialog_manager::get();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 if (m_wnd) api->remove(m_wnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 m_wnd = p_new;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 if (m_wnd) api->add(m_wnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 OleInitializeScope::OleInitializeScope() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 if (FAILED(OleInitialize(NULL))) throw pfc::exception("OleInitialize() failure");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 OleInitializeScope::~OleInitializeScope() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 OleUninitialize();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 CoInitializeScope::CoInitializeScope() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 if (FAILED(CoInitialize(NULL))) throw pfc::exception("CoInitialize() failed");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 CoInitializeScope::CoInitializeScope(DWORD params) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 if (FAILED(CoInitializeEx(NULL, params))) throw pfc::exception("CoInitialize() failed");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 CoInitializeScope::~CoInitializeScope() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 CoUninitialize();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 void winLocalFileScope::open(const char * inPath, file::ptr inReader, abort_callback & aborter) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 close();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 if (inPath != nullptr) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 if (_extract_native_path_ptr(inPath)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 pfc::string8 prefixed;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 pfc::winPrefixPath(prefixed, inPath);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 m_path = pfc::stringcvt::string_wide_from_utf8(prefixed);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 m_isTemp = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 pfc::string8 tempPath; tempPath.prealloc(1024);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 if (!uGetTempPath(tempPath)) uBugCheck();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 tempPath.add_filename(PFC_string_formatter() << pfc::print_guid(pfc::createGUID()) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 if ( inPath != nullptr ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 auto ext = pfc::string_extension(inPath);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 if (ext.length() > 0) tempPath << "." << ext;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 m_path = pfc::stringcvt::string_wide_from_utf8(tempPath);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 if (inReader.is_empty()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 if (inPath == NULL) uBugCheck();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 inReader = fileOpenReadExisting(inPath, aborter, 1.0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 file::ptr writer = fileOpenWriteNew(PFC_string_formatter() << "file://" << tempPath, aborter, 1.0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 file::g_transfer_file(inReader, writer, aborter);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 m_isTemp = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 void winLocalFileScope::close() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 if (m_isTemp && m_path.length() > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 pfc::lores_timer timer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 timer.start();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 for (;;) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 if (DeleteFile(m_path.c_str())) break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 if (timer.query() > 1.0) break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 Sleep(10);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 m_path.clear();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 bool IsWindowsS() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 bool ret = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 #if FB2K_TARGET_MICROSOFT_STORE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 static bool cached = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 static bool inited = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 if ( inited ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 ret = cached;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 HKEY key;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 if (RegOpenKey(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Control\\CI\\Policy", &key) == 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 DWORD dwVal = 0, dwType;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 DWORD valSize;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204 valSize = sizeof(dwVal);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 if (RegQueryValueEx(key, L"SkuPolicyRequired", nullptr, &dwType, (LPBYTE)&dwVal, &valSize) == 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 if (dwType == REG_DWORD && dwVal != 0) ret = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 RegCloseKey(key);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 cached = ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 inited = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217 WORD GetOSVersion() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 // wrap libPPUI function
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 return ::GetOSVersionCode();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 #endif // FOOBAR2000_DESKTOP_WINDOWS