int ZipPlatform::WideToMultiByte(LPCWSTR lpszIn, CZipAutoBuffer &szOut, UINT uCodePage) { size_t wideLen = wcslen(lpszIn); if (wideLen == 0) { szOut.Release(); return 0; } // iLen does not include terminating character int iLen = WideCharToMultiByte(uCodePage, 0, lpszIn, (int)wideLen, szOut, 0, NULL, NULL); if (iLen > 0) { szOut.Allocate(iLen, true); iLen = WideCharToMultiByte(uCodePage, 0, lpszIn , (int)wideLen, szOut, iLen, NULL, NULL); ASSERT(iLen > 0); return iLen > 0 ? iLen : -1; } else // here it means error { szOut.Release(); return -1; } }
bool CZipExtraField::Read(CZipStorage *pStorage, WORD uSize) { if (uSize == 0) return true; Clear(); CZipAutoBuffer buffer; buffer.Allocate(uSize); pStorage->Read(buffer, uSize, true); char* position = (char*) buffer; do { CZipExtraData* pExtra = new CZipExtraData(); if (!pExtra->Read(position, uSize)) { delete pExtra; return false; } int totalSize = pExtra->GetTotalSize(); if (totalSize > uSize || totalSize < 0) return false; position += totalSize; uSize = (WORD)(uSize - totalSize); Add(pExtra); } while (uSize > 0); return true; }
int ZipPlatform::WideToSingle(LPCTSTR lpWide, CZipAutoBuffer &szSingle) { size_t wideLen = wcslen(lpWide); if (wideLen == 0) { szSingle.Release(); return 0; } // iLen does not include terminating character int iLen = WideCharToMultiByte(CP_ACP,0, lpWide, wideLen, szSingle, 0, NULL, NULL); if (iLen > 0) { szSingle.Allocate(iLen, true); iLen = WideCharToMultiByte(CP_ACP,0, lpWide , wideLen, szSingle, iLen, NULL, NULL); ASSERT(iLen != 0); } else // here it means error { szSingle.Release(); iLen --; } return iLen; }
ZIPINLINE void ZipPlatform::AnsiOem(CZipAutoBuffer& buffer, bool bAnsiToOem) { #ifdef _ZIP_SAFE_WINDOWS_API UINT cpIn, cpOut; if (bAnsiToOem) { cpIn = CP_ACP; cpOut = CP_OEMCP; } else { cpIn = CP_OEMCP; cpOut = CP_ACP; } CZipAutoBuffer interBuffer; int size = buffer.GetSize(); // iLen doesn't include terminating character int iLen = MultiByteToWideChar(cpIn, MB_PRECOMPOSED, buffer, size, NULL, 0); if (iLen <= 0) return; interBuffer.Allocate(iLen * sizeof(wchar_t)); LPWSTR lpszWide = (LPWSTR)(char*)interBuffer; iLen = MultiByteToWideChar(cpIn, MB_PRECOMPOSED, buffer, size, lpszWide, iLen); ASSERT(iLen != 0); // iLen does not include terminating character size = WideCharToMultiByte(cpOut, 0, lpszWide, iLen, NULL, 0, NULL, NULL); if (size <= 0) return; buffer.Allocate(size); size = WideCharToMultiByte(cpOut, 0, lpszWide, iLen, buffer, size, NULL, NULL); ASSERT(size != 0); #else if (bAnsiToOem) CharToOemBuffA(buffer, buffer, buffer.GetSize()); else OemToCharBuffA(buffer, buffer, buffer.GetSize()); #endif }
void ZipCompatibility::ConvertStringToBuffer(LPCTSTR lpszString, CZipAutoBuffer& buffer, UINT uCodePage) { #ifdef _UNICODE ZipPlatform::WideToMultiByte(lpszString, buffer, uCodePage); #else int iLen = (int)strlen(lpszString); // iLen does not include the NULL character buffer.Allocate(iLen); memcpy(buffer, lpszString, (size_t)iLen); if (uCodePage == CP_OEMCP) ZipPlatform::AnsiOem(buffer, true); #endif }