]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/dirmac.cpp
Added helper functions for string -> XmString conversion.
[wxWidgets.git] / src / mac / dirmac.cpp
index 36835cd68cb7ec10f1ed124310adb4aa51634412..53e9dcbd68b4ef2f34d0a4c00f7e031035d12d49 100644 (file)
   #include <windows.h>
 #endif
 
-#ifndef __DARWIN__
-  #include "morefile.h"
-  #include "moreextr.h"
-  #include "fullpath.h"
-  #include "fspcompa.h"
+#include "wx/mac/private.h"
+
+#ifdef __DARWIN__
+#  include "MoreFilesX.h"
+#else
+#  include "MoreFiles.h"
+#  include "MoreFilesExtras.h"
 #endif
 
 // ----------------------------------------------------------------------------
@@ -78,12 +80,14 @@ public:
     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 ;
+    CInfoPBRec            m_CPB ;
+    wxInt16                m_index ;
+    long                m_dirId ;
+    Str255                m_name ;
+    Boolean                m_isDir ;
 
     wxString m_dirname;
     wxString m_filespec;
@@ -102,6 +106,8 @@ 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") );
@@ -110,19 +116,27 @@ wxDirData::wxDirData(const wxString& dirname)
         ;
 
     m_dirname.Truncate(n + 1);
+    
+#ifdef __DARWIN__
+    FSRef theRef;
 
-       FSSpec fsspec ;
+    // 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 ;
-       m_CPB.hFileInfo.ioNamePtr = m_name ;
-       m_index = 0 ;
+    wxMacFilename2FSSpec( m_dirname , &fsspec ) ;
+    m_CPB.hFileInfo.ioVRefNum = fsspec.vRefNum ;
 
-#ifdef __DARWIN__
-       // TODO: what are we supposed to do for Mac OS X
-#else
-       FSpGetDirectoryID( &fsspec , &m_dirId , &m_isDir ) ;
+    err = FSpGetDirectoryID( &fsspec , &m_dirId , &m_isDir ) ;
 #endif
+    wxASSERT_MSG( (err == noErr) || (err == nsvErr) , "Error accessing directory " + m_dirname) ;
+
+    m_CPB.hFileInfo.ioNamePtr = m_name ;
+    m_index = 0 ;
 }
 
 wxDirData::~wxDirData()
@@ -131,76 +145,88 @@ wxDirData::~wxDirData()
 
 void wxDirData::Rewind() 
 {
-       m_index = 0 ;
+    m_index = 0 ;
 }
 
 bool wxDirData::Read(wxString *filename)
 {
     if ( !m_isDir )
         return FALSE ;
-               
+        
 #if TARGET_CARBON
-       char c_name[256] ;
+    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 ;
-
+    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);
+        p2cstrcpy( c_name, m_name ) ;
+        strcpy( (char *)m_name, c_name);
 #else
-               p2cstr( m_name ) ;
+        p2cstr( m_name ) ;
+#endif
+        // 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[0] == '.' ) && !(m_flags & wxDIR_HIDDEN) )
+            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
-               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 ;
+        //  we have a directory
+        if ( ( m_CPB.dirInfo.ioFlAttrib & ioDirMask) != 0 && (m_flags & wxDIR_DIRS) )
+            break ;
+        
+        // its a file but we don't want it
+        if ( ( m_CPB.dirInfo.ioFlAttrib & ioDirMask) == 0 && !(m_flags & wxDIR_FILES ) )
+            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 ;
 
     return TRUE;
 }
@@ -239,9 +265,28 @@ bool wxDir::IsOpened() const
     return m_data != NULL;
 }
 
+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);
+    }
+    }
+
+    return name;
+}
+
 wxDir::~wxDir()
 {
-    delete M_DIR;
+    if (M_DIR != NULL) {
+        delete M_DIR;
+        m_data = NULL;
+    }
 }
 
 // ----------------------------------------------------------------------------