]> granicus.if.org Git - taglib/commitdiff
Refectored the FileStream constructor.
authorTsuda Kageyu <tsuda.kageyu@gmail.com>
Sun, 2 Sep 2012 16:45:28 +0000 (01:45 +0900)
committerTsuda Kageyu <tsuda.kageyu@gmail.com>
Sun, 2 Sep 2012 16:45:28 +0000 (01:45 +0900)
taglib/toolkit/tfilestream.cpp

index 46f05a8d1dab38af8a2da9eb2bedcbba00c9ff77..b1fd9f80aff4eba5318cea63d5b6cf551b48359b 100644 (file)
@@ -65,6 +65,51 @@ struct FileNameHandle : public std::string
 
 #endif
 
+namespace {
+  FILE *openFile(const FileName &path, bool readOnly)
+  {
+    // Calls a proper variation of fopen() depending on the compiling environment.
+
+#if defined(_WIN32)
+  
+# if defined(_MSC_VER) && (_MSC_VER >= 1400) 
+
+    // Visual C++ 2005 or later.
+
+    FILE *file;
+    errno_t err;
+
+    if(wcslen(path) > 0)
+      err = _wfopen_s(&file, path, readOnly ? L"rb" : L"rb+");
+    else
+      err = fopen_s(&file, path, readOnly ? "rb" : "rb+");
+  
+    if(err == 0)
+      return file;
+    else
+      return NULL;
+  
+# else   // defined(_MSC_VER) && (_MSC_VER >= 1400)
+
+    // Visual C++.NET 2003 or earlier.
+
+    if(wcslen(path) > 0)
+      return _wfopen(path, readOnly ? L"rb" : L"rb+");
+    else
+      return fopen(path, readOnly ? "rb" : "rb+");
+
+# endif  // defined(_MSC_VER) && (_MSC_VER >= 1400)
+
+#else  // defined(_WIN32)
+
+    // Non-Win32
+
+    return fopen(path, readOnly ? "rb" : "rb+");
+
+#endif // defined(_WIN32)
+  }
+}
+
 class FileStream::FileStreamPrivate
 {
 public:
@@ -87,79 +132,17 @@ FileStream::FileStreamPrivate::FileStreamPrivate(FileName fileName, bool openRea
 {
   // First try with read / write mode, if that fails, fall back to read only.
 
-#if defined(_MSC_VER) && (_MSC_VER >= 1400)  // VC++2005 or later
-
-  errno_t err;
-  if(wcslen((const wchar_t *) fileName) > 0) {
-    if(openReadOnly)
-      err = _wfopen_s(&file, name, L"rb");
-    else {
-      err = _wfopen_s(&file, name, L"rb+");
+  if(!openReadOnly)
+    file = openFile(name, false);
 
-      if(err == 0)
-        readOnly = false;
-      else
-        err = _wfopen_s(&file, name, L"rb");
-    }
-
-    if(err == 0)
-      return;
-  }
-
-  if(openReadOnly)
-    err = fopen_s(&file, name, "rb");
-  else {
-    err = fopen_s(&file, name, "rb+");
-
-    if(err == 0)
-      readOnly = false;
-    else
-      err = fopen_s(&file, name, "rb");
-  }
-
-  if(err != 0) {
-    debug("Could not open file " + String((const char *) name));
-  }
-
-#else   // defined(_MSC_VER) && (_MSC_VER >= 1400)
-
-# ifdef _WIN32
-
-  if(wcslen((const wchar_t *) fileName) > 0) {
-    if(openReadOnly)
-      file = _wfopen(name, L"rb");
-    else {
-      file = _wfopen(name, L"rb+");
-
-      if(file)
-        readOnly = false;
-      else
-        file = _wfopen(name, L"rb");
-    }
-
-    if(file)
-      return;
-  }
-
-# endif // defined(_WIN32)
-
-  if(openReadOnly)
-    file = fopen(name, "rb");
-  else {
-    file = fopen(name, "rb+");
-
-    if(file)
-      readOnly = false;
-    else
-      file = fopen(name, "rb");
-  }
+  if(file)
+    readOnly = false;
+  else
+    file = openFile(name, true);
 
   if(!file) {
     debug("Could not open file " + String((const char *) name));
   }
-
-#endif  // defined(_MSC_VER) && (_MSC_VER >= 1400)
-
 }
 
 ////////////////////////////////////////////////////////////////////////////////