1 // Copyright (c) 1999-2014 OPEN CASCADE SAS
3 // This file is part of Open CASCADE Technology software library.
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.
11 // Alternatively, this file may be used under the terms of Open CASCADE
12 // commercial license or contractual agreement.
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>
28 IMPLEMENT_STANDARD_RTTIEXT(CDF_FWOSDriver,CDF_MetaDataDriver)
35 //==============================================================================
38 //==============================================================================
39 static void PutSlash (TCollection_ExtendedString& anXSTRING) {
47 //==============================================================================
48 //function : CDF_FWOSDriver
50 //==============================================================================
51 CDF_FWOSDriver::CDF_FWOSDriver() {}
53 //==============================================================================
56 //==============================================================================
57 Standard_Boolean CDF_FWOSDriver::Find(const TCollection_ExtendedString& aFolder,
58 const TCollection_ExtendedString& aName,
59 const TCollection_ExtendedString& /*aVersion*/)
62 OSD_Path thePath=UTL::Path(aFolder);
63 OSD_Directory theDirectory(thePath);
64 if(theDirectory.Exists()) {
65 TCollection_ExtendedString f(aFolder);
68 OSD_Path p2 = UTL::Path(f);
70 return theFile.Exists();
72 return Standard_False;
75 //==============================================================================
76 //function : HasReadPermission
78 //==============================================================================
79 Standard_Boolean CDF_FWOSDriver::HasReadPermission(const TCollection_ExtendedString& aFolder,
80 const TCollection_ExtendedString& aName,
81 const TCollection_ExtendedString& /*aVersion*/)
83 OSD_SingleProtection theProtection=OSD_File(UTL::Path(Concatenate(aFolder,aName))).Protection().User();
84 switch (theProtection) {
97 return Standard_False;
101 //==============================================================================
102 //function : MetaData
104 //==============================================================================
105 Handle(CDM_MetaData) CDF_FWOSDriver::MetaData(const TCollection_ExtendedString& aFolder,
106 const TCollection_ExtendedString& aName,
107 const TCollection_ExtendedString& /*aVersion*/)
109 TCollection_ExtendedString p = Concatenate(aFolder,aName);
110 return CDM_MetaData::LookUp(aFolder,aName,p,p,UTL::IsReadOnly(p));
113 //==============================================================================
114 //function : CreateMetaData
116 //==============================================================================
117 Handle(CDM_MetaData) CDF_FWOSDriver::CreateMetaData(const Handle(CDM_Document)& aDocument,
118 const TCollection_ExtendedString& aFileName)
120 return CDM_MetaData::LookUp(aDocument->RequestedFolder(),aDocument->RequestedName(),
121 Concatenate(aDocument->RequestedFolder(),aDocument->RequestedName()),
122 aFileName,UTL::IsReadOnly(aFileName));
125 //==============================================================================
126 //function : BuildFileName
128 //==============================================================================
129 TCollection_ExtendedString CDF_FWOSDriver::BuildFileName(const Handle(CDM_Document)& aDocument)
132 TCollection_ExtendedString retstr = TCollection_ExtendedString(aDocument->RequestedFolder());
134 retstr += aDocument->RequestedName();
138 //==============================================================================
139 //function : FindFolder
141 //==============================================================================
142 Standard_Boolean CDF_FWOSDriver::FindFolder(const TCollection_ExtendedString& aFolder)
145 OSD_Path thePath=UTL::Path(aFolder);
146 OSD_Directory theDirectory(thePath);
147 return theDirectory.Exists();
150 //==============================================================================
151 //function : Concatenate
153 //==============================================================================
154 TCollection_ExtendedString CDF_FWOSDriver::Concatenate(const TCollection_ExtendedString& aFolder,
155 const TCollection_ExtendedString& aName)
157 TCollection_ExtendedString ff(aFolder);
165 //==============================================================================
166 //function : DefaultFolder
168 //==============================================================================
169 TCollection_ExtendedString CDF_FWOSDriver::DefaultFolder()
171 TCollection_ExtendedString theDefaultFolder;
172 if (theDefaultFolder.Length() == 0) {
175 TCollection_ExtendedString hd=UTL::xgetenv("HOMEDRIVE");
176 if(hd.Length() != NULL) {
178 theDefaultFolder+=UTL::xgetenv("HOMEPATH");
181 theDefaultFolder=UTL::xgetenv("TEMP");
182 if(theDefaultFolder.Length()==0)
183 Standard_Failure::Raise("cannot determine default folder; HOMEDRIVE and TEMP are undefined");
186 TCollection_ExtendedString home=UTL::xgetenv("HOME");
187 if(home.Length() !=0)
188 theDefaultFolder = home;
190 theDefaultFolder= TCollection_ExtendedString("/tmp");
193 return theDefaultFolder;
196 //==============================================================================
197 //function : BuildMetaData
199 //==============================================================================
200 Handle(CDM_MetaData) CDF_FWOSDriver::BuildMetaData(const TCollection_ExtendedString& aFileName)
203 OSD_Path p = UTL::Path(aFileName);
205 TCollection_ExtendedString f = UTL::Trek(p);
206 TCollection_ExtendedString n = UTL::Name(p);
208 n += UTL::Extension(p);
210 return CDM_MetaData::LookUp(f,n,aFileName,aFileName,UTL::IsReadOnly(aFileName));
213 //==============================================================================
216 //==============================================================================
217 TCollection_ExtendedString CDF_FWOSDriver::SetName(const Handle(CDM_Document)& aDocument,
218 const TCollection_ExtendedString& aName)
221 TCollection_ExtendedString xn(aName), n(aName);
224 //windows is not case sensitive
225 //make the extension lower case
226 for(int i = 1; i <= xn.Length(); i++)
228 Standard_ExtCharacter echar = xn.Value(i);
229 echar = towlower(echar);
230 xn.SetValue(i, echar);
234 TCollection_ExtendedString e (aDocument->FileExtension());
235 TCollection_ExtendedString xe(e);
236 if (e.Length() > 0) {
238 //windows is not case sensitive
239 //make the extension lower case
240 for(int i = 1; i <= xe.Length(); i++)
242 Standard_ExtCharacter echar = xe.Value(i);
243 echar = towlower(echar);
244 xe.SetValue(i, echar);
249 Standard_Integer ln = xn.Length();
250 Standard_Integer le = xe.Length();
251 Standard_Boolean ExtensionIsAlreadyThere = Standard_False;
253 Standard_Integer ind=xn.SearchFromEnd(xe);
254 ExtensionIsAlreadyThere = ind+le-1==ln;
256 if(!ExtensionIsAlreadyThere) n+=e;