Add wxFileName::SetPermissions().

This is a simple wrapper for the POSIX chmod().

Closes #12951.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@74639 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2013-08-07 11:08:28 +00:00
parent 985addd986
commit 5bd6ad08a7
7 changed files with 78 additions and 11 deletions

View File

@@ -563,6 +563,7 @@ Major new features in this release
All: All:
- Allow using custom HTTP methods with wxHTTP (Kolya Kosenko). - Allow using custom HTTP methods with wxHTTP (Kolya Kosenko).
- Add wxFileName::SetPermissions() (Catalin Raceanu).
- Fix build with wxUSE_FFILE==0 (jroemmler). - Fix build with wxUSE_FFILE==0 (jroemmler).
All (GUI): All (GUI):

View File

@@ -170,6 +170,7 @@ enum wxPosixPermissions
#define wxFileOffsetFmtSpec wxT("I64") #define wxFileOffsetFmtSpec wxT("I64")
WXDLLIMPEXP_BASE int wxCRT_Open(const wxChar *filename, int oflag, int WXUNUSED(pmode)); WXDLLIMPEXP_BASE int wxCRT_Open(const wxChar *filename, int oflag, int WXUNUSED(pmode));
WXDLLIMPEXP_BASE int wxCRT_Access(const wxChar *name, int WXUNUSED(how)); WXDLLIMPEXP_BASE int wxCRT_Access(const wxChar *name, int WXUNUSED(how));
WXDLLIMPEXP_BASE int wxCRT_Chmod(const wxChar *name, int WXUNUSED(how));
WXDLLIMPEXP_BASE int wxClose(int fd); WXDLLIMPEXP_BASE int wxClose(int fd);
WXDLLIMPEXP_BASE int wxFsync(int WXUNUSED(fd)); WXDLLIMPEXP_BASE int wxFsync(int WXUNUSED(fd));
WXDLLIMPEXP_BASE int wxRead(int fd, void *buf, unsigned int count); WXDLLIMPEXP_BASE int wxRead(int fd, void *buf, unsigned int count);
@@ -330,6 +331,7 @@ enum wxPosixPermissions
// first the ANSI versions // first the ANSI versions
#define wxCRT_OpenA wxPOSIX_IDENT(open) #define wxCRT_OpenA wxPOSIX_IDENT(open)
#define wxCRT_AccessA wxPOSIX_IDENT(access) #define wxCRT_AccessA wxPOSIX_IDENT(access)
#define wxCRT_ChmodA wxPOSIX_IDENT(chmod)
#define wxCRT_MkDirA wxPOSIX_IDENT(mkdir) #define wxCRT_MkDirA wxPOSIX_IDENT(mkdir)
#define wxCRT_RmDirA wxPOSIX_IDENT(rmdir) #define wxCRT_RmDirA wxPOSIX_IDENT(rmdir)
#ifdef wxHAS_HUGE_FILES #ifdef wxHAS_HUGE_FILES
@@ -361,6 +363,7 @@ enum wxPosixPermissions
#endif #endif
#define wxCRT_AccessW _waccess #define wxCRT_AccessW _waccess
#define wxCRT_ChmodW _wchmod
#define wxCRT_MkDirW _wmkdir #define wxCRT_MkDirW _wmkdir
#define wxCRT_RmDirW _wrmdir #define wxCRT_RmDirW _wrmdir
#ifdef wxHAS_HUGE_FILES #ifdef wxHAS_HUGE_FILES
@@ -379,6 +382,8 @@ enum wxPosixPermissions
int flags, int mode); int flags, int mode);
WXDLLIMPEXP_BASE int wxMSLU__waccess(const wxChar *name, WXDLLIMPEXP_BASE int wxMSLU__waccess(const wxChar *name,
int mode); int mode);
WXDLLIMPEXP_BASE int wxMSLU__wchmod(const wxChar *name,
int mode);
WXDLLIMPEXP_BASE int wxMSLU__wmkdir(const wxChar *name); WXDLLIMPEXP_BASE int wxMSLU__wmkdir(const wxChar *name);
WXDLLIMPEXP_BASE int wxMSLU__wrmdir(const wxChar *name); WXDLLIMPEXP_BASE int wxMSLU__wrmdir(const wxChar *name);
@@ -388,12 +393,14 @@ enum wxPosixPermissions
#define wxCRT_Open wxMSLU__wopen #define wxCRT_Open wxMSLU__wopen
#define wxCRT_Access wxMSLU__waccess #define wxCRT_Access wxMSLU__waccess
#define wxCRT_Chmod wxMSLU__wchmod
#define wxCRT_MkDir wxMSLU__wmkdir #define wxCRT_MkDir wxMSLU__wmkdir
#define wxCRT_RmDir wxMSLU__wrmdir #define wxCRT_RmDir wxMSLU__wrmdir
#define wxCRT_Stat wxMSLU__wstat #define wxCRT_Stat wxMSLU__wstat
#else // !wxUSE_UNICODE_MSLU #else // !wxUSE_UNICODE_MSLU
#define wxCRT_Open wxCRT_OpenW #define wxCRT_Open wxCRT_OpenW
#define wxCRT_Access wxCRT_AccessW #define wxCRT_Access wxCRT_AccessW
#define wxCRT_Chmod wxCRT_ChmodW
#define wxCRT_MkDir wxCRT_MkDirW #define wxCRT_MkDir wxCRT_MkDirW
#define wxCRT_RmDir wxCRT_RmDirW #define wxCRT_RmDir wxCRT_RmDirW
#define wxCRT_Stat wxCRT_StatW #define wxCRT_Stat wxCRT_StatW
@@ -401,6 +408,7 @@ enum wxPosixPermissions
#else // !wxUSE_UNICODE #else // !wxUSE_UNICODE
#define wxCRT_Open wxCRT_OpenA #define wxCRT_Open wxCRT_OpenA
#define wxCRT_Access wxCRT_AccessA #define wxCRT_Access wxCRT_AccessA
#define wxCRT_Chmod wxCRT_ChmodA
#define wxCRT_MkDir wxCRT_MkDirA #define wxCRT_MkDir wxCRT_MkDirA
#define wxCRT_RmDir wxCRT_RmDirA #define wxCRT_RmDir wxCRT_RmDirA
#define wxCRT_Stat wxCRT_StatA #define wxCRT_Stat wxCRT_StatA
@@ -480,6 +488,7 @@ enum wxPosixPermissions
#define wxCRT_Stat stat #define wxCRT_Stat stat
#define wxCRT_Lstat lstat #define wxCRT_Lstat lstat
#define wxCRT_Access access #define wxCRT_Access access
#define wxCRT_Chmod chmod
#define wxHAS_NATIVE_LSTAT #define wxHAS_NATIVE_LSTAT
#endif // platforms #endif // platforms
@@ -501,6 +510,8 @@ enum wxPosixPermissions
inline int wxAccess(const wxString& path, mode_t mode) inline int wxAccess(const wxString& path, mode_t mode)
{ return wxCRT_Access(path.fn_str(), mode); } { return wxCRT_Access(path.fn_str(), mode); }
inline int wxChmod(const wxString& path, mode_t mode)
{ return wxCRT_Chmod(path.fn_str(), mode); }
inline int wxOpen(const wxString& path, int flags, mode_t mode) inline int wxOpen(const wxString& path, int flags, mode_t mode)
{ return wxCRT_Open(path.fn_str(), flags, mode); } { return wxCRT_Open(path.fn_str(), flags, mode); }

View File

@@ -11,17 +11,6 @@
#ifndef _WX_FILENAME_H_ #ifndef _WX_FILENAME_H_
#define _WX_FILENAME_H_ #define _WX_FILENAME_H_
/*
TODO:
1. support for drives under Windows
2. more file operations:
a) chmod()
b) [acm]time() - get and set
c) rename()?
3. SameFileAs() function to compare inodes under Unix
*/
#include "wx/arrstr.h" #include "wx/arrstr.h"
#include "wx/filefn.h" #include "wx/filefn.h"
#include "wx/datetime.h" #include "wx/datetime.h"
@@ -265,6 +254,10 @@ public:
bool IsFileExecutable() const { return wxIsExecutable(GetFullPath()); } bool IsFileExecutable() const { return wxIsExecutable(GetFullPath()); }
static bool IsFileExecutable(const wxString &path) { return wxFileExists(path) && wxIsExecutable(path); } static bool IsFileExecutable(const wxString &path) { return wxFileExists(path) && wxIsExecutable(path); }
// set the file permissions to a combination of wxPosixPermissions enum
// values
bool SetPermissions(int permissions);
// time functions // time functions
#if wxUSE_DATETIME #if wxUSE_DATETIME

View File

@@ -1256,6 +1256,23 @@ public:
*/ */
void SetPath(const wxString& path, wxPathFormat format = wxPATH_NATIVE); void SetPath(const wxString& path, wxPathFormat format = wxPATH_NATIVE);
/**
Sets permissions for this file or directory.
@param permissions
The new permissions: this should be a combination of
::wxPosixPermissions enum elements.
@since 2.9.6
@note If this is a symbolic link and it should not be followed
this call will fail.
@return @true on success, @false if an error occurred (for example,
the file doesn't exist).
*/
bool SetPermissions(int permissions)
/** /**
Sets the file creation and last access/modification times (any of the pointers Sets the file creation and last access/modification times (any of the pointers
may be @NULL). may be @NULL).

View File

@@ -2572,6 +2572,37 @@ wxString wxFileName::StripExtension(const wxString& fullpath)
return fn.GetFullPath(); return fn.GetFullPath();
} }
// ----------------------------------------------------------------------------
// file permissions functions
// ----------------------------------------------------------------------------
bool wxFileName::SetPermissions(int permissions)
{
// Don't do anything for a symlink but first make sure it is one.
if ( m_dontFollowLinks &&
Exists(wxFILE_EXISTS_SYMLINK|wxFILE_EXISTS_NO_FOLLOW) )
{
// Looks like changing permissions for a symlinc is only supported
// on BSD where lchmod is present and correctly implemented.
// http://lists.gnu.org/archive/html/bug-coreutils/2009-09/msg00268.html
return false;
}
#ifdef __WINDOWS__
int accMode = 0;
if ( permissions & (wxS_IRUSR|wxS_IRGRP|wxS_IROTH) )
accMode = _S_IREAD;
if ( permissions & (wxS_IWUSR|wxS_IWGRP|wxS_IWOTH) )
accMode |= _S_IWRITE;
permissions = accMode;
#endif // __WINDOWS__
return wxChmod(GetFullPath(), permissions) == 0;
}
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// time functions // time functions
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------

View File

@@ -199,6 +199,14 @@ WXDLLIMPEXP_BASE int wxMSLU__waccess(const wchar_t *name, int mode)
return wxCRT_AccessW(name, mode); return wxCRT_AccessW(name, mode);
} }
WXDLLIMPEXP_BASE int wxMSLU__wchmod(const wchar_t *name, int mode)
{
if ( wxUsingUnicowsDll() )
return wxCRT_ChmodA(wxConvFile.cWX2MB(name), mode);
else
return wxCRT_ChmodW(name, mode);
}
WXDLLIMPEXP_BASE int wxMSLU__wmkdir(const wchar_t *name) WXDLLIMPEXP_BASE int wxMSLU__wmkdir(const wchar_t *name)
{ {
if ( wxUsingUnicowsDll() ) if ( wxUsingUnicowsDll() )

View File

@@ -112,6 +112,12 @@ int wxCRT_Access(const wxChar *name, int WXUNUSED(how))
return 0; return 0;
} }
int wxCRT_Chmod(const wxChar *WXUNUSED(name), int WXUNUSED(how))
{
// TODO
return -1;
}
int wxClose(int fd) int wxClose(int fd)
{ {
if (CloseHandle((HANDLE)fd)) if (CloseHandle((HANDLE)fd))