diff --git a/include/wx/file.h b/include/wx/file.h index 125ddaff87..40d4d8f21b 100644 --- a/include/wx/file.h +++ b/include/wx/file.h @@ -7,7 +7,7 @@ // Created: 29/01/98 // RCS-ID: $Id$ // Copyright: (c) 1998 Vadim Zeitlin -// Licence: wxWindows license +// Licence: wxWindows license ///////////////////////////////////////////////////////////////////////////// #ifndef __FILEH__ @@ -27,6 +27,23 @@ // error return value for Seek() functions const off_t ofsInvalid = (off_t)-1; +// we redefine these constants here because S_IREAD &c are _not_ standard +// however, we do assume that the values correspond to the Unix umask bits +#define wxS_IRUSR 00400 +#define wxS_IWUSR 00200 +#define wxS_IXUSR 00100 + +#define wxS_IRGRP 00040 +#define wxS_IWGRP 00020 +#define wxS_IXGRP 00010 + +#define wxS_IROTH 00004 +#define wxS_IWOTH 00002 +#define wxS_IXOTH 00001 + +// default mode for the new files: corresponds to umask 022 +#define wxS_DEFAULT (wxS_IRUSR | wxS_IWUSR | wxS_IRGRP | wxS_IROTH) + // ---------------------------------------------------------------------------- // class wxFile: raw file IO // @@ -38,7 +55,7 @@ class WXDLLEXPORT wxFile public: // more file constants // ------------------- - + // opening mode enum OpenMode { read, write, read_write, write_append }; // standard values for file descriptor @@ -58,8 +75,12 @@ public: wxFile(int fd) { m_fd = fd; } // open/close - bool Create(const char *szFileName, bool bOverwrite = FALSE); - bool Open(const char *szFileName, OpenMode mode = read); + // create a new file (with the default value of bOverwrite, it will fail if + // the file already exists, otherwise it will overwrite it and succeed) + bool Create(const char *szFileName, bool bOverwrite = FALSE, + int access = wxS_DEFAULT); + bool Open(const char *szFileName, OpenMode mode = read, + int access = wxS_DEFAULT); bool Close(); // Close is a NOP if not opened // assign an existing file descriptor and get it back from wxFile object @@ -94,7 +115,7 @@ public: bool Eof() const; // is an error occured? bool Error() const { return m_error; } - + // dtor closes the file if opened ~wxFile(); @@ -116,7 +137,7 @@ private: // file (and close this one) or call Discard() to cancel the modification. If // you call neither of them, dtor will call Discard(). // ---------------------------------------------------------------------------- -class wxTempFile +class WXDLLEXPORT wxTempFile { public: // ctors diff --git a/src/common/file.cpp b/src/common/file.cpp index f2f047c345..4372a8092b 100644 --- a/src/common/file.cpp +++ b/src/common/file.cpp @@ -7,7 +7,7 @@ // Created: 29/01/98 // RCS-ID: $Id$ // Copyright: (c) 1998 Vadim Zeitlin -// Licence: wxWindows license +// Licence: wxWindows license ///////////////////////////////////////////////////////////////////////////// // ---------------------------------------------------------------------------- @@ -27,7 +27,7 @@ #endif // standard -#if defined(__WXMSW__) && !defined(__GNUWIN32__) +#if defined(__WXMSW__) && !defined(__GNUWIN32__) #include #define WIN32_LEAN_AND_MEAN @@ -54,7 +54,7 @@ #elif (defined(__UNIX__) || defined(__GNUWIN32__)) #include #else - #error "Please specify the header with file functions declarations." + #error "Please specify the header with file functions declarations." #endif //Win/UNIX #include // SEEK_xxx constants @@ -87,17 +87,14 @@ #define S_IFDIR _S_IFDIR #define S_IFREG _S_IFREG - - #define S_IREAD _S_IREAD - #define S_IWRITE _S_IWRITE #else #define tell(fd) lseek(fd, 0, SEEK_CUR) #endif //_MSC_VER // there is no distinction between text and binary files under Unix -#ifdef __UNIX__ - #define O_BINARY (0) -#endif //__UNIX__ +#ifdef __UNIX__ + #define O_BINARY (0) +#endif //__UNIX__ // wxWindows #include @@ -114,8 +111,8 @@ // static functions // ---------------------------------------------------------------------------- bool wxFile::Exists(const char *sz) -{ - struct stat st; +{ + struct stat st; return !access(sz, 0) && !stat(sz, &st) && (st.st_mode & S_IFREG); } @@ -139,11 +136,11 @@ wxFile::~wxFile() } // create the file, fail if it already exists and bOverwrite -bool wxFile::Create(const char *szFileName, bool bOverwrite) +bool wxFile::Create(const char *szFileName, bool bOverwrite, int access) { // if bOverwrite we create a new file or truncate the existing one, // otherwise we only create the new file and fail if it already exists - int fd = open(szFileName, O_CREAT | (bOverwrite ? O_TRUNC : O_EXCL)); + int fd = open(szFileName, O_CREAT | (bOverwrite ? O_TRUNC : O_EXCL), access); if ( fd == -1 ) { wxLogSysError(_("can't create file '%s'"), szFileName); @@ -156,29 +153,29 @@ bool wxFile::Create(const char *szFileName, bool bOverwrite) } // open the file -bool wxFile::Open(const char *szFileName, OpenMode mode) +bool wxFile::Open(const char *szFileName, OpenMode mode, int access) { int flags = O_BINARY; switch ( mode ) { - case read: - flags |= O_RDONLY; + case read: + flags |= O_RDONLY; break; - case write: - flags |= O_WRONLY | O_CREAT | O_TRUNC; + case write: + flags |= O_WRONLY | O_CREAT | O_TRUNC; break; case write_append: flags |= O_WRONLY | O_APPEND; break; - case read_write: + case read_write: flags |= O_RDWR; break; } - int fd = open(szFileName, flags, S_IREAD | S_IWRITE); + int fd = open(szFileName, flags, access); if ( fd == -1 ) { wxLogSysError(_("can't open file '%s'"), szFileName); @@ -314,7 +311,7 @@ off_t wxFile::Length() const #else int iRc = tell(m_fd); if ( iRc != -1 ) { - // @ have to use const_cast :-( + // @ have to use const_cast :-( int iLen = ((wxFile *)this)->SeekEnd(); if ( iLen != -1 ) { // restore old position @@ -390,7 +387,7 @@ wxTempFile::wxTempFile(const wxString& strName) bool wxTempFile::Open(const wxString& strName) { m_strName = strName; - + // we want to create the file in the same directory as strName because // otherwise rename() in Commit() might not work (if the files are on // different partitions for example). Unfortunately, the only standard @@ -408,7 +405,7 @@ bool wxTempFile::Open(const wxString& strName) wxLogLastError("GetTempFileName"); m_strTemp.UngetWriteBuf(); #endif // Windows/Unix - + return m_file.Open(m_strTemp, wxFile::write); }