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

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: cwin32file.cpp,v 1.3.8.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 "platform/win/cwin32file.h"
  50. #include "hlxclib/fcntl.h"
  51. #include "hlxclib/windows.h"
  52. #include "hxassert.h"
  53. #define  HX_FILE_NOT_OPEN    -1000
  54. // CHXFile should set the file reference to a value
  55. // indicating the file is not open
  56. CWin32File::CWin32File (void) :
  57.     mFD(INVALID_HANDLE_VALUE)
  58. {
  59.     mLastError = HXR_OK;
  60. }
  61. // ~CHXFile should close the file if it is open
  62. CWin32File::~CWin32File(void)
  63.     // close the file if it is open
  64.     if ( mFD != INVALID_HANDLE_VALUE )
  65. Close();
  66. }
  67. // Create a file with the specified mode
  68. // Closes the previous file if it was open
  69. // returns HXR_OK or HXR_INVALID_FILE if an error occurred
  70. HX_RESULT CWin32File::Create(const char *filename, UINT16 mode, BOOL textflag)
  71. {
  72.     // close previous file if necessary
  73.     if ( mFD != INVALID_HANDLE_VALUE )
  74. Close();
  75.     DWORD acc = GENERIC_WRITE, shared = 0, disp = 0;
  76.     
  77.     if (mode & O_CREAT) 
  78.     {
  79. acc |= GENERIC_WRITE;
  80. if (mode & O_EXCL) 
  81.     disp |= CREATE_NEW;
  82. else
  83.     disp |= OPEN_ALWAYS;
  84.     }
  85.     if (mode & O_TRUNC) 
  86.     {
  87. acc |= GENERIC_WRITE;
  88. disp = TRUNCATE_EXISTING | CREATE_ALWAYS;
  89.     }
  90.     if (mode & O_RDONLY)
  91. acc = GENERIC_READ;
  92.     if (mode & O_RDWR)
  93. acc = GENERIC_READ | GENERIC_WRITE;
  94.     if (mode & O_WRONLY)
  95. acc = GENERIC_WRITE;
  96.     // create file
  97.     mLastError = HXR_OK;
  98.     if ( ( mFD = CreateFile( OS_STRING(filename), 
  99.      acc, shared, NULL, 
  100.      disp, NULL, NULL)) == INVALID_HANDLE_VALUE )
  101.     {
  102. mLastError = HXR_DOC_MISSING;
  103. return HXR_DOC_MISSING;
  104.     }
  105.     if (mode & O_APPEND) 
  106. Seek(0, SEEK_END);
  107.     return HXR_OK;
  108. }
  109. // Open a file with the specified mode
  110. // Closes the previous file if it was open
  111. // returns HXR_OK or HXR_INVALID_FILE if an error occurred
  112. HX_RESULT CWin32File::Open(const char *filename, UINT16 mode, BOOL textflag)
  113. {
  114.     // close previous file if necessary
  115.     if ( mFD != INVALID_HANDLE_VALUE )
  116. Close();
  117.     // open file
  118.     mLastError = HXR_OK;
  119.     DWORD acc = GENERIC_WRITE, disp = OPEN_ALWAYS;
  120.     if (mode & O_CREAT) 
  121.     {
  122. acc |= GENERIC_WRITE;
  123. if (mode & O_EXCL) 
  124.     disp = CREATE_NEW;
  125. else
  126.     disp = OPEN_ALWAYS;
  127.     }
  128.     if (mode & O_TRUNC) 
  129.     {
  130. acc |= GENERIC_WRITE;
  131. disp = TRUNCATE_EXISTING | CREATE_ALWAYS;
  132.     }
  133.     if (mode & O_RDONLY)
  134. acc = GENERIC_READ;
  135.     if (mode & O_RDWR)
  136. acc = GENERIC_READ | GENERIC_WRITE;
  137.     if (mode & O_WRONLY)
  138. acc = GENERIC_WRITE;
  139.     if(mode & O_TRUNC)
  140.     {
  141. acc |= GENERIC_WRITE;
  142. mFD = CreateFile(OS_STRING(filename), acc, 0, 
  143.  NULL, 0, NULL, NULL) ;
  144. if ( mFD == INVALID_HANDLE_VALUE)
  145. {
  146.     mLastError = HXR_DOC_MISSING;
  147.     return HXR_DOC_MISSING;
  148. }
  149. Close();
  150.     }
  151.     // Actually open the file
  152.     mFD = CreateFile(OS_STRING(filename), acc, 0, NULL, disp, NULL, NULL) ;
  153.     if ( mFD == INVALID_HANDLE_VALUE )
  154.     {
  155. mLastError = HXR_DOC_MISSING;
  156. return HXR_DOC_MISSING;
  157.     }
  158.     if (mode & O_APPEND)
  159. Seek(0, SEEK_END);
  160.     return HXR_OK;
  161. }
  162. // Open a file for sharing with the specified mode
  163. // Closes the previous file if it was open
  164. // returns HXR_OK or HXR_INVALID_FILE if an error occurred
  165. HX_RESULT CWin32File::OpenShared(const char *filename, UINT16 mode, UINT16 sharedmode, BOOL textflag)
  166. {
  167.     // close previous file if necessary
  168.     if ( mFD != INVALID_HANDLE_VALUE )
  169. Close();
  170.     // open file
  171.     mLastError = HXR_OK;
  172.     DWORD acc = GENERIC_WRITE, disp = 0, shared = FILE_SHARE_READ | FILE_SHARE_WRITE;
  173.     if (mode & O_CREAT) 
  174.     {
  175. acc |= GENERIC_WRITE;
  176. if (mode & O_EXCL) 
  177.     disp |= CREATE_NEW;
  178. else
  179.     disp |= OPEN_ALWAYS;
  180.     }
  181.     if (mode & O_TRUNC) 
  182.     {
  183. acc |= GENERIC_WRITE;
  184. disp = TRUNCATE_EXISTING | CREATE_ALWAYS;
  185.     }
  186.     if (mode & O_RDONLY)
  187. acc = GENERIC_READ;
  188.     if (mode & O_RDWR)
  189. acc = GENERIC_READ | GENERIC_WRITE;
  190.     if (mode & O_WRONLY)
  191. acc = GENERIC_WRITE;
  192.     if (sharedmode & SH_DENYRW)
  193. shared = 0;
  194.     if (sharedmode & SH_DENYWR)
  195. shared = FILE_SHARE_READ;
  196.     if (sharedmode & SH_DENYRD)
  197. shared = FILE_SHARE_WRITE;
  198.     if(mode & O_TRUNC)
  199.     {
  200. mFD = CreateFile(OS_STRING(filename), acc, 0, 
  201.  NULL, 0, NULL, NULL) ;
  202. // Check acces rights to this file first
  203. if ( mFD == INVALID_HANDLE_VALUE)
  204. {
  205.     mLastError = HXR_DOC_MISSING;
  206.     return HXR_DOC_MISSING;
  207. }
  208. Close();
  209.     }
  210.     // Actually open the file - use sharing mode
  211.     mFD = CreateFile(OS_STRING(filename), acc, shared, 
  212.      NULL, 0, NULL, NULL) ;
  213.     if ( mFD == INVALID_HANDLE_VALUE )
  214.     {
  215. mLastError = HXR_DOC_MISSING;
  216. return HXR_DOC_MISSING;
  217.     }
  218.     return HXR_OK;
  219. }
  220. // Close the previous file if it was open
  221. // returns HXR_OK or HXR_INVALID_FILE if an error occurred
  222. HX_RESULT CWin32File::Close(void)
  223. {
  224.     // close previous file if necessary
  225.     if ( mFD != INVALID_HANDLE_VALUE)
  226.     {
  227. mLastError = HXR_OK;   
  228. if ( CloseHandle( mFD ) == 0 )
  229. {
  230.     mLastError = HXR_INVALID_FILE;
  231.     return HXR_INVALID_FILE;
  232. }
  233. return HXR_OK;
  234.     }
  235.     return HXR_INVALID_FILE;
  236. }
  237. // Simply uses stat to get the size of the file in bytes.  If the file
  238. // is closed, it will still work.
  239. ULONG32 CWin32File::GetSize(void)
  240. {
  241.     ULONG32 ret = 0;
  242.     if (mFD != INVALID_HANDLE_VALUE) 
  243.     {
  244. ret = GetFileSize(mFD, NULL);
  245.     }
  246.     return ret;
  247. }
  248. // Seek moves the current file position to the offset from the fromWhere
  249. // specifier returns HXR_OK or HXR_INVALID_FILE if an error occurred
  250. HX_RESULT CWin32File::Seek(ULONG32 offset, UINT16 fromWhere)
  251. {
  252.     mLastError = HXR_INVALID_FILE;
  253.     if (( mFD != INVALID_HANDLE_VALUE ) &&
  254. ( SetFilePointer( mFD, offset, NULL, fromWhere ) != 0xffffffff ))
  255. mLastError = HXR_OK;
  256.     return mLastError;
  257. }
  258. // Rewind sets the file position to the start of file
  259. // returns HXR_OK or HXR_INVALID_FILE if an error occurred
  260. HX_RESULT CWin32File::Rewind(void)
  261. {
  262.     mLastError = HXR_INVALID_FILE;
  263.     if (( mFD != INVALID_HANDLE_VALUE ) &&
  264. ( SetFilePointer( mFD, 0, NULL, FILE_BEGIN ) != 0xffffffff ))
  265. mLastError = HXR_OK;
  266.     return mLastError;
  267. }
  268. // Tell returns the current file position
  269. // returns HXR_OK or -1 if an error occurred
  270. ULONG32 CWin32File::Tell(void)
  271. {   
  272.     long offset = -1;
  273.     mLastError = HXR_INVALID_FILE;
  274.     if (( mFD != INVALID_HANDLE_VALUE ) &&
  275. ((offset = SetFilePointer( mFD, 0, NULL, 
  276.    FILE_CURRENT )) != 0xffffffff ))
  277.     mLastError = HXR_OK;
  278.     return (ULONG32)offset;
  279. }
  280. /*      Read reads up to count bytes of data into buf.
  281.         returns the number of bytes read, EOF, or -1 if the read failed */
  282. ULONG32 CWin32File::Read (char *buf, ULONG32 count)
  283. {
  284.     DWORD ncnt = (DWORD)-1;           // number of bytes read
  285.     if ( mFD != INVALID_HANDLE_VALUE )
  286.     { 
  287. mLastError = HXR_OK;
  288. ULONG32 tmpCheck = Tell();
  289. HX_ASSERT(count < UINT_MAX);
  290. if ( ( ReadFile( mFD, (LPVOID)buf, (DWORD) count, &ncnt, NULL ) ) == 0 )
  291. {
  292.     mLastError = HXR_INVALID_FILE;
  293.  
  294. }
  295.     }
  296.     return (ULONG32)ncnt;
  297. }
  298. /*      Write writes up to count bytes of data from buf.
  299.         returns the number of bytes written, or -1 if the write failed */
  300. ULONG32 CWin32File::Write(const char *buf, ULONG32 count)
  301. {
  302.     DWORD ncnt = (DWORD)-1;           // number of bytes written
  303.     if ( mFD != INVALID_HANDLE_VALUE )
  304.     { 
  305. mLastError = HXR_OK;
  306. HX_ASSERT(count < UINT_MAX);
  307. if ( ( WriteFile( mFD, (LPVOID)buf, (DWORD) count, &ncnt, NULL ) ) == -1 )
  308. {
  309.     mLastError = HXR_INVALID_FILE;
  310. }
  311.     }
  312.     return (ULONG32)ncnt;
  313. }
  314. BOOL CWin32File::GetTemporaryFileName(const char *tag, char* name, UINT32 ulBufLen)
  315. {
  316.     BOOL bOk = TRUE;
  317.     char szTempPathName[_MAX_PATH] = "."; /* Flawfinder: ignore */
  318. #if !defined(WIN32_PLATFORM_PSPC)
  319.     if (!GetTempPath(_MAX_PATH,szTempPathName))
  320.     {
  321. bOk = FALSE;
  322.     }
  323. #endif /* !defined(WIN32_PLATFORM_PSPC) */
  324.     if (bOk && !GetTempFileName(OS_STRING(szTempPathName),
  325. OS_STRING(tag),0, OS_STRING2(name,_MAX_PATH)))
  326.     {
  327. bOk = FALSE;
  328.     }
  329.     return bOk;
  330. }
  331. // Delete a file 
  332. HX_RESULT CWin32File::Delete(const char *filename)
  333. {
  334.     // close previous file if necessary
  335.     if ( mFD != INVALID_HANDLE_VALUE )
  336.     {
  337. Close();
  338.     }
  339.     // delete file
  340.     mLastError = HXR_OK;
  341.     if(!DeleteFile(OS_STRING(filename)))
  342.     {
  343. if(GetLastError() == ERROR_ACCESS_DENIED)
  344.     mLastError = HXR_ACCESSDENIED;
  345. else
  346.     mLastError = HXR_DOC_MISSING;
  347. return mLastError;
  348.     }
  349.     return HXR_OK;
  350. }
  351. HX_RESULT CWin32File::ChangeSize (ULONG32 newSize)
  352. {
  353.     HX_RESULT res = HXR_FAIL;
  354.     if (mFD != INVALID_HANDLE_VALUE)
  355.     {
  356.         ULONG32 pos = Tell();
  357. if (SetFilePointer(mFD, newSize, 0, SEEK_SET) != 0xFFFFFFFF)
  358. {
  359.     if (SetEndOfFile(mFD) != 0)
  360. res = HXR_OK;
  361.             // reposition pointer at orignal position
  362.             Seek(pos, SEEK_SET);       
  363. }
  364.     }
  365.     return res;
  366. }