cbufferfile.cp
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:6k
源码类别:

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: cbufferfile.cp,v 1.1.1.1.50.3 2004/07/09 01:44:13 hubbe Exp $
  3.  * 
  4.  * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
  5.  * 
  6.  * The contents of this file, and the files included with this file,
  7.  * are subject to the current version of the RealNetworks Public
  8.  * Source License (the "RPSL") available at
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed
  10.  * the file under the current version of the RealNetworks Community
  11.  * Source License (the "RCSL") available at
  12.  * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
  13.  * will apply. You may also obtain the license terms directly from
  14.  * RealNetworks.  You may not use this file except in compliance with
  15.  * the RPSL or, if you have a valid RCSL with RealNetworks applicable
  16.  * to this file, the RCSL.  Please see the applicable RPSL or RCSL for
  17.  * the rights, obligations and limitations governing use of the
  18.  * contents of the file.
  19.  * 
  20.  * Alternatively, the contents of this file may be used under the
  21.  * terms of the GNU General Public License Version 2 or later (the
  22.  * "GPL") in which case the provisions of the GPL are applicable
  23.  * instead of those above. If you wish to allow use of your version of
  24.  * this file only under the terms of the GPL, and not to allow others
  25.  * to use your version of this file under the terms of either the RPSL
  26.  * or RCSL, indicate your decision by deleting the provisions above
  27.  * and replace them with the notice and other provisions required by
  28.  * the GPL. If you do not delete the provisions above, a recipient may
  29.  * use your version of this file under the terms of any one of the
  30.  * RPSL, the RCSL or the GPL.
  31.  * 
  32.  * This file is part of the Helix DNA Technology. RealNetworks is the
  33.  * developer of the Original Code and owns the copyrights in the
  34.  * portions it created.
  35.  * 
  36.  * This file, and the files included with this file, is distributed
  37.  * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
  38.  * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
  39.  * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
  40.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
  41.  * ENJOYMENT OR NON-INFRINGEMENT.
  42.  * 
  43.  * Technology Compatibility Kit Test Suite(s) Location:
  44.  *    http://www.helixcommunity.org/content/tck
  45.  * 
  46.  * Contributor(s):
  47.  * 
  48.  * ***** END LICENSE BLOCK ***** */
  49. #include "CBufferFile.h"
  50. #include "hxtypes.h"
  51. CBufferFile::CBufferFile (void) 
  52. : mLow(NULL)
  53. , mBufSize(0)
  54. , mSize(0)
  55. , mCurPos(0)
  56. , mLoaded(FALSE)
  57. , mBytesTotal(0)
  58. { /* begin CBufferFile */
  59. } /* end CBufferFile */
  60. CBufferFile::~CBufferFile ()
  61. { /* begin ~CBufferFile */
  62. if(mLow) delete [] mLow;
  63. mLow = NULL;
  64. } /* end ~CBufferFile */
  65. Boolean CBufferFile::Specify(short fRefNum, long bufSize)
  66. {
  67. Boolean OK = TRUE;
  68. if(mLow)
  69. {
  70. delete [] mLow;
  71. mLow = NULL;
  72. }
  73. mLow = new char[bufSize];
  74. OK = mLow != NULL;
  75. if(OK)
  76. {
  77. mBufSize = mSize = bufSize;
  78. mHigh = mLow + (mSize >> 1);
  79. a_PB.ioCompletion = NULL;
  80. a_PB.ioVersNum = 0;
  81. a_PB.ioPermssn = fsRdPerm;
  82. a_PB.ioPosMode = fsFromStart;
  83. a_PB.ioMisc = 0;
  84. a_PB.ioRefNum = fRefNum;
  85. b_PB = a_PB;
  86. }
  87. return(OK);
  88. }
  89. long CBufferFile::Copy(Ptr destBuf, long numBytes)
  90. {
  91. long count;
  92. numBytes =  numBytes <= mBytesToCopy ? numBytes : mBytesToCopy;
  93. if(mCurPos + numBytes < mBufSize)
  94. {
  95. count = numBytes;
  96. BlockMoveData(&mLow[mCurPos], destBuf, numBytes);
  97. mCurPos += numBytes;
  98. if(mCurPos > mBufSize >> 1 && fFillLow)
  99. {
  100. Load(kBufLow);
  101. fFillLow = FALSE;
  102. }
  103. }
  104. else
  105. {
  106. count = mBufSize - mCurPos;
  107. BlockMoveData(&mLow[mCurPos], destBuf, count);
  108. BlockMoveData(mLow, &destBuf[count], numBytes - count);
  109. mCurPos = numBytes - count;
  110. if(mCurPos < mBufSize >> 1 && !fFillLow)
  111. {
  112. Load(kBufHigh);
  113. fFillLow = TRUE;
  114. }
  115. }
  116. mBytesToCopy -= numBytes;
  117. return(numBytes);
  118. }
  119. long CBufferFile::Load(short loadFlag)
  120. {
  121. long count;
  122. Ptr   buf;
  123. IOParam *thePB;
  124. switch(loadFlag)
  125. {
  126. case kBufLow:
  127. count = mBufSize >> 1;
  128. buf = mLow;
  129. thePB = &a_PB;
  130. break;
  131. case kBufHigh:
  132. count = mBufSize >> 1;
  133. buf = mHigh;
  134. thePB = &b_PB;
  135. break;
  136. case kBoth:
  137. count = mBufSize;
  138. buf = mLow;
  139. thePB = &a_PB;
  140. break;
  141. default:
  142. count = 0;
  143. break;
  144. }
  145. count = count <= mBytesRemaining ? count : mBytesRemaining;
  146. if(count > 0)
  147. {
  148. thePB->ioReqCount = count;
  149. thePB->ioPosOffset = ioPosOffset;
  150. thePB->ioBuffer = buf;
  151. thePB->ioVersNum = 0;
  152. thePB->ioMisc = 0;
  153. PBReadSync((ParmBlkPtr)thePB);
  154. mBytesRemaining -= count;
  155. ioPosOffset += count;
  156. }
  157. return(count);
  158. }
  159. Boolean CBufferFile::PreLoad(long startPos, long bytesReq)
  160. {
  161. long count;
  162. Boolean OK;
  163. OSErr theErr;
  164. count = (bytesReq <= mSize) ? bytesReq : mSize;
  165. mBufSize = count;
  166. mHigh = mLow + (count >> 1);
  167. mCurPos = 0;
  168. mStartPos = startPos;
  169. mBytesTotal = bytesReq;
  170. mBytesRemaining = bytesReq;
  171. mBytesToCopy = bytesReq;
  172. ioPosOffset = startPos;
  173. a_PB.ioMisc = 0;
  174. a_PB.ioVersNum = 0;
  175. a_PB.ioResult = 0;
  176. a_PB.ioReqCount = count;
  177. a_PB.ioPosOffset = startPos;
  178. a_PB.ioBuffer = mLow;
  179. b_PB = a_PB;
  180. theErr = PBReadSync((ParmBlkPtr)&a_PB);
  181. OK = theErr == noErr;
  182. if(OK)
  183. {
  184. mBytesRemaining -= count;
  185. ioPosOffset += count;
  186. fFillLow = TRUE;
  187. }
  188. else if(theErr == eofErr)
  189. {
  190. mBytesRemaining = 0;
  191. ioPosOffset += count;
  192. fFillLow = TRUE;
  193. OK = TRUE;
  194. }
  195. mLoaded = OK;
  196. return(OK);
  197. }
  198. void CBufferFile::CheckBuffer(void)
  199. {
  200. if(mCurPos > mBufSize >> 1 && fFillLow)
  201. {
  202. Load(kBufLow);
  203. fFillLow = FALSE;
  204. }
  205. else if(mCurPos < mBufSize >> 1 && !fFillLow)
  206. {
  207. Load(kBufHigh);
  208. fFillLow = TRUE;
  209. }
  210. }