]>
git.saurik.com Git - wxWidgets.git/blob - src/os2/dir.cpp
1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: wxDir implementation for OS/2
4 // Author: Vadim Zeitlin
5 // Modified by: Stefan Neis
8 // Copyright: (c) 1999 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 // ============================================================================
14 // ============================================================================
16 // ----------------------------------------------------------------------------
18 // ----------------------------------------------------------------------------
21 #pragma implementation "dir.h"
24 // For compilers that support precompilation, includes "wx.h".
25 #include "wx/wxprec.h"
28 #include "wx/os2/private.h"
34 #include "wx/filefn.h" // for wxMatchWild
36 #include <sys/types.h>
38 #define INCL_DOSFILEMGR
39 #define INCL_DOSERRORS
46 // ----------------------------------------------------------------------------
47 // define the types and functions used for file searching
48 // ----------------------------------------------------------------------------
50 typedef FILEFINDBUF3 FIND_STRUCT
;
51 typedef HDIR FIND_DATA
;
52 typedef ULONG FIND_ATTR
;
54 static inline FIND_DATA
InitFindData() { return ERROR_INVALID_HANDLE
; }
56 static inline bool IsFindDataOk(
60 return vFd
!= ERROR_INVALID_HANDLE
;
63 static inline void FreeFindData(
67 if (!::DosFindClose(vFd
))
69 wxLogLastError(_T("DosFindClose"));
73 static inline FIND_DATA
FindFirst(
74 const wxString
& rsSpec
75 , FIND_STRUCT
* pFinddata
78 ULONG ulFindCount
= 1;
79 FIND_DATA hDir
= HDIR_CREATE
;
82 rc
= ::DosFindFirst( rsSpec
.c_str()
84 ,0x37 // was: FILE_NORMAL
91 return InitFindData();
95 static inline bool FindNext(
97 , FIND_STRUCT
* pFinddata
100 ULONG ulFindCount
= 1;
102 return ::DosFindNext( vFd
104 ,sizeof(FILEFINDBUF3
)
109 static const wxChar
* GetNameFromFindData(
110 FIND_STRUCT
* pFinddata
113 return pFinddata
->achName
;
116 static const FIND_ATTR
GetAttrFromFindData(
117 FIND_STRUCT
* pFinddata
120 return pFinddata
->attrFile
;
123 static inline bool IsDir(
127 return (vAttr
& FILE_DIRECTORY
) != 0;
130 static inline bool IsHidden(
134 return (vAttr
& (FILE_HIDDEN
| FILE_SYSTEM
)) != 0;
137 // ----------------------------------------------------------------------------
139 // ----------------------------------------------------------------------------
142 #define MAX_PATH 260 // from PM++ headers
145 // ----------------------------------------------------------------------------
147 // ----------------------------------------------------------------------------
149 #define M_DIR ((wxDirData *)m_data)
151 // ----------------------------------------------------------------------------
153 // ----------------------------------------------------------------------------
155 // this class stores everything we need to enumerate the files
159 wxDirData(const wxString
& rsDirname
);
162 void SetFileSpec(const wxString
& rsFilespec
) { m_sFilespec
= rsFilespec
; }
163 void SetFlags(int nFlags
) { m_nFlags
= nFlags
; }
165 const wxString
& GetName() const { return m_sDirname
; }
168 bool Read(wxString
* rsFilename
);
171 FIND_DATA m_vFinddata
;
173 wxString m_sFilespec
;
175 }; // end of CLASS wxDirData
177 // ============================================================================
179 // ============================================================================
181 // ----------------------------------------------------------------------------
183 // ----------------------------------------------------------------------------
185 wxDirData::wxDirData(
186 const wxString
& rsDirname
188 : m_sDirname(rsDirname
)
190 m_vFinddata
= InitFindData();
191 } // end of wxDirData::wxDirData
193 wxDirData::~wxDirData()
196 } // end of wxDirData::~wxDirData
198 void wxDirData::Close()
200 if ( IsFindDataOk(m_vFinddata
) )
202 FreeFindData(m_vFinddata
);
203 m_vFinddata
= InitFindData();
205 } // end of wxDirData::Close
207 void wxDirData::Rewind()
210 } // end of wxDirData::Rewind
212 bool wxDirData::Read(
218 FILEFINDBUF3 vFinddata
;
219 #define PTR_TO_FINDDATA (&vFinddata)
221 if (!IsFindDataOk(m_vFinddata
))
226 wxString sFilespec
= m_sDirname
;
228 if ( !wxEndsWithPathSeparator(sFilespec
) )
230 sFilespec
+= _T('\\');
232 sFilespec
+= (!m_sFilespec
? _T("*.*") : m_sFilespec
.c_str());
234 m_vFinddata
= FindFirst( sFilespec
240 if ( !IsFindDataOk(m_vFinddata
) )
256 if (!FindNext( m_vFinddata
264 zName
= GetNameFromFindData(PTR_TO_FINDDATA
);
265 vAttr
= GetAttrFromFindData(PTR_TO_FINDDATA
);
268 // Don't return "." and ".." unless asked for
270 if ( zName
[0] == _T('.') &&
271 ((zName
[1] == _T('.') && zName
[2] == _T('\0')) ||
272 (zName
[1] == _T('\0'))) )
274 if (!(m_nFlags
& wxDIR_DOTDOT
))
279 // Check the type now
281 if (!(m_nFlags
& wxDIR_FILES
) && !IsDir(vAttr
))
284 // It's a file, but we don't want them
288 else if (!(m_nFlags
& wxDIR_DIRS
) && IsDir(vAttr
) )
291 // It's a dir, and we don't want it
297 // Finally, check whether it's a hidden file
299 if (!(m_nFlags
& wxDIR_HIDDEN
))
304 // It's a hidden file, skip it
313 } // end of wxDirData::Read
315 // ----------------------------------------------------------------------------
317 // ----------------------------------------------------------------------------
321 const wxString
& rsDir
324 return wxDirExists(rsDir
);
325 } // end of wxDir::Exists
327 // ----------------------------------------------------------------------------
328 // wxDir construction/destruction
329 // ----------------------------------------------------------------------------
332 const wxString
& rsDirname
337 (void)Open(rsDirname
);
338 } // end of wxDir::wxDir
341 const wxString
& rsDirname
345 m_data
= new wxDirData(rsDirname
);
347 } // end of wxDir::Open
349 bool wxDir::IsOpened() const
351 return m_data
!= NULL
;
352 } // end of wxDir::IsOpen
354 wxString
wxDir::GetName() const
359 name
= M_DIR
->GetName();
362 // bring to canonical Windows form
363 name
.Replace(_T("/"), _T("\\"));
365 if ( name
.Last() == _T('\\') )
367 // chop off the last (back)slash
368 name
.Truncate(name
.length() - 1);
379 } // end of wxDir::~wxDir
381 // ----------------------------------------------------------------------------
383 // ----------------------------------------------------------------------------
385 bool wxDir::GetFirst(
387 , const wxString
& rsFilespec
391 wxCHECK_MSG( IsOpened(), false, _T("must wxDir::Open() first") );
393 M_DIR
->SetFileSpec(rsFilespec
);
394 M_DIR
->SetFlags(nFlags
);
395 return GetNext(psFilename
);
396 } // end of wxDir::GetFirst
402 wxCHECK_MSG( IsOpened(), false, _T("must wxDir::Open() first") );
403 wxCHECK_MSG( psFilename
, false, _T("bad pointer in wxDir::GetNext()") );
404 return M_DIR
->Read(psFilename
);
405 } // end of wxDir::GetNext