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