winff.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 "hxtypes.h"
  36. #include "hlxclib/windows.h"
  37. #include <stdlib.h>
  38. #include <string.h>
  39. #if !defined(WIN32_PLATFORM_PSPC)
  40. #include <dos.h>
  41. #endif /* !defined(WIN32_PLATFORM_PSPC) */
  42. #include "hlxclib/io.h"
  43. #include <ctype.h>
  44. #include "hxresult.h"
  45. #include "hxstrutl.h"
  46. #include "findfile.h"
  47. #include "platform/win/winff.h"
  48. #include "hxheap.h"
  49. #ifdef _DEBUG
  50. #undef HX_THIS_FILE
  51. static const char HX_THIS_FILE[] = __FILE__;
  52. #endif
  53. CWinFindFile::CWinFindFile  (   const char *path,
  54.     const char *delimiter,
  55.     const char *pattern) :
  56.     CFindFile (path, delimiter, pattern)
  57. {
  58. #ifdef _WIN32
  59.     m_lFileHandle     = 0;
  60.     m_bDone     = FALSE;
  61. #endif
  62.     m_pCurrentDirectory     = NULL;
  63.     m_pCurrentFileName     = new char[_MAX_PATH];
  64.     m_pNextFileName     = new char[_MAX_PATH];
  65.     memset(m_pCurrentFileName, 0, _MAX_PATH);
  66.     memset(m_pNextFileName, 0, _MAX_PATH);
  67. }
  68. CWinFindFile::~CWinFindFile()
  69. {
  70.     if (m_pCurrentDirectory)
  71.     {
  72. delete [] m_pCurrentDirectory;
  73. m_pCurrentDirectory = 0;
  74.     }
  75.     if (m_pCurrentFileName)
  76.     {
  77. delete [] m_pCurrentFileName;
  78. m_pCurrentFileName = 0;
  79.     }
  80.     if (m_pNextFileName)
  81.     {
  82. delete [] m_pNextFileName;
  83. m_pNextFileName = 0;
  84.     }
  85. #ifndef _WIN16
  86.     if (m_lFileHandle)
  87.     {
  88.         OS_CloseDirectory();
  89.     }
  90. #endif
  91. }
  92. //
  93. // Open the directory; initialize the directory handle.
  94. // Return FALSE if the directory couldn't be opened.
  95. //
  96. BOOL CWinFindFile::OS_OpenDirectory (const char *dirname)
  97. {
  98. #ifdef _WIN32
  99.     /* don't call this before calling CloseDirectory()!*/
  100.     if (m_lFileHandle > 0)
  101. return FALSE;
  102. #endif
  103.     if (m_pCurrentDirectory)
  104.     {
  105. delete [] m_pCurrentDirectory;
  106. m_pCurrentDirectory = 0;
  107.     }
  108.     UINT16 ulPatLen = 0;
  109.     if (m_pattern)
  110.     {
  111. ulPatLen = strlen(m_pattern);
  112.     }
  113.     /* 1 for  and 1 for NULL at end */
  114.     UINT32 ulLen = strlen(dirname) + ulPatLen + 2;
  115.     m_pCurrentDirectory = new char[ulLen];
  116.     if (!m_pCurrentDirectory)
  117. return FALSE;
  118.     SafeStrCpy(m_pCurrentDirectory, dirname, ulLen);
  119.     if (m_pattern)
  120.     {
  121. if(strlen(m_pCurrentDirectory) &&
  122.    m_pCurrentDirectory[strlen(m_pCurrentDirectory) - 1] != '\')
  123. SafeStrCat(m_pCurrentDirectory, OS_PATH_DELIMITER, ulLen);
  124. SafeStrCat(m_pCurrentDirectory, m_pattern, ulLen);
  125.     }
  126. #ifdef _WIN32
  127. #if !defined(WIN32_PLATFORM_PSPC)
  128.     m_lFileHandle = _findfirst( m_pCurrentDirectory, &m_FileInfo);
  129. #else /* !defined(WIN32_PLATFORM_PSPC) */
  130.     m_lFileHandle = FindFirstFile( OS_STRING(m_pCurrentDirectory), &m_FileInfo);
  131. #endif /* !defined(WIN32_PLATFORM_PSPC) */
  132.     if (m_lFileHandle > 0)
  133.     {
  134. if (!m_pNextFileName)
  135. {
  136.     m_pNextFileName     = new char[_MAX_PATH];
  137.     if (!m_pNextFileName)
  138.     {
  139. return FALSE;
  140.     }
  141. }
  142. if (!m_pCurrentFileName)
  143. {
  144.     m_pCurrentFileName     = new char[_MAX_PATH];
  145.     if (!m_pCurrentFileName)
  146.     {
  147. return FALSE;
  148.     }
  149. }
  150. #ifndef WIN32_PLATFORM_PSPC
  151. SafeStrCpy(m_pNextFileName, m_FileInfo.name, _MAX_PATH);
  152. #else
  153. SafeStrCpy(m_pNextFileName, OS_STRING(m_FileInfo.cFileName), _MAX_PATH);
  154. #endif
  155. return TRUE;
  156.     }
  157.     else
  158.     {
  159. return FALSE;
  160.     }
  161. #else
  162.     if (!_dos_findfirst( m_pCurrentDirectory, _A_ARCH | _A_HIDDEN | _A_NORMAL | _A_RDONLY, &m_FileInfo))
  163.     {
  164. SafeStrCpy(m_pNextFileName, m_FileInfo.name, _MAX_PATH);
  165. return TRUE;
  166.     }
  167.     else
  168.     {
  169. return FALSE;
  170.     }
  171. #endif // _WIN32
  172. }
  173. //
  174. // Get the next file in the directory.  This *does not*
  175. // filter out based on the pattern; every file is returned.
  176. //
  177. char* CWinFindFile::OS_GetNextFile()
  178. {
  179.     if (m_pNextFileName)
  180.     {
  181. SafeStrCpy(m_pCurrentFileName, m_pNextFileName, _MAX_PATH);
  182.     }
  183.     else
  184.     {
  185. if (m_pCurrentFileName)
  186. {
  187.     delete [] m_pCurrentFileName;
  188.     m_pCurrentFileName = NULL;
  189. }
  190.     }
  191.     if (m_pNextFileName)
  192.     {
  193. #if defined(_WIN32) && !defined(WIN32_PLATFORM_PSPC)
  194. if (_findnext( m_lFileHandle,&m_FileInfo) !=-1 )
  195. #elif defined(WIN32_PLATFORM_PSPC)
  196. if (FindNextFile( m_lFileHandle,&m_FileInfo) != 0 )
  197. #else
  198.      if (_dos_findnext( &m_FileInfo) == 0)
  199. #endif
  200. {
  201. #ifndef WIN32_PLATFORM_PSPC
  202. SafeStrCpy(m_pNextFileName, m_FileInfo.name, _MAX_PATH);
  203. #else
  204. SafeStrCpy(m_pNextFileName, OS_STRING(m_FileInfo.cFileName), _MAX_PATH);
  205. #endif
  206. }
  207. else
  208. {
  209.     delete [] m_pNextFileName;
  210.     m_pNextFileName = 0;
  211. }
  212.     }
  213.     return m_pCurrentFileName;
  214. }
  215. //
  216. // release the directory
  217. //
  218. void CWinFindFile::OS_CloseDirectory ()
  219. {
  220.     if( m_lFileHandle )
  221.     {
  222. #if defined(_WIN32) && !defined(WIN32_PLATFORM_PSPC)
  223. _findclose(m_lFileHandle);
  224. #elif defined(WIN32_PLATFORM_PSPC) && !defined(_WIN32_WCE_EMULATION)
  225. FindClose(m_lFileHandle);
  226. #endif
  227. m_lFileHandle = 0;
  228.     }
  229. }
  230. BOOL CWinFindFile::OS_InitPattern ()
  231. {
  232.     return TRUE;
  233. }
  234. BOOL CWinFindFile::OS_FileMatchesPattern (const char * fname)
  235. {
  236.     /* All the files that we get are already pattern matched */
  237.     return TRUE;
  238. }
  239. void CWinFindFile::OS_FreePattern ()
  240. {
  241.     return;
  242. }