0026937: Eliminate NO_CXX_EXCEPTION macro support
[occt.git] / src / OSD / OSD_Directory.cxx
1 // Copyright (c) 1998-1999 Matra Datavision
2 // Copyright (c) 1999-2014 OPEN CASCADE SAS
3 //
4 // This file is part of Open CASCADE Technology software library.
5 //
6 // This library is free software; you can redistribute it and/or modify it under
7 // the terms of the GNU Lesser General Public License version 2.1 as published
8 // by the Free Software Foundation, with special exception defined in the file
9 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
10 // distribution for complete text of the license and disclaimer of any warranty.
11 //
12 // Alternatively, this file may be used under the terms of Open CASCADE
13 // commercial license or contractual agreement.
14
15 #ifndef _WIN32
16
17 #include <OSD_Directory.hxx>
18 #include <OSD_Path.hxx>
19 #include <OSD_Protection.hxx>
20 #include <OSD_WhoAmI.hxx>
21
22 #include <errno.h>
23 #include <stdio.h>
24 #include <sys/stat.h>
25 #include <unistd.h>
26 const OSD_WhoAmI Iam = OSD_WDirectory;
27
28
29 OSD_Directory::OSD_Directory():OSD_FileNode() {
30 }
31
32 OSD_Directory::OSD_Directory(const OSD_Path& Name):OSD_FileNode(Name){
33 }
34
35 // Create physically a directory
36
37 void OSD_Directory::Build(const OSD_Protection& Protect){
38 int status;
39 Standard_Integer internal_prot;
40 TCollection_AsciiString aBuffer;
41
42  internal_prot = Protect.Internal();
43  myPath.SystemName(aBuffer);
44  umask ( 0 );
45  status = mkdir (aBuffer.ToCString(), (mode_t)internal_prot);
46  if (status == -1 && errno == ENOENT)
47  {
48    OSD_Path aSupPath = myPath;
49    aSupPath.UpTrek();
50    aSupPath.SetName (myPath.TrekValue (myPath.TrekLength())); // incredible, but required!
51    OSD_Directory aSupDir (aSupPath);
52    aSupDir.Build (Protect);
53    if (aSupDir.Failed())
54    {
55      myError = aSupDir.myError;
56      return;
57    }
58    status = mkdir (aBuffer.ToCString(), (mode_t)internal_prot);
59  }
60  if (status == -1 && errno != EEXIST) {
61    Standard_Character err_message[2048];
62    Sprintf (err_message, "OSD_Directory::Build Directory \"%.2000s\"",
63             aBuffer.ToCString());
64    myError.SetValue (errno, Iam, err_message);
65  }
66 }
67
68 OSD_Directory OSD_Directory::BuildTemporary(){
69 OSD_Directory           aDirectoryToReturn;
70 char                    name[] = "/tmp/CSFXXXXXX";
71
72  // Create a temporary directory with 0700 permissions.
73  if (NULL == mkdtemp( name ))
74    return aDirectoryToReturn; // Can't create a directory
75   
76  unlink(name);//Destroys link but directory still exists while
77               //current process lives.
78
79  TCollection_AsciiString aString (name);
80  aDirectoryToReturn.SetPath ( aString );
81  return aDirectoryToReturn;
82
83 }
84
85 #else
86
87 //------------------------------------------------------------------------
88 //-------------------  WNT Sources of OSD_Diretory -----------------------
89 //------------------------------------------------------------------------
90
91 #include <OSD_Directory.hxx>
92 #include <OSD_Protection.hxx>
93 #include <Standard_ProgramError.hxx>
94 #include <TCollection_ExtendedString.hxx>
95 #include <NCollection_String.hxx>
96
97 #include <OSD_WNT_1.hxx>
98
99 #include <stdio.h>
100
101 #ifndef _INC_TCHAR
102 # include <tchar.h>
103 #endif  // _INC_TCHAR
104
105 #ifdef _UNICODE
106 # define tctmpnam _wtmpnam
107 #else
108 # define tctmpnam tmpnam
109 #endif  // _UNICODE
110
111 void _osd_wnt_set_error ( OSD_Error&, OSD_WhoAmI, ... );
112
113 OSD_Directory :: OSD_Directory () {
114
115 }  // end constructor ( 1 )
116
117 OSD_Directory :: OSD_Directory ( const OSD_Path& Name ) :
118                  OSD_FileNode ( Name ) {
119
120 }  // end constructor ( 2 )
121
122 void OSD_Directory :: Build (const OSD_Protection& Protect) {
123
124  TCollection_AsciiString dirName;
125
126  myPath.SystemName ( dirName );
127
128  if (  dirName.IsEmpty ()  )
129
130   throw Standard_ProgramError ( "OSD_Directory :: Build (): incorrect call - no directory name");
131
132   Standard_Boolean isOK = Exists();
133   if (! isOK)
134   {
135     // myError will be set to fail by Exists() if intermediate dirs do not exist
136     myError.Reset();
137
138     // create directory if it does not exist;
139     TCollection_ExtendedString dirNameW(dirName);
140     if (CreateDirectoryW (dirNameW.ToWideString(), NULL))
141     {
142       isOK = Standard_True;
143     }
144     // if failed due to absence of intermediate directories, create them recursively
145     else if (GetLastError() == ERROR_PATH_NOT_FOUND)
146     {
147       OSD_Path aSupPath = myPath;
148       aSupPath.UpTrek();
149       aSupPath.SetName (myPath.TrekValue (myPath.TrekLength())); // incredible, but required!
150       OSD_Directory aSupDir (aSupPath);
151       aSupDir.Build (Protect);
152       if (aSupDir.Failed())
153       {
154         myError = aSupDir.myError;
155         return;
156       }
157       isOK = (CreateDirectoryW (dirNameW.ToWideString(), NULL) != 0);
158     }
159   }
160
161   if (isOK)
162   {
163 #ifndef OCCT_UWP
164     SetProtection(Protect);
165 #else
166     (void)Protect;
167 #endif
168   }
169   else
170   {
171     _osd_wnt_set_error ( myError, OSD_WDirectory );
172   }
173 }  // end OSD_Directory :: Build
174
175 OSD_Directory OSD_Directory :: BuildTemporary () {
176
177  OSD_Directory           retVal;
178  OSD_Protection          prt;
179
180  wchar_t* aName = _wtmpnam(NULL);
181  OSD_Path dirPath (TCollection_AsciiString (aName != NULL ? aName : L""));
182
183  retVal.SetPath ( dirPath );
184  retVal.Build ( prt );                            
185
186  return retVal;
187
188 }  // end OSD_Directory :: BuildTemporary
189
190 #endif