Files
wxWidgets/src/palmos/dir.cpp
Francesco Montorsi d38315df30 Remove identic implementations of wxDir::Exists from platform-specific files and put it in dircmn.cpp (they all used wxDirExists).
Add wxDir::Make() and wxDir::Remove() for coherency with wxDir::Exists() and document them as simple aliases to wxFileName functions, just a bit more readable.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@64632 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
2010-06-19 11:07:16 +00:00

266 lines
6.7 KiB
C++

/////////////////////////////////////////////////////////////////////////////
// Name: src/palmos/dir.cpp
// Purpose: wxDir implementation for PalmOS
// Author: William Osborne - minimal working wxPalmOS port
// Modified by:
// Created: 10.13.04
// RCS-ID: $Id$
// Copyright: (c) William Osborne
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
// ============================================================================
// declarations
// ============================================================================
// ----------------------------------------------------------------------------
// headers
// ----------------------------------------------------------------------------
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#ifndef WX_PRECOMP
#include "wx/intl.h"
#include "wx/log.h"
#endif // PCH
#include "wx/dir.h"
#include "pfall.h"
// ----------------------------------------------------------------------------
// define the types and functions used for file searching
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// constants
// ----------------------------------------------------------------------------
#ifndef MAX_PATH
#define MAX_PATH 260 // from VC++ headers
#endif
// ----------------------------------------------------------------------------
// macros
// ----------------------------------------------------------------------------
#define M_DIR ((wxDirData *)m_data)
// ----------------------------------------------------------------------------
// private classes
// ----------------------------------------------------------------------------
// this class stores everything we need to enumerate the files
class wxDirData
{
public:
wxDirData(const wxString& dirname);
~wxDirData();
bool IsOk() const { return m_dir != NULL; }
void SetFileSpec(const wxString& filespec) { m_filespec = filespec; }
void SetFlags(int flags) { m_flags = flags; }
void Close();
bool Read(wxString *filename);
const wxString& GetName() const { return m_dirname; }
private:
void *m_dir;
wxString m_dirname;
wxString m_filespec;
int m_flags;
};
// ============================================================================
// implementation
// ============================================================================
// ----------------------------------------------------------------------------
// wxDirData
// ----------------------------------------------------------------------------
wxDirData::wxDirData(const wxString& dirname)
: m_dirname(dirname)
{
m_dir = NULL;
// throw away the trailing slashes
size_t n = m_dirname.length();
wxCHECK_RET( n, wxT("empty dir name in wxDir") );
while ( n > 0 && m_dirname[--n] == '/' )
;
m_dirname.Truncate(n + 1);
// do open the dir
//m_dir = opendir(m_dirname.fn_str());
}
wxDirData::~wxDirData()
{
Close ();
}
void wxDirData::Close()
{
if ( m_dir )
{
if ( svfs_dir_endfind (m_dir) != 0 )
{
wxLogLastError(wxT("svfs_dir_endfind"));
}
m_dir = NULL;
}
}
bool wxDirData::Read(wxString *filename)
{
//dirent *de = NULL; // just to silence compiler warnings
int ret;
char tmpbuf[300];
bool matches = false;
size_t flags_search;
// speed up string concatenation in the loop a bit
wxString path = m_dirname;
path += wxT('/');
path.reserve(path.length() + 255);
wxString de_d_name;
de_d_name.reserve(500);
flags_search = 0;
if (wxDIR_DIRS & m_flags) {
flags_search |= SDIR_DIRS;
}
if (wxDIR_FILES & m_flags) {
flags_search |= SDIR_FILES;
}
if (NULL == m_dir) {
#ifdef _PACC_VER
// walk around the PalmOS pacc compiler bug
ret = svfs_dir_findfirst (m_dirname.fn_str().data(), &m_dir, tmpbuf, sizeof (tmpbuf), flags_search);
#else
ret = svfs_dir_findfirst (m_dirname.fn_str(), &m_dir, tmpbuf, sizeof (tmpbuf), flags_search);
#endif
} else {
ret = svfs_dir_findnext (m_dir, tmpbuf, sizeof (tmpbuf));
}
for (; ret > 0; ) {
#if wxUSE_UNICODE
de_d_name = wxString(tmpbuf, *wxConvFileName);
#else
de_d_name = tmpbuf;
#endif
// don't return "." and ".." unless asked for
if ( tmpbuf[0] == '.' &&
((tmpbuf[1] == '.' && tmpbuf[2] == '\0') ||
(tmpbuf[1] == '\0')) )
{
if ( !(m_flags & wxDIR_DOTDOT) )
continue;
// we found a valid match
break;
}
// check the name
if ( m_filespec.empty() )
{
matches = m_flags & wxDIR_HIDDEN ? true : tmpbuf[0] != '.';
}
else
{
// test against the pattern
matches = wxMatchWild(m_filespec, de_d_name,
!(m_flags & wxDIR_HIDDEN));
}
if (matches)
break;
ret = svfs_dir_findnext (m_dir, tmpbuf, sizeof (tmpbuf));
}
*filename = de_d_name;
return true;
}
// ----------------------------------------------------------------------------
// wxDir construction/destruction
// ----------------------------------------------------------------------------
wxDir::wxDir(const wxString& dirname)
{
m_data = NULL;
(void)Open(dirname);
}
bool wxDir::Open(const wxString& dirname)
{
delete M_DIR;
m_data = new wxDirData(dirname);
return true;
}
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() == wxT('/')) )
{
// chop off the last (back)slash
name.Truncate(name.length() - 1);
}
}
return name;
}
wxDir::~wxDir()
{
delete M_DIR;
}
// ----------------------------------------------------------------------------
// wxDir enumerating
// ----------------------------------------------------------------------------
bool wxDir::GetFirst(wxString *filename,
const wxString& filespec,
int flags) const
{
wxCHECK_MSG( IsOpened(), false, wxT("must wxDir::Open() first") );
M_DIR->Close();
M_DIR->SetFileSpec(filespec);
M_DIR->SetFlags(flags);
return GetNext(filename);
}
bool wxDir::GetNext(wxString *filename) const
{
wxCHECK_MSG( IsOpened(), false, wxT("must wxDir::Open() first") );
wxCHECK_MSG( filename, false, wxT("bad pointer in wxDir::GetNext()") );
return M_DIR->Read(filename);
}