added "access" parameter to wxFile::Create and Open. The default value is

"rw-r--r--" mode.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@358 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
1998-07-24 17:03:26 +00:00
parent 13289f04ae
commit 246037e229
2 changed files with 47 additions and 29 deletions

View File

@@ -7,7 +7,7 @@
// Created: 29/01/98 // Created: 29/01/98
// RCS-ID: $Id$ // RCS-ID: $Id$
// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> // Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
// Licence: wxWindows license // Licence: wxWindows license
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
#ifndef __FILEH__ #ifndef __FILEH__
@@ -27,6 +27,23 @@
// error return value for Seek() functions // error return value for Seek() functions
const off_t ofsInvalid = (off_t)-1; 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 // class wxFile: raw file IO
// //
@@ -38,7 +55,7 @@ class WXDLLEXPORT wxFile
public: public:
// more file constants // more file constants
// ------------------- // -------------------
// opening mode // opening mode
enum OpenMode { read, write, read_write, write_append }; enum OpenMode { read, write, read_write, write_append };
// standard values for file descriptor // standard values for file descriptor
@@ -58,8 +75,12 @@ public:
wxFile(int fd) { m_fd = fd; } wxFile(int fd) { m_fd = fd; }
// open/close // open/close
bool Create(const char *szFileName, bool bOverwrite = FALSE); // create a new file (with the default value of bOverwrite, it will fail if
bool Open(const char *szFileName, OpenMode mode = read); // 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 bool Close(); // Close is a NOP if not opened
// assign an existing file descriptor and get it back from wxFile object // assign an existing file descriptor and get it back from wxFile object
@@ -94,7 +115,7 @@ public:
bool Eof() const; bool Eof() const;
// is an error occured? // is an error occured?
bool Error() const { return m_error; } bool Error() const { return m_error; }
// dtor closes the file if opened // dtor closes the file if opened
~wxFile(); ~wxFile();
@@ -116,7 +137,7 @@ private:
// file (and close this one) or call Discard() to cancel the modification. If // file (and close this one) or call Discard() to cancel the modification. If
// you call neither of them, dtor will call Discard(). // you call neither of them, dtor will call Discard().
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
class wxTempFile class WXDLLEXPORT wxTempFile
{ {
public: public:
// ctors // ctors

View File

@@ -7,7 +7,7 @@
// Created: 29/01/98 // Created: 29/01/98
// RCS-ID: $Id$ // RCS-ID: $Id$
// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> // Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
// Licence: wxWindows license // Licence: wxWindows license
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@@ -27,7 +27,7 @@
#endif #endif
// standard // standard
#if defined(__WXMSW__) && !defined(__GNUWIN32__) #if defined(__WXMSW__) && !defined(__GNUWIN32__)
#include <io.h> #include <io.h>
#define WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN
@@ -54,7 +54,7 @@
#elif (defined(__UNIX__) || defined(__GNUWIN32__)) #elif (defined(__UNIX__) || defined(__GNUWIN32__))
#include <unistd.h> #include <unistd.h>
#else #else
#error "Please specify the header with file functions declarations." #error "Please specify the header with file functions declarations."
#endif //Win/UNIX #endif //Win/UNIX
#include <stdio.h> // SEEK_xxx constants #include <stdio.h> // SEEK_xxx constants
@@ -87,17 +87,14 @@
#define S_IFDIR _S_IFDIR #define S_IFDIR _S_IFDIR
#define S_IFREG _S_IFREG #define S_IFREG _S_IFREG
#define S_IREAD _S_IREAD
#define S_IWRITE _S_IWRITE
#else #else
#define tell(fd) lseek(fd, 0, SEEK_CUR) #define tell(fd) lseek(fd, 0, SEEK_CUR)
#endif //_MSC_VER #endif //_MSC_VER
// there is no distinction between text and binary files under Unix // there is no distinction between text and binary files under Unix
#ifdef __UNIX__ #ifdef __UNIX__
#define O_BINARY (0) #define O_BINARY (0)
#endif //__UNIX__ #endif //__UNIX__
// wxWindows // wxWindows
#include <wx/string.h> #include <wx/string.h>
@@ -114,8 +111,8 @@
// static functions // static functions
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
bool wxFile::Exists(const char *sz) bool wxFile::Exists(const char *sz)
{ {
struct stat st; struct stat st;
return !access(sz, 0) && !stat(sz, &st) && (st.st_mode & S_IFREG); 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 // 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, // 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 // 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 ) { if ( fd == -1 ) {
wxLogSysError(_("can't create file '%s'"), szFileName); wxLogSysError(_("can't create file '%s'"), szFileName);
@@ -156,29 +153,29 @@ bool wxFile::Create(const char *szFileName, bool bOverwrite)
} }
// open the file // 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; int flags = O_BINARY;
switch ( mode ) { switch ( mode ) {
case read: case read:
flags |= O_RDONLY; flags |= O_RDONLY;
break; break;
case write: case write:
flags |= O_WRONLY | O_CREAT | O_TRUNC; flags |= O_WRONLY | O_CREAT | O_TRUNC;
break; break;
case write_append: case write_append:
flags |= O_WRONLY | O_APPEND; flags |= O_WRONLY | O_APPEND;
break; break;
case read_write: case read_write:
flags |= O_RDWR; flags |= O_RDWR;
break; break;
} }
int fd = open(szFileName, flags, S_IREAD | S_IWRITE); int fd = open(szFileName, flags, access);
if ( fd == -1 ) { if ( fd == -1 ) {
wxLogSysError(_("can't open file '%s'"), szFileName); wxLogSysError(_("can't open file '%s'"), szFileName);
@@ -314,7 +311,7 @@ off_t wxFile::Length() const
#else #else
int iRc = tell(m_fd); int iRc = tell(m_fd);
if ( iRc != -1 ) { if ( iRc != -1 ) {
// @ have to use const_cast :-( // @ have to use const_cast :-(
int iLen = ((wxFile *)this)->SeekEnd(); int iLen = ((wxFile *)this)->SeekEnd();
if ( iLen != -1 ) { if ( iLen != -1 ) {
// restore old position // restore old position
@@ -390,7 +387,7 @@ wxTempFile::wxTempFile(const wxString& strName)
bool wxTempFile::Open(const wxString& strName) bool wxTempFile::Open(const wxString& strName)
{ {
m_strName = strName; m_strName = strName;
// we want to create the file in the same directory as strName because // 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 // otherwise rename() in Commit() might not work (if the files are on
// different partitions for example). Unfortunately, the only standard // different partitions for example). Unfortunately, the only standard
@@ -408,7 +405,7 @@ bool wxTempFile::Open(const wxString& strName)
wxLogLastError("GetTempFileName"); wxLogLastError("GetTempFileName");
m_strTemp.UngetWriteBuf(); m_strTemp.UngetWriteBuf();
#endif // Windows/Unix #endif // Windows/Unix
return m_file.Open(m_strTemp, wxFile::write); return m_file.Open(m_strTemp, wxFile::write);
} }