0027838: Foundation Classes - support wchar_t* input within TCollection_AsciiString...
[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) 
47   if (errno != EEXIST) {
48    Standard_PCharacter err_message;
49
50    err_message = new Standard_Character [255];
51    sprintf (err_message,
52             "OSD_Directory::Build Directory \"%s\"",
53             aBuffer.ToCString());
54    
55    myError.SetValue(errno, Iam, err_message);
56    delete err_message;
57   }
58 }
59
60 OSD_Directory OSD_Directory::BuildTemporary(){
61 OSD_Directory           aDirectoryToReturn;
62 char                    name[] = "/tmp/CSFXXXXXX";
63
64  // Create a temporary directory with 0700 permissions.
65  if (NULL == mkdtemp( name ))
66    return aDirectoryToReturn; // Can't create a directory
67   
68  unlink(name);//Destroys link but directory still exists while
69               //current process lives.
70
71  TCollection_AsciiString aString (name);
72  aDirectoryToReturn.SetPath ( aString );
73  return aDirectoryToReturn;
74
75 }
76
77 #else
78
79 //------------------------------------------------------------------------
80 //-------------------  WNT Sources of OSD_Diretory -----------------------
81 //------------------------------------------------------------------------
82
83 #include <OSD_Directory.hxx>
84 #include <OSD_Protection.hxx>
85 #include <Standard_ProgramError.hxx>
86 #include <TCollection_ExtendedString.hxx>
87 #include <NCollection_String.hxx>
88
89 #include <OSD_WNT_1.hxx>
90
91 #include <stdio.h>
92
93 #ifndef _INC_TCHAR
94 # include <tchar.h>
95 #endif  // _INC_TCHAR
96
97 #ifdef _UNICODE
98 # define tctmpnam _wtmpnam
99 #else
100 # define tctmpnam tmpnam
101 #endif  // _UNICODE
102
103 void _osd_wnt_set_error ( OSD_Error&, OSD_WhoAmI, ... );
104
105 OSD_Directory :: OSD_Directory () {
106
107 }  // end constructor ( 1 )
108
109 OSD_Directory :: OSD_Directory ( const OSD_Path& Name ) :
110                  OSD_FileNode ( Name ) {
111
112 }  // end constructor ( 2 )
113
114 void OSD_Directory :: Build (const OSD_Protection& Protect) {
115
116  TCollection_AsciiString dirName;
117
118  myPath.SystemName ( dirName );
119
120  if (  dirName.IsEmpty ()  )
121
122   Standard_ProgramError :: Raise ( "OSD_Directory :: Build (): incorrect call - no directory name");
123  TCollection_ExtendedString dirNameW(dirName);
124  if (Exists() || CreateDirectoryW (dirNameW.ToWideString(), NULL))
125  {
126 #ifndef OCCT_UWP
127    SetProtection(Protect);
128 #else
129    (void)Protect;
130 #endif
131  } else
132
133   _osd_wnt_set_error ( myError, OSD_WDirectory );
134
135 }  // end OSD_Directory :: Build
136
137 OSD_Directory OSD_Directory :: BuildTemporary () {
138
139  OSD_Directory           retVal;
140  OSD_Protection          prt;
141
142  wchar_t* aName = _wtmpnam(NULL);
143  OSD_Path dirPath (TCollection_AsciiString (aName != NULL ? aName : L""));
144
145  retVal.SetPath ( dirPath );
146  retVal.Build ( prt );                            
147
148  return retVal;
149
150 }  // end OSD_Directory :: BuildTemporary
151
152 #endif