void SettingsManagerHelpers::GetAsciiFilename(const wchar_t* wfilename, CCharBuffer buffer)
{
	if (buffer.getSizeInElements() <= 0)
	{
		return;
	}

	if (wfilename[0] == 0)
	{
		buffer[0] = 0;
		return;
	}

	if (Utf16ContainsAsciiOnly(wfilename))
	{
		ConvertUtf16ToUtf8(wfilename, buffer);
		return;
	}

	// The path is non-ASCII unicode, so let's resort to short filenames (they are always ASCII-only, I hope)
	wchar_t shortW[MAX_PATH];
	const int bufferCharCount = sizeof(shortW) / sizeof(shortW[0]);
	const int charCount = GetShortPathNameW(wfilename, shortW, bufferCharCount);
	if (charCount <= 0 || charCount >= bufferCharCount)
	{
		buffer[0] = 0;
		return;
	}

	shortW[charCount] = 0;
	if (!Utf16ContainsAsciiOnly(shortW))
	{
		buffer[0] = 0;
		return;
	}

	ConvertUtf16ToUtf8(shortW, buffer);
}
//-------------------------------------------------------------------------
ResetPermissionDialog::ResetPermissionDialog() : m_pArgs(nullptr), m_nbArgs(0)
{
    int nArgs;
    LPWSTR *szArgList = CommandLineToArgvW(GetCommandLineW(), &nArgs);
    if (szArgList != nullptr)
    {
        m_nbArgs = nArgs;
        m_pArgs = new LPCTSTR[nArgs];
        for (auto i = 0; i < nArgs; ++i)
        {
#ifdef _UNICODE
            m_pArgs[i] = _wcsdup(szArgList[i]);
#else
            std::string utf8;
            if (!ConvertUtf16ToUtf8(szArgList[i], nullptr, &utf8))
                utf8 = "";
            m_pArgs[i] = _strdup(utf8.c_str());
#endif
        }
        // Free argument list
        LocalFree(szArgList);
    }
}
//-------------------------------------------------------------------------
bool ResetPermissionDialog::ExecuteCommand(stringT &Cmd)
{
    std::string Utf8Cmd;
#ifdef _UNICODE
    std::string utf8_str;
    bool bEncodingRequired;
    if (!ConvertUtf16ToUtf8(Cmd.c_str(), &bEncodingRequired, &utf8_str))
    {
        MessageBox(
            hDlg,
            _TEXT("Failed to convert input command to UTF-8"),
            TEXT("Error"),
            MB_OK | MB_ICONERROR);

        return false;
    }
    
    if (bEncodingRequired)
    {
        // 65001 = utf-8 # ref: https://msdn.microsoft.com/en-us/library/windows/desktop/dd317756(v=vs.85).aspx
        Utf8Cmd = "CHCP 65001\r\n\r\n" + utf8_str;
    }
    else
    {
        Utf8Cmd = utf8_str;
    }
#else
    Utf8Cmd = Cmd;
#endif
    // Overwrite/create the previous temp Batch file
    LPCTSTR CmdFileName = GenerateWorkBatchFileName();

    // Write the temp Batch file (as binary)
    FILE *fp;
    if (_tfopen_s(&fp, CmdFileName, _TEXT("wb")) != 0)
    {
        stringT err_msg = TEXT("Failed to write batch file to: ");
        err_msg += CmdFileName;

        MessageBox(
            hDlg,
            err_msg.c_str(),
            TEXT("Error"),
            MB_OK | MB_ICONERROR);

        return false;
    }

    fwrite(&Utf8Cmd[0], 1, Utf8Cmd.size(), fp);
    fclose(fp);

    // Execute the temp batch file
    return SUCCEEDED(
        ShellExecute(
            hDlg,
            _TEXT("open"),
            CmdFileName,
            NULL,
            NULL,
            SW_SHOW));
}