]> git.lyx.org Git - lyx.git/blobdiff - src/support/copy.C
* src/text2.C: deleteEmptyParagraphMechanism(): fix a crash in
[lyx.git] / src / support / copy.C
index f1b32f8c2363327dc79a56bde878475a73b3bc09..9ed6246f417863ae0a1ac9a5085dbacbcdcc7766 100644 (file)
@@ -3,33 +3,71 @@
  * This file is part of LyX, the document processor.
  * Licence details can be found in the file COPYING.
  *
- * \author Lars Gullik Bjønnes
+ * \author Lars Gullik Bjønnes
  *
- * Full author contact details are available in file CREDITS
+ * Full author contact details are available in file CREDITS.
  */
 
 #include <config.h>
 
 #include <fstream>
 
+#include "support/filename.h"
 #include "support/lyxlib.h"
-#include "LString.h"
+
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+
+
+namespace lyx {
+
 
 using std::ifstream;
 using std::ofstream;
 using std::ios;
+using std::string;
 
-bool lyx::support::copy(string const & from, string const & to)
+
+bool lyx::support::chmod(FileName const & file, unsigned long int mode)
 {
-       ifstream ifs(from.c_str());
+#if defined (HAVE_CHMOD) && defined (HAVE_MODE_T)
+       if (::chmod(file.toFilesystemEncoding().c_str(), mode_t(mode)) != 0)
+               return false;
+#else
+# ifdef WITH_WARNINGS
+#  warning "File permissions are ignored on this system."
+# endif
+#endif
+       return true;
+}
+
+
+bool lyx::support::copy(FileName const & from, FileName const & to, unsigned long int mode)
+{
+       ifstream ifs(from.toFilesystemEncoding().c_str(), ios::binary | ios::in);
        if (!ifs)
                return false;
-       ofstream ofs(to.c_str(),
-                    ios::binary | ios::out | ios::trunc);
+
+       if (mode != (unsigned long int)-1) {
+               ofstream ofs(to.toFilesystemEncoding().c_str(), ios::binary | ios::out | ios::trunc);
+               if (!ofs)
+                       return false;
+               ofs.close();
+               if (!support::chmod(to, mode))
+                       return false;
+       }
+
+       ofstream ofs(to.toFilesystemEncoding().c_str(), ios::binary | ios::out | ios::trunc);
        if (!ofs)
                return false;
+
        ofs << ifs.rdbuf();
-       if (ofs.good())
-               return true;
-       return false;
+       return ofs.good();
 }
+
+
+} // namespace lyx