cchx2ihxdataf.cpp
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:8k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. /****************************************************************************
  36.  *  Includes
  37.  */
  38. #include "hlxclib/string.h"
  39. #include "hlxclib/fcntl.h"
  40. #include "hlxclib/sys/stat.h"
  41. #include "hxbuffer.h"
  42. #include "hxassert.h"
  43. #include "chxdataf.h"
  44. #include "cchx2ihxdataf.h"
  45. /****************************************************************************
  46.  *  CCHX2IHXDataFile
  47.  */
  48. /****************************************************************************
  49.  *  Constructor/Destructor
  50.  */
  51. CCHX2IHXDataFile::CCHX2IHXDataFile(IHXDataFile* pIHXFile,
  52.    void* pUserData,
  53.    TemporaryFileNameFnPtr fpTempFileName,
  54.    FastReadFnPtr fpFastRead,
  55.    FastReadFnPtr fpFastWrite,
  56.    FileDeleteFnPtr fpFileDelete)
  57.     : m_pIHXFile(pIHXFile)
  58.     , m_pUserData(pUserData)
  59.     , m_fpFileDelete(fpFileDelete)
  60.     , m_fpTempFileName(fpTempFileName)
  61.     , m_fpFastRead(fpFastRead)
  62.     , m_fpFastWrite(fpFastWrite)
  63. {
  64.     if (m_pIHXFile)
  65.     {
  66. m_pIHXFile->AddRef();
  67.     }
  68. }
  69. CCHX2IHXDataFile::~CCHX2IHXDataFile(void)
  70. {
  71.     HX_RELEASE(m_pIHXFile);
  72. }
  73. /****************************************************************************
  74.  *  CHXDataFile methods
  75.  */
  76. HX_RESULT CCHX2IHXDataFile::GetLastError(void)
  77. {
  78.     HX_RESULT retVal = HXR_OK;
  79.     if (m_pIHXFile)
  80.     {
  81. retVal = m_pIHXFile->GetLastError();
  82.     }
  83.     return retVal;
  84. }
  85. BOOL CCHX2IHXDataFile::GetTemporaryFileName(const char *tag, char* name, UINT32 ulBufLen)
  86. {
  87.     BOOL bRetVal = FALSE;
  88.     if (m_fpTempFileName)
  89.     {
  90. bRetVal = (*m_fpTempFileName)(m_pUserData, tag, name, ulBufLen);
  91.     }
  92.     return bRetVal;
  93. }
  94. HX_RESULT CCHX2IHXDataFile::Create(const char *filename, UINT16 mode, BOOL textflag)
  95. {
  96.     HX_RESULT retVal = HXR_FAIL;
  97.     if (m_pIHXFile)
  98.     {
  99. m_pIHXFile->Bind(filename);
  100. retVal = m_pIHXFile->Create(TranslateMode(mode, textflag));
  101.     }
  102.     return retVal;
  103. }
  104. HX_RESULT CCHX2IHXDataFile::Open(const char *filename, UINT16 mode, BOOL textflag)
  105. {
  106.     HX_RESULT retVal = HXR_FAIL;
  107.     if (m_pIHXFile)
  108.     {
  109. m_pIHXFile->Bind(filename);
  110. retVal = m_pIHXFile->Open(TranslateMode(mode, textflag));
  111.     }
  112.     return retVal;
  113. }
  114. HX_RESULT CCHX2IHXDataFile::Close(void)
  115. {
  116.     HX_RESULT retVal = HXR_FAIL;
  117.     if (m_pIHXFile)
  118.     {
  119. retVal = m_pIHXFile->Close();
  120.     }
  121.     return retVal;
  122. }
  123. ULONG32 CCHX2IHXDataFile::GetSize(void)
  124. {
  125.     ULONG32 ulSize = 0;
  126.     if (m_pIHXFile)
  127.     {
  128. struct stat statBuffer;
  129. if (m_pIHXFile->IsOpen())
  130. {
  131.     ULONG32 ulCurrPos = m_pIHXFile->Tell();
  132.     ulSize = m_pIHXFile->Seek(0, SEEK_END);
  133.     m_pIHXFile->Seek(ulCurrPos, SEEK_SET);
  134. }
  135. else if (m_pIHXFile->Stat(&statBuffer) == HXR_OK)
  136. {
  137.     ulSize = statBuffer.st_size;
  138. }
  139.     }
  140.     return ulSize;
  141. }
  142. HX_RESULT CCHX2IHXDataFile::Seek(ULONG32 offset, UINT16 fromWhere)
  143. {
  144.     HX_RESULT retVal = HXR_FAIL;
  145.     if (m_pIHXFile)
  146.     {
  147. retVal = m_pIHXFile->Seek(offset, fromWhere);
  148.     }
  149.     return retVal;
  150. }
  151. ULONG32 CCHX2IHXDataFile::Tell(void)
  152. {
  153.     ULONG32 ulPos = 0;
  154.     if (m_pIHXFile)
  155.     {
  156. ulPos = m_pIHXFile->Tell();
  157.     }
  158.     return ulPos;
  159. }
  160. ULONG32 CCHX2IHXDataFile::Read(char* buf, ULONG32 count)
  161. {
  162.     ULONG32 ulBytesRead = 0;
  163.     if (m_pIHXFile)
  164.     {
  165. if (m_fpFastRead)
  166. {
  167.     ulBytesRead = m_fpFastRead(m_pUserData, buf, count);
  168. }
  169. else
  170. {
  171.     IHXBuffer* pBuffer = NULL;
  172.     ulBytesRead = m_pIHXFile->Read(pBuffer, count);
  173.     if (ulBytesRead != 0)
  174.     {
  175. if (ulBytesRead <= count)
  176. {
  177.     memcpy(buf, pBuffer->GetBuffer(), count); /* Flawfinder: ignore */
  178. }
  179. else
  180. {
  181.     ulBytesRead = 0;
  182. }
  183.     }
  184.     HX_RELEASE(pBuffer);
  185. }
  186.     }
  187.     return ulBytesRead;
  188. }
  189. HX_RESULT CCHX2IHXDataFile::ReadToBuffer(ULONG32 ulCount, IHXBuffer** ppbufOut)
  190. {
  191.     HX_RESULT retVal = HXR_FAIL;
  192.     if (m_pIHXFile)
  193.     {
  194. UINT32 ulRead = m_pIHXFile->Read(*ppbufOut, ulCount);
  195. if ((ulRead == ulCount) || ((ulRead != 0) && (ulRead < ulCount)))
  196. {
  197.     retVal = HXR_OK;
  198. }
  199.     }
  200.     return retVal;
  201. }
  202. ULONG32 CCHX2IHXDataFile::Write(const char* buf, ULONG32 count)
  203. {
  204.     ULONG32 ulBytesWritten = 0;
  205.     if (m_pIHXFile)
  206.     {
  207. if (m_fpFastWrite)
  208. {
  209.     ulBytesWritten = m_fpFastWrite(m_pUserData, buf, count);
  210. }
  211. else
  212. {
  213.     IHXBuffer* pBuffer = new CHXBuffer();
  214.     if (pBuffer)
  215.     {
  216. pBuffer->AddRef();
  217. if ((count != 0) && (pBuffer->SetSize(count) == HXR_OK))
  218. {
  219.     memcpy(pBuffer->GetBuffer(), buf, count); /* Flawfinder: ignore */
  220.     ulBytesWritten = m_pIHXFile->Write(pBuffer);
  221. }
  222. pBuffer->Release();
  223.     }
  224. }
  225.     }
  226.     return ulBytesWritten;
  227. }
  228. HX_RESULT CCHX2IHXDataFile::Rewind(void)
  229. {
  230.     HX_RESULT retVal = HXR_FAIL;
  231.     if (m_pIHXFile)
  232.     {
  233. retVal = m_pIHXFile->Seek(0, SEEK_SET);
  234.     }
  235.     return retVal;
  236. }
  237. INT16 CCHX2IHXDataFile::GetFd(void)
  238. {
  239.     INT16 iFd = -1;
  240.     if (m_pIHXFile)
  241.     {
  242. iFd = m_pIHXFile->GetFd();
  243.     }
  244.     return iFd;
  245. }
  246. HX_RESULT CCHX2IHXDataFile::Delete(const char *filename)
  247. {
  248.     HX_RESULT retVal = HXR_FAIL;
  249.     if (m_pIHXFile)
  250.     {
  251. if (m_pIHXFile->IsOpen())
  252. {
  253.     IHXBuffer* pNameBuffer = NULL;
  254.     if (m_pIHXFile->Name(pNameBuffer) && pNameBuffer)
  255.     {
  256. if (strcmp(filename, (const char*) pNameBuffer->GetBuffer()))
  257. {
  258.     retVal = m_pIHXFile->Delete();
  259. }
  260. else
  261. {
  262.     if (m_fpFileDelete)
  263.     {
  264. retVal = m_fpFileDelete(m_pUserData, filename);
  265.     }
  266.     else
  267.     {
  268. m_pIHXFile->Bind(filename);
  269. retVal = m_pIHXFile->Delete();
  270.     }
  271. }
  272. pNameBuffer->Release();
  273.     }
  274. }
  275. else
  276. {
  277.     m_pIHXFile->Bind(filename);
  278.     retVal = m_pIHXFile->Delete();
  279. }
  280.     }
  281.     return retVal;
  282. }
  283. /************************************************************************
  284.  *  Private methods
  285.  */
  286. UINT16 CCHX2IHXDataFile::TranslateMode(UINT16 uOpenMode, BOOL bTextFlag)
  287. {
  288.     UINT16 uMode = 0;
  289.     
  290.     if (uOpenMode & O_RDWR)
  291.     {
  292. uMode |= (HX_FILEFLAG_READ | HX_FILEFLAG_WRITE);
  293.     }
  294.     else if (uOpenMode & O_RDONLY)
  295.     {
  296. uMode |= HX_FILEFLAG_READ;
  297.     }
  298.     else if (uOpenMode & O_WRONLY)
  299.     {
  300. uMode |= HX_FILEFLAG_WRITE;
  301.     }
  302.     if ((uOpenMode & O_BINARY) && (!bTextFlag))
  303.     {
  304. uMode |= HX_FILEFLAG_BINARY;
  305.     }
  306.     return uMode;
  307. }