23#include <wx/filename.h>
24#include <wx/stdpaths.h>
26#include <wx/tokenzr.h>
37#include <propvarutil.h>
38#if defined( __MINGW32__ )
41 #include <shobjidl_core.h>
47#if defined( __MINGW32__ )
50 #include <shlobj_core.h>
56#define INCLUDE_KICAD_VERSION
57#include <kicad_build_version.h>
62 ::SetCurrentProcessExplicitAppUserModelID( GetAppUserModelId().wc_str() );
69 wxString temp = aPath +
'\0';
71 SHFILEOPSTRUCT fileOp;
72 ::ZeroMemory( &fileOp,
sizeof( fileOp ) );
74 fileOp.hwnd =
nullptr;
75 fileOp.wFunc = FO_DELETE;
76 fileOp.pFrom = temp.c_str();
78 fileOp.fFlags = FOF_ALLOWUNDO | FOF_NOERRORUI | FOF_NOCONFIRMATION | FOF_SILENT;
80 int eVal = SHFileOperation( &fileOp );
84 aError = wxString::Format(
_(
"Error code: %d" ), eVal );
94 return ::PathIsNetworkPathW( aPath.wc_str() );
101 std::error_code error;
102 std::filesystem::path
path = std::filesystem::canonical( aPath.ToStdWstring(), error );
104 if( error ||
path.empty() )
108 std::wstring root(
path.native().size() + 2,
L'\0' );
110 return GetVolumePathNameW(
path.c_str(), root.data(),
static_cast<DWORD
>( root.size() ) )
111 && GetDriveTypeW( root.c_str() ) == DRIVE_REMOVABLE;
119 if( wxTheApp ==
nullptr )
122 return wxStandardPaths::Get().GetDocumentsDir();
125 return wxStandardPaths::Get().GetDocumentsDir();
133 if( wxTheApp ==
nullptr )
136 return wxStandardPaths::Get().GetUserConfigDir();
139 return wxStandardPaths::Get().GetUserConfigDir();
147 if( wxTheApp ==
nullptr )
150 return wxStandardPaths::Get().GetUserDataDir();
153 return wxStandardPaths::Get().GetUserDataDir();
161 if( wxTheApp ==
nullptr )
164 return wxStandardPaths::Get().GetUserLocalDataDir();
167 return wxStandardPaths::Get().GetUserLocalDataDir();
179 if( wxTheApp ==
nullptr )
182 wxStandardPaths::Get().UseAppInfo( wxStandardPaths::AppInfo_None );
184 return wxStandardPaths::Get().GetUserLocalDataDir();
187 wxStandardPaths::Get().UseAppInfo( wxStandardPaths::AppInfo_None );
189 return wxStandardPaths::Get().GetUserLocalDataDir();
197 bool autoProxyDetect =
false;
198 WINHTTP_CURRENT_USER_IE_PROXY_CONFIG ieProxyConfig = { 0 };
199 WINHTTP_AUTOPROXY_OPTIONS autoProxyOptions = { 0 };
200 WINHTTP_PROXY_INFO autoProxyInfo = { 0 };
201 HINTERNET proxyResolveSession = NULL;
202 bool success =
false;
206 LPWSTR proxyStr = NULL;
207 LPWSTR bypassProxyStr = NULL;
209 if( WinHttpGetIEProxyConfigForCurrentUser( &ieProxyConfig ) )
213 if( ieProxyConfig.fAutoDetect )
215 autoProxyDetect =
true;
218 if( ieProxyConfig.lpszAutoConfigUrl != NULL )
220 autoProxyDetect =
true;
221 autoProxyOptions.lpszAutoConfigUrl = ieProxyConfig.lpszAutoConfigUrl;
224 else if( GetLastError() == ERROR_FILE_NOT_FOUND )
227 autoProxyDetect =
true;
230 if( autoProxyDetect )
232 proxyResolveSession =
233 WinHttpOpen( NULL, WINHTTP_ACCESS_TYPE_AUTOMATIC_PROXY, WINHTTP_NO_PROXY_NAME,
234 WINHTTP_NO_PROXY_BYPASS, WINHTTP_FLAG_ASYNC );
236 if( proxyResolveSession )
239 if( autoProxyOptions.lpszAutoConfigUrl != NULL )
241 autoProxyOptions.dwFlags = WINHTTP_AUTOPROXY_CONFIG_URL;
245 autoProxyOptions.dwFlags = WINHTTP_AUTOPROXY_AUTO_DETECT;
246 autoProxyOptions.dwAutoDetectFlags =
247 WINHTTP_AUTO_DETECT_TYPE_DHCP | WINHTTP_AUTO_DETECT_TYPE_DNS_A;
252 autoProxyOptions.fAutoLogonIfChallenged = FALSE;
254 autoProxyDetect = WinHttpGetProxyForUrl( proxyResolveSession, aURL.c_str(),
255 &autoProxyOptions, &autoProxyInfo );
257 if( !autoProxyDetect && GetLastError() == ERROR_WINHTTP_LOGIN_FAILURE )
259 autoProxyOptions.fAutoLogonIfChallenged = TRUE;
262 autoProxyDetect = WinHttpGetProxyForUrl( proxyResolveSession, aURL.c_str(),
263 &autoProxyOptions, &autoProxyInfo );
266 if( autoProxyDetect )
268 if( autoProxyInfo.dwAccessType == WINHTTP_ACCESS_TYPE_NAMED_PROXY )
270 proxyStr = autoProxyInfo.lpszProxy;
271 bypassProxyStr = autoProxyInfo.lpszProxyBypass;
275 WinHttpCloseHandle( proxyResolveSession );
279 if( !autoProxyDetect && ieProxyConfig.lpszProxy != NULL )
281 proxyStr = ieProxyConfig.lpszProxy;
282 bypassProxyStr = ieProxyConfig.lpszProxyBypass;
285 bool bypassed =
false;
287 if( bypassProxyStr != NULL )
289 wxStringTokenizer tokenizer( bypassProxyStr,
";" );
291 while( tokenizer.HasMoreTokens() )
293 wxString host = tokenizer.GetNextToken();
295 if( host == uri.GetServer() )
304 if( host ==
"<local>" )
306 if( !uri.GetServer().Contains(
"." ) )
316 if( !bypassed && proxyStr != NULL )
321 wxStringTokenizer tokenizer( proxyStr,
"; \t" );
323 while( tokenizer.HasMoreTokens() )
325 wxString entry = tokenizer.GetNextToken();
328 if( entry.Contains(
"=" ) )
330 wxString scheme = entry.BeforeFirst(
'=' ).Lower();
331 entry = entry.AfterFirst(
'=' );
334 if( scheme != uri.GetScheme().Lower() )
344 if( entry !=
"" && entry !=
":" && entry !=
"::" )
355 if( autoProxyInfo.lpszProxy )
357 GlobalFree( autoProxyInfo.lpszProxy );
358 autoProxyInfo.lpszProxy = NULL;
361 if( autoProxyInfo.lpszProxyBypass )
363 GlobalFree( autoProxyInfo.lpszProxyBypass );
364 autoProxyInfo.lpszProxyBypass = NULL;
367 if( ieProxyConfig.lpszAutoConfigUrl != NULL )
369 GlobalFree( ieProxyConfig.lpszAutoConfigUrl );
370 ieProxyConfig.lpszAutoConfigUrl = NULL;
373 if( ieProxyConfig.lpszProxy != NULL )
375 GlobalFree( ieProxyConfig.lpszProxy );
376 ieProxyConfig.lpszProxy = NULL;
379 if( ieProxyConfig.lpszProxyBypass != NULL )
381 GlobalFree( ieProxyConfig.lpszProxyBypass );
382 ieProxyConfig.lpszProxyBypass = NULL;
391 WINTRUST_FILE_INFO fileData;
392 memset( &fileData, 0,
sizeof( fileData ) );
393 fileData.cbStruct =
sizeof( WINTRUST_FILE_INFO );
394 fileData.pcwszFilePath = aPath.wc_str();
397 GUID policy = WINTRUST_ACTION_GENERIC_VERIFY_V2;
399 WINTRUST_DATA trustData;
400 memset( &trustData, 0,
sizeof( trustData ) );
402 trustData.cbStruct =
sizeof( trustData );
403 trustData.dwUIChoice = WTD_UI_NONE;
405 trustData.fdwRevocationChecks = WTD_REVOKE_NONE;
406 trustData.dwUnionChoice = WTD_CHOICE_FILE;
407 trustData.dwStateAction = WTD_STATEACTION_VERIFY;
408 trustData.pFile = &fileData;
411 bool verified =
false;
412 LONG status = WinVerifyTrust( NULL, &policy, &trustData );
414 verified = ( status == ERROR_SUCCESS );
417 trustData.dwStateAction = WTD_STATEACTION_CLOSE;
418 WinVerifyTrust( NULL, &policy, &trustData );
430 std::vector<wxString> modelIdComponents;
431 modelIdComponents.push_back( wxS(
"Kicad" ) );
432 modelIdComponents.push_back( wxS(
"Kicad" ) );
433 modelIdComponents.push_back( wxTheApp->GetAppName() );
434 modelIdComponents.push_back( KICAD_MAJOR_MINOR_VERSION );
437 for(
const auto& str : modelIdComponents )
440 modelId += wxS(
"." );
443 modelId.RemoveLast();
444 modelId.Replace( wxS(
" " ), wxS(
"_" ) );
453 const wxString& aRelaunchDisplayName )
456 HRESULT hr = ::SHGetPropertyStoreForWindow( aWindow->GetHWND(), IID_PPV_ARGS( &pps ) );
457 if( SUCCEEDED( hr ) )
464 if( SUCCEEDED( hr ) )
466 hr = pps->SetValue( PKEY_AppUserModel_ID, pv );
467 PropVariantClear( &pv );
471 if( !aRelaunchCommand.empty() )
473 hr = ::InitPropVariantFromString( aRelaunchCommand.wc_str(), &pv );
478 ::PropVariantInit( &pv );
481 if( SUCCEEDED( hr ) )
483 hr = pps->SetValue( PKEY_AppUserModel_RelaunchCommand, pv );
484 PropVariantClear( &pv );
487 if( !aRelaunchDisplayName.empty() )
489 hr = ::InitPropVariantFromString( aRelaunchDisplayName.wc_str(), &pv );
494 ::PropVariantInit( &pv );
497 if( SUCCEEDED( hr ) )
499 hr = pps->SetValue( PKEY_AppUserModel_RelaunchDisplayNameResource, pv );
500 PropVariantClear( &pv );
510 return ::GetCommandLine();
516 IShellItem* psi =
nullptr;
517 HRESULT hr = SHCreateItemFromParsingName( aPath.wc_str(), NULL, IID_PPV_ARGS( &psi ) );
519 if( SUCCEEDED( hr ) )
524 info.pszAppID = appID.wc_str();
525 ::SHAddToRecentDocs( SHARD_APPIDINFO, &
info );
530 ::SHAddToRecentDocs( SHARD_PATHW, aPath.wc_str() );
std::vector< FAB_LAYER_COLOR > dummy