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