X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b39dbf34b887a73c525da903d8599f4f6b7eb8f9..88a036cef3585f9a6d23d074aadb2ebda0b73ff8:/src/common/filefn.cpp?ds=sidebyside diff --git a/src/common/filefn.cpp b/src/common/filefn.cpp index 8310ce87b9..4f86e7bd16 100644 --- a/src/common/filefn.cpp +++ b/src/common/filefn.cpp @@ -17,7 +17,7 @@ // headers // ---------------------------------------------------------------------------- -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "filefn.h" #endif @@ -54,9 +54,16 @@ #include "wx/mac/private.h" // includes mac headers #endif +#ifdef __WXWINCE__ +#include "wx/msw/wince/time.h" +#include "wx/msw/private.h" +#else #include +#endif -#ifndef __MWERKS__ +#ifdef __WXWINCE__ +// Nothing +#elif !defined(__MWERKS__) #include #include #else @@ -84,7 +91,7 @@ #include "wx/os2/private.h" #endif #if defined(__WINDOWS__) && !defined(__WXMICROWIN__) -#if !defined( __GNUWIN32__ ) && !defined( __MWERKS__ ) && !defined(__SALFORDC__) +#if !defined( __GNUWIN32__ ) && !defined( __MWERKS__ ) && !defined(__SALFORDC__) && !defined(__WXWINCE__) #include #include #include @@ -121,9 +128,14 @@ #endif #ifdef __WINDOWS__ - #include + #include "wx/msw/wrapwin.h" #include "wx/msw/mslu.h" + // for _getcwd + #ifdef __MINGW32__ + #include + #endif + // sys/cygwin.h is needed for cygwin_conv_to_full_win32_path() // // note that it must be included after @@ -184,6 +196,25 @@ const off_t wxInvalidOffset = (off_t)-1; // implementation // ============================================================================ +#if defined(__WXMAC__) && !defined(__DARWIN__) + +WXDLLEXPORT int wxStat( const wxChar *file_name, wxStructStat *buf ) +{ + return stat( wxMacStringToCString( file_name ), buf ); +} + +WXDLLEXPORT int wxAccess( const wxChar *pathname, int mode ) +{ + return access( wxMacStringToCString( pathname ), mode ); +} + +WXDLLEXPORT int wxOpen( const wxChar *pathname, int flags, mode_t mode ) +{ + return open( wxMacStringToCString( pathname ), flags, mode ); +} + +#endif + #ifdef wxNEED_WX_UNISTD_H WXDLLEXPORT int wxStat( const wxChar *file_name, wxStructStat *buf ) @@ -208,7 +239,19 @@ WXDLLEXPORT int wxOpen( const wxChar *pathname, int flags, mode_t mode ) // wxPathList // ---------------------------------------------------------------------------- -IMPLEMENT_DYNAMIC_CLASS(wxPathList, wxStringList) +// IMPLEMENT_DYNAMIC_CLASS(wxPathList, wxStringList) + +static inline wxChar* MYcopystring(const wxString& s) +{ + wxChar* copy = new wxChar[s.length() + 1]; + return wxStrcpy(copy, s.c_str()); +} + +static inline wxChar* MYcopystring(const wxChar* s) +{ + wxChar* copy = new wxChar[wxStrlen(s) + 1]; + return wxStrcpy(copy, s); +} void wxPathList::Add (const wxString& path) { @@ -218,6 +261,8 @@ void wxPathList::Add (const wxString& path) // Add paths e.g. from the PATH environment variable void wxPathList::AddEnvList (const wxString& envVariable) { + // No environment variables on WinCE +#ifndef __WXWINCE__ static const wxChar PATH_TOKS[] = #ifdef __WINDOWS__ /* @@ -234,7 +279,7 @@ void wxPathList::AddEnvList (const wxString& envVariable) wxChar *val = wxGetenv (WXSTRINGCAST envVariable); if (val && *val) { - wxChar *s = copystring (val); + wxChar *s = MYcopystring (val); wxChar *save_ptr, *token = wxStrtok (s, PATH_TOKS, &save_ptr); if (token) @@ -256,6 +301,7 @@ void wxPathList::AddEnvList (const wxString& envVariable) delete [] s; } +#endif } // Given a full filename (with path), ensure that that file can @@ -273,7 +319,7 @@ void wxPathList::EnsureFileAccessible (const wxString& path) bool wxPathList::Member (const wxString& path) { - for (wxStringList::Node *node = GetFirst(); node; node = node->GetNext()) + for (wxStringList::compatibility_iterator node = GetFirst(); node; node = node->GetNext()) { wxString path2( node->GetData() ); if ( @@ -301,9 +347,9 @@ wxString wxPathList::FindValidPath (const wxString& file) wxChar *filename = (wxChar*) NULL; /* shut up buggy egcs warning */ filename = wxIsAbsolutePath (buf) ? wxFileNameFromPath (buf) : (wxChar *)buf; - for (wxStringList::Node *node = GetFirst(); node; node = node->GetNext()) + for (wxStringList::compatibility_iterator node = GetFirst(); node; node = node->GetNext()) { - wxChar *path = node->GetData(); + const wxChar *path = node->GetData(); wxStrcpy (wxFileFunctionsBuffer, path); wxChar ch = wxFileFunctionsBuffer[wxStrlen(wxFileFunctionsBuffer)-1]; if (ch != wxT('\\') && ch != wxT('/')) @@ -497,9 +543,9 @@ wxChar *wxCopyAbsolutePath(const wxString& filename) wxStrcat(buf, wxT("/")); #endif wxStrcat(buf, wxFileFunctionsBuffer); - return copystring( wxRealPath(buf) ); + return MYcopystring( wxRealPath(buf) ); } - return copystring( wxFileFunctionsBuffer ); + return MYcopystring( wxFileFunctionsBuffer ); } /*- @@ -548,7 +594,7 @@ wxChar *wxExpandPath(wxChar *buf, const wxChar *name) buf[0] = wxT('\0'); if (name == NULL || *name == wxT('\0')) return buf; - nm = copystring(name); // Make a scratch copy + nm = MYcopystring(name); // Make a scratch copy wxChar *nm_tmp = nm; /* Skip leading whitespace and cr */ @@ -596,6 +642,8 @@ wxChar *wxExpandPath(wxChar *buf, const wxChar *name) } else # endif #endif + // No env variables on WinCE +#ifndef __WXWINCE__ #ifdef __WXMSW__ if (*s++ == wxT('$') && (*s == wxT('{') || *s == wxT(')'))) #else @@ -623,6 +671,8 @@ wxChar *wxExpandPath(wxChar *buf, const wxChar *name) s++; } } +#endif + // __WXWINCE__ } /* Expand ~ and ~user */ @@ -702,6 +752,7 @@ wxContractPath (const wxString& filename, const wxString& envname, const wxStrin // Handle environment const wxChar *val = (const wxChar *) NULL; +#ifndef __WXWINCE__ wxChar *tcp = (wxChar *) NULL; if (envname != WXSTRINGCAST NULL && (val = wxGetenv (WXSTRINGCAST envname)) != NULL && (tcp = wxStrstr (dest, val)) != NULL) @@ -713,6 +764,7 @@ wxContractPath (const wxString& filename, const wxString& envname, const wxStrin wxStrcat (tcp, wxT("}")); wxStrcat (tcp, wxFileFunctionsBuffer); } +#endif // Handle User's home (ignore root homes!) size_t len = 0; @@ -1069,13 +1121,13 @@ void wxUnixFilename2FSSpec( const char *path , FSSpec *spec ) #endif // __WXMAC__ void -wxDos2UnixFilename (char *s) +wxDos2UnixFilename (wxChar *s) { if (s) while (*s) { - if (*s == '\\') - *s = '/'; + if (*s == _T('\\')) + *s = _T('/'); #ifdef __WXMSW__ else *s = wxTolower (*s); // Case INDEPENDENT @@ -1247,9 +1299,11 @@ wxCopyFile (const wxString& file1, const wxString& file2, bool overwrite) bool wxRenameFile (const wxString& file1, const wxString& file2) { - // Normal system call +#ifndef __WXWINCE__ + // Normal system call if ( wxRename (file1, file2) == 0 ) return TRUE; +#endif // Try to copy if (wxCopyFile(file1, file2)) { @@ -1304,7 +1358,11 @@ bool wxMkdir(const wxString& dir, int perm) #endif #else // !MSW, !DOS and !OS/2 VAC++ (void)perm; +#ifdef __WXWINCE__ + if ( !CreateDirectory(dirname, NULL) ) +#else if ( wxMkDir(wxFNSTRINGCAST wxFNCONV(dirname)) != 0 ) +#endif #endif // !MSW/MSW { wxLogSysError(_("Directory '%s' couldn't be created"), dirname); @@ -1319,15 +1377,15 @@ bool wxMkdir(const wxString& dir, int perm) bool wxRmdir(const wxString& dir, int WXUNUSED(flags)) { #ifdef __VMS__ - return FALSE; //to be changed since rmdir exists in VMS7.x + return FALSE; //to be changed since rmdir exists in VMS7.x #elif defined(__WXPM__) - return (::DosDeleteDir((PSZ)dir.c_str()) == 0); + return (::DosDeleteDir((PSZ)dir.c_str()) == 0); #else -#ifdef __SALFORDC__ - return FALSE; // What to do? +#ifdef __WXWINCE__ + return (CreateDirectory(dir, NULL) != 0); #else - return (wxRmDir(OS_FILENAME(dir)) == 0); + return (wxRmDir(OS_FILENAME(dir)) == 0); #endif #endif @@ -1380,7 +1438,7 @@ wxChar *wxGetTempFileName(const wxString& prefix, wxChar *buf) if ( buf ) wxStrcpy(buf, filename); else - buf = copystring(filename); + buf = MYcopystring(filename); return buf; } @@ -1456,6 +1514,9 @@ wxString wxFindNextFile() // copies into buf. wxChar *wxGetWorkingDirectory(wxChar *buf, int sz) { +#ifdef __WXWINCE__ + return NULL; +#else if ( !buf ) { buf = new wxChar[sz + 1]; @@ -1493,7 +1554,7 @@ wxChar *wxGetWorkingDirectory(wxChar *buf, int sz) if ( needsANSI ) #endif // wxUSE_UNICODE { - #ifdef _MSC_VER + #if defined(_MSC_VER) || defined(__MINGW32__) ok = _getcwd(cbuf, sz) != NULL; #elif defined(__WXMAC__) && !defined(__DARWIN__) FSSpec cwdSpec ; @@ -1571,6 +1632,9 @@ wxChar *wxGetWorkingDirectory(wxChar *buf, int sz) #if !wxUSE_UNICODE #undef cbuf #endif + +#endif + // __WXWINCE__ } wxString wxGetCwd() @@ -1586,37 +1650,42 @@ wxString wxGetCwd() bool wxSetWorkingDirectory(const wxString& d) { #if defined(__UNIX__) || defined(__WXMAC__) || defined(__DOS__) - return (chdir(wxFNSTRINGCAST d.fn_str()) == 0); + return (chdir(wxFNSTRINGCAST d.fn_str()) == 0); #elif defined(__WXPM__) - return (::DosSetCurrentDir((PSZ)d.c_str()) == 0); + return (::DosSetCurrentDir((PSZ)d.c_str()) == 0); #elif defined(__WINDOWS__) - + #ifdef __WIN32__ - return (bool)(SetCurrentDirectory(d) != 0); +#ifdef __WXWINCE__ + // No equivalent in WinCE + return FALSE; #else - // Must change drive, too. - bool isDriveSpec = ((strlen(d) > 1) && (d[1] == ':')); - if (isDriveSpec) - { - wxChar firstChar = d[0]; - - // To upper case - if (firstChar > 90) - firstChar = firstChar - 32; - - // To a drive number - unsigned int driveNo = firstChar - 64; - if (driveNo > 0) + return (bool)(SetCurrentDirectory(d) != 0); +#endif +#else + // Must change drive, too. + bool isDriveSpec = ((strlen(d) > 1) && (d[1] == ':')); + if (isDriveSpec) { - unsigned int noDrives; - _dos_setdrive(driveNo, &noDrives); + wxChar firstChar = d[0]; + + // To upper case + if (firstChar > 90) + firstChar = firstChar - 32; + + // To a drive number + unsigned int driveNo = firstChar - 64; + if (driveNo > 0) + { + unsigned int noDrives; + _dos_setdrive(driveNo, &noDrives); + } } - } - bool success = (chdir(WXSTRINGCAST d) == 0); - - return success; + bool success = (chdir(WXSTRINGCAST d) == 0); + + return success; #endif - + #endif } @@ -1624,10 +1693,14 @@ bool wxSetWorkingDirectory(const wxString& d) // On non-Windows platform, probably just return the empty string. wxString wxGetOSDirectory() { -#if defined(__WINDOWS__) && !defined(__WXMICROWIN__) +#ifdef __WXWINCE__ + return wxString(wxT("\\Windows")); +#elif defined(__WINDOWS__) && !defined(__WXMICROWIN__) wxChar buf[256]; GetWindowsDirectory(buf, 256); return wxString(buf); +#elif defined(__WXMAC__) + return wxMacFindFolder(kOnSystemDisk, 'macs', false); #else return wxEmptyString; #endif @@ -1695,10 +1768,44 @@ void WXDLLEXPORT wxSplitPath(const wxChar *pszFileName, time_t WXDLLEXPORT wxFileModificationTime(const wxString& filename) { +#ifdef __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) + return 0; + else + { + if (GetFileTime(fileHandle, & creationTime, & lastAccessTime, & lastWriteTime)) + { + CloseHandle(fileHandle); + + wxDateTime dateTime; + FILETIME ftLocal; + if ( !::FileTimeToLocalFileTime(&lastWriteTime, &ftLocal) ) + { + wxLogLastError(_T("FileTimeToLocalFileTime")); + } + + SYSTEMTIME st; + if ( !::FileTimeToSystemTime(&ftLocal, &st) ) + { + wxLogLastError(_T("FileTimeToSystemTime")); + } + + 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; + } +#else wxStructStat buf; wxStat( filename, &buf); return buf.st_mtime; +#endif }