removed platform-specific code for wxFindFirst/NextFile and replaced it with a generic implementation that uses wxDir

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@13037 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Václav Slavík 2001-12-16 11:20:16 +00:00
parent c4bcd8fcdd
commit c04857dd6a

View File

@ -1304,436 +1304,6 @@ bool wxGetTempFileName(const wxString& prefix, wxString& buf)
// Get first file name matching given wild card.
#if defined(__UNIX__)
// Get first file name matching given wild card.
// Flags are reserved for future use.
#if !defined( __VMS__ ) || ( __VMS_VER >= 70000000 )
static DIR *gs_dirStream = (DIR *) NULL;
static wxString gs_strFileSpec;
static int gs_findFlags = 0;
#endif
wxString wxFindFirstFile(const wxChar *spec, int flags)
{
wxString result;
#ifdef __VMS
wxChar *specvms = NULL;
#endif
#if !defined( __VMS__ ) || ( __VMS_VER >= 70000000 )
if (gs_dirStream)
closedir(gs_dirStream); // edz 941103: better housekeping
gs_findFlags = flags;
gs_strFileSpec = spec;
// Find path only so we can concatenate
// found file onto path
wxString path(wxPathOnly(gs_strFileSpec));
// special case: path is really "/"
if ( !path && gs_strFileSpec[0u] == wxT('/') )
#ifdef __VMS
{
wxStrcpy( specvms , wxT( "[000000]" ) );
gs_strFileSpec = specvms;
wxString path_vms(wxPathOnly(gs_strFileSpec));
path = path_vms;
}
#else
path = wxT('/');
#endif
// path is empty => Local directory
if ( !path )
#ifdef __VMS
{
wxStrcpy( specvms , wxT( "[]" ) );
gs_strFileSpec = specvms;
wxString path_vms1(wxPathOnly(gs_strFileSpec));
path = path_vms1;
}
#else
path = wxT('.');
#endif
gs_dirStream = opendir(path.fn_str());
if ( !gs_dirStream )
{
wxLogSysError(_("Can not enumerate files in directory '%s'"),
path.c_str());
}
else
{
result = wxFindNextFile();
}
#endif // !VMS6.x or earlier
return result;
}
wxString wxFindNextFile()
{
wxString result;
#if !defined( __VMS__ ) || ( __VMS_VER >= 70000000 )
wxCHECK_MSG( gs_dirStream, result, wxT("must call wxFindFirstFile first") );
// Find path only so we can concatenate
// found file onto path
wxString path(wxPathOnly(gs_strFileSpec));
wxString name(wxFileNameFromPath(gs_strFileSpec));
/* MATTHEW: special case: path is really "/" */
if ( !path && gs_strFileSpec[0u] == wxT('/'))
path = wxT('/');
// Do the reading
struct dirent *nextDir;
for ( nextDir = readdir(gs_dirStream);
nextDir != NULL;
nextDir = readdir(gs_dirStream) )
{
if (wxMatchWild(name, nextDir->d_name, FALSE) && // RR: added FALSE to find hidden files
strcmp(nextDir->d_name, ".") &&
strcmp(nextDir->d_name, "..") )
{
result.Empty();
if ( !path.IsEmpty() )
{
result = path;
if ( path != wxT('/') )
result += wxT('/');
}
result += nextDir->d_name;
// Only return "." and ".." when they match
bool isdir;
if ( (strcmp(nextDir->d_name, ".") == 0) ||
(strcmp(nextDir->d_name, "..") == 0))
{
if ( (gs_findFlags & wxDIR) != 0 )
isdir = TRUE;
else
continue;
}
else
isdir = wxDirExists(result);
// and only return directories when flags & wxDIR
if ( !gs_findFlags ||
((gs_findFlags & wxDIR) && isdir) ||
((gs_findFlags & wxFILE) && !isdir) )
{
return result;
}
}
}
result.Empty(); // not found
closedir(gs_dirStream);
gs_dirStream = (DIR *) NULL;
#endif // !VMS6.2 or earlier
return result;
}
#elif defined(__WXMAC__)
struct MacDirectoryIterator
{
CInfoPBRec m_CPB ;
wxInt16 m_index ;
long m_dirId ;
Str255 m_name ;
} ;
static int g_iter_flags ;
static MacDirectoryIterator g_iter ;
wxString g_iter_spec ;
wxString wxFindFirstFile(const wxChar *spec, int flags)
{
wxString result;
g_iter_spec = spec ;
g_iter_spec.MakeUpper() ;
g_iter_flags = flags; /* MATTHEW: [5] Remember flags */
// Find path only so we can concatenate found file onto path
wxString path(wxPathOnly(spec));
FSSpec fsspec ;
wxMacFilename2FSSpec( path , &fsspec ) ;
g_iter.m_CPB.hFileInfo.ioVRefNum = fsspec.vRefNum ;
g_iter.m_CPB.hFileInfo.ioNamePtr = g_iter.m_name ;
g_iter.m_index = 0 ;
Boolean isDir ;
FSpGetDirectoryID( &fsspec , &g_iter.m_dirId , &isDir ) ;
if ( !isDir )
return wxEmptyString ;
return wxFindNextFile( ) ;
}
wxString wxFindNextFile()
{
wxString result;
short err = noErr ;
wxString name ;
while(1)
{
while ( err == noErr )
{
g_iter.m_index++ ;
g_iter.m_CPB.dirInfo.ioFDirIndex = g_iter.m_index;
g_iter.m_CPB.dirInfo.ioDrDirID = g_iter.m_dirId; /* we need to do this every time */
err = PBGetCatInfoSync((CInfoPBPtr)&g_iter.m_CPB);
if ( err != noErr )
break ;
if ( ( g_iter.m_CPB.dirInfo.ioFlAttrib & ioDirMask) != 0 && (g_iter_flags & wxDIR) ) // we have a directory
break ;
if ( ( g_iter.m_CPB.dirInfo.ioFlAttrib & ioDirMask) == 0 && !(g_iter_flags & wxFILE ) )
continue ;
// hit !
break ;
}
if ( err != noErr )
{
return wxEmptyString ;
}
FSSpec spec ;
FSMakeFSSpecCompat(g_iter.m_CPB.hFileInfo.ioVRefNum,
g_iter.m_dirId,
g_iter.m_name,
&spec) ;
wxString name = wxMacFSSpec2MacFilename( &spec ) ;
if ( g_iter_spec.Right(4)==(":*.*") || g_iter_spec.Right(2)==(":*") || name.Upper().Matches(g_iter_spec) )
return name ;
}
return wxEmptyString ;
}
#elif defined(__WXMSW__)
#ifdef __WIN32__
static HANDLE gs_hFileStruct = INVALID_HANDLE_VALUE;
static WIN32_FIND_DATA gs_findDataStruct;
#else // Win16
#ifdef __BORLANDC__
static struct ffblk gs_findDataStruct;
#else
static struct _find_t gs_findDataStruct;
#endif // Borland
#endif // Win32/16
static wxString gs_strFileSpec;
static int gs_findFlags = 0;
wxString wxFindFirstFile(const wxChar *spec, int flags)
{
wxString result;
gs_strFileSpec = spec;
gs_findFlags = flags; /* MATTHEW: [5] Remember flags */
// Find path only so we can concatenate found file onto path
wxString path(wxPathOnly(gs_strFileSpec));
if ( !path.IsEmpty() )
result << path << wxT('\\');
#ifdef __WIN32__
if ( gs_hFileStruct != INVALID_HANDLE_VALUE )
FindClose(gs_hFileStruct);
gs_hFileStruct = ::FindFirstFile(WXSTRINGCAST spec, &gs_findDataStruct);
if ( gs_hFileStruct == INVALID_HANDLE_VALUE )
{
result.Empty();
return result;
}
bool isdir = !!(gs_findDataStruct.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY);
if (isdir && !(flags & wxDIR))
return wxFindNextFile();
else if (!isdir && flags && !(flags & wxFILE))
return wxFindNextFile();
result += gs_findDataStruct.cFileName;
return result;
#else // !Win32
int flag = _A_NORMAL;
if (flags & wxDIR)
flag = _A_SUBDIR;
#ifdef __BORLANDC__
if (findfirst(WXSTRINGCAST spec, &gs_findDataStruct, flag) == 0)
#else
if (_dos_findfirst(WXSTRINGCAST spec, flag, &gs_findDataStruct) == 0)
#endif
{
char attrib;
#ifdef __BORLANDC__
attrib = gs_findDataStruct.ff_attrib;
#else
attrib = gs_findDataStruct.attrib;
#endif
if (attrib & _A_SUBDIR) {
if (!(gs_findFlags & wxDIR))
return wxFindNextFile();
} else if (gs_findFlags && !(gs_findFlags & wxFILE))
return wxFindNextFile();
result +=
#ifdef __BORLANDC__
gs_findDataStruct.ff_name
#else
gs_findDataStruct.name
#endif
;
}
return result;
#endif // __WIN32__
}
wxString wxFindNextFile()
{
wxString result;
// Find path only so we can concatenate found file onto path
wxString path(wxPathOnly(gs_strFileSpec));
try_again:
#ifdef __WIN32__
if (gs_hFileStruct == INVALID_HANDLE_VALUE)
return result;
bool success = (FindNextFile(gs_hFileStruct, &gs_findDataStruct) != 0);
if (!success)
{
FindClose(gs_hFileStruct);
gs_hFileStruct = INVALID_HANDLE_VALUE;
}
else
{
bool isdir = !!(gs_findDataStruct.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY);
if (isdir && !(gs_findFlags & wxDIR))
goto try_again;
else if (!isdir && gs_findFlags && !(gs_findFlags & wxFILE))
goto try_again;
if ( !path.IsEmpty() )
result << path << wxT('\\');
result << gs_findDataStruct.cFileName;
}
return result;
#else // Win16
#ifdef __BORLANDC__
if (findnext(&gs_findDataStruct) == 0)
#else
if (_dos_findnext(&gs_findDataStruct) == 0)
#endif
{
/* MATTHEW: [5] Check directory flag */
char attrib;
#ifdef __BORLANDC__
attrib = gs_findDataStruct.ff_attrib;
#else
attrib = gs_findDataStruct.attrib;
#endif
if (attrib & _A_SUBDIR) {
if (!(gs_findFlags & wxDIR))
goto try_again;
} else if (gs_findFlags && !(gs_findFlags & wxFILE))
goto try_again;
result +=
#ifdef __BORLANDC__
gs_findDataStruct.ff_name
#else
gs_findDataStruct.name
#endif
;
}
return result;
#endif // Win32/16
}
#elif defined(__WXPM__)
wxString wxFindFirstFile(const wxChar *spec, int flags)
{
wxString result;
/*
// TODO: figure something out here for OS/2
gs_strFileSpec = spec;
gs_findFlags = flags;
// Find path only so we can concatenate found file onto path
wxString path(wxPathOnly(gs_strFileSpec));
if ( !path.IsEmpty() )
result << path << wxT('\\');
int flag = _A_NORMAL;
if (flags & wxDIR)
flag = _A_SUBDIR;
if (_dos_findfirst(WXSTRINGCAST spec, flag, &gs_findDataStruct) == 0)
{
char attrib;
attrib = gs_findDataStruct.attrib;
if (attrib & _A_SUBDIR) {
if (!(gs_findFlags & wxDIR))
return wxFindNextFile();
} else if (gs_findFlags && !(gs_findFlags & wxFILE))
return wxFindNextFile();
result += gs_findDataStruct.name;
}
*/
return result;
}
wxString wxFindNextFile()
{
wxString result;
// TODO:
return result;
}
#else // generic implementation:
static wxDir *gs_dir = NULL;
static wxString gs_dirPath;
@ -1784,7 +1354,6 @@ wxString wxFindNextFile()
return gs_dirPath + result;
}
#endif // Unix/Windows/OS/2
// Get current working directory.
// If buf is NULL, allocates space using new, else