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