Added scripting quality of life features #299
|
@ -30,6 +30,7 @@ of DigiPen Institute of Technology is prohibited.
|
||||||
#include "Scene/SHSceneEvents.h"
|
#include "Scene/SHSceneEvents.h"
|
||||||
|
|
||||||
#include "Assets/SHAssetMacros.h"
|
#include "Assets/SHAssetMacros.h"
|
||||||
|
#include "Tools/Utilities/SHExecUtilities.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
|
@ -189,11 +190,7 @@ namespace SHADE
|
||||||
oss << "[ScriptEngine] Building " << (debug ? " debug " : "") << "Managed Script Assembly (" << MANAGED_SCRIPT_LIB_NAME << ")!";
|
oss << "[ScriptEngine] Building " << (debug ? " debug " : "") << "Managed Script Assembly (" << MANAGED_SCRIPT_LIB_NAME << ")!";
|
||||||
SHLOG_INFO(oss.str());
|
SHLOG_INFO(oss.str());
|
||||||
oss.str("");
|
oss.str("");
|
||||||
const bool BUILD_SUCCESS = execProcess
|
const bool BUILD_SUCCESS = SHExecUtilties::ExecBlockingCommand(generateBuildCommand(debug)) == 0;
|
||||||
(
|
|
||||||
L"C:\\Windows\\system32\\cmd.exe",
|
|
||||||
L"/K \"" + generateBuildCommand(debug) + L" & exit\""
|
|
||||||
) == 0;
|
|
||||||
if (BUILD_SUCCESS)
|
if (BUILD_SUCCESS)
|
||||||
{
|
{
|
||||||
// Copy to built dll to the working directory and replace
|
// Copy to built dll to the working directory and replace
|
||||||
|
@ -315,7 +312,7 @@ namespace SHADE
|
||||||
}
|
}
|
||||||
|
|
||||||
// Open it
|
// Open it
|
||||||
execProcessNoBlock
|
SHExecUtilties::ExecProcess
|
||||||
(
|
(
|
||||||
L"C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\Common7\\IDE\\devenv.exe",
|
L"C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\Common7\\IDE\\devenv.exe",
|
||||||
L"/Edit " + SHStringUtilities::StrToWstr(CSPROJ_PATH)
|
L"/Edit " + SHStringUtilities::StrToWstr(CSPROJ_PATH)
|
||||||
|
@ -626,65 +623,6 @@ namespace SHADE
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DWORD SHScriptEngine::execProcess(const std::wstring& path, const std::wstring& args)
|
|
||||||
{
|
|
||||||
PROCESS_INFORMATION procInfo = execProcessNoBlock(path, args);
|
|
||||||
|
|
||||||
// Wait for execution to end
|
|
||||||
DWORD status;
|
|
||||||
while (true)
|
|
||||||
{
|
|
||||||
const auto EXEC_SUCCESS = GetExitCodeProcess(procInfo.hProcess, &status);
|
|
||||||
if (!EXEC_SUCCESS)
|
|
||||||
{
|
|
||||||
auto err = GetLastError();
|
|
||||||
std::ostringstream oss;
|
|
||||||
oss << "[ScriptEngine] Failed to query process. Error code: " << std::hex << err
|
|
||||||
<< " (" << SHStringUtilities::GetWin32ErrorMessage(err) << ")";
|
|
||||||
throw std::runtime_error(oss.str());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Break only if process ends
|
|
||||||
if (status != STILL_ACTIVE)
|
|
||||||
{
|
|
||||||
CloseHandle(procInfo.hProcess);
|
|
||||||
CloseHandle(procInfo.hThread);
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
PROCESS_INFORMATION SHScriptEngine::execProcessNoBlock(const std::wstring& path, const std::wstring& args)
|
|
||||||
{
|
|
||||||
STARTUPINFOW startInfo;
|
|
||||||
PROCESS_INFORMATION procInfo;
|
|
||||||
ZeroMemory(&startInfo, sizeof(startInfo));
|
|
||||||
ZeroMemory(&procInfo, sizeof(procInfo));
|
|
||||||
startInfo.cb = sizeof(startInfo);
|
|
||||||
|
|
||||||
std::wstring argsWstr = args;
|
|
||||||
|
|
||||||
// Start Process
|
|
||||||
const auto SUCCESS = CreateProcess
|
|
||||||
(
|
|
||||||
path.data(), argsWstr.data(),
|
|
||||||
nullptr, nullptr, false, NULL, nullptr, nullptr,
|
|
||||||
&startInfo, &procInfo
|
|
||||||
);
|
|
||||||
|
|
||||||
// Error Check
|
|
||||||
if (!SUCCESS)
|
|
||||||
{
|
|
||||||
auto err = GetLastError();
|
|
||||||
std::ostringstream oss;
|
|
||||||
oss << "[ScriptEngine] Failed to launch process. Error code: " << std::hex << err
|
|
||||||
<< " (" << SHStringUtilities::GetWin32ErrorMessage(err) << ")";
|
|
||||||
throw std::runtime_error(oss.str());
|
|
||||||
}
|
|
||||||
|
|
||||||
return procInfo;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::wstring SHScriptEngine::generateBuildCommand(bool debug)
|
std::wstring SHScriptEngine::generateBuildCommand(bool debug)
|
||||||
{
|
{
|
||||||
std::wostringstream oss;
|
std::wostringstream oss;
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/************************************************************************************//*!
|
/************************************************************************************//*!
|
||||||
\file ScriptEngine.h
|
\file SHScriptEngine.h
|
||||||
\author Tng Kah Wei, kahwei.tng, 390009620
|
\author Tng Kah Wei, kahwei.tng, 390009620
|
||||||
\par email: kahwei.tng\@digipen.edu
|
\par email: kahwei.tng\@digipen.edu
|
||||||
\date Sep 17, 2021
|
\date Sep 17, 2021
|
||||||
|
@ -324,8 +324,6 @@ namespace SHADE
|
||||||
/// <returns> True if the file exists </returns>
|
/// <returns> True if the file exists </returns>
|
||||||
static bool fileExists(const std::filesystem::path& filePath);
|
static bool fileExists(const std::filesystem::path& filePath);
|
||||||
static bool copyFile(const std::filesystem::path& from, const std::filesystem::path& to, const std::filesystem::copy_options options) noexcept;
|
static bool copyFile(const std::filesystem::path& from, const std::filesystem::path& to, const std::filesystem::copy_options options) noexcept;
|
||||||
static DWORD execProcess(const std::wstring& path, const std::wstring& args);
|
|
||||||
static PROCESS_INFORMATION execProcessNoBlock(const std::wstring& path, const std::wstring& args);
|
|
||||||
static std::wstring generateBuildCommand(bool debug);
|
static std::wstring generateBuildCommand(bool debug);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,103 @@
|
||||||
|
/************************************************************************************//*!
|
||||||
|
\file SHExecUtilities.cpp
|
||||||
|
\author Tng Kah Wei, kahwei.tng, 390009620
|
||||||
|
\par email: kahwei.tng\@digipen.edu
|
||||||
|
\date Dec 21, 2022
|
||||||
|
\brief Contains the implementation for SHExecUtilities static class.
|
||||||
|
|
||||||
|
Copyright (C) 2022 DigiPen Institute of Technology.
|
||||||
|
Reproduction or disclosure of this file or its contents without the prior written consent
|
||||||
|
of DigiPen Institute of Technology is prohibited.
|
||||||
|
*//*************************************************************************************/
|
||||||
|
// Precompiled Headers
|
||||||
|
#include <SHpch.h>
|
||||||
|
// Primary Header
|
||||||
|
#include "SHExecUtilities.h"
|
||||||
|
// Project Includes
|
||||||
|
#include "SHStringUtilities.h"
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
/* Process Execution Functions */
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
PROCESS_INFORMATION SHExecUtilties::ExecProcess(const std::wstring& path, const std::wstring& args)
|
||||||
|
{
|
||||||
|
STARTUPINFOW startInfo;
|
||||||
|
PROCESS_INFORMATION procInfo;
|
||||||
|
ZeroMemory(&startInfo, sizeof(startInfo));
|
||||||
|
ZeroMemory(&procInfo, sizeof(procInfo));
|
||||||
|
startInfo.cb = sizeof(startInfo);
|
||||||
|
|
||||||
|
std::wstring argsWstr = args;
|
||||||
|
|
||||||
|
// Start Process
|
||||||
|
const auto SUCCESS = CreateProcess
|
||||||
|
(
|
||||||
|
path.data(), argsWstr.data(),
|
||||||
|
nullptr, nullptr, false, NULL, nullptr, nullptr,
|
||||||
|
&startInfo, &procInfo
|
||||||
|
);
|
||||||
|
|
||||||
|
// Error Check
|
||||||
|
if (!SUCCESS)
|
||||||
|
{
|
||||||
|
auto err = GetLastError();
|
||||||
|
std::ostringstream oss;
|
||||||
|
oss << "[SHExecUtilties] Failed to launch process. Error code: " << std::hex << err
|
||||||
|
<< " (" << SHStringUtilities::GetWin32ErrorMessage(err) << ")";
|
||||||
|
throw std::runtime_error(oss.str());
|
||||||
|
}
|
||||||
|
|
||||||
|
return procInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
DWORD SHExecUtilties::ExecBlockingProcess(const std::wstring& path, const std::wstring& args)
|
||||||
|
{
|
||||||
|
PROCESS_INFORMATION procInfo = ExecProcess(path, args);
|
||||||
|
|
||||||
|
// Wait for execution to end
|
||||||
|
DWORD status;
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
const auto EXEC_SUCCESS = GetExitCodeProcess(procInfo.hProcess, &status);
|
||||||
|
if (!EXEC_SUCCESS)
|
||||||
|
{
|
||||||
|
auto err = GetLastError();
|
||||||
|
std::ostringstream oss;
|
||||||
|
oss << "[SHExecUtilties] Failed to query process. Error code: " << std::hex << err
|
||||||
|
<< " (" << SHStringUtilities::GetWin32ErrorMessage(err) << ")";
|
||||||
|
throw std::runtime_error(oss.str());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Break only if process ends
|
||||||
|
if (status != STILL_ACTIVE)
|
||||||
|
{
|
||||||
|
CloseHandle(procInfo.hProcess);
|
||||||
|
CloseHandle(procInfo.hThread);
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
/* Command Execution Functions */
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
PROCESS_INFORMATION SHExecUtilties::ExecCommand(const std::wstring& command)
|
||||||
|
{
|
||||||
|
return ExecProcess
|
||||||
|
(
|
||||||
|
L"C:\\Windows\\system32\\cmd.exe",
|
||||||
|
L"/K \"" + command + L" & exit\""
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
DWORD SHExecUtilties::ExecBlockingCommand(const std::wstring& command)
|
||||||
|
{
|
||||||
|
return ExecBlockingProcess
|
||||||
|
(
|
||||||
|
L"C:\\Windows\\system32\\cmd.exe",
|
||||||
|
L"/K \"" + command + L" & exit\""
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,84 @@
|
||||||
|
/************************************************************************************//*!
|
||||||
|
\file SHExecUtilties.h
|
||||||
|
\author Tng Kah Wei, kahwei.tng, 390009620
|
||||||
|
\par email: kahwei.tng\@digipen.edu
|
||||||
|
\date Dec 21, 2022
|
||||||
|
\brief Contains the interface for SHExecUtilities class.
|
||||||
|
|
||||||
|
Copyright (C) 2022 DigiPen Institute of Technology.
|
||||||
|
Reproduction or disclosure of this file or its contents without the prior written consent
|
||||||
|
of DigiPen Institute of Technology is prohibited.
|
||||||
|
*//*************************************************************************************/
|
||||||
|
|
||||||
|
// STL Includes
|
||||||
|
#include <string>
|
||||||
|
// External Dependencies
|
||||||
|
#include <Windows.h>
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Static class containing functions for executing external processes or commands.
|
||||||
|
/// </summary>
|
||||||
|
class SH_API SHExecUtilties final
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
/* Process Execution Functions */
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
/// <summary>
|
||||||
|
/// Executes a process at the specified path with the specified arguments. This call
|
||||||
|
/// does not wait for the process to finish executing.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="path">Path to the processs to start.</param>
|
||||||
|
/// <param name="args">Arguments to pass to the process.</param>
|
||||||
|
/// <returns>Information about the started process.</returns>
|
||||||
|
/// <exception cref="std::runtime_error">
|
||||||
|
/// Thrown if failed to start the process.
|
||||||
|
/// </exception>
|
||||||
|
static PROCESS_INFORMATION ExecProcess(const std::wstring& path, const std::wstring& args);
|
||||||
|
/// <summary>
|
||||||
|
/// Executes a process at the specified path with the specified arguments and waits
|
||||||
|
/// for that process to finish executing.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="path">Path to the processs to start.</param>
|
||||||
|
/// <param name="args">Arguments to pass to the process.</param>
|
||||||
|
/// <returns>Return value of the process.</returns>
|
||||||
|
/// <exception cref="std::runtime_error">
|
||||||
|
/// Thrown if failed to start the process.
|
||||||
|
/// </exception>
|
||||||
|
static DWORD ExecBlockingProcess(const std::wstring& path, const std::wstring& args);
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
/* Command Execution Functions */
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
/// <summary>
|
||||||
|
/// Executes a specified command in cmd.
|
||||||
|
/// This call does not wait for the command to finish executing.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="command">Command to execute.</param>
|
||||||
|
/// <returns>
|
||||||
|
/// Information about the started cmd process that executes the command.
|
||||||
|
/// </returns>
|
||||||
|
/// <exception cref="std::runtime_error">
|
||||||
|
/// Thrown if failed to start the process.
|
||||||
|
/// </exception>
|
||||||
|
static PROCESS_INFORMATION ExecCommand(const std::wstring& command);
|
||||||
|
/// <summary>
|
||||||
|
/// Executes a specified command in cmd and waits for that process to finish
|
||||||
|
/// executing.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="command">Command to execute.</param>
|
||||||
|
/// <returns>Return value of the process.</returns>
|
||||||
|
/// <exception cref="std::runtime_error">
|
||||||
|
/// Thrown if failed to start the process.
|
||||||
|
/// </exception>
|
||||||
|
static DWORD ExecBlockingCommand(const std::wstring& command);
|
||||||
|
|
||||||
|
private:
|
||||||
|
/*-------------------------------------------------------------------------------*/
|
||||||
|
/* Constructors/Destructors */
|
||||||
|
/*-------------------------------------------------------------------------------*/
|
||||||
|
SHExecUtilties() = delete;
|
||||||
|
};
|
||||||
|
}
|
Loading…
Reference in New Issue