From 5bd6ad08a778f230f2d9ef5d390be68b13d3a0eb Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Wed, 7 Aug 2013 11:08:28 +0000 Subject: [PATCH] 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 --- docs/changes.txt | 1 + include/wx/filefn.h | 11 +++++++++++ include/wx/filename.h | 15 ++++----------- interface/wx/filename.h | 17 +++++++++++++++++ src/common/filename.cpp | 31 +++++++++++++++++++++++++++++++ src/msw/mslu.cpp | 8 ++++++++ src/msw/wince/filefnwce.cpp | 6 ++++++ 7 files changed, 78 insertions(+), 11 deletions(-) diff --git a/docs/changes.txt b/docs/changes.txt index b500425edd..cfe97ea217 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -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): diff --git a/include/wx/filefn.h b/include/wx/filefn.h index a905d924ab..a5bcd7e3fc 100644 --- a/include/wx/filefn.h +++ b/include/wx/filefn.h @@ -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); } diff --git a/include/wx/filename.h b/include/wx/filename.h index 050a037815..e3d1df925d 100644 --- a/include/wx/filename.h +++ b/include/wx/filename.h @@ -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 diff --git a/interface/wx/filename.h b/interface/wx/filename.h index caec236ae0..05383c3a89 100644 --- a/interface/wx/filename.h +++ b/interface/wx/filename.h @@ -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). diff --git a/src/common/filename.cpp b/src/common/filename.cpp index c0b38a5282..d538ebcc38 100644 --- a/src/common/filename.cpp +++ b/src/common/filename.cpp @@ -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 // ---------------------------------------------------------------------------- diff --git a/src/msw/mslu.cpp b/src/msw/mslu.cpp index 86c982114b..eb6cf1bd6e 100644 --- a/src/msw/mslu.cpp +++ b/src/msw/mslu.cpp @@ -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() ) diff --git a/src/msw/wince/filefnwce.cpp b/src/msw/wince/filefnwce.cpp index 445b2b0d9b..6f9292fa84 100644 --- a/src/msw/wince/filefnwce.cpp +++ b/src/msw/wince/filefnwce.cpp @@ -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)) -- 2.45.2