|
|
#include "stdafx.h"
#include "ConvEng.h"
#include "Msg.h"
#include "TextFile.h"
#include "FileConv.h"
static BYTE* g_pbyData = NULL;
DWORD GetFileSize( PCTCH ptszFileName) { WIN32_FIND_DATA sFindFileData; HANDLE hFind;
hFind = FindFirstFile(ptszFileName, &sFindFileData);
if (hFind == INVALID_HANDLE_VALUE) { return 0; } else { FindClose(hFind); // Can't handle file great than 4G
if (sFindFileData.nFileSizeHigh) { return 0; } return sFindFileData.nFileSizeLow; } }
BOOL OpenFile( PCTCH ptszFileName) { FILE* pFile = NULL; BOOL fSuccess = FALSE; DWORD dwFileSize = 0;
if (lstrlen(ptszFileName) >= MAX_PATH) { goto Exit; }
dwFileSize = GetFileSize(ptszFileName); if (!dwFileSize) { goto Exit; }
if (g_pbyData) { // There must be something wrong, however, we can try to handle this fail.
ASSERT(FALSE); delete[] g_pbyData; g_pbyData = NULL; }
g_pbyData = new BYTE[dwFileSize]; if (!g_pbyData) { goto Exit; }
pFile = _tfopen(ptszFileName, TEXT("rb")); if (!pFile) { goto Exit; }
if (fread(g_pbyData, dwFileSize, 1, pFile) != 1) { goto Exit; }
fSuccess = TRUE;
Exit: if (pFile) { fclose(pFile); pFile = NULL; } if (!fSuccess && g_pbyData) { delete[] g_pbyData; g_pbyData = NULL; } if (fSuccess) { return dwFileSize; } return 0; }
void CloseFile(void) { if (g_pbyData) { delete[] g_pbyData; g_pbyData = NULL; } }
BOOL Convert( PCTCH tszSourceFileName, PCTCH tszTargetFileName, BOOL fAnsiToUnicode) { enum { FILETYPE_TEXT, FILETYPE_RTF, FILETYPE_HTML, FILETYPE_XML, } eFileType;
BOOL fRet = FALSE; DWORD dwFileSize; int nTargetFileSize; BYTE* pbyTarget = NULL; FILE* pFile = NULL; DWORD dwTargetBufSize = 0; PCTCH tszExt = NULL; PTCH tszExtBuf = NULL;
// File format
// Find last '.'
if (lstrlen(tszSourceFileName) > MAX_PATH) { MsgOpenSourceFileError(tszSourceFileName); goto Exit; }
tszExt = tszSourceFileName + lstrlen(tszSourceFileName); for (; tszExt >= tszSourceFileName && *tszExt != TEXT('.'); tszExt--); if (tszExt < tszSourceFileName) { // not find '.', no ext
tszExt = tszSourceFileName + lstrlen(tszSourceFileName); } else { // find '.', skip dot
tszExt ++; } tszExtBuf = new TCHAR [tszSourceFileName + lstrlen(tszSourceFileName) - tszExt + 1]; if (!tszExtBuf) { MsgOverflow(); goto Exit; } lstrcpy(tszExtBuf, tszExt); _strlwr(tszExtBuf);
if (_tcscmp(tszExtBuf, TEXT("txt")) == 0) { eFileType = FILETYPE_TEXT; #ifdef RTF_SUPPORT
} else if (_tcscmp(tszExtBuf, TEXT("rtf")) == 0) { eFileType = FILETYPE_RTF; #endif
} else if (_tcscmp(tszExtBuf, TEXT("htm")) == 0 || _tcscmp(tszExtBuf, TEXT("html")) == 0) { eFileType = FILETYPE_HTML; #ifdef XLM_SUPPORT
} else if (_tcscmp(tszExtBuf, TEXT("xml")) == 0) { eFileType = FILETYPE_XML; #endif
} else { MsgUnrecognizedFileType(tszSourceFileName); goto Exit; }
if (0 == (dwFileSize = OpenFile(tszSourceFileName))) { MsgOpenSourceFileError(tszSourceFileName); goto Exit; }
if (dwFileSize == 0 || dwFileSize == (DWORD)(-1)) { MsgOpenSourceFileError(tszSourceFileName); goto Exit; }
// In worst case the text file size will double in each direct convert.
// 64, for Htlm head information convert and Unicode file flag
dwTargetBufSize = dwFileSize*2 + 64;
pbyTarget = new BYTE[dwTargetBufSize]; if (!pbyTarget) { MsgOverflow(); goto Exit; } pFile = _tfopen(tszTargetFileName, TEXT("r")); if (pFile) { MsgTargetFileExist(tszTargetFileName); fclose(pFile); pFile = NULL; goto Exit; }
// Convert
switch(eFileType) { case FILETYPE_TEXT: if (!ConvertTextFile(g_pbyData, dwFileSize, pbyTarget, dwTargetBufSize, fAnsiToUnicode, &nTargetFileSize)) { goto Exit; } break;
#ifdef RTF_SUPPORT
case FILETYPE_RTF: if (!ConvertRtfFile(g_pbyData, dwFileSize, pbyTarget, dwTargetBufSize, fAnsiToUnicode, &nTargetFileSize)) { goto Exit; } break; #endif
case FILETYPE_HTML: if (!ConvertHtmlFile(g_pbyData, dwFileSize, pbyTarget, dwTargetBufSize, fAnsiToUnicode, &nTargetFileSize)) { goto Exit; } break;
#ifdef XML_SUPPORT
case FILETYPE_XML: if (!ConvertXmlFile(g_pbyData, dwFileSize, pbyTarget, dwTargetBufSize, fAnsiToUnicode, &nTargetFileSize)) { goto Exit; } break; #endif
default: break; }
pFile = _tfopen(tszTargetFileName, TEXT("wb")); if (!pFile) { goto Exit; }
dwFileSize = (DWORD)fwrite(pbyTarget, nTargetFileSize, 1, pFile); if (dwFileSize < 1) { MsgWriteFileError(); goto Exit; }
fRet = TRUE;
Exit: if (tszExtBuf) { delete[] tszExtBuf; tszExtBuf = NULL; } if (pbyTarget) { delete[] pbyTarget; pbyTarget = NULL; } if (pFile) { fclose(pFile); pFile = NULL; } CloseFile();
return fRet; }
BOOL GenerateTargetFileName( PCTCH tszSrc, CString* pstrTar, BOOL fAnsiToUnicode) { // Find last '.'
PCTCH tszExt = tszSrc + lstrlen(tszSrc); for (; tszExt >= tszSrc && *tszExt != TEXT('.'); tszExt--);
if (tszExt < tszSrc) { // not find '.', no ext
tszExt = tszSrc + lstrlen(tszSrc); } else { // find '.'
}
try { *pstrTar = tszSrc; *pstrTar = pstrTar->Left((int)(tszExt - tszSrc)); *pstrTar += fAnsiToUnicode ? TEXT(".Unicode") : TEXT(".GB"); *pstrTar += tszExt; } catch (...) { MsgOverflow(); return FALSE; } if (pstrTar->GetLength() >= MAX_PATH) { return FALSE; } return TRUE; }
|