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

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: cwinfile.cpp,v 1.3.36.3 2004/07/09 01:44:27 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 <stdio.h>
  50. #include <io.h>
  51. #include <fcntl.h>
  52. #include <sys/stat.h>
  53. #include <errno.h>
  54. #include <share.h>
  55. #include <limits.h>
  56. #include "hxassert.h"
  57. #include "CHXDataF.h"
  58. #include "platform/win/CWinFile.h"
  59. #include <windows.h> // For GetTempPath(), etc.
  60. #include <stdlib.h> // For _MAX_PATH
  61. #include "hxcom.h"
  62. #include "hxbuffer.h"
  63. #include "hxheap.h"
  64. #ifdef _DEBUG
  65. #undef HX_THIS_FILE
  66. static const char HX_THIS_FILE[] = __FILE__;
  67. #endif
  68. #define  HX_FILE_NOT_OPEN    -1000
  69. // CHXFile should set the file reference to a value
  70. // indicating the file is not open
  71. CWinFile::CWinFile (void)
  72. {
  73. // set FD to indicate file is not open
  74. mFD = HX_FILE_NOT_OPEN;
  75. mLastError = HXR_OK;
  76. }
  77. // ~CHXFile should close the file if it is open
  78. CWinFile::~CWinFile(void)
  79. // close the file if it is open
  80. if ( mFD >= 0 )
  81. {
  82. close( mFD );
  83. }
  84. }
  85. // Create a file with the specified mode
  86. // Closes the previous file if it was open
  87. // returns HXR_OK or HXR_INVALID_FILE if an error occurred
  88. HX_RESULT CWinFile::Create(const char *filename, UINT16 mode, BOOL textflag)
  89. {
  90. // close previous file if necessary
  91. if ( mFD >= 0 )
  92. {
  93. close( mFD );
  94. }
  95. // create file
  96. mLastError = HXR_OK;
  97. if ( ( mFD = creat( filename, mode ) ) < 0 )
  98. {
  99.    mLastError = HXR_DOC_MISSING;
  100.    return HXR_DOC_MISSING;
  101. }
  102. return HXR_OK;
  103. }
  104. // Open a file with the specified mode
  105. // Closes the previous file if it was open
  106. // returns HXR_OK or HXR_INVALID_FILE if an error occurred
  107. HX_RESULT CWinFile::Open(const char *filename, UINT16 mode, BOOL textflag)
  108. {
  109. // close previous file if necessary
  110. if ( mFD >= 0 )
  111. {
  112. close( mFD );
  113. }
  114. // open file
  115. mLastError = HXR_OK;
  116. int shareFlag = SH_DENYNO;
  117. if(mode & O_TRUNC)
  118. {
  119. // Check acces rights to this file first
  120.     if (!textflag)
  121. mFD = sopen( filename, mode | O_BINARY, SH_DENYRW, S_IREAD | S_IWRITE );
  122. else
  123. mFD = sopen( filename, mode | O_TEXT, SH_DENYRW, S_IREAD | S_IWRITE );
  124.     if ( mFD < 0)
  125.     {
  126.     mLastError = HXR_DOC_MISSING;
  127.     return HXR_DOC_MISSING;
  128.     }
  129. close( mFD );
  130. }
  131.   // Actually open the file
  132.     if (!textflag)
  133. mFD = open( filename, mode | O_BINARY, S_IREAD | S_IWRITE );
  134. else
  135. mFD = open( filename, mode | O_TEXT, S_IREAD | S_IWRITE );
  136.     if ( mFD < 0 )
  137. {
  138.     mLastError = HXR_DOC_MISSING;
  139.     return HXR_DOC_MISSING;
  140. }
  141. return HXR_OK;
  142. }
  143. // Open a file for sharing with the specified mode
  144. // Closes the previous file if it was open
  145. // returns HXR_OK or HXR_INVALID_FILE if an error occurred
  146. HX_RESULT CWinFile::OpenShared(const char *filename, UINT16 mode, UINT16 sharedmode, BOOL textflag)
  147. {
  148. // close previous file if necessary
  149. if ( mFD >= 0 )
  150. {
  151. close( mFD );
  152. }
  153. // open file
  154. mLastError = HXR_OK;
  155. int shareFlag = SH_DENYNO;
  156. if(mode & O_TRUNC)
  157. {
  158. // Check acces rights to this file first
  159.     if (!textflag)
  160. mFD = sopen( filename, mode | O_BINARY, SH_DENYRW, S_IREAD | S_IWRITE );
  161. else
  162. mFD = sopen( filename, mode | O_TEXT, SH_DENYRW, S_IREAD | S_IWRITE );
  163.     if ( mFD < 0)
  164.     {
  165.     mLastError = HXR_DOC_MISSING;
  166.     return HXR_DOC_MISSING;
  167.     }
  168. close( mFD );
  169. }
  170.   // Actually open the file - use sharing mode
  171.     if (!textflag)
  172. mFD = sopen( filename, mode | O_BINARY, sharedmode, S_IREAD | S_IWRITE );
  173. else
  174. mFD = sopen( filename, mode | O_TEXT, sharedmode, S_IREAD | S_IWRITE );
  175.     if ( mFD < 0 )
  176. {
  177.     if(errno == EACCES)
  178.     mLastError = HXR_ACCESSDENIED;
  179.     else
  180.     mLastError = HXR_DOC_MISSING;
  181.     return mLastError;
  182. }
  183. return HXR_OK;
  184. }
  185. // Close the previous file if it was open
  186. // returns HXR_OK or HXR_INVALID_FILE if an error occurred
  187. HX_RESULT CWinFile::Close(void)
  188. {
  189. // close previous file if necessary
  190. if ( mFD >= 0 )
  191. {
  192. mLastError = HXR_OK;   
  193. if ( close( mFD ) < 0 )
  194. {
  195. mLastError = HXR_INVALID_FILE;
  196. return HXR_INVALID_FILE;
  197. }
  198. return HXR_OK;
  199. }
  200. return HXR_INVALID_FILE;
  201. }
  202. // Simply uses stat to get the size of the file in bytes.  If the file
  203. // is closed, it will still work.
  204. ULONG32 CWinFile::GetSize(void)
  205. {
  206.     struct _stat filestats;
  207.     if (mFD >= 0) 
  208.     {
  209. _fstat(mFD, &filestats);
  210. return filestats.st_size;
  211.     }
  212.     return 0;
  213. }
  214. HX_RESULT CWinFile::ChangeSize (ULONG32 newSize)
  215. {
  216.     if (mFD >= 0)
  217.     {
  218.         // Ff the file pointer is passed the new size, we ought to position it in a valid spot.
  219.         ULONG32 pos = Tell();
  220.         if (pos > newSize)
  221.             Seek(newSize, SEEK_SET);
  222.                 
  223.         if (!_chsize(mFD, newSize))
  224.             return HXR_OK;
  225.         else // reposition pointer at orignal position
  226.             Seek(pos, SEEK_SET);              
  227.     }    
  228.     return HXR_FAIL;
  229. }
  230. // Seek moves the current file position to the offset from the fromWhere
  231. // specifier returns HXR_OK or HXR_INVALID_FILE if an error occurred
  232. HX_RESULT CWinFile::Seek(ULONG32 offset, UINT16 fromWhere)
  233. {
  234. if ( mFD >= 0 )
  235. {
  236. mLastError = HXR_OK;       
  237. if ( lseek( mFD, offset, fromWhere ) < 0 )
  238. {
  239. mLastError = HXR_INVALID_FILE;
  240. return HXR_INVALID_FILE;
  241. }
  242. return HXR_OK;
  243. }
  244. return HXR_INVALID_FILE;
  245. }
  246. // Rewind sets the file position to the start of file
  247. // returns HXR_OK or HXR_INVALID_FILE if an error occurred
  248. HX_RESULT CWinFile::Rewind(void)
  249. {
  250. if ( mFD >= 0 )
  251. {
  252. mLastError = HXR_OK;       
  253. if ( lseek( mFD, 0, SEEK_SET ) < 0 )
  254. {
  255. mLastError = HXR_INVALID_FILE;
  256. return HXR_INVALID_FILE;
  257. }
  258. return HXR_OK;
  259. }
  260. return HXR_INVALID_FILE;
  261. }
  262. // Tell returns the current file position
  263. // returns HXR_OK or -1 if an error occurred
  264. ULONG32 CWinFile::Tell(void)
  265. {   
  266. long offset = -1;
  267. if ( mFD >= 0 )
  268. {
  269. mLastError = HXR_OK;       
  270. if ((offset = tell( mFD )) < 0 )
  271. {
  272. mLastError = HXR_INVALID_FILE;
  273. }
  274. }
  275. return (ULONG32)offset;
  276. }
  277. /*      Read reads up to count bytes of data into buf.
  278.         returns the number of bytes read, EOF, or -1 if the read failed */
  279. ULONG32 CWinFile::Read (char *buf, ULONG32 count)
  280. {
  281. UINT ncnt = (UINT)-1;           // number of bytes read
  282. if ( mFD >= 0 )
  283. mLastError = HXR_OK;
  284. ULONG32 tmpCheck = Tell();
  285. HX_ASSERT(count < UINT_MAX);
  286. if ( ( ncnt = read( mFD, buf, (UINT) count ) ) == -1 )
  287. {
  288. mLastError = HXR_INVALID_FILE;
  289.  
  290. }
  291. }
  292. return (ULONG32)ncnt;
  293. }
  294. /*      Write writes up to count bytes of data from buf.
  295.         returns the number of bytes written, or -1 if the write failed */
  296. ULONG32 CWinFile::Write(const char *buf, ULONG32 count)
  297. {
  298. UINT ncnt = (UINT)-1;           // number of bytes written
  299. if ( mFD >= 0 )
  300. mLastError = HXR_OK;
  301. HX_ASSERT(count < UINT_MAX);
  302. if ( ( ncnt = write( mFD, buf, (UINT)count ) ) == -1 )
  303. {
  304. mLastError = HXR_INVALID_FILE;
  305. }
  306. }
  307. return (ULONG32)ncnt;
  308. }
  309. BOOL CWinFile::GetTemporaryFileName(const char *tag, char* name, UINT32 ulBufLen)
  310. {
  311. BOOL bOk = FALSE;
  312. #ifdef _WIN32
  313. char szTempPathName[_MAX_PATH]; /* Flawfinder: ignore */
  314. if (!GetTempPath(_MAX_PATH,szTempPathName))
  315. {
  316. goto exit;
  317. }
  318. if (!GetTempFileName(szTempPathName,tag,0,name))
  319. {
  320. goto exit;
  321. }
  322. #else
  323. if (!GetTempFileName(0,tag,0,name))
  324. {
  325. goto exit;
  326. }
  327. #endif _WIN32
  328. // If we made it this far then we're cool!
  329. bOk = TRUE;
  330. exit:
  331. return bOk;
  332. }
  333. // Delete a file 
  334. HX_RESULT CWinFile::Delete(const char *filename)
  335. {
  336. // close previous file if necessary
  337. if ( mFD >= 0 )
  338. {
  339. close( mFD );
  340. }
  341. // delete file
  342. mLastError = HXR_OK;
  343. if(unlink(filename))
  344. {
  345. if(errno == EACCES)
  346. mLastError = HXR_ACCESSDENIED;
  347. else
  348. mLastError = HXR_DOC_MISSING;
  349. return mLastError;
  350. }
  351. return HXR_OK;
  352. }