/*** Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: Open.Win32.cpp Date: 2021-6-12 Author: Reece ***/ #include #include "Processes.hpp" #include "Open.Win32.hpp" #include #include #include #include "Objbase.h" #include "shellapi.h" namespace Aurora::Processes { static AuList gOpenItems; static AuThreadPrimitives::ConditionMutexUnique_t gCondMutex; static AuThreadPrimitives::ConditionVariableUnique_t gCondVariable; static AuThreading::Threads::ThreadUnique_t gOpenerThread; static void RunTasks() { AU_LOCK_GUARD(gCondMutex); while (!gOpenerThread->Exiting()) { for (const auto &open : gOpenItems) { ShellExecuteW(NULL, IO::FS::DirExists(open) ? L"explore" : NULL, Locale::ConvertFromUTF8(open).c_str(), NULL, NULL, SW_SHOWNORMAL); } gOpenItems.clear(); gCondVariable->WaitForSignal(); } } void OpenerThread() { CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE); RunTasks(); CoUninitialize(); } void InitWin32Opener() { gCondMutex = AuThreadPrimitives::ConditionMutexUnique(); gCondVariable = AuThreadPrimitives::ConditionVariableUnique(AuUnsafeRaiiToShared(gCondMutex)); gOpenerThread = AuThreading::Threads::ThreadUnique(AuThreading::Threads::ThreadInfo( AuMakeShared(AuThreading::Threads::IThreadVectorsFunctional::OnEntry_t(std::bind(OpenerThread)), AuThreading::Threads::IThreadVectorsFunctional::OnExit_t{}), "COM ShellExecute Runner" )); gOpenerThread->Run(); } void DeinitWin32Opener() { gOpenerThread->SendExitSignal(); gCondVariable->Broadcast(); gOpenerThread.reset(); gCondVariable.reset(); gCondMutex.reset(); } AUKN_SYM void OpenUri(const AuString &uri) { AU_LOCK_GUARD(gCondMutex); gOpenItems.push_back(uri); gCondVariable->Broadcast(); } AUKN_SYM void OpenFile(const AuString &file) { OpenUri(IO::FS::NormalizePathRet(file)); } }