xref: /AOO41X/main/l10ntools/source/directory.cxx (revision 3cd96b95fb0ad23ccdd883f9b15a685c459d45ca)
1*3cd96b95SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*3cd96b95SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*3cd96b95SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*3cd96b95SAndrew Rist  * distributed with this work for additional information
6*3cd96b95SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*3cd96b95SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*3cd96b95SAndrew Rist  * "License"); you may not use this file except in compliance
9*3cd96b95SAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11*3cd96b95SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13*3cd96b95SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*3cd96b95SAndrew Rist  * software distributed under the License is distributed on an
15*3cd96b95SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*3cd96b95SAndrew Rist  * KIND, either express or implied.  See the License for the
17*3cd96b95SAndrew Rist  * specific language governing permissions and limitations
18*3cd96b95SAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20*3cd96b95SAndrew Rist  *************************************************************/
21*3cd96b95SAndrew Rist 
22*3cd96b95SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir 
25cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
26cdf0e10cSrcweir #include "precompiled_l10ntools.hxx"
27cdf0e10cSrcweir #include <l10ntools/directory.hxx>
28cdf0e10cSrcweir #include "tools/string.hxx"
29cdf0e10cSrcweir #include <iostream>
30cdf0e10cSrcweir #include <vector>
31cdf0e10cSrcweir #include <algorithm>
32cdf0e10cSrcweir 
33cdf0e10cSrcweir namespace transex
34cdf0e10cSrcweir {
35cdf0e10cSrcweir 
Directory(const rtl::OUString sFullpath)36cdf0e10cSrcweir Directory::Directory( const rtl::OUString sFullpath ) : bSkipLinks( false )
37cdf0e10cSrcweir {
38cdf0e10cSrcweir     sFullName = sFullpath;
39cdf0e10cSrcweir }
40cdf0e10cSrcweir 
Directory(const rtl::OUString sFullPath,const rtl::OUString sEntry)41cdf0e10cSrcweir Directory::Directory( const rtl::OUString sFullPath , const rtl::OUString sEntry ) : bSkipLinks( false )
42cdf0e10cSrcweir {
43cdf0e10cSrcweir     sFullName       = sFullPath;
44cdf0e10cSrcweir     sDirectoryName  = sEntry;
45cdf0e10cSrcweir }
46cdf0e10cSrcweir 
47cdf0e10cSrcweir 
Directory(const ByteString sFullPath)48cdf0e10cSrcweir Directory::Directory( const ByteString sFullPath ) : bSkipLinks( false )
49cdf0e10cSrcweir {
50cdf0e10cSrcweir     sDirectoryName = rtl::OUString( sFullPath.GetBuffer() , RTL_TEXTENCODING_UTF8 , sFullPath.Len() );
51cdf0e10cSrcweir }
52cdf0e10cSrcweir 
lessDir(const Directory & rKey1,const Directory & rKey2)53cdf0e10cSrcweir bool Directory::lessDir ( const Directory& rKey1, const Directory& rKey2 )
54cdf0e10cSrcweir {
55cdf0e10cSrcweir     rtl::OUString sName1( ( static_cast< Directory >( rKey1 ) ).getDirectoryName() );
56cdf0e10cSrcweir     rtl::OUString sName2( ( static_cast< Directory >( rKey2 ) ).getDirectoryName() );
57cdf0e10cSrcweir 
58cdf0e10cSrcweir     return sName1.compareTo( sName2 ) < 0 ;
59cdf0e10cSrcweir }
60cdf0e10cSrcweir 
61cdf0e10cSrcweir 
dump()62cdf0e10cSrcweir void Directory::dump()
63cdf0e10cSrcweir {
64cdf0e10cSrcweir 
65cdf0e10cSrcweir     for( std::vector< transex::File >::iterator iter = aFileVec.begin() ; iter != aFileVec.end() ; ++iter )
66cdf0e10cSrcweir     {
67cdf0e10cSrcweir         std::cout << "FILE " << rtl::OUStringToOString( (*iter).getFullName().getStr() , RTL_TEXTENCODING_UTF8 , (*iter).getFullName().getLength() ).getStr() << "\n";
68cdf0e10cSrcweir     }
69cdf0e10cSrcweir 
70cdf0e10cSrcweir     for( std::vector< transex::Directory >::iterator iter = aDirVec.begin() ; iter != aDirVec.end() ; ++iter )
71cdf0e10cSrcweir     {
72cdf0e10cSrcweir         std::cout << "DIR " << rtl::OUStringToOString( (*iter).getFullName().getStr() , RTL_TEXTENCODING_UTF8 , (*iter).getFullName().getLength() ).getStr() << "\n";
73cdf0e10cSrcweir     }
74cdf0e10cSrcweir 
75cdf0e10cSrcweir }
76cdf0e10cSrcweir 
scanSubDir(int nLevels)77cdf0e10cSrcweir void Directory::scanSubDir( int nLevels )
78cdf0e10cSrcweir {
79cdf0e10cSrcweir     readDirectory( sFullName );
80cdf0e10cSrcweir     dump();
81cdf0e10cSrcweir     if( nLevels > 0 ) {
82cdf0e10cSrcweir         for( std::vector< transex::Directory >::iterator iter = aDirVec.begin() ; iter != aDirVec.end() || nLevels > 0 ; ++iter , nLevels-- )
83cdf0e10cSrcweir         {
84cdf0e10cSrcweir             ( *iter ).scanSubDir();
85cdf0e10cSrcweir         }
86cdf0e10cSrcweir     }
87cdf0e10cSrcweir }
88cdf0e10cSrcweir 
setSkipLinks(bool is_skipped)89cdf0e10cSrcweir void Directory::setSkipLinks( bool is_skipped )
90cdf0e10cSrcweir {
91cdf0e10cSrcweir     bSkipLinks = is_skipped;
92cdf0e10cSrcweir }
93cdf0e10cSrcweir 
readDirectory()94cdf0e10cSrcweir void Directory::readDirectory()
95cdf0e10cSrcweir {
96cdf0e10cSrcweir     readDirectory( sFullName );
97cdf0e10cSrcweir }
98cdf0e10cSrcweir 
99cdf0e10cSrcweir #ifdef WNT
100cdf0e10cSrcweir #include <tools/prewin.h>
101cdf0e10cSrcweir #include <windows.h>
102cdf0e10cSrcweir #include <tools/postwin.h>
103cdf0e10cSrcweir 
readDirectory(const rtl::OUString & sFullpath)104cdf0e10cSrcweir void Directory::readDirectory ( const rtl::OUString& sFullpath )
105cdf0e10cSrcweir {
106cdf0e10cSrcweir     sal_Bool            fFinished;
107cdf0e10cSrcweir     HANDLE          hList;
108cdf0e10cSrcweir     TCHAR           szDir[MAX_PATH+1];
109cdf0e10cSrcweir     TCHAR           szSubDir[MAX_PATH+1];
110cdf0e10cSrcweir     WIN32_FIND_DATA FileData;
111cdf0e10cSrcweir 
112cdf0e10cSrcweir     rtl::OString sFullpathext = rtl::OUStringToOString( sFullpath , RTL_TEXTENCODING_UTF8 , sFullpath.getLength() );
113cdf0e10cSrcweir     const char *dirname = sFullpathext.getStr();
114cdf0e10cSrcweir 
115cdf0e10cSrcweir     // Get the proper directory path
116cdf0e10cSrcweir 	sprintf(szDir, "%s\\*", dirname);
117cdf0e10cSrcweir 
118cdf0e10cSrcweir     // Get the first file
119cdf0e10cSrcweir     hList = FindFirstFile(szDir, &FileData);
120cdf0e10cSrcweir     if (hList == INVALID_HANDLE_VALUE)
121cdf0e10cSrcweir     {
122cdf0e10cSrcweir         //FindClose(hList);
123cdf0e10cSrcweir         //printf("No files found %s\n", szDir ); return;
124cdf0e10cSrcweir     }
125cdf0e10cSrcweir     else
126cdf0e10cSrcweir     {
127cdf0e10cSrcweir         fFinished = sal_False;
128cdf0e10cSrcweir         while (!fFinished)
129cdf0e10cSrcweir         {
130cdf0e10cSrcweir 
131cdf0e10cSrcweir 			sprintf(szSubDir, "%s\\%s", dirname, FileData.cFileName);
132cdf0e10cSrcweir 			rtl::OString myfile( FileData.cFileName );
133cdf0e10cSrcweir 			rtl::OString mydir( szSubDir );
134cdf0e10cSrcweir 
135cdf0e10cSrcweir             if (FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
136cdf0e10cSrcweir             {
137cdf0e10cSrcweir                 if ( (strcmp(FileData.cFileName, ".") != 0 ) &&
138cdf0e10cSrcweir 					 (strcmp(FileData.cFileName, "..") != 0 ) )
139cdf0e10cSrcweir                 {
140cdf0e10cSrcweir 	                //sprintf(szSubDir, "%s\\%s", dirname, FileData.cFileName);
141cdf0e10cSrcweir 					transex::Directory aDir(	rtl::OStringToOUString( mydir , RTL_TEXTENCODING_UTF8 , mydir.getLength() ),
142cdf0e10cSrcweir 												rtl::OStringToOUString( myfile , RTL_TEXTENCODING_UTF8 , myfile.getLength() ) );
143cdf0e10cSrcweir 					aDirVec.push_back( aDir );
144cdf0e10cSrcweir                 }
145cdf0e10cSrcweir             }
146cdf0e10cSrcweir 			else
147cdf0e10cSrcweir 			{
148cdf0e10cSrcweir 				transex::File aFile(	rtl::OStringToOUString( mydir , RTL_TEXTENCODING_UTF8 , mydir.getLength() ),
149cdf0e10cSrcweir 										rtl::OStringToOUString( myfile , RTL_TEXTENCODING_UTF8 , myfile.getLength() ) );
150cdf0e10cSrcweir                 aFileVec.push_back( aFile );
151cdf0e10cSrcweir 			}
152cdf0e10cSrcweir             if (!FindNextFile(hList, &FileData))
153cdf0e10cSrcweir             {
154cdf0e10cSrcweir                 if (GetLastError() == ERROR_NO_MORE_FILES)
155cdf0e10cSrcweir                 {
156cdf0e10cSrcweir                     fFinished = sal_True;
157cdf0e10cSrcweir                 }
158cdf0e10cSrcweir             }
159cdf0e10cSrcweir         }
160cdf0e10cSrcweir     }
161cdf0e10cSrcweir 
162cdf0e10cSrcweir     FindClose(hList);
163cdf0e10cSrcweir 
164cdf0e10cSrcweir     ::std::sort( aFileVec.begin() , aFileVec.end() , File::lessFile );
165cdf0e10cSrcweir     ::std::sort( aDirVec.begin()  , aDirVec.end()  , Directory::lessDir  );
166cdf0e10cSrcweir }
167cdf0e10cSrcweir 
168cdf0e10cSrcweir #else
169cdf0e10cSrcweir 
170cdf0e10cSrcweir class dirholder
171cdf0e10cSrcweir {
172cdf0e10cSrcweir private:
173cdf0e10cSrcweir     DIR *mpDir;
174cdf0e10cSrcweir public:
dirholder(DIR * pDir)175cdf0e10cSrcweir     dirholder(DIR *pDir) : mpDir(pDir) {}
close()176cdf0e10cSrcweir     int close() { int nRet = mpDir ? closedir(mpDir) : 0; mpDir = NULL; return nRet; }
~dirholder()177cdf0e10cSrcweir     ~dirholder() { close(); }
178cdf0e10cSrcweir };
179cdf0e10cSrcweir 
readDirectory(const rtl::OUString & sFullpath)180cdf0e10cSrcweir void Directory::readDirectory( const rtl::OUString& sFullpath )
181cdf0e10cSrcweir {
182cdf0e10cSrcweir     struct stat     statbuf;
183cdf0e10cSrcweir     struct stat     statbuf2;
184cdf0e10cSrcweir     struct dirent   *dirp;
185cdf0e10cSrcweir     DIR             *dir;
186cdf0e10cSrcweir 
187cdf0e10cSrcweir     if( sFullpath.getLength() < 1 ) return;
188cdf0e10cSrcweir 
189cdf0e10cSrcweir     rtl::OString   sFullpathext = rtl::OUStringToOString( sFullpath , RTL_TEXTENCODING_UTF8 , sFullpath.getLength() ).getStr();
190cdf0e10cSrcweir 
191cdf0e10cSrcweir     // stat
192cdf0e10cSrcweir 	if( stat( sFullpathext.getStr()  , &statbuf ) < 0 ){   printf("warning: Can not stat %s" , sFullpathext.getStr() ); return; }// error }
193cdf0e10cSrcweir 
194cdf0e10cSrcweir     if( S_ISDIR(statbuf.st_mode ) == 0 ) {  return; }// error }   return; // not dir
195cdf0e10cSrcweir 
196cdf0e10cSrcweir     if( (dir = opendir( sFullpathext.getStr() ) ) == NULL  ) {printf("readerror 2 in %s \n",sFullpathext.getStr()); return; } // error } return; // error
197cdf0e10cSrcweir 
198cdf0e10cSrcweir     dirholder aHolder(dir);
199cdf0e10cSrcweir 
200cdf0e10cSrcweir     sFullpathext += rtl::OString( "/" );
201cdf0e10cSrcweir 
202cdf0e10cSrcweir     const rtl::OString sDot ( "." ) ;
203cdf0e10cSrcweir     const rtl::OString sDDot( ".." );
204cdf0e10cSrcweir 
205cdf0e10cSrcweir     if ( chdir( sFullpathext.getStr() ) == -1 ) { printf("chdir error in %s \n",sFullpathext.getStr()); return; } // error
206cdf0e10cSrcweir 
207cdf0e10cSrcweir     while(  ( dirp = readdir( dir ) ) != NULL )
208cdf0e10cSrcweir     {
209cdf0e10cSrcweir         rtl::OString sEntryName(  dirp->d_name );
210cdf0e10cSrcweir 
211cdf0e10cSrcweir         if( sEntryName.equals( sDot )  || sEntryName.equals( sDDot ) )
212cdf0e10cSrcweir             continue;
213cdf0e10cSrcweir 
214cdf0e10cSrcweir         // add dir entry
215cdf0e10cSrcweir         rtl::OString sEntity = sFullpathext;
216cdf0e10cSrcweir         sEntity += sEntryName;
217cdf0e10cSrcweir 
218cdf0e10cSrcweir         // stat new entry
219cdf0e10cSrcweir         if( lstat( sEntity.getStr() , &statbuf2 ) < 0 )
220cdf0e10cSrcweir         {
221cdf0e10cSrcweir             printf("error on entry %s\n" , sEntity.getStr() ) ; // error
222cdf0e10cSrcweir             continue;
223cdf0e10cSrcweir         }
224cdf0e10cSrcweir 
225cdf0e10cSrcweir         // add file / dir to vector
226cdf0e10cSrcweir         switch( statbuf2.st_mode & S_IFMT )
227cdf0e10cSrcweir         {
228cdf0e10cSrcweir             case S_IFREG:
229cdf0e10cSrcweir 						{
230cdf0e10cSrcweir                             rtl::OString sFile = sFullpathext;
231cdf0e10cSrcweir                             sFile += sEntryName ;
232cdf0e10cSrcweir                             transex::File aFile( rtl::OStringToOUString( sEntity , RTL_TEXTENCODING_UTF8 , sEntity.getLength() ) ,
233cdf0e10cSrcweir                                                  rtl::OStringToOUString( sEntryName , RTL_TEXTENCODING_UTF8 , sEntryName.getLength() )
234cdf0e10cSrcweir                                                );
235cdf0e10cSrcweir 
236cdf0e10cSrcweir 							aFileVec.push_back( aFile ) ;
237cdf0e10cSrcweir                             break;
238cdf0e10cSrcweir                          }
239cdf0e10cSrcweir             case S_IFLNK:
240cdf0e10cSrcweir                         {
241cdf0e10cSrcweir                             if( bSkipLinks )    break;
242cdf0e10cSrcweir                         }
243cdf0e10cSrcweir             case S_IFDIR:
244cdf0e10cSrcweir 						{
245cdf0e10cSrcweir                             rtl::OString sDir = sFullpathext;
246cdf0e10cSrcweir                             sDir += sEntryName ;
247cdf0e10cSrcweir 
248cdf0e10cSrcweir                             transex::Directory aDir(
249cdf0e10cSrcweir                                                      rtl::OStringToOUString( sEntity , RTL_TEXTENCODING_UTF8 , sEntity.getLength() ) ,
250cdf0e10cSrcweir                                                      rtl::OStringToOUString( sEntryName , RTL_TEXTENCODING_UTF8 , sEntryName.getLength() )
251cdf0e10cSrcweir                                                    ) ;
252cdf0e10cSrcweir                             aDirVec.push_back( aDir ) ;
253cdf0e10cSrcweir                             break;
254cdf0e10cSrcweir                          }
255cdf0e10cSrcweir         }
256cdf0e10cSrcweir     }
257cdf0e10cSrcweir     if ( chdir( ".." ) == -1 ) { printf("chdir error in .. \n"); return; } // error
258cdf0e10cSrcweir     if( aHolder.close() < 0 )   return ; // error
259cdf0e10cSrcweir 
260cdf0e10cSrcweir     std::sort( aFileVec.begin() , aFileVec.end() , File::lessFile );
261cdf0e10cSrcweir     std::sort( aDirVec.begin()  , aDirVec.end()  , Directory::lessDir  );
262cdf0e10cSrcweir 
263cdf0e10cSrcweir }
264cdf0e10cSrcweir 
265cdf0e10cSrcweir #endif
266cdf0e10cSrcweir }
267