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:
parent
c4bcd8fcdd
commit
c04857dd6a
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user