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