175 lines
3.9 KiB
C++
175 lines
3.9 KiB
C++
#if !defined(_FUSION_INC_STRINGCLASS_INL_INCLUDED_)
|
|
#define _FUSION_INC_STRINGCLASS_INL_INCLUDED_
|
|
|
|
#pragma once
|
|
|
|
inline
|
|
BOOL
|
|
CString::Win32FormatFileTime(
|
|
const FILETIME &rft
|
|
)
|
|
{
|
|
BOOL fSuccess = FALSE;
|
|
|
|
if ((rft.dwLowDateTime == 0) && (rft.dwHighDateTime == 0))
|
|
IFW32FALSE_EXIT(this->Win32Assign(L"n/a"));
|
|
else
|
|
{
|
|
SYSTEMTIME st;
|
|
int iResult;
|
|
int cchDate = 0;
|
|
int cchTime = 0;
|
|
|
|
IFW32FALSE_EXIT(::FileTimeToSystemTime(&rft, &st));
|
|
|
|
iResult = ::GetDateFormatW(
|
|
LOCALE_USER_DEFAULT,
|
|
LOCALE_USE_CP_ACP,
|
|
&st,
|
|
NULL,
|
|
NULL,
|
|
0);
|
|
if (iResult == 0)
|
|
goto Exit;
|
|
|
|
cchDate = iResult - 1;
|
|
|
|
iResult = ::GetTimeFormatW(
|
|
LOCALE_USER_DEFAULT,
|
|
LOCALE_USE_CP_ACP,
|
|
&st,
|
|
NULL,
|
|
NULL,
|
|
0);
|
|
if (iResult == 0)
|
|
goto Exit;
|
|
|
|
cchTime = iResult - 1;
|
|
|
|
IFW32FALSE_EXIT(this->Win32ResizeBuffer(cchDate + 1 + cchTime + 1, eDoNotPreserveBufferContents));
|
|
|
|
iResult = ::GetDateFormatW(
|
|
LOCALE_USER_DEFAULT,
|
|
LOCALE_USE_CP_ACP,
|
|
&st,
|
|
NULL,
|
|
this->GetBufferPtr(),
|
|
cchDate + 1);
|
|
if (iResult == 0)
|
|
goto Exit;
|
|
|
|
ASSERT(iResult == (cchDate + 1));
|
|
|
|
this->GetBufferPtr()[cchDate] = L' ';
|
|
|
|
iResult = ::GetTimeFormatW(
|
|
LOCALE_USER_DEFAULT,
|
|
LOCALE_USE_CP_ACP,
|
|
&st,
|
|
NULL,
|
|
this->GetBufferPtr() + cchDate + 1,
|
|
cchTime + 1);
|
|
if (iResult == 0)
|
|
goto Exit;
|
|
|
|
ASSERT(iResult == (cchTime + 1));
|
|
|
|
m_cch = (cchDate + 1 + cchTime);
|
|
}
|
|
|
|
Exit:
|
|
return fSuccess;
|
|
}
|
|
|
|
inline
|
|
BOOL
|
|
CString::Win32GetFileSize(
|
|
ULARGE_INTEGER &ruli
|
|
) const
|
|
{
|
|
BOOL fSuccess = FALSE;
|
|
|
|
FN_TRACE_WIN32(fSuccess);
|
|
|
|
WIN32_FILE_ATTRIBUTE_DATA wfad;
|
|
|
|
IFW32FALSE_EXIT(::GetFileAttributesExW(*this, GetFileExInfoStandard, &wfad));
|
|
|
|
ruli.LowPart = wfad.nFileSizeLow;
|
|
ruli.HighPart = wfad.nFileSizeHigh;
|
|
|
|
fSuccess = TRUE;
|
|
Exit:
|
|
return fSuccess;
|
|
}
|
|
|
|
inline
|
|
BOOL
|
|
CString::Win32CopyIntoBuffer(
|
|
PWSTR *ppszCursor,
|
|
SIZE_T cbBuffer,
|
|
SIZE_T *cbBytesWritten,
|
|
PVOID pvBase,
|
|
ULONG *pulOffset,
|
|
ULONG *pulLength
|
|
)
|
|
{
|
|
BOOL fSuccess = FALSE;
|
|
|
|
FN_TRACE_WIN32(fSuccess);
|
|
|
|
PWSTR pszCursor;
|
|
SSIZE_T dptr;
|
|
SIZE_T cbRequired;
|
|
|
|
if (pulOffset != NULL)
|
|
*pulOffset = 0;
|
|
|
|
if (pulLength != NULL)
|
|
*pulLength = 0;
|
|
|
|
PARAMETER_CHECK(ppszCursor != NULL);
|
|
|
|
pszCursor = *ppszCursor;
|
|
dptr = ((SSIZE_T) pszCursor) - ((SSIZE_T) pvBase);
|
|
|
|
// If they're asking for an offset or length and the cursor is too far from the base,
|
|
// fail.
|
|
PARAMETER_CHECK((pulOffset == NULL) || (dptr <= ULONG_MAX));
|
|
|
|
cbRequired = (m_cch != 0) ? ((m_cch + 1) * sizeof(WCHAR)) : 0;
|
|
|
|
if (cbBuffer < cbRequired)
|
|
{
|
|
::SetLastError(ERROR_INSUFFICIENT_BUFFER);
|
|
goto Exit;
|
|
}
|
|
|
|
if (cbRequired > ULONG_MAX)
|
|
{
|
|
::SetLastError(ERROR_INSUFFICIENT_BUFFER);
|
|
goto Exit;
|
|
}
|
|
|
|
memcpy(pszCursor, static_cast<PCWSTR>(*this), cbRequired);
|
|
|
|
if (pulOffset != NULL)
|
|
{
|
|
if (cbRequired != 0)
|
|
*pulOffset = (ULONG) dptr;
|
|
}
|
|
|
|
if (pulLength != NULL)
|
|
*pulLength = (ULONG) cbRequired;
|
|
|
|
*cbBytesWritten += cbRequired;
|
|
*ppszCursor = (PWSTR) (((ULONG_PTR) pszCursor) + cbRequired);
|
|
|
|
fSuccess = TRUE;
|
|
|
|
Exit:
|
|
return fSuccess;
|
|
}
|
|
|
|
#endif
|