1*89b56da7SAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3*89b56da7SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4*89b56da7SAndrew Rist * or more contributor license agreements. See the NOTICE file
5*89b56da7SAndrew Rist * distributed with this work for additional information
6*89b56da7SAndrew Rist * regarding copyright ownership. The ASF licenses this file
7*89b56da7SAndrew Rist * to you under the Apache License, Version 2.0 (the
8*89b56da7SAndrew Rist * "License"); you may not use this file except in compliance
9*89b56da7SAndrew Rist * with the License. You may obtain a copy of the License at
10cdf0e10cSrcweir *
11*89b56da7SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir *
13*89b56da7SAndrew Rist * Unless required by applicable law or agreed to in writing,
14*89b56da7SAndrew Rist * software distributed under the License is distributed on an
15*89b56da7SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*89b56da7SAndrew Rist * KIND, either express or implied. See the License for the
17*89b56da7SAndrew Rist * specific language governing permissions and limitations
18*89b56da7SAndrew Rist * under the License.
19cdf0e10cSrcweir *
20*89b56da7SAndrew Rist *************************************************************/
21*89b56da7SAndrew Rist
22*89b56da7SAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_tools.hxx"
26cdf0e10cSrcweir
27cdf0e10cSrcweir #define _DIR_CXX
28cdf0e10cSrcweir
29cdf0e10cSrcweir #include <stdlib.h>
30cdf0e10cSrcweir #include <cstdarg>
31cdf0e10cSrcweir #include <limits.h>
32cdf0e10cSrcweir #include <tools/debug.hxx>
33cdf0e10cSrcweir #include <tools/list.hxx>
34cdf0e10cSrcweir
35cdf0e10cSrcweir #ifndef _COMPED_HXX
36cdf0e10cSrcweir #include "comdep.hxx"
37cdf0e10cSrcweir #endif
38cdf0e10cSrcweir #include <tools/fsys.hxx>
39cdf0e10cSrcweir
40cdf0e10cSrcweir
41cdf0e10cSrcweir DBG_NAME( Dir )
42cdf0e10cSrcweir
DECLARE_LIST(DirEntryList,DirEntry *)43cdf0e10cSrcweir DECLARE_LIST( DirEntryList, DirEntry* )
44cdf0e10cSrcweir DECLARE_LIST( FSysSortList, FSysSort* )
45cdf0e10cSrcweir DECLARE_LIST( FileStatList, FileStat* )
46cdf0e10cSrcweir
47cdf0e10cSrcweir #define APPEND (sal_uInt16) 65535
48cdf0e10cSrcweir
49cdf0e10cSrcweir /*************************************************************************
50cdf0e10cSrcweir |*
51cdf0e10cSrcweir |* Dir::InsertPointReached()
52cdf0e10cSrcweir |*
53cdf0e10cSrcweir |* Beschreibung stellt fest, ob eingefuegt werden musz
54cdf0e10cSrcweir |* Ersterstellung MA 05.11.91
55cdf0e10cSrcweir |* Letzte Aenderung MI 05.02.92
56cdf0e10cSrcweir |*
57cdf0e10cSrcweir *************************************************************************/
58cdf0e10cSrcweir
59cdf0e10cSrcweir sal_Bool Dir::ImpInsertPointReached( const DirEntry& rNewEntry,
60cdf0e10cSrcweir const FileStat& rNewStat,
61cdf0e10cSrcweir sal_uIntPtr nCurPos, sal_uIntPtr nSortIndex ) const
62cdf0e10cSrcweir {
63cdf0e10cSrcweir #define VALUE( nKindFlags ) \
64cdf0e10cSrcweir ( ( FSYS_KIND_FILE | FSYS_KIND_DIR | FSYS_KIND_DEV | \
65cdf0e10cSrcweir FSYS_KIND_CHAR | FSYS_KIND_BLOCK ) & nKindFlags )
66cdf0e10cSrcweir
67cdf0e10cSrcweir // einfache Dinge erfordern einfache Loesungen
68cdf0e10cSrcweir if ( !pLst->Count() )
69cdf0e10cSrcweir return sal_True;
70cdf0e10cSrcweir
71cdf0e10cSrcweir FSysSort nSort = *( pSortLst->GetObject( nSortIndex ) );
72cdf0e10cSrcweir FileStat *pOldStat = NULL;
73cdf0e10cSrcweir DirEntry *pCurLstObj = pLst->GetObject( nCurPos );
74cdf0e10cSrcweir if ( pStatLst )
75cdf0e10cSrcweir pOldStat = pStatLst->GetObject( nCurPos );
76cdf0e10cSrcweir
77cdf0e10cSrcweir switch( nSort )
78cdf0e10cSrcweir {
79cdf0e10cSrcweir case FSYS_SORT_NAME:
80cdf0e10cSrcweir case (FSYS_SORT_NAME | FSYS_SORT_ASCENDING):
81cdf0e10cSrcweir if ( pCurLstObj->aName > rNewEntry.aName )
82cdf0e10cSrcweir return sal_True;
83cdf0e10cSrcweir if ( !(pCurLstObj->aName == rNewEntry.aName) )
84cdf0e10cSrcweir return sal_False;
85cdf0e10cSrcweir break;
86cdf0e10cSrcweir case (FSYS_SORT_NAME | FSYS_SORT_DESCENDING):
87cdf0e10cSrcweir if ( pCurLstObj->aName < rNewEntry.aName )
88cdf0e10cSrcweir return sal_True;
89cdf0e10cSrcweir if ( !(pCurLstObj->aName == rNewEntry.aName) )
90cdf0e10cSrcweir return sal_False;
91cdf0e10cSrcweir break;
92cdf0e10cSrcweir
93cdf0e10cSrcweir case FSYS_SORT_EXT:
94cdf0e10cSrcweir case (FSYS_SORT_EXT | FSYS_SORT_ASCENDING):
95cdf0e10cSrcweir {
96cdf0e10cSrcweir if ( pCurLstObj->GetExtension() > rNewEntry.GetExtension() )
97cdf0e10cSrcweir return sal_True;
98cdf0e10cSrcweir if ( !(pCurLstObj->GetExtension() == rNewEntry.GetExtension()) )
99cdf0e10cSrcweir return sal_False;
100cdf0e10cSrcweir break;
101cdf0e10cSrcweir }
102cdf0e10cSrcweir case (FSYS_SORT_EXT | FSYS_SORT_DESCENDING):
103cdf0e10cSrcweir {
104cdf0e10cSrcweir if ( pCurLstObj->GetExtension() < rNewEntry.GetExtension() )
105cdf0e10cSrcweir return sal_True;
106cdf0e10cSrcweir if ( !(pCurLstObj->GetExtension() == rNewEntry.GetExtension()) )
107cdf0e10cSrcweir return sal_False;
108cdf0e10cSrcweir break;
109cdf0e10cSrcweir }
110cdf0e10cSrcweir
111cdf0e10cSrcweir case FSYS_SORT_KIND:
112cdf0e10cSrcweir case (FSYS_SORT_KIND | FSYS_SORT_ASCENDING ):
113cdf0e10cSrcweir if ( VALUE(pOldStat->nKindFlags) > VALUE(rNewStat.nKindFlags) )
114cdf0e10cSrcweir return sal_True;
115cdf0e10cSrcweir if ( !(VALUE(pOldStat->nKindFlags) == VALUE(rNewStat.nKindFlags)) )
116cdf0e10cSrcweir return sal_False;
117cdf0e10cSrcweir break;
118cdf0e10cSrcweir case (FSYS_SORT_KIND | FSYS_SORT_DESCENDING):
119cdf0e10cSrcweir if ( VALUE(pOldStat->nKindFlags) < VALUE(rNewStat.nKindFlags) )
120cdf0e10cSrcweir return sal_True;
121cdf0e10cSrcweir if ( !(VALUE(pOldStat->nKindFlags) == VALUE(rNewStat.nKindFlags)) )
122cdf0e10cSrcweir return sal_False;
123cdf0e10cSrcweir break;
124cdf0e10cSrcweir
125cdf0e10cSrcweir case FSYS_SORT_SIZE:
126cdf0e10cSrcweir case (FSYS_SORT_SIZE | FSYS_SORT_ASCENDING):
127cdf0e10cSrcweir if ( pOldStat->nSize > rNewStat.nSize )
128cdf0e10cSrcweir return sal_True;
129cdf0e10cSrcweir if ( !(pOldStat->nSize == rNewStat.nSize) )
130cdf0e10cSrcweir return sal_False;
131cdf0e10cSrcweir break;
132cdf0e10cSrcweir case (FSYS_SORT_SIZE | FSYS_SORT_DESCENDING):
133cdf0e10cSrcweir if ( pOldStat->nSize < rNewStat.nSize )
134cdf0e10cSrcweir return sal_True;
135cdf0e10cSrcweir if ( !(pOldStat->nSize == rNewStat.nSize) )
136cdf0e10cSrcweir return sal_False;
137cdf0e10cSrcweir break;
138cdf0e10cSrcweir
139cdf0e10cSrcweir case FSYS_SORT_MODIFYED:
140cdf0e10cSrcweir case (FSYS_SORT_MODIFYED | FSYS_SORT_ASCENDING):
141cdf0e10cSrcweir if ( (pOldStat->aDateModified >= rNewStat.aDateModified) &&
142cdf0e10cSrcweir (pOldStat->aTimeModified > rNewStat.aTimeModified) )
143cdf0e10cSrcweir return sal_True;
144cdf0e10cSrcweir if ( !((pOldStat->aDateModified == rNewStat.aDateModified) &&
145cdf0e10cSrcweir (pOldStat->aTimeModified == rNewStat.aTimeModified)) )
146cdf0e10cSrcweir return sal_False;
147cdf0e10cSrcweir break;
148cdf0e10cSrcweir case (FSYS_SORT_MODIFYED | FSYS_SORT_DESCENDING):
149cdf0e10cSrcweir if ( (pOldStat->aDateModified <= rNewStat.aDateModified) &&
150cdf0e10cSrcweir (pOldStat->aTimeModified < rNewStat.aTimeModified) )
151cdf0e10cSrcweir return sal_True;
152cdf0e10cSrcweir if ( !((pOldStat->aDateModified == rNewStat.aDateModified) &&
153cdf0e10cSrcweir (pOldStat->aTimeModified == rNewStat.aTimeModified)) )
154cdf0e10cSrcweir return sal_False;
155cdf0e10cSrcweir break;
156cdf0e10cSrcweir
157cdf0e10cSrcweir case FSYS_SORT_CREATED:
158cdf0e10cSrcweir case (FSYS_SORT_CREATED | FSYS_SORT_ASCENDING):
159cdf0e10cSrcweir if ( (pOldStat->aDateCreated >= rNewStat.aDateCreated) &&
160cdf0e10cSrcweir (pOldStat->aTimeCreated > rNewStat.aTimeCreated) )
161cdf0e10cSrcweir return sal_True;
162cdf0e10cSrcweir if ( !((pOldStat->aDateCreated == rNewStat.aDateCreated) &&
163cdf0e10cSrcweir (pOldStat->aTimeCreated == rNewStat.aTimeCreated)) )
164cdf0e10cSrcweir return sal_False;
165cdf0e10cSrcweir break;
166cdf0e10cSrcweir case (FSYS_SORT_CREATED | FSYS_SORT_DESCENDING):
167cdf0e10cSrcweir if ( (pOldStat->aDateCreated <= rNewStat.aDateCreated) &&
168cdf0e10cSrcweir (pOldStat->aTimeCreated < rNewStat.aTimeCreated) )
169cdf0e10cSrcweir return sal_True;
170cdf0e10cSrcweir if ( !((pOldStat->aDateCreated == rNewStat.aDateCreated) &&
171cdf0e10cSrcweir (pOldStat->aTimeCreated == rNewStat.aTimeCreated)) )
172cdf0e10cSrcweir return sal_False;
173cdf0e10cSrcweir break;
174cdf0e10cSrcweir
175cdf0e10cSrcweir case FSYS_SORT_ACCESSED:
176cdf0e10cSrcweir case (FSYS_SORT_ACCESSED | FSYS_SORT_ASCENDING):
177cdf0e10cSrcweir if ( (pOldStat->aDateAccessed >= rNewStat.aDateAccessed) &&
178cdf0e10cSrcweir (pOldStat->aTimeAccessed > rNewStat.aTimeAccessed) )
179cdf0e10cSrcweir return sal_True;
180cdf0e10cSrcweir if ( !((pOldStat->aDateAccessed == rNewStat.aDateAccessed) &&
181cdf0e10cSrcweir (pOldStat->aTimeAccessed == rNewStat.aTimeAccessed)) )
182cdf0e10cSrcweir return sal_False;
183cdf0e10cSrcweir break;
184cdf0e10cSrcweir case (FSYS_SORT_ACCESSED | FSYS_SORT_DESCENDING):
185cdf0e10cSrcweir if ( (pOldStat->aDateAccessed <= rNewStat.aDateAccessed) &&
186cdf0e10cSrcweir (pOldStat->aTimeAccessed < rNewStat.aTimeAccessed) )
187cdf0e10cSrcweir return sal_True;
188cdf0e10cSrcweir if ( !((pOldStat->aDateAccessed == rNewStat.aDateAccessed) &&
189cdf0e10cSrcweir (pOldStat->aTimeAccessed == rNewStat.aTimeAccessed)) )
190cdf0e10cSrcweir return sal_False;
191cdf0e10cSrcweir break;
192cdf0e10cSrcweir default: /* Kann nicht sein */;
193cdf0e10cSrcweir }
194cdf0e10cSrcweir
195cdf0e10cSrcweir if ( nSortIndex == ( pSortLst->Count() - 1 ) )
196cdf0e10cSrcweir return sal_True;
197cdf0e10cSrcweir else
198cdf0e10cSrcweir //Rekursion
199cdf0e10cSrcweir return ImpInsertPointReached( rNewEntry, rNewStat,
200cdf0e10cSrcweir nCurPos, nSortIndex + 1 );
201cdf0e10cSrcweir #undef VALUE
202cdf0e10cSrcweir }
203cdf0e10cSrcweir
204cdf0e10cSrcweir /*************************************************************************
205cdf0e10cSrcweir |*
206cdf0e10cSrcweir |* Dir::ImpSortedInsert()
207cdf0e10cSrcweir |*
208cdf0e10cSrcweir |* Beschreibung fuegt sortiert ein
209cdf0e10cSrcweir |* Ersterstellung MA 05.11.91
210cdf0e10cSrcweir |* Letzte Aenderung MA 03.12.91
211cdf0e10cSrcweir |*
212cdf0e10cSrcweir *************************************************************************/
213cdf0e10cSrcweir
ImpSortedInsert(const DirEntry * pNewEntry,const FileStat * pNewStat)214cdf0e10cSrcweir void Dir::ImpSortedInsert( const DirEntry *pNewEntry, const FileStat *pNewStat )
215cdf0e10cSrcweir {
216cdf0e10cSrcweir //Sonderfall, keine Sortierung gewuenscht.
217cdf0e10cSrcweir if ( !pSortLst ) {
218cdf0e10cSrcweir pLst->Insert( (DirEntry*)pNewEntry, APPEND );
219cdf0e10cSrcweir return;
220cdf0e10cSrcweir }
221cdf0e10cSrcweir
222cdf0e10cSrcweir pLst->First();
223cdf0e10cSrcweir do {
224cdf0e10cSrcweir if ( ImpInsertPointReached( *pNewEntry, *pNewStat, pLst->GetCurPos(),
225cdf0e10cSrcweir (sal_uIntPtr)0 ) )
226cdf0e10cSrcweir {
227cdf0e10cSrcweir if ( pStatLst )
228cdf0e10cSrcweir pStatLst->Insert( (FileStat*)pNewStat, pLst->GetCurPos() );
229cdf0e10cSrcweir pLst->Insert( (DirEntry*)pNewEntry );
230cdf0e10cSrcweir return;
231cdf0e10cSrcweir }
232cdf0e10cSrcweir } while( pLst->Next() );
233cdf0e10cSrcweir
234cdf0e10cSrcweir if ( pStatLst )
235cdf0e10cSrcweir pStatLst->Insert( (FileStat*)pNewStat, APPEND );
236cdf0e10cSrcweir pLst->Insert( (DirEntry*)pNewEntry, APPEND );
237cdf0e10cSrcweir }
238cdf0e10cSrcweir
239cdf0e10cSrcweir /*************************************************************************
240cdf0e10cSrcweir |*
241cdf0e10cSrcweir |* Dir::Construct()
242cdf0e10cSrcweir |*
243cdf0e10cSrcweir |* Beschreibung gemeinsame Implementation der Ctoren
244cdf0e10cSrcweir |* Ersterstellung MI 02.06.93
245cdf0e10cSrcweir |* Letzte Aenderung MI 02.06.93
246cdf0e10cSrcweir |*
247cdf0e10cSrcweir *************************************************************************/
248cdf0e10cSrcweir
Construct(DirEntryKind nKindFlags)249cdf0e10cSrcweir void Dir::Construct( DirEntryKind nKindFlags )
250cdf0e10cSrcweir {
251cdf0e10cSrcweir pLst = NULL;
252cdf0e10cSrcweir pSortLst = NULL;
253cdf0e10cSrcweir pStatLst = NULL;
254cdf0e10cSrcweir eAttrMask = nKindFlags;
255cdf0e10cSrcweir ByteString aTempName( GetName(), osl_getThreadTextEncoding() );
256cdf0e10cSrcweir if ( aTempName.Search( "*" ) != STRING_NOTFOUND ||
257cdf0e10cSrcweir aTempName.Search( "?" ) != STRING_NOTFOUND )
258cdf0e10cSrcweir #if defined( WNT ) && !defined( WTC )
259cdf0e10cSrcweir {
260cdf0e10cSrcweir ByteString aTStr(CutName(), osl_getThreadTextEncoding());
261cdf0e10cSrcweir char* pBuffer = new char[aTStr.Len()+1];
262cdf0e10cSrcweir strcpy( pBuffer, aTStr.GetBuffer() );
263cdf0e10cSrcweir CharLowerBuff( pBuffer, aTStr.Len() );
264cdf0e10cSrcweir aNameMask = WildCard( String(pBuffer, osl_getThreadTextEncoding()), ';' );
265cdf0e10cSrcweir delete [] pBuffer;
266cdf0e10cSrcweir }
267cdf0e10cSrcweir #else
268cdf0e10cSrcweir aNameMask = WildCard( CutName(), ';' );
269cdf0e10cSrcweir #endif
270cdf0e10cSrcweir else
271cdf0e10cSrcweir aNameMask = String("*", osl_getThreadTextEncoding());
272cdf0e10cSrcweir }
273cdf0e10cSrcweir
274cdf0e10cSrcweir /*************************************************************************
275cdf0e10cSrcweir |*
276cdf0e10cSrcweir |* Dir::Update()
277cdf0e10cSrcweir |*
278cdf0e10cSrcweir |* Beschreibung FSYS.SDW
279cdf0e10cSrcweir |* Ersterstellung MI 16.05.91
280cdf0e10cSrcweir |* Letzte Aenderung MI 19.09.96
281cdf0e10cSrcweir |*
282cdf0e10cSrcweir *************************************************************************/
283cdf0e10cSrcweir
Update()284cdf0e10cSrcweir sal_Bool Dir::Update()
285cdf0e10cSrcweir {
286cdf0e10cSrcweir Reset();
287cdf0e10cSrcweir return Scan( USHRT_MAX ) > 0;
288cdf0e10cSrcweir }
289cdf0e10cSrcweir
290cdf0e10cSrcweir /*************************************************************************
291cdf0e10cSrcweir |*
292cdf0e10cSrcweir |* Dir::Reset()
293cdf0e10cSrcweir |*
294cdf0e10cSrcweir |* Beschreibung
295cdf0e10cSrcweir |* Ersterstellung MI 22.10.96
296cdf0e10cSrcweir |* Letzte Aenderung MI 22.10.96
297cdf0e10cSrcweir |*
298cdf0e10cSrcweir *************************************************************************/
299cdf0e10cSrcweir
Reset()300cdf0e10cSrcweir void Dir::Reset()
301cdf0e10cSrcweir {
302cdf0e10cSrcweir // ggf. alten Reader l"oschen
303cdf0e10cSrcweir if ( pReader && pReader->bInUse )
304cdf0e10cSrcweir DELETEZ(pReader);
305cdf0e10cSrcweir
306cdf0e10cSrcweir // alle DirEntries aus der Liste entfernen und deren Speicher freigeben
307cdf0e10cSrcweir if ( pLst )
308cdf0e10cSrcweir {
309cdf0e10cSrcweir DirEntry* pEntry = pLst->First();
310cdf0e10cSrcweir while (pEntry)
311cdf0e10cSrcweir {
312cdf0e10cSrcweir DirEntry* pNext = pLst->Next();
313cdf0e10cSrcweir delete pEntry;
314cdf0e10cSrcweir pEntry = pNext;
315cdf0e10cSrcweir }
316cdf0e10cSrcweir pLst->Clear();
317cdf0e10cSrcweir }
318cdf0e10cSrcweir else
319cdf0e10cSrcweir pLst = new DirEntryList();
320cdf0e10cSrcweir
321cdf0e10cSrcweir // Alte File-Stat's Loeschen
322cdf0e10cSrcweir if ( pStatLst )
323cdf0e10cSrcweir {
324cdf0e10cSrcweir //Erstmal die alten Loeschen
325cdf0e10cSrcweir FileStat* pEntry = pStatLst->First();
326cdf0e10cSrcweir while (pEntry)
327cdf0e10cSrcweir {
328cdf0e10cSrcweir FileStat* pNext = pStatLst->Next();
329cdf0e10cSrcweir delete pEntry;
330cdf0e10cSrcweir pEntry = pNext;
331cdf0e10cSrcweir }
332cdf0e10cSrcweir pStatLst->Clear();
333cdf0e10cSrcweir delete pStatLst;
334cdf0e10cSrcweir }
335cdf0e10cSrcweir
336cdf0e10cSrcweir // Verlangen die Sortierkriterien FileStat's?
337cdf0e10cSrcweir if ( pSortLst )
338cdf0e10cSrcweir {
339cdf0e10cSrcweir pSortLst->First();
340cdf0e10cSrcweir do
341cdf0e10cSrcweir {
342cdf0e10cSrcweir if ( *( pSortLst->GetCurObject() ) &
343cdf0e10cSrcweir ( FSYS_SORT_KIND | FSYS_SORT_SIZE |
344cdf0e10cSrcweir FSYS_SORT_CREATED | FSYS_SORT_MODIFYED | FSYS_SORT_ACCESSED ) )
345cdf0e10cSrcweir pStatLst = new FileStatList();
346cdf0e10cSrcweir } while ( !pStatLst && pSortLst->Next() );
347cdf0e10cSrcweir }
348cdf0e10cSrcweir
349cdf0e10cSrcweir #ifndef BOOTSTRAP
350cdf0e10cSrcweir // ggf. einen neuen Reader aufsetzen
351cdf0e10cSrcweir if ( !pReader )
352cdf0e10cSrcweir pReader = new DirReader_Impl( *this );
353cdf0e10cSrcweir #endif
354cdf0e10cSrcweir
355cdf0e10cSrcweir // gibt es das zu oeffnende Verzeichnis ueberhaupt?
356cdf0e10cSrcweir #if !defined(UNX) && !defined(OS2) //explanation: see DirReader_Impl::Read() in unx.cxx
357cdf0e10cSrcweir if( !pReader->pDosDir )
358cdf0e10cSrcweir {
359cdf0e10cSrcweir nError = FSYS_ERR_NOTADIRECTORY;
360cdf0e10cSrcweir DELETEZ( pReader );
361cdf0e10cSrcweir return;
362cdf0e10cSrcweir }
363cdf0e10cSrcweir #endif
364cdf0e10cSrcweir }
365cdf0e10cSrcweir
366cdf0e10cSrcweir /*************************************************************************
367cdf0e10cSrcweir |*
368cdf0e10cSrcweir |* Dir::Scan()
369cdf0e10cSrcweir |*
370cdf0e10cSrcweir |* Beschreibung FSYS.SDW
371cdf0e10cSrcweir |* Ersterstellung MI 18.09.96
372cdf0e10cSrcweir |* Letzte Aenderung MI 19.09.96
373cdf0e10cSrcweir |*
374cdf0e10cSrcweir *************************************************************************/
375cdf0e10cSrcweir
Scan(sal_uInt16 nCount)376cdf0e10cSrcweir sal_uInt16 Dir::Scan( sal_uInt16 nCount )
377cdf0e10cSrcweir {
378cdf0e10cSrcweir
379cdf0e10cSrcweir sal_uInt16 nRead = 0; // Anzahl in dieser Runde gelesener Eintr"age
380cdf0e10cSrcweir FSysFailOnErrorImpl();
381cdf0e10cSrcweir
382cdf0e10cSrcweir // noch nicht fertig gewesen
383cdf0e10cSrcweir if ( pReader )
384cdf0e10cSrcweir {
385cdf0e10cSrcweir // frischer Reader?
386cdf0e10cSrcweir if ( !pLst->Count() )
387cdf0e10cSrcweir {
388cdf0e10cSrcweir // dann ggf. Laufwerke scannen
389cdf0e10cSrcweir pReader->bInUse = sal_True;
390cdf0e10cSrcweir nRead = pReader->Init();
391cdf0e10cSrcweir }
392cdf0e10cSrcweir
393cdf0e10cSrcweir // weiterlesen...
394cdf0e10cSrcweir while ( nRead <= nCount && !pReader->bReady )
395cdf0e10cSrcweir nRead = nRead + pReader->Read();
396cdf0e10cSrcweir
397cdf0e10cSrcweir // fertig?
398cdf0e10cSrcweir if ( pReader && pReader->bReady )
399cdf0e10cSrcweir DELETEZ( pReader );
400cdf0e10cSrcweir }
401cdf0e10cSrcweir
402cdf0e10cSrcweir // Anzahl der gelesenen zur"uckgeben
403cdf0e10cSrcweir return nRead;
404cdf0e10cSrcweir }
405cdf0e10cSrcweir
406cdf0e10cSrcweir /*************************************************************************
407cdf0e10cSrcweir |*
408cdf0e10cSrcweir |* Dir::Dir()
409cdf0e10cSrcweir |*
410cdf0e10cSrcweir |* Beschreibung FSYS.SDW
411cdf0e10cSrcweir |* Ersterstellung MI 16.05.91
412cdf0e10cSrcweir |* Letzte Aenderung MI 04.03.92
413cdf0e10cSrcweir |*
414cdf0e10cSrcweir *************************************************************************/
415cdf0e10cSrcweir
Dir(const DirEntry & rDirEntry,DirEntryKind nKindFlags,FSysSort nSort,...)416cdf0e10cSrcweir Dir::Dir( const DirEntry& rDirEntry, DirEntryKind nKindFlags, FSysSort nSort, ... ):
417cdf0e10cSrcweir DirEntry( rDirEntry ),
418cdf0e10cSrcweir pReader( 0 )
419cdf0e10cSrcweir {
420cdf0e10cSrcweir DBG_CTOR( Dir, NULL );
421cdf0e10cSrcweir
422cdf0e10cSrcweir Construct( nKindFlags );
423cdf0e10cSrcweir
424cdf0e10cSrcweir std::va_list pArgs;
425cdf0e10cSrcweir va_start( pArgs, nSort );
426cdf0e10cSrcweir ImpSetSort( pArgs, nSort );
427cdf0e10cSrcweir
428cdf0e10cSrcweir Reset();
429cdf0e10cSrcweir }
430cdf0e10cSrcweir
431cdf0e10cSrcweir /*************************************************************************
432cdf0e10cSrcweir |*
433cdf0e10cSrcweir |* Dir::Dir()
434cdf0e10cSrcweir |*
435cdf0e10cSrcweir |* Beschreibung FSYS.SDW
436cdf0e10cSrcweir |* Ersterstellung MI 02.06.93
437cdf0e10cSrcweir |* Letzte Aenderung MI 02.06.93
438cdf0e10cSrcweir |*
439cdf0e10cSrcweir *************************************************************************/
440cdf0e10cSrcweir
Dir(const DirEntry & rDirEntry,DirEntryKind nKindFlags)441cdf0e10cSrcweir Dir::Dir( const DirEntry& rDirEntry, DirEntryKind nKindFlags ):
442cdf0e10cSrcweir DirEntry( rDirEntry ),
443cdf0e10cSrcweir pReader( 0 )
444cdf0e10cSrcweir {
445cdf0e10cSrcweir DBG_CTOR( Dir, NULL );
446cdf0e10cSrcweir
447cdf0e10cSrcweir Construct( nKindFlags );
448cdf0e10cSrcweir Reset();
449cdf0e10cSrcweir }
450cdf0e10cSrcweir
451cdf0e10cSrcweir /*************************************************************************
452cdf0e10cSrcweir |*
453cdf0e10cSrcweir |* Dir::Dir()
454cdf0e10cSrcweir |*
455cdf0e10cSrcweir |* Beschreibung FSYS.SDW
456cdf0e10cSrcweir |* Ersterstellung MI 16.05.91
457cdf0e10cSrcweir |* Letzte Aenderung MA 04.11.91
458cdf0e10cSrcweir |*
459cdf0e10cSrcweir *************************************************************************/
460cdf0e10cSrcweir
Dir()461cdf0e10cSrcweir Dir::Dir():
462cdf0e10cSrcweir pReader( 0 )
463cdf0e10cSrcweir {
464cdf0e10cSrcweir DBG_CTOR( Dir, NULL );
465cdf0e10cSrcweir
466cdf0e10cSrcweir pLst = NULL;
467cdf0e10cSrcweir pSortLst = NULL;
468cdf0e10cSrcweir pStatLst = NULL;
469cdf0e10cSrcweir eAttrMask = FSYS_KIND_ALL;
470cdf0e10cSrcweir aNameMask = String("*", osl_getThreadTextEncoding());
471cdf0e10cSrcweir }
472cdf0e10cSrcweir
473cdf0e10cSrcweir /*************************************************************************
474cdf0e10cSrcweir |*
475cdf0e10cSrcweir |* Dir::~Dir()
476cdf0e10cSrcweir |*
477cdf0e10cSrcweir |* Beschreibung FSYS.SDW
478cdf0e10cSrcweir |* Ersterstellung MI 16.05.91
479cdf0e10cSrcweir |* Letzte Aenderung MA 04.11.91
480cdf0e10cSrcweir |*
481cdf0e10cSrcweir *************************************************************************/
482cdf0e10cSrcweir
~Dir()483cdf0e10cSrcweir Dir::~Dir()
484cdf0e10cSrcweir {
485cdf0e10cSrcweir DBG_DTOR( Dir, NULL );
486cdf0e10cSrcweir
487cdf0e10cSrcweir // alle DirEntries aus der Liste entfernen und deren Speicher freigeben
488cdf0e10cSrcweir if ( pLst )
489cdf0e10cSrcweir {
490cdf0e10cSrcweir DirEntry* pEntry = pLst->First();
491cdf0e10cSrcweir while (pEntry)
492cdf0e10cSrcweir {
493cdf0e10cSrcweir DirEntry* pNext = pLst->Next();
494cdf0e10cSrcweir delete pEntry;
495cdf0e10cSrcweir pEntry = pNext;
496cdf0e10cSrcweir }
497cdf0e10cSrcweir pLst->Clear();
498cdf0e10cSrcweir
499cdf0e10cSrcweir delete pLst;
500cdf0e10cSrcweir }
501cdf0e10cSrcweir
502cdf0e10cSrcweir // alle Sorts aus der Liste entfernen und deren Speicher freigeben
503cdf0e10cSrcweir if ( pSortLst )
504cdf0e10cSrcweir {
505cdf0e10cSrcweir FSysSort* pEntry = pSortLst->First();
506cdf0e10cSrcweir while (pEntry)
507cdf0e10cSrcweir {
508cdf0e10cSrcweir FSysSort* pNext = pSortLst->Next();
509cdf0e10cSrcweir delete pEntry;
510cdf0e10cSrcweir pEntry = pNext;
511cdf0e10cSrcweir }
512cdf0e10cSrcweir pSortLst->Clear();
513cdf0e10cSrcweir
514cdf0e10cSrcweir delete pSortLst;
515cdf0e10cSrcweir }
516cdf0e10cSrcweir
517cdf0e10cSrcweir // alle FileStat's aus der Liste entfernen und deren Speicher freigeben
518cdf0e10cSrcweir if ( pStatLst )
519cdf0e10cSrcweir {
520cdf0e10cSrcweir FileStat* pEntry = pStatLst->First();
521cdf0e10cSrcweir while (pEntry)
522cdf0e10cSrcweir {
523cdf0e10cSrcweir FileStat* pNext = pStatLst->Next();
524cdf0e10cSrcweir delete pEntry;
525cdf0e10cSrcweir pEntry = pNext;
526cdf0e10cSrcweir }
527cdf0e10cSrcweir pStatLst->Clear();
528cdf0e10cSrcweir delete pStatLst;
529cdf0e10cSrcweir }
530cdf0e10cSrcweir
531cdf0e10cSrcweir // ggf. laufenden Reader freigeben
532cdf0e10cSrcweir delete pReader;
533cdf0e10cSrcweir }
534cdf0e10cSrcweir
535cdf0e10cSrcweir /*************************************************************************
536cdf0e10cSrcweir |*
537cdf0e10cSrcweir |* Dir::ImpSetSort()
538cdf0e10cSrcweir |*
539cdf0e10cSrcweir |* Beschreibung FSYS.SDW
540cdf0e10cSrcweir |* Ersterstellung MA 04.11.91
541cdf0e10cSrcweir |* Letzte Aenderung MI 05.02.92
542cdf0e10cSrcweir |*
543cdf0e10cSrcweir *************************************************************************/
544cdf0e10cSrcweir
ImpSetSort(std::va_list pArgs,int nFirstSort)545cdf0e10cSrcweir FSysError Dir::ImpSetSort( std::va_list pArgs, int nFirstSort )
546cdf0e10cSrcweir {
547cdf0e10cSrcweir sal_Bool bLast;
548cdf0e10cSrcweir FSysSort *pSort;
549cdf0e10cSrcweir FSysSortList *pNewSortLst = new FSysSortList;
550cdf0e10cSrcweir
551cdf0e10cSrcweir *( pSort = new FSysSort ) = nFirstSort;
552cdf0e10cSrcweir do
553cdf0e10cSrcweir {
554cdf0e10cSrcweir // letztes Kriterium?
555cdf0e10cSrcweir bLast = FSYS_SORT_END == (*pSort & FSYS_SORT_END);
556cdf0e10cSrcweir *pSort &= ~FSYS_SORT_END;
557cdf0e10cSrcweir
558cdf0e10cSrcweir FSysSort nSort = *pSort & ~(sal_uInt16)FSYS_SORT_ASCENDING
559cdf0e10cSrcweir & ~(sal_uInt16)FSYS_SORT_DESCENDING;
560cdf0e10cSrcweir
561cdf0e10cSrcweir // g"utliges Sortierkriterium?
562cdf0e10cSrcweir if ( ( nSort == FSYS_SORT_NAME ) ||
563cdf0e10cSrcweir ( nSort == FSYS_SORT_SIZE ) ||
564cdf0e10cSrcweir ( nSort == FSYS_SORT_EXT ) ||
565cdf0e10cSrcweir ( nSort == FSYS_SORT_CREATED ) ||
566cdf0e10cSrcweir ( nSort == FSYS_SORT_MODIFYED ) ||
567cdf0e10cSrcweir ( nSort == FSYS_SORT_ACCESSED ) ||
568cdf0e10cSrcweir ( nSort == FSYS_SORT_KIND ) )
569cdf0e10cSrcweir {
570cdf0e10cSrcweir pNewSortLst->Insert( pSort, APPEND );
571cdf0e10cSrcweir *(pSort = new FSysSort) = va_arg( pArgs, FSysSort );
572cdf0e10cSrcweir }
573cdf0e10cSrcweir else
574cdf0e10cSrcweir { // ungueltiger Sort oder FSYS_SORT_NONE
575cdf0e10cSrcweir FSysSort* pEntry = pNewSortLst->First();
576cdf0e10cSrcweir while (pEntry)
577cdf0e10cSrcweir {
578cdf0e10cSrcweir FSysSort* pNext = pNewSortLst->Next();
579cdf0e10cSrcweir delete pEntry;
580cdf0e10cSrcweir pEntry = pNext;
581cdf0e10cSrcweir }
582cdf0e10cSrcweir pNewSortLst->Clear();
583cdf0e10cSrcweir delete pNewSortLst;
584cdf0e10cSrcweir if ( *pSort == FSYS_SORT_NONE )
585cdf0e10cSrcweir {
586cdf0e10cSrcweir delete pSort;
587cdf0e10cSrcweir if ( pSortLst )
588cdf0e10cSrcweir delete pSortLst;
589cdf0e10cSrcweir return FSYS_ERR_OK;
590cdf0e10cSrcweir }
591cdf0e10cSrcweir else
592cdf0e10cSrcweir {
593cdf0e10cSrcweir delete pSort;
594cdf0e10cSrcweir return FSYS_ERR_NOTSUPPORTED;
595cdf0e10cSrcweir }
596cdf0e10cSrcweir }
597cdf0e10cSrcweir } while ( !bLast );
598cdf0e10cSrcweir
599cdf0e10cSrcweir va_end( pArgs );
600cdf0e10cSrcweir delete pSort; // JP:6.3.00 - delete the initial pointer
601cdf0e10cSrcweir
602cdf0e10cSrcweir //Enfernen der alten Sort-Elemente
603cdf0e10cSrcweir if ( pSortLst )
604cdf0e10cSrcweir {
605cdf0e10cSrcweir FSysSort* pEntry = pSortLst->First();
606cdf0e10cSrcweir while (pEntry)
607cdf0e10cSrcweir {
608cdf0e10cSrcweir FSysSort* pNext = pSortLst->Next();
609cdf0e10cSrcweir delete pEntry;
610cdf0e10cSrcweir pEntry = pNext;
611cdf0e10cSrcweir }
612cdf0e10cSrcweir pSortLst->Clear();
613cdf0e10cSrcweir delete pSortLst;
614cdf0e10cSrcweir }
615cdf0e10cSrcweir pSortLst = pNewSortLst;
616cdf0e10cSrcweir
617cdf0e10cSrcweir //Jetzt noch neu Sortieren...
618cdf0e10cSrcweir
619cdf0e10cSrcweir //Wenn keine FileStats da sind, aber nun welche gebraucht werden,
620cdf0e10cSrcweir //ist der Aufruf von Update() die einfachste Moeglichkeit
621cdf0e10cSrcweir if ( !pStatLst && pSortLst )
622cdf0e10cSrcweir {
623cdf0e10cSrcweir pSortLst->First();
624cdf0e10cSrcweir do
625cdf0e10cSrcweir {
626cdf0e10cSrcweir if ( *(pSortLst->GetCurObject()) &
627cdf0e10cSrcweir ( FSYS_SORT_CREATED | FSYS_SORT_MODIFYED | FSYS_SORT_SIZE |
628cdf0e10cSrcweir FSYS_SORT_ACCESSED | FSYS_SORT_KIND ) )
629cdf0e10cSrcweir {
630cdf0e10cSrcweir Update();
631cdf0e10cSrcweir return FSYS_ERR_OK;
632cdf0e10cSrcweir }
633cdf0e10cSrcweir } while ( !pStatLst && pSortLst->Next() );
634cdf0e10cSrcweir }
635cdf0e10cSrcweir
636cdf0e10cSrcweir if ( pLst ) { //Keine DirEntry's, kein Sort.
637cdf0e10cSrcweir DirEntryList *pOldLst = pLst; //alte Liste merken
638cdf0e10cSrcweir pLst = new DirEntryList(); //neue Liste (zu Sortieren)
639cdf0e10cSrcweir
640cdf0e10cSrcweir FileStatList *pOldStatLst = NULL; //alte StatListe merken
641cdf0e10cSrcweir if ( pStatLst ) {
642cdf0e10cSrcweir pOldStatLst = pStatLst;
643cdf0e10cSrcweir pStatLst = new FileStatList(); //neue StatListe (zu Sortieren)
644cdf0e10cSrcweir }
645cdf0e10cSrcweir pOldLst->First();
646cdf0e10cSrcweir do
647cdf0e10cSrcweir {
648cdf0e10cSrcweir //Sortiertes Einfuegen der Elemente aus den gemerkten Listen
649cdf0e10cSrcweir //in die 'richtigen' Listen
650cdf0e10cSrcweir if ( pOldStatLst )
651cdf0e10cSrcweir ImpSortedInsert( pOldLst->GetCurObject(),
652cdf0e10cSrcweir pOldStatLst->GetObject( pOldLst->GetCurPos() ) );
653cdf0e10cSrcweir else
654cdf0e10cSrcweir ImpSortedInsert( pOldLst->GetCurObject(), NULL );
655cdf0e10cSrcweir } while( pOldLst->Next() );
656cdf0e10cSrcweir
657cdf0e10cSrcweir delete pOldLst;
658cdf0e10cSrcweir if ( pOldStatLst )
659cdf0e10cSrcweir delete pOldStatLst;
660cdf0e10cSrcweir }
661cdf0e10cSrcweir return FSYS_ERR_OK;
662cdf0e10cSrcweir }
663cdf0e10cSrcweir
664cdf0e10cSrcweir /*************************************************************************
665cdf0e10cSrcweir |*
666cdf0e10cSrcweir |* Dir::SetSort()
667cdf0e10cSrcweir |*
668cdf0e10cSrcweir |* Beschreibung FSYS.SDW
669cdf0e10cSrcweir |* Ersterstellung MA 04.11.91
670cdf0e10cSrcweir |* Letzte Aenderung MI 05.02.92
671cdf0e10cSrcweir |*
672cdf0e10cSrcweir *************************************************************************/
673cdf0e10cSrcweir
SetSort(FSysSort nSort,...)674cdf0e10cSrcweir FSysError Dir::SetSort( FSysSort nSort, ... )
675cdf0e10cSrcweir {
676cdf0e10cSrcweir std::va_list pArgs;
677cdf0e10cSrcweir va_start( pArgs, nSort );
678cdf0e10cSrcweir return ImpSetSort( pArgs, nSort );
679cdf0e10cSrcweir }
680cdf0e10cSrcweir
681cdf0e10cSrcweir /*************************************************************************
682cdf0e10cSrcweir |*
683cdf0e10cSrcweir |* Dir::operator[]()
684cdf0e10cSrcweir |*
685cdf0e10cSrcweir |* Beschreibung FSYS.SDW
686cdf0e10cSrcweir |* Ersterstellung MI 16.05.91
687cdf0e10cSrcweir |* Letzte Aenderung MI 16.05.91
688cdf0e10cSrcweir |*
689cdf0e10cSrcweir *************************************************************************/
690cdf0e10cSrcweir
operator [](sal_uInt16 nIndex) const691cdf0e10cSrcweir DirEntry& Dir::operator[] ( sal_uInt16 nIndex ) const
692cdf0e10cSrcweir {
693cdf0e10cSrcweir DBG_ASSERT( nIndex < Count(), "Dir::operator[] : nIndex > Count()" );
694cdf0e10cSrcweir
695cdf0e10cSrcweir DirEntry *pEntry = pLst->GetObject( nIndex );
696cdf0e10cSrcweir return *pEntry;
697cdf0e10cSrcweir }
698cdf0e10cSrcweir
699cdf0e10cSrcweir /*************************************************************************
700cdf0e10cSrcweir |*
701cdf0e10cSrcweir |* Dir::operator+= ()
702cdf0e10cSrcweir |*
703cdf0e10cSrcweir |* Beschreibung FSYS.SDW
704cdf0e10cSrcweir |* Ersterstellung MI 16.05.91
705cdf0e10cSrcweir |* Letzte Aenderung MI 16.05.91
706cdf0e10cSrcweir |*
707cdf0e10cSrcweir *************************************************************************/
708cdf0e10cSrcweir
operator +=(const Dir & rDir)709cdf0e10cSrcweir Dir& Dir::operator+=( const Dir& rDir )
710cdf0e10cSrcweir {
711cdf0e10cSrcweir // ggf. erst den Rest lesen
712cdf0e10cSrcweir if ( pReader )
713cdf0e10cSrcweir Scan( USHRT_MAX );
714cdf0e10cSrcweir DBG_ASSERT( !rDir.pReader, "Dir::+= with incomplete Dir" );
715cdf0e10cSrcweir
716cdf0e10cSrcweir // ggf. initiale Liste erzeugen
717cdf0e10cSrcweir if ( !pLst )
718cdf0e10cSrcweir pLst = new DirEntryList();
719cdf0e10cSrcweir
720cdf0e10cSrcweir //Verlangen die Sortierkriterien FileStat's?
721cdf0e10cSrcweir sal_Bool bStat = sal_False;
722cdf0e10cSrcweir if ( pSortLst ) {
723cdf0e10cSrcweir pSortLst->First();
724cdf0e10cSrcweir do {
725cdf0e10cSrcweir if ( *(pSortLst->GetCurObject()) &
726cdf0e10cSrcweir ( FSYS_SORT_CREATED | FSYS_SORT_MODIFYED | FSYS_SORT_SIZE |
727cdf0e10cSrcweir FSYS_SORT_ACCESSED | FSYS_SORT_KIND ) )
728cdf0e10cSrcweir bStat = sal_True;
729cdf0e10cSrcweir } while ( !bStat && pSortLst->Next() );
730cdf0e10cSrcweir }
731cdf0e10cSrcweir FileStat * stat = NULL;
732cdf0e10cSrcweir for ( sal_uInt16 nNr = 0; nNr < rDir.Count(); nNr++ )
733cdf0e10cSrcweir {
734cdf0e10cSrcweir if ( bStat )
735cdf0e10cSrcweir {
736cdf0e10cSrcweir if ( rDir.pStatLst )
737cdf0e10cSrcweir stat = new FileStat( *rDir.pStatLst->GetObject(nNr) );
738cdf0e10cSrcweir else
739cdf0e10cSrcweir stat = new FileStat( rDir[nNr] );
740cdf0e10cSrcweir }
741cdf0e10cSrcweir ImpSortedInsert( new DirEntry( rDir[nNr] ), stat );
742cdf0e10cSrcweir }
743cdf0e10cSrcweir return *this;
744cdf0e10cSrcweir }
745cdf0e10cSrcweir
746cdf0e10cSrcweir /*************************************************************************
747cdf0e10cSrcweir |*
748cdf0e10cSrcweir |* Dir::Count()
749cdf0e10cSrcweir |*
750cdf0e10cSrcweir |* Beschreibung FSYS.SDW
751cdf0e10cSrcweir |* Ersterstellung MI 16.05.91
752cdf0e10cSrcweir |* Letzte Aenderung MI 18.09.96
753cdf0e10cSrcweir |*
754cdf0e10cSrcweir *************************************************************************/
755cdf0e10cSrcweir
756cdf0e10cSrcweir
Count(sal_Bool bUpdated) const757cdf0e10cSrcweir sal_uInt16 Dir::Count( sal_Bool bUpdated ) const
758cdf0e10cSrcweir {
759cdf0e10cSrcweir // ggf. erst den Rest lesen
760cdf0e10cSrcweir if ( bUpdated && pReader )
761cdf0e10cSrcweir ((Dir*)this)->Scan( USHRT_MAX );
762cdf0e10cSrcweir
763cdf0e10cSrcweir return pLst == NULL ? 0 : (sal_uInt16) pLst->Count();
764cdf0e10cSrcweir }
765