X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/aac71f4f4456577a0ec6cc70fa18596e6cdf6aee..a3c1ce50b0a3cb5e4d4ebc2203141c594de56cd1:/src/common/filefn.cpp diff --git a/src/common/filefn.cpp b/src/common/filefn.cpp index 9f9846f969..f0c139bb78 100644 --- a/src/common/filefn.cpp +++ b/src/common/filefn.cpp @@ -56,11 +56,6 @@ #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/private.h" #include "wx/msw/mslu.h" @@ -183,13 +178,13 @@ void wxPathList::AddEnvList (const wxString& envVariable) 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 - wxString val ; + wxString val ; if (wxGetEnv (WXSTRINGCAST envVariable, &val)) { wxChar *s = MYcopystring (val); @@ -360,17 +355,17 @@ wxIsAbsolutePath (const wxString& filename) 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) @@ -959,39 +954,38 @@ wxUnix2DosFilename (wxChar *WXUNUSED(s) ) 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 @@ -1605,40 +1599,38 @@ time_t WXDLLEXPORT wxFileModificationTime(const wxString& filename) #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