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:
- Allow using custom HTTP methods with wxHTTP (Kolya Kosenko).
- Add wxFileName::SetPermissions() (Catalin Raceanu).
- Fix build with wxUSE_FFILE==0 (jroemmler).
All (GUI):

View File

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

View File

@@ -11,17 +11,6 @@
#ifndef _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/filefn.h"
#include "wx/datetime.h"
@@ -265,6 +254,10 @@ public:
bool IsFileExecutable() const { return wxIsExecutable(GetFullPath()); }
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
#if wxUSE_DATETIME

View File

@@ -1256,6 +1256,23 @@ public:
*/
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
may be @NULL).

View File

@@ -2572,6 +2572,37 @@ wxString wxFileName::StripExtension(const wxString& fullpath)
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
// ----------------------------------------------------------------------------

View File

@@ -199,6 +199,14 @@ WXDLLIMPEXP_BASE int wxMSLU__waccess(const wchar_t *name, int 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)
{
if ( wxUsingUnicowsDll() )

View File

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