Buffer.cpp
上传用户:hkcoast
上传日期:2007-01-12
资源大小:979k
文件大小:12k
源码类别:

手机短信编程

开发平台:

Visual C++

  1. // Buffer.cpp: implementation of the CBuffer class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "Buffer.h"
  6. #include "Math.h"
  7. #ifdef _DEBUG
  8. #undef THIS_FILE
  9. static char THIS_FILE[]=__FILE__;
  10. #define new DEBUG_NEW
  11. #endif
  12. static int nTest = 0;
  13. //////////////////////////////////////////////////////////////////////
  14. // Construction/Destruction
  15. //////////////////////////////////////////////////////////////////////
  16. ////////////////////////////////////////////////////////////////////////////////
  17. // 
  18. // FUNCTION: CBuffer
  19. // 
  20. // DESCRIPTION: Constructs the buffer with a default size
  21. // 
  22. // RETURNS:
  23. // 
  24. // NOTES:
  25. // 
  26. // MODIFICATIONS:
  27. // 
  28. // Name Date Version Comments
  29. // N T ALMOND       270400 1.0 Origin
  30. // 
  31. ////////////////////////////////////////////////////////////////////////////////
  32. CBuffer::CBuffer()
  33. {
  34. m_nSize = 0;
  35. m_bSustainSize = false;
  36. m_pBase =  NULL;
  37. m_nPtrSize = 0;
  38. }
  39. void CBuffer::Initialize(UINT nInitsize, bool bSustain)
  40. {
  41. m_bSustainSize = bSustain;
  42. ReAllocateBuffer(nInitsize);
  43. }
  44. ////////////////////////////////////////////////////////////////////////////////
  45. // 
  46. // FUNCTION: ~CBuffer
  47. // 
  48. // DESCRIPTION: Deallocates the buffer
  49. // 
  50. // RETURNS:
  51. // 
  52. // NOTES:
  53. // 
  54. // MODIFICATIONS:
  55. // 
  56. // Name Date Version Comments
  57. // N T ALMOND       270400 1.0 Origin
  58. // 
  59. ////////////////////////////////////////////////////////////////////////////////
  60. CBuffer::~CBuffer()
  61. {
  62. if (m_pBase)
  63. VirtualFree(m_pBase,0,MEM_RELEASE);
  64. }
  65. ////////////////////////////////////////////////////////////////////////////////
  66. // 
  67. // FUNCTION: Write
  68. // 
  69. // DESCRIPTION: Writes data into the buffer
  70. // 
  71. // RETURNS:
  72. // 
  73. // NOTES:
  74. // 
  75. // MODIFICATIONS:
  76. // 
  77. // Name Date Version Comments
  78. // N T ALMOND       270400 1.0 Origin
  79. // 
  80. ////////////////////////////////////////////////////////////////////////////////
  81. BOOL CBuffer::Write(PBYTE pData, UINT nSize)
  82. {
  83. ReAllocateBuffer(nSize + GetBufferLen());
  84. CopyMemory(m_pBase + m_nPtrSize,pData,nSize);
  85. // Advance Pointer
  86. m_nPtrSize += nSize;
  87. return nSize;
  88. }
  89. ////////////////////////////////////////////////////////////////////////////////
  90. // 
  91. // FUNCTION: Insert
  92. // 
  93. // DESCRIPTION: Insert data into the buffer 
  94. // 
  95. // RETURNS:
  96. // 
  97. // NOTES:
  98. // 
  99. // MODIFICATIONS:
  100. // 
  101. // Name Date Version Comments
  102. // N T ALMOND       270400 1.0 Origin
  103. // 
  104. ////////////////////////////////////////////////////////////////////////////////
  105. BOOL CBuffer::Insert(PBYTE pData, UINT nSize)
  106. {
  107. ReAllocateBuffer(nSize + GetBufferLen());
  108. MoveMemory(m_pBase+nSize,m_pBase,GetMemSize() - nSize);
  109. CopyMemory(m_pBase,pData,nSize);
  110. // Advance Pointer
  111. m_nPtrSize += nSize;
  112. return nSize;
  113. }
  114. ////////////////////////////////////////////////////////////////////////////////
  115. // 
  116. // FUNCTION: Read
  117. // 
  118. // DESCRIPTION: Reads data from the buffer and deletes what it reads
  119. // 
  120. // RETURNS:
  121. // 
  122. // NOTES:
  123. // 
  124. // MODIFICATIONS:
  125. // 
  126. // Name Date Version Comments
  127. // N T ALMOND       270400 1.0 Origin
  128. // 
  129. ////////////////////////////////////////////////////////////////////////////////
  130. UINT CBuffer::Read(PBYTE pData, UINT nSize)
  131. {
  132. // Trying to byte off more than ya can chew - eh?
  133. if (nSize > GetMemSize())
  134. return 0;
  135. // all that we have 
  136. if (nSize > GetBufferLen())
  137. nSize = GetBufferLen();
  138. if (nSize)
  139. {
  140. nTest++;
  141. // Copy over required amount and its not up to us
  142. // to terminate the buffer - got that!!!
  143. CopyMemory(pData,m_pBase,nSize);
  144. // Slide the buffer back - like sinking the data
  145. MoveMemory(m_pBase,m_pBase+nSize, GetMemSize() - nSize);
  146. m_nPtrSize -= nSize;
  147. }
  148. DeAllocateBuffer(GetBufferLen());
  149. return nSize;
  150. }
  151. ////////////////////////////////////////////////////////////////////////////////
  152. // 
  153. // FUNCTION: GetMemSize
  154. // 
  155. // DESCRIPTION: Returns the phyical memory allocated to the buffer
  156. // 
  157. // RETURNS:
  158. // 
  159. // NOTES:
  160. // 
  161. // MODIFICATIONS:
  162. // 
  163. // Name Date Version Comments
  164. // N T ALMOND       270400 1.0 Origin
  165. // 
  166. ////////////////////////////////////////////////////////////////////////////////
  167. UINT CBuffer::GetMemSize() 
  168. {
  169. return m_nSize;
  170. }
  171. ////////////////////////////////////////////////////////////////////////////////
  172. // 
  173. // FUNCTION: GetBufferLen
  174. // 
  175. // DESCRIPTION: Get the buffer 'data' length
  176. // 
  177. // RETURNS:
  178. // 
  179. // NOTES:
  180. // 
  181. // MODIFICATIONS:
  182. // 
  183. // Name Date Version Comments
  184. // N T ALMOND       270400 1.0 Origin
  185. // 
  186. ////////////////////////////////////////////////////////////////////////////////
  187. UINT CBuffer::GetBufferLen() 
  188. {
  189. if (m_pBase == NULL)
  190. return 0;
  191. return m_nPtrSize;
  192. }
  193. ////////////////////////////////////////////////////////////////////////////////
  194. // 
  195. // FUNCTION: ReAllocateBuffer
  196. // 
  197. // DESCRIPTION: ReAllocateBuffer the Buffer to the requested size
  198. // 
  199. // RETURNS:
  200. // 
  201. // NOTES:
  202. // 
  203. // MODIFICATIONS:
  204. // 
  205. // Name Date Version Comments
  206. // N T ALMOND       270400 1.0 Origin
  207. // 
  208. ////////////////////////////////////////////////////////////////////////////////
  209. UINT CBuffer::ReAllocateBuffer(UINT nRequestedSize)
  210. {
  211. if (nRequestedSize < GetMemSize())
  212. return 0;
  213. // Allocate new size
  214. TRACE("ReAllocateBuffer %dn",nRequestedSize);
  215. SYSTEM_INFO si;
  216. GetSystemInfo(&si);
  217. UINT nNewSize = (UINT) ((nRequestedSize / si.dwPageSize) * si.dwPageSize) + si.dwPageSize;
  218. // New Copy Data Over
  219. PBYTE pNewBuffer = (PBYTE) VirtualAlloc(NULL,nNewSize,MEM_COMMIT,PAGE_READWRITE);
  220. ASSERT(si.dwPageSize);
  221. ASSERT(m_nPtrSize < nNewSize);
  222. if (m_pBase)
  223. {
  224. CopyMemory(pNewBuffer,m_pBase,m_nPtrSize);
  225. VirtualFree(m_pBase,0,MEM_RELEASE);
  226. }
  227. // Hand over the pointer
  228. m_pBase = pNewBuffer;
  229. m_nSize = nNewSize;
  230. return m_nSize;
  231. }
  232. ////////////////////////////////////////////////////////////////////////////////
  233. // 
  234. // FUNCTION: DeAllocateBuffer
  235. // 
  236. // DESCRIPTION: DeAllocates the Buffer to the requested size
  237. // 
  238. // RETURNS:
  239. // 
  240. // NOTES:
  241. // 
  242. // MODIFICATIONS:
  243. // 
  244. // Name Date Version Comments
  245. // N T ALMOND       270400 1.0 Origin
  246. // 
  247. ////////////////////////////////////////////////////////////////////////////////
  248. UINT CBuffer::DeAllocateBuffer(UINT nRequestedSize)
  249. {
  250. if (m_bSustainSize)
  251. return 0;
  252. if (nRequestedSize < GetBufferLen())
  253. return 0;
  254. TRACE("DeAllocateBuffer %dn",nRequestedSize);
  255. SYSTEM_INFO si;
  256. GetSystemInfo(&si);
  257. UINT nNewSize = (UINT) ((nRequestedSize / si.dwPageSize) * si.dwPageSize) + si.dwPageSize;
  258. // New Copy Data Over
  259. PBYTE pNewBuffer = (PBYTE) VirtualAlloc(NULL,nNewSize,MEM_COMMIT,PAGE_READWRITE);
  260. if (m_nPtrSize)
  261. CopyMemory(pNewBuffer, m_pBase, m_nPtrSize);
  262. if (m_pBase)
  263. VirtualFree(m_pBase,0,MEM_RELEASE);
  264. // Hand over the pointer
  265. m_pBase = pNewBuffer;
  266. m_nSize = nNewSize;
  267. return m_nSize;
  268. }
  269. ////////////////////////////////////////////////////////////////////////////////
  270. // 
  271. // FUNCTION: Scan
  272. // 
  273. // DESCRIPTION: Scans the buffer for a given byte sequence
  274. // 
  275. // RETURNS: Logical offset
  276. // 
  277. // NOTES:
  278. // 
  279. // MODIFICATIONS:
  280. // 
  281. // Name Date Version Comments
  282. // N T ALMOND       270400 1.0 Origin
  283. // 
  284. ////////////////////////////////////////////////////////////////////////////////
  285. int CBuffer::Scan(PBYTE pScan,UINT nPos)
  286. {
  287. if (nPos > GetBufferLen() )
  288. return -1;
  289. PBYTE pPtr = (PBYTE) strstr((char*)(m_pBase+nPos),(char*)pScan);
  290. if (pPtr > m_pBase + m_nPtrSize)
  291. return -1;
  292. int nOffset = -1;
  293. if (pPtr)
  294. nOffset = (pPtr - m_pBase) + strlen((char*)pScan);
  295. return nOffset;
  296. }
  297. ////////////////////////////////////////////////////////////////////////////////
  298. // 
  299. // FUNCTION: ClearBuffer
  300. // 
  301. // DESCRIPTION: Clears/Resets the buffer
  302. // 
  303. // RETURNS:
  304. // 
  305. // NOTES:
  306. // 
  307. // MODIFICATIONS:
  308. // 
  309. // Name Date Version Comments
  310. // N T ALMOND       270400 1.0 Origin
  311. // 
  312. ////////////////////////////////////////////////////////////////////////////////
  313. void CBuffer::ClearBuffer()
  314. {
  315. // Force the buffer to be empty
  316. m_nPtrSize = 0;
  317. DeAllocateBuffer(1024);
  318. }
  319. ////////////////////////////////////////////////////////////////////////////////
  320. // 
  321. // FUNCTION: Write
  322. // 
  323. // DESCRIPTION: Writes a string a the end of the buffer
  324. // 
  325. // RETURNS:
  326. // 
  327. // NOTES:
  328. // 
  329. // MODIFICATIONS:
  330. // 
  331. // Name Date Version Comments
  332. // N T ALMOND       270400 1.0 Origin
  333. // 
  334. ////////////////////////////////////////////////////////////////////////////////
  335. BOOL CBuffer::Write(CString& strData)
  336. {
  337. int nSize = strData.GetLength();
  338. return Write((PBYTE) strData.GetBuffer(nSize), nSize);
  339. }
  340. ////////////////////////////////////////////////////////////////////////////////
  341. // 
  342. // FUNCTION: Insert
  343. // 
  344. // DESCRIPTION: Insert a string at the beginning of the buffer
  345. // 
  346. // RETURNS:
  347. // 
  348. // NOTES:
  349. // 
  350. // MODIFICATIONS:
  351. // 
  352. // Name Date Version Comments
  353. // N T ALMOND       270400 1.0 Origin
  354. // 
  355. ////////////////////////////////////////////////////////////////////////////////
  356. BOOL CBuffer::Insert(CString& strData)
  357. {
  358. int nSize = strData.GetLength();
  359. return Insert((PBYTE) strData.GetBuffer(nSize), nSize);
  360. }
  361. ////////////////////////////////////////////////////////////////////////////////
  362. // 
  363. // FUNCTION: Copy
  364. // 
  365. // DESCRIPTION: Copy from one buffer object to another...
  366. // 
  367. // RETURNS:
  368. // 
  369. // NOTES:
  370. // 
  371. // MODIFICATIONS:
  372. // 
  373. // Name Date Version Comments
  374. // N T ALMOND       270400 1.0 Origin
  375. // 
  376. ////////////////////////////////////////////////////////////////////////////////
  377. void CBuffer::Copy(CBuffer& buffer)
  378. {
  379. int nReSize = buffer.GetMemSize();
  380. int nSize = buffer.GetBufferLen();
  381. ClearBuffer();
  382. ReAllocateBuffer(nReSize);
  383. m_nPtrSize = nReSize;
  384. CopyMemory(m_pBase,buffer.GetBuffer(),buffer.GetBufferLen());
  385. }
  386. ////////////////////////////////////////////////////////////////////////////////
  387. // 
  388. // FUNCTION: GetBuffer
  389. // 
  390. // DESCRIPTION: Returns a pointer to the physical memory determined by the offset
  391. // 
  392. // RETURNS:
  393. // 
  394. // NOTES:
  395. // 
  396. // MODIFICATIONS:
  397. // 
  398. // Name Date Version Comments
  399. // N T ALMOND       270400 1.0 Origin
  400. // 
  401. ////////////////////////////////////////////////////////////////////////////////
  402. PBYTE CBuffer::GetBuffer(UINT nPos)
  403. {
  404. return m_pBase+nPos;
  405. }
  406. ////////////////////////////////////////////////////////////////////////////////
  407. // 
  408. // FUNCTION: GetBuffer
  409. // 
  410. // DESCRIPTION: Returns a pointer to the physical memory determined by the offset
  411. // 
  412. // RETURNS:
  413. // 
  414. // NOTES:
  415. // 
  416. // MODIFICATIONS:
  417. // 
  418. // Name Date Version Comments
  419. // N T ALMOND       270400 1.0 Origin
  420. // 
  421. ///////////////////////////////////////////////////////////////////////////////
  422. void CBuffer::FileWrite(const CString& strFileName)
  423. {
  424. CFile file;
  425. if (file.Open(strFileName, CFile::modeWrite | CFile::modeCreate))
  426. {
  427. file.Write(m_pBase,GetBufferLen());
  428. file.Close();
  429. }
  430. }
  431. ////////////////////////////////////////////////////////////////////////////////
  432. // 
  433. // FUNCTION: Delete
  434. // 
  435. // DESCRIPTION: Delete data from the buffer and deletes what it reads
  436. // 
  437. // RETURNS:
  438. // 
  439. // NOTES:
  440. // 
  441. // MODIFICATIONS:
  442. // 
  443. // Name Date Version Comments
  444. // N T ALMOND       270400 1.0 Origin
  445. // 
  446. ////////////////////////////////////////////////////////////////////////////////
  447. UINT CBuffer::Delete(UINT nSize)
  448. {
  449. // Trying to byte off more than ya can chew - eh?
  450. if (nSize > GetMemSize())
  451. return 0;
  452. // all that we have 
  453. if (nSize > GetBufferLen())
  454. nSize = GetBufferLen();
  455. if (nSize)
  456. {
  457. // Slide the buffer back - like sinking the data
  458. MoveMemory(m_pBase,m_pBase+nSize,GetMemSize() - nSize);
  459. m_nPtrSize -= nSize;
  460. }
  461. DeAllocateBuffer(GetBufferLen());
  462. return nSize;
  463. }
  464. const CBuffer& CBuffer::operator=(CBuffer& buff)
  465. {
  466. this->Write(buff.GetBuffer(), buff.GetBufferLen());
  467. return* this;
  468. }
  469. UINT CBuffer::DeleteEnd(UINT nSize)
  470. {
  471. // Trying to byte off more than ya can chew - eh?
  472. if (nSize > GetMemSize())
  473. return 0;
  474. // all that we have 
  475. if (nSize > GetBufferLen())
  476. nSize = GetBufferLen();
  477. if (nSize)
  478. {
  479. // Slide the buffer back - like sinking the data
  480. m_nPtrSize -= nSize;
  481. }
  482. DeAllocateBuffer(GetBufferLen());
  483. return nSize;
  484. }