X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/92622ef4c2162596f543d304059375552db5c313..c17b2e31516424a77fd54b8fc192eac133269ce4:/src/mac/carbon/dirmac.cpp diff --git a/src/mac/carbon/dirmac.cpp b/src/mac/carbon/dirmac.cpp index 5f06ceab58..979f68a40e 100644 --- a/src/mac/carbon/dirmac.cpp +++ b/src/mac/carbon/dirmac.cpp @@ -1,12 +1,12 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: msw/dir.cpp +// Name: mac/dirmac.cpp // Purpose: wxDir implementation for Mac // Author: Stefan Csomor // Modified by: // Created: 08.12.99 // RCS-ID: $Id$ // Copyright: (c) 1999 Stefan Csomor -// Licence: wxWindows license +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// // ============================================================================ @@ -17,10 +17,6 @@ // headers // ---------------------------------------------------------------------------- -#ifdef __GNUG__ - #pragma implementation "dir.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -28,36 +24,16 @@ #pragma hdrstop #endif +#include "wx/dir.h" + #ifndef WX_PRECOMP #include "wx/intl.h" #include "wx/log.h" #endif // PCH -#include "wx/dir.h" -#include "wx/filefn.h" // for wxPathExists() - -#ifndef __DARWIN__ - #include -#endif - -#ifndef __DARWIN__ - #include "MoreFiles.h" - #include "MoreFilesExtras.h" -#endif - -// ---------------------------------------------------------------------------- -// constants -// ---------------------------------------------------------------------------- - -#ifndef MAX_PATH - #define MAX_PATH 260 // from VC++ headers -#endif - -// ---------------------------------------------------------------------------- -// macros -// ---------------------------------------------------------------------------- - -#define M_DIR ((wxDirData *)m_data) +#include "wx/filefn.h" // for wxDirExists() +#include "wx/filename.h" +#include "wx/mac/private.h" // ---------------------------------------------------------------------------- // private classes @@ -70,18 +46,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; @@ -108,99 +83,104 @@ 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 ; - -#ifdef __DARWIN__ - // TODO: what are we supposed to do for Mac OS X -#else - FSpGetDirectoryID( &fsspec , &m_dirId , &m_isDir ) ; -#endif + 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 ; - -#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 == "*.*" ) - { - } - 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 ; - - return TRUE; + 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; + ItemCount fetched = 0; + + err = FSGetCatalogInfoBulk( m_iterator, 1, &fetched, NULL, kFSCatInfoNodeFlags | kFSCatInfoFinderInfo , &catalogInfo , &fileRef, NULL, &uniname ); + + // expected error codes + + if ( errFSNoMoreItems == err ) + return false ; + if ( afpAccessDenied == err ) + return false ; + + 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.empty() || m_filespec == wxT("*.*") || m_filespec == wxT("*") ) + { + } + else if ( !wxMatchWild(m_filespec, name , false) ) + { + continue ; + } + + break ; + } + if ( err != noErr ) + { + return false ; + } + + *filename = name ; + return true; } // ---------------------------------------------------------------------------- @@ -210,7 +190,7 @@ bool wxDirData::Read(wxString *filename) /* static */ bool wxDir::Exists(const wxString& dir) { - return wxPathExists(dir); + return wxDirExists(dir); } // ---------------------------------------------------------------------------- @@ -226,10 +206,10 @@ wxDir::wxDir(const wxString& dirname) bool wxDir::Open(const wxString& dirname) { - delete M_DIR; + delete m_data; m_data = new wxDirData(dirname); - return TRUE; + return true; } bool wxDir::IsOpened() const @@ -237,9 +217,26 @@ bool wxDir::IsOpened() const return m_data != NULL; } +wxString wxDir::GetName() const +{ + wxString name; + if ( m_data ) + { + name = m_data->GetName(); + if ( !name.empty() && (name.Last() == _T('/')) ) + { + // chop off the last (back)slash + name.Truncate(name.length() - 1); + } + } + + return name; +} + wxDir::~wxDir() { - delete M_DIR; + delete m_data; + m_data = NULL; } // ---------------------------------------------------------------------------- @@ -250,21 +247,21 @@ 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(); + m_data->Rewind(); - M_DIR->SetFileSpec(filespec); - M_DIR->SetFlags(flags); + m_data->SetFileSpec(filespec); + m_data->SetFlags(flags); return GetNext(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); + return m_data->Read(filename); }