ed5c03c9de46fb619a86735621d20ae0e058cae9
[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
18 #include <OSD_Directory.hxx>
19 #include <OSD_Path.hxx>
20 #include <OSD_Protection.hxx>
21 #include <OSD_WhoAmI.hxx>
22
23 #include <errno.h>
24 #include <stdio.h>
25 #include <sys/stat.h>
26 #include <unistd.h>
27 const OSD_WhoAmI Iam = OSD_WDirectory;
28
29
30 OSD_Directory::OSD_Directory():OSD_FileNode() {
31 }
32
33 OSD_Directory::OSD_Directory(const OSD_Path& Name):OSD_FileNode(Name){
34 }
35
36 // Create physically a directory
37
38 void OSD_Directory::Build(const OSD_Protection& Protect){
39 int status;
40 Standard_Integer internal_prot;
41 TCollection_AsciiString aBuffer;
42
43  internal_prot = Protect.Internal();
44  myPath.SystemName(aBuffer);
45  umask ( 0 );
46  status = mkdir (aBuffer.ToCString(), (mode_t)internal_prot);
47  if (status == -1) 
48   if (errno != EEXIST) {
49    Standard_PCharacter err_message;
50
51    err_message = new Standard_Character [255];
52    sprintf (err_message,
53             "OSD_Directory::Build Directory \"%s\"",
54             aBuffer.ToCString());
55    
56    myError.SetValue(errno, Iam, err_message);
57    delete err_message;
58   }
59 }
60
61 OSD_Directory OSD_Directory::BuildTemporary(){
62 OSD_Protection          Protect;
63 OSD_Directory           aDirectoryToReturn;
64 Standard_Integer        internal_prot;
65 Standard_CString        name = tmpnam(NULL);
66 TCollection_AsciiString aString (name);
67
68  internal_prot = Protect.Internal();
69
70  umask ( 0 );
71  mkdir (name, (mode_t)internal_prot);
72  unlink(name);//Destroys link but directory still exists while 
73               //current process lives.
74
75  aDirectoryToReturn.SetPath ( aString );
76  return aDirectoryToReturn;
77
78 }
79
80 #else
81
82 //------------------------------------------------------------------------
83 //-------------------  WNT Sources of OSD_Diretory -----------------------
84 //------------------------------------------------------------------------
85
86 #include <OSD_Directory.hxx>
87 #include <OSD_Protection.hxx>
88 #include <Standard_ProgramError.hxx>
89 #include <TCollection_ExtendedString.hxx>
90
91 #include <OSD_WNT_1.hxx>
92
93 #include <stdio.h>
94
95 #ifndef _INC_TCHAR
96 # include <tchar.h>
97 #endif  // _INC_TCHAR
98
99 #ifdef _UNICODE
100 # define tctmpnam _wtmpnam
101 #else
102 # define tctmpnam tmpnam
103 #endif  // _UNICODE
104
105 void _osd_wnt_set_error ( OSD_Error&, OSD_WhoAmI, ... );
106
107 OSD_Directory :: OSD_Directory () {
108
109 }  // end constructor ( 1 )
110
111 OSD_Directory :: OSD_Directory ( const OSD_Path& Name ) :
112                  OSD_FileNode ( Name ) {
113
114 }  // end constructor ( 2 )
115
116 void OSD_Directory :: Build (const OSD_Protection& Protect ) {
117
118  TCollection_AsciiString dirName;
119
120  myPath.SystemName ( dirName );
121
122  if (  dirName.IsEmpty ()  )
123
124   Standard_ProgramError :: Raise (
125                             TEXT( "OSD_Directory :: Build (): incorrect call - no directory name" )
126                            );
127  TCollection_ExtendedString dirNameW(dirName);
128  if (  Exists () || CreateDirectoryW ( (const wchar_t*) dirNameW.ToExtString (), NULL )  )
129
130   SetProtection ( Protect );
131
132  else
133
134   _osd_wnt_set_error ( myError, OSD_WDirectory );
135
136 }  // end OSD_Directory :: Build
137
138 OSD_Directory OSD_Directory :: BuildTemporary () {
139
140  OSD_Directory           retVal;
141  OSD_Protection          prt;
142  OSD_Path                dirPath (  tctmpnam ( NULL )  );
143
144  retVal.SetPath ( dirPath );
145  retVal.Build ( prt );                            
146
147  return retVal;
148
149 }  // end OSD_Directory :: BuildTemporary
150
151 #endif