#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(*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