]> git.mxchange.org Git - simgear.git/commitdiff
Introduce SGBinaryFile
authorTorsten Dreyer <torsten@t3r.de>
Fri, 6 May 2016 20:01:42 +0000 (22:01 +0200)
committerRoland Haeder <roland@mxchange.org>
Sat, 13 Aug 2016 08:21:16 +0000 (10:21 +0200)
For Windows, default file mode is TEXT.
If binary files should be created _O_BINARY shall be or'ed to the open
flags. This is not necessary on *nixes.

Introduce a SGBinaryFile as extension to SGFile which adds the flag
upon construction on Windows.

This should keep existing behaviour for all other usages of SGFile.

simgear/io/HTTPRepository.cxx
simgear/io/sg_file.cxx
simgear/io/sg_file.hxx

index e5d8246984cd4275c61b8f15728994bf71089bd4..09f2f8e5a2a1ac1de903565a0a09a2a3b3d14b6a 100644 (file)
@@ -612,7 +612,7 @@ HTTPRepository::failure() const
         virtual void gotBodyData(const char* s, int n)
         {
             if (!file.get()) {
-                file.reset(new SGFile(pathInRepo.str()));
+                file.reset(new SGBinaryFile(pathInRepo.str()));
                 if (!file->open(SG_IO_OUT)) {
                   SG_LOG(SG_TERRASYNC, SG_WARN, "unable to create file " << pathInRepo);
                   _directory->repository()->http->cancelRequest(this, "Unable to create output file");
@@ -664,7 +664,7 @@ HTTPRepository::failure() const
         std::string fileName; // if empty, we're getting the directory itself
         SGPath pathInRepo;
         simgear::sha1nfo hashContext;
-        std::auto_ptr<SGFile> file;
+        std::auto_ptr<SGBinaryFile> file;
     };
 
     class DirGetRequest : public HTTPRepoGetRequest
index 0cf66f77d6f0139dc654e914ff89c3d403f3437d..71de546e3cdfcc9492a625c86063860e1243fa02 100644 (file)
@@ -45,8 +45,9 @@
 #include "sg_file.hxx"
 
 
-SGFile::SGFile(const std::string &file, int repeat_)
-    : file_name(file), fp(-1), eof_flag(true), repeat(repeat_), iteration(0)
+SGFile::SGFile(const std::string &file, int repeat_, int extraoflags_ )
+    : file_name(file), fp(-1), eof_flag(true), repeat(repeat_), iteration(0),
+      extraoflags(extraoflags_)
 {
     set_type( sgFileType );
 }
@@ -70,13 +71,13 @@ bool SGFile::open( const SGProtocolDir d ) {
 
     if ( get_dir() == SG_IO_OUT ) {
 #ifdef _WIN32
-        int mode = 00666;
+        int mode = _S_IREAD | _S_IWRITE;
 #else
         mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
 #endif
-       fp = ::open( file_name.c_str(), O_WRONLY | O_CREAT | O_TRUNC, mode );
+       fp = ::open( file_name.c_str(), O_WRONLY | O_CREAT | O_TRUNC | extraoflags, mode );
     } else if ( get_dir() == SG_IO_IN ) {
-       fp = ::open( file_name.c_str(), O_RDONLY );
+       fp = ::open( file_name.c_str(), O_RDONLY | extraoflags );
     } else {
        SG_LOG( SG_IO, SG_ALERT, 
                "Error:  bidirection mode not available for files." );
@@ -178,3 +179,12 @@ bool SGFile::close() {
     eof_flag = true;
     return true;
 }
+
+SGBinaryFile::SGBinaryFile( const std::string& file, int repeat_ ) :
+#ifdef _WIN32
+    SGFile(file,repeat_, _O_BINARY)
+#else
+    SGFile(file,repeat_, 0)
+#endif
+{
+}
index 950cc5d751f91331817d7b4e68bb1baeecb5fdc0..53da227aaa84959078ff6e54f5e1300c303d8e2a 100644 (file)
@@ -39,6 +39,7 @@ class SGFile : public SGIOChannel {
     const int repeat;
     int iteration;              // number of current repetition,
                                 // starting at 0
+    int extraoflags;
 
 public:
 
@@ -50,7 +51,7 @@ public:
      * @param file name of file to open
      * @param repeat On eof restart at the beginning of the file
      */
-    SGFile( const std::string& file, int repeat_ = 1 );
+    SGFile( const std::string& file, int repeat_ = 1, int extraoflags = 0);
 
     /**
      * Create an SGFile from an existing, open file-descriptor
@@ -85,4 +86,9 @@ public:
     virtual bool eof() const { return eof_flag; };
 };
 
+class SGBinaryFile : public SGFile {
+public:
+    SGBinaryFile( const std::string& file, int repeat_ = 1 );
+};
+
 #endif // _SG_FILE_HXX