xref: /AOO42X/main/autodoc/source/cosv/storage/ploc_dir.cxx (revision b1c5455db1639c48e26c568e4fa7ee78ca5d60ee)
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