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

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: findfile.cpp,v 1.9.32.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. #include "findfile.h"
  50. #if defined (_WINDOWS) || defined (_WIN32)
  51. #if !defined(WIN32_PLATFORM_PSPC)
  52. #include <dos.h>
  53. #endif /* !defined(WIN32_PLATFORM_PSPC) */
  54. #include "hlxclib/io.h"
  55. #include "platform/win/winff.h"
  56. #elif defined (_UNIX)
  57. #include "platform/unix/unixff.h"
  58. #elif defined (_SYMBIAN)
  59. #include "platform/symbian/symbianff.h"
  60. #elif defined (_OPENWAVE)
  61. #include "platform/openwave/opwaveff.h"
  62. #elif defined (_MACINTOSH)
  63. #include "platform/mac/macff.h"
  64. #endif
  65. #ifdef _UNIX
  66. #include <stdlib.h>
  67. #endif
  68. #include <string.h>
  69. #include "hxheap.h"
  70. #ifdef _DEBUG
  71. #undef HX_THIS_FILE
  72. static const char HX_THIS_FILE[] = __FILE__;
  73. #endif
  74. CFindFile*
  75. CFindFile::CreateFindFile(   const char *path,
  76.     const char *delimiter,
  77.     const char *pattern,
  78.     IUnknown** ppCommonObj)
  79. {
  80.     CFindFile* pFindFile = NULL;
  81. #if defined (_WINDOWS) || defined (_WIN32)
  82.     pFindFile = new CWinFindFile(path, delimiter, pattern);
  83. #elif defined (_UNIX)
  84.     pFindFile = new CUnixFindFile(path, delimiter, pattern);
  85. #elif defined (_MACINTOSH)
  86.     pFindFile = new CMacFindFile(path, delimiter, pattern);
  87. #elif defined (_SYMBIAN)
  88.     pFindFile = new CSymbianFindFile(path, delimiter, pattern, ppCommonObj);
  89. #endif
  90.     return pFindFile;
  91. }
  92. CFindFile::CFindFile (   const char *path,
  93.     const char *delimiter,
  94.     const char *pattern)
  95. {
  96.     m_searchPathDelimiter = NULL;
  97.     m_pattern = NULL;
  98.     m_curFilename = NULL;
  99.     m_pFilePath = NULL;
  100.     if (path == NULL)
  101. return;
  102.     m_searchPath = path;
  103.     if (delimiter)       
  104.     {
  105. m_searchPathDelimiter = new char [ strlen (delimiter) + 1 ];
  106. strcpy (m_searchPathDelimiter, delimiter); /* Flawfinder: ignore */
  107.     }
  108.     if (pattern)
  109.     {
  110. m_pattern = new char [ strlen (pattern) + 1 ];
  111. strcpy (m_pattern, pattern); /* Flawfinder: ignore */
  112.     }
  113.     m_curDir = NULL;
  114.     m_started = FALSE;
  115. }
  116. CFindFile::~CFindFile()
  117. {
  118.     if (m_searchPathDelimiter)
  119. delete [] m_searchPathDelimiter;
  120.     if (m_pattern)
  121. delete [] m_pattern;
  122.     if (m_curFilename)
  123. delete [] m_curFilename;
  124.     if (m_pFilePath)
  125. delete [] m_pFilePath;
  126. }
  127. char *CFindFile::FindFirst ()
  128. {
  129.     BOOL foundFirstDir = FALSE;
  130.     if (OS_InitPattern () == FALSE)
  131.     {
  132. return NULL;
  133.     }
  134.     if (m_searchPathDelimiter)
  135.     {
  136. m_curDir = strtok ((char*) ((const char*) m_searchPath), m_searchPathDelimiter);
  137.     }
  138.     else
  139.     {
  140. m_curDir = (char*) ((const char*) m_searchPath);
  141.     }
  142.     while (!foundFirstDir && m_curDir != NULL)
  143.     {
  144. if (OS_OpenDirectory (m_curDir) == TRUE)
  145. {
  146.     foundFirstDir = TRUE;
  147. }
  148. else
  149. {
  150.     if (m_searchPathDelimiter)
  151.     {
  152. m_curDir = strtok (NULL, m_searchPathDelimiter);
  153.     }
  154.     else
  155.     {
  156. m_curDir = NULL;
  157.     }
  158. }
  159.     }
  160.     if (foundFirstDir)
  161.     {
  162. m_started = TRUE;
  163. return (FindNext ());
  164.     }
  165.     else
  166.     {
  167. return NULL;
  168.     }
  169. }
  170. char *CFindFile::FindNext ()
  171. {
  172.     if (!m_started)
  173.     {
  174. return NULL;
  175.     }
  176.     char *fname = NULL;
  177.     BOOL doneWithDirs = FALSE;
  178.     if (m_curFilename != NULL)
  179.     {
  180. delete [] m_curFilename;
  181. m_curFilename = NULL;
  182.     }
  183.     // keep going until the file is found or we're out of
  184.     // directories to search for it in.
  185.     while (m_curFilename == NULL && doneWithDirs == FALSE)
  186.     {
  187. fname = OS_GetNextFile();
  188. // if we've got a file, see if it's a match
  189. if (fname != NULL)
  190. {
  191.     if (OS_FileMatchesPattern (fname))
  192.     {
  193. m_curFilename = new char [ strlen (fname) + 1 ];
  194. strcpy (m_curFilename, fname); /* Flawfinder: ignore */
  195.     }
  196. }
  197. // otherwise go on to the next directory
  198. else
  199. {
  200.     if (m_searchPathDelimiter)
  201.     {
  202. m_curDir = strtok (NULL, m_searchPathDelimiter);
  203.     }
  204.     else
  205.     {
  206. m_curDir = NULL;
  207.     }
  208.     if (m_curDir != NULL)
  209.     {
  210. // don't care if this fails; OS_GetNextFile() will
  211. // return null in that case
  212. OS_CloseDirectory ();
  213. doneWithDirs = (OS_OpenDirectory (m_curDir) == FALSE);
  214.     }
  215.     else
  216.     {
  217.                 OS_CloseDirectory ();
  218. // were're out of tokens, so we're done
  219. doneWithDirs = TRUE;
  220.     }
  221. }
  222.     }
  223.     if (m_curFilename)
  224.     {
  225. if (m_pFilePath)
  226. {
  227.     delete [] m_pFilePath;
  228.     m_pFilePath = 0;
  229. }
  230. m_pFilePath = new char[ strlen(m_curFilename) + strlen(m_curDir) + 
  231. strlen(OS_PATH_DELIMITER) + 1];
  232. if (!m_pFilePath)
  233.     return NULL;
  234. strcpy(m_pFilePath, m_curDir); /* Flawfinder: ignore */
  235. if (memcmp(&m_curDir[strlen(m_curDir) - 1], OS_PATH_DELIMITER, 1))
  236. {
  237.     strcat(m_pFilePath, OS_PATH_DELIMITER); /* Flawfinder: ignore */
  238. }
  239. strcat(m_pFilePath, m_curFilename); /* Flawfinder: ignore */
  240.     }
  241.     return (m_curFilename);
  242. }