]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/dirmac.cpp
Hopefully fixed library names generated by wx-config for OS/2's PM port.
[wxWidgets.git] / src / mac / carbon / dirmac.cpp
index ff168bafdc552519c5b3fa534f0db7537ebf3110..7c3651fd630d5b575e4815f548dc30ced7c0f345 100644 (file)
@@ -17,7 +17,7 @@
 // headers
 // ----------------------------------------------------------------------------
 
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
     #pragma implementation "dir.h"
 #endif
 
 #endif // PCH
 
 #include "wx/dir.h"
-#include "wx/filefn.h"          // for wxPathExists()
+#include "wx/filefn.h"          // for wxDirExists()
 
 #ifndef __DARWIN__
   #include <windows.h>
 #endif
 
+#include "wx/filename.h"
 #include "wx/mac/private.h"
 
-#ifdef __DARWIN__
-#  include "MoreFilesX.h"
-#else
-#  include "MoreFiles.h"
-#  include "MoreFilesExtras.h"
-#endif
+#include "MoreFilesX.h"
 
 // ----------------------------------------------------------------------------
 // constants
@@ -74,20 +70,17 @@ public:
     wxDirData(const wxString& dirname);
     ~wxDirData();
 
+    void Close() ;
     void SetFileSpec(const wxString& filespec) { m_filespec = filespec; }
     void SetFlags(int flags) { m_flags = flags; }
 
-    bool Read(wxString *filename); // reads the next 
+    bool Read(wxString *filename); // reads the next
     void Rewind() ;
 
     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;
@@ -106,8 +99,6 @@ private:
 wxDirData::wxDirData(const wxString& dirname)
          : m_dirname(dirname)
 {
-    OSErr err;
-    
     // throw away the trailing slashes
     size_t n = m_dirname.length();
     wxCHECK_RET( n, _T("empty dir name in wxDir") );
@@ -116,110 +107,101 @@ wxDirData::wxDirData(const wxString& dirname)
         ;
 
     m_dirname.Truncate(n + 1);
-    
-#ifdef __DARWIN__
-    FSRef theRef;
-
-    // get the FSRef associated with the POSIX path
-    err = FSPathMakeRef((const UInt8 *) m_dirname.c_str(), &theRef, NULL);
-    FSGetVRefNum(&theRef, &(m_CPB.hFileInfo.ioVRefNum));
-    
-    err = FSGetNodeID( &theRef , &m_dirId , &m_isDir ) ;
-#else
-    FSSpec fsspec ;
-
-    wxMacFilename2FSSpec( m_dirname , &fsspec ) ;
-    m_CPB.hFileInfo.ioVRefNum = fsspec.vRefNum ;
-
-    err = FSpGetDirectoryID( &fsspec , &m_dirId , &m_isDir ) ;
-#endif
-    wxASSERT_MSG( (err == noErr) || (err == nsvErr) , wxT("Error accessing directory " + m_dirname)) ;
-
-    m_CPB.hFileInfo.ioNamePtr = m_name ;
-    m_index = 0 ;
+    m_iterator = NULL ;
 }
 
 wxDirData::~wxDirData()
 {
+    Close() ;
+}
+
+void wxDirData::Close()
+{
+    if ( m_iterator )
+    {
+        FSCloseIterator( m_iterator ) ;
+        m_iterator = NULL ;
+    }
 }
 
-void wxDirData::Rewind() 
+void wxDirData::Rewind()
 {
-    m_index = 0 ;
+    Close() ;
 }
 
 bool wxDirData::Read(wxString *filename)
 {
-    if ( !m_isDir )
-        return FALSE ;
-        
     wxString result;
+    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 ;
 
-    short err = noErr ;
-    
-    while ( err == noErr )
+    while( noErr == err )
     {
-        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 )
+        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 ;
-        
-        // its hidden but we don't want it
-        if ( ( m_CPB.hFileInfo.ioFlFndrInfo.fdFlags & kIsInvisible ) && !(m_flags & wxDIR_HIDDEN) )
-            continue ;
-#ifdef __DARWIN__
-        // under X, names that start with '.' are hidden
-        if ( ( m_name[1] == '.' ) && !(m_flags & wxDIR_HIDDEN) )
+
+        name = wxMacHFSUniStrToString( &uniname ) ;
+
+        if ( ( name == wxT(".") || name == wxT("..") ) && !(m_flags & wxDIR_DOTDOT) )
             continue;
-#endif
-#if TARGET_CARBON
-        // under X thats the way the mounting points look like
-        if ( ( m_CPB.dirInfo.ioDrDirID == 0 ) && ( m_flags & wxDIR_DIRS) )
-            break ;
-#endif
-        //  we have a directory
-        if ( ( m_CPB.dirInfo.ioFlAttrib & ioDirMask) != 0 && (m_flags & wxDIR_DIRS) )
-            break ;
-        
+
+        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 ( ( m_CPB.dirInfo.ioFlAttrib & ioDirMask) == 0 && !(m_flags & wxDIR_FILES ) )
+        if ( (catalogInfo.nodeFlags & kFSNodeIsDirectoryMask) == 0  && !(m_flags & wxDIR_FILES ) )
             continue ;
-        
-        wxString file = wxMacMakeStringFromPascal( m_name ) ;
-        if ( m_filespec.IsEmpty() || m_filespec == wxT("*.*") || m_filespec == wxT("*") )
-        {
-        }
-        else if ( m_filespec.Length() > 1 && m_filespec.Left(1) == wxT("*") )
-        {
-            if ( file.Right( m_filespec.Length() - 1 ).Upper() != m_filespec.Mid(1).Upper() )
-            {
-                continue ;
-            }
-        }
-        else if ( m_filespec.Length() > 1 && m_filespec.Right(1) == wxT("*") )
+
+        if ( m_filespec.empty() || m_filespec == wxT("*.*") || m_filespec == wxT("*") )
         {
-            if ( file.Left( m_filespec.Length() - 1 ).Upper() != m_filespec.Left( m_filespec.Length() - 1 ).Upper() )
-            {
-                continue ;
-            }
         }
-        else if ( file.Upper() != m_filespec.Upper() )
+        else if ( !wxMatchWild(m_filespec, name , false) )
         {
             continue ;
         }
-        
+
         break ;
     }
     if ( err != noErr )
     {
-        return FALSE ;
+        return false ;
     }
-    
-    *filename = wxMacMakeStringFromPascal( m_name )  ;
 
-    return TRUE;
+    *filename = name ;
+    return true;
 }
 
 // ----------------------------------------------------------------------------
@@ -229,7 +211,7 @@ bool wxDirData::Read(wxString *filename)
 /* static */
 bool wxDir::Exists(const wxString& dir)
 {
-    return wxPathExists(dir);
+    return wxDirExists(dir);
 }
 
 // ----------------------------------------------------------------------------
@@ -248,7 +230,7 @@ bool wxDir::Open(const wxString& dirname)
     delete M_DIR;
     m_data = new wxDirData(dirname);
 
-    return TRUE;
+    return true;
 }
 
 bool wxDir::IsOpened() const
@@ -288,7 +270,7 @@ bool wxDir::GetFirst(wxString *filename,
                      const wxString& filespec,
                      int flags) const
 {
-    wxCHECK_MSG( IsOpened(), FALSE, _T("must wxDir::Open() first") );
+    wxCHECK_MSG( IsOpened(), false, _T("must wxDir::Open() first") );
 
     M_DIR->Rewind();
 
@@ -300,9 +282,9 @@ bool wxDir::GetFirst(wxString *filename,
 
 bool wxDir::GetNext(wxString *filename) const
 {
-    wxCHECK_MSG( IsOpened(), FALSE, _T("must wxDir::Open() first") );
+    wxCHECK_MSG( IsOpened(), false, _T("must wxDir::Open() first") );
 
-    wxCHECK_MSG( filename, FALSE, _T("bad pointer in wxDir::GetNext()") );
+    wxCHECK_MSG( filename, false, _T("bad pointer in wxDir::GetNext()") );
 
     return M_DIR->Read(filename);
 }