1*8a106958SDamjan Jovanovic /**************************************************************
2*8a106958SDamjan Jovanovic *
3*8a106958SDamjan Jovanovic * Licensed to the Apache Software Foundation (ASF) under one
4*8a106958SDamjan Jovanovic * or more contributor license agreements. See the NOTICE file
5*8a106958SDamjan Jovanovic * distributed with this work for additional information
6*8a106958SDamjan Jovanovic * regarding copyright ownership. The ASF licenses this file
7*8a106958SDamjan Jovanovic * to you under the Apache License, Version 2.0 (the
8*8a106958SDamjan Jovanovic * "License"); you may not use this file except in compliance
9*8a106958SDamjan Jovanovic * with the License. You may obtain a copy of the License at
10*8a106958SDamjan Jovanovic *
11*8a106958SDamjan Jovanovic * http://www.apache.org/licenses/LICENSE-2.0
12*8a106958SDamjan Jovanovic *
13*8a106958SDamjan Jovanovic * Unless required by applicable law or agreed to in writing,
14*8a106958SDamjan Jovanovic * software distributed under the License is distributed on an
15*8a106958SDamjan Jovanovic * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*8a106958SDamjan Jovanovic * KIND, either express or implied. See the License for the
17*8a106958SDamjan Jovanovic * specific language governing permissions and limitations
18*8a106958SDamjan Jovanovic * under the License.
19*8a106958SDamjan Jovanovic *
20*8a106958SDamjan Jovanovic *************************************************************/
21*8a106958SDamjan Jovanovic
22*8a106958SDamjan Jovanovic
23*8a106958SDamjan Jovanovic
24*8a106958SDamjan Jovanovic #include <precomp.h>
25*8a106958SDamjan Jovanovic #include <cosv/ploc_dir.hxx>
26*8a106958SDamjan Jovanovic
27*8a106958SDamjan Jovanovic // NOT FULLY DECLARED SERVICES
28*8a106958SDamjan Jovanovic #include <cosv/ploc.hxx>
29*8a106958SDamjan Jovanovic
30*8a106958SDamjan Jovanovic
31*8a106958SDamjan Jovanovic namespace csv
32*8a106958SDamjan Jovanovic {
33*8a106958SDamjan Jovanovic namespace ploc
34*8a106958SDamjan Jovanovic {
35*8a106958SDamjan Jovanovic
Directory()36*8a106958SDamjan Jovanovic Directory::Directory()
37*8a106958SDamjan Jovanovic {
38*8a106958SDamjan Jovanovic }
39*8a106958SDamjan Jovanovic
Directory(const Path & i_rPath)40*8a106958SDamjan Jovanovic Directory::Directory( const Path & i_rPath )
41*8a106958SDamjan Jovanovic : aPath(i_rPath)
42*8a106958SDamjan Jovanovic // sPath
43*8a106958SDamjan Jovanovic {
44*8a106958SDamjan Jovanovic }
45*8a106958SDamjan Jovanovic
Directory(const Directory & i_rDir)46*8a106958SDamjan Jovanovic Directory::Directory( const Directory & i_rDir )
47*8a106958SDamjan Jovanovic : Persistent(), aPath(i_rDir.aPath)
48*8a106958SDamjan Jovanovic // sPath
49*8a106958SDamjan Jovanovic {
50*8a106958SDamjan Jovanovic }
51*8a106958SDamjan Jovanovic
Directory(const char * i_rLocation)52*8a106958SDamjan Jovanovic Directory::Directory( const char * i_rLocation )
53*8a106958SDamjan Jovanovic : aPath(i_rLocation, true)
54*8a106958SDamjan Jovanovic {
55*8a106958SDamjan Jovanovic }
56*8a106958SDamjan Jovanovic
Directory(const String & i_rLocation)57*8a106958SDamjan Jovanovic Directory::Directory( const String & i_rLocation )
58*8a106958SDamjan Jovanovic : aPath(i_rLocation.c_str(), true)
59*8a106958SDamjan Jovanovic {
60*8a106958SDamjan Jovanovic }
61*8a106958SDamjan Jovanovic
~Directory()62*8a106958SDamjan Jovanovic Directory::~Directory()
63*8a106958SDamjan Jovanovic {
64*8a106958SDamjan Jovanovic }
65*8a106958SDamjan Jovanovic
66*8a106958SDamjan Jovanovic Directory &
operator +=(const String & i_sName)67*8a106958SDamjan Jovanovic Directory::operator+=( const String & i_sName )
68*8a106958SDamjan Jovanovic {
69*8a106958SDamjan Jovanovic InvalidatePath();
70*8a106958SDamjan Jovanovic aPath.DirChain() += i_sName;
71*8a106958SDamjan Jovanovic return *this;
72*8a106958SDamjan Jovanovic }
73*8a106958SDamjan Jovanovic
74*8a106958SDamjan Jovanovic Directory &
operator +=(const DirectoryChain & i_sDirChain)75*8a106958SDamjan Jovanovic Directory::operator+=( const DirectoryChain & i_sDirChain )
76*8a106958SDamjan Jovanovic {
77*8a106958SDamjan Jovanovic InvalidatePath();
78*8a106958SDamjan Jovanovic aPath.DirChain() += i_sDirChain;
79*8a106958SDamjan Jovanovic return *this;
80*8a106958SDamjan Jovanovic }
81*8a106958SDamjan Jovanovic
82*8a106958SDamjan Jovanovic Directory &
operator -=(uintt i_nLevels)83*8a106958SDamjan Jovanovic Directory::operator-=( uintt i_nLevels )
84*8a106958SDamjan Jovanovic {
85*8a106958SDamjan Jovanovic InvalidatePath();
86*8a106958SDamjan Jovanovic aPath.DirChain().PopBack(i_nLevels);
87*8a106958SDamjan Jovanovic return *this;
88*8a106958SDamjan Jovanovic }
89*8a106958SDamjan Jovanovic
90*8a106958SDamjan Jovanovic bool
PhysicalCreate(bool i_bCreateParentsIfNecessary) const91*8a106958SDamjan Jovanovic Directory::PhysicalCreate( bool i_bCreateParentsIfNecessary ) const
92*8a106958SDamjan Jovanovic {
93*8a106958SDamjan Jovanovic bool ret = PhysicalCreate_Dir( StrPath() );
94*8a106958SDamjan Jovanovic if ( ret OR NOT i_bCreateParentsIfNecessary )
95*8a106958SDamjan Jovanovic return ret;
96*8a106958SDamjan Jovanovic
97*8a106958SDamjan Jovanovic ret = Check_Parent();
98*8a106958SDamjan Jovanovic if (ret)
99*8a106958SDamjan Jovanovic ret = PhysicalCreate_Dir( StrPath() );
100*8a106958SDamjan Jovanovic return ret;
101*8a106958SDamjan Jovanovic }
102*8a106958SDamjan Jovanovic
103*8a106958SDamjan Jovanovic bool
Check_Parent() const104*8a106958SDamjan Jovanovic Directory::Check_Parent() const
105*8a106958SDamjan Jovanovic {
106*8a106958SDamjan Jovanovic // There is no parent of root directories:
107*8a106958SDamjan Jovanovic if ( aPath.DirChain().Size() == 0 )
108*8a106958SDamjan Jovanovic return false;
109*8a106958SDamjan Jovanovic
110*8a106958SDamjan Jovanovic // Become my own parent:
111*8a106958SDamjan Jovanovic String sLastToken = aPath.DirChain().Back();
112*8a106958SDamjan Jovanovic const_cast< Directory* >(this)->operator-=(1);
113*8a106958SDamjan Jovanovic
114*8a106958SDamjan Jovanovic // Begin behaving as parent:
115*8a106958SDamjan Jovanovic bool ret = Exists();
116*8a106958SDamjan Jovanovic if (NOT ret)
117*8a106958SDamjan Jovanovic {
118*8a106958SDamjan Jovanovic ret = Check_Parent();
119*8a106958SDamjan Jovanovic if (ret)
120*8a106958SDamjan Jovanovic ret = PhysicalCreate_Dir( StrPath() );
121*8a106958SDamjan Jovanovic }
122*8a106958SDamjan Jovanovic // End behaving as parent.
123*8a106958SDamjan Jovanovic
124*8a106958SDamjan Jovanovic // Become myself again:
125*8a106958SDamjan Jovanovic const_cast< Directory* >(this)->operator+=(sLastToken);
126*8a106958SDamjan Jovanovic return ret;
127*8a106958SDamjan Jovanovic }
128*8a106958SDamjan Jovanovic
129*8a106958SDamjan Jovanovic } // namespace ploc
130*8a106958SDamjan Jovanovic } // namespace csv
131*8a106958SDamjan Jovanovic
132*8a106958SDamjan Jovanovic
133*8a106958SDamjan Jovanovic #ifdef WNT
134*8a106958SDamjan Jovanovic #include <direct.h>
135*8a106958SDamjan Jovanovic #include <io.h>
136*8a106958SDamjan Jovanovic
137*8a106958SDamjan Jovanovic namespace csv
138*8a106958SDamjan Jovanovic {
139*8a106958SDamjan Jovanovic namespace ploc
140*8a106958SDamjan Jovanovic {
141*8a106958SDamjan Jovanovic
142*8a106958SDamjan Jovanovic bool
PhysicalCreate_Dir(const char * i_sStr) const143*8a106958SDamjan Jovanovic Directory::PhysicalCreate_Dir( const char * i_sStr ) const
144*8a106958SDamjan Jovanovic {
145*8a106958SDamjan Jovanovic return mkdir( i_sStr ) == 0;
146*8a106958SDamjan Jovanovic }
147*8a106958SDamjan Jovanovic
148*8a106958SDamjan Jovanovic void
GetContainedDirectories(StringVector & o_rResult) const149*8a106958SDamjan Jovanovic Directory::GetContainedDirectories( StringVector & o_rResult ) const
150*8a106958SDamjan Jovanovic {
151*8a106958SDamjan Jovanovic const char * c_sANYDIR = "\\*.*";
152*8a106958SDamjan Jovanovic String sNew;
153*8a106958SDamjan Jovanovic
154*8a106958SDamjan Jovanovic StreamStr sFilter(200);
155*8a106958SDamjan Jovanovic sFilter << StrPath()
156*8a106958SDamjan Jovanovic << c_sANYDIR;
157*8a106958SDamjan Jovanovic
158*8a106958SDamjan Jovanovic struct _finddata_t
159*8a106958SDamjan Jovanovic aEntry;
160*8a106958SDamjan Jovanovic long hFile = _findfirst( sFilter.c_str(), &aEntry );
161*8a106958SDamjan Jovanovic
162*8a106958SDamjan Jovanovic for ( int bFindMore = (hFile == -1 ? 1 : 0);
163*8a106958SDamjan Jovanovic bFindMore == 0;
164*8a106958SDamjan Jovanovic bFindMore = _findnext( hFile, &aEntry ) )
165*8a106958SDamjan Jovanovic {
166*8a106958SDamjan Jovanovic if ( (aEntry.attrib & _A_SUBDIR) AND *aEntry.name != '.' )
167*8a106958SDamjan Jovanovic {
168*8a106958SDamjan Jovanovic sNew = aEntry.name;
169*8a106958SDamjan Jovanovic o_rResult.push_back( sNew );
170*8a106958SDamjan Jovanovic }
171*8a106958SDamjan Jovanovic } // end for
172*8a106958SDamjan Jovanovic _findclose(hFile);
173*8a106958SDamjan Jovanovic }
174*8a106958SDamjan Jovanovic
175*8a106958SDamjan Jovanovic void
GetContainedFiles(StringVector & o_rResult,const char * i_sFilter,E_Recursivity i_eRecursivity) const176*8a106958SDamjan Jovanovic Directory::GetContainedFiles( StringVector & o_rResult,
177*8a106958SDamjan Jovanovic const char * i_sFilter,
178*8a106958SDamjan Jovanovic E_Recursivity i_eRecursivity ) const
179*8a106958SDamjan Jovanovic {
180*8a106958SDamjan Jovanovic StreamStr sNew(240);
181*8a106958SDamjan Jovanovic sNew << aPath;
182*8a106958SDamjan Jovanovic StreamStr::size_type
183*8a106958SDamjan Jovanovic nStartFilename = sNew.tellp();
184*8a106958SDamjan Jovanovic
185*8a106958SDamjan Jovanovic StreamStr sFilter(200);
186*8a106958SDamjan Jovanovic sFilter << StrPath()
187*8a106958SDamjan Jovanovic << "\\"
188*8a106958SDamjan Jovanovic << i_sFilter;
189*8a106958SDamjan Jovanovic
190*8a106958SDamjan Jovanovic struct _finddata_t
191*8a106958SDamjan Jovanovic aEntry;
192*8a106958SDamjan Jovanovic long hFile = _findfirst( sFilter.c_str(), &aEntry );
193*8a106958SDamjan Jovanovic for ( int bFindMore = (hFile == -1 ? 1 : 0);
194*8a106958SDamjan Jovanovic bFindMore == 0;
195*8a106958SDamjan Jovanovic bFindMore = _findnext( hFile, &aEntry ) )
196*8a106958SDamjan Jovanovic {
197*8a106958SDamjan Jovanovic sNew.seekp(nStartFilename);
198*8a106958SDamjan Jovanovic sNew << aEntry.name;
199*8a106958SDamjan Jovanovic String sNewAsString( sNew.c_str() );
200*8a106958SDamjan Jovanovic o_rResult.push_back(sNewAsString);
201*8a106958SDamjan Jovanovic } // end for
202*8a106958SDamjan Jovanovic
203*8a106958SDamjan Jovanovic _findclose(hFile);
204*8a106958SDamjan Jovanovic if ( i_eRecursivity == flat )
205*8a106958SDamjan Jovanovic return;
206*8a106958SDamjan Jovanovic
207*8a106958SDamjan Jovanovic // gathering from subdirectories:
208*8a106958SDamjan Jovanovic StringVector aSubDirectories;
209*8a106958SDamjan Jovanovic GetContainedDirectories( aSubDirectories );
210*8a106958SDamjan Jovanovic
211*8a106958SDamjan Jovanovic StringVector::const_iterator dEnd = aSubDirectories.end();
212*8a106958SDamjan Jovanovic for ( StringVector::const_iterator d = aSubDirectories.begin();
213*8a106958SDamjan Jovanovic d != dEnd;
214*8a106958SDamjan Jovanovic ++d )
215*8a106958SDamjan Jovanovic {
216*8a106958SDamjan Jovanovic Directory aSub(*this);
217*8a106958SDamjan Jovanovic aSub += *d;
218*8a106958SDamjan Jovanovic aSub.GetContainedFiles( o_rResult,
219*8a106958SDamjan Jovanovic i_sFilter,
220*8a106958SDamjan Jovanovic i_eRecursivity );
221*8a106958SDamjan Jovanovic }
222*8a106958SDamjan Jovanovic }
223*8a106958SDamjan Jovanovic
224*8a106958SDamjan Jovanovic } // namespace ploc
225*8a106958SDamjan Jovanovic } // namespace csv
226*8a106958SDamjan Jovanovic
227*8a106958SDamjan Jovanovic
228*8a106958SDamjan Jovanovic #elif defined(UNX)
229*8a106958SDamjan Jovanovic #include <sys/types.h>
230*8a106958SDamjan Jovanovic #include <sys/stat.h>
231*8a106958SDamjan Jovanovic #include <dirent.h>
232*8a106958SDamjan Jovanovic
233*8a106958SDamjan Jovanovic namespace csv
234*8a106958SDamjan Jovanovic {
235*8a106958SDamjan Jovanovic namespace ploc
236*8a106958SDamjan Jovanovic {
237*8a106958SDamjan Jovanovic
238*8a106958SDamjan Jovanovic bool
PhysicalCreate_Dir(const char * i_sStr) const239*8a106958SDamjan Jovanovic Directory::PhysicalCreate_Dir( const char * i_sStr ) const
240*8a106958SDamjan Jovanovic {
241*8a106958SDamjan Jovanovic return mkdir( i_sStr, 00777 ) == 0;
242*8a106958SDamjan Jovanovic }
243*8a106958SDamjan Jovanovic
244*8a106958SDamjan Jovanovic void
GetContainedDirectories(StringVector & o_rResult) const245*8a106958SDamjan Jovanovic Directory::GetContainedDirectories( StringVector & o_rResult ) const
246*8a106958SDamjan Jovanovic {
247*8a106958SDamjan Jovanovic StreamStr sNew(240);
248*8a106958SDamjan Jovanovic sNew << aPath;
249*8a106958SDamjan Jovanovic StreamStr::size_type
250*8a106958SDamjan Jovanovic nStartFilename = sNew.tellp();
251*8a106958SDamjan Jovanovic
252*8a106958SDamjan Jovanovic DIR * pDir = opendir( StrPath() );
253*8a106958SDamjan Jovanovic dirent * pEntry = 0;
254*8a106958SDamjan Jovanovic struct stat aEntryStatus;
255*8a106958SDamjan Jovanovic
256*8a106958SDamjan Jovanovic while ( (pEntry = readdir(pDir)) != 0 )
257*8a106958SDamjan Jovanovic {
258*8a106958SDamjan Jovanovic sNew.seekp(nStartFilename);
259*8a106958SDamjan Jovanovic sNew << pEntry->d_name;
260*8a106958SDamjan Jovanovic
261*8a106958SDamjan Jovanovic stat(sNew.c_str(), &aEntryStatus);
262*8a106958SDamjan Jovanovic if ( (aEntryStatus.st_mode & S_IFDIR) == S_IFDIR
263*8a106958SDamjan Jovanovic AND *pEntry->d_name != '.' )
264*8a106958SDamjan Jovanovic {
265*8a106958SDamjan Jovanovic String sNew2(pEntry->d_name);
266*8a106958SDamjan Jovanovic o_rResult.push_back(sNew2);
267*8a106958SDamjan Jovanovic } // endif (aEntry.attrib == _A_SUBDIR)
268*8a106958SDamjan Jovanovic } // end while
269*8a106958SDamjan Jovanovic closedir( pDir );
270*8a106958SDamjan Jovanovic }
271*8a106958SDamjan Jovanovic
272*8a106958SDamjan Jovanovic void
GetContainedFiles(StringVector & o_rResult,const char * i_sFilter,E_Recursivity i_eRecursivity) const273*8a106958SDamjan Jovanovic Directory::GetContainedFiles( StringVector & o_rResult,
274*8a106958SDamjan Jovanovic const char * i_sFilter,
275*8a106958SDamjan Jovanovic E_Recursivity i_eRecursivity ) const
276*8a106958SDamjan Jovanovic {
277*8a106958SDamjan Jovanovic StreamStr sNew(240);
278*8a106958SDamjan Jovanovic sNew << aPath;
279*8a106958SDamjan Jovanovic StreamStr::size_type
280*8a106958SDamjan Jovanovic nStartFilename = sNew.tellp();
281*8a106958SDamjan Jovanovic
282*8a106958SDamjan Jovanovic bool bUseFilter = strcmp( i_sFilter, "*.*" ) != 0
283*8a106958SDamjan Jovanovic AND strncmp( i_sFilter, "*.", 2) == 0;
284*8a106958SDamjan Jovanovic
285*8a106958SDamjan Jovanovic DIR * pDir = opendir( StrPath() );
286*8a106958SDamjan Jovanovic dirent * pEntry = 0;
287*8a106958SDamjan Jovanovic struct stat aEntryStatus;
288*8a106958SDamjan Jovanovic
289*8a106958SDamjan Jovanovic while ( (pEntry = readdir(pDir)) != 0 )
290*8a106958SDamjan Jovanovic {
291*8a106958SDamjan Jovanovic sNew.seekp(nStartFilename);
292*8a106958SDamjan Jovanovic sNew << pEntry->d_name;
293*8a106958SDamjan Jovanovic
294*8a106958SDamjan Jovanovic stat(sNew.c_str(), &aEntryStatus);
295*8a106958SDamjan Jovanovic if ( (aEntryStatus.st_mode & S_IFDIR) == S_IFDIR )
296*8a106958SDamjan Jovanovic continue; // Don't gather directories.
297*8a106958SDamjan Jovanovic
298*8a106958SDamjan Jovanovic if ( bUseFilter )
299*8a106958SDamjan Jovanovic {
300*8a106958SDamjan Jovanovic const char * pEnding = strrchr(pEntry->d_name,'.');
301*8a106958SDamjan Jovanovic if (pEnding == 0)
302*8a106958SDamjan Jovanovic continue;
303*8a106958SDamjan Jovanovic if ( strcasecmp( pEnding + 1, i_sFilter + 2 ) != 0 )
304*8a106958SDamjan Jovanovic continue;
305*8a106958SDamjan Jovanovic }
306*8a106958SDamjan Jovanovic
307*8a106958SDamjan Jovanovic sNew.seekp(nStartFilename);
308*8a106958SDamjan Jovanovic sNew << pEntry->d_name;
309*8a106958SDamjan Jovanovic String sNewAsString( sNew.c_str() );
310*8a106958SDamjan Jovanovic o_rResult.push_back(sNewAsString);
311*8a106958SDamjan Jovanovic } // end while
312*8a106958SDamjan Jovanovic
313*8a106958SDamjan Jovanovic closedir( pDir );
314*8a106958SDamjan Jovanovic if ( i_eRecursivity == flat )
315*8a106958SDamjan Jovanovic return;
316*8a106958SDamjan Jovanovic
317*8a106958SDamjan Jovanovic // gathering from subdirectories:
318*8a106958SDamjan Jovanovic StringVector aSubDirectories;
319*8a106958SDamjan Jovanovic GetContainedDirectories( aSubDirectories );
320*8a106958SDamjan Jovanovic
321*8a106958SDamjan Jovanovic StringVector::const_iterator dEnd = aSubDirectories.end();
322*8a106958SDamjan Jovanovic for ( StringVector::const_iterator d = aSubDirectories.begin();
323*8a106958SDamjan Jovanovic d != dEnd;
324*8a106958SDamjan Jovanovic ++d )
325*8a106958SDamjan Jovanovic {
326*8a106958SDamjan Jovanovic Directory aSub(*this);
327*8a106958SDamjan Jovanovic aSub += *d;
328*8a106958SDamjan Jovanovic aSub.GetContainedFiles( o_rResult,
329*8a106958SDamjan Jovanovic i_sFilter,
330*8a106958SDamjan Jovanovic i_eRecursivity );
331*8a106958SDamjan Jovanovic }
332*8a106958SDamjan Jovanovic }
333*8a106958SDamjan Jovanovic
334*8a106958SDamjan Jovanovic } // namespace ploc
335*8a106958SDamjan Jovanovic } // namespace csv
336*8a106958SDamjan Jovanovic
337*8a106958SDamjan Jovanovic
338*8a106958SDamjan Jovanovic #else
339*8a106958SDamjan Jovanovic #error For using csv::ploc there has to be defined: WNT or UNX.
340*8a106958SDamjan Jovanovic #endif
341*8a106958SDamjan Jovanovic
342*8a106958SDamjan Jovanovic
343*8a106958SDamjan Jovanovic namespace csv
344*8a106958SDamjan Jovanovic {
345*8a106958SDamjan Jovanovic namespace ploc
346*8a106958SDamjan Jovanovic {
347*8a106958SDamjan Jovanovic
348*8a106958SDamjan Jovanovic const Path &
inq_MyPath() const349*8a106958SDamjan Jovanovic Directory::inq_MyPath() const
350*8a106958SDamjan Jovanovic {
351*8a106958SDamjan Jovanovic return aPath;
352*8a106958SDamjan Jovanovic }
353*8a106958SDamjan Jovanovic
354*8a106958SDamjan Jovanovic
355*8a106958SDamjan Jovanovic
356*8a106958SDamjan Jovanovic } // namespace ploc
357*8a106958SDamjan Jovanovic } // namespace csv
358