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

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: cihx2chxdataf.cpp,v 1.5.20.3 2004/07/09 01:44:51 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. /****************************************************************************
  50.  *  Includes
  51.  */
  52. #include "hlxclib/string.h"
  53. #include "hlxclib/fcntl.h"
  54. #include "hlxclib/sys/stat.h"
  55. #include "hxbuffer.h"
  56. #include "hxassert.h"
  57. #include "chxdataf.h"
  58. #include "cihx2chxdataf.h"
  59. /****************************************************************************
  60.  *  CIHX2CHXDataFile
  61.  */
  62. /****************************************************************************
  63.  *  Constructor/Destructor
  64.  */
  65. CIHX2CHXDataFile::CIHX2CHXDataFile(UINT32 ulFlags, IUnknown** ppCommonObj)
  66.     : m_pCHXFile(CHXDataFile::Construct(ulFlags, ppCommonObj))
  67.     , m_pFileName(NULL)
  68.     , m_bOpen(FALSE)
  69.     , m_lRefCount(0)
  70. {
  71.     ;
  72. }
  73. CIHX2CHXDataFile::~CIHX2CHXDataFile(void)
  74. {
  75.     HX_DELETE(m_pCHXFile);
  76.     HX_RELEASE(m_pFileName);
  77. }
  78. /****************************************************************************
  79.  *  IHXDataFile methods
  80.  */
  81. STDMETHODIMP_(void) CIHX2CHXDataFile::Bind(const char* pFileName)
  82. {
  83.     if (!m_pFileName)
  84.     {
  85. m_pFileName = new CHXBuffer;
  86. if (m_pFileName)
  87. {
  88.          m_pFileName->AddRef();
  89. }
  90.     }
  91.     if (m_bOpen)
  92.     {
  93. Close();
  94.     }
  95.     if (m_pFileName && pFileName)
  96.     {
  97. if (m_pFileName->Set((UINT8*)pFileName, ::strlen(pFileName) + 1) != HXR_OK)
  98. {
  99.     HX_RELEASE(m_pFileName);
  100. }
  101.     }
  102. }
  103. STDMETHODIMP CIHX2CHXDataFile::Create(UINT16 uOpenMode)
  104. {
  105.     HX_RESULT retVal = HXR_FAIL;
  106.     if (m_pCHXFile)
  107.     {
  108. if (m_pFileName && (m_pFileName->GetSize() != 0))
  109. {
  110.     retVal = HXR_OK;
  111.     if (uOpenMode & HX_FILEFLAG_NOTRUNC)
  112.     {
  113. if (m_pCHXFile->Open((char*) m_pFileName->GetBuffer(),
  114.      HX_FILEFLAG_READ | HX_FILEFLAG_BINARY)
  115.     == HXR_OK)
  116. {
  117.     m_pCHXFile->Close();
  118.     retVal = HXR_FAIL; // file exists - cannot destroy
  119. }
  120.     }
  121.     
  122.     if (retVal == HXR_OK)
  123.     {
  124. retVal = m_pCHXFile->Create((char*) m_pFileName->GetBuffer(), 
  125.     TranslateMode(uOpenMode));
  126.     }
  127.     
  128.     m_bOpen = (retVal == HXR_OK);
  129. }
  130.     }
  131.     return retVal;
  132. }
  133. STDMETHODIMP CIHX2CHXDataFile::Open(UINT16 uOpenMode)
  134. {
  135.     HX_RESULT retVal = HXR_FAIL;
  136.     if (m_pCHXFile)
  137.     {
  138. if (m_pFileName && (m_pFileName->GetSize() != 0))
  139. {
  140.     retVal = m_pCHXFile->Open((char*) m_pFileName->GetBuffer(), 
  141.       TranslateMode(uOpenMode));
  142.     m_bOpen = SUCCEEDED(retVal);
  143. }
  144.     }
  145.     return retVal;
  146. }
  147. STDMETHODIMP CIHX2CHXDataFile::Close()
  148. {
  149.     HX_RESULT retVal = HXR_OK;
  150.     if (m_pCHXFile)
  151.     {
  152. retVal = m_pCHXFile->Close();
  153. m_bOpen = (m_bOpen && FAILED(retVal));
  154.     }
  155.     return retVal;
  156. }
  157. STDMETHODIMP_(BOOL) CIHX2CHXDataFile::Name(REF(IHXBuffer*) pFileName)
  158. {
  159.     if (m_pFileName && (m_pFileName->GetSize() != 0))
  160.     {
  161. pFileName = m_pFileName;
  162. pFileName->AddRef();
  163. return TRUE;
  164.     }
  165.     return FALSE;
  166. }
  167. STDMETHODIMP_(BOOL) CIHX2CHXDataFile::IsOpen()
  168. {
  169.     return m_bOpen;
  170. }
  171. STDMETHODIMP CIHX2CHXDataFile::Seek(ULONG32 offset, UINT16 fromWhere)
  172. {
  173.     HX_RESULT retVal = HXR_FAIL;
  174.     if (m_pCHXFile)
  175.     {
  176. retVal = m_pCHXFile->Seek(offset, fromWhere);
  177.     }
  178.     return retVal;
  179. }
  180. STDMETHODIMP_(ULONG32) CIHX2CHXDataFile::Tell()
  181. {
  182.     ULONG32 ulPos = 0;
  183.     if (m_pCHXFile)
  184.     {
  185. ulPos = m_pCHXFile->Tell();
  186.     }
  187.     return ulPos;
  188. }
  189. STDMETHODIMP_(ULONG32) CIHX2CHXDataFile::Read(REF(IHXBuffer*) pBuf,
  190.       ULONG32 ulSize)
  191. {
  192.     ULONG32 ulBytesRead = 0;
  193.     if (m_pCHXFile)
  194.     {
  195. if (SUCCEEDED(m_pCHXFile->ReadToBuffer(ulSize, &pBuf)))
  196. {
  197.     ulBytesRead = pBuf->GetSize();
  198. }
  199.     }
  200.     return ulBytesRead;
  201. }
  202. STDMETHODIMP_(ULONG32) CIHX2CHXDataFile::Write(REF(IHXBuffer*) pBuf)
  203. {
  204.     ULONG32 ulBytesWritten = 0;
  205.     if (m_pCHXFile)
  206.     {
  207. UINT8* pData = NULL;
  208. ULONG32 ulSize = 0;
  209. if (pBuf->Get(pData, ulSize) == HXR_OK)
  210. {
  211.     ulBytesWritten = m_pCHXFile->Write((const char*) pData, ulSize);
  212. }
  213.     }
  214.     return ulBytesWritten;
  215. }
  216. STDMETHODIMP CIHX2CHXDataFile::Flush()
  217. {
  218.     HX_RESULT retVal = HXR_FAIL;
  219.     if (m_bOpen)
  220.     {
  221. retVal = HXR_OK;
  222.     }
  223.     return retVal;
  224. }
  225. STDMETHODIMP CIHX2CHXDataFile::Stat(struct stat* pStatBuffer)
  226. {
  227.     HX_RESULT retVal = HXR_FAIL;
  228.     if (m_pFileName && (m_pFileName->GetSize() != 0))
  229.     {
  230. retVal = HXR_OK;
  231. if (stat((char*) m_pFileName->GetBuffer(), pStatBuffer) != 0)
  232. {
  233.     retVal = HXR_FAIL;
  234.     if (m_pCHXFile && m_bOpen)
  235.     {
  236. ULONG32 ulSize = m_pCHXFile->GetSize();
  237. retVal = HXR_OK;
  238. if (ulSize == 0)
  239. {
  240.     retVal = m_pCHXFile->GetLastError();
  241. }
  242. if (retVal == HXR_OK)
  243. {
  244.     pStatBuffer->st_mode = 0;
  245.     pStatBuffer->st_size = ulSize;
  246.     pStatBuffer->st_atime = 0;
  247.     pStatBuffer->st_ctime = 0;
  248.     pStatBuffer->st_mtime = 0;
  249.     retVal = HXR_INCOMPLETE;
  250. }
  251.     }
  252. }
  253.     }
  254.     return retVal;
  255. }
  256. STDMETHODIMP CIHX2CHXDataFile::Delete()
  257. {
  258.     HX_RESULT retVal = HXR_FAIL;
  259.     if (m_pCHXFile)
  260.     {
  261. if (m_bOpen)
  262. {
  263.     Close();
  264. }
  265. if (m_pFileName && (m_pFileName->GetSize() != 0))
  266. {
  267.     retVal = m_pCHXFile->Delete((const char*) m_pFileName->GetBuffer());
  268. }
  269.     }
  270.     return retVal;
  271. }
  272. STDMETHODIMP_(INT16) CIHX2CHXDataFile::GetFd()
  273. {
  274.     INT16 iFd = -1;
  275.     if (m_pCHXFile)
  276.     {
  277. iFd = m_pCHXFile->GetFd();
  278.     }
  279.     return iFd;
  280. }
  281. STDMETHODIMP CIHX2CHXDataFile::GetLastError(void)
  282. {
  283.     HX_RESULT retVal = HXR_OK;
  284.     if (m_pCHXFile)
  285.     {
  286. retVal = m_pCHXFile->GetLastError();
  287.     }
  288.     return retVal;
  289. }
  290. STDMETHODIMP_(void) CIHX2CHXDataFile::GetLastError(REF(IHXBuffer*) err)
  291. {
  292.     ;
  293. }
  294. /************************************************************************
  295.  *  Private methods
  296.  */
  297. UINT16 CIHX2CHXDataFile::TranslateMode(UINT16 uOpenMode)
  298. {
  299.     UINT16 uMode = 0;
  300.     
  301.     if ((uOpenMode & HX_FILEFLAG_READ) && (uOpenMode & HX_FILEFLAG_WRITE))
  302.     {
  303. uMode |= O_RDWR;
  304.     }
  305.     else if (uOpenMode & HX_FILEFLAG_READ)
  306.     {
  307. uMode |= O_RDONLY;
  308.     }
  309.     else if (uOpenMode & HX_FILEFLAG_WRITE)
  310.     {
  311. uMode |= O_WRONLY;
  312.     }
  313.     
  314.     if (uOpenMode & HX_FILEFLAG_BINARY)
  315.     {
  316. uMode |= O_BINARY;
  317.     }
  318.     return uMode;
  319. }
  320. /************************************************************************
  321.  *  IUnknown methods
  322.  */
  323. STDMETHODIMP CIHX2CHXDataFile::QueryInterface(REFIID riid, void** ppvObj)
  324. {
  325. QInterfaceList qiList[] =
  326. {
  327. { GET_IIDHANDLE(IID_IUnknown), this },
  328. { GET_IIDHANDLE(IID_IHXDataFile), (IHXDataFile*) this },
  329. };
  330.     return QIFind(qiList, QILISTSIZE(qiList), riid, ppvObj);   
  331. }
  332. STDMETHODIMP_(ULONG32) CIHX2CHXDataFile::AddRef()
  333. {
  334.     return InterlockedIncrement(&m_lRefCount);
  335. }
  336. STDMETHODIMP_(ULONG32) CIHX2CHXDataFile::Release()
  337. {
  338.     if (InterlockedDecrement(&m_lRefCount) > 0)
  339.     {
  340.         return m_lRefCount;
  341.     }
  342.     delete this;
  343.     return 0;
  344. }