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

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: macff_carbon.cpp,v 1.4.32.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. #if !defined(_CARBON) && !defined(_MAC_UNIX)
  50. #error requires Carbon
  51. #endif
  52. #include <string.h>
  53. #include "platform/mac/macff.h"
  54. #include "platform/mac/cfwrappers.h"
  55. #include "platform/mac/fullpathname.h"
  56. //static int pmatch(const char* pattern, const char* string);
  57. CMacFindFile::CMacFindFile ( const char *path,
  58. const char *delimiter,
  59. const char *pattern) :
  60.     CFindFile (path, delimiter, pattern)
  61. {
  62. m_FSIterator = 0;
  63. m_pszOutFileName = NULL;
  64. }
  65. CMacFindFile::~CMacFindFile()
  66. {
  67. OS_CloseDirectory();
  68. }
  69. //
  70. // Open the directory; initialize the directory handle.
  71. // Return FALSE if the directory couldn't be opened.
  72. //
  73. BOOL CMacFindFile::OS_OpenDirectory (const char *dirname)
  74. {
  75. FSRef dirRef;
  76. OSErr err;
  77. OS_CloseDirectory(); // in case one was open
  78. // open an FSIterator for the supplied directory path
  79. #ifdef _MAC_MACHO
  80. err = FSRefFromPosixPath(dirname, &dirRef);
  81. #else
  82. err = FSRefFromHFSPath(dirname, &dirRef);
  83. #endif
  84. require_noerr_quiet(err, CantGetRefForDirPath);
  85. err = FSOpenIterator(&dirRef, kFSIterateFlat, &m_FSIterator);
  86. require_noerr(err, CantMakeIterator);
  87. return TRUE;
  88. CantMakeIterator:
  89. CantGetRefForDirPath:
  90. return FALSE;
  91. }
  92. //
  93. // release the directory
  94. //
  95. void CMacFindFile::OS_CloseDirectory ()
  96. {
  97. HX_VECTOR_DELETE(m_pszOutFileName);
  98. if (m_FSIterator)
  99. {
  100. OSErr err;
  101. err = FSCloseIterator(m_FSIterator);
  102. check_noerr(err);
  103. m_FSIterator = 0;
  104. }
  105. return;
  106. }
  107. //
  108. // Get the next file in the directory. Filters according to pattern
  109. //
  110. char* CMacFindFile::OS_GetNextFile()
  111. {
  112. require_nonnull_return(m_FSIterator, NULL); // be sure OS_OpenDirectory happened
  113. OSErr err;
  114. ItemCount actualCount;
  115. HFSUniStr255 uniName;
  116. FSCatalogInfo catInfo;
  117. Boolean bIsDir;
  118. const ItemCount kWantOneItem = 1;
  119. Boolean * kDontCareIfContainerChanged = NULL;
  120. FSSpec * kDontWantFSSpecs = NULL;
  121. FSRef * kDontWantFSRefs = NULL;
  122. // reset our output string; we'll return nil if we fail, anyway
  123. HX_VECTOR_DELETE(m_pszOutFileName);
  124. // get an item, looping if we got a directory
  125. do
  126. {
  127. err = FSGetCatalogInfoBulk(m_FSIterator, 
  128. kWantOneItem, &actualCount,
  129. kDontCareIfContainerChanged,
  130. kFSCatInfoNodeFlags, &catInfo,
  131. kDontWantFSRefs, kDontWantFSSpecs, 
  132. &uniName);
  133. bIsDir = ((catInfo.nodeFlags & kFSNodeIsDirectoryMask) != 0);
  134.                 
  135. #ifdef _MAC_MACHO
  136.                 if (!err && m_pattern)
  137.                 {
  138.                     if (!strcmp(m_pattern, "*.bundle"))
  139.                     {
  140.                         // if we're looking for bundles let's assume we can
  141.                         // call directories whose names end with ".bundle"
  142.                         // files so plugin counters work.
  143.                         CHXCFString str(uniName);
  144.                         CFStringRef strR = str;
  145.                         char buf[1024];
  146.                         CFStringGetCString(strR, buf, 1023, kCFStringEncodingMacRoman);
  147.                         
  148.                         // xxxbobclark use a better way to figure out if it's really a bundle
  149.                         
  150.                         if (strstr(buf, ".bundle"))
  151.                         {
  152.                             bIsDir = false; // fake it because it's a bundle
  153.                         }
  154.                     }
  155.                 }
  156. #endif
  157. } while (err == noErr && bIsDir);
  158. if (err == noErr)
  159. {
  160. // got a file; convert to a C-string and return a pointer
  161. #ifdef _MAC_MACHO
  162.                 CHXCFString str(uniName);
  163.                 CFStringRef strR = str;
  164.                 char buf[1024];
  165.                 size_t bufSize = 1023;
  166.                 CFStringGetCString(strR, buf, bufSize, kCFStringEncodingMacRoman);
  167.                 CHXString strName(buf);
  168. #else
  169.                 CHXString strName;
  170. strName.SetFromHFSUniStr255(uniName, CFStringGetSystemEncoding());
  171. #endif
  172. m_pszOutFileName = new char[1 + strName.GetLength()];
  173. check_nonnull(m_pszOutFileName);
  174. if (m_pszOutFileName)
  175. {
  176. strcpy(m_pszOutFileName, (const char *) strName); /* Flawfinder: ignore */
  177. }
  178. }
  179. else
  180. {
  181. // no more found; return the nil pointer
  182. }
  183. return m_pszOutFileName;
  184. }
  185. BOOL CMacFindFile::OS_InitPattern ()
  186. {
  187.     return TRUE;
  188. }
  189. BOOL CMacFindFile::OS_FileMatchesPattern (const char * fname)
  190. {
  191.     return pmatch(m_pattern, fname);
  192. }
  193. void CMacFindFile::OS_FreePattern ()
  194. {
  195.     return;
  196. }
  197. // pmatch is copied from unixff.cpp...
  198. /* Parts of pmatch() are copyright: */
  199. /*-
  200.  * Copyright (c) 1991, 1993
  201.  * The Regents of the University of California.  All rights reserved.
  202.  *
  203.  * This code is derived from software contributed to Berkeley by
  204.  * Kenneth Almquist.
  205.  *
  206.  * Redistribution and use in source and binary forms, with or without
  207.  * modification, are permitted provided that the following conditions
  208.  * are met:
  209.  * 1. Redistributions of source code must retain the above copyright
  210.  *    notice, this list of conditions and the following disclaimer.
  211.  * 2. Redistributions in binary form must reproduce the above copyright
  212.  *    notice, this list of conditions and the following disclaimer in the
  213.  *    documentation and/or other materials provided with the distribution.
  214.  * 3. All advertising materials mentioning features or use of this software
  215.  *    must display the following acknowledgement:
  216.  * This product includes software developed by the University of
  217.  * California, Berkeley and its contributors.
  218.  * 4. Neither the name of the University nor the names of its contributors
  219.  *    may be used to endorse or promote products derived from this software
  220.  *    without specific prior written permission.
  221.  *
  222.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  223.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  224.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  225.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  226.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  227.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  228.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  229.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  230.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  231.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  232.  * SUCH DAMAGE.
  233.  *
  234.  */
  235. int CMacFindFile::pmatch(const char* pattern, const char* string)
  236. {
  237.     const char *p, *q;
  238.     char c;
  239.     p = pattern;
  240.     q = string;
  241.     for (;;) {
  242. switch (c = *p++) {
  243. case '':
  244.     goto breakloop;
  245. case '?':
  246.     if (*q++ == '')
  247. return 0;
  248. break;
  249. case '*':
  250.     c = *p;
  251.     if (c != '?' && c != '*' && c != '[') {
  252. while (*q != c) {
  253.     if (*q == '')
  254. return 0;
  255.     q++;
  256. }
  257.     }
  258.     do {
  259. if (pmatch(p, q))
  260.     return 1;
  261.     } while (*q++ != '');
  262. return 0;
  263. case '[': {
  264. const char *endp;
  265. int invert, found;
  266. char chr;
  267. endp = p;
  268. if (*endp == '!')
  269. endp++;
  270. for (;;) {
  271. if (*endp == '')
  272. goto dft; /* no matching ] */
  273. if (*++endp == ']')
  274. break;
  275. }
  276. invert = 0;
  277. if (*p == '!') {
  278. invert++;
  279. p++;
  280. }
  281. found = 0;
  282. chr = *q++;
  283. if (chr == '')
  284. return 0;
  285. c = *p++;
  286. do {
  287.     if (*p == '-' && p[1] != ']') {
  288. p++;
  289. #if 0
  290. if (   collate_range_cmp(chr, c) >= 0
  291.     && collate_range_cmp(chr, *p) <= 0
  292.    )
  293.     found = 1;
  294. #endif
  295. p++;
  296.     } else {
  297. if (chr == c)
  298.     found = 1;
  299.     }
  300. } while ((c = *p++) != ']');
  301. if (found == invert)
  302.     return 0;
  303. break;
  304.     }
  305.     dft:
  306.     default:
  307. if (*q++ != c)
  308.     return 0;
  309.     break;
  310. }
  311.     }
  312. breakloop:
  313.     if (*q != '')
  314. return 0;
  315.     return 1;
  316. }
  317. // ------------------------------------------------------------------------------------
  318. #ifdef _DEBUG
  319. void CMacFindFile::TestFF(const char *directorypath, const char *pfilter)
  320. {
  321. CFindFile* pFileFinder =NULL;
  322. char * pszDllName;
  323. int count = 0;
  324. CHXString s1;
  325. Str255 s1Pasc;
  326. pFileFinder = CFindFile::CreateFindFile(directorypath, 0, pfilter);
  327. pszDllName = pFileFinder->FindFirst();
  328. while (pszDllName)
  329. {
  330. count ++;
  331. CHXString s2;
  332. s2.Format("%s: %d %sr", pfilter, (short) count, pszDllName);
  333. if (s1.GetLength() + s2.GetLength() > 255)
  334. {
  335. s1.MakeStr255(s1Pasc);
  336. DebugStr(s1Pasc);
  337. s1.Empty();
  338. }
  339. s1 += s2;
  340. char *path = pFileFinder->GetCurFilePath();
  341. char *filename = pFileFinder->GetCurFilename();
  342. char *dirpath = pFileFinder->GetCurDirectory();
  343. pszDllName = pFileFinder->FindNext();
  344. }
  345. delete pFileFinder;
  346. s1.MakeStr255(s1Pasc);
  347. DebugStr(s1Pasc);
  348. }
  349. #endif