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