0025114: CMake-based build tools for OCCT 7.0
[occt.git] / src / CDF / CDF_FWOSDriver.cxx
1 // Copyright (c) 1999-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
15 #include <CDF_FWOSDriver.hxx>
16 #include <CDM_Document.hxx>
17 #include <CDM_MetaData.hxx>
18 #include <OSD_Directory.hxx>
19 #include <OSD_File.hxx>
20 #include <OSD_FileNode.hxx>
21 #include <OSD_Path.hxx>
22 #include <OSD_Protection.hxx>
23 #include <OSD_SingleProtection.hxx>
24 #include <Standard_Type.hxx>
25 #include <TCollection_ExtendedString.hxx>
26 #include <UTL.hxx>
27
28 #ifdef WNT
29 #include <tchar.h>
30 #endif  // WNT
31
32
33 //==============================================================================
34 //function : PutSlash
35 //purpose  :
36 //==============================================================================
37 static void PutSlash (TCollection_ExtendedString& anXSTRING) {
38 #ifdef WNT
39   anXSTRING+="\\";
40 #else
41   anXSTRING+="/";
42 #endif  // WNT
43 }
44
45 //==============================================================================
46 //function : CDF_FWOSDriver
47 //purpose  :
48 //==============================================================================
49 CDF_FWOSDriver::CDF_FWOSDriver() {}
50
51 //==============================================================================
52 //function : Find
53 //purpose  :
54 //==============================================================================
55 Standard_Boolean CDF_FWOSDriver::Find(const TCollection_ExtendedString& aFolder,
56                                          const TCollection_ExtendedString& aName,
57                                          const TCollection_ExtendedString& /*aVersion*/)
58 {
59
60   OSD_Path thePath=UTL::Path(aFolder);
61   OSD_Directory theDirectory(thePath);
62   if(theDirectory.Exists()) {
63     TCollection_ExtendedString f(aFolder);
64     PutSlash(f);
65     f+=aName;
66     OSD_Path p2 = UTL::Path(f);
67     OSD_File theFile(p2);
68     return theFile.Exists();
69   }
70   return Standard_False;
71 }
72
73 //==============================================================================
74 //function : HasReadPermission
75 //purpose  :
76 //==============================================================================
77 Standard_Boolean CDF_FWOSDriver::HasReadPermission(const TCollection_ExtendedString& aFolder,
78                                                       const TCollection_ExtendedString& aName,
79                                                       const TCollection_ExtendedString& /*aVersion*/)
80 {
81   OSD_SingleProtection theProtection=OSD_File(UTL::Path(Concatenate(aFolder,aName))).Protection().User();
82   switch (theProtection) {
83     case OSD_None:
84     case OSD_R:
85     case OSD_RW:
86     case OSD_RX:
87     case OSD_WX:
88     case OSD_RWX:
89     case OSD_RD:
90     case OSD_RWD:
91     case OSD_RXD:
92     case OSD_RWXD:
93       return Standard_True;
94     default:
95       return Standard_False;
96     }
97 }
98
99 //==============================================================================
100 //function : MetaData
101 //purpose  :
102 //==============================================================================
103 Handle(CDM_MetaData) CDF_FWOSDriver::MetaData(const TCollection_ExtendedString& aFolder,
104                                                  const TCollection_ExtendedString& aName,
105                                                  const TCollection_ExtendedString& /*aVersion*/)
106 {
107   TCollection_ExtendedString p = Concatenate(aFolder,aName);
108   return CDM_MetaData::LookUp(aFolder,aName,p,p,UTL::IsReadOnly(p));
109 }
110
111 //==============================================================================
112 //function : CreateMetaData
113 //purpose  :
114 //==============================================================================
115 Handle(CDM_MetaData) CDF_FWOSDriver::CreateMetaData(const Handle(CDM_Document)& aDocument,
116                                                        const TCollection_ExtendedString& aFileName)
117 {
118   return CDM_MetaData::LookUp(aDocument->RequestedFolder(),aDocument->RequestedName(),
119                               Concatenate(aDocument->RequestedFolder(),aDocument->RequestedName()),
120                               aFileName,UTL::IsReadOnly(aFileName));
121 }
122
123 //==============================================================================
124 //function : BuildFileName
125 //purpose  :
126 //==============================================================================
127 TCollection_ExtendedString CDF_FWOSDriver::BuildFileName(const Handle(CDM_Document)& aDocument)
128 {
129
130   TCollection_ExtendedString retstr = TCollection_ExtendedString(aDocument->RequestedFolder());
131   PutSlash(retstr);
132   retstr += aDocument->RequestedName();
133   return retstr;
134 }
135
136 //==============================================================================
137 //function : FindFolder
138 //purpose  :
139 //==============================================================================
140 Standard_Boolean CDF_FWOSDriver::FindFolder(const TCollection_ExtendedString& aFolder)
141 {
142   
143   OSD_Path thePath=UTL::Path(aFolder);
144   OSD_Directory theDirectory(thePath);
145   return theDirectory.Exists();
146 }
147
148 //==============================================================================
149 //function : Concatenate
150 //purpose  :
151 //==============================================================================
152 TCollection_ExtendedString CDF_FWOSDriver::Concatenate(const TCollection_ExtendedString& aFolder,
153                                                           const TCollection_ExtendedString& aName)
154 {
155   TCollection_ExtendedString ff(aFolder);
156   ff = "";
157   ff += aFolder;
158   PutSlash(ff);
159   ff+=aName;
160   return ff;
161 }
162
163 //==============================================================================
164 //function : DefaultFolder
165 //purpose  :
166 //==============================================================================
167 TCollection_ExtendedString CDF_FWOSDriver::DefaultFolder()
168 {
169   TCollection_ExtendedString theDefaultFolder;
170   if (theDefaultFolder.Length() == 0) {
171     
172 #ifdef WNT
173     TCollection_ExtendedString hd=UTL::xgetenv("HOMEDRIVE");
174     if(hd.Length() != NULL) {
175       theDefaultFolder=hd;
176       theDefaultFolder+=UTL::xgetenv("HOMEPATH");
177     }
178     else {
179       theDefaultFolder=UTL::xgetenv("TEMP");
180       if(theDefaultFolder.Length()==0)
181         Standard_Failure::Raise("cannot determine default folder; HOMEDRIVE and TEMP are undefined");
182     }
183 #else
184     TCollection_ExtendedString home=UTL::xgetenv("HOME");
185     if(home.Length() !=0)
186       theDefaultFolder =  home;
187     else
188       theDefaultFolder= TCollection_ExtendedString("/tmp");
189 #endif
190   }
191   return theDefaultFolder;
192 }
193
194 //==============================================================================
195 //function : BuildMetaData
196 //purpose  :
197 //==============================================================================
198 Handle(CDM_MetaData) CDF_FWOSDriver::BuildMetaData(const TCollection_ExtendedString& aFileName)
199 {
200
201   OSD_Path p = UTL::Path(aFileName);
202   
203   TCollection_ExtendedString f = UTL::Trek(p);
204   TCollection_ExtendedString n = UTL::Name(p);
205   n +=".";
206   n += UTL::Extension(p);
207
208   return CDM_MetaData::LookUp(f,n,aFileName,aFileName,UTL::IsReadOnly(aFileName));
209 }
210
211 //==============================================================================
212 //function : SetName
213 //purpose  :
214 //==============================================================================
215 TCollection_ExtendedString CDF_FWOSDriver::SetName(const Handle(CDM_Document)& aDocument,
216                                                       const TCollection_ExtendedString& aName)
217 {
218   
219   TCollection_ExtendedString xn(aName), n(aName);
220
221 #ifdef WNT
222   //windows is not case sensitive
223   Standard_ExtCharacter   echar;
224   //make the extension lower case
225   for(int i = 1; i <= xn.Length(); i++)
226   {
227         echar = xn.Value(i);
228         echar = towlower(echar);
229         xn.SetValue(i, echar);
230   }
231 #endif
232   
233   TCollection_ExtendedString e (aDocument->FileExtension());
234   TCollection_ExtendedString xe(e);
235   if (e.Length() > 0) {
236 #ifdef WNT
237     //windows is not case sensitive
238     Standard_ExtCharacter   echar;
239     //make the extension lower case
240     for(int i = 1; i <= xe.Length(); i++)
241     {
242           echar = xe.Value(i);
243           echar = towlower(echar);
244           xe.SetValue(i, echar);
245     }
246 #endif
247     xe.Insert(1, '.');
248     e.Insert(1, '.');
249     Standard_Integer ln = xn.Length();
250     Standard_Integer le = xe.Length();
251     Standard_Boolean ExtensionIsAlreadyThere = Standard_False;
252     if(ln>=le) {
253       Standard_Integer ind=xn.SearchFromEnd(xe);
254       ExtensionIsAlreadyThere = ind+le-1==ln;
255     }
256     if(!ExtensionIsAlreadyThere) n+=e;
257   }
258   return n;
259 }