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

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. #include "chxdataf_stdio.h"
  36. #include "hxassert.h" // hxassert.h is NOT a system header
  37. #include "hxheap.h"
  38. #include "hxbuffer.h"
  39. #ifdef _DEBUG
  40. #undef HX_THIS_FILE
  41. static const char HX_THIS_FILE[] = __FILE__;
  42. #endif
  43. // ~CHXFile should close the file if it is open
  44. CHXDataFile::~CHXDataFile(void)
  45. {
  46.     Close();
  47. }
  48. BOOL CHXDataFile::GetTemporaryFileName(const char *tag, char* name, UINT32 ulBufLen)
  49. {
  50. return FALSE;
  51. }
  52. CHXDataFile*
  53. CHXDataFile::Construct(UINT32 ulFlags, IUnknown** ppCommonObj)
  54. {
  55.     CHXDataFile* pCHXDataFile = new CHXDataFile();
  56.     return pCHXDataFile;
  57. }
  58. //
  59. // translate mode flag defined in (hlxclibfcntl.h) to fopen flag
  60. //
  61. // buf must be at least CCH_MAX_FOPENFLAG chars
  62. //
  63. static const UINT32 CCH_MAX_FOPENFLAG = 4;
  64. static const char* TranslateOpenMode(UINT16 mode, bool bText, char* buf)
  65. {
  66.     buf[0] = '';
  67.     HX_ASSERT(!(mode & O_EXCL));
  68.     // Most mode flags are OR'able values. However, O_RDONLY is defined 0
  69.     // so we can't check val & O_RDONLY. To address this we treat the lowest
  70.     // two bits as a mutually exclusive value indicating ro, wo, rw.
  71.     UINT32 openType = mode & 0x03;
  72.     // if truncate not specified explicitly we open for appending
  73.     if( !(mode & O_TRUNC) && O_RDONLY != openType )
  74.     {
  75.         mode |= O_APPEND;
  76.     }
  77.     const char* pszAppend = 0;
  78.     if (O_RDWR == openType)
  79.     {
  80.         if(mode & O_APPEND)
  81.         {
  82.             // read and writing/append; creates file if it doesn't exist
  83.             pszAppend = "a+"; 
  84.         }
  85.         else
  86.         {
  87.             if(mode & O_CREAT)
  88.             {
  89.                 // read/write; creates file if it doesn't
  90.                 // exist; if file exists contents are destroyed
  91.                 pszAppend = "w+";
  92.             }
  93.             else
  94.             {
  95.                 // read/write; file must exist
  96.         pszAppend = "r+"; 
  97.             }
  98.         }
  99.     }
  100.     else if (O_WRONLY == openType)
  101.     {
  102.         if(mode & O_APPEND)
  103.         {
  104.             // write/append; creates file if it doesn't exist
  105.             pszAppend = "a"; 
  106.         }
  107.         else
  108.         {
  109.             if(mode & O_CREAT)
  110.             {
  111.                 // write only; if file exists contents are destroyed
  112.         pszAppend = "w"; 
  113.             }
  114.             else
  115.             {
  116.                 // reading and writing (closest we can do); file must exist
  117.                 pszAppend = "r+";
  118.             }
  119.         }
  120.     }
  121.     else if (O_RDONLY == openType)
  122.     {
  123.         // read only; file must exist
  124. pszAppend = "r"; 
  125.         HX_ASSERT(!(mode & O_CREAT));
  126.     }
  127.     
  128.     HX_ASSERT(pszAppend);
  129.     
  130.     if( pszAppend )
  131.     {
  132.         strcpy(buf, pszAppend);
  133.         if ((mode & O_BINARY) && !bText)
  134.         {
  135.     pszAppend = "b";
  136.         }
  137.         else
  138.         {
  139.             pszAppend = "t";
  140.         }
  141.         strcat(buf,pszAppend);
  142.     }
  143.     return buf;
  144. }
  145. /* Create creates a file using the specified fcntl.h mode */
  146. HX_RESULT
  147. CHXDataFile::Create(const char *filename, UINT16 mode, BOOL textFlag)
  148. {
  149.     mode |= O_CREAT;
  150.     return Open(filename, mode, textFlag);
  151. }
  152. /* Open will open a file with the specified fcntl.h permissions */
  153. HX_RESULT
  154. CHXDataFile::Open(const char *filename, UINT16 mode, BOOL textFlag)
  155. {
  156.     HX_RESULT theErr = HXR_FAIL;
  157.   
  158.     char fopenFlags[CCH_MAX_FOPENFLAG];
  159.     
  160.     if( TranslateOpenMode(mode, textFlag, fopenFlags) )
  161.     {
  162.         m_FP = fopen( filename, fopenFlags );
  163.         if(m_FP)
  164.         {
  165.            theErr = HXR_OK;
  166.         }
  167.     }
  168.     return theErr;
  169. }
  170. /* Close closes a file */
  171. HX_RESULT
  172. CHXDataFile::Close(void)
  173. {
  174.     if(!m_FP)
  175.     {
  176.         return HXR_FAIL;
  177.     }
  178.     fclose(m_FP);
  179.     m_FP = NULL;
  180.     return HXR_OK;
  181. }
  182. /* Seek moves the current file position to the offset from the fromWhere specifier */
  183. HX_RESULT
  184. CHXDataFile::Seek(ULONG32 offset, UINT16 fromWhere)
  185. {
  186.     if(!m_FP)
  187.     {
  188.         return HXR_FAIL;
  189.     }
  190.     fseek( m_FP, offset, fromWhere );
  191.     return HXR_OK;
  192. }
  193. /* Tell returns the current file position in the ra file */
  194. ULONG32
  195. CHXDataFile::Tell(void)
  196. {
  197.     if(!m_FP)
  198.     {
  199.         return 0;
  200.     }
  201.     return ftell( m_FP );
  202. }
  203. /* Read reads up to count bytes of data into buf.
  204. returns the number of bytes read, EOF, or -1 if the read failed */
  205. ULONG32
  206. CHXDataFile::Read(char* buf, ULONG32 count)
  207. {
  208.     if(!m_FP)
  209.     {
  210.         return 0;
  211.     }
  212.     return fread( buf, 1, count, m_FP );
  213. }
  214. /* Write writes up to count bytes of data from buf.
  215. returns the number of bytes written, or -1 if the write failed */
  216. ULONG32
  217. CHXDataFile::Write(const char *buf, ULONG32 count)
  218. {
  219.     if(!m_FP)
  220.     {
  221.         return 0;
  222.     }
  223.     ULONG32 numWritten = fwrite( (void*) buf, 1, count, m_FP );
  224.     return numWritten;
  225. }
  226. /* Rewinds the file to the start of the file */
  227. HX_RESULT
  228. CHXDataFile::Rewind(void)
  229. {
  230.     if(!m_FP)
  231.     {
  232.         return HXR_FAIL;
  233.     }
  234.     fseek( m_FP, 0, SEEK_SET );
  235.     return HXR_OK;
  236. }
  237. /* Delete deletes a file */
  238. HX_RESULT
  239. CHXDataFile::Delete(const char *filename)
  240. {
  241.     if(!filename)
  242.     {
  243.         return HXR_FAIL;
  244.     }
  245.     unlink(filename);
  246.     return HXR_OK;
  247. }