0029081: With Mingw-w64 Unicode Paths Do Not Work
[occt.git] / src / OSD / OSD_OpenFile.cxx
1 // Copyright (c) 2014 OPEN CASCADE SAS
2 //
3 // This file is part of Open CASCADE Technology software library.
4 //
5 // This library is free software; you can redistribute it and/or modify it under
6 // the terms of the GNU Lesser General Public License version 2.1 as published
7 // by the Free Software Foundation, with special exception defined in the file
8 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
9 // distribution for complete text of the license and disclaimer of any warranty.
10 //
11 // Alternatively, this file may be used under the terms of Open CASCADE
12 // commercial license or contractual agreement.
13
14 #ifdef _WIN32
15   #include <windows.h>
16   #include <share.h>
17 #endif
18
19 #include <OSD_OpenFile.hxx>
20
21 #include <sys/types.h>
22 #include <sys/stat.h>
23 #include <fcntl.h>
24
25 //! Auxiliary function converting C++ ios open mode flags to C fopen() flags.
26 static int OSD_OpenFile_iosMode2FileFlags (::std::ios_base::openmode theMode)
27 {
28   int aFlags = 0;
29   if (theMode & ::std::ios_base::in)
30   {
31     aFlags |= O_RDONLY;
32   }
33   if (theMode & ::std::ios_base::out)
34   {
35     aFlags |= O_WRONLY;
36     aFlags |= O_CREAT;
37     if (theMode & ::std::ios_base::app)
38     {
39       aFlags |= O_APPEND;
40     }
41     if (theMode & ::std::ios_base::trunc)
42     {
43       aFlags |= O_TRUNC;
44     }
45   }
46 #ifdef _WIN32
47   if (theMode & ::std::ios_base::binary)
48   {
49     aFlags |= O_BINARY;
50   }
51   else
52   {
53     aFlags |= O_TEXT;
54   }
55 #endif
56   return aFlags;
57 }
58
59 // ==============================================
60 // function : OSD_OpenFile
61 // purpose : Opens file
62 // ==============================================
63 int OSD_OpenFileDescriptor (const TCollection_ExtendedString& theName,
64                             ::std::ios_base::openmode theMode)
65 {
66   int aFileDesc = -1;
67   const int aFlags = OSD_OpenFile_iosMode2FileFlags (theMode);
68 #if defined(_WIN32)
69   const errno_t anErrCode = _wsopen_s (&aFileDesc, theName.ToWideString(), aFlags, _SH_DENYNO, _S_IREAD | _S_IWRITE);
70   if (anErrCode != 0)
71   {
72     return -1;
73   }
74 #else
75   NCollection_Utf8String aString (theName.ToExtString());
76   aFileDesc = open (aString.ToCString(), aFlags);
77 #endif
78   return aFileDesc;
79 }
80
81 // ==============================================
82 // function : OSD_OpenFile
83 // purpose : Opens file
84 // ==============================================
85 FILE* OSD_OpenFile(const char* theName,
86                    const char* theMode)
87 {
88   FILE* aFile = 0;
89 #if defined(_WIN32)
90   // file name is treated as UTF-8 string and converted to UTF-16 one
91   const TCollection_ExtendedString aFileNameW (theName, Standard_True);
92   const TCollection_ExtendedString aFileModeW (theMode, Standard_True);
93   aFile = ::_wfopen (aFileNameW.ToWideString(),
94                      aFileModeW.ToWideString());
95 #else
96   aFile = ::fopen (theName, theMode);
97 #endif
98   return aFile;
99 }
100
101 // ==============================================
102 // function : OSD_OpenFile
103 // purpose : Opens file
104 // ==============================================
105 FILE* OSD_OpenFile(const TCollection_ExtendedString& theName,
106                    const char* theMode)
107 {
108   FILE* aFile = 0;
109 #if defined(_WIN32)
110   const TCollection_ExtendedString aFileModeW (theMode, Standard_True);
111   aFile = ::_wfopen (theName.ToWideString(),
112                      aFileModeW.ToWideString());
113 #else
114   // conversion in UTF-8 for linux
115   NCollection_Utf8String aString (theName.ToExtString());
116   aFile = ::fopen (aString.ToCString(),theMode);
117 #endif
118   return aFile;
119 }
120
121 // ==============================================
122 // function : OSD_FileStatCTime
123 // purpose :
124 // ==============================================
125 Standard_Time OSD_FileStatCTime (const char* theName)
126 {
127   Standard_Time aTime = 0;
128 #if defined(_WIN32)
129   // file name is treated as UTF-8 string and converted to UTF-16 one
130   const TCollection_ExtendedString aFileNameW (theName, Standard_True);
131   struct __stat64 aStat;
132   if (_wstat64 (aFileNameW.ToWideString(), &aStat) == 0)
133   {
134     aTime = (Standard_Time )aStat.st_ctime;
135   }
136 #else
137   struct stat aStat;
138   if (stat (theName, &aStat) == 0)
139   {
140     aTime = (Standard_Time )aStat.st_ctime;
141   }
142 #endif
143   return aTime;
144 }