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

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: macff.cpp,v 1.3.42.3 2004/07/09 01:44:14 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 <string.h>
  50. #include "platform/mac/macff.h"
  51. #include "pn_morefiles.h"
  52. #include "hxstrutl.h"
  53. #include "hxstring.h"
  54. #include "fullpathname.h"
  55. #ifndef _CARBON
  56. #include "morefilesextras.h" // for FSpGetDirectoryID, which is in pn_morefiles under Carbon
  57. #endif
  58. #ifndef _MAX_PATH
  59. #define _MAX_PATH 255
  60. #endif
  61. CMacFindFile::CMacFindFile ( const char *path,
  62. const char *delimiter,
  63. const char *pattern) :
  64.     CFindFile (path, delimiter, pattern)
  65. {
  66.     m_pCurrentDirectory     = NULL;
  67.     m_pCurrentFileName     = new char[_MAX_PATH];
  68.     *m_pCurrentFileName = 0;
  69.     m_pNextFileName     = new char[_MAX_PATH];
  70.     *m_pNextFileName = 0;
  71.     m_nIndex = 0;
  72.     m_VRefNum = 0;
  73.     m_DirID = 0;
  74. }
  75. CMacFindFile::~CMacFindFile()
  76. {
  77.     if (m_pCurrentDirectory)
  78.     {
  79. delete [] m_pCurrentDirectory;
  80. m_pCurrentDirectory = 0;
  81.     }
  82.     if (m_pCurrentFileName)
  83.     {
  84. delete [] m_pCurrentFileName;
  85. m_pCurrentFileName = 0;
  86.     }
  87.     if (m_pNextFileName)
  88.     {
  89. delete [] m_pNextFileName;
  90. m_pNextFileName = 0;
  91.     }
  92. }
  93. //
  94. // Open the directory; initialize the directory handle.
  95. // Return FALSE if the directory couldn't be opened.
  96. //
  97. BOOL CMacFindFile::OS_OpenDirectory (const char *dirname)
  98. {
  99.     BOOL bReturn = FALSE;
  100.     
  101.     if (m_pCurrentDirectory)
  102.     {
  103. delete [] m_pCurrentDirectory;
  104. m_pCurrentDirectory = 0;
  105.     }
  106.     UINT16 ulPatLen = 0;
  107.     /* 1 for  and 1 for NULL at end */
  108.     m_pCurrentDirectory = new char[strlen(dirname) + ulPatLen + 2];
  109.     if (!m_pCurrentDirectory)
  110. return FALSE;
  111.     strcpy(m_pCurrentDirectory, dirname); /* Flawfinder: ignore */
  112.     FSSpec dirSpec;
  113.     OSErr err = FSSpecFromPathName (dirname, &dirSpec); 
  114.     if (err == noErr)
  115.     {
  116. Boolean isDir;
  117. m_VRefNum = dirSpec.vRefNum;
  118. err = FSpGetDirectoryID(&dirSpec, &m_DirID, &isDir);
  119.     }
  120.     
  121.     if (err == noErr)
  122.     {
  123. m_nIndex = 0;
  124. bReturn = TRUE;
  125. BOOL bContinue;
  126. FSSpec nextFSpec;
  127. while (noErr == FSpGetNthDirectoryItem(m_VRefNum, m_DirID, ++m_nIndex, &nextFSpec))
  128. {
  129.     bContinue = TRUE;
  130.     if (!m_pNextFileName)
  131.     {
  132. m_pNextFileName     = new char[_MAX_PATH];
  133. if (!m_pNextFileName)
  134. {
  135.     return FALSE;
  136. }
  137. *m_pNextFileName = 0;
  138.     }
  139.     
  140.     if (!m_pCurrentFileName)
  141.     {
  142. m_pCurrentFileName     = new char[_MAX_PATH];
  143. if (!m_pCurrentFileName)
  144. {
  145.     return FALSE;
  146. }
  147. *m_pCurrentFileName = 0;
  148.     }
  149.     // matches pattern?
  150.     int len = nextFSpec.name[0];
  151.     INT16 patternLen = strlen(m_pattern)-1;
  152.     if (0 == strcmp("*.*", m_pattern))
  153.      bContinue = TRUE;
  154.     else
  155.     {
  156.     if (m_pattern[0] == '*')
  157.     {
  158.     if (0 != strncasecmp((char*)&nextFSpec.name[len-patternLen+1], &m_pattern[1], patternLen))
  159.      bContinue = FALSE;
  160.     }
  161.     else if (m_pattern[patternLen-1] == '*')
  162.     {
  163.          if (0 != strncasecmp((char*)&nextFSpec.name[1], &m_pattern[0], patternLen))
  164.           bContinue = FALSE;
  165.     }
  166.     else if (strncasecmp((char*)&nextFSpec.name[1], &m_pattern[0], patternLen))
  167.      bContinue = FALSE;
  168.     }
  169.     
  170.     if (bContinue)
  171.     {
  172.      CHXString tempStr;
  173.      tempStr = nextFSpec; // copy full path
  174.      SafeStrCpy(m_pNextFileName, (const char*)tempStr, _MAX_PATH);
  175.      return TRUE;
  176.     }
  177. }
  178.     }
  179.     // if we haven't returned yet, return TRUE if dir is valid & no pattern supplied
  180.     if (bReturn)
  181.     {
  182.      if (m_pattern)
  183.          bReturn = FALSE;
  184.     }
  185.     return bReturn;
  186. }
  187. //
  188. // Get the next file in the directory. Filters according to pattern
  189. //
  190. char* CMacFindFile::OS_GetNextFile()
  191. {
  192.     if (m_pNextFileName)
  193.     {
  194. SafeStrCpy(m_pCurrentFileName, m_pNextFileName, _MAX_PATH);
  195.     }
  196.     else
  197.     {
  198. if (m_pCurrentFileName)
  199. {
  200.     delete [] m_pCurrentFileName;
  201.     m_pCurrentFileName = NULL;
  202. }
  203.     }
  204.     
  205.     if (m_pNextFileName)
  206.     {
  207. FSSpec nextFSpec;
  208. BOOL bContinue;
  209. BOOL bFound = FALSE;
  210. INT16 len = 0;
  211. while (noErr == FSpGetNthDirectoryItem(m_VRefNum, m_DirID, ++m_nIndex, &nextFSpec))
  212. {
  213.     bContinue = TRUE;
  214.     // matches pattern(extension)? (eg. DLL)
  215.     len = nextFSpec.name[0]; // pascal str
  216.     if (m_pattern)
  217.     {
  218. INT16 patternLen = strlen(m_pattern)-1;
  219.      if (0 == strcmp("*.*", m_pattern))
  220.          bContinue = TRUE;
  221.      else
  222.      {
  223. if (m_pattern[0] == '*')
  224. {
  225.     if (0 != strncasecmp((char*)&nextFSpec.name[len-patternLen+1], &m_pattern[1], patternLen))
  226.      bContinue = FALSE;
  227. }
  228. else if (m_pattern[patternLen-1] == '*')
  229. {
  230.          if (0 != strncasecmp((char*)&nextFSpec.name[1], &m_pattern[0], patternLen))
  231.           bContinue = FALSE;
  232.      }
  233.      }
  234.     }
  235.     if (bContinue)
  236.     {
  237.      CHXString tempStr;
  238.      tempStr = nextFSpec; // copy full path
  239.         SafeStrCpy(m_pNextFileName, (const char*)tempStr, _MAX_PATH);
  240.      bFound = TRUE;
  241.      break;
  242.     }
  243. }
  244. if (!bFound)
  245. {
  246.     delete [] m_pNextFileName;
  247.     m_pNextFileName = 0;
  248. }
  249.     }
  250. #ifdef _CARBON
  251. //xxxbobclark I think this is crashing because on the final iteration
  252. // it's an empty string and is thus returning nil somehow.
  253. static char* sEmptyString = "";
  254. char* curFName = m_pCurrentFileName;
  255. if (!curFName)
  256. {
  257. curFName = sEmptyString;
  258. }
  259.     char* fName = strrchr(curFName,':');
  260. #else
  261.     char* fName = strrchr(m_pCurrentFileName,':');
  262. #endif
  263.     if (fName) 
  264.      ++fName;
  265.     else
  266.      fName = m_pCurrentFileName;
  267.     return fName;
  268. }
  269. //
  270. // release the directory
  271. //
  272. void CMacFindFile::OS_CloseDirectory ()
  273. {
  274.     return;
  275. }
  276. BOOL CMacFindFile::OS_InitPattern ()
  277. {
  278.     return TRUE;
  279. }
  280. BOOL CMacFindFile::OS_FileMatchesPattern (const char * fname)
  281. {
  282.     return TRUE;
  283. }
  284. void CMacFindFile::OS_FreePattern ()
  285. {
  286.     return;
  287. }
  288. // ------------------------------------------------------------------------------------