X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0e7fa78358f89bdfd0f4b78099543b4beb2faaf6..7fcb33e5f7911aca4540a2d8a4a9834419c34dd6:/src/mac/carbon/dirmac.cpp

diff --git a/src/mac/carbon/dirmac.cpp b/src/mac/carbon/dirmac.cpp
index 9c8f191681..e9df6eedac 100644
--- a/src/mac/carbon/dirmac.cpp
+++ b/src/mac/carbon/dirmac.cpp
@@ -6,7 +6,7 @@
 // Created:     08.12.99
 // RCS-ID:      $Id$
 // Copyright:   (c) 1999 Stefan Csomor <csomor@advanced.ch>
-// Licence:     wxWindows license
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 // ============================================================================
@@ -17,7 +17,7 @@
 // headers
 // ----------------------------------------------------------------------------
 
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
     #pragma implementation "dir.h"
 #endif
 
@@ -40,10 +40,10 @@
   #include <windows.h>
 #endif
 
+#include "wx/filename.h"
 #include "wx/mac/private.h"
 
-#include "MoreFiles.h"
-#include "MoreFilesExtras.h"
+#include "MoreFilesX.h"
 
 // ----------------------------------------------------------------------------
 // constants
@@ -69,7 +69,8 @@ class wxDirData
 public:
     wxDirData(const wxString& dirname);
     ~wxDirData();
-
+    
+    void Close() ;
     void SetFileSpec(const wxString& filespec) { m_filespec = filespec; }
     void SetFlags(int flags) { m_flags = flags; }
 
@@ -79,11 +80,7 @@ public:
     const wxString& GetName() const { return m_dirname; }
 
 private:
-	CInfoPBRec			m_CPB ;
-	wxInt16				m_index ;
-	long				m_dirId ;
-	Str255				m_name ;
-	Boolean				m_isDir ;
+    FSIterator              m_iterator ;
 
     wxString m_dirname;
     wxString m_filespec;
@@ -110,94 +107,100 @@ wxDirData::wxDirData(const wxString& dirname)
         ;
 
     m_dirname.Truncate(n + 1);
-
-	FSSpec fsspec ;
-
-	wxMacFilename2FSSpec( m_dirname , &fsspec ) ;
-	m_CPB.hFileInfo.ioVRefNum = fsspec.vRefNum ;
-	m_CPB.hFileInfo.ioNamePtr = m_name ;
-	m_index = 0 ;
-
-	OSErr err = FSpGetDirectoryID( &fsspec , &m_dirId , &m_isDir ) ;
+    m_iterator = NULL ;
 }
 
 wxDirData::~wxDirData()
 {
+    Close() ;
+}
+
+void wxDirData::Close()
+{ 
+    if ( m_iterator )
+    {
+        FSCloseIterator( m_iterator ) ;
+        m_iterator = NULL ;
+    }
 }
 
 void wxDirData::Rewind() 
 {
-	m_index = 0 ;
+    Close() ;
 }
 
 bool wxDirData::Read(wxString *filename)
-{
-    if ( !m_isDir )
-        return FALSE ;
-		
-#if TARGET_CARBON
-	char c_name[256] ;
-#endif
+{        
     wxString result;
-
-	short err = noErr ;
-	
-	while ( err == noErr )
-	{
-		m_index++ ;
-		m_CPB.dirInfo.ioFDirIndex = m_index;
-		m_CPB.dirInfo.ioDrDirID = m_dirId;	/* we need to do this every time */
-		err = PBGetCatInfoSync((CInfoPBPtr)&m_CPB);
-		if ( err != noErr )
-			break ;
-
-#if TARGET_CARBON
-		p2cstrcpy( c_name, m_name ) ;
-		strcpy( (char *)m_name, c_name);
-#else
-		p2cstr( m_name ) ;
-#endif
-		if ( ( m_CPB.dirInfo.ioFlAttrib & ioDirMask) != 0 && (m_flags & wxDIR_DIRS) ) //  we have a directory
-			break ;
-			
-		if ( ( m_CPB.dirInfo.ioFlAttrib & ioDirMask) == 0 && !(m_flags & wxDIR_FILES ) ) // its a file but we don't want it
-			continue ;
-			 
-        if ( ( m_CPB.hFileInfo.ioFlFndrInfo.fdFlags & kIsInvisible ) && !(m_flags & wxDIR_HIDDEN) ) // its hidden but we don't want it
-			continue ;
-
-		wxString file( m_name ) ;
-		if ( m_filespec.IsEmpty() || m_filespec == "*.*" || m_filespec == "*" )
-		{
-		}
-		else if ( m_filespec.Length() > 1 && m_filespec.Left(1) =="*" )
-		{
-			if ( file.Right( m_filespec.Length() - 1 ).Upper() != m_filespec.Mid(1).Upper() )
-			{
-				continue ;
-			}
-		}
-		else if ( m_filespec.Length() > 1 && m_filespec.Right(1) == "*" )
-		{
-			if ( file.Left( m_filespec.Length() - 1 ).Upper() != m_filespec.Left( m_filespec.Length() - 1 ).Upper() )
-			{
-				continue ;
-			}
-		}
-		else if ( file.Upper() != m_filespec.Upper() )
-		{
-			continue ;
-		}
-
-		break ;
-	}
-	if ( err != noErr )
-	{
-		return FALSE ;
-	}
-
-	*filename = (char*) m_name ;
-
+    OSStatus err = noErr ;
+    if ( NULL == m_iterator )
+    {
+        FSRef dirRef;
+        err = wxMacPathToFSRef( m_dirname , &dirRef ) ;
+        if ( err == noErr )
+        {
+    	    err = FSOpenIterator(&dirRef, kFSIterateFlat, &m_iterator);
+    	}
+    	if ( err )
+    	{
+    	    Close() ;
+    	    return FALSE ;
+    	}
+    }
+    
+    wxString name ;
+    
+    while( noErr == err )
+    {
+        HFSUniStr255 uniname ;
+        FSRef fileRef;
+        FSCatalogInfo catalogInfo;
+        UInt32 fetched = 0;
+
+        err = FSGetCatalogInfoBulk( m_iterator, 1, &fetched, NULL, kFSCatInfoNodeFlags | kFSCatInfoFinderInfo , &catalogInfo , &fileRef, NULL, &uniname );
+        if ( errFSNoMoreItems == err )
+            return false ;
+            
+        wxASSERT( noErr == err ) ;
+        
+        if ( noErr != err )
+            break ;
+                
+        name = wxMacHFSUniStrToString( &uniname ) ;
+
+        if ( ( name == wxT(".") || name == wxT("..") ) && !(m_flags & wxDIR_DOTDOT) )
+            continue;
+
+        if ( ( name[0U] == '.' ) && !(m_flags & wxDIR_HIDDEN ) )
+            continue ;
+
+        if ( (((FileInfo*)&catalogInfo.finderInfo)->finderFlags & kIsInvisible ) && !(m_flags & wxDIR_HIDDEN ) )
+            continue ;
+        
+        // its a dir and we don't want it
+        if ( (catalogInfo.nodeFlags & kFSNodeIsDirectoryMask)  && !(m_flags & wxDIR_DIRS) )
+            continue ;
+
+        // its a file but we don't want it
+        if ( (catalogInfo.nodeFlags & kFSNodeIsDirectoryMask) == 0  && !(m_flags & wxDIR_FILES ) )
+            continue ;
+                    
+        if ( m_filespec.IsEmpty() || m_filespec == wxT("*.*") || m_filespec == wxT("*") )
+        {
+        }
+        else if ( !wxMatchWild(m_filespec, name , FALSE) )
+        {
+            continue ;
+        }
+        
+        break ;
+    }
+    if ( err != noErr )
+    {
+        return FALSE ;
+    }
+    
+    *filename = name ;
     return TRUE;
 }
 
@@ -240,12 +243,12 @@ wxString wxDir::GetName() const
     wxString name;
     if ( m_data )
     {
-	name = M_DIR->GetName();
-	if ( !name.empty() && (name.Last() == _T('/')) )
-	{
-	    // chop off the last (back)slash
-	    name.Truncate(name.length() - 1);
-	}
+    name = M_DIR->GetName();
+    if ( !name.empty() && (name.Last() == _T('/')) )
+    {
+        // chop off the last (back)slash
+        name.Truncate(name.length() - 1);
+    }
     }
 
     return name;