Add wxFileName::SetPermissions().
authorVadim Zeitlin <vadim@wxwidgets.org>
Wed, 7 Aug 2013 11:08:28 +0000 (11:08 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Wed, 7 Aug 2013 11:08:28 +0000 (11:08 +0000)
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
include/wx/filefn.h
include/wx/filename.h
interface/wx/filename.h
src/common/filename.cpp
src/msw/mslu.cpp
src/msw/wince/filefnwce.cpp

index b500425edd27684d7fe2598ab7298c94f3a6120c..cfe97ea217474909fca28665a426116f7dac9302 100644 (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):
index a905d924ab18337a95cf76eefc98ee87ffadeb80..a5bcd7e3fcb47cab1cee585f4881984038d5a870 100644 (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); }
 
index 050a0378159403260b3db2550d47997d8930bfd7..e3d1df925da8941110e9dee1e3d92a810184d75d 100644 (file)
 #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
index caec236ae05f709fa48b36dfe54fe1f919852c75..05383c3a897bef9767565efe390502de7794efb7 100644 (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).
index c0b38a528267c8e24d8a06dc53d35cc20ec9d372..d538ebcc38c7c249cca93ab13bbba44a1efd97be 100644 (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
 // ----------------------------------------------------------------------------
index 86c982114b9a16d9c713f39f1a4b25d7368e0efc..eb6cf1bd6e43c45855da755d6a5a697613b45244 100644 (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() )
index 445b2b0d9b634c1a48b411e941e7df51c78a661a..6f9292fa84ef4a814a879c824b0f9773378a3b09 100644 (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))