XTMemFile.cpp
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:10k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // XTMemFile.cpp : implementation of the CXTMemFile class.
  2. //
  3. // This file is a part of the XTREME CONTROLS MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. #include "stdafx.h"
  21. #include "XTMemFile.h"
  22. #ifdef _DEBUG
  23. #undef THIS_FILE
  24. static char THIS_FILE[] = __FILE__;
  25. #define new DEBUG_NEW
  26. #endif
  27. /////////////////////////////////////////////////////////////////////////////
  28. // CXTMemFile
  29. /////////////////////////////////////////////////////////////////////////////
  30. CXTMemFile::CXTMemFile(UINT nGrowBytes)
  31. : CMemFile (nGrowBytes)
  32. {
  33. // Modified default constructor
  34. m_File.m_hFile = NULL;
  35. m_bOpen = false;
  36. m_uiOpenFlags = 0;
  37. }
  38. CXTMemFile::CXTMemFile(BYTE* lpBuffer, UINT nBufferSize, UINT nGrowBytes)
  39. : CMemFile (lpBuffer, nBufferSize, nGrowBytes)
  40. {
  41. // Modified default constructor
  42. m_File.m_hFile = NULL;
  43. m_bOpen = false;
  44. m_uiOpenFlags = 0;
  45. }
  46. CXTMemFile::CXTMemFile(LPCTSTR lpszFilename, UINT uiOpenFlags)
  47. {
  48. // CFile compatible constructor
  49. m_File.m_hFile = NULL;
  50. m_bOpen = false;
  51. m_uiOpenFlags = uiOpenFlags;
  52. Open(lpszFilename, uiOpenFlags);
  53. }
  54. CXTMemFile::~CXTMemFile()
  55. {
  56. if (m_bOpen)
  57. Close();
  58. m_File.m_hFile = NULL;
  59. m_uiOpenFlags = 0;
  60. }
  61. // Implementation
  62. BOOL CXTMemFile::ReadString(CString& rString)
  63. {
  64. // Readstring Beta Version
  65. rString.Empty();
  66. char ch;
  67. bool bFound = false;
  68. while (GetPosition() < GetLength())
  69. {
  70. Read(&ch, 1);
  71. bFound = (ch == 'x0D');
  72. if (bFound || (ch == 'x0'))
  73. break;
  74. else
  75. rString = rString + ch;
  76. }
  77. if (bFound)
  78. {
  79. Read(&ch, 1);
  80. if (ch != 'x0A')
  81. Seek(-1, current);
  82. }
  83. if (rString.GetLength() > 0)
  84. return true;
  85. return false;
  86. }
  87. void CXTMemFile::WriteString(LPCTSTR lpsz)
  88. {
  89. // WriteString Beta Version
  90. if (_tcslen(lpsz) > 0)
  91. {
  92. UINT iCount;
  93. for (iCount = 0; iCount < _tcslen(lpsz); iCount++)
  94. if ((lpsz[iCount] != 'x0D') && (lpsz[iCount] != 'x00'))
  95. Write(&lpsz[iCount], 1);
  96. }
  97. char ch = 'x0D';
  98. Write(&ch, 1);
  99. ch = 'x0A';
  100. Write(&ch, 1);
  101. }
  102. bool CXTMemFile::Duplicate(CFile* fDuplicate)
  103. {
  104. // Standard Copy Routine
  105. BYTE *pbData = new BYTE[1024];
  106. DWORD dwPos = (DWORD)GetPosition();
  107. SeekToBegin();
  108. fDuplicate->SetLength(0);
  109. while (GetPosition() < GetLength())
  110. {
  111. DWORD dwRead = Read(pbData, 1024);
  112. fDuplicate->Write(pbData, dwRead);
  113. }
  114. Seek(dwPos, fDuplicate->begin);
  115. delete[] pbData;
  116. return true;
  117. }
  118. bool CXTMemFile::Duplicate(LPCTSTR strDup)
  119. {
  120. // Duplicate With CString compatibility
  121. CFile file(strDup, CFile::modeCreate | CFile::modeWrite);
  122. bool bResult = Duplicate(&file);
  123. file.Close();
  124. return bResult;
  125. }
  126. CFile* CXTMemFile::Duplicate() const
  127. {
  128. return CMemFile::Duplicate();
  129. }
  130. BOOL CXTMemFile::Open(LPCTSTR lpszFileName, UINT nOpenFlags, CFileException* pError /*= NULL*/)
  131. {
  132. // CFile compatible Open
  133. if (m_File.m_hFile != NULL)
  134. return false;
  135. if (m_File.Open(lpszFileName, nOpenFlags, pError))
  136. {
  137. m_uiOpenFlags = nOpenFlags;
  138. Load();
  139. m_bOpen = true;
  140. return true;
  141. }
  142. else
  143. return false;
  144. }
  145. bool CXTMemFile::Save()
  146. {
  147. if (m_File.m_hFile == NULL)
  148. return false;
  149. CString str;
  150. // Check if the physical file has write access
  151. if (!(m_uiOpenFlags & modeWrite) && !(m_uiOpenFlags & modeReadWrite))
  152. {
  153. return false;
  154. }
  155. DWORD dwPos = (DWORD)GetPosition();
  156. DWORD dwLength = 1024;
  157. BYTE *pData = new BYTE[dwLength];
  158. if (pData == NULL)
  159. return false;
  160. SeekToBegin();
  161. m_File.SetLength(0);
  162. while (GetPosition() < GetLength())
  163. {
  164. DWORD dwRead = Read(pData, dwLength);
  165. m_File.Write(pData, dwRead);
  166. }
  167. Seek(dwPos, begin);
  168. delete[] pData;
  169. m_File.Flush();
  170. return true;
  171. }
  172. bool CXTMemFile::Load()
  173. {
  174. if (m_File.m_hFile == NULL)
  175. return false;
  176. DWORD dwLength = 1024;
  177. BYTE *pData = new BYTE[dwLength];
  178. if (pData == NULL)
  179. return false;
  180. SeekToBegin();
  181. SetLength(0);
  182. m_File.SeekToBegin();
  183. while (m_File.GetPosition() < m_File.GetLength())
  184. {
  185. DWORD dwRead = m_File.Read(pData, dwLength);
  186. Write(pData, dwRead);
  187. }
  188. delete[] pData;
  189. return true;
  190. }
  191. void CXTMemFile::Close()
  192. {
  193. if ((m_File.m_hFile != NULL) && m_bOpen)
  194. {
  195. m_bOpen = false;
  196. Save();
  197. m_File.Close();
  198. m_File.m_hFile = NULL;
  199. }
  200. }
  201. void CXTMemFile::Flush()
  202. {
  203. CMemFile::Flush();
  204. Save();
  205. }
  206. bool CXTMemFile::Discard()
  207. {
  208. return Load();
  209. }
  210. bool CXTMemFile::Import(CFile* fImp)
  211. {
  212. if ((fImp == NULL) || (fImp->m_hFile == NULL))
  213. return false;
  214. DWORD dwLength = 1024;
  215. BYTE *pData = new BYTE[dwLength];
  216. if (pData == NULL)
  217. return false;
  218. SeekToBegin();
  219. SetLength(0);
  220. fImp->SeekToBegin();
  221. while (fImp->GetPosition() < fImp->GetLength())
  222. {
  223. DWORD dwRead = fImp->Read(pData, dwLength);
  224. Write(pData, dwRead);
  225. }
  226. delete[] pData;
  227. return true;
  228. }
  229. bool CXTMemFile::Append(CFile* fApp)
  230. {
  231. if ((fApp == NULL) || (fApp->m_hFile == NULL))
  232. return false;
  233. DWORD dwLength = 1024;
  234. BYTE *pData = new BYTE[dwLength];
  235. if (pData == NULL)
  236. return false;
  237. SeekToEnd();
  238. fApp->SeekToBegin();
  239. while (fApp->GetPosition() < fApp->GetLength())
  240. {
  241. DWORD dwRead = fApp->Read(pData, dwLength);
  242. Write(pData, dwRead);
  243. }
  244. delete[] pData;
  245. return true;
  246. }
  247. DWORD CXTMemFile::Insert(CFile* fSrc, DWORD dwSourcePos, DWORD dwDestPos, DWORD dwBytes)
  248. {
  249. if (dwBytes == 0)
  250. return 0;
  251. CXTMemFile fPreIns;
  252. CXTMemFile fIns;
  253. CXTMemFile fPostIns;
  254. CXTMemFile fComplete;
  255. Extract(&fPreIns, 0, dwDestPos); // Extract Data BEFORE insertion point
  256. Extract(&fPostIns, dwDestPos, (DWORD)((DWORD)GetLength() - dwDestPos)); // Extract Data AFTER intertion point
  257. // Extract the "to be inserted" Data from the (fSrc) Source file
  258. {
  259. DWORD dwLength = 1024;
  260. DWORD dwCounter = 0;
  261. BYTE *pData = new BYTE[dwLength];
  262. if (pData == NULL)
  263. return 0;
  264. fSrc->Seek(dwSourcePos, begin);
  265. while (((fSrc->GetPosition() - dwSourcePos) < dwBytes) && (fSrc->GetPosition() < fSrc->GetLength()))
  266. {
  267. DWORD dwRead = fSrc->Read(pData, dwLength);
  268. if (dwCounter + dwRead > dwSourcePos + dwBytes)
  269. dwRead = dwBytes - dwCounter;
  270. fIns.Write(pData, dwRead);
  271. dwCounter += dwRead;
  272. }
  273. delete[] pData;
  274. } // Finished Extraction
  275. fComplete += &fPreIns; // Append BEFORE Data
  276. fComplete += &fIns; // Append the "to be inserted" Data
  277. fComplete += &fPostIns;  // Append the AFTER Data
  278. *this = &fComplete; // Copy completed File
  279. return (DWORD)fIns.GetLength();
  280. }
  281. DWORD CXTMemFile::Insert(LPCTSTR strSrc, DWORD dwSourcePos, DWORD dwDestPos, DWORD dwBytes)
  282. {
  283. CFile file(strSrc, CFile::modeRead);
  284. DWORD dwResult = Insert(&file, dwSourcePos, dwDestPos, dwBytes);
  285. file.Close();
  286. return dwResult;
  287. }
  288. DWORD CXTMemFile::Extract(CFile* fDest, DWORD dwStartPos, DWORD dwBytes)
  289. {
  290. if (dwBytes == 0)
  291. return 0;
  292. DWORD dwPos = (DWORD)GetPosition();
  293. DWORD dwLength = 1024;
  294. DWORD dwCounter = 0;
  295. BYTE *pData = new BYTE[dwLength];
  296. if (pData == NULL)
  297. return 0;
  298. Seek(dwStartPos, begin);
  299. while (((GetPosition() - dwStartPos) < dwBytes) && (GetPosition() < GetLength()))
  300. {
  301. DWORD dwRead = Read(pData, dwLength);
  302. if (dwCounter + dwRead > dwStartPos + dwBytes)
  303. dwRead = dwBytes - dwCounter;
  304. fDest->Write(pData, dwRead);
  305. dwCounter += dwRead;
  306. }
  307. Seek(dwPos, begin);
  308. delete[] pData;
  309. fDest->Flush();
  310. return dwCounter;
  311. }
  312. DWORD CXTMemFile::Extract(LPCTSTR strDest, DWORD dwStartPos, DWORD dwBytes)
  313. {
  314. CFile file(strDest, CFile::modeCreate | CFile::modeWrite);
  315. DWORD dwResult = Extract(&file, dwStartPos, dwBytes);
  316. file.Close();
  317. return dwResult;
  318. }
  319. // Overloaded Operators
  320. void CXTMemFile::operator=(CFile* fDup)
  321. {
  322. Import(fDup);
  323. }
  324. void CXTMemFile::operator=(CString strDup)
  325. {
  326. CFile file;
  327. if (file.Open(strDup, CFile::modeRead))
  328. {
  329. Import(&file);
  330. file.Close();
  331. }
  332. }
  333. void CXTMemFile::operator=(DWORD dwFilePos)
  334. {
  335. Seek(dwFilePos, begin);
  336. }
  337. void CXTMemFile::operator+=(CFile* fApp)
  338. {
  339. Append(fApp);
  340. }
  341. void CXTMemFile::operator+=(CString strApp)
  342. {
  343. CFile file;
  344. if (file.Open(strApp, CFile::modeRead))
  345. {
  346. Append(&file);
  347. file.Close();
  348. }
  349. }
  350. // Indexing Operators
  351. BYTE CXTMemFile::operator[](DWORD dwFilePos)
  352. {
  353. if (dwFilePos > GetLength() -1)
  354. return 0;
  355. BYTE bTemp;
  356. Seek(dwFilePos, begin);
  357. Read(&bTemp, sizeof(BYTE));
  358. return bTemp;
  359. }
  360. LONG CXTMemFile::FindData(void* pData, DWORD dwDataLen, LONG lStartPos)
  361. {
  362. BYTE* pBytes = (BYTE*)pData;
  363. Seek(lStartPos, begin);
  364. bool bFoundAll = false;
  365. LONG lPos = -1;
  366. while ((!bFoundAll) && (GetPosition() < GetLength()))
  367. {
  368. bool bFoundFirst = false;
  369. while ((!bFoundFirst) && (GetPosition() < GetLength()))
  370. {
  371. lPos = (LONG)GetPosition();
  372. BYTE read;
  373. Read(&read, 1);
  374. if (read != pBytes[0])
  375. continue;
  376. bFoundFirst = true;
  377. break;
  378. }
  379. //Hier Die Restlichen Bytes (dwDataLen -1) vergleichen
  380. DWORD i = 1;
  381. bool bFound = true;
  382. while ((i < dwDataLen) && (GetPosition() < GetLength()) && bFoundFirst)
  383. {
  384. BYTE read;
  385. Read(&read, 1);
  386. if (read == pBytes[i++])
  387. continue;
  388. bFound = false;
  389. Seek(lPos + 1, begin);
  390. break;
  391. }
  392. bFoundAll = bFound && bFoundFirst;
  393. }
  394. lPos = bFoundAll ? lPos : -1;
  395. //  while (bFound && (iPos < strSeek.GetLength())
  396. //  {
  397. //  }
  398. return lPos;
  399. }