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:
@@ -1304,436 +1304,6 @@ bool wxGetTempFileName(const wxString& prefix, wxString& buf)
|
|||||||
|
|
||||||
// Get first file name matching given wild card.
|
// 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 wxDir *gs_dir = NULL;
|
||||||
static wxString gs_dirPath;
|
static wxString gs_dirPath;
|
||||||
|
|
||||||
@@ -1784,7 +1354,6 @@ wxString wxFindNextFile()
|
|||||||
return gs_dirPath + result;
|
return gs_dirPath + result;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // Unix/Windows/OS/2
|
|
||||||
|
|
||||||
// Get current working directory.
|
// Get current working directory.
|
||||||
// If buf is NULL, allocates space using new, else
|
// If buf is NULL, allocates space using new, else
|
||||||
|
Reference in New Issue
Block a user