You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
473 lines
9.3 KiB
C++
473 lines
9.3 KiB
C++
2 years ago
|
// XTPMemFile.cpp : implementation of the CXTPMemFile class.
|
||
|
//
|
||
|
// This file is a part of the XTREME CONTROLS MFC class library.
|
||
|
// (c)1998-2012 Codejock Software, All Rights Reserved.
|
||
|
//
|
||
|
// THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
|
||
|
// RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
|
||
|
// CONSENT OF CODEJOCK SOFTWARE.
|
||
|
//
|
||
|
// THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
|
||
|
// IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
|
||
|
// YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
|
||
|
// SINGLE COMPUTER.
|
||
|
//
|
||
|
// CONTACT INFORMATION:
|
||
|
// support@codejock.com
|
||
|
// http://www.codejock.com
|
||
|
//
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
#include "XTPMemFile.h"
|
||
|
|
||
|
#ifdef _DEBUG
|
||
|
#undef THIS_FILE
|
||
|
static char THIS_FILE[] = __FILE__;
|
||
|
#define new DEBUG_NEW
|
||
|
#endif
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CXTPMemFile
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
CXTPMemFile::CXTPMemFile(UINT nGrowBytes)
|
||
|
: CMemFile (nGrowBytes)
|
||
|
{
|
||
|
// Modified default constructor
|
||
|
m_File.m_hFile = NULL;
|
||
|
m_bOpen = false;
|
||
|
m_uiOpenFlags = 0;
|
||
|
}
|
||
|
|
||
|
CXTPMemFile::CXTPMemFile(BYTE* lpBuffer, UINT nBufferSize, UINT nGrowBytes)
|
||
|
: CMemFile (lpBuffer, nBufferSize, nGrowBytes)
|
||
|
{
|
||
|
// Modified default constructor
|
||
|
m_File.m_hFile = NULL;
|
||
|
m_bOpen = false;
|
||
|
m_uiOpenFlags = 0;
|
||
|
}
|
||
|
|
||
|
CXTPMemFile::CXTPMemFile(LPCTSTR lpszFilename, UINT uiOpenFlags)
|
||
|
{
|
||
|
// CFile compatible constructor
|
||
|
m_File.m_hFile = NULL;
|
||
|
m_bOpen = false;
|
||
|
m_uiOpenFlags = uiOpenFlags;
|
||
|
Open(lpszFilename, uiOpenFlags);
|
||
|
}
|
||
|
|
||
|
CXTPMemFile::~CXTPMemFile()
|
||
|
{
|
||
|
if (m_bOpen)
|
||
|
Close();
|
||
|
m_File.m_hFile = NULL;
|
||
|
m_uiOpenFlags = 0;
|
||
|
}
|
||
|
|
||
|
// Implementation
|
||
|
|
||
|
BOOL CXTPMemFile::ReadString(CString& rString)
|
||
|
{
|
||
|
// Readstring Beta Version
|
||
|
|
||
|
rString.Empty();
|
||
|
char ch;
|
||
|
|
||
|
bool bFound = false;
|
||
|
while (GetPosition() < GetLength())
|
||
|
{
|
||
|
Read(&ch, 1);
|
||
|
|
||
|
bFound = (ch == '\x0D');
|
||
|
if (bFound || (ch == '\x0'))
|
||
|
break;
|
||
|
else
|
||
|
rString = rString + ch;
|
||
|
}
|
||
|
if (bFound)
|
||
|
{
|
||
|
Read(&ch, 1);
|
||
|
if (ch != '\x0A')
|
||
|
Seek(-1, current);
|
||
|
}
|
||
|
|
||
|
if (rString.GetLength() > 0)
|
||
|
return true;
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
void CXTPMemFile::WriteString(LPCTSTR lpsz)
|
||
|
{
|
||
|
// WriteString Beta Version
|
||
|
|
||
|
if (_tcslen(lpsz) > 0)
|
||
|
{
|
||
|
UINT iCount;
|
||
|
for (iCount = 0; iCount < _tcslen(lpsz); iCount++)
|
||
|
if ((lpsz[iCount] != '\x0D') && (lpsz[iCount] != '\x00'))
|
||
|
Write(&lpsz[iCount], 1);
|
||
|
}
|
||
|
char ch = '\x0D';
|
||
|
Write(&ch, 1);
|
||
|
ch = '\x0A';
|
||
|
Write(&ch, 1);
|
||
|
|
||
|
}
|
||
|
|
||
|
bool CXTPMemFile::Duplicate(CFile* fDuplicate)
|
||
|
{
|
||
|
// Standard Copy Routine
|
||
|
|
||
|
BYTE *pbData = new BYTE[1024];
|
||
|
DWORD dwPos = (DWORD)GetPosition();
|
||
|
SeekToBegin();
|
||
|
fDuplicate->SetLength(0);
|
||
|
while (GetPosition() < GetLength())
|
||
|
{
|
||
|
DWORD dwRead = Read(pbData, 1024);
|
||
|
fDuplicate->Write(pbData, dwRead);
|
||
|
}
|
||
|
Seek(dwPos, fDuplicate->begin);
|
||
|
delete[] pbData;
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
bool CXTPMemFile::Duplicate(LPCTSTR strDup)
|
||
|
{
|
||
|
// Duplicate With CString compatibility
|
||
|
|
||
|
CFile file(strDup, CFile::modeCreate | CFile::modeWrite);
|
||
|
bool bResult = Duplicate(&file);
|
||
|
file.Close();
|
||
|
return bResult;
|
||
|
}
|
||
|
|
||
|
CFile* CXTPMemFile::Duplicate() const
|
||
|
{
|
||
|
return CMemFile::Duplicate();
|
||
|
}
|
||
|
|
||
|
BOOL CXTPMemFile::Open(LPCTSTR lpszFileName, UINT nOpenFlags, CFileException* pError /*= NULL*/)
|
||
|
{
|
||
|
// CFile compatible Open
|
||
|
|
||
|
if (m_File.m_hFile != NULL)
|
||
|
return false;
|
||
|
if (m_File.Open(lpszFileName, nOpenFlags, pError))
|
||
|
{
|
||
|
m_uiOpenFlags = nOpenFlags;
|
||
|
Load();
|
||
|
m_bOpen = true;
|
||
|
return true;
|
||
|
}
|
||
|
else
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
bool CXTPMemFile::Save()
|
||
|
{
|
||
|
if (m_File.m_hFile == NULL)
|
||
|
return false;
|
||
|
CString str;
|
||
|
|
||
|
// Check if the physical file has write access
|
||
|
if (!(m_uiOpenFlags & modeWrite) && !(m_uiOpenFlags & modeReadWrite))
|
||
|
{
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
DWORD dwPos = (DWORD)GetPosition();
|
||
|
DWORD dwLength = 1024;
|
||
|
BYTE *pData = new BYTE[dwLength];
|
||
|
if (pData == NULL)
|
||
|
return false;
|
||
|
SeekToBegin();
|
||
|
m_File.SetLength(0);
|
||
|
while (GetPosition() < GetLength())
|
||
|
{
|
||
|
DWORD dwRead = Read(pData, dwLength);
|
||
|
m_File.Write(pData, dwRead);
|
||
|
}
|
||
|
Seek(dwPos, begin);
|
||
|
delete[] pData;
|
||
|
m_File.Flush();
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
bool CXTPMemFile::Load()
|
||
|
{
|
||
|
if (m_File.m_hFile == NULL)
|
||
|
return false;
|
||
|
|
||
|
DWORD dwLength = 1024;
|
||
|
BYTE *pData = new BYTE[dwLength];
|
||
|
if (pData == NULL)
|
||
|
return false;
|
||
|
SeekToBegin();
|
||
|
SetLength(0);
|
||
|
m_File.SeekToBegin();
|
||
|
while (m_File.GetPosition() < m_File.GetLength())
|
||
|
{
|
||
|
DWORD dwRead = m_File.Read(pData, dwLength);
|
||
|
Write(pData, dwRead);
|
||
|
}
|
||
|
|
||
|
delete[] pData;
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
void CXTPMemFile::Close()
|
||
|
{
|
||
|
if ((m_File.m_hFile != NULL) && m_bOpen)
|
||
|
{
|
||
|
m_bOpen = false;
|
||
|
Save();
|
||
|
m_File.Close();
|
||
|
m_File.m_hFile = NULL;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CXTPMemFile::Flush()
|
||
|
{
|
||
|
CMemFile::Flush();
|
||
|
Save();
|
||
|
}
|
||
|
|
||
|
bool CXTPMemFile::Discard()
|
||
|
{
|
||
|
return Load();
|
||
|
}
|
||
|
|
||
|
bool CXTPMemFile::Import(CFile* fImp)
|
||
|
{
|
||
|
if ((fImp == NULL) || (fImp->m_hFile == NULL))
|
||
|
return false;
|
||
|
|
||
|
DWORD dwLength = 1024;
|
||
|
BYTE *pData = new BYTE[dwLength];
|
||
|
if (pData == NULL)
|
||
|
return false;
|
||
|
SeekToBegin();
|
||
|
SetLength(0);
|
||
|
fImp->SeekToBegin();
|
||
|
while (fImp->GetPosition() < fImp->GetLength())
|
||
|
{
|
||
|
DWORD dwRead = fImp->Read(pData, dwLength);
|
||
|
Write(pData, dwRead);
|
||
|
}
|
||
|
|
||
|
delete[] pData;
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
bool CXTPMemFile::Append(CFile* fApp)
|
||
|
{
|
||
|
if ((fApp == NULL) || (fApp->m_hFile == NULL))
|
||
|
return false;
|
||
|
|
||
|
DWORD dwLength = 1024;
|
||
|
BYTE *pData = new BYTE[dwLength];
|
||
|
if (pData == NULL)
|
||
|
return false;
|
||
|
SeekToEnd();
|
||
|
fApp->SeekToBegin();
|
||
|
while (fApp->GetPosition() < fApp->GetLength())
|
||
|
{
|
||
|
DWORD dwRead = fApp->Read(pData, dwLength);
|
||
|
Write(pData, dwRead);
|
||
|
}
|
||
|
|
||
|
delete[] pData;
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
DWORD CXTPMemFile::Insert(CFile* fSrc, DWORD dwSourcePos, DWORD dwDestPos, DWORD dwBytes)
|
||
|
{
|
||
|
if (dwBytes == 0)
|
||
|
return 0;
|
||
|
|
||
|
CXTPMemFile fPreIns;
|
||
|
CXTPMemFile fIns;
|
||
|
CXTPMemFile fPostIns;
|
||
|
CXTPMemFile fComplete;
|
||
|
|
||
|
Extract(&fPreIns, 0, dwDestPos); // Extract Data BEFORE insertion point
|
||
|
Extract(&fPostIns, dwDestPos, (DWORD)((DWORD)GetLength() - dwDestPos)); // Extract Data AFTER intertion point
|
||
|
|
||
|
// Extract the "to be inserted" Data from the (fSrc) Source file
|
||
|
{
|
||
|
DWORD dwLength = 1024;
|
||
|
DWORD dwCounter = 0;
|
||
|
BYTE *pData = new BYTE[dwLength];
|
||
|
if (pData == NULL)
|
||
|
return 0;
|
||
|
fSrc->Seek(dwSourcePos, begin);
|
||
|
|
||
|
while (((fSrc->GetPosition() - dwSourcePos) < dwBytes) && (fSrc->GetPosition() < fSrc->GetLength()))
|
||
|
{
|
||
|
DWORD dwRead = fSrc->Read(pData, dwLength);
|
||
|
if (dwCounter + dwRead > dwSourcePos + dwBytes)
|
||
|
dwRead = dwBytes - dwCounter;
|
||
|
fIns.Write(pData, dwRead);
|
||
|
dwCounter += dwRead;
|
||
|
}
|
||
|
delete[] pData;
|
||
|
} // Finished Extraction
|
||
|
|
||
|
|
||
|
fComplete += &fPreIns; // Append BEFORE Data
|
||
|
fComplete += &fIns; // Append the "to be inserted" Data
|
||
|
fComplete += &fPostIns; // Append the AFTER Data
|
||
|
|
||
|
*this = &fComplete; // Copy completed File
|
||
|
|
||
|
return (DWORD)fIns.GetLength();
|
||
|
}
|
||
|
|
||
|
DWORD CXTPMemFile::Insert(LPCTSTR strSrc, DWORD dwSourcePos, DWORD dwDestPos, DWORD dwBytes)
|
||
|
{
|
||
|
CFile file(strSrc, CFile::modeRead);
|
||
|
DWORD dwResult = Insert(&file, dwSourcePos, dwDestPos, dwBytes);
|
||
|
file.Close();
|
||
|
return dwResult;
|
||
|
}
|
||
|
|
||
|
DWORD CXTPMemFile::Extract(CFile* fDest, DWORD dwStartPos, DWORD dwBytes)
|
||
|
{
|
||
|
if (dwBytes == 0)
|
||
|
return 0;
|
||
|
DWORD dwPos = (DWORD)GetPosition();
|
||
|
DWORD dwLength = 1024;
|
||
|
DWORD dwCounter = 0;
|
||
|
BYTE *pData = new BYTE[dwLength];
|
||
|
if (pData == NULL)
|
||
|
return 0;
|
||
|
Seek(dwStartPos, begin);
|
||
|
|
||
|
while (((GetPosition() - dwStartPos) < dwBytes) && (GetPosition() < GetLength()))
|
||
|
{
|
||
|
DWORD dwRead = Read(pData, dwLength);
|
||
|
if (dwCounter + dwRead > dwStartPos + dwBytes)
|
||
|
dwRead = dwBytes - dwCounter;
|
||
|
fDest->Write(pData, dwRead);
|
||
|
dwCounter += dwRead;
|
||
|
}
|
||
|
Seek(dwPos, begin);
|
||
|
delete[] pData;
|
||
|
fDest->Flush();
|
||
|
return dwCounter;
|
||
|
|
||
|
}
|
||
|
|
||
|
DWORD CXTPMemFile::Extract(LPCTSTR strDest, DWORD dwStartPos, DWORD dwBytes)
|
||
|
{
|
||
|
CFile file(strDest, CFile::modeCreate | CFile::modeWrite);
|
||
|
DWORD dwResult = Extract(&file, dwStartPos, dwBytes);
|
||
|
file.Close();
|
||
|
return dwResult;
|
||
|
}
|
||
|
|
||
|
// Overloaded Operators
|
||
|
|
||
|
void CXTPMemFile::operator=(CFile* fDup)
|
||
|
{
|
||
|
Import(fDup);
|
||
|
}
|
||
|
|
||
|
void CXTPMemFile::operator=(CString strDup)
|
||
|
{
|
||
|
CFile file;
|
||
|
if (file.Open(strDup, CFile::modeRead))
|
||
|
{
|
||
|
Import(&file);
|
||
|
file.Close();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CXTPMemFile::operator=(DWORD dwFilePos)
|
||
|
{
|
||
|
Seek(dwFilePos, begin);
|
||
|
}
|
||
|
|
||
|
void CXTPMemFile::operator+=(CFile* fApp)
|
||
|
{
|
||
|
Append(fApp);
|
||
|
}
|
||
|
|
||
|
void CXTPMemFile::operator+=(CString strApp)
|
||
|
{
|
||
|
CFile file;
|
||
|
if (file.Open(strApp, CFile::modeRead))
|
||
|
{
|
||
|
Append(&file);
|
||
|
file.Close();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Indexing Operators
|
||
|
|
||
|
BYTE CXTPMemFile::operator[](DWORD dwFilePos)
|
||
|
{
|
||
|
if (dwFilePos > GetLength() -1)
|
||
|
return 0;
|
||
|
|
||
|
BYTE bTemp;
|
||
|
Seek(dwFilePos, begin);
|
||
|
Read(&bTemp, sizeof(BYTE));
|
||
|
return bTemp;
|
||
|
}
|
||
|
|
||
|
LONG CXTPMemFile::FindData(void* pData, DWORD dwDataLen, LONG lStartPos)
|
||
|
{
|
||
|
BYTE* pBytes = (BYTE*)pData;
|
||
|
|
||
|
|
||
|
Seek(lStartPos, begin);
|
||
|
|
||
|
bool bFoundAll = false;
|
||
|
LONG lPos = -1;
|
||
|
|
||
|
while ((!bFoundAll) && (GetPosition() < GetLength()))
|
||
|
{
|
||
|
bool bFoundFirst = false;
|
||
|
|
||
|
while ((!bFoundFirst) && (GetPosition() < GetLength()))
|
||
|
{
|
||
|
lPos = (LONG)GetPosition();
|
||
|
BYTE read;
|
||
|
Read(&read, 1);
|
||
|
if (read != pBytes[0])
|
||
|
continue;
|
||
|
|
||
|
bFoundFirst = true;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
//Hier Die Restlichen Bytes (dwDataLen -1) vergleichen
|
||
|
|
||
|
DWORD i = 1;
|
||
|
bool bFound = true;
|
||
|
|
||
|
while ((i < dwDataLen) && (GetPosition() < GetLength()) && bFoundFirst)
|
||
|
{
|
||
|
BYTE read;
|
||
|
Read(&read, 1);
|
||
|
if (read == pBytes[i++])
|
||
|
continue;
|
||
|
|
||
|
bFound = false;
|
||
|
Seek(lPos + 1, begin);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
bFoundAll = bFound && bFoundFirst;
|
||
|
}
|
||
|
|
||
|
lPos = bFoundAll ? lPos : -1;
|
||
|
// while (bFound && (iPos < strSeek.GetLength())
|
||
|
// {
|
||
|
// }
|
||
|
return lPos;
|
||
|
}
|