#include "wx/log.h"
-// No, Cygwin doesn't appear to have fnmatch.h after all.
-#if defined(HAVE_FNMATCH_H)
- #include "fnmatch.h"
-#endif
-
#ifdef __WINDOWS__
- #include "wx/msw/wrapwin.h"
+ #include "wx/msw/private.h"
#include "wx/msw/mslu.h"
// sys/cygwin.h is needed for cygwin_conv_to_full_win32_path()
#include <sys/cygwin.h>
#endif
#endif // __GNUWIN32__
+
+ // io.h is needed for _get_osfhandle()
+ // Already included by filefn.h for many Windows compilers
+ #if defined __MWERKS__ || defined __CYGWIN__
+ #include <io.h>
+ #endif
#endif // __WINDOWS__
#if defined(__VMS__)
path such as "C:\Program Files" would be split into 2 paths:
"C:\Program" and "Files"
*/
-// wxT(" ;"); // Don't seperate with colon in DOS (used for drive)
- wxT(";"); // Don't seperate with colon in DOS (used for drive)
+// wxT(" ;"); // Don't separate with colon in DOS (used for drive)
+ wxT(";"); // Don't separate with colon in DOS (used for drive)
#else
wxT(" :;");
#endif
- wxChar *val = wxGetenv (WXSTRINGCAST envVariable);
- if (val && *val)
+ wxString val ;
+ if (wxGetEnv (WXSTRINGCAST envVariable, &val))
{
wxChar *s = MYcopystring (val);
wxChar *save_ptr, *token = wxStrtok (s, PATH_TOKS, &save_ptr);
delete [] s;
}
-#endif
+#else // __WXWINCE__
+ wxUnusedVar(envVariable);
+#endif // !__WXWINCE__/__WXWINCE__
}
// Given a full filename (with path), ensure that that file can
void wxStripExtension(wxChar *buffer)
{
- int len = wxStrlen(buffer);
- int i = len-1;
- while (i > 0)
- {
- if (buffer[i] == wxT('.'))
+ int len = wxStrlen(buffer);
+ int i = len-1;
+ while (i > 0)
{
- buffer[i] = 0;
- break;
+ if (buffer[i] == wxT('.'))
+ {
+ buffer[i] = 0;
+ break;
+ }
+ i --;
}
- i --;
- }
}
void wxStripExtension(wxString& buffer)
const wxChar *val;
#ifndef __WXWINCE__
wxChar *tcp;
- if (envname != WXSTRINGCAST NULL && (val = wxGetenv (WXSTRINGCAST envname)) != NULL &&
+ if (!envname.empty() && (val = wxGetenv (WXSTRINGCAST envname)) != NULL &&
(tcp = wxStrstr (dest, val)) != NULL)
{
wxStrcpy (wxFileFunctionsBuffer, tcp + wxStrlen (val));
wxStrcat (tcp, wxT("}"));
wxStrcat (tcp, wxFileFunctionsBuffer);
}
+#else
+ wxUnusedVar(envname);
#endif
// Handle User's home (ignore root homes!)
bool
wxConcatFiles (const wxString& file1, const wxString& file2, const wxString& file3)
{
- wxString outfile;
- if ( !wxGetTempFileName( wxT("cat"), outfile) )
- return false;
-
- FILE *fp1 wxDUMMY_INITIALIZE(NULL);
- FILE *fp2 = NULL;
- FILE *fp3 = NULL;
- // Open the inputs and outputs
- if ((fp1 = wxFopen ( file1, wxT("rb"))) == NULL ||
- (fp2 = wxFopen ( file2, wxT("rb"))) == NULL ||
- (fp3 = wxFopen ( outfile, wxT("wb"))) == NULL)
+#if wxUSE_FILE
+
+ wxFile in1(file1), in2(file2);
+ wxTempFile out(file3);
+
+ if ( !in1.IsOpened() || !in2.IsOpened() || !out.IsOpened() )
+ return false;
+
+ ssize_t ofs;
+ unsigned char buf[1024];
+
+ for( int i=0; i<2; i++)
{
- if (fp1)
- fclose (fp1);
- if (fp2)
- fclose (fp2);
- if (fp3)
- fclose (fp3);
- return false;
+ wxFile *in = i==0 ? &in1 : &in2;
+ do{
+ if ( (ofs = in->Read(buf,WXSIZEOF(buf))) == wxInvalidOffset ) return false;
+ if ( ofs > 0 )
+ if ( !out.Write(buf,ofs) )
+ return false;
+ } while ( ofs == (ssize_t)WXSIZEOF(buf) );
}
- int ch;
- while ((ch = getc (fp1)) != EOF)
- (void) putc (ch, fp3);
- fclose (fp1);
+ return out.Commit();
- while ((ch = getc (fp2)) != EOF)
- (void) putc (ch, fp3);
- fclose (fp2);
+#else
+
+ wxUnusedVar(file1);
+ wxUnusedVar(file2);
+ wxUnusedVar(file3);
+ return false;
- fclose (fp3);
- bool result = wxRenameFile(outfile, file3);
- return result;
+#endif
}
// Copy files
return false;
}
#elif defined(__OS2__)
- if ( ::DosCopy(file2, file2, overwrite ? DCPY_EXISTING : 0) != 0 )
+ if ( ::DosCopy((PSZ)file1.c_str(), (PSZ)file2.c_str(), overwrite ? DCPY_EXISTING : 0) != 0 )
return false;
#elif defined(__PALMOS__)
// TODO with http://www.palmos.com/dev/support/docs/protein_books/Memory_Databases_Files/
return false;
-#else // !Win32
+#elif wxUSE_FILE // !Win32
wxStructStat fbuf;
// get permissions of file1
return false;
}
#endif // OS/2 || Mac
+
+#else // !Win32 && ! wxUSE_FILE
+
+ // impossible to simulate with wxWidgets API
+ wxUnusedVar(file1);
+ wxUnusedVar(file2);
+ wxUnusedVar(overwrite);
+ return false;
+
#endif // __WXMSW__ && __WIN32__
return true;
}
// does the path exists? (may have or not '/' or '\\' at the end)
-bool wxPathExists(const wxChar *pszPathName)
+bool wxDirExists(const wxChar *pszPathName)
{
wxString strPath(pszPathName);
DWORD ret = ::GetFileAttributes(strPath);
return (ret != (DWORD)-1) && (ret & FILE_ATTRIBUTE_DIRECTORY);
+#elif defined(__OS2__)
+ return (::DosSetCurrentDir((PSZ)(WXSTRINGCAST strPath)));
#else // !__WIN32__
wxStructStat st;
return buf;
#else
+ wxUnusedVar(prefix);
+ wxUnusedVar(buf);
// wxFileName::CreateTempFileName needs wxFile class enabled
return NULL;
#endif
// TODO ?
return NULL;
#elif defined(__WXWINCE__)
+ // TODO
+ wxUnusedVar(buf);
+ wxUnusedVar(sz);
return NULL;
#else
if ( !buf )
#ifdef __WIN32__
#ifdef __WXWINCE__
// No equivalent in WinCE
+ wxUnusedVar(d);
return false;
#else
return (bool)(SetCurrentDirectory(d) != 0);
#if defined(__WXPALMOS__)
return 0;
#elif defined(__WXWINCE__)
- FILETIME creationTime, lastAccessTime, lastWriteTime;
- HANDLE fileHandle = ::CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, NULL,
- 0, FILE_ATTRIBUTE_NORMAL, 0);
- if (fileHandle == INVALID_HANDLE_VALUE)
+ FILETIME ftLastWrite;
+ AutoHANDLE hFile(::CreateFile(filename, GENERIC_READ, FILE_SHARE_READ,
+ NULL, 0, FILE_ATTRIBUTE_NORMAL, 0));
+
+ if ( !hFile.IsOk() )
return 0;
- else
+
+ if ( !::GetFileTime(hFile, NULL, NULL, &ftLastWrite) )
+ return 0;
+
+ // sure we want to translate to local time here?
+ FILETIME ftLocal;
+ if ( !::FileTimeToLocalFileTime(&ftLastWrite, &ftLocal) )
{
- if (GetFileTime(fileHandle, & creationTime, & lastAccessTime, & lastWriteTime))
- {
- CloseHandle(fileHandle);
+ wxLogLastError(_T("FileTimeToLocalFileTime"));
+ }
- wxDateTime dateTime;
- FILETIME ftLocal;
- if ( !::FileTimeToLocalFileTime(&lastWriteTime, &ftLocal) )
- {
- wxLogLastError(_T("FileTimeToLocalFileTime"));
- }
+ // FILETIME is a counted in 100-ns since 1601-01-01, convert it to
+ // number of seconds since 1970-01-01
+ ULARGE_INTEGER uli;
+ uli.LowPart = ftLocal.dwLowDateTime;
+ uli.HighPart = ftLocal.dwHighDateTime;
- SYSTEMTIME st;
- if ( !::FileTimeToSystemTime(&ftLocal, &st) )
- {
- wxLogLastError(_T("FileTimeToSystemTime"));
- }
+ ULONGLONG ull = uli.QuadPart;
+ ull /= wxULL(10000000); // number of 100ns intervals in 1s
+ ull -= wxULL(11644473600); // 1970-01-01 - 1601-01-01 in seconds
- dateTime.Set(st.wDay, wxDateTime::Month(st.wMonth - 1), st.wYear,
- st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);
- return dateTime.GetTicks();
- }
- else
- return 0;
- }
+ return wx_static_cast(time_t, ull);
#else
wxStructStat buf;
- wxStat( filename, &buf);
+ if ( wxStat( filename, &buf) != 0 )
+ return 0;
return buf.st_mtime;
#endif
// autocompletion
for( size_t j = 0 ; j < descriptions.GetCount() ; j++ )
{
- if ( descriptions[j] == wxEmptyString && filters[j] != wxEmptyString )
+ if ( descriptions[j].empty() && !filters[j].empty() )
{
descriptions[j].Printf(_("Files (%s)"), filters[j].c_str());
}
// Return the type of an open file
//
+// Some file types on some platforms seem seekable but in fact are not.
+// The main use of this function is to allow such cases to be detected
+// (IsSeekable() is implemented as wxGetFileKind() == wxFILE_KIND_DISK).
+//
+// This is important for the archive streams, which benefit greatly from
+// being able to seek on a stream, but which will produce corrupt archives
+// if they unknowingly seek on a non-seekable stream.
+//
+// wxFILE_KIND_DISK is a good catch all return value, since other values
+// disable features of the archive streams. Some other value must be returned
+// for a file type that appears seekable but isn't.
+//
+// Known examples:
+// * Pipes on Windows
+// * Files on VMS with a record format other than StreamLF
+//
wxFileKind wxGetFileKind(int fd)
{
-#if !defined(__WXWINCE__) && !defined(__WXPALMOS__)
- if (isatty(fd))
- return wxFILE_KIND_TERMINAL;
-#endif
-
-#if defined(__WXPALMOS__)
- return wxFILE_KIND_UNKNOWN;
-#elif defined(__WXWINCE__)
- return wxFILE_KIND_UNKNOWN;
-#elif defined(__WXMSW__)
+#if defined __WXMSW__ && !defined __WXWINCE__ && defined wxGetOSFHandle
switch (::GetFileType(wxGetOSFHandle(fd)) & ~FILE_TYPE_REMOTE)
{
+ case FILE_TYPE_CHAR:
+ return wxFILE_KIND_TERMINAL;
case FILE_TYPE_DISK:
return wxFILE_KIND_DISK;
case FILE_TYPE_PIPE:
return wxFILE_KIND_UNKNOWN;
#elif defined(__UNIX__)
+ if (isatty(fd))
+ return wxFILE_KIND_TERMINAL;
+
struct stat st;
fstat(fd, &st);
return wxFILE_KIND_DISK;
#else
- if (lseek(fd, 0, SEEK_CUR) != -1)
- return wxFILE_KIND_DISK;
- else
- return wxFILE_KIND_UNKNOWN;
+ #define wxFILEKIND_STUB
+ (void)fd;
+ return wxFILE_KIND_DISK;
+#endif
+}
+
+wxFileKind wxGetFileKind(FILE *fp)
+{
+ // Note: The watcom rtl dll doesn't have fileno (the static lib does).
+ // Should be fixed in version 1.4.
+#if defined(wxFILEKIND_STUB) || \
+ (defined(__WATCOMC__) && __WATCOMC__ <= 1230 && defined(__SW_BR))
+ (void)fp;
+ return wxFILE_KIND_DISK;
+#else
+ return wxGetFileKind(fileno(fp));
#endif
}