// Created: 29/01/98
// RCS-ID: $Id$
// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
-// Licence: wxWindows license
+// Licence: wxWindows license
/////////////////////////////////////////////////////////////////////////////
#ifndef __FILEH__
// 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
//
public:
// more file constants
// -------------------
-
+
// opening mode
enum OpenMode { read, write, read_write, write_append };
// standard values for file descriptor
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
bool Eof() const;
// is an error occured?
bool Error() const { return m_error; }
-
+
// dtor closes the file if opened
~wxFile();
// 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
// Created: 29/01/98
// RCS-ID: $Id$
// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
-// Licence: wxWindows license
+// Licence: wxWindows license
/////////////////////////////////////////////////////////////////////////////
// ----------------------------------------------------------------------------
#endif
// standard
-#if defined(__WXMSW__) && !defined(__GNUWIN32__)
+#if defined(__WXMSW__) && !defined(__GNUWIN32__)
#include <io.h>
#define WIN32_LEAN_AND_MEAN
#elif (defined(__UNIX__) || defined(__GNUWIN32__))
#include <unistd.h>
#else
- #error "Please specify the header with file functions declarations."
+ #error "Please specify the header with file functions declarations."
#endif //Win/UNIX
#include <stdio.h> // SEEK_xxx constants
#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 <wx/string.h>
// 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);
}
}
// 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);
}
// 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);
#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
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
wxLogLastError("GetTempFileName");
m_strTemp.UngetWriteBuf();
#endif // Windows/Unix
-
+
return m_file.Open(m_strTemp, wxFile::write);
}