189b56da7SAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
389b56da7SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
489b56da7SAndrew Rist * or more contributor license agreements. See the NOTICE file
589b56da7SAndrew Rist * distributed with this work for additional information
689b56da7SAndrew Rist * regarding copyright ownership. The ASF licenses this file
789b56da7SAndrew Rist * to you under the Apache License, Version 2.0 (the
889b56da7SAndrew Rist * "License"); you may not use this file except in compliance
989b56da7SAndrew Rist * with the License. You may obtain a copy of the License at
10cdf0e10cSrcweir *
1189b56da7SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir *
1389b56da7SAndrew Rist * Unless required by applicable law or agreed to in writing,
1489b56da7SAndrew Rist * software distributed under the License is distributed on an
1589b56da7SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
1689b56da7SAndrew Rist * KIND, either express or implied. See the License for the
1789b56da7SAndrew Rist * specific language governing permissions and limitations
1889b56da7SAndrew Rist * under the License.
19cdf0e10cSrcweir *
2089b56da7SAndrew Rist *************************************************************/
2189b56da7SAndrew Rist
22cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
23cdf0e10cSrcweir #include "precompiled_tools.hxx"
24cdf0e10cSrcweir
25cdf0e10cSrcweir #if !defined UNX
26cdf0e10cSrcweir #include <io.h>
27cdf0e10cSrcweir #include <process.h>
28cdf0e10cSrcweir #endif
29cdf0e10cSrcweir
30cdf0e10cSrcweir #if defined(UNX) || defined(OS2)
31cdf0e10cSrcweir #include <unistd.h>
32cdf0e10cSrcweir #include <sys/types.h>
33cdf0e10cSrcweir #include <sys/stat.h>
34cdf0e10cSrcweir #endif
35cdf0e10cSrcweir
36cdf0e10cSrcweir #include <ctype.h>
37cdf0e10cSrcweir #include <errno.h>
38cdf0e10cSrcweir #include <stdlib.h>
39cdf0e10cSrcweir #include <stdio.h>
40cdf0e10cSrcweir #include <string.h>
41cdf0e10cSrcweir #include <tools/debug.hxx>
42cdf0e10cSrcweir #include <tools/list.hxx>
43cdf0e10cSrcweir #include "comdep.hxx"
44cdf0e10cSrcweir #include <tools/fsys.hxx>
45cdf0e10cSrcweir #define _TOOLS_HXX
46cdf0e10cSrcweir #include <tools/urlobj.hxx>
47cdf0e10cSrcweir
48cdf0e10cSrcweir #ifdef UNX
49cdf0e10cSrcweir #define _MAX_PATH 260
50cdf0e10cSrcweir #endif
51cdf0e10cSrcweir #include <tools/stream.hxx>
52cdf0e10cSrcweir
53cdf0e10cSrcweir #ifndef _VOS_MUTEX_HXX
54cdf0e10cSrcweir #include <vos/mutex.hxx>
55cdf0e10cSrcweir #endif
56cdf0e10cSrcweir
57cdf0e10cSrcweir #include <osl/file.hxx>
58cdf0e10cSrcweir #include <rtl/instance.hxx>
59cdf0e10cSrcweir
60cdf0e10cSrcweir
61cdf0e10cSrcweir using namespace osl;
62cdf0e10cSrcweir using namespace rtl;
63cdf0e10cSrcweir
64cdf0e10cSrcweir int ApiRet2ToSolarError_Impl( int nApiRet );
65cdf0e10cSrcweir
66cdf0e10cSrcweir //--------------------------------------------------------------------
Sys2SolarError_Impl(int nSysErr)67cdf0e10cSrcweir int Sys2SolarError_Impl( int nSysErr )
68cdf0e10cSrcweir {
69cdf0e10cSrcweir switch ( nSysErr )
70cdf0e10cSrcweir {
71cdf0e10cSrcweir #ifdef WNT
72cdf0e10cSrcweir case NO_ERROR: return ERRCODE_NONE;
73cdf0e10cSrcweir case ERROR_INVALID_FUNCTION: return ERRCODE_IO_GENERAL;
74cdf0e10cSrcweir case ERROR_FILE_NOT_FOUND: return ERRCODE_IO_NOTEXISTS;
75cdf0e10cSrcweir case ERROR_PATH_NOT_FOUND: return ERRCODE_IO_NOTEXISTSPATH;
76cdf0e10cSrcweir case ERROR_TOO_MANY_OPEN_FILES: return ERRCODE_IO_TOOMANYOPENFILES;
77cdf0e10cSrcweir case ERROR_ACCESS_DENIED: return ERRCODE_IO_ACCESSDENIED;
78cdf0e10cSrcweir case ERROR_INVALID_HANDLE: return ERRCODE_IO_GENERAL;
79cdf0e10cSrcweir case ERROR_NOT_ENOUGH_MEMORY: return ERRCODE_IO_OUTOFMEMORY;
80cdf0e10cSrcweir case ERROR_INVALID_BLOCK: return ERRCODE_IO_GENERAL;
81cdf0e10cSrcweir // case ERROR_BAD_ENVIRONMENT: return ERRCODE_IO_;
82cdf0e10cSrcweir case ERROR_BAD_FORMAT: return ERRCODE_IO_WRONGFORMAT;
83cdf0e10cSrcweir case ERROR_INVALID_ACCESS: return ERRCODE_IO_ACCESSDENIED;
84cdf0e10cSrcweir // case ERROR_INVALID_DATA: return ERRCODE_IO_;
85cdf0e10cSrcweir case ERROR_INVALID_DRIVE: return ERRCODE_IO_INVALIDDEVICE;
86cdf0e10cSrcweir case ERROR_CURRENT_DIRECTORY: return ERRCODE_IO_CURRENTDIR;
87cdf0e10cSrcweir case ERROR_NOT_SAME_DEVICE: return ERRCODE_IO_NOTSAMEDEVICE;
88cdf0e10cSrcweir // case ERROR_NO_MORE_FILES: return ERRCODE_IO_;
89cdf0e10cSrcweir case ERROR_WRITE_PROTECT: return ERRCODE_IO_CANTWRITE;
90cdf0e10cSrcweir case ERROR_BAD_UNIT: return ERRCODE_IO_INVALIDDEVICE;
91cdf0e10cSrcweir case ERROR_NOT_READY: return ERRCODE_IO_DEVICENOTREADY;
92cdf0e10cSrcweir case ERROR_BAD_COMMAND: return ERRCODE_IO_GENERAL;
93cdf0e10cSrcweir case ERROR_CRC: return ERRCODE_IO_BADCRC;
94cdf0e10cSrcweir case ERROR_BAD_LENGTH: return ERRCODE_IO_INVALIDLENGTH;
95cdf0e10cSrcweir case ERROR_SEEK: return ERRCODE_IO_CANTSEEK;
96cdf0e10cSrcweir case ERROR_NOT_DOS_DISK: return ERRCODE_IO_WRONGFORMAT;
97cdf0e10cSrcweir case ERROR_SECTOR_NOT_FOUND: return ERRCODE_IO_GENERAL;
98cdf0e10cSrcweir case ERROR_WRITE_FAULT: return ERRCODE_IO_CANTWRITE;
99cdf0e10cSrcweir case ERROR_READ_FAULT: return ERRCODE_IO_CANTREAD;
100cdf0e10cSrcweir case ERROR_GEN_FAILURE: return ERRCODE_IO_GENERAL;
101cdf0e10cSrcweir case ERROR_SHARING_VIOLATION: return ERRCODE_IO_LOCKVIOLATION;
102cdf0e10cSrcweir case ERROR_LOCK_VIOLATION: return ERRCODE_IO_LOCKVIOLATION;
103cdf0e10cSrcweir case ERROR_WRONG_DISK: return ERRCODE_IO_INVALIDDEVICE;
104cdf0e10cSrcweir case ERROR_NOT_SUPPORTED: return ERRCODE_IO_NOTSUPPORTED;
105cdf0e10cSrcweir #else
106cdf0e10cSrcweir case 0: return ERRCODE_NONE;
107cdf0e10cSrcweir case ENOENT: return ERRCODE_IO_NOTEXISTS;
108cdf0e10cSrcweir case EACCES: return ERRCODE_IO_ACCESSDENIED;
109cdf0e10cSrcweir case EEXIST: return ERRCODE_IO_ALREADYEXISTS;
110cdf0e10cSrcweir case EINVAL: return ERRCODE_IO_INVALIDPARAMETER;
111cdf0e10cSrcweir case EMFILE: return ERRCODE_IO_TOOMANYOPENFILES;
112cdf0e10cSrcweir case ENOMEM: return ERRCODE_IO_OUTOFMEMORY;
113cdf0e10cSrcweir case ENOSPC: return ERRCODE_IO_OUTOFSPACE;
114cdf0e10cSrcweir #endif
115cdf0e10cSrcweir }
116cdf0e10cSrcweir
11786e1cf34SPedro Giffuni DBG_TRACE1( "FSys: unknown system error %d occurred", nSysErr );
118cdf0e10cSrcweir return FSYS_ERR_UNKNOWN;
119cdf0e10cSrcweir }
120cdf0e10cSrcweir
121cdf0e10cSrcweir //--------------------------------------------------------------------
122cdf0e10cSrcweir
123cdf0e10cSrcweir #ifndef BOOTSTRAP
124cdf0e10cSrcweir
125cdf0e10cSrcweir FSysRedirector* FSysRedirector::_pRedirector = 0;
126cdf0e10cSrcweir sal_Bool FSysRedirector::_bEnabled = sal_True;
127cdf0e10cSrcweir #ifdef UNX
128cdf0e10cSrcweir sal_Bool bInRedirection = sal_True;
129cdf0e10cSrcweir #else
130cdf0e10cSrcweir sal_Bool bInRedirection = sal_False;
131cdf0e10cSrcweir #endif
132cdf0e10cSrcweir static vos:: OMutex * pRedirectMutex = 0;
133cdf0e10cSrcweir
134cdf0e10cSrcweir //------------------------------------------------------------------------
Register(FSysRedirector * pRedirector)135cdf0e10cSrcweir void FSysRedirector::Register( FSysRedirector *pRedirector )
136cdf0e10cSrcweir {
137cdf0e10cSrcweir if ( pRedirector )
138cdf0e10cSrcweir pRedirectMutex = new vos:: OMutex ;
139cdf0e10cSrcweir else
140cdf0e10cSrcweir DELETEZ( pRedirectMutex );
141cdf0e10cSrcweir _pRedirector = pRedirector;
142cdf0e10cSrcweir }
143cdf0e10cSrcweir
144cdf0e10cSrcweir //------------------------------------------------------------------------
145cdf0e10cSrcweir
DoRedirect(String & rPath)146cdf0e10cSrcweir void FSysRedirector::DoRedirect( String &rPath )
147cdf0e10cSrcweir {
148cdf0e10cSrcweir String aURL(rPath);
149cdf0e10cSrcweir
150cdf0e10cSrcweir // if redirection is disabled or not even registered do nothing
151cdf0e10cSrcweir if ( !_bEnabled || !pRedirectMutex )
152cdf0e10cSrcweir return;
153cdf0e10cSrcweir
154cdf0e10cSrcweir // redirect only removable or remote volumes
155cdf0e10cSrcweir if ( !IsRedirectable_Impl( ByteString( aURL, osl_getThreadTextEncoding() ) ) )
156cdf0e10cSrcweir return;
157cdf0e10cSrcweir
158*73fec56aSmseidel // Redirection is accessible only by one thread per time
159*73fec56aSmseidel // don't move the guard behind the bInRedirection check!!!
160cdf0e10cSrcweir // think of nested calls (when called from callback)
161cdf0e10cSrcweir vos:: OGuard aGuard( pRedirectMutex );
162cdf0e10cSrcweir
163*73fec56aSmseidel // if already in redirection, don't redirect
164cdf0e10cSrcweir if ( bInRedirection )
165cdf0e10cSrcweir return;
166cdf0e10cSrcweir
167*73fec56aSmseidel // don't redirect on nested calls
168cdf0e10cSrcweir bInRedirection = sal_True;
169cdf0e10cSrcweir
170cdf0e10cSrcweir // convert to URL
171cdf0e10cSrcweir #ifndef UNX
172cdf0e10cSrcweir for ( sal_Unicode *p = (sal_Unicode*)aURL.GetBuffer(); *p; ++p )
173cdf0e10cSrcweir if ( '\\' == *p ) *p = '/';
174cdf0e10cSrcweir else if ( ':' == *p ) *p = '|';
175cdf0e10cSrcweir #endif
176cdf0e10cSrcweir
177cdf0e10cSrcweir aURL.Insert( String("file:///", osl_getThreadTextEncoding()), 0 );
178cdf0e10cSrcweir
179cdf0e10cSrcweir // do redirection
180cdf0e10cSrcweir Redirector();
181cdf0e10cSrcweir
182cdf0e10cSrcweir bInRedirection = sal_False;
183cdf0e10cSrcweir return;
184cdf0e10cSrcweir }
185cdf0e10cSrcweir
186cdf0e10cSrcweir //------------------------------------------------------------------------
187cdf0e10cSrcweir
Redirector()188cdf0e10cSrcweir FSysRedirector* FSysRedirector::Redirector()
189cdf0e10cSrcweir {
190cdf0e10cSrcweir if ( !_pRedirector )
191cdf0e10cSrcweir Register( new FSysRedirector );
192cdf0e10cSrcweir return _pRedirector;
193cdf0e10cSrcweir }
194cdf0e10cSrcweir
195cdf0e10cSrcweir #endif // BOOTSTRAP
196cdf0e10cSrcweir
197cdf0e10cSrcweir //--------------------------------------------------------------------
198cdf0e10cSrcweir
199cdf0e10cSrcweir class DirEntryStack: public List
200cdf0e10cSrcweir {
201cdf0e10cSrcweir public:
DirEntryStack()202cdf0e10cSrcweir DirEntryStack() {};
203cdf0e10cSrcweir ~DirEntryStack();
204cdf0e10cSrcweir
205cdf0e10cSrcweir inline void Push( DirEntry *pEntry );
206cdf0e10cSrcweir inline DirEntry* Pop();
207cdf0e10cSrcweir inline DirEntry* Top();
208cdf0e10cSrcweir inline DirEntry* Bottom();
209cdf0e10cSrcweir };
210cdf0e10cSrcweir
Push(DirEntry * pEntry)211cdf0e10cSrcweir inline void DirEntryStack::Push( DirEntry *pEntry )
212cdf0e10cSrcweir {
213cdf0e10cSrcweir List::Insert( pEntry, LIST_APPEND );
214cdf0e10cSrcweir }
215cdf0e10cSrcweir
Pop()216cdf0e10cSrcweir inline DirEntry* DirEntryStack::Pop()
217cdf0e10cSrcweir {
218cdf0e10cSrcweir return (DirEntry*) List::Remove( Count() - 1 );
219cdf0e10cSrcweir }
220cdf0e10cSrcweir
Top()221cdf0e10cSrcweir inline DirEntry* DirEntryStack::Top()
222cdf0e10cSrcweir {
223cdf0e10cSrcweir return (DirEntry*) List::GetObject( Count() - 1 );
224cdf0e10cSrcweir }
225cdf0e10cSrcweir
Bottom()226cdf0e10cSrcweir inline DirEntry* DirEntryStack::Bottom()
227cdf0e10cSrcweir {
228cdf0e10cSrcweir return (DirEntry*) List::GetObject( 0 );
229cdf0e10cSrcweir }
230cdf0e10cSrcweir
231cdf0e10cSrcweir //--------------------------------------------------------------------
232cdf0e10cSrcweir
233cdf0e10cSrcweir DBG_NAME( DirEntry );
234cdf0e10cSrcweir
235cdf0e10cSrcweir /*************************************************************************
236cdf0e10cSrcweir |*
237cdf0e10cSrcweir |* DirEntry::~DirEntryStack()
238cdf0e10cSrcweir |*
239cdf0e10cSrcweir |* Beschreibung FSYS.SDW
240cdf0e10cSrcweir |* Ersterstellung MI 26.04.91
241cdf0e10cSrcweir |* Letzte Aenderung MI 04.07.91
242cdf0e10cSrcweir |*
243cdf0e10cSrcweir *************************************************************************/
244cdf0e10cSrcweir
~DirEntryStack()245cdf0e10cSrcweir DirEntryStack::~DirEntryStack()
246cdf0e10cSrcweir {
247cdf0e10cSrcweir while ( Count() )
248cdf0e10cSrcweir delete Pop();
249cdf0e10cSrcweir }
250cdf0e10cSrcweir
251cdf0e10cSrcweir /*************************************************************************
252cdf0e10cSrcweir |*
253cdf0e10cSrcweir |* ImpCheckDirEntry()
254cdf0e10cSrcweir |*
255cdf0e10cSrcweir |* Beschreibung Pruefung eines DirEntry fuer DBG_UTIL
256cdf0e10cSrcweir |* Parameter void* p Zeiger auf den DirEntry
257cdf0e10cSrcweir |* Return-Wert char* Fehlermeldungs-TExtension oder NULL
258cdf0e10cSrcweir |* Ersterstellung MI 16.07.91
259cdf0e10cSrcweir |* Letzte Aenderung MI 26.05.93
260cdf0e10cSrcweir |*
261cdf0e10cSrcweir *************************************************************************/
262cdf0e10cSrcweir
263cdf0e10cSrcweir #ifdef DBG_UTIL
ImpCheckDirEntry(const void * p)264cdf0e10cSrcweir const char* ImpCheckDirEntry( const void* p )
265cdf0e10cSrcweir {
266cdf0e10cSrcweir DirEntry* p0 = (DirEntry*)p;
267cdf0e10cSrcweir
268cdf0e10cSrcweir if ( p0->pParent )
269cdf0e10cSrcweir DBG_CHKOBJ( p0->pParent, DirEntry, ImpCheckDirEntry );
270cdf0e10cSrcweir
271cdf0e10cSrcweir return NULL;
272cdf0e10cSrcweir }
273cdf0e10cSrcweir #endif
274cdf0e10cSrcweir
275cdf0e10cSrcweir /*************************************************************************
276cdf0e10cSrcweir |*
277cdf0e10cSrcweir |* ImplCutPath()
278cdf0e10cSrcweir |*
279cdf0e10cSrcweir |* Beschreibung Fuegt ... ein, damit maximal nMaxChars lang
280cdf0e10cSrcweir |* Ersterstellung MI 06.04.94
281cdf0e10cSrcweir |* Letzte Aenderung DV 24.06.96
282cdf0e10cSrcweir |*
283cdf0e10cSrcweir *************************************************************************/
284cdf0e10cSrcweir
ImplCutPath(const ByteString & rStr,sal_uInt16 nMax,char cAccDel)285cdf0e10cSrcweir ByteString ImplCutPath( const ByteString& rStr, sal_uInt16 nMax, char cAccDel )
286cdf0e10cSrcweir {
287cdf0e10cSrcweir sal_uInt16 nMaxPathLen = nMax;
288cdf0e10cSrcweir ByteString aCutPath( rStr );
289cdf0e10cSrcweir sal_Bool bInsertPrefix = sal_False;
290cdf0e10cSrcweir sal_uInt16 nBegin = aCutPath.Search( cAccDel );
291cdf0e10cSrcweir
292cdf0e10cSrcweir if( nBegin == STRING_NOTFOUND )
293cdf0e10cSrcweir nBegin = 0;
294cdf0e10cSrcweir else
295cdf0e10cSrcweir nMaxPathLen += 2; // fuer Prefix <Laufwerk>:
296cdf0e10cSrcweir
297cdf0e10cSrcweir while( aCutPath.Len() > nMaxPathLen )
298cdf0e10cSrcweir {
299cdf0e10cSrcweir sal_uInt16 nEnd = aCutPath.Search( cAccDel, nBegin + 1 );
300cdf0e10cSrcweir sal_uInt16 nCount;
301cdf0e10cSrcweir
302cdf0e10cSrcweir if ( nEnd != STRING_NOTFOUND )
303cdf0e10cSrcweir {
304cdf0e10cSrcweir nCount = nEnd - nBegin;
305cdf0e10cSrcweir aCutPath.Erase( nBegin, nCount );
306cdf0e10cSrcweir bInsertPrefix = sal_True;
307cdf0e10cSrcweir }
308cdf0e10cSrcweir else
309cdf0e10cSrcweir break;
310cdf0e10cSrcweir }
311cdf0e10cSrcweir
312cdf0e10cSrcweir if ( aCutPath.Len() > nMaxPathLen )
313cdf0e10cSrcweir {
314cdf0e10cSrcweir for ( sal_uInt16 n = nMaxPathLen; n > nMaxPathLen/2; --n )
315cdf0e10cSrcweir if ( !ByteString(aCutPath.GetChar(n)).IsAlphaNumericAscii() )
316cdf0e10cSrcweir {
317cdf0e10cSrcweir aCutPath.Erase( n );
318cdf0e10cSrcweir aCutPath += "...";
319cdf0e10cSrcweir break;
320cdf0e10cSrcweir }
321cdf0e10cSrcweir }
322cdf0e10cSrcweir
323cdf0e10cSrcweir if ( bInsertPrefix )
324cdf0e10cSrcweir {
325cdf0e10cSrcweir ByteString aIns( cAccDel );
326cdf0e10cSrcweir aIns += "...";
327cdf0e10cSrcweir aCutPath.Insert( aIns, nBegin );
328cdf0e10cSrcweir }
329cdf0e10cSrcweir
330cdf0e10cSrcweir return aCutPath;
331cdf0e10cSrcweir }
332cdf0e10cSrcweir
333cdf0e10cSrcweir /*************************************************************************
334cdf0e10cSrcweir |*
335cdf0e10cSrcweir |* DirEntry::ImpParseOs2Name()
336cdf0e10cSrcweir |*
337cdf0e10cSrcweir |* Beschreibung FSYS.SDW
338cdf0e10cSrcweir |* Ersterstellung MI 26.04.91
339cdf0e10cSrcweir |* Letzte Aenderung MI 23.06.95
340cdf0e10cSrcweir |*
341cdf0e10cSrcweir *************************************************************************/
342cdf0e10cSrcweir
ImpParseOs2Name(const ByteString & rPfad,FSysPathStyle eStyle)343cdf0e10cSrcweir FSysError DirEntry::ImpParseOs2Name( const ByteString& rPfad, FSysPathStyle eStyle )
344cdf0e10cSrcweir {
345cdf0e10cSrcweir DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
346cdf0e10cSrcweir
347cdf0e10cSrcweir // die einzelnen Namen auf einen Stack packen
348cdf0e10cSrcweir String aPfad( rPfad, osl_getThreadTextEncoding() );
349cdf0e10cSrcweir DirEntryStack aStack;
350cdf0e10cSrcweir
351cdf0e10cSrcweir do
352cdf0e10cSrcweir {
353cdf0e10cSrcweir // den Namen vor dem ersten "\\" abspalten,
354cdf0e10cSrcweir // falls '\\' am Anfang, ist der Name '\\',
355cdf0e10cSrcweir // der Rest immer ohne die fuehrenden '\\'.
356cdf0e10cSrcweir // ein ":" trennt ebenfalls, gehoert aber zum Namen
357cdf0e10cSrcweir // den ersten '\\', '/' oder ':' suchen
358cdf0e10cSrcweir sal_uInt16 nPos;
359cdf0e10cSrcweir for ( nPos = 0;
360cdf0e10cSrcweir nPos < aPfad.Len() && //?O
361cdf0e10cSrcweir aPfad.GetChar(nPos) != '\\' && aPfad.GetChar(nPos) != '/' && //?O
362cdf0e10cSrcweir aPfad.GetChar(nPos) != ':'; //?O
363cdf0e10cSrcweir nPos++ )
364cdf0e10cSrcweir /* do nothing */;
365cdf0e10cSrcweir
366cdf0e10cSrcweir // ist der Name ein UNC Pathname?
367cdf0e10cSrcweir if ( nPos == 0 && aPfad.Len() > 1 &&
368cdf0e10cSrcweir ( ( aPfad.GetChar(0) == '\\' && aPfad.GetChar(1) == '\\' ) ||
369cdf0e10cSrcweir ( aPfad.GetChar(0) == '/' && aPfad.GetChar(1) == '/' ) ) )
370cdf0e10cSrcweir {
371cdf0e10cSrcweir for ( nPos = 2; aPfad.Len() > nPos; ++nPos )
372cdf0e10cSrcweir if ( aPfad.GetChar(nPos) == '\\' || aPfad.GetChar(nPos) == '/' )
373cdf0e10cSrcweir break;
374cdf0e10cSrcweir aName = ByteString( aPfad.Copy( 2, nPos-2 ), osl_getThreadTextEncoding() );
375cdf0e10cSrcweir aStack.Push( new DirEntry( aName, FSYS_FLAG_ABSROOT, eStyle ) );
376cdf0e10cSrcweir }
377cdf0e10cSrcweir // ist der Name die Root des aktuellen Drives?
378cdf0e10cSrcweir else if ( nPos == 0 && aPfad.Len() > 0 &&
379cdf0e10cSrcweir ( aPfad.GetChar(0) == '\\' || aPfad.GetChar(0) == '/' ) )
380cdf0e10cSrcweir {
381cdf0e10cSrcweir // Root-Directory des aktuellen Drives
382cdf0e10cSrcweir aStack.Push( new DirEntry( FSYS_FLAG_ABSROOT ) );
383cdf0e10cSrcweir }
384cdf0e10cSrcweir else
385cdf0e10cSrcweir {
386cdf0e10cSrcweir // ist der Name ein Drive?
387cdf0e10cSrcweir if ( nPos < aPfad.Len() && aPfad.GetChar(nPos) == ':' )
388cdf0e10cSrcweir {
389cdf0e10cSrcweir aName = ByteString( aPfad.Copy( 0, nPos + 1 ), osl_getThreadTextEncoding() );
390cdf0e10cSrcweir
391cdf0e10cSrcweir // ist der Name die Root des Drives
392cdf0e10cSrcweir if ( (nPos + 1) < aPfad.Len() &&
393cdf0e10cSrcweir ( aPfad.GetChar(nPos+1) == '\\' || aPfad.GetChar(nPos+1) == '/' ) )
394cdf0e10cSrcweir {
395cdf0e10cSrcweir // schon was auf dem Stack?
396cdf0e10cSrcweir // oder Novell-Format? (not supported wegen URLs)
397cdf0e10cSrcweir if ( aStack.Count() || aName.Len() > 2 )
398cdf0e10cSrcweir {
399cdf0e10cSrcweir aName = rPfad;
400cdf0e10cSrcweir return FSYS_ERR_MISPLACEDCHAR;
401cdf0e10cSrcweir }
402cdf0e10cSrcweir // Root-Directory des Drive
403cdf0e10cSrcweir aStack.Push( new DirEntry( aName, FSYS_FLAG_ABSROOT, eStyle ) );
404cdf0e10cSrcweir }
405cdf0e10cSrcweir else
406cdf0e10cSrcweir {
407cdf0e10cSrcweir // liegt ein anderes Drive auf dem Stack?
408cdf0e10cSrcweir if ( aStack.Count() &&
409cdf0e10cSrcweir COMPARE_EQUAL != aStack.Bottom()->aName.CompareIgnoreCaseToAscii(aName) )
410cdf0e10cSrcweir aStack.Clear();
411cdf0e10cSrcweir
412cdf0e10cSrcweir // liegt jetzt nichts mehr auf dem Stack?
413cdf0e10cSrcweir if ( !aStack.Count() )
414cdf0e10cSrcweir aStack.Push( new DirEntry( aName, FSYS_FLAG_RELROOT, eStyle ) );
415cdf0e10cSrcweir }
416cdf0e10cSrcweir }
417cdf0e10cSrcweir
418cdf0e10cSrcweir // es ist kein Drive
419cdf0e10cSrcweir else
420cdf0e10cSrcweir {
421cdf0e10cSrcweir // den Namen ohne Trenner abspalten
422cdf0e10cSrcweir aName = ByteString( aPfad.Copy( 0, nPos ), osl_getThreadTextEncoding() );
423cdf0e10cSrcweir
424cdf0e10cSrcweir // stellt der Name die aktuelle Directory dar?
425cdf0e10cSrcweir if ( aName == "." )
426cdf0e10cSrcweir /* do nothing */;
427cdf0e10cSrcweir
428cdf0e10cSrcweir // stellt der Name die Parent-Directory dar?
429cdf0e10cSrcweir else if ( aName == ".." )
430cdf0e10cSrcweir {
431cdf0e10cSrcweir // ist nichts, ein Parent oder eine relative Root
432cdf0e10cSrcweir // auf dem Stack?
433cdf0e10cSrcweir if ( ( aStack.Count() == 0 ) ||
434cdf0e10cSrcweir ( aStack.Top()->eFlag == FSYS_FLAG_PARENT ) ||
435cdf0e10cSrcweir ( aStack.Top()->eFlag == FSYS_FLAG_RELROOT ) )
436cdf0e10cSrcweir // fuehrende Parents kommen auf den Stack
437cdf0e10cSrcweir aStack.Push( new DirEntry( FSYS_FLAG_PARENT ) );
438cdf0e10cSrcweir
439cdf0e10cSrcweir // ist es eine absolute Root
440cdf0e10cSrcweir else if ( aStack.Top()->eFlag == FSYS_FLAG_ABSROOT )
441cdf0e10cSrcweir {
442cdf0e10cSrcweir // die hat keine Parent-Directory
443cdf0e10cSrcweir aName = rPfad;
444cdf0e10cSrcweir return FSYS_ERR_NOTEXISTS;
445cdf0e10cSrcweir }
446cdf0e10cSrcweir else
447cdf0e10cSrcweir // sonst hebt der Parent den TOS auf
448cdf0e10cSrcweir delete aStack.Pop();
449cdf0e10cSrcweir }
450cdf0e10cSrcweir
451cdf0e10cSrcweir else
452cdf0e10cSrcweir {
453cdf0e10cSrcweir if ( eStyle == FSYS_STYLE_FAT )
454cdf0e10cSrcweir {
455cdf0e10cSrcweir // ist der Name grundsaetzlich ungueltig?
456cdf0e10cSrcweir int nPunkte = 0;
457cdf0e10cSrcweir const char *pChar;
458cdf0e10cSrcweir for ( pChar = aName.GetBuffer();
459cdf0e10cSrcweir nPunkte < 2 && *pChar != 0;
460cdf0e10cSrcweir pChar++ )
461cdf0e10cSrcweir {
462cdf0e10cSrcweir if ( *pChar == ';' )
463cdf0e10cSrcweir nPunkte = 0;
464cdf0e10cSrcweir else
465cdf0e10cSrcweir nPunkte += ( *pChar == '.' ) ? 1 : 0;
466cdf0e10cSrcweir }
467cdf0e10cSrcweir if ( nPunkte > 1 )
468cdf0e10cSrcweir {
469cdf0e10cSrcweir aName = rPfad;
470cdf0e10cSrcweir return FSYS_ERR_MISPLACEDCHAR;
471cdf0e10cSrcweir }
472cdf0e10cSrcweir }
473cdf0e10cSrcweir
474cdf0e10cSrcweir // normalen Entries kommen auf den Stack
475cdf0e10cSrcweir DirEntry *pNew = new DirEntry( aName, FSYS_FLAG_NORMAL, eStyle );
476cdf0e10cSrcweir if ( !pNew->IsValid() )
477cdf0e10cSrcweir {
478cdf0e10cSrcweir aName = rPfad;
479cdf0e10cSrcweir ErrCode eErr = pNew->GetError();
480cdf0e10cSrcweir delete pNew;
481cdf0e10cSrcweir return eErr;
482cdf0e10cSrcweir }
483cdf0e10cSrcweir aStack.Push( pNew );
484cdf0e10cSrcweir }
485cdf0e10cSrcweir }
486cdf0e10cSrcweir }
487cdf0e10cSrcweir
488cdf0e10cSrcweir // den Restpfad bestimmen
489cdf0e10cSrcweir aPfad.Erase( 0, nPos + 1 );
490cdf0e10cSrcweir while ( aPfad.Len() && ( aPfad.GetChar(0) == '\\' || aPfad.GetChar(0) == '/' ) )
491cdf0e10cSrcweir aPfad.Erase( 0, 1 );
492cdf0e10cSrcweir }
493cdf0e10cSrcweir while ( aPfad.Len() );
494cdf0e10cSrcweir
495cdf0e10cSrcweir sal_uIntPtr nErr = ERRCODE_NONE;
496cdf0e10cSrcweir // Haupt-Entry (selbst) zuweisen
497cdf0e10cSrcweir if ( aStack.Count() == 0 )
498cdf0e10cSrcweir {
499cdf0e10cSrcweir eFlag = FSYS_FLAG_CURRENT;
500cdf0e10cSrcweir aName.Erase();
501cdf0e10cSrcweir }
502cdf0e10cSrcweir else
503cdf0e10cSrcweir {
504cdf0e10cSrcweir eFlag = aStack.Top()->eFlag;
505cdf0e10cSrcweir aName = aStack.Top()->aName;
506cdf0e10cSrcweir nErr = aStack.Top()->nError;
507cdf0e10cSrcweir delete aStack.Pop();
508cdf0e10cSrcweir }
509cdf0e10cSrcweir
510cdf0e10cSrcweir // die Parent-Entries vom Stack holen
511cdf0e10cSrcweir DirEntry** pTemp = &pParent; // Zeiger auf den Member pParent setzen
512cdf0e10cSrcweir while ( aStack.Count() )
513cdf0e10cSrcweir {
514cdf0e10cSrcweir *pTemp = aStack.Pop();
515cdf0e10cSrcweir
516cdf0e10cSrcweir // Zeiger auf den Member pParent des eigenen Parent setzen
517cdf0e10cSrcweir pTemp = &( (*pTemp)->pParent );
518cdf0e10cSrcweir }
519cdf0e10cSrcweir
520cdf0e10cSrcweir // wird damit ein Volume beschrieben?
521cdf0e10cSrcweir if ( !pParent && eFlag == FSYS_FLAG_RELROOT && aName.Len() )
522cdf0e10cSrcweir eFlag = FSYS_FLAG_VOLUME;
523cdf0e10cSrcweir
524cdf0e10cSrcweir // bei gesetztem ErrorCode den Namen komplett "ubernehmen
525cdf0e10cSrcweir if ( nErr )
526cdf0e10cSrcweir aName = rPfad;
527cdf0e10cSrcweir return nErr;
528cdf0e10cSrcweir }
529cdf0e10cSrcweir
530cdf0e10cSrcweir /*************************************************************************
531cdf0e10cSrcweir |*
532cdf0e10cSrcweir |* DirEntry::ImpParseName()
533cdf0e10cSrcweir |*
534cdf0e10cSrcweir |* Beschreibung FSYS.SDW
535cdf0e10cSrcweir |* Ersterstellung MI 26.08.91
536cdf0e10cSrcweir |* Letzte Aenderung MI 26.05.93
537cdf0e10cSrcweir |*
538cdf0e10cSrcweir *************************************************************************/
539cdf0e10cSrcweir
ImpParseName(const ByteString & rbInitName,FSysPathStyle eStyle)540cdf0e10cSrcweir FSysError DirEntry::ImpParseName( const ByteString& rbInitName,
541cdf0e10cSrcweir FSysPathStyle eStyle )
542cdf0e10cSrcweir {
543cdf0e10cSrcweir String rInitName( rbInitName, osl_getThreadTextEncoding() );
544cdf0e10cSrcweir if ( eStyle == FSYS_STYLE_HOST )
545cdf0e10cSrcweir eStyle = DEFSTYLE;
546cdf0e10cSrcweir
547cdf0e10cSrcweir // KI-Division of FSys
548cdf0e10cSrcweir if ( eStyle == FSYS_STYLE_DETECT )
549cdf0e10cSrcweir {
550cdf0e10cSrcweir sal_Unicode cFirst = rInitName.GetChar(0);
551cdf0e10cSrcweir if ( rInitName.Len() == 2 && rInitName.GetChar(1) == ':' &&
552cdf0e10cSrcweir ((cFirst >= 'A' && cFirst <= 'Z') ||
553cdf0e10cSrcweir (cFirst >= 'a' && cFirst <= 'z')))
554cdf0e10cSrcweir eStyle = FSYS_STYLE_HPFS;
555cdf0e10cSrcweir else if ( rInitName.Len() > 2 && rInitName.GetChar(1) == ':' )
556cdf0e10cSrcweir {
557cdf0e10cSrcweir if ( rInitName.Search( ':', 2 ) == STRING_NOTFOUND )
558cdf0e10cSrcweir eStyle = FSYS_STYLE_HPFS;
559cdf0e10cSrcweir else
560cdf0e10cSrcweir eStyle = FSYS_STYLE_MAC;
561cdf0e10cSrcweir }
562cdf0e10cSrcweir else if ( rInitName.Search( '/' ) != STRING_NOTFOUND )
563cdf0e10cSrcweir eStyle = FSYS_STYLE_BSD;
564cdf0e10cSrcweir else if ( rInitName.Search( '\\' ) != STRING_NOTFOUND )
565cdf0e10cSrcweir eStyle = FSYS_STYLE_HPFS;
566cdf0e10cSrcweir else if ( rInitName.Search( ':' ) != STRING_NOTFOUND )
567cdf0e10cSrcweir eStyle = FSYS_STYLE_MAC;
568cdf0e10cSrcweir else
569cdf0e10cSrcweir eStyle = FSYS_STYLE_HPFS;
570cdf0e10cSrcweir }
571cdf0e10cSrcweir
572cdf0e10cSrcweir switch ( eStyle )
573cdf0e10cSrcweir {
574cdf0e10cSrcweir case FSYS_STYLE_FAT:
575cdf0e10cSrcweir case FSYS_STYLE_VFAT:
576cdf0e10cSrcweir case FSYS_STYLE_HPFS:
577cdf0e10cSrcweir case FSYS_STYLE_NTFS:
578cdf0e10cSrcweir case FSYS_STYLE_NWFS:
579cdf0e10cSrcweir return ImpParseOs2Name( rbInitName, eStyle );
580cdf0e10cSrcweir
581cdf0e10cSrcweir case FSYS_STYLE_BSD:
582cdf0e10cSrcweir case FSYS_STYLE_SYSV:
583cdf0e10cSrcweir return ImpParseUnixName( rbInitName, eStyle );
584cdf0e10cSrcweir
585cdf0e10cSrcweir case FSYS_STYLE_MAC:
586cdf0e10cSrcweir return FSYS_ERR_OK;
587cdf0e10cSrcweir
588cdf0e10cSrcweir default:
589cdf0e10cSrcweir return FSYS_ERR_UNKNOWN;
590cdf0e10cSrcweir }
591cdf0e10cSrcweir }
592cdf0e10cSrcweir
593cdf0e10cSrcweir /*************************************************************************
594cdf0e10cSrcweir |*
595cdf0e10cSrcweir |* GetStyle()
596cdf0e10cSrcweir |*
597cdf0e10cSrcweir |* Beschreibung FSYS.SDW
598cdf0e10cSrcweir |* Ersterstellung MI 15.11.91
599cdf0e10cSrcweir |* Letzte Aenderung MI 15.11.91
600cdf0e10cSrcweir |*
601cdf0e10cSrcweir *************************************************************************/
602cdf0e10cSrcweir
GetStyle(FSysPathStyle eStyle)603cdf0e10cSrcweir static FSysPathStyle GetStyle( FSysPathStyle eStyle )
604cdf0e10cSrcweir {
605cdf0e10cSrcweir if ( eStyle == FSYS_STYLE_HOST || eStyle == FSYS_STYLE_DETECT )
606cdf0e10cSrcweir return DEFSTYLE;
607cdf0e10cSrcweir else
608cdf0e10cSrcweir return eStyle;
609cdf0e10cSrcweir }
610cdf0e10cSrcweir
611cdf0e10cSrcweir /*************************************************************************
612cdf0e10cSrcweir |*
613cdf0e10cSrcweir |* DirEntry::ImpTrim()
614cdf0e10cSrcweir |*
615cdf0e10cSrcweir |* Beschreibung bringt den Namen auf Betriebssystem-Norm
616cdf0e10cSrcweir |* z.B. 8.3 lower beim MS-DOS Formatter
617cdf0e10cSrcweir |* wirkt nicht rekursiv
618cdf0e10cSrcweir |* Ersterstellung MI 12.08.91
619cdf0e10cSrcweir |* Letzte Aenderung MI 21.05.92
620cdf0e10cSrcweir |*
621cdf0e10cSrcweir *************************************************************************/
622cdf0e10cSrcweir
ImpTrim(FSysPathStyle eStyle)623cdf0e10cSrcweir void DirEntry::ImpTrim( FSysPathStyle eStyle )
624cdf0e10cSrcweir {
625cdf0e10cSrcweir // Wildcards werden nicht geclipt
626cdf0e10cSrcweir if ( ( aName.Search( '*' ) != STRING_NOTFOUND ) ||
627cdf0e10cSrcweir ( aName.Search( '?' ) != STRING_NOTFOUND ) ||
628cdf0e10cSrcweir ( aName.Search( ';' ) != STRING_NOTFOUND ) )
629cdf0e10cSrcweir return;
630cdf0e10cSrcweir
631cdf0e10cSrcweir switch ( eStyle )
632cdf0e10cSrcweir {
633cdf0e10cSrcweir case FSYS_STYLE_FAT:
634cdf0e10cSrcweir {
635cdf0e10cSrcweir sal_uInt16 nPunktPos = aName.Search( '.' );
636cdf0e10cSrcweir if ( nPunktPos == STRING_NOTFOUND )
637cdf0e10cSrcweir {
638cdf0e10cSrcweir if ( aName.Len() > 8 )
639cdf0e10cSrcweir {
640cdf0e10cSrcweir nError = ERRCODE_IO_MISPLACEDCHAR|ERRCODE_WARNING_MASK;
641cdf0e10cSrcweir aName.Erase( 8 );
642cdf0e10cSrcweir }
643cdf0e10cSrcweir }
644cdf0e10cSrcweir else
645cdf0e10cSrcweir {
646cdf0e10cSrcweir if ( nPunktPos > 8 )
647cdf0e10cSrcweir {
648cdf0e10cSrcweir nError = ERRCODE_IO_MISPLACEDCHAR|ERRCODE_WARNING_MASK;
649cdf0e10cSrcweir aName.Erase( 8, nPunktPos - 8 );
650cdf0e10cSrcweir nPunktPos = 8;
651cdf0e10cSrcweir }
652cdf0e10cSrcweir if ( aName.Len() > nPunktPos + 3 )
653cdf0e10cSrcweir {
654cdf0e10cSrcweir if ( aName.Len() - nPunktPos > 4 )
655cdf0e10cSrcweir {
656cdf0e10cSrcweir nError = ERRCODE_IO_MISPLACEDCHAR|ERRCODE_WARNING_MASK;
657cdf0e10cSrcweir aName.Erase( nPunktPos + 4 );
658cdf0e10cSrcweir }
659cdf0e10cSrcweir }
660cdf0e10cSrcweir }
661cdf0e10cSrcweir aName.ToLowerAscii();
662cdf0e10cSrcweir break;
663cdf0e10cSrcweir }
664cdf0e10cSrcweir
665cdf0e10cSrcweir case FSYS_STYLE_VFAT:
666cdf0e10cSrcweir case FSYS_STYLE_HPFS:
667cdf0e10cSrcweir case FSYS_STYLE_NTFS:
668cdf0e10cSrcweir case FSYS_STYLE_NWFS:
669cdf0e10cSrcweir if ( aName.Len() > 254 )
670cdf0e10cSrcweir {
671cdf0e10cSrcweir nError = ERRCODE_IO_MISPLACEDCHAR|ERRCODE_WARNING_MASK;
672cdf0e10cSrcweir aName.Erase( 254 );
673cdf0e10cSrcweir }
674cdf0e10cSrcweir
675cdf0e10cSrcweir if ( eStyle == FSYS_STYLE_HPFS &&
676cdf0e10cSrcweir ( eFlag == FSYS_FLAG_ABSROOT || eFlag == FSYS_FLAG_RELROOT ) )
677cdf0e10cSrcweir aName.ToUpperAscii();
678cdf0e10cSrcweir break;
679cdf0e10cSrcweir
680cdf0e10cSrcweir case FSYS_STYLE_SYSV:
681cdf0e10cSrcweir if ( aName.Len() > 14 )
682cdf0e10cSrcweir {
683cdf0e10cSrcweir nError = ERRCODE_IO_MISPLACEDCHAR|ERRCODE_WARNING_MASK;
684cdf0e10cSrcweir aName.Erase( 14 );
685cdf0e10cSrcweir }
686cdf0e10cSrcweir break;
687cdf0e10cSrcweir
688cdf0e10cSrcweir case FSYS_STYLE_BSD:
689cdf0e10cSrcweir if ( aName.Len() > 250 )
690cdf0e10cSrcweir {
691cdf0e10cSrcweir nError = ERRCODE_IO_MISPLACEDCHAR|ERRCODE_WARNING_MASK;
692cdf0e10cSrcweir aName.Erase( 250 );
693cdf0e10cSrcweir }
694cdf0e10cSrcweir break;
695cdf0e10cSrcweir
696cdf0e10cSrcweir case FSYS_STYLE_MAC:
697cdf0e10cSrcweir if ( eFlag & ( FSYS_FLAG_ABSROOT | FSYS_FLAG_VOLUME ) )
698cdf0e10cSrcweir {
699cdf0e10cSrcweir if ( aName.Len() > 27 )
700cdf0e10cSrcweir {
701cdf0e10cSrcweir nError = ERRCODE_IO_MISPLACEDCHAR|ERRCODE_WARNING_MASK;
702cdf0e10cSrcweir aName.Erase( 27 );
703cdf0e10cSrcweir }
704cdf0e10cSrcweir }
705cdf0e10cSrcweir else
706cdf0e10cSrcweir {
707cdf0e10cSrcweir if ( aName.Len() > 31 )
708cdf0e10cSrcweir {
709cdf0e10cSrcweir nError = ERRCODE_IO_MISPLACEDCHAR|ERRCODE_WARNING_MASK;
710cdf0e10cSrcweir aName.Erase( 31 );
711cdf0e10cSrcweir }
712cdf0e10cSrcweir }
713cdf0e10cSrcweir break;
714cdf0e10cSrcweir
715cdf0e10cSrcweir default:
716cdf0e10cSrcweir /* kann nicht sein */;
717cdf0e10cSrcweir }
718cdf0e10cSrcweir }
719cdf0e10cSrcweir
720cdf0e10cSrcweir /*************************************************************************
721cdf0e10cSrcweir |*
722cdf0e10cSrcweir |* DirEntry::DirEntry()
723cdf0e10cSrcweir |*
724cdf0e10cSrcweir |* Beschreibung FSYS.SDW
725cdf0e10cSrcweir |* Ersterstellung MI 26.04.91
726cdf0e10cSrcweir |* Letzte Aenderung MA 02.12.91
727cdf0e10cSrcweir |*
728cdf0e10cSrcweir *************************************************************************/
729cdf0e10cSrcweir
DirEntry(const ByteString & rName,DirEntryFlag eDirFlag,FSysPathStyle eStyle)730cdf0e10cSrcweir DirEntry::DirEntry( const ByteString& rName, DirEntryFlag eDirFlag,
731cdf0e10cSrcweir FSysPathStyle eStyle ) :
732cdf0e10cSrcweir #ifdef FEAT_FSYS_DOUBLESPEED
733cdf0e10cSrcweir pStat( 0 ),
734cdf0e10cSrcweir #endif
735cdf0e10cSrcweir aName( rName )
736cdf0e10cSrcweir {
737cdf0e10cSrcweir DBG_CTOR( DirEntry, ImpCheckDirEntry );
738cdf0e10cSrcweir
739cdf0e10cSrcweir pParent = NULL;
740cdf0e10cSrcweir eFlag = eDirFlag;
741cdf0e10cSrcweir nError = FSYS_ERR_OK;
742cdf0e10cSrcweir
743cdf0e10cSrcweir ImpTrim( eStyle );
744cdf0e10cSrcweir }
745cdf0e10cSrcweir
746cdf0e10cSrcweir /*************************************************************************
747cdf0e10cSrcweir |*
748cdf0e10cSrcweir |* DirEntry::DirEntry()
749cdf0e10cSrcweir |*
750cdf0e10cSrcweir |* Beschreibung FSYS.SDW
751cdf0e10cSrcweir |* Ersterstellung MI 26.04.91
752cdf0e10cSrcweir |* Letzte Aenderung MA 02.12.91
753cdf0e10cSrcweir |*
754cdf0e10cSrcweir *************************************************************************/
755cdf0e10cSrcweir
DirEntry(const DirEntry & rOrig)756cdf0e10cSrcweir DirEntry::DirEntry( const DirEntry& rOrig ) :
757cdf0e10cSrcweir #ifdef FEAT_FSYS_DOUBLESPEED
758cdf0e10cSrcweir pStat( rOrig.pStat ? new FileStat(*rOrig.pStat) : 0 ),
759cdf0e10cSrcweir #endif
760cdf0e10cSrcweir aName( rOrig.aName )
761cdf0e10cSrcweir {
762cdf0e10cSrcweir DBG_CTOR( DirEntry, ImpCheckDirEntry );
763cdf0e10cSrcweir
764cdf0e10cSrcweir eFlag = rOrig.eFlag;
765cdf0e10cSrcweir nError = rOrig.nError;
766cdf0e10cSrcweir
767cdf0e10cSrcweir if ( rOrig.pParent )
768cdf0e10cSrcweir {
769cdf0e10cSrcweir pParent = new DirEntry( *rOrig.pParent );
770cdf0e10cSrcweir }
771cdf0e10cSrcweir else
772cdf0e10cSrcweir {
773cdf0e10cSrcweir pParent = NULL;
774cdf0e10cSrcweir }
775cdf0e10cSrcweir }
776cdf0e10cSrcweir
777cdf0e10cSrcweir /*************************************************************************
778cdf0e10cSrcweir |*
779cdf0e10cSrcweir |* DirEntry::DirEntry()
780cdf0e10cSrcweir |*
781cdf0e10cSrcweir |* Beschreibung FSYS.SDW
782cdf0e10cSrcweir |* Ersterstellung MI 26.04.91
783cdf0e10cSrcweir |* Letzte Aenderung MA 02.12.91
784cdf0e10cSrcweir |*
785cdf0e10cSrcweir *************************************************************************/
786cdf0e10cSrcweir
DirEntry(const String & rInitName,FSysPathStyle eStyle)787cdf0e10cSrcweir DirEntry::DirEntry( const String& rInitName, FSysPathStyle eStyle )
788cdf0e10cSrcweir #ifdef FEAT_FSYS_DOUBLESPEED
789cdf0e10cSrcweir : pStat( 0 )
790cdf0e10cSrcweir #endif
791cdf0e10cSrcweir {
792cdf0e10cSrcweir DBG_CTOR( DirEntry, ImpCheckDirEntry );
793cdf0e10cSrcweir
794cdf0e10cSrcweir pParent = NULL;
795cdf0e10cSrcweir
796cdf0e10cSrcweir // schnelle Loesung fuer Leerstring
797cdf0e10cSrcweir if ( !rInitName.Len())
798cdf0e10cSrcweir {
799cdf0e10cSrcweir eFlag = FSYS_FLAG_CURRENT;
800cdf0e10cSrcweir nError = FSYS_ERR_OK;
801cdf0e10cSrcweir return;
802cdf0e10cSrcweir }
803cdf0e10cSrcweir
804cdf0e10cSrcweir ByteString aTmpName(rInitName, osl_getThreadTextEncoding());
805cdf0e10cSrcweir if( eStyle == FSYS_STYLE_URL || aTmpName.CompareIgnoreCaseToAscii("file:",5 ) == COMPARE_EQUAL )
806cdf0e10cSrcweir {
807cdf0e10cSrcweir #ifndef BOOTSTRAP
808cdf0e10cSrcweir DBG_WARNING( "File URLs are not permitted but accepted" );
809cdf0e10cSrcweir aTmpName = ByteString(String(INetURLObject( rInitName ).PathToFileName()), osl_getThreadTextEncoding());
810cdf0e10cSrcweir eStyle = FSYS_STYLE_HOST;
811cdf0e10cSrcweir #endif // BOOTSTRAP
812cdf0e10cSrcweir }
813cdf0e10cSrcweir else
814cdf0e10cSrcweir {
815cdf0e10cSrcweir ::rtl::OUString aTmp;
816cdf0e10cSrcweir ::rtl::OUString aOInitName;
817cdf0e10cSrcweir if ( FileBase::getFileURLFromSystemPath( OUString( rInitName ), aTmp ) == FileBase::E_None )
818cdf0e10cSrcweir {
819cdf0e10cSrcweir aOInitName = OUString( rInitName );
820cdf0e10cSrcweir aTmpName = ByteString( String(aOInitName), osl_getThreadTextEncoding() );
821cdf0e10cSrcweir }
822cdf0e10cSrcweir
823cdf0e10cSrcweir #ifdef DBG_UTIL
824cdf0e10cSrcweir // ASF nur bei Default eStyle, nicht z.B. aus MakeShortName()
825cdf0e10cSrcweir if( eStyle == FSYS_STYLE_HOST &&
826cdf0e10cSrcweir aTmpName.Search( "://" ) != STRING_NOTFOUND )
827cdf0e10cSrcweir {
828cdf0e10cSrcweir ByteString aErr = "DirEntries akzeptieren nur File URLS: ";
829cdf0e10cSrcweir aErr += aTmpName;
830cdf0e10cSrcweir DBG_WARNING( aErr.GetBuffer() );
831cdf0e10cSrcweir }
832cdf0e10cSrcweir #endif
833cdf0e10cSrcweir }
834cdf0e10cSrcweir
835cdf0e10cSrcweir nError = ImpParseName( aTmpName, eStyle );
836cdf0e10cSrcweir
837cdf0e10cSrcweir if ( nError != FSYS_ERR_OK )
838cdf0e10cSrcweir eFlag = FSYS_FLAG_INVALID;
839cdf0e10cSrcweir }
840cdf0e10cSrcweir
841cdf0e10cSrcweir /*************************************************************************/
842cdf0e10cSrcweir
DirEntry(const ByteString & rInitName,FSysPathStyle eStyle)843cdf0e10cSrcweir DirEntry::DirEntry( const ByteString& rInitName, FSysPathStyle eStyle )
844cdf0e10cSrcweir #ifdef FEAT_FSYS_DOUBLESPEED
845cdf0e10cSrcweir : pStat( 0 )
846cdf0e10cSrcweir #endif
847cdf0e10cSrcweir {
848cdf0e10cSrcweir DBG_CTOR( DirEntry, ImpCheckDirEntry );
849cdf0e10cSrcweir
850cdf0e10cSrcweir pParent = NULL;
851cdf0e10cSrcweir
852cdf0e10cSrcweir // schnelle Loesung fuer Leerstring
853cdf0e10cSrcweir if ( !rInitName.Len() )
854cdf0e10cSrcweir {
855cdf0e10cSrcweir eFlag = FSYS_FLAG_CURRENT;
856cdf0e10cSrcweir nError = FSYS_ERR_OK;
857cdf0e10cSrcweir return;
858cdf0e10cSrcweir }
859cdf0e10cSrcweir
860cdf0e10cSrcweir ByteString aTmpName( rInitName );
861cdf0e10cSrcweir if( eStyle == FSYS_STYLE_URL || rInitName.CompareIgnoreCaseToAscii("file:",5 ) == COMPARE_EQUAL )
862cdf0e10cSrcweir {
863cdf0e10cSrcweir #ifndef BOOTSTRAP
864cdf0e10cSrcweir DBG_WARNING( "File URLs are not permitted but accepted" );
865cdf0e10cSrcweir aTmpName = ByteString(String(INetURLObject( rInitName ).PathToFileName()), osl_getThreadTextEncoding());
866cdf0e10cSrcweir eStyle = FSYS_STYLE_HOST;
867cdf0e10cSrcweir #endif
868cdf0e10cSrcweir }
869cdf0e10cSrcweir #ifdef DBG_UTIL
870cdf0e10cSrcweir else
871cdf0e10cSrcweir // ASF nur bei Default eStyle, nicht z.B. aus MakeShortName()
872cdf0e10cSrcweir if( eStyle == FSYS_STYLE_HOST &&
873cdf0e10cSrcweir rInitName.Search( "://" ) != STRING_NOTFOUND )
874cdf0e10cSrcweir {
875cdf0e10cSrcweir ByteString aErr = "DirEntries akzeptieren nur File URLS: ";
876cdf0e10cSrcweir aErr += rInitName;
877cdf0e10cSrcweir DBG_WARNING( aErr.GetBuffer() );
878cdf0e10cSrcweir }
879cdf0e10cSrcweir #endif
880cdf0e10cSrcweir
881cdf0e10cSrcweir nError = ImpParseName( aTmpName, eStyle );
882cdf0e10cSrcweir
883cdf0e10cSrcweir if ( nError != FSYS_ERR_OK )
884cdf0e10cSrcweir eFlag = FSYS_FLAG_INVALID;
885cdf0e10cSrcweir }
886cdf0e10cSrcweir
887cdf0e10cSrcweir /*************************************************************************
888cdf0e10cSrcweir |*
889cdf0e10cSrcweir |* DirEntry::DirEntry()
890cdf0e10cSrcweir |*
891cdf0e10cSrcweir |* Beschreibung FSYS.SDW
892cdf0e10cSrcweir |* Ersterstellung MI 26.04.91
893cdf0e10cSrcweir |* Letzte Aenderung MA 02.12.91
894cdf0e10cSrcweir |*
895cdf0e10cSrcweir *************************************************************************/
896cdf0e10cSrcweir
DirEntry(DirEntryFlag eDirFlag)897cdf0e10cSrcweir DirEntry::DirEntry( DirEntryFlag eDirFlag )
898cdf0e10cSrcweir #ifdef FEAT_FSYS_DOUBLESPEED
899cdf0e10cSrcweir : pStat( 0 )
900cdf0e10cSrcweir #endif
901cdf0e10cSrcweir {
902cdf0e10cSrcweir DBG_CTOR( DirEntry, ImpCheckDirEntry );
903cdf0e10cSrcweir
904cdf0e10cSrcweir eFlag = eDirFlag;
905cdf0e10cSrcweir nError = ( eFlag == FSYS_FLAG_INVALID ) ? FSYS_ERR_UNKNOWN : FSYS_ERR_OK;
906cdf0e10cSrcweir pParent = NULL;
907cdf0e10cSrcweir }
908cdf0e10cSrcweir
909cdf0e10cSrcweir /*************************************************************************
910cdf0e10cSrcweir |*
911cdf0e10cSrcweir |* DirEntry::~DirEntry()
912cdf0e10cSrcweir |*
913cdf0e10cSrcweir |* Beschreibung FSYS.SDW
914cdf0e10cSrcweir |* Ersterstellung MI 26.04.91
915cdf0e10cSrcweir |* Letzte Aenderung MA 02.12.91
916cdf0e10cSrcweir |*
917cdf0e10cSrcweir *************************************************************************/
918cdf0e10cSrcweir
~DirEntry()919cdf0e10cSrcweir DirEntry::~DirEntry()
920cdf0e10cSrcweir {
921cdf0e10cSrcweir DBG_DTOR( DirEntry, ImpCheckDirEntry );
922cdf0e10cSrcweir
923cdf0e10cSrcweir delete pParent;
924cdf0e10cSrcweir #ifdef FEAT_FSYS_DOUBLESPEED
925cdf0e10cSrcweir delete pStat;
926cdf0e10cSrcweir #endif
927cdf0e10cSrcweir
928cdf0e10cSrcweir }
929cdf0e10cSrcweir
930cdf0e10cSrcweir /*************************************************************************
931cdf0e10cSrcweir |*
932cdf0e10cSrcweir |* DirEntry::ImpGetTopPtr() const
933cdf0e10cSrcweir |*
934cdf0e10cSrcweir |* Beschreibung FSYS.SDW
935cdf0e10cSrcweir |* Ersterstellung MI 26.04.91
936cdf0e10cSrcweir |* Letzte Aenderung MA 02.12.91
937cdf0e10cSrcweir |*
938cdf0e10cSrcweir *************************************************************************/
939cdf0e10cSrcweir
ImpGetTopPtr() const940cdf0e10cSrcweir const DirEntry* DirEntry::ImpGetTopPtr() const
941cdf0e10cSrcweir {
942cdf0e10cSrcweir DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
943cdf0e10cSrcweir
944cdf0e10cSrcweir const DirEntry *pTemp = this;
945cdf0e10cSrcweir while ( pTemp->pParent )
946cdf0e10cSrcweir pTemp = pTemp->pParent;
947cdf0e10cSrcweir
948cdf0e10cSrcweir return pTemp;
949cdf0e10cSrcweir }
950cdf0e10cSrcweir
951cdf0e10cSrcweir /*************************************************************************
952cdf0e10cSrcweir |*
953cdf0e10cSrcweir |* DirEntry::ImpGetTopPtr()
954cdf0e10cSrcweir |*
955cdf0e10cSrcweir |* Beschreibung FSYS.SDW
956cdf0e10cSrcweir |* Ersterstellung MI 13.11.91
957cdf0e10cSrcweir |* Letzte Aenderung MA 02.12.91
958cdf0e10cSrcweir |*
959cdf0e10cSrcweir *************************************************************************/
960cdf0e10cSrcweir
ImpGetTopPtr()961cdf0e10cSrcweir DirEntry* DirEntry::ImpGetTopPtr()
962cdf0e10cSrcweir {
963cdf0e10cSrcweir DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
964cdf0e10cSrcweir
965cdf0e10cSrcweir DirEntry *pTemp = this;
966cdf0e10cSrcweir while ( pTemp->pParent )
967cdf0e10cSrcweir pTemp = pTemp->pParent;
968cdf0e10cSrcweir
969cdf0e10cSrcweir return pTemp;
970cdf0e10cSrcweir }
971cdf0e10cSrcweir
972cdf0e10cSrcweir /*************************************************************************
973cdf0e10cSrcweir |*
974cdf0e10cSrcweir |* DirEntry::ImpGetPreTopPtr()
975cdf0e10cSrcweir |*
976cdf0e10cSrcweir |* Beschreibung liefert einen Pointer auf den vorletzten Entry
977cdf0e10cSrcweir |* Ersterstellung MI 01.11.91
978cdf0e10cSrcweir |* Letzte Aenderung MA 02.12.91
979cdf0e10cSrcweir |*
980cdf0e10cSrcweir *************************************************************************/
981cdf0e10cSrcweir
ImpGetPreTopPtr()982cdf0e10cSrcweir DirEntry* DirEntry::ImpGetPreTopPtr()
983cdf0e10cSrcweir {
984cdf0e10cSrcweir DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
985cdf0e10cSrcweir
986cdf0e10cSrcweir DirEntry *pTemp = this;
987cdf0e10cSrcweir if ( pTemp->pParent )
988cdf0e10cSrcweir {
989cdf0e10cSrcweir while ( pTemp->pParent->pParent )
990cdf0e10cSrcweir pTemp = pTemp->pParent;
991cdf0e10cSrcweir }
992cdf0e10cSrcweir
993cdf0e10cSrcweir return pTemp;
994cdf0e10cSrcweir }
995cdf0e10cSrcweir
996cdf0e10cSrcweir /*************************************************************************
997cdf0e10cSrcweir |*
998cdf0e10cSrcweir |* DirEntry::ImpChangeParent()
999cdf0e10cSrcweir |*
1000cdf0e10cSrcweir |* Beschreibung FSYS.SDW
1001cdf0e10cSrcweir |* Ersterstellung MI 26.04.91
1002cdf0e10cSrcweir |* Letzte Aenderung MI 21.05.92
1003cdf0e10cSrcweir |*
1004cdf0e10cSrcweir *************************************************************************/
1005cdf0e10cSrcweir
ImpChangeParent(DirEntry * pNewParent,sal_Bool bNormalize)1006cdf0e10cSrcweir DirEntry* DirEntry::ImpChangeParent( DirEntry* pNewParent, sal_Bool bNormalize )
1007cdf0e10cSrcweir {
1008cdf0e10cSrcweir DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
1009cdf0e10cSrcweir
1010cdf0e10cSrcweir DirEntry *pTemp = pParent;
1011cdf0e10cSrcweir if ( bNormalize && pNewParent &&
1012cdf0e10cSrcweir pNewParent->eFlag == FSYS_FLAG_RELROOT && !pNewParent->aName.Len() )
1013cdf0e10cSrcweir {
1014cdf0e10cSrcweir pParent = 0;
1015cdf0e10cSrcweir delete pNewParent;
1016cdf0e10cSrcweir }
1017cdf0e10cSrcweir else
1018cdf0e10cSrcweir pParent = pNewParent;
1019cdf0e10cSrcweir
1020cdf0e10cSrcweir return pTemp;
1021cdf0e10cSrcweir }
1022cdf0e10cSrcweir
1023cdf0e10cSrcweir /*************************************************************************
1024cdf0e10cSrcweir |*
1025cdf0e10cSrcweir |* DirEntry::Exists()
1026cdf0e10cSrcweir |*
1027cdf0e10cSrcweir |* Beschreibung FSYS.SDW
1028cdf0e10cSrcweir |* Ersterstellung MI 26.04.91
1029cdf0e10cSrcweir |* Letzte Aenderung MI 24.09.91
1030cdf0e10cSrcweir |*
1031cdf0e10cSrcweir *************************************************************************/
1032cdf0e10cSrcweir
Exists(FSysAccess nAccess) const1033cdf0e10cSrcweir sal_Bool DirEntry::Exists( FSysAccess nAccess ) const
1034cdf0e10cSrcweir {
1035cdf0e10cSrcweir #ifndef BOOTSTRAP
1036cdf0e10cSrcweir static vos::OMutex aLocalMutex;
1037cdf0e10cSrcweir vos::OGuard aGuard( aLocalMutex );
1038cdf0e10cSrcweir #endif
1039cdf0e10cSrcweir if ( !IsValid() )
1040cdf0e10cSrcweir return sal_False;
1041cdf0e10cSrcweir
1042cdf0e10cSrcweir #if defined WNT || defined OS2
1043cdf0e10cSrcweir // spezielle Filenamen sind vom System da
1044cdf0e10cSrcweir if ( ( aName.CompareIgnoreCaseToAscii("CLOCK$") == COMPARE_EQUAL ||
1045cdf0e10cSrcweir aName.CompareIgnoreCaseToAscii("CON") == COMPARE_EQUAL ||
1046cdf0e10cSrcweir aName.CompareIgnoreCaseToAscii("AUX") == COMPARE_EQUAL ||
1047cdf0e10cSrcweir aName.CompareIgnoreCaseToAscii("COM1") == COMPARE_EQUAL ||
1048cdf0e10cSrcweir aName.CompareIgnoreCaseToAscii("COM2") == COMPARE_EQUAL ||
1049cdf0e10cSrcweir aName.CompareIgnoreCaseToAscii("COM3") == COMPARE_EQUAL ||
1050cdf0e10cSrcweir aName.CompareIgnoreCaseToAscii("COM4") == COMPARE_EQUAL ||
1051cdf0e10cSrcweir aName.CompareIgnoreCaseToAscii("LPT1") == COMPARE_EQUAL ||
1052cdf0e10cSrcweir aName.CompareIgnoreCaseToAscii("LPT2") == COMPARE_EQUAL ||
1053cdf0e10cSrcweir aName.CompareIgnoreCaseToAscii("LPT3") == COMPARE_EQUAL ||
1054cdf0e10cSrcweir aName.CompareIgnoreCaseToAscii("NUL") == COMPARE_EQUAL ||
1055cdf0e10cSrcweir aName.CompareIgnoreCaseToAscii("PRN") == COMPARE_EQUAL ) )
1056cdf0e10cSrcweir return sal_True;
1057cdf0e10cSrcweir #endif
1058cdf0e10cSrcweir
1059cdf0e10cSrcweir FSysFailOnErrorImpl();
1060cdf0e10cSrcweir DirEntryKind eKind = FileStat( *this, nAccess ).GetKind();
1061cdf0e10cSrcweir if ( eKind & ( FSYS_KIND_FILE | FSYS_KIND_DIR ) )
1062cdf0e10cSrcweir {
1063cdf0e10cSrcweir return sal_True;
1064cdf0e10cSrcweir }
1065cdf0e10cSrcweir
1066cdf0e10cSrcweir #if defined WNT || defined OS2
1067cdf0e10cSrcweir if ( 0 != ( eKind & FSYS_KIND_DEV ) )
1068cdf0e10cSrcweir {
1069cdf0e10cSrcweir return DRIVE_EXISTS( ImpGetTopPtr()->aName.GetChar(0) );
1070cdf0e10cSrcweir }
1071cdf0e10cSrcweir #endif
1072cdf0e10cSrcweir
1073cdf0e10cSrcweir return 0 != ( eKind & ( FSYS_KIND_FILE | FSYS_KIND_DIR ) );
1074cdf0e10cSrcweir }
1075cdf0e10cSrcweir
1076cdf0e10cSrcweir /*************************************************************************
1077cdf0e10cSrcweir |*
1078cdf0e10cSrcweir |* DirEntry::First()
1079cdf0e10cSrcweir |*
1080cdf0e10cSrcweir |* Beschreibung FSYS.SDW
1081cdf0e10cSrcweir |* Ersterstellung MI 26.04.91
1082cdf0e10cSrcweir |* Letzte Aenderung MA 15.01.92
1083cdf0e10cSrcweir |*
1084cdf0e10cSrcweir *************************************************************************/
1085cdf0e10cSrcweir
First()1086cdf0e10cSrcweir sal_Bool DirEntry::First()
1087cdf0e10cSrcweir {
1088cdf0e10cSrcweir FSysFailOnErrorImpl();
1089cdf0e10cSrcweir
1090cdf0e10cSrcweir String aUniPathName( GetPath().GetFull() );
1091cdf0e10cSrcweir #ifndef BOOTSTRAP
1092cdf0e10cSrcweir FSysRedirector::DoRedirect( aUniPathName );
1093cdf0e10cSrcweir ByteString aPathName(aUniPathName, osl_getThreadTextEncoding());
1094cdf0e10cSrcweir #else
1095cdf0e10cSrcweir ByteString aPathName(aUniPathName, gsl_getSystemTextEncoding());
1096cdf0e10cSrcweir #endif
1097cdf0e10cSrcweir aPathName = GUI2FSYS( aPathName );
1098cdf0e10cSrcweir
1099cdf0e10cSrcweir DIR *pDir = opendir( (char*) aPathName.GetBuffer() );
1100cdf0e10cSrcweir if ( pDir )
1101cdf0e10cSrcweir {
1102cdf0e10cSrcweir #ifndef BOOTSTRAP
1103cdf0e10cSrcweir WildCard aWildeKarte( String(CMP_LOWER( aName ), osl_getThreadTextEncoding()) );
1104cdf0e10cSrcweir #else
1105cdf0e10cSrcweir WildCard aWildeKarte( String(CMP_LOWER( aName ), gsl_getSystemTextEncoding()) );
1106cdf0e10cSrcweir #endif
1107cdf0e10cSrcweir for ( dirent* pEntry = readdir( pDir );
1108cdf0e10cSrcweir pEntry;
1109cdf0e10cSrcweir pEntry = readdir( pDir ) )
1110cdf0e10cSrcweir {
1111cdf0e10cSrcweir ByteString aFound( FSYS2GUI( ByteString( pEntry->d_name ) ) );
1112cdf0e10cSrcweir if ( aWildeKarte.Matches( String(CMP_LOWER( aFound ), osl_getThreadTextEncoding())))
1113cdf0e10cSrcweir {
1114cdf0e10cSrcweir aName = aFound;
1115cdf0e10cSrcweir closedir( pDir );
1116cdf0e10cSrcweir return sal_True;
1117cdf0e10cSrcweir }
1118cdf0e10cSrcweir }
1119cdf0e10cSrcweir closedir( pDir );
1120cdf0e10cSrcweir }
1121cdf0e10cSrcweir return sal_False;
1122cdf0e10cSrcweir }
1123cdf0e10cSrcweir
1124cdf0e10cSrcweir /*************************************************************************
1125cdf0e10cSrcweir |*
1126cdf0e10cSrcweir |* DirEntry::GetFull()
1127cdf0e10cSrcweir |*
1128cdf0e10cSrcweir |* Beschreibung FSYS.SDW
1129cdf0e10cSrcweir |* Ersterstellung MI 26.04.91
1130cdf0e10cSrcweir |* Letzte Aenderung MA 02.12.91
1131cdf0e10cSrcweir |*
1132cdf0e10cSrcweir *************************************************************************/
1133cdf0e10cSrcweir
GetFull(FSysPathStyle eStyle,sal_Bool bWithDelimiter,sal_uInt16 nMaxChars) const1134cdf0e10cSrcweir String DirEntry::GetFull( FSysPathStyle eStyle, sal_Bool bWithDelimiter,
1135cdf0e10cSrcweir sal_uInt16 nMaxChars ) const
1136cdf0e10cSrcweir {
1137cdf0e10cSrcweir DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
1138cdf0e10cSrcweir
1139cdf0e10cSrcweir ByteString aRet;
1140cdf0e10cSrcweir eStyle = GetStyle( eStyle );
1141cdf0e10cSrcweir if ( pParent )
1142cdf0e10cSrcweir {
1143cdf0e10cSrcweir if ( ( pParent->eFlag == FSYS_FLAG_ABSROOT ||
1144cdf0e10cSrcweir pParent->eFlag == FSYS_FLAG_RELROOT ||
1145cdf0e10cSrcweir pParent->eFlag == FSYS_FLAG_VOLUME ) )
1146cdf0e10cSrcweir {
1147cdf0e10cSrcweir aRet = ByteString(pParent->GetName( eStyle ), osl_getThreadTextEncoding());
1148cdf0e10cSrcweir aRet += ByteString(GetName( eStyle ), osl_getThreadTextEncoding());
1149cdf0e10cSrcweir }
1150cdf0e10cSrcweir else
1151cdf0e10cSrcweir {
1152cdf0e10cSrcweir aRet = ByteString(pParent->GetFull( eStyle ), osl_getThreadTextEncoding());
1153cdf0e10cSrcweir aRet += ACCESSDELIM_C(eStyle);
1154cdf0e10cSrcweir aRet += ByteString(GetName( eStyle ), osl_getThreadTextEncoding());
1155cdf0e10cSrcweir }
1156cdf0e10cSrcweir }
1157cdf0e10cSrcweir else
1158cdf0e10cSrcweir {
1159cdf0e10cSrcweir aRet = ByteString(GetName( eStyle ), osl_getThreadTextEncoding());
1160cdf0e10cSrcweir }
1161cdf0e10cSrcweir
1162cdf0e10cSrcweir if ( ( eStyle == FSYS_STYLE_MAC ) &&
1163cdf0e10cSrcweir ( ImpGetTopPtr()->eFlag != FSYS_FLAG_VOLUME ) &&
1164cdf0e10cSrcweir ( ImpGetTopPtr()->eFlag != FSYS_FLAG_ABSROOT ) &&
1165cdf0e10cSrcweir ( aRet.GetChar(0) != ':' ) )
1166cdf0e10cSrcweir aRet.Insert( ACCESSDELIM_C(eStyle), 0 );
1167cdf0e10cSrcweir
1168cdf0e10cSrcweir //! Hack
1169cdf0e10cSrcweir if ( bWithDelimiter )
1170cdf0e10cSrcweir if ( aRet.GetChar( aRet.Len()-1 ) != ACCESSDELIM_C(eStyle) )
1171cdf0e10cSrcweir aRet += ACCESSDELIM_C(eStyle);
1172cdf0e10cSrcweir
1173cdf0e10cSrcweir //! noch ein Hack
1174cdf0e10cSrcweir if ( nMaxChars < STRING_MAXLEN )
1175cdf0e10cSrcweir aRet = ImplCutPath( aRet, nMaxChars, ACCESSDELIM_C(eStyle) );
1176cdf0e10cSrcweir
1177cdf0e10cSrcweir return String(aRet, osl_getThreadTextEncoding());
1178cdf0e10cSrcweir }
1179cdf0e10cSrcweir
1180cdf0e10cSrcweir /*************************************************************************
1181cdf0e10cSrcweir |*
1182cdf0e10cSrcweir |* DirEntry::GetPath()
1183cdf0e10cSrcweir |*
1184cdf0e10cSrcweir |* Beschreibung FSYS.SDW
1185cdf0e10cSrcweir |* Ersterstellung MI 26.04.91
1186cdf0e10cSrcweir |* Letzte Aenderung MA 02.12.91
1187cdf0e10cSrcweir |*
1188cdf0e10cSrcweir *************************************************************************/
1189cdf0e10cSrcweir
GetPath() const1190cdf0e10cSrcweir DirEntry DirEntry::GetPath() const
1191cdf0e10cSrcweir {
1192cdf0e10cSrcweir DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
1193cdf0e10cSrcweir
1194cdf0e10cSrcweir if ( pParent )
1195cdf0e10cSrcweir return DirEntry( *pParent );
1196cdf0e10cSrcweir
1197cdf0e10cSrcweir return DirEntry();
1198cdf0e10cSrcweir }
1199cdf0e10cSrcweir
1200cdf0e10cSrcweir /*************************************************************************
1201cdf0e10cSrcweir |*
1202cdf0e10cSrcweir |* DirEntry::GetExtension()
1203cdf0e10cSrcweir |*
1204cdf0e10cSrcweir |* Beschreibung FSYS.SDW
1205cdf0e10cSrcweir |* Ersterstellung MI 26.04.91
1206cdf0e10cSrcweir |* Letzte Aenderung MA 02.12.91
1207cdf0e10cSrcweir |*
1208cdf0e10cSrcweir *************************************************************************/
1209cdf0e10cSrcweir
GetExtension(char cSep) const1210cdf0e10cSrcweir String DirEntry::GetExtension( char cSep ) const
1211cdf0e10cSrcweir {
1212cdf0e10cSrcweir DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
1213cdf0e10cSrcweir
1214cdf0e10cSrcweir const char *p0 = ( aName.GetBuffer() );
1215cdf0e10cSrcweir const char *p1 = p0 + aName.Len() - 1;
1216cdf0e10cSrcweir while ( p1 >= p0 && *p1 != cSep )
1217cdf0e10cSrcweir p1--;
1218cdf0e10cSrcweir
1219cdf0e10cSrcweir if ( p1 >= p0 )
1220cdf0e10cSrcweir // es wurde ein cSep an der Position p1 gefunden
1221cdf0e10cSrcweir return String(
1222cdf0e10cSrcweir aName.Copy( static_cast< xub_StrLen >(p1 - p0 + 1) ),
1223cdf0e10cSrcweir osl_getThreadTextEncoding());
1224cdf0e10cSrcweir return String();
1225cdf0e10cSrcweir }
1226cdf0e10cSrcweir
1227cdf0e10cSrcweir /*************************************************************************
1228cdf0e10cSrcweir |*
1229cdf0e10cSrcweir |* DirEntry::GetBase()
1230cdf0e10cSrcweir |*
1231cdf0e10cSrcweir |* Beschreibung FSYS.SDW
1232cdf0e10cSrcweir |* Ersterstellung MI 26.04.91
1233cdf0e10cSrcweir |* Letzte Aenderung MA 02.12.91
1234cdf0e10cSrcweir |*
1235cdf0e10cSrcweir *************************************************************************/
1236cdf0e10cSrcweir
GetBase(char cSep) const1237cdf0e10cSrcweir String DirEntry::GetBase( char cSep ) const
1238cdf0e10cSrcweir {
1239cdf0e10cSrcweir DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
1240cdf0e10cSrcweir
1241cdf0e10cSrcweir const char *p0 = ( aName.GetBuffer() );
1242cdf0e10cSrcweir const char *p1 = p0 + aName.Len() - 1;
1243cdf0e10cSrcweir while ( p1 >= p0 && *p1 != cSep )
1244cdf0e10cSrcweir p1--;
1245cdf0e10cSrcweir
1246cdf0e10cSrcweir if ( p1 >= p0 )
1247cdf0e10cSrcweir // es wurde ein cSep an der Position p1 gefunden
1248cdf0e10cSrcweir return String(
1249cdf0e10cSrcweir aName.Copy( 0, static_cast< xub_StrLen >(p1 - p0) ),
1250cdf0e10cSrcweir osl_getThreadTextEncoding());
1251cdf0e10cSrcweir
1252cdf0e10cSrcweir else
1253cdf0e10cSrcweir // es wurde kein cSep gefunden
1254cdf0e10cSrcweir return String(aName, osl_getThreadTextEncoding());
1255cdf0e10cSrcweir }
1256cdf0e10cSrcweir
1257cdf0e10cSrcweir /*************************************************************************
1258cdf0e10cSrcweir |*
1259cdf0e10cSrcweir |* DirEntry::GetName()
1260cdf0e10cSrcweir |*
1261cdf0e10cSrcweir |* Beschreibung FSYS.SDW
1262cdf0e10cSrcweir |* Ersterstellung MI 26.04.91
1263cdf0e10cSrcweir |* Letzte Aenderung MA 02.12.91 13:47
1264cdf0e10cSrcweir |*
1265cdf0e10cSrcweir *************************************************************************/
1266cdf0e10cSrcweir
GetName(FSysPathStyle eStyle) const1267cdf0e10cSrcweir String DirEntry::GetName( FSysPathStyle eStyle ) const
1268cdf0e10cSrcweir {
1269cdf0e10cSrcweir DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
1270cdf0e10cSrcweir
1271cdf0e10cSrcweir ByteString aRet;
1272cdf0e10cSrcweir eStyle = GetStyle( eStyle );
1273cdf0e10cSrcweir
1274cdf0e10cSrcweir switch( eFlag )
1275cdf0e10cSrcweir {
1276cdf0e10cSrcweir case FSYS_FLAG_PARENT:
1277cdf0e10cSrcweir aRet = ACTPARENT(eStyle);
1278cdf0e10cSrcweir break;
1279cdf0e10cSrcweir
1280cdf0e10cSrcweir case FSYS_FLAG_ABSROOT:
1281cdf0e10cSrcweir {
1282cdf0e10cSrcweir if ( eStyle == FSYS_STYLE_URL )
1283cdf0e10cSrcweir {
1284cdf0e10cSrcweir aRet = "file:///";
1285cdf0e10cSrcweir aRet += aName;
1286cdf0e10cSrcweir
1287cdf0e10cSrcweir #ifndef UNX
1288cdf0e10cSrcweir if ( aName.Len())
1289cdf0e10cSrcweir {
1290cdf0e10cSrcweir if ( aName.GetChar(aName.Len()-1) == ':' )
1291cdf0e10cSrcweir {
1292cdf0e10cSrcweir aRet.SetChar(aRet.Len()-1, '|');
1293cdf0e10cSrcweir }
1294cdf0e10cSrcweir else
1295cdf0e10cSrcweir {
1296cdf0e10cSrcweir aRet.Insert( '/', 5 );
1297cdf0e10cSrcweir }
1298cdf0e10cSrcweir aRet += "/";
1299cdf0e10cSrcweir }
1300cdf0e10cSrcweir #endif
1301cdf0e10cSrcweir }
1302cdf0e10cSrcweir else if ( eStyle != FSYS_STYLE_MAC &&
1303cdf0e10cSrcweir aName.Len() > 1 && aName.GetChar( 1 ) != ':' )
1304cdf0e10cSrcweir {
1305cdf0e10cSrcweir // UNC-Pathname
1306cdf0e10cSrcweir aRet = ACCESSDELIM_C(eStyle);
1307cdf0e10cSrcweir aRet += ACCESSDELIM_C(eStyle);
1308cdf0e10cSrcweir aRet += aName ;
1309cdf0e10cSrcweir aRet += ACCESSDELIM_C(eStyle);
1310cdf0e10cSrcweir }
1311cdf0e10cSrcweir else
1312cdf0e10cSrcweir {
1313cdf0e10cSrcweir aRet = aName;
1314cdf0e10cSrcweir aRet += ACCESSDELIM_C(eStyle);
1315cdf0e10cSrcweir }
1316cdf0e10cSrcweir break;
1317cdf0e10cSrcweir }
1318cdf0e10cSrcweir
1319cdf0e10cSrcweir case FSYS_FLAG_INVALID:
1320cdf0e10cSrcweir case FSYS_FLAG_VOLUME:
1321cdf0e10cSrcweir {
1322cdf0e10cSrcweir if ( eStyle == FSYS_STYLE_URL )
1323cdf0e10cSrcweir {
1324cdf0e10cSrcweir aRet = "file:///";
1325cdf0e10cSrcweir aRet += aName;
1326cdf0e10cSrcweir #ifndef UNX
1327cdf0e10cSrcweir if ( aName.Len() && aName.GetChar(aName.Len()-1) == ':' )
1328cdf0e10cSrcweir {
1329cdf0e10cSrcweir aRet.SetChar(aRet.Len()-1, '|');
1330cdf0e10cSrcweir }
1331cdf0e10cSrcweir #endif
1332cdf0e10cSrcweir }
1333cdf0e10cSrcweir else
1334cdf0e10cSrcweir {
1335cdf0e10cSrcweir aRet = aName;
1336cdf0e10cSrcweir }
1337cdf0e10cSrcweir
1338cdf0e10cSrcweir break;
1339cdf0e10cSrcweir }
1340cdf0e10cSrcweir
1341cdf0e10cSrcweir case FSYS_FLAG_RELROOT:
1342cdf0e10cSrcweir if ( !aName.Len() )
1343cdf0e10cSrcweir {
1344cdf0e10cSrcweir aRet = ACTCURRENT(eStyle);
1345cdf0e10cSrcweir break;
1346cdf0e10cSrcweir }
1347cdf0e10cSrcweir
1348cdf0e10cSrcweir default:
1349cdf0e10cSrcweir aRet = aName;
1350cdf0e10cSrcweir }
1351cdf0e10cSrcweir
1352cdf0e10cSrcweir return String(aRet, osl_getThreadTextEncoding());
1353cdf0e10cSrcweir }
1354cdf0e10cSrcweir
1355cdf0e10cSrcweir /*************************************************************************
1356cdf0e10cSrcweir |*
1357cdf0e10cSrcweir |* DirEntry::IsAbs()
1358cdf0e10cSrcweir |*
1359cdf0e10cSrcweir |* Beschreibung FSYS.SDW
1360cdf0e10cSrcweir |* Ersterstellung MI 26.04.91
1361cdf0e10cSrcweir |* Letzte Aenderung MA 02.12.91
1362cdf0e10cSrcweir |*
1363cdf0e10cSrcweir *************************************************************************/
1364cdf0e10cSrcweir
IsAbs() const1365cdf0e10cSrcweir bool DirEntry::IsAbs() const
1366cdf0e10cSrcweir {
1367cdf0e10cSrcweir DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
1368cdf0e10cSrcweir
1369cdf0e10cSrcweir #ifdef UNX
1370cdf0e10cSrcweir return ( pParent ? pParent->IsAbs() : eFlag == FSYS_FLAG_ABSROOT );
1371cdf0e10cSrcweir #else
1372cdf0e10cSrcweir return ( pParent ? pParent->IsAbs() : eFlag == FSYS_FLAG_ABSROOT && aName.Len() > 0 );
1373cdf0e10cSrcweir #endif
1374cdf0e10cSrcweir }
1375cdf0e10cSrcweir
1376cdf0e10cSrcweir /*************************************************************************
1377cdf0e10cSrcweir |*
1378cdf0e10cSrcweir |* DirEntry::CutName()
1379cdf0e10cSrcweir |*
1380cdf0e10cSrcweir |* Beschreibung FSYS.SDW
1381cdf0e10cSrcweir |* Ersterstellung MI 26.04.91
1382cdf0e10cSrcweir |* Letzte Aenderung MA 02.12.91
1383cdf0e10cSrcweir |*
1384cdf0e10cSrcweir *************************************************************************/
1385cdf0e10cSrcweir
CutName(FSysPathStyle eStyle)1386cdf0e10cSrcweir String DirEntry::CutName( FSysPathStyle eStyle )
1387cdf0e10cSrcweir {
1388cdf0e10cSrcweir DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
1389cdf0e10cSrcweir
1390cdf0e10cSrcweir eStyle = GetStyle( eStyle );
1391cdf0e10cSrcweir
1392cdf0e10cSrcweir String aOldName( GetName( eStyle ) );
1393cdf0e10cSrcweir
1394cdf0e10cSrcweir if ( pParent )
1395cdf0e10cSrcweir {
1396cdf0e10cSrcweir DirEntry *pOldParent = pParent;
1397cdf0e10cSrcweir if ( pOldParent )
1398cdf0e10cSrcweir {
1399cdf0e10cSrcweir pParent = pOldParent->pParent;
1400cdf0e10cSrcweir eFlag = pOldParent->eFlag;
1401cdf0e10cSrcweir aName = pOldParent->aName;
1402cdf0e10cSrcweir pOldParent->pParent = NULL;
1403cdf0e10cSrcweir delete pOldParent;
1404cdf0e10cSrcweir }
1405cdf0e10cSrcweir else
1406cdf0e10cSrcweir {
1407cdf0e10cSrcweir eFlag = FSYS_FLAG_CURRENT;
1408cdf0e10cSrcweir aName.Erase();
1409cdf0e10cSrcweir }
1410cdf0e10cSrcweir }
1411cdf0e10cSrcweir else
1412cdf0e10cSrcweir {
1413cdf0e10cSrcweir eFlag = FSYS_FLAG_CURRENT;
1414cdf0e10cSrcweir aName.Erase();
1415cdf0e10cSrcweir delete pParent;
1416cdf0e10cSrcweir pParent = NULL;
1417cdf0e10cSrcweir }
1418cdf0e10cSrcweir
1419cdf0e10cSrcweir return aOldName;
1420cdf0e10cSrcweir }
1421cdf0e10cSrcweir
1422cdf0e10cSrcweir /*************************************************************************
1423cdf0e10cSrcweir |*
1424cdf0e10cSrcweir |* DirEntry::NameCompare
1425cdf0e10cSrcweir |*
1426cdf0e10cSrcweir |* Beschreibung Vergleich nur die Namen (ohne Pfad, aber mit Gross/Klein)
1427cdf0e10cSrcweir |* Ersterstellung MI 26.04.91
1428cdf0e10cSrcweir |* Letzte Aenderung MA 02.12.91
1429cdf0e10cSrcweir |*
1430cdf0e10cSrcweir *************************************************************************/
1431cdf0e10cSrcweir
NameCompare(const DirEntry & rWith) const1432cdf0e10cSrcweir StringCompare DirEntry::NameCompare( const DirEntry &rWith ) const
1433cdf0e10cSrcweir {
1434cdf0e10cSrcweir ByteString aThisName;
1435cdf0e10cSrcweir ByteString aParameterName;
1436cdf0e10cSrcweir
1437cdf0e10cSrcweir #ifdef UNX
1438cdf0e10cSrcweir aThisName = aName;
1439cdf0e10cSrcweir aParameterName = rWith.aName;
1440cdf0e10cSrcweir #else
1441cdf0e10cSrcweir aThisName = ByteString(aName).ToLowerAscii();
1442cdf0e10cSrcweir aParameterName = ByteString(rWith.aName).ToLowerAscii();
1443cdf0e10cSrcweir #endif
1444cdf0e10cSrcweir
1445cdf0e10cSrcweir return aThisName.CompareTo( aParameterName );
1446cdf0e10cSrcweir }
1447cdf0e10cSrcweir
1448cdf0e10cSrcweir
1449cdf0e10cSrcweir /*************************************************************************
1450cdf0e10cSrcweir |*
1451cdf0e10cSrcweir |* DirEntry::operator==()
1452cdf0e10cSrcweir |*
1453cdf0e10cSrcweir |* Beschreibung FSYS.SDW
1454cdf0e10cSrcweir |* Ersterstellung MI 26.04.91
1455cdf0e10cSrcweir |* Letzte Aenderung MA 02.12.91
1456cdf0e10cSrcweir |*
1457cdf0e10cSrcweir *************************************************************************/
1458cdf0e10cSrcweir
operator ==(const DirEntry & rEntry) const1459cdf0e10cSrcweir sal_Bool DirEntry::operator==( const DirEntry& rEntry ) const
1460cdf0e10cSrcweir {
1461cdf0e10cSrcweir DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
1462cdf0e10cSrcweir
1463*73fec56aSmseidel // test whether the contents are textual the same
1464cdf0e10cSrcweir
1465cdf0e10cSrcweir if ( nError && ( nError == rEntry.nError ) )
1466cdf0e10cSrcweir return sal_True;
1467cdf0e10cSrcweir if ( nError || rEntry.nError ||
1468cdf0e10cSrcweir ( eFlag == FSYS_FLAG_INVALID ) ||
1469cdf0e10cSrcweir ( rEntry.eFlag == FSYS_FLAG_INVALID ) )
1470cdf0e10cSrcweir return sal_False;
1471cdf0e10cSrcweir
1472cdf0e10cSrcweir #ifndef OS2
1473cdf0e10cSrcweir const
1474cdf0e10cSrcweir #endif
1475cdf0e10cSrcweir DirEntry *pThis = (DirEntry *)this;
1476cdf0e10cSrcweir #ifndef OS2
1477cdf0e10cSrcweir const
1478cdf0e10cSrcweir #endif
1479cdf0e10cSrcweir DirEntry *pWith = (DirEntry *)&rEntry;
1480cdf0e10cSrcweir while( pThis && pWith && (pThis->eFlag == pWith->eFlag) )
1481cdf0e10cSrcweir {
1482cdf0e10cSrcweir if ( CMP_LOWER(pThis->aName) != CMP_LOWER(pWith->aName) )
1483cdf0e10cSrcweir break;
1484cdf0e10cSrcweir pThis = pThis->pParent;
1485cdf0e10cSrcweir pWith = pWith->pParent;
1486cdf0e10cSrcweir }
1487cdf0e10cSrcweir
1488cdf0e10cSrcweir return ( !pThis && !pWith );
1489cdf0e10cSrcweir }
1490cdf0e10cSrcweir
1491cdf0e10cSrcweir /*************************************************************************
1492cdf0e10cSrcweir |*
1493cdf0e10cSrcweir |* DirEntry::operator=()
1494cdf0e10cSrcweir |*
1495cdf0e10cSrcweir |* Beschreibung FSYS.SDW
1496cdf0e10cSrcweir |* Ersterstellung MI 26.04.91
1497cdf0e10cSrcweir |* Letzte Aenderung MA 02.12.91
1498cdf0e10cSrcweir |*
1499cdf0e10cSrcweir *************************************************************************/
1500cdf0e10cSrcweir
operator =(const DirEntry & rEntry)1501cdf0e10cSrcweir DirEntry& DirEntry::operator=( const DirEntry& rEntry )
1502cdf0e10cSrcweir {
1503cdf0e10cSrcweir DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
1504cdf0e10cSrcweir
1505cdf0e10cSrcweir if ( this == &rEntry )
1506cdf0e10cSrcweir return *this;
1507cdf0e10cSrcweir if ( rEntry.nError != FSYS_ERR_OK ) {
1508cdf0e10cSrcweir DBG_ERROR("Zuweisung mit invalidem DirEntry");
1509cdf0e10cSrcweir nError = rEntry.nError;
1510cdf0e10cSrcweir return *this;
1511cdf0e10cSrcweir }
1512cdf0e10cSrcweir
1513cdf0e10cSrcweir // Name und Typ uebernehmen, Refs beibehalten
1514cdf0e10cSrcweir aName = rEntry.aName;
1515cdf0e10cSrcweir eFlag = rEntry.eFlag;
1516cdf0e10cSrcweir nError = FSYS_ERR_OK;
1517cdf0e10cSrcweir
1518cdf0e10cSrcweir DirEntry *pOldParent = pParent;
1519cdf0e10cSrcweir if ( rEntry.pParent )
1520cdf0e10cSrcweir pParent = new DirEntry( *rEntry.pParent );
1521cdf0e10cSrcweir else
1522cdf0e10cSrcweir pParent = NULL;
1523cdf0e10cSrcweir
1524cdf0e10cSrcweir if ( pOldParent )
1525cdf0e10cSrcweir delete pOldParent;
1526cdf0e10cSrcweir return *this;
1527cdf0e10cSrcweir }
1528cdf0e10cSrcweir
1529cdf0e10cSrcweir /*************************************************************************
1530cdf0e10cSrcweir |*
1531cdf0e10cSrcweir |* DirEntry::operator+()
1532cdf0e10cSrcweir |*
1533cdf0e10cSrcweir |* Beschreibung FSYS.SDW
1534cdf0e10cSrcweir |* Ersterstellung MI 26.04.91
1535cdf0e10cSrcweir |* Letzte Aenderung MA 02.12.91
1536cdf0e10cSrcweir |*
1537cdf0e10cSrcweir *************************************************************************/
1538cdf0e10cSrcweir
operator +(const DirEntry & rEntry) const1539cdf0e10cSrcweir DirEntry DirEntry::operator+( const DirEntry& rEntry ) const
1540cdf0e10cSrcweir {
1541cdf0e10cSrcweir DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
1542cdf0e10cSrcweir #ifdef DBG_UTIL
1543cdf0e10cSrcweir static sal_Bool bTested = sal_False;
1544cdf0e10cSrcweir if ( !bTested )
1545cdf0e10cSrcweir {
1546cdf0e10cSrcweir bTested = sal_True;
1547cdf0e10cSrcweir FSysTest();
1548cdf0e10cSrcweir }
1549cdf0e10cSrcweir #endif
1550cdf0e10cSrcweir
1551cdf0e10cSrcweir const DirEntry *pEntryTop = rEntry.ImpGetTopPtr();
1552cdf0e10cSrcweir const DirEntry *pThisTop = ImpGetTopPtr();
1553cdf0e10cSrcweir
1554cdf0e10cSrcweir // "." + irgendwas oder irgendwas + "d:irgendwas"
1555cdf0e10cSrcweir /* TPF:org
1556cdf0e10cSrcweir if ( ( eFlag == FSYS_FLAG_RELROOT && !aName ) ||
1557cdf0e10cSrcweir ( pEntryTop->aName.Len() &&
1558cdf0e10cSrcweir ( pEntryTop->eFlag == FSYS_FLAG_ABSROOT ||
1559cdf0e10cSrcweir pEntryTop->eFlag == FSYS_FLAG_RELROOT ||
1560cdf0e10cSrcweir pEntryTop->eFlag == FSYS_FLAG_VOLUME ) ) )
1561cdf0e10cSrcweir return rEntry;
1562cdf0e10cSrcweir */
1563cdf0e10cSrcweir
1564cdf0e10cSrcweir if (
1565cdf0e10cSrcweir (eFlag == FSYS_FLAG_RELROOT && !aName.Len()) ||
1566cdf0e10cSrcweir (
1567cdf0e10cSrcweir (pEntryTop->aName.Len() ||
1568cdf0e10cSrcweir ((rEntry.Level()>1)?(rEntry[rEntry.Level()-2].aName.CompareIgnoreCaseToAscii(RFS_IDENTIFIER)==COMPARE_EQUAL):sal_False))
1569cdf0e10cSrcweir &&
1570cdf0e10cSrcweir (pEntryTop->eFlag == FSYS_FLAG_ABSROOT ||
1571cdf0e10cSrcweir pEntryTop->eFlag == FSYS_FLAG_RELROOT ||
1572cdf0e10cSrcweir pEntryTop->eFlag == FSYS_FLAG_VOLUME)
1573cdf0e10cSrcweir )
1574cdf0e10cSrcweir )
1575cdf0e10cSrcweir {
1576cdf0e10cSrcweir return rEntry;
1577cdf0e10cSrcweir }
1578cdf0e10cSrcweir
1579cdf0e10cSrcweir // irgendwas + "." (=> pEntryTop == &rEntry)
1580cdf0e10cSrcweir if ( pEntryTop->eFlag == FSYS_FLAG_RELROOT && !pEntryTop->aName.Len() )
1581cdf0e10cSrcweir {
1582cdf0e10cSrcweir DBG_ASSERT( pEntryTop == &rEntry, "DirEntry::op+ buggy" );
1583cdf0e10cSrcweir return *this;
1584cdf0e10cSrcweir }
1585cdf0e10cSrcweir
1586cdf0e10cSrcweir // root += ".." (=> unmoeglich)
1587cdf0e10cSrcweir if ( pEntryTop->eFlag == FSYS_FLAG_PARENT && pThisTop == this &&
1588cdf0e10cSrcweir ( eFlag == FSYS_FLAG_ABSROOT ) )
1589cdf0e10cSrcweir return DirEntry( FSYS_FLAG_INVALID );
1590cdf0e10cSrcweir
1591cdf0e10cSrcweir // irgendwas += abs (=> nur Device uebernehmen falls vorhanden)
1592cdf0e10cSrcweir if ( pEntryTop->eFlag == FSYS_FLAG_ABSROOT )
1593cdf0e10cSrcweir {
1594cdf0e10cSrcweir ByteString aDevice;
1595cdf0e10cSrcweir if ( pThisTop->eFlag == FSYS_FLAG_ABSROOT )
1596cdf0e10cSrcweir aDevice = pThisTop->aName;
1597cdf0e10cSrcweir DirEntry aRet = rEntry;
1598cdf0e10cSrcweir if ( aDevice.Len() )
1599cdf0e10cSrcweir aRet.ImpGetTopPtr()->aName = aDevice;
1600cdf0e10cSrcweir return aRet;
1601cdf0e10cSrcweir }
1602cdf0e10cSrcweir
1603cdf0e10cSrcweir // irgendwas += ".." (=> aufloesen)
1604cdf0e10cSrcweir if ( eFlag == FSYS_FLAG_NORMAL && pEntryTop->eFlag == FSYS_FLAG_PARENT )
1605cdf0e10cSrcweir {
1606cdf0e10cSrcweir String aConcated( GetFull() );
1607cdf0e10cSrcweir aConcated += ACCESSDELIM_C(FSYS_STYLE_HOST);
1608cdf0e10cSrcweir aConcated += rEntry.GetFull();
1609cdf0e10cSrcweir return DirEntry( aConcated );
1610cdf0e10cSrcweir }
1611cdf0e10cSrcweir
1612cdf0e10cSrcweir // sonst einfach hintereinander haengen
1613cdf0e10cSrcweir DirEntry aRet( rEntry );
1614cdf0e10cSrcweir DirEntry *pTop = aRet.ImpGetTopPtr();
1615cdf0e10cSrcweir pTop->pParent = new DirEntry( *this );
1616cdf0e10cSrcweir
1617cdf0e10cSrcweir return aRet;
1618cdf0e10cSrcweir }
1619cdf0e10cSrcweir
1620cdf0e10cSrcweir /*************************************************************************
1621cdf0e10cSrcweir |*
1622cdf0e10cSrcweir |* DirEntry::operator+=()
1623cdf0e10cSrcweir |*
1624cdf0e10cSrcweir |* Beschreibung FSYS.SDW
1625cdf0e10cSrcweir |* Ersterstellung MI 26.04.91
1626cdf0e10cSrcweir |* Letzte Aenderung MA 02.12.91
1627cdf0e10cSrcweir |*
1628cdf0e10cSrcweir *************************************************************************/
1629cdf0e10cSrcweir
operator +=(const DirEntry & rEntry)1630cdf0e10cSrcweir DirEntry &DirEntry::operator+=( const DirEntry& rEntry )
1631cdf0e10cSrcweir {
1632cdf0e10cSrcweir DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
1633cdf0e10cSrcweir
1634cdf0e10cSrcweir return *this = *this + rEntry;
1635cdf0e10cSrcweir }
1636cdf0e10cSrcweir
1637cdf0e10cSrcweir /*************************************************************************
1638cdf0e10cSrcweir |*
1639cdf0e10cSrcweir |* DirEntry::GetAccessDelimiter()
1640cdf0e10cSrcweir |*
1641cdf0e10cSrcweir |* Beschreibung FSYS.SDW
1642cdf0e10cSrcweir |* Ersterstellung MI 27.05.93
1643cdf0e10cSrcweir |* Letzte Aenderung MI 10.06.93
1644cdf0e10cSrcweir |*
1645cdf0e10cSrcweir *************************************************************************/
1646cdf0e10cSrcweir
GetAccessDelimiter(FSysPathStyle eFormatter)1647cdf0e10cSrcweir String DirEntry::GetAccessDelimiter( FSysPathStyle eFormatter )
1648cdf0e10cSrcweir {
1649cdf0e10cSrcweir return String( ACCESSDELIM_C( GetStyle( eFormatter ) ) );
1650cdf0e10cSrcweir }
1651cdf0e10cSrcweir
1652cdf0e10cSrcweir /*************************************************************************
1653cdf0e10cSrcweir |*
1654cdf0e10cSrcweir |* DirEntry::SetExtension()
1655cdf0e10cSrcweir |*
1656cdf0e10cSrcweir |* Beschreibung FSYS.SDW
1657cdf0e10cSrcweir |* Ersterstellung MI 02.08.91
1658cdf0e10cSrcweir |* Letzte Aenderung MA 02.12.91
1659cdf0e10cSrcweir |*
1660cdf0e10cSrcweir *************************************************************************/
1661cdf0e10cSrcweir
SetExtension(const String & rExtension,char cSep)1662cdf0e10cSrcweir void DirEntry::SetExtension( const String& rExtension, char cSep )
1663cdf0e10cSrcweir {
1664cdf0e10cSrcweir DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
1665cdf0e10cSrcweir
1666cdf0e10cSrcweir // do not set extensions for drives
1667cdf0e10cSrcweir if(eFlag == FSYS_FLAG_ABSROOT)
1668cdf0e10cSrcweir {
1669cdf0e10cSrcweir nError = FSYS_ERR_NOTSUPPORTED;
1670cdf0e10cSrcweir return;
1671cdf0e10cSrcweir }
1672cdf0e10cSrcweir
1673cdf0e10cSrcweir // cSep im Namen suchen
1674cdf0e10cSrcweir const char *p0 = ( aName.GetBuffer() );
1675cdf0e10cSrcweir const char *p1 = p0 + aName.Len() - 1;
1676cdf0e10cSrcweir while ( p1 >= p0 && *p1 != cSep )
1677cdf0e10cSrcweir p1--;
1678cdf0e10cSrcweir if ( p1 >= p0 )
1679cdf0e10cSrcweir {
1680cdf0e10cSrcweir // es wurde ein cSep an der Position p1 gefunden
1681cdf0e10cSrcweir aName.Erase(
1682cdf0e10cSrcweir static_cast< xub_StrLen >(
1683cdf0e10cSrcweir p1 - p0 + 1 - ( rExtension.Len() ? 0 : 1 )) );
1684cdf0e10cSrcweir aName += ByteString(rExtension, osl_getThreadTextEncoding());
1685cdf0e10cSrcweir }
1686cdf0e10cSrcweir else if ( rExtension.Len() )
1687cdf0e10cSrcweir {
1688cdf0e10cSrcweir // es wurde kein cSep gefunden
1689cdf0e10cSrcweir aName += cSep;
1690cdf0e10cSrcweir aName += ByteString(rExtension, osl_getThreadTextEncoding());
1691cdf0e10cSrcweir }
1692cdf0e10cSrcweir }
1693cdf0e10cSrcweir
1694cdf0e10cSrcweir /*************************************************************************
1695cdf0e10cSrcweir |*
1696cdf0e10cSrcweir |* DirEntry::CutExtension()
1697cdf0e10cSrcweir |*
1698cdf0e10cSrcweir |* Beschreibung FSYS.SDW
1699cdf0e10cSrcweir |* Ersterstellung MI 23.07.93
1700cdf0e10cSrcweir |* Letzte Aenderung MI 23.07.93
1701cdf0e10cSrcweir |*
1702cdf0e10cSrcweir *************************************************************************/
1703cdf0e10cSrcweir
CutExtension(char cSep)1704cdf0e10cSrcweir String DirEntry::CutExtension( char cSep )
1705cdf0e10cSrcweir {
1706cdf0e10cSrcweir DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
1707cdf0e10cSrcweir
1708cdf0e10cSrcweir const char *p0 = ( aName.GetBuffer() );
1709cdf0e10cSrcweir const char *p1 = p0 + aName.Len() - 1;
1710cdf0e10cSrcweir while ( p1 >= p0 && *p1 != cSep )
1711cdf0e10cSrcweir p1--;
1712cdf0e10cSrcweir
1713cdf0e10cSrcweir if ( p1 >= p0 )
1714cdf0e10cSrcweir {
1715cdf0e10cSrcweir // es wurde ein cSep an der Position p1 gefunden
1716cdf0e10cSrcweir aName.Erase( static_cast< xub_StrLen >(p1-p0) );
1717cdf0e10cSrcweir return String(p1 + 1, osl_getThreadTextEncoding());
1718cdf0e10cSrcweir }
1719cdf0e10cSrcweir
1720cdf0e10cSrcweir return String();
1721cdf0e10cSrcweir }
1722cdf0e10cSrcweir
1723cdf0e10cSrcweir /*************************************************************************
1724cdf0e10cSrcweir |*
1725cdf0e10cSrcweir |* DirEntry::SetName()
1726cdf0e10cSrcweir |*
1727cdf0e10cSrcweir |* Beschreibung FSYS.SDW
1728cdf0e10cSrcweir |* Ersterstellung MI 04.09.93
1729cdf0e10cSrcweir |* Letzte Aenderung MI 04.09.93
1730cdf0e10cSrcweir |*
1731cdf0e10cSrcweir *************************************************************************/
1732cdf0e10cSrcweir
SetName(const String & rName,FSysPathStyle eFormatter)1733cdf0e10cSrcweir void DirEntry::SetName( const String& rName, FSysPathStyle eFormatter )
1734cdf0e10cSrcweir {
1735cdf0e10cSrcweir DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
1736cdf0e10cSrcweir
1737cdf0e10cSrcweir if ( eFormatter == FSYS_STYLE_HOST || eFormatter == FSYS_STYLE_DETECT )
1738cdf0e10cSrcweir eFormatter = DEFSTYLE;
1739cdf0e10cSrcweir ByteString aAccDelim( ACCESSDELIM_C( eFormatter ) );
1740cdf0e10cSrcweir
1741cdf0e10cSrcweir if ( (eFlag != FSYS_FLAG_NORMAL) ||
1742cdf0e10cSrcweir (aName.Search( ':' ) != STRING_NOTFOUND) ||
1743cdf0e10cSrcweir (aName.Search( aAccDelim ) != STRING_NOTFOUND) ||
1744cdf0e10cSrcweir (eFormatter == FSYS_STYLE_FAT && (aName.GetTokenCount( '.' ) > 2) ) )
1745cdf0e10cSrcweir {
1746cdf0e10cSrcweir eFlag = FSYS_FLAG_INVALID;
1747cdf0e10cSrcweir }
1748cdf0e10cSrcweir else
1749cdf0e10cSrcweir {
1750cdf0e10cSrcweir aName = ByteString(rName, osl_getThreadTextEncoding());
1751cdf0e10cSrcweir }
1752cdf0e10cSrcweir }
1753cdf0e10cSrcweir
1754cdf0e10cSrcweir /*************************************************************************
1755cdf0e10cSrcweir |*
1756cdf0e10cSrcweir |* DirEntry::Find()
1757cdf0e10cSrcweir |*
1758cdf0e10cSrcweir |* Beschreibung FSYS.SDW
1759cdf0e10cSrcweir |* Ersterstellung MI 26.04.91
1760cdf0e10cSrcweir |* Letzte Aenderung MA 02.12.91
1761cdf0e10cSrcweir |*
1762cdf0e10cSrcweir *************************************************************************/
Find(const String & rPfad,char cDelim)1763cdf0e10cSrcweir sal_Bool DirEntry::Find( const String& rPfad, char cDelim )
1764cdf0e10cSrcweir {
1765cdf0e10cSrcweir DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
1766cdf0e10cSrcweir
1767cdf0e10cSrcweir if ( ImpGetTopPtr()->eFlag == FSYS_FLAG_ABSROOT )
1768cdf0e10cSrcweir return sal_True;
1769cdf0e10cSrcweir
1770cdf0e10cSrcweir sal_Bool bWild = aName.Search( '*' ) != STRING_NOTFOUND ||
1771cdf0e10cSrcweir aName.Search( '?' ) != STRING_NOTFOUND;
1772cdf0e10cSrcweir if ( !cDelim )
1773cdf0e10cSrcweir cDelim = SEARCHDELIM(DEFSTYLE)[0];
1774cdf0e10cSrcweir
1775cdf0e10cSrcweir sal_uInt16 nTokenCount = rPfad.GetTokenCount( cDelim );
1776cdf0e10cSrcweir sal_uInt16 nIndex = 0;
1777cdf0e10cSrcweir ByteString aThis = ACCESSDELIM(DEFSTYLE);
1778cdf0e10cSrcweir aThis += ByteString(GetFull(), osl_getThreadTextEncoding());
1779cdf0e10cSrcweir for ( sal_uInt16 nToken = 0; nToken < nTokenCount; ++nToken )
1780cdf0e10cSrcweir {
1781cdf0e10cSrcweir ByteString aPath = ByteString(rPfad, osl_getThreadTextEncoding()).GetToken( 0, cDelim, nIndex );
1782cdf0e10cSrcweir
1783cdf0e10cSrcweir if ( aPath.Len() )
1784cdf0e10cSrcweir {
1785cdf0e10cSrcweir if (aPath.GetChar(aPath.Len()-1)== ACCESSDELIM(DEFSTYLE)[0])
1786cdf0e10cSrcweir aPath.Erase(aPath.Len()-1);
1787cdf0e10cSrcweir aPath += aThis;
1788cdf0e10cSrcweir DirEntry aEntry( String(aPath, osl_getThreadTextEncoding()));
1789cdf0e10cSrcweir if ( aEntry.ToAbs() &&
1790cdf0e10cSrcweir ( ( !bWild && aEntry.Exists() ) || ( bWild && aEntry.First() ) ) )
1791cdf0e10cSrcweir {
1792cdf0e10cSrcweir (*this) = aEntry;
1793cdf0e10cSrcweir return sal_True;
1794cdf0e10cSrcweir }
1795cdf0e10cSrcweir }
1796cdf0e10cSrcweir }
1797cdf0e10cSrcweir return sal_False;
1798cdf0e10cSrcweir }
1799cdf0e10cSrcweir
1800cdf0e10cSrcweir /*************************************************************************
1801cdf0e10cSrcweir |*
1802cdf0e10cSrcweir |* DirEntry::ImpToRel()
1803cdf0e10cSrcweir |*
1804cdf0e10cSrcweir |* Beschreibung
1805cdf0e10cSrcweir |* Ersterstellung MI 17.06.93
1806cdf0e10cSrcweir |* Letzte Aenderung MI 17.06.93
1807cdf0e10cSrcweir |*
1808cdf0e10cSrcweir *************************************************************************/
1809cdf0e10cSrcweir
ImpToRel(String aCurStr)1810cdf0e10cSrcweir sal_Bool DirEntry::ImpToRel( String aCurStr )
1811cdf0e10cSrcweir {
1812cdf0e10cSrcweir DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
1813cdf0e10cSrcweir
1814cdf0e10cSrcweir DirEntry aThis(*this);
1815cdf0e10cSrcweir aThis.ToAbs();
1816cdf0e10cSrcweir String aThisStr( aThis.GetFull( FSYS_STYLE_HPFS ) );
1817cdf0e10cSrcweir
1818cdf0e10cSrcweir // #109512 preserve case of path even if caseinsensitive
1819cdf0e10cSrcweir String aThisCompareStr( aThisStr ), aCurCompareStr( aCurStr );
1820cdf0e10cSrcweir if ( ! IsCaseSensitive() )
1821cdf0e10cSrcweir {
1822cdf0e10cSrcweir aThisCompareStr.ToLowerAscii();
1823cdf0e10cSrcweir aCurCompareStr.ToLowerAscii();
1824cdf0e10cSrcweir }
1825cdf0e10cSrcweir
1826cdf0e10cSrcweir // "Ubereinstimmung pr"ufen
1827cdf0e10cSrcweir sal_uInt16 nPos = aThisCompareStr.Match( aCurCompareStr );
1828cdf0e10cSrcweir if ( nPos == STRING_MATCH && aThisStr.Len() != aCurStr.Len() )
1829cdf0e10cSrcweir nPos = Min( aThisStr.Len(), aCurStr.Len() );
1830cdf0e10cSrcweir
1831cdf0e10cSrcweir // Sonderfall, die DirEntries sind identisch
1832cdf0e10cSrcweir if ( nPos == STRING_MATCH )
1833cdf0e10cSrcweir {
1834cdf0e10cSrcweir // dann ist der relative Pfad das aktuelle Verzeichnis
1835cdf0e10cSrcweir *this = DirEntry();
1836cdf0e10cSrcweir return sal_True;
1837cdf0e10cSrcweir }
1838cdf0e10cSrcweir
1839cdf0e10cSrcweir // Sonderfall, die DirEntries sind total verschieden
1840cdf0e10cSrcweir if ( nPos == 0 )
1841cdf0e10cSrcweir {
1842cdf0e10cSrcweir // dann ist der relativste Pfad absolut
1843cdf0e10cSrcweir *this = aThis;
1844cdf0e10cSrcweir return sal_False;
1845cdf0e10cSrcweir }
1846cdf0e10cSrcweir
1847cdf0e10cSrcweir // sonst nehmen wir die identischen Einzelteile vorne weg
1848cdf0e10cSrcweir while ( nPos > 0 && aThisStr.GetChar(nPos) != '\\' )
1849cdf0e10cSrcweir --nPos;
1850cdf0e10cSrcweir aThisStr.Erase( 0, nPos + ( ( aThisStr.GetChar(nPos) == '\\' ) ? 1 : 0 ) );
1851cdf0e10cSrcweir aCurStr.Erase( 0, nPos + ( ( aCurStr.GetChar(nPos) == '\\' ) ? 1 : 0 ) );
1852cdf0e10cSrcweir
1853cdf0e10cSrcweir // und fuellen mit dem Level der Directories auf
1854cdf0e10cSrcweir for ( nPos = 0; nPos < aCurStr.Len(); ++nPos )
1855cdf0e10cSrcweir if ( aCurStr.GetChar(nPos) == '\\' )
1856cdf0e10cSrcweir aThisStr.Insert( String( "..\\", osl_getThreadTextEncoding() ), 0 );
1857cdf0e10cSrcweir
1858cdf0e10cSrcweir // das ist dann unser relativer Pfad
1859cdf0e10cSrcweir *this = DirEntry( aThisStr, FSYS_STYLE_HPFS );
1860cdf0e10cSrcweir return sal_True;
1861cdf0e10cSrcweir }
1862cdf0e10cSrcweir
1863cdf0e10cSrcweir /*************************************************************************
1864cdf0e10cSrcweir |*
1865cdf0e10cSrcweir |* DirEntry::CutRelParents()
1866cdf0e10cSrcweir |*
1867cdf0e10cSrcweir |* Beschreibung
1868cdf0e10cSrcweir |* Ersterstellung MI 01.08.95
1869cdf0e10cSrcweir |* Letzte Aenderung MI 01.08.95
1870cdf0e10cSrcweir |*
1871cdf0e10cSrcweir *************************************************************************/
1872cdf0e10cSrcweir
CutRelParents()1873cdf0e10cSrcweir sal_uInt16 DirEntry::CutRelParents()
1874cdf0e10cSrcweir {
1875cdf0e10cSrcweir DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
1876cdf0e10cSrcweir
1877cdf0e10cSrcweir // erstes '..' finden
1878cdf0e10cSrcweir DirEntry *pDir = 0;
1879cdf0e10cSrcweir DirEntry *pPar;
1880cdf0e10cSrcweir
1881cdf0e10cSrcweir for ( pPar = this;
1882cdf0e10cSrcweir pPar && pPar->eFlag != FSYS_FLAG_PARENT;
1883cdf0e10cSrcweir pPar = pPar->pParent )
1884cdf0e10cSrcweir pDir = pPar;
1885cdf0e10cSrcweir
1886cdf0e10cSrcweir // '..' zaehlen
1887cdf0e10cSrcweir sal_uInt16 nParCount = 0;
1888cdf0e10cSrcweir while ( pPar && pPar->eFlag == FSYS_FLAG_PARENT )
1889cdf0e10cSrcweir {
1890cdf0e10cSrcweir ++nParCount;
1891cdf0e10cSrcweir pPar = pPar->pParent;
1892cdf0e10cSrcweir }
1893cdf0e10cSrcweir
1894cdf0e10cSrcweir // cutten
1895cdf0e10cSrcweir if ( pDir )
1896cdf0e10cSrcweir DELETEZ(pDir->pParent);
1897cdf0e10cSrcweir else
1898cdf0e10cSrcweir eFlag = FSYS_FLAG_CURRENT;
1899cdf0e10cSrcweir
1900cdf0e10cSrcweir return nParCount;
1901cdf0e10cSrcweir }
1902cdf0e10cSrcweir
1903cdf0e10cSrcweir /*************************************************************************
1904cdf0e10cSrcweir |*
1905cdf0e10cSrcweir |* DirEntry::ToRel()
1906cdf0e10cSrcweir |*
1907cdf0e10cSrcweir |* Beschreibung FSYS.SDW
1908cdf0e10cSrcweir |* Ersterstellung MI 26.06.93
1909cdf0e10cSrcweir |* Letzte Aenderung MI 17.06.93
1910cdf0e10cSrcweir |*
1911cdf0e10cSrcweir *************************************************************************/
1912cdf0e10cSrcweir
ToRel()1913cdf0e10cSrcweir sal_Bool DirEntry::ToRel()
1914cdf0e10cSrcweir {
1915cdf0e10cSrcweir DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
1916cdf0e10cSrcweir
1917cdf0e10cSrcweir DirEntry aCur;
1918cdf0e10cSrcweir aCur.ToAbs();
1919cdf0e10cSrcweir return ImpToRel( aCur.GetFull( FSYS_STYLE_HPFS ) );
1920cdf0e10cSrcweir }
1921cdf0e10cSrcweir
1922cdf0e10cSrcweir /*************************************************************************
1923cdf0e10cSrcweir |*
1924cdf0e10cSrcweir |* DirEntry::ToRel()
1925cdf0e10cSrcweir |*
1926cdf0e10cSrcweir |* Beschreibung FSYS.SDW
1927cdf0e10cSrcweir |* Ersterstellung MI 26.04.91
1928cdf0e10cSrcweir |* Letzte Aenderung MA 02.12.91
1929cdf0e10cSrcweir |*
1930cdf0e10cSrcweir *************************************************************************/
1931cdf0e10cSrcweir
ToRel(const DirEntry & rStart)1932cdf0e10cSrcweir sal_Bool DirEntry::ToRel( const DirEntry& rStart )
1933cdf0e10cSrcweir {
1934cdf0e10cSrcweir DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
1935cdf0e10cSrcweir
1936cdf0e10cSrcweir DirEntry aStart( rStart );
1937cdf0e10cSrcweir aStart.ToAbs();
1938cdf0e10cSrcweir return ImpToRel( aStart.GetFull( FSYS_STYLE_HPFS ) );
1939cdf0e10cSrcweir }
1940cdf0e10cSrcweir
1941cdf0e10cSrcweir /*************************************************************************
1942cdf0e10cSrcweir |*
1943cdf0e10cSrcweir |* DirEntry::GetDevice()
1944cdf0e10cSrcweir |*
1945cdf0e10cSrcweir |* Beschreibung FSYS.SDW
1946cdf0e10cSrcweir |* Ersterstellung MI 26.04.91
1947cdf0e10cSrcweir |* Letzte Aenderung MA 02.12.91
1948cdf0e10cSrcweir |*
1949cdf0e10cSrcweir *************************************************************************/
1950cdf0e10cSrcweir
1951cdf0e10cSrcweir #ifndef UNX
1952cdf0e10cSrcweir
GetDevice() const1953cdf0e10cSrcweir DirEntry DirEntry::GetDevice() const
1954cdf0e10cSrcweir {
1955cdf0e10cSrcweir DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
1956cdf0e10cSrcweir
1957cdf0e10cSrcweir const DirEntry *pTop = ImpGetTopPtr();
1958cdf0e10cSrcweir
1959cdf0e10cSrcweir if ( ( pTop->eFlag == FSYS_FLAG_ABSROOT || pTop->eFlag == FSYS_FLAG_RELROOT ) &&
1960cdf0e10cSrcweir pTop->aName.Len() )
1961cdf0e10cSrcweir return DirEntry( pTop->aName, FSYS_FLAG_VOLUME, FSYS_STYLE_HOST );
1962cdf0e10cSrcweir else
1963cdf0e10cSrcweir return DirEntry( ByteString(), FSYS_FLAG_INVALID, FSYS_STYLE_HOST );
1964cdf0e10cSrcweir }
1965cdf0e10cSrcweir
1966cdf0e10cSrcweir #endif
1967cdf0e10cSrcweir
1968cdf0e10cSrcweir /*************************************************************************
1969cdf0e10cSrcweir |*
1970cdf0e10cSrcweir |* DirEntry::SetBase()
1971cdf0e10cSrcweir |*
1972cdf0e10cSrcweir |* Beschreibung FSYS.SDW
1973cdf0e10cSrcweir |* Ersterstellung MI 23.10.91
1974cdf0e10cSrcweir |* Letzte Aenderung MA 02.12.91
1975cdf0e10cSrcweir |*
1976cdf0e10cSrcweir *************************************************************************/
1977cdf0e10cSrcweir
SetBase(const String & rBase,char cSep)1978cdf0e10cSrcweir void DirEntry::SetBase( const String& rBase, char cSep )
1979cdf0e10cSrcweir {
1980cdf0e10cSrcweir DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
1981cdf0e10cSrcweir
1982cdf0e10cSrcweir const char *p0 = ( aName.GetBuffer() );
1983cdf0e10cSrcweir const char *p1 = p0 + aName.Len() - 1;
1984cdf0e10cSrcweir while ( p1 >= p0 && *p1 != cSep )
1985cdf0e10cSrcweir p1--;
1986cdf0e10cSrcweir
1987cdf0e10cSrcweir if ( p1 >= p0 )
1988cdf0e10cSrcweir {
1989cdf0e10cSrcweir // es wurde ein cSep an der Position p1 gefunden
1990cdf0e10cSrcweir aName.Erase( 0, static_cast< xub_StrLen >(p1 - p0) );
1991cdf0e10cSrcweir aName.Insert( ByteString(rBase, osl_getThreadTextEncoding()), 0 );
1992cdf0e10cSrcweir }
1993cdf0e10cSrcweir else
1994cdf0e10cSrcweir aName = ByteString(rBase, osl_getThreadTextEncoding());
1995cdf0e10cSrcweir }
1996cdf0e10cSrcweir
1997cdf0e10cSrcweir /*************************************************************************
1998cdf0e10cSrcweir |*
1999cdf0e10cSrcweir |* DirEntry::GetSearchDelimiter()
2000cdf0e10cSrcweir |*
2001cdf0e10cSrcweir |* Beschreibung FSYS.SDW
2002cdf0e10cSrcweir |* Ersterstellung MI 10.06.93
2003cdf0e10cSrcweir |* Letzte Aenderung MI 10.06.93
2004cdf0e10cSrcweir |*
2005cdf0e10cSrcweir *************************************************************************/
2006cdf0e10cSrcweir
GetSearchDelimiter(FSysPathStyle eFormatter)2007cdf0e10cSrcweir String DirEntry::GetSearchDelimiter( FSysPathStyle eFormatter )
2008cdf0e10cSrcweir {
2009cdf0e10cSrcweir return String( ByteString(SEARCHDELIM( GetStyle( eFormatter ) ) ), osl_getThreadTextEncoding());
2010cdf0e10cSrcweir }
2011cdf0e10cSrcweir
2012cdf0e10cSrcweir /*************************************************************************
2013cdf0e10cSrcweir |*
2014cdf0e10cSrcweir |* DirEntry::GetMaxNameLen()
2015cdf0e10cSrcweir |*
2016cdf0e10cSrcweir |* Beschreibung Liefert die maximale Anzahl von Zeichen in
2017cdf0e10cSrcweir |* einzelnen Namensteile. Bei FileSystmen mit
2018cdf0e10cSrcweir |* fester Extension (FAT) zaehlt diese nicht mit.
2019cdf0e10cSrcweir |* Bei unbekannten FileSytemen und FSYS_STYLE_URL
2020cdf0e10cSrcweir |* wird USHRT_MAX zurueckgegeben.
2021cdf0e10cSrcweir |* Ersterstellung MI 17.06.97
2022cdf0e10cSrcweir |* Letzte Aenderung MI 17.06.97
2023cdf0e10cSrcweir |*
2024cdf0e10cSrcweir *************************************************************************/
2025cdf0e10cSrcweir
GetMaxNameLen(FSysPathStyle eFormatter)2026cdf0e10cSrcweir sal_uInt16 DirEntry::GetMaxNameLen( FSysPathStyle eFormatter )
2027cdf0e10cSrcweir {
2028cdf0e10cSrcweir eFormatter = GetStyle( eFormatter );
2029cdf0e10cSrcweir switch ( eFormatter )
2030cdf0e10cSrcweir {
2031cdf0e10cSrcweir case FSYS_STYLE_MAC: return 31;
2032cdf0e10cSrcweir
2033cdf0e10cSrcweir case FSYS_STYLE_FAT: return 8;
2034cdf0e10cSrcweir
2035cdf0e10cSrcweir case FSYS_STYLE_VFAT:
2036cdf0e10cSrcweir case FSYS_STYLE_NTFS:
2037cdf0e10cSrcweir case FSYS_STYLE_NWFS:
2038cdf0e10cSrcweir case FSYS_STYLE_HPFS: return 255;
2039cdf0e10cSrcweir
2040cdf0e10cSrcweir
2041cdf0e10cSrcweir case FSYS_STYLE_SYSV: return 14;
2042cdf0e10cSrcweir
2043cdf0e10cSrcweir case FSYS_STYLE_BSD: return 250;
2044cdf0e10cSrcweir
2045cdf0e10cSrcweir default:
2046cdf0e10cSrcweir return USHRT_MAX;
2047cdf0e10cSrcweir }
2048cdf0e10cSrcweir }
2049cdf0e10cSrcweir
2050cdf0e10cSrcweir /*************************************************************************
2051cdf0e10cSrcweir |*
2052cdf0e10cSrcweir |* DirEntry::TempName()
2053cdf0e10cSrcweir |*
2054cdf0e10cSrcweir |* Beschreibung FSYS.SDW - Aha, wo?
2055cdf0e10cSrcweir |* Ersterstellung VB 06.09.93 (im SWG)
2056cdf0e10cSrcweir |* Letzte Aenderung MI 06.02.98
2057cdf0e10cSrcweir |*
2058cdf0e10cSrcweir *************************************************************************/
2059cdf0e10cSrcweir namespace { struct TempNameBase_Impl : public rtl::Static< DirEntry, TempNameBase_Impl > {}; }
2060cdf0e10cSrcweir
SetTempNameBase(const String & rBase)2061cdf0e10cSrcweir const DirEntry& DirEntry::SetTempNameBase( const String &rBase )
2062cdf0e10cSrcweir {
2063cdf0e10cSrcweir DirEntry aTempDir = DirEntry().TempName().GetPath();
2064cdf0e10cSrcweir aTempDir += DirEntry( rBase );
2065cdf0e10cSrcweir #ifdef UNX
2066cdf0e10cSrcweir ByteString aName( aTempDir.GetFull(), osl_getThreadTextEncoding());
2067cdf0e10cSrcweir if ( access( aName.GetBuffer(), W_OK | X_OK | R_OK ) )
2068cdf0e10cSrcweir {
2069cdf0e10cSrcweir // Create the directory and only on success give all rights to
2070cdf0e10cSrcweir // everyone. Use mkdir instead of DirEntry::MakeDir because
2071cdf0e10cSrcweir // this returns sal_True even if directory already exists.
2072cdf0e10cSrcweir
2073cdf0e10cSrcweir if ( !mkdir( aName.GetBuffer(), S_IRWXU | S_IRWXG | S_IRWXO ) )
2074cdf0e10cSrcweir chmod( aName.GetBuffer(), S_IRWXU | S_IRWXG | S_IRWXO );
2075cdf0e10cSrcweir
2076cdf0e10cSrcweir // This will not create a directory but perhaps FileStat called
2077cdf0e10cSrcweir // there modifies the DirEntry
2078cdf0e10cSrcweir
2079cdf0e10cSrcweir aTempDir.MakeDir();
2080cdf0e10cSrcweir }
2081cdf0e10cSrcweir #else
2082cdf0e10cSrcweir aTempDir.MakeDir();
2083cdf0e10cSrcweir #endif
2084cdf0e10cSrcweir DirEntry &rEntry = TempNameBase_Impl::get();
2085cdf0e10cSrcweir rEntry = aTempDir.TempName( FSYS_KIND_DIR );
2086cdf0e10cSrcweir return rEntry;
2087cdf0e10cSrcweir }
2088cdf0e10cSrcweir
TempName(DirEntryKind eKind) const2089cdf0e10cSrcweir DirEntry DirEntry::TempName( DirEntryKind eKind ) const
2090cdf0e10cSrcweir {
2091cdf0e10cSrcweir // ggf. Base-Temp-Dir verwenden (macht Remote keinen Sinn => vorher)
2092cdf0e10cSrcweir const DirEntry &rEntry = TempNameBase_Impl::get();
2093cdf0e10cSrcweir if ( !pParent && FSYS_FLAG_CURRENT != rEntry.eFlag && FSYS_FLAG_ABSROOT != eFlag )
2094cdf0e10cSrcweir
2095cdf0e10cSrcweir {
2096cdf0e10cSrcweir DirEntry aFactory( rEntry );
2097cdf0e10cSrcweir aFactory += GetName();
2098cdf0e10cSrcweir return aFactory.TempName();
2099cdf0e10cSrcweir }
2100cdf0e10cSrcweir
2101cdf0e10cSrcweir ByteString aDirName; // hiermit hatte MPW C++ Probleme - immmer noch??
2102cdf0e10cSrcweir char *ret_val;
2103cdf0e10cSrcweir size_t i;
2104cdf0e10cSrcweir
2105cdf0e10cSrcweir // dertermine Directory, Prefix and Extension
2106cdf0e10cSrcweir char pfx[6];
2107cdf0e10cSrcweir char ext[5];
2108cdf0e10cSrcweir const char *dir;
2109cdf0e10cSrcweir const char *pWild = strchr( aName.GetBuffer(), '*' );
2110cdf0e10cSrcweir if ( !pWild )
2111cdf0e10cSrcweir pWild = strchr( aName.GetBuffer(), '?' );
2112cdf0e10cSrcweir
2113cdf0e10cSrcweir if ( pWild )
2114cdf0e10cSrcweir {
2115cdf0e10cSrcweir if ( pParent )
2116cdf0e10cSrcweir aDirName = ByteString(pParent->GetFull(), osl_getThreadTextEncoding());
2117cdf0e10cSrcweir strncpy( pfx, aName.GetBuffer(), Min( (int)5, (int)(pWild-aName.GetBuffer()) ) );
2118cdf0e10cSrcweir pfx[ pWild-aName.GetBuffer() ] = 0;
2119cdf0e10cSrcweir const char *pExt = strchr( pWild, '.' );
2120cdf0e10cSrcweir if ( pExt )
2121cdf0e10cSrcweir {
2122cdf0e10cSrcweir strncpy( ext, pExt, 4 );
2123cdf0e10cSrcweir ext[4] = 0;
2124cdf0e10cSrcweir }
2125cdf0e10cSrcweir else
2126cdf0e10cSrcweir strcpy( ext, ".tmp" );
2127cdf0e10cSrcweir }
2128cdf0e10cSrcweir else
2129cdf0e10cSrcweir {
2130cdf0e10cSrcweir aDirName = ByteString(GetFull(), osl_getThreadTextEncoding());
2131cdf0e10cSrcweir strcpy( pfx, "sv" );
2132cdf0e10cSrcweir strcpy( ext, ".tmp" );
2133cdf0e10cSrcweir }
2134cdf0e10cSrcweir dir = aDirName.GetBuffer();
2135cdf0e10cSrcweir
2136cdf0e10cSrcweir // wurde kein Dir angegeben, dann nehmen wir ein passendes TEMP-Verz.
2137cdf0e10cSrcweir char sBuf[_MAX_PATH];
2138cdf0e10cSrcweir if ( eFlag == FSYS_FLAG_CURRENT || ( !pParent && pWild ) )
2139cdf0e10cSrcweir dir = TempDirImpl(sBuf);
2140cdf0e10cSrcweir
2141cdf0e10cSrcweir // ab hier leicht modifizierter Code von VB
2142cdf0e10cSrcweir DirEntry aRet(FSYS_FLAG_INVALID);
2143cdf0e10cSrcweir i = strlen(dir);
2144cdf0e10cSrcweir // need to add ?\\? + prefix + number + pid + .ext + '\0'
2145cdf0e10cSrcweir # define TMPNAME_SIZE ( 1 + 5 + 5 + 10 + 4 + 1 )
2146cdf0e10cSrcweir ret_val = new char[i + TMPNAME_SIZE ];
2147cdf0e10cSrcweir if (ret_val)
2148cdf0e10cSrcweir {
2149cdf0e10cSrcweir strcpy(ret_val,dir);
2150cdf0e10cSrcweir
2151cdf0e10cSrcweir /* Make sure directory ends with a separator */
2152cdf0e10cSrcweir #if defined(WNT) || defined(OS2)
2153cdf0e10cSrcweir if ( i>0 && ret_val[i-1] != '\\' && ret_val[i-1] != '/' &&
2154cdf0e10cSrcweir ret_val[i-1] != ':')
2155cdf0e10cSrcweir ret_val[i++] = '\\';
2156cdf0e10cSrcweir #elif defined UNX
2157cdf0e10cSrcweir if (i>0 && ret_val[i-1] != '/')
2158cdf0e10cSrcweir ret_val[i++] = '/';
2159cdf0e10cSrcweir #else
2160cdf0e10cSrcweir #error unknown operating system
2161cdf0e10cSrcweir #endif
2162cdf0e10cSrcweir
2163cdf0e10cSrcweir strncpy(ret_val + i, pfx, 5);
2164cdf0e10cSrcweir ret_val[i + 5] = '\0'; /* strncpy doesn't put a 0 if more */
2165cdf0e10cSrcweir i = strlen(ret_val); /* than 'n' chars. */
2166cdf0e10cSrcweir
2167cdf0e10cSrcweir /* Prefix can have 5 chars, leaving 3 for numbers. 26 ** 3 == 17576
2168cdf0e10cSrcweir * Welcome to the 21st century, we can have longer filenames now ;)
2169cdf0e10cSrcweir * New format: pfx + "5 char milli/micro second res" + "current pid" + ".tmp"
2170cdf0e10cSrcweir */
2171cdf0e10cSrcweir #if (defined MSC || defined __MINGW32__) && defined WNT
2172cdf0e10cSrcweir /* Milliseconds !! */
2173cdf0e10cSrcweir static unsigned long u = GetTickCount();
2174cdf0e10cSrcweir unsigned long mypid = static_cast<unsigned long>(_getpid());
2175cdf0e10cSrcweir #else
2176cdf0e10cSrcweir /* Microseconds !! */
2177cdf0e10cSrcweir static unsigned long u = clock();
2178cdf0e10cSrcweir unsigned long mypid = static_cast<unsigned long>(getpid());
2179cdf0e10cSrcweir #endif
2180cdf0e10cSrcweir for ( unsigned long nOld = u; ++u != nOld; ) /* Hae??? */
2181cdf0e10cSrcweir {
2182cdf0e10cSrcweir u %= 100000; /* on *NIX repeats every 100ms, maybe less if CLOCKS_PER_SEC > 10^6 */
2183cdf0e10cSrcweir snprintf(ret_val+i, TMPNAME_SIZE, "%05lu%lu", u, mypid);
2184cdf0e10cSrcweir
2185cdf0e10cSrcweir strcat(ret_val,ext);
2186cdf0e10cSrcweir
2187cdf0e10cSrcweir if ( FSYS_KIND_FILE == eKind )
2188cdf0e10cSrcweir {
2189cdf0e10cSrcweir SvFileStream aStream( String( ret_val, osl_getThreadTextEncoding()),
2190cdf0e10cSrcweir STREAM_WRITE|STREAM_SHARE_DENYALL );
2191cdf0e10cSrcweir if ( aStream.IsOpen() )
2192cdf0e10cSrcweir {
2193cdf0e10cSrcweir aStream.Seek( STREAM_SEEK_TO_END );
2194cdf0e10cSrcweir if ( 0 == aStream.Tell() )
2195cdf0e10cSrcweir {
2196cdf0e10cSrcweir aRet = DirEntry( String( ret_val, osl_getThreadTextEncoding()));
2197cdf0e10cSrcweir break;
2198cdf0e10cSrcweir }
2199cdf0e10cSrcweir aStream.Close();
2200cdf0e10cSrcweir }
2201cdf0e10cSrcweir }
2202cdf0e10cSrcweir else
2203cdf0e10cSrcweir {
2204cdf0e10cSrcweir // Redirect
2205cdf0e10cSrcweir String aRetVal(ret_val, osl_getThreadTextEncoding());
2206cdf0e10cSrcweir String aRedirected (aRetVal);
2207cdf0e10cSrcweir #ifndef BOOTSTRAP
2208cdf0e10cSrcweir FSysRedirector::DoRedirect( aRedirected );
2209cdf0e10cSrcweir #endif
2210cdf0e10cSrcweir if ( FSYS_KIND_DIR == eKind )
2211cdf0e10cSrcweir {
2212cdf0e10cSrcweir if ( 0 == _mkdir( ByteString(aRedirected.GetBuffer(), osl_getThreadTextEncoding()).GetBuffer() ) )
2213cdf0e10cSrcweir {
2214cdf0e10cSrcweir aRet = DirEntry( aRetVal );
2215cdf0e10cSrcweir break;
2216cdf0e10cSrcweir }
2217cdf0e10cSrcweir }
2218cdf0e10cSrcweir else
2219cdf0e10cSrcweir {
2220cdf0e10cSrcweir #if defined(UNX) || defined(OS2)
2221cdf0e10cSrcweir if( access( ByteString(aRedirected, osl_getThreadTextEncoding()).GetBuffer(), F_OK ) )
2222cdf0e10cSrcweir {
2223cdf0e10cSrcweir aRet = DirEntry( aRetVal );
2224cdf0e10cSrcweir break;
2225cdf0e10cSrcweir }
2226cdf0e10cSrcweir #else
2227cdf0e10cSrcweir struct stat aStat;
2228cdf0e10cSrcweir if ( stat( ByteString(aRedirected, osl_getThreadTextEncoding()).GetBuffer(), &aStat ) )
2229cdf0e10cSrcweir {
2230cdf0e10cSrcweir aRet = DirEntry( aRetVal );
2231cdf0e10cSrcweir break;
2232cdf0e10cSrcweir }
2233cdf0e10cSrcweir #endif
2234cdf0e10cSrcweir }
2235cdf0e10cSrcweir }
2236cdf0e10cSrcweir }
2237cdf0e10cSrcweir
2238cdf0e10cSrcweir delete[] ret_val;
2239cdf0e10cSrcweir ret_val = 0;
2240cdf0e10cSrcweir }
2241cdf0e10cSrcweir
2242cdf0e10cSrcweir return aRet;
2243cdf0e10cSrcweir }
2244cdf0e10cSrcweir
2245cdf0e10cSrcweir /*************************************************************************
2246cdf0e10cSrcweir |*
2247cdf0e10cSrcweir |* DirEntry::operator[]()
2248cdf0e10cSrcweir |*
2249cdf0e10cSrcweir |* Beschreibung FSYS.SDW
2250cdf0e10cSrcweir |* Ersterstellung MI 03.03.92
2251cdf0e10cSrcweir |* Letzte Aenderung MI 03.03.92
2252cdf0e10cSrcweir |*
2253cdf0e10cSrcweir *************************************************************************/
2254cdf0e10cSrcweir
operator [](sal_uInt16 nParentLevel) const2255cdf0e10cSrcweir const DirEntry &DirEntry::operator[]( sal_uInt16 nParentLevel ) const
2256cdf0e10cSrcweir {
2257cdf0e10cSrcweir DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
2258cdf0e10cSrcweir
2259cdf0e10cSrcweir //TPF: maybe to be implemented (FastFSys)
2260cdf0e10cSrcweir
2261cdf0e10cSrcweir const DirEntry *pRes = this;
2262cdf0e10cSrcweir while ( pRes && nParentLevel-- )
2263cdf0e10cSrcweir pRes = pRes->pParent;
2264cdf0e10cSrcweir
2265cdf0e10cSrcweir return *pRes;
2266cdf0e10cSrcweir }
2267cdf0e10cSrcweir
2268cdf0e10cSrcweir /*************************************************************************
2269cdf0e10cSrcweir |*
2270cdf0e10cSrcweir |* DirEntry::ImpParseUnixName()
2271cdf0e10cSrcweir |*
2272cdf0e10cSrcweir |* Beschreibung FSYS.SDW
2273cdf0e10cSrcweir |* Ersterstellung MI 26.04.91
2274cdf0e10cSrcweir |* Letzte Aenderung MI 26.05.93
2275cdf0e10cSrcweir |*
2276cdf0e10cSrcweir *************************************************************************/
2277cdf0e10cSrcweir
ImpParseUnixName(const ByteString & rPfad,FSysPathStyle eStyle)2278cdf0e10cSrcweir FSysError DirEntry::ImpParseUnixName( const ByteString& rPfad, FSysPathStyle eStyle )
2279cdf0e10cSrcweir {
2280cdf0e10cSrcweir DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
2281cdf0e10cSrcweir
2282cdf0e10cSrcweir // die einzelnen Namen auf einen Stack packen
2283cdf0e10cSrcweir DirEntryStack aStack;
2284cdf0e10cSrcweir ByteString aPfad( rPfad );
2285cdf0e10cSrcweir do
2286cdf0e10cSrcweir {
2287cdf0e10cSrcweir // den Namen vor dem ersten "/" abspalten,
2288cdf0e10cSrcweir // falls '/' am Anfang, ist der Name '/',
2289cdf0e10cSrcweir // der Rest immer ohne die fuehrenden '/'.
2290cdf0e10cSrcweir // den ersten '/' suchen
2291cdf0e10cSrcweir sal_uInt16 nPos;
2292cdf0e10cSrcweir for ( nPos = 0;
2293cdf0e10cSrcweir nPos < aPfad.Len() && aPfad.GetChar(nPos) != '/';
2294cdf0e10cSrcweir nPos++ )
2295cdf0e10cSrcweir /* do nothing */;
2296cdf0e10cSrcweir
2297cdf0e10cSrcweir // ist der Name die Root des aktuellen Drives?
2298cdf0e10cSrcweir if ( nPos == 0 && aPfad.Len() > 0 && ( aPfad.GetChar(0) == '/' ) )
2299cdf0e10cSrcweir {
2300cdf0e10cSrcweir // Root-Directory des aktuellen Drives
2301cdf0e10cSrcweir aStack.Push( new DirEntry( FSYS_FLAG_ABSROOT ) );
2302cdf0e10cSrcweir }
2303cdf0e10cSrcweir else
2304cdf0e10cSrcweir {
2305cdf0e10cSrcweir // den Namen ohne Trenner abspalten
2306cdf0e10cSrcweir aName = aPfad.Copy( 0, nPos );
2307cdf0e10cSrcweir
2308cdf0e10cSrcweir // stellt der Name die aktuelle Directory dar?
2309cdf0e10cSrcweir if ( aName == "." )
2310cdf0e10cSrcweir /* do nothing */;
2311cdf0e10cSrcweir
2312cdf0e10cSrcweir #ifdef UNX
2313cdf0e10cSrcweir // stellt der Name das User-Dir dar?
2314cdf0e10cSrcweir else if ( aName == "~" )
2315cdf0e10cSrcweir {
2316cdf0e10cSrcweir DirEntry aHome( String( (const char *) getenv( "HOME" ), osl_getThreadTextEncoding()) );
2317cdf0e10cSrcweir for ( sal_uInt16 n = aHome.Level(); n; --n )
2318cdf0e10cSrcweir aStack.Push( new DirEntry( aHome[ (sal_uInt16) n-1 ] ) );
2319cdf0e10cSrcweir }
2320cdf0e10cSrcweir #endif
2321cdf0e10cSrcweir
2322cdf0e10cSrcweir // stellt der Name die Parent-Directory dar?
2323cdf0e10cSrcweir else if ( aName == ".." )
2324cdf0e10cSrcweir {
2325cdf0e10cSrcweir // ist nichts, ein Parent oder eine relative Root
2326cdf0e10cSrcweir // auf dem Stack?
2327cdf0e10cSrcweir if ( ( aStack.Count() == 0 ) ||
2328cdf0e10cSrcweir ( aStack.Top()->eFlag == FSYS_FLAG_PARENT ) )
2329cdf0e10cSrcweir // fuehrende Parents kommen auf den Stack
2330cdf0e10cSrcweir aStack.Push( new DirEntry( ByteString(), FSYS_FLAG_PARENT, eStyle ) );
2331cdf0e10cSrcweir
2332cdf0e10cSrcweir // ist es eine absolute Root
2333cdf0e10cSrcweir else if ( aStack.Top()->eFlag == FSYS_FLAG_ABSROOT ) {
2334cdf0e10cSrcweir // die hat keine Parent-Directory
2335cdf0e10cSrcweir return FSYS_ERR_NOTEXISTS;
2336cdf0e10cSrcweir }
2337cdf0e10cSrcweir else
2338cdf0e10cSrcweir // sonst hebt der Parent den TOS auf
2339cdf0e10cSrcweir delete aStack.Pop();
2340cdf0e10cSrcweir }
2341cdf0e10cSrcweir else
2342cdf0e10cSrcweir {
2343cdf0e10cSrcweir DirEntry *pNew = NULL;
2344cdf0e10cSrcweir // normalen Entries kommen auf den Stack
2345cdf0e10cSrcweir pNew = new DirEntry( aName, FSYS_FLAG_NORMAL, eStyle );
2346cdf0e10cSrcweir if ( !pNew->IsValid() )
2347cdf0e10cSrcweir {
2348cdf0e10cSrcweir aName = rPfad;
2349cdf0e10cSrcweir ErrCode eErr = pNew->GetError();
2350cdf0e10cSrcweir delete pNew;
2351cdf0e10cSrcweir return eErr;
2352cdf0e10cSrcweir }
2353cdf0e10cSrcweir aStack.Push( pNew );
2354cdf0e10cSrcweir }
2355cdf0e10cSrcweir }
2356cdf0e10cSrcweir
2357cdf0e10cSrcweir // den Restpfad bestimmen
2358cdf0e10cSrcweir aPfad.Erase( 0, nPos + 1 );
2359cdf0e10cSrcweir while ( aPfad.Len() && ( aPfad.GetChar(0) == '/' ) )
2360cdf0e10cSrcweir aPfad.Erase( 0, 1 );
2361cdf0e10cSrcweir }
2362cdf0e10cSrcweir while ( aPfad.Len() );
2363cdf0e10cSrcweir
2364cdf0e10cSrcweir // Haupt-Entry (selbst) zuweisen
2365cdf0e10cSrcweir if ( aStack.Count() == 0 )
2366cdf0e10cSrcweir {
2367cdf0e10cSrcweir eFlag = FSYS_FLAG_CURRENT;
2368cdf0e10cSrcweir aName.Erase();
2369cdf0e10cSrcweir }
2370cdf0e10cSrcweir else
2371cdf0e10cSrcweir {
2372cdf0e10cSrcweir eFlag = aStack.Top()->eFlag;
2373cdf0e10cSrcweir aName = aStack.Top()->aName;
2374cdf0e10cSrcweir delete aStack.Pop();
2375cdf0e10cSrcweir }
2376cdf0e10cSrcweir
2377cdf0e10cSrcweir // die Parent-Entries vom Stack holen
2378cdf0e10cSrcweir DirEntry** pTemp = &pParent;
2379cdf0e10cSrcweir while ( aStack.Count() )
2380cdf0e10cSrcweir {
2381cdf0e10cSrcweir *pTemp = aStack.Pop();
2382cdf0e10cSrcweir pTemp = &( (*pTemp)->pParent );
2383cdf0e10cSrcweir }
2384cdf0e10cSrcweir
2385cdf0e10cSrcweir return FSYS_ERR_OK;
2386cdf0e10cSrcweir }
2387cdf0e10cSrcweir
2388cdf0e10cSrcweir /*************************************************************************
2389cdf0e10cSrcweir |*
2390cdf0e10cSrcweir |* DirEntry::MakeShortName()
2391cdf0e10cSrcweir |*
2392cdf0e10cSrcweir |* Beschreibung
2393cdf0e10cSrcweir |* Ersterstellung TLX
2394cdf0e10cSrcweir |* Letzte Aenderung PB 21.08.97 (in CreateEntry_Impl())
2395cdf0e10cSrcweir |*
2396cdf0e10cSrcweir *************************************************************************/
2397cdf0e10cSrcweir
CreateEntry_Impl(const DirEntry & rPath,DirEntryKind eKind)2398cdf0e10cSrcweir ErrCode CreateEntry_Impl( const DirEntry &rPath, DirEntryKind eKind )
2399cdf0e10cSrcweir {
2400cdf0e10cSrcweir // versuchen, anzulegen (ausser bei FSYS_KIND_ALL)
2401cdf0e10cSrcweir ErrCode eErr = ERRCODE_NONE;
2402cdf0e10cSrcweir if ( FSYS_KIND_FILE == eKind )
2403cdf0e10cSrcweir {
2404cdf0e10cSrcweir SvFileStream aStream( rPath.GetFull(), STREAM_STD_WRITE );
2405cdf0e10cSrcweir aStream.WriteLine( "" );
2406cdf0e10cSrcweir eErr = aStream.GetError();
2407cdf0e10cSrcweir }
2408cdf0e10cSrcweir else if ( FSYS_KIND_ALL != eKind )
2409cdf0e10cSrcweir eErr = rPath.MakeDir() ? ERRCODE_NONE : ERRCODE_IO_UNKNOWN;
2410cdf0e10cSrcweir
2411cdf0e10cSrcweir // erfolgreich?
2412cdf0e10cSrcweir if ( !rPath.Exists() )
2413cdf0e10cSrcweir eErr = ERRCODE_IO_UNKNOWN; // Doch was schiefgegangen ?
2414cdf0e10cSrcweir
2415cdf0e10cSrcweir // ggf. wieder l"oschen
2416cdf0e10cSrcweir if ( FSYS_KIND_NONE == eKind )
2417cdf0e10cSrcweir rPath.Kill();
2418cdf0e10cSrcweir
2419cdf0e10cSrcweir // Fehlercode zur?ckliefern
2420cdf0e10cSrcweir return eErr;
2421cdf0e10cSrcweir }
2422cdf0e10cSrcweir
IsValidEntry_Impl(const DirEntry & rPath,const String & rLongName,DirEntryKind eKind,sal_Bool bIsShortened,sal_Bool bUseDelim)2423cdf0e10cSrcweir sal_Bool IsValidEntry_Impl( const DirEntry &rPath,
2424cdf0e10cSrcweir const String &rLongName,
2425cdf0e10cSrcweir DirEntryKind eKind,
2426cdf0e10cSrcweir sal_Bool bIsShortened,
2427cdf0e10cSrcweir sal_Bool bUseDelim )
2428cdf0e10cSrcweir {
2429cdf0e10cSrcweir // Parameter-Pr"uefung
2430cdf0e10cSrcweir DBG_ASSERT( eKind == FSYS_KIND_NONE || eKind == FSYS_KIND_ALL ||
2431cdf0e10cSrcweir eKind == FSYS_KIND_FILE || eKind == FSYS_KIND_DIR,
2432cdf0e10cSrcweir "invalid entry-kind" );
2433cdf0e10cSrcweir
2434cdf0e10cSrcweir // Alle von MSDOS erreichbaren FSYS_STYLES muessen den
2435cdf0e10cSrcweir // MSDOS Filenamenanforderungen genuegen. Sonst wird probiert,
2436cdf0e10cSrcweir // ob sich eine Datei des gewuenschten Names anlegen laesst.
2437cdf0e10cSrcweir FSysPathStyle eStyle = DirEntry::GetPathStyle( rPath.GetDevice().GetName() );
2438cdf0e10cSrcweir DirEntry aPath(rPath);
2439cdf0e10cSrcweir DirEntry aName(rLongName, eStyle);
2440cdf0e10cSrcweir if ( !aName.IsValid() || aName.Level() != 1 )
2441cdf0e10cSrcweir return sal_False;
2442cdf0e10cSrcweir aPath += aName;
2443cdf0e10cSrcweir if ( 1 == aPath.Level() )
2444cdf0e10cSrcweir return sal_False;
2445cdf0e10cSrcweir if ( eStyle == FSYS_STYLE_FAT || eStyle == FSYS_STYLE_NWFS ||
2446cdf0e10cSrcweir eStyle == FSYS_STYLE_UNKNOWN )
2447cdf0e10cSrcweir {
2448cdf0e10cSrcweir DirEntry aDosEntry( rLongName, FSYS_STYLE_FAT );
2449cdf0e10cSrcweir if ( !aDosEntry.IsValid() )
2450cdf0e10cSrcweir return sal_False;
2451cdf0e10cSrcweir }
2452cdf0e10cSrcweir
2453cdf0e10cSrcweir // Pfad-Trenner sind nicht erlaubt (bei ungek"urzten auch nicht FSYS_SHORTNAME_DELIMITER)
2454cdf0e10cSrcweir char cDelim = bUseDelim == 2 ? FSYS_SHORTNAME_DELIMITER : char(0);
2455cdf0e10cSrcweir if (
2456cdf0e10cSrcweir rLongName.Search(DirEntry::GetAccessDelimiter()) != STRING_NOTFOUND ||
2457cdf0e10cSrcweir (!bIsShortened && rLongName.Search(cDelim) != STRING_NOTFOUND)
2458cdf0e10cSrcweir )
2459cdf0e10cSrcweir {
2460cdf0e10cSrcweir return sal_False;
2461cdf0e10cSrcweir }
2462cdf0e10cSrcweir
2463cdf0e10cSrcweir // MI: Abfrage nach 'CON:' etc. wird jetzt in Exists() mitgemacht
2464cdf0e10cSrcweir if ( aPath.Exists() )
2465cdf0e10cSrcweir return sal_False;
2466cdf0e10cSrcweir
2467cdf0e10cSrcweir return (ERRCODE_NONE == CreateEntry_Impl( aPath, eKind ));
2468cdf0e10cSrcweir }
2469cdf0e10cSrcweir
2470cdf0e10cSrcweir //-------------------------------------------------------------------------
2471cdf0e10cSrcweir
2472cdf0e10cSrcweir #define MAX_EXT_FAT 3
2473cdf0e10cSrcweir #define MAX_LEN_FAT 8
2474cdf0e10cSrcweir #define INVALID_CHARS_FAT "\\/\"':|^<>[]?* "
2475cdf0e10cSrcweir
2476cdf0e10cSrcweir #define MAX_EXT_MAC 16 // nur wegen sinnvoller Namensk"rzung
2477cdf0e10cSrcweir #define MAX_LEN_MAC 31
2478cdf0e10cSrcweir #define INVALID_CHARS_MAC "\":"
2479cdf0e10cSrcweir
2480cdf0e10cSrcweir #define MAX_EXT_MAX 250
2481cdf0e10cSrcweir #define MAX_LEN_MAX 255
2482cdf0e10cSrcweir #define INVALID_CHARS_DEF "\\/\"':|^<>?*"
2483cdf0e10cSrcweir
MakeShortName(const String & rLongName,DirEntryKind eKind,sal_Bool bUseDelim,FSysPathStyle eStyle)2484cdf0e10cSrcweir sal_Bool DirEntry::MakeShortName( const String& rLongName, DirEntryKind eKind,
2485cdf0e10cSrcweir sal_Bool bUseDelim, FSysPathStyle eStyle )
2486cdf0e10cSrcweir {
2487cdf0e10cSrcweir String aLongName(rLongName);
2488cdf0e10cSrcweir
2489cdf0e10cSrcweir // Alle '#' aus den Dateinamen entfernen, weil das INetURLObject
2490cdf0e10cSrcweir // damit Probleme hat. Siehe auch #51246#
2491cdf0e10cSrcweir aLongName.EraseAllChars( '#' );
2492cdf0e10cSrcweir ByteString bLongName(aLongName, osl_getThreadTextEncoding());
2493cdf0e10cSrcweir
2494cdf0e10cSrcweir // Auf Novell-Servern (wegen der rottigen Clients) nur 7bit ASCII
2495cdf0e10cSrcweir
2496cdf0e10cSrcweir // HRO: #69627# Weg mit dem Scheiss. Wenn es Client gibt, die so einen
2497cdf0e10cSrcweir // BUG haben, dann muss halt der Client ersetzt werden, aber doch nicht das
2498cdf0e10cSrcweir // Office kastrieren !!!
2499cdf0e10cSrcweir
2500cdf0e10cSrcweir #if 0
2501cdf0e10cSrcweir if ( FSYS_STYLE_NWFS == GetPathStyle( ImpGetTopPtr()->GetName() ) )
2502cdf0e10cSrcweir {
2503cdf0e10cSrcweir for ( sal_uInt16 n = aLongName.Len(); n; --n )
2504cdf0e10cSrcweir {
2505cdf0e10cSrcweir short nChar = aLongName(n-1);
2506cdf0e10cSrcweir if ( nChar < 32 || nChar >= 127 )
2507cdf0e10cSrcweir aLongName.Erase( n-1, 1 );
2508cdf0e10cSrcweir }
2509cdf0e10cSrcweir }
2510cdf0e10cSrcweir #endif
2511cdf0e10cSrcweir
2512cdf0e10cSrcweir // bei FSYS_KIND_ALL den alten Namen merken und abh"angen (rename)
2513cdf0e10cSrcweir ByteString aOldName;
2514cdf0e10cSrcweir if ( FSYS_KIND_ALL == eKind )
2515cdf0e10cSrcweir {
2516cdf0e10cSrcweir aOldName = ByteString(CutName(), osl_getThreadTextEncoding());
2517cdf0e10cSrcweir aOldName = CMP_LOWER(aOldName);
2518cdf0e10cSrcweir }
2519cdf0e10cSrcweir
2520cdf0e10cSrcweir // ist der Langname direkt verwendbar?
2521cdf0e10cSrcweir if ( IsValidEntry_Impl( *this, aLongName, eKind, sal_False, bUseDelim ) )
2522cdf0e10cSrcweir {
2523cdf0e10cSrcweir operator+=( DirEntry(aLongName) );
2524cdf0e10cSrcweir return sal_True;
2525cdf0e10cSrcweir }
2526cdf0e10cSrcweir
2527cdf0e10cSrcweir // max L"angen feststellen
2528cdf0e10cSrcweir sal_uInt16 nMaxExt, nMaxLen;
2529cdf0e10cSrcweir if ( FSYS_STYLE_DETECT == eStyle )
2530cdf0e10cSrcweir eStyle = DirEntry::GetPathStyle( GetDevice().GetName() );
2531cdf0e10cSrcweir ByteString aInvalidChars;
2532cdf0e10cSrcweir switch ( eStyle )
2533cdf0e10cSrcweir {
2534cdf0e10cSrcweir case FSYS_STYLE_FAT:
2535cdf0e10cSrcweir nMaxExt = MAX_EXT_FAT;
2536cdf0e10cSrcweir nMaxLen = MAX_LEN_FAT;
2537cdf0e10cSrcweir aInvalidChars = INVALID_CHARS_FAT;
2538cdf0e10cSrcweir break;
2539cdf0e10cSrcweir
2540cdf0e10cSrcweir case FSYS_STYLE_MAC:
2541cdf0e10cSrcweir nMaxExt = MAX_EXT_MAC;
2542cdf0e10cSrcweir nMaxLen = MAX_LEN_MAC;
2543cdf0e10cSrcweir aInvalidChars = INVALID_CHARS_MAC;
2544cdf0e10cSrcweir break;
2545cdf0e10cSrcweir
2546cdf0e10cSrcweir default:
2547cdf0e10cSrcweir nMaxExt = MAX_EXT_MAX;
2548cdf0e10cSrcweir nMaxLen = MAX_LEN_MAX;
2549cdf0e10cSrcweir aInvalidChars = INVALID_CHARS_DEF;
2550cdf0e10cSrcweir }
2551cdf0e10cSrcweir
2552cdf0e10cSrcweir // Extension abschneiden und kuerzen
2553cdf0e10cSrcweir ByteString aExt;
2554cdf0e10cSrcweir ByteString aFName = bLongName;
2555cdf0e10cSrcweir if ( FSYS_STYLE_MAC != eStyle )
2556cdf0e10cSrcweir {
2557cdf0e10cSrcweir DirEntry aUnparsed;
2558cdf0e10cSrcweir aUnparsed.aName = bLongName;
2559cdf0e10cSrcweir aExt = ByteString(aUnparsed.CutExtension(), osl_getThreadTextEncoding());
2560cdf0e10cSrcweir aFName = aUnparsed.aName;
2561cdf0e10cSrcweir if ( aExt.Len() > nMaxExt )
2562cdf0e10cSrcweir {
2563cdf0e10cSrcweir char c = aExt.GetChar( aExt.Len() - 1 );
2564cdf0e10cSrcweir aExt.Erase(nMaxExt-1);
2565cdf0e10cSrcweir aExt += c;
2566cdf0e10cSrcweir }
2567cdf0e10cSrcweir }
2568cdf0e10cSrcweir
2569cdf0e10cSrcweir if ( FSYS_STYLE_FAT != eStyle )
2570cdf0e10cSrcweir {
2571cdf0e10cSrcweir // ausser auf einem FAT-System geh"ort die Extension zur
2572cdf0e10cSrcweir // Maxl"ange. Muss also vorher mit dem Punkt abgezogen werden.
2573cdf0e10cSrcweir nMaxLen -= ( aExt.Len() + 1 );
2574cdf0e10cSrcweir }
2575cdf0e10cSrcweir
2576cdf0e10cSrcweir // Name k"urzen
2577cdf0e10cSrcweir ByteString aSName;
2578cdf0e10cSrcweir for ( const char *pc = aFName.GetBuffer(); aSName.Len() < nMaxLen && *pc; ++pc )
2579cdf0e10cSrcweir {
2580cdf0e10cSrcweir if ( STRING_NOTFOUND == aInvalidChars.Search( *pc ) &&
2581cdf0e10cSrcweir (unsigned char) *pc >= (unsigned char) 32 &&
2582cdf0e10cSrcweir ( !aSName.Len() || *pc != ' ' || aSName.GetChar(aSName.Len()-1) != ' ' ) )
2583cdf0e10cSrcweir aSName += *pc;
2584cdf0e10cSrcweir }
2585cdf0e10cSrcweir aSName.EraseTrailingChars();
2586cdf0e10cSrcweir
2587cdf0e10cSrcweir // HRO: #74246# Also cut leading spaces
2588cdf0e10cSrcweir aSName.EraseLeadingChars();
2589cdf0e10cSrcweir
2590cdf0e10cSrcweir if ( !aSName.Len() )
2591cdf0e10cSrcweir aSName = "noname";
2592cdf0e10cSrcweir
2593cdf0e10cSrcweir // kommt dabei der alte Name raus?
2594cdf0e10cSrcweir ByteString aNewName = aSName;
2595cdf0e10cSrcweir if ( aExt.Len() )
2596cdf0e10cSrcweir ( aNewName += '.' ) += aExt;
2597cdf0e10cSrcweir operator+=( DirEntry(String(aNewName, osl_getThreadTextEncoding())) );
2598cdf0e10cSrcweir if ( FSYS_KIND_ALL == eKind && CMP_LOWER(aName) == aOldName )
2599cdf0e10cSrcweir if ( FSYS_KIND_ALL == eKind && CMP_LOWER(ByteString(GetName(), osl_getThreadTextEncoding())) == aOldName )
2600cdf0e10cSrcweir return sal_True;
2601cdf0e10cSrcweir
2602cdf0e10cSrcweir // kann der gek"urzte Name direkt verwendet werden?
2603cdf0e10cSrcweir if ( !Exists() && (ERRCODE_NONE == CreateEntry_Impl( *this, eKind )) )
2604cdf0e10cSrcweir return sal_True;
2605cdf0e10cSrcweir
2606cdf0e10cSrcweir // darf '?##' verwendet werden, um eindeutigen Name zu erzeugen?
2607cdf0e10cSrcweir if ( bUseDelim )
2608cdf0e10cSrcweir {
2609cdf0e10cSrcweir // eindeutigen Namen per '?##' erzeugen
2610cdf0e10cSrcweir aSName.Erase( nMaxLen-3 );
2611cdf0e10cSrcweir if ( bUseDelim != 2 )
2612cdf0e10cSrcweir aSName += FSYS_SHORTNAME_DELIMITER;
2613cdf0e10cSrcweir for ( int n = 1; n < 99; ++n )
2614cdf0e10cSrcweir {
2615cdf0e10cSrcweir // Name zusammensetzen
2616cdf0e10cSrcweir ByteString aTmpStr( aSName );
2617cdf0e10cSrcweir aTmpStr += ByteString::CreateFromInt32(n);
2618cdf0e10cSrcweir if ( aExt.Len() )
2619cdf0e10cSrcweir ( aTmpStr += '.' ) += aExt;
2620cdf0e10cSrcweir
2621cdf0e10cSrcweir // noch nicht vorhanden?
2622cdf0e10cSrcweir SetName( String(aTmpStr, osl_getThreadTextEncoding()) );
2623cdf0e10cSrcweir
2624cdf0e10cSrcweir if ( !Exists() )
2625cdf0e10cSrcweir {
2626cdf0e10cSrcweir // Fehler setzen !!!
2627cdf0e10cSrcweir nError = CreateEntry_Impl( *this, eKind );
2628cdf0e10cSrcweir return (ERRCODE_NONE == nError);
2629cdf0e10cSrcweir }
2630cdf0e10cSrcweir }
2631cdf0e10cSrcweir }
2632cdf0e10cSrcweir
2633cdf0e10cSrcweir // keine ## mehr frei / ?## soll nicht verwendet werden
2634cdf0e10cSrcweir nError = ERRCODE_IO_ALREADYEXISTS;
2635cdf0e10cSrcweir return sal_False;
2636cdf0e10cSrcweir }
2637cdf0e10cSrcweir
2638cdf0e10cSrcweir /*************************************************************************
2639cdf0e10cSrcweir |*
2640cdf0e10cSrcweir |* DirEntry::CreatePath()
2641cdf0e10cSrcweir |*
2642cdf0e10cSrcweir |* Beschreibung FSYS.SDW
2643cdf0e10cSrcweir |* Ersterstellung MI 26.04.91
2644cdf0e10cSrcweir |* Letzte Aenderung MA 02.12.91
2645cdf0e10cSrcweir |*
2646cdf0e10cSrcweir *************************************************************************/
2647cdf0e10cSrcweir
MakeDir(sal_Bool bSloppy) const2648cdf0e10cSrcweir sal_Bool DirEntry::MakeDir( sal_Bool bSloppy ) const
2649cdf0e10cSrcweir {
2650cdf0e10cSrcweir DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
2651cdf0e10cSrcweir
2652cdf0e10cSrcweir // Schnellpruefung, ob vorhanden
2653cdf0e10cSrcweir if ( FileStat( *this ).IsKind( FSYS_KIND_DIR ) )
2654cdf0e10cSrcweir return sal_True;
2655cdf0e10cSrcweir if ( bSloppy && pParent )
2656cdf0e10cSrcweir if ( FileStat( *pParent ).IsKind( FSYS_KIND_DIR ) )
2657cdf0e10cSrcweir return sal_True;
2658cdf0e10cSrcweir
2659cdf0e10cSrcweir const DirEntry *pNewDir = bSloppy ? pParent : this;
2660cdf0e10cSrcweir if ( pNewDir )
2661cdf0e10cSrcweir {
2662cdf0e10cSrcweir // den Path zum Dir erzeugen
2663cdf0e10cSrcweir if ( pNewDir->pParent && !pNewDir->pParent->MakeDir(sal_False) )
2664cdf0e10cSrcweir return sal_False;
2665cdf0e10cSrcweir
2666cdf0e10cSrcweir // das Dir selbst erzeugen
2667cdf0e10cSrcweir if ( pNewDir->eFlag == FSYS_FLAG_ABSROOT ||
2668cdf0e10cSrcweir pNewDir->eFlag == FSYS_FLAG_ABSROOT ||
2669cdf0e10cSrcweir pNewDir->eFlag == FSYS_FLAG_VOLUME )
2670cdf0e10cSrcweir return sal_True;
2671cdf0e10cSrcweir else
2672cdf0e10cSrcweir {
2673cdf0e10cSrcweir //? nError = ???
2674cdf0e10cSrcweir if ( FileStat( *pNewDir ).IsKind( FSYS_KIND_DIR ) )
2675cdf0e10cSrcweir return sal_True;
2676cdf0e10cSrcweir else
2677cdf0e10cSrcweir {
2678cdf0e10cSrcweir FSysFailOnErrorImpl();
2679cdf0e10cSrcweir String aDirName(pNewDir->GetFull());
2680cdf0e10cSrcweir #ifndef BOOTSTRAP
2681cdf0e10cSrcweir FSysRedirector::DoRedirect( aDirName );
2682cdf0e10cSrcweir #endif
2683cdf0e10cSrcweir ByteString bDirName( aDirName, osl_getThreadTextEncoding() );
2684cdf0e10cSrcweir bDirName = GUI2FSYS( bDirName );
2685cdf0e10cSrcweir
2686cdf0e10cSrcweir #ifdef WIN32
2687cdf0e10cSrcweir SetLastError(0);
2688cdf0e10cSrcweir #endif
2689cdf0e10cSrcweir sal_Bool bResult = (0 == _mkdir( (char*) bDirName.GetBuffer() ));
2690cdf0e10cSrcweir if ( !bResult )
2691cdf0e10cSrcweir {
2692cdf0e10cSrcweir // Wer hat diese Methode const gemacht ?
2693cdf0e10cSrcweir #ifdef WIN32
2694cdf0e10cSrcweir ((DirEntry *)this)->SetError( Sys2SolarError_Impl( GetLastError() ) );
2695cdf0e10cSrcweir #else
2696cdf0e10cSrcweir ((DirEntry *)this)->SetError( Sys2SolarError_Impl( errno ) );
2697cdf0e10cSrcweir #endif
2698cdf0e10cSrcweir }
2699cdf0e10cSrcweir
2700cdf0e10cSrcweir return bResult;
2701cdf0e10cSrcweir }
2702cdf0e10cSrcweir }
2703cdf0e10cSrcweir }
2704cdf0e10cSrcweir return sal_True;
2705cdf0e10cSrcweir }
2706cdf0e10cSrcweir
2707cdf0e10cSrcweir /*************************************************************************
2708cdf0e10cSrcweir |*
2709cdf0e10cSrcweir |* DirEntry::CopyTo()
2710cdf0e10cSrcweir |*
2711cdf0e10cSrcweir |* Beschreibung FSYS.SDW
2712cdf0e10cSrcweir |* Ersterstellung MI 26.04.91
2713cdf0e10cSrcweir |* Letzte Aenderung MI 07.08.96
2714cdf0e10cSrcweir |*
2715cdf0e10cSrcweir *************************************************************************/
2716cdf0e10cSrcweir
CopyTo(const DirEntry & rDest,FSysAction nActions) const2717cdf0e10cSrcweir FSysError DirEntry::CopyTo( const DirEntry& rDest, FSysAction nActions ) const
2718cdf0e10cSrcweir {
2719cdf0e10cSrcweir DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
2720cdf0e10cSrcweir
2721cdf0e10cSrcweir if ( FSYS_ACTION_COPYFILE != (nActions & FSYS_ACTION_COPYFILE) )
2722cdf0e10cSrcweir #ifdef UNX
2723cdf0e10cSrcweir {
2724cdf0e10cSrcweir // Hardlink anlegen
2725cdf0e10cSrcweir HACK(redirection missing)
2726cdf0e10cSrcweir ByteString aThis(GUI2FSYS(GetFull()), osl_getThreadTextEncoding());
2727cdf0e10cSrcweir ByteString aDest(GUI2FSYS(rDest.GetFull()), osl_getThreadTextEncoding());
2728cdf0e10cSrcweir if (link( aThis.GetBuffer(), aDest.GetBuffer() ) == -1)
2729cdf0e10cSrcweir return Sys2SolarError_Impl( errno );
2730cdf0e10cSrcweir else
2731cdf0e10cSrcweir return FSYS_ERR_OK;
2732cdf0e10cSrcweir }
2733cdf0e10cSrcweir #else
2734cdf0e10cSrcweir return FSYS_ERR_NOTSUPPORTED;
2735cdf0e10cSrcweir #endif
2736cdf0e10cSrcweir
2737cdf0e10cSrcweir FileCopier fc(*this, rDest);
2738cdf0e10cSrcweir return fc.Execute(nActions);
2739cdf0e10cSrcweir }
2740cdf0e10cSrcweir
2741cdf0e10cSrcweir /*************************************************************************
2742cdf0e10cSrcweir |*
2743cdf0e10cSrcweir |* DirEntry::MoveTo()
2744cdf0e10cSrcweir |*
2745cdf0e10cSrcweir |* Beschreibung FSYS.SDW
2746cdf0e10cSrcweir |* Ersterstellung MI 26.04.91
2747cdf0e10cSrcweir |* Letzte Aenderung HRO 24.03.99
2748cdf0e10cSrcweir |*
2749cdf0e10cSrcweir *************************************************************************/
2750cdf0e10cSrcweir
2751cdf0e10cSrcweir #if defined WNT || defined UNX || defined OS2
2752cdf0e10cSrcweir
MoveTo(const DirEntry & rNewName) const2753cdf0e10cSrcweir FSysError DirEntry::MoveTo( const DirEntry& rNewName ) const
2754cdf0e10cSrcweir {
2755cdf0e10cSrcweir DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
2756cdf0e10cSrcweir
2757cdf0e10cSrcweir /*
2758cdf0e10cSrcweir FileStat aSourceStat(*this);
2759cdf0e10cSrcweir if ( !aSourceStat.IsKind(FSYS_KIND_FILE) )
2760cdf0e10cSrcweir return FSYS_ERR_NOTAFILE;
2761cdf0e10cSrcweir */
2762cdf0e10cSrcweir
2763cdf0e10cSrcweir DirEntry aDest(rNewName);
2764cdf0e10cSrcweir FileStat aDestStat(rNewName);
2765cdf0e10cSrcweir if ( aDestStat.IsKind(FSYS_KIND_DIR ) )
2766cdf0e10cSrcweir {
2767cdf0e10cSrcweir aDest += String(aName, osl_getThreadTextEncoding());
2768cdf0e10cSrcweir }
2769cdf0e10cSrcweir if ( aDest.Exists() )
2770cdf0e10cSrcweir {
2771cdf0e10cSrcweir return FSYS_ERR_ALREADYEXISTS;
2772cdf0e10cSrcweir }
2773cdf0e10cSrcweir
2774cdf0e10cSrcweir #if defined(OS2)
2775cdf0e10cSrcweir if ( FileStat(*this).IsKind(FSYS_KIND_DIR) && aDest.GetPath() != GetPath() )
2776cdf0e10cSrcweir {
2777cdf0e10cSrcweir return FSYS_ERR_NOTSUPPORTED;
2778cdf0e10cSrcweir }
2779cdf0e10cSrcweir #endif
2780cdf0e10cSrcweir
2781cdf0e10cSrcweir FSysFailOnErrorImpl();
2782cdf0e10cSrcweir String aFrom( GetFull() );
2783cdf0e10cSrcweir
2784cdf0e10cSrcweir #ifndef BOOTSTRAP
2785cdf0e10cSrcweir FSysRedirector::DoRedirect(aFrom);
2786cdf0e10cSrcweir #endif
2787cdf0e10cSrcweir
2788cdf0e10cSrcweir String aTo( aDest.GetFull() );
2789cdf0e10cSrcweir
2790cdf0e10cSrcweir #ifndef BOOTSTRAP
2791cdf0e10cSrcweir FSysRedirector::DoRedirect(aTo);
2792cdf0e10cSrcweir #endif
2793cdf0e10cSrcweir
2794cdf0e10cSrcweir ByteString bFrom(aFrom, osl_getThreadTextEncoding());
2795cdf0e10cSrcweir ByteString bTo(aTo, osl_getThreadTextEncoding());
2796cdf0e10cSrcweir bFrom = GUI2FSYS(bFrom);
2797cdf0e10cSrcweir bTo = GUI2FSYS(bTo);
2798cdf0e10cSrcweir
2799cdf0e10cSrcweir #ifdef WNT
2800cdf0e10cSrcweir // MoveTo nun atomar
2801cdf0e10cSrcweir SetLastError(0);
2802cdf0e10cSrcweir
2803cdf0e10cSrcweir DirEntry aFromDevice(String(bFrom, osl_getThreadTextEncoding()));
2804cdf0e10cSrcweir DirEntry aToDevice(String(bTo,osl_getThreadTextEncoding()));
2805cdf0e10cSrcweir aFromDevice.ToAbs();
2806cdf0e10cSrcweir aToDevice.ToAbs();
2807cdf0e10cSrcweir aFromDevice=aFromDevice.GetDevice();
2808cdf0e10cSrcweir aToDevice=aToDevice.GetDevice();
2809cdf0e10cSrcweir
2810cdf0e10cSrcweir //Quelle und Ziel auf gleichem device?
2811cdf0e10cSrcweir if (aFromDevice==aToDevice)
2812cdf0e10cSrcweir {
2813cdf0e10cSrcweir // ja, also intra-device-move mit MoveFile
2814cdf0e10cSrcweir MoveFile( bFrom.GetBuffer(), bTo.GetBuffer() );
2815cdf0e10cSrcweir // MoveFile ist buggy bei cross-device operationen.
2816cdf0e10cSrcweir // Der R?ckgabewert ist auch dann sal_True, wenn nur ein Teil der Operation geklappt hat.
2817cdf0e10cSrcweir // Zudem zeigt MoveFile unterschiedliches Verhalten bei unterschiedlichen NT-Versionen.
2818cdf0e10cSrcweir return Sys2SolarError_Impl( GetLastError() );
2819cdf0e10cSrcweir }
2820cdf0e10cSrcweir else
2821cdf0e10cSrcweir {
2822cdf0e10cSrcweir //nein, also inter-device-move mit copy/delete
2823cdf0e10cSrcweir FSysError nCopyError = CopyTo(rNewName, FSYS_ACTION_COPYFILE);
2824cdf0e10cSrcweir
2825cdf0e10cSrcweir DirEntry aKill(String(bTo, osl_getThreadTextEncoding()));
2826cdf0e10cSrcweir FileStat aKillStat(String(bTo, osl_getThreadTextEncoding()));
2827cdf0e10cSrcweir if ( aKillStat.IsKind(FSYS_KIND_DIR ) )
2828cdf0e10cSrcweir {
2829cdf0e10cSrcweir aKill += String(aName, osl_getThreadTextEncoding());
2830cdf0e10cSrcweir }
2831cdf0e10cSrcweir
2832cdf0e10cSrcweir if (nCopyError==FSYS_ERR_OK)
2833cdf0e10cSrcweir {
2834cdf0e10cSrcweir if (Kill()==FSYS_ERR_OK)
2835cdf0e10cSrcweir {
2836cdf0e10cSrcweir return FSYS_ERR_OK;
2837cdf0e10cSrcweir }
2838cdf0e10cSrcweir else
2839cdf0e10cSrcweir {
2840cdf0e10cSrcweir aKill.Kill();
2841cdf0e10cSrcweir return FSYS_ERR_ACCESSDENIED;
2842cdf0e10cSrcweir }
2843cdf0e10cSrcweir }
2844cdf0e10cSrcweir else
2845cdf0e10cSrcweir {
2846cdf0e10cSrcweir aKill.Kill();
2847cdf0e10cSrcweir return nCopyError;
2848cdf0e10cSrcweir }
2849cdf0e10cSrcweir }
2850cdf0e10cSrcweir #else
2851cdf0e10cSrcweir // #68639#
2852cdf0e10cSrcweir // on some nfs connections rename with from == to
2853cdf0e10cSrcweir // leads to destruction of file
2854cdf0e10cSrcweir if ( ( aFrom != aTo ) && ( 0 != rename( bFrom.GetBuffer(), bTo.GetBuffer() ) ) )
2855cdf0e10cSrcweir #if !defined(UNX) && !defined(OS2)
2856cdf0e10cSrcweir return Sys2SolarError_Impl( GetLastError() );
2857cdf0e10cSrcweir #else
2858cdf0e10cSrcweir {
2859cdf0e10cSrcweir if( errno == EXDEV )
2860cdf0e10cSrcweir // cross device geht latuernich nicht mit rename
2861cdf0e10cSrcweir {
2862cdf0e10cSrcweir FILE *fpIN = fopen( bFrom.GetBuffer(), "r" );
2863cdf0e10cSrcweir FILE *fpOUT = fopen( bTo.GetBuffer(), "w" );
2864cdf0e10cSrcweir if( fpIN && fpOUT )
2865cdf0e10cSrcweir {
2866cdf0e10cSrcweir char pBuf[ 16384 ];
2867cdf0e10cSrcweir int nBytes, nWritten, nErr = 0;
2868cdf0e10cSrcweir errno = 0;
2869cdf0e10cSrcweir while( ( nBytes = fread( pBuf, 1, sizeof(pBuf), fpIN ) ) && ! nErr )
2870cdf0e10cSrcweir {
2871cdf0e10cSrcweir nWritten = fwrite( pBuf, 1, nBytes, fpOUT );
2872cdf0e10cSrcweir // Fehler im fwrite ?
2873cdf0e10cSrcweir if( nWritten < nBytes )
2874cdf0e10cSrcweir {
2875cdf0e10cSrcweir nErr = errno;
2876cdf0e10cSrcweir break;
2877cdf0e10cSrcweir }
2878cdf0e10cSrcweir }
2879cdf0e10cSrcweir fclose( fpIN );
2880cdf0e10cSrcweir fclose( fpOUT );
2881cdf0e10cSrcweir if ( nErr )
2882cdf0e10cSrcweir {
2883cdf0e10cSrcweir unlink( bTo.GetBuffer() );
2884cdf0e10cSrcweir return Sys2SolarError_Impl( nErr );
2885cdf0e10cSrcweir }
2886cdf0e10cSrcweir else
2887cdf0e10cSrcweir {
2888cdf0e10cSrcweir unlink( bFrom.GetBuffer() );
2889cdf0e10cSrcweir }
2890cdf0e10cSrcweir }
2891cdf0e10cSrcweir else
2892cdf0e10cSrcweir {
2893cdf0e10cSrcweir return Sys2SolarError_Impl( EXDEV );
2894cdf0e10cSrcweir }
2895cdf0e10cSrcweir }
2896cdf0e10cSrcweir else
2897cdf0e10cSrcweir {
2898cdf0e10cSrcweir return Sys2SolarError_Impl( errno );
2899cdf0e10cSrcweir }
2900cdf0e10cSrcweir }
2901cdf0e10cSrcweir #endif
2902cdf0e10cSrcweir #endif
2903cdf0e10cSrcweir return ERRCODE_NONE;
2904cdf0e10cSrcweir }
2905cdf0e10cSrcweir
2906cdf0e10cSrcweir #endif
2907cdf0e10cSrcweir
2908cdf0e10cSrcweir /*************************************************************************
2909cdf0e10cSrcweir |*
2910cdf0e10cSrcweir |* DirEntry::Kill()
2911cdf0e10cSrcweir |*
2912cdf0e10cSrcweir |* Beschreibung FSYS.SDW
2913cdf0e10cSrcweir |* Ersterstellung MI 26.04.91
2914cdf0e10cSrcweir |* Letzte Aenderung MI 07.08.96
2915cdf0e10cSrcweir |*
2916cdf0e10cSrcweir *************************************************************************/
2917cdf0e10cSrcweir
Kill(FSysAction nActions) const2918cdf0e10cSrcweir FSysError DirEntry::Kill( FSysAction nActions ) const
2919cdf0e10cSrcweir {
2920cdf0e10cSrcweir DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
2921cdf0e10cSrcweir
2922cdf0e10cSrcweir FSysError eError = FSYS_ERR_OK;
2923cdf0e10cSrcweir FSysFailOnErrorImpl();
2924cdf0e10cSrcweir
2925cdf0e10cSrcweir // Name als doppelt 0-terminierter String
2926cdf0e10cSrcweir String aTmpName( GetFull() );
2927cdf0e10cSrcweir #ifndef BOOTSTRAP
2928cdf0e10cSrcweir FSysRedirector::DoRedirect( aTmpName );
2929cdf0e10cSrcweir #endif
2930cdf0e10cSrcweir ByteString bTmpName( aTmpName, osl_getThreadTextEncoding());
2931cdf0e10cSrcweir bTmpName = GUI2FSYS(bTmpName);
2932cdf0e10cSrcweir
2933cdf0e10cSrcweir char *pName = new char[bTmpName.Len()+2];
2934cdf0e10cSrcweir strcpy( pName, bTmpName.GetBuffer() );
2935cdf0e10cSrcweir pName[bTmpName.Len()+1] = (char) 0;
2936cdf0e10cSrcweir
2937cdf0e10cSrcweir //read-only files sollen auch geloescht werden koennen
2938cdf0e10cSrcweir sal_Bool isReadOnly = FileStat::GetReadOnlyFlag(*this);
2939cdf0e10cSrcweir if (isReadOnly)
2940cdf0e10cSrcweir {
2941cdf0e10cSrcweir FileStat::SetReadOnlyFlag(*this, sal_False);
2942cdf0e10cSrcweir }
2943cdf0e10cSrcweir
2944cdf0e10cSrcweir // directory?
2945cdf0e10cSrcweir if ( FileStat( *this ).IsKind(FSYS_KIND_DIR) )
2946cdf0e10cSrcweir {
2947cdf0e10cSrcweir // Inhalte recursiv loeschen?
2948cdf0e10cSrcweir if ( FSYS_ACTION_RECURSIVE == (nActions & FSYS_ACTION_RECURSIVE) )
2949cdf0e10cSrcweir {
2950cdf0e10cSrcweir Dir aDir( *this, FSYS_KIND_DIR|FSYS_KIND_FILE );
2951cdf0e10cSrcweir for ( sal_uInt16 n = 0; eError == FSYS_ERR_OK && n < aDir.Count(); ++n )
2952cdf0e10cSrcweir {
2953cdf0e10cSrcweir const DirEntry &rSubDir = aDir[n];
2954cdf0e10cSrcweir DirEntryFlag flag = rSubDir.GetFlag();
2955cdf0e10cSrcweir if ( flag != FSYS_FLAG_CURRENT && flag != FSYS_FLAG_PARENT )
2956cdf0e10cSrcweir eError = rSubDir.Kill(nActions);
2957cdf0e10cSrcweir }
2958cdf0e10cSrcweir }
2959cdf0e10cSrcweir
2960cdf0e10cSrcweir // das Dir selbst loeschen
2961cdf0e10cSrcweir #ifdef WIN32
2962cdf0e10cSrcweir SetLastError(0);
2963cdf0e10cSrcweir #endif
2964cdf0e10cSrcweir if ( eError == FSYS_ERR_OK && 0 != _rmdir( (char*) pName ) )
2965cdf0e10cSrcweir //
2966cdf0e10cSrcweir {
2967cdf0e10cSrcweir // falls L"oschen nicht ging, CWD umsetzen
2968cdf0e10cSrcweir #ifdef WIN32
2969cdf0e10cSrcweir eError = Sys2SolarError_Impl( GetLastError() );
2970cdf0e10cSrcweir #else
2971cdf0e10cSrcweir eError = Sys2SolarError_Impl( errno );
2972cdf0e10cSrcweir #endif
2973cdf0e10cSrcweir if ( eError )
2974cdf0e10cSrcweir {
2975cdf0e10cSrcweir GetPath().SetCWD();
2976cdf0e10cSrcweir #ifdef WIN32
2977cdf0e10cSrcweir SetLastError(0);
2978cdf0e10cSrcweir #endif
2979cdf0e10cSrcweir if (_rmdir( (char*) pName) != 0)
2980cdf0e10cSrcweir {
2981cdf0e10cSrcweir #ifdef WIN32
2982cdf0e10cSrcweir eError = Sys2SolarError_Impl( GetLastError() );
2983cdf0e10cSrcweir #else
2984cdf0e10cSrcweir eError = Sys2SolarError_Impl( errno );
2985cdf0e10cSrcweir #endif
2986cdf0e10cSrcweir }
2987cdf0e10cSrcweir else
2988cdf0e10cSrcweir {
2989cdf0e10cSrcweir eError = FSYS_ERR_OK;
2990cdf0e10cSrcweir }
2991cdf0e10cSrcweir }
2992cdf0e10cSrcweir }
2993cdf0e10cSrcweir }
2994cdf0e10cSrcweir else
2995cdf0e10cSrcweir {
2996cdf0e10cSrcweir if ( FSYS_ACTION_USERECYCLEBIN == (nActions & FSYS_ACTION_USERECYCLEBIN) )
2997cdf0e10cSrcweir {
2998cdf0e10cSrcweir #ifdef OS2
2999cdf0e10cSrcweir eError = ApiRet2ToSolarError_Impl( DosDelete( (PSZ) pName ) );
3000cdf0e10cSrcweir #elif defined(WNT)
3001cdf0e10cSrcweir SHFILEOPSTRUCT aOp;
3002cdf0e10cSrcweir aOp.hwnd = 0;
3003cdf0e10cSrcweir aOp.wFunc = FO_DELETE;
3004cdf0e10cSrcweir aOp.pFrom = pName;
3005cdf0e10cSrcweir aOp.pTo = 0;
3006cdf0e10cSrcweir aOp.fFlags = FOF_ALLOWUNDO|FOF_SILENT|FOF_NOCONFIRMATION;
3007cdf0e10cSrcweir aOp.hNameMappings = 0;
3008cdf0e10cSrcweir aOp.lpszProgressTitle = 0;
3009cdf0e10cSrcweir eError = Sys2SolarError_Impl( SHFileOperation( &aOp ) );
3010cdf0e10cSrcweir #else
3011cdf0e10cSrcweir eError = ERRCODE_IO_NOTSUPPORTED;
3012cdf0e10cSrcweir #endif
3013cdf0e10cSrcweir }
3014cdf0e10cSrcweir else
3015cdf0e10cSrcweir {
3016cdf0e10cSrcweir #ifdef WIN32
3017cdf0e10cSrcweir SetLastError(0);
3018cdf0e10cSrcweir #endif
3019cdf0e10cSrcweir if ( 0 != _unlink( (char*) pName ) )
3020cdf0e10cSrcweir {
3021cdf0e10cSrcweir #ifdef WIN32
3022cdf0e10cSrcweir eError = Sys2SolarError_Impl( GetLastError() );
3023cdf0e10cSrcweir #else
3024cdf0e10cSrcweir eError = Sys2SolarError_Impl( errno );
3025cdf0e10cSrcweir #endif
3026cdf0e10cSrcweir }
3027cdf0e10cSrcweir else
3028cdf0e10cSrcweir {
3029cdf0e10cSrcweir eError = ERRCODE_NONE;
3030cdf0e10cSrcweir }
3031cdf0e10cSrcweir }
3032cdf0e10cSrcweir }
3033cdf0e10cSrcweir
3034cdf0e10cSrcweir //falls Fehler, originales read-only flag wieder herstellen
3035cdf0e10cSrcweir if ( isReadOnly && (eError!=ERRCODE_NONE) )
3036cdf0e10cSrcweir {
3037cdf0e10cSrcweir FileStat::SetReadOnlyFlag(*this, isReadOnly);
3038cdf0e10cSrcweir }
3039cdf0e10cSrcweir
3040cdf0e10cSrcweir delete[] pName;
3041cdf0e10cSrcweir return eError;
3042cdf0e10cSrcweir }
3043cdf0e10cSrcweir
3044cdf0e10cSrcweir /*************************************************************************
3045cdf0e10cSrcweir |*
3046cdf0e10cSrcweir |* DirEntry::Contains()
3047cdf0e10cSrcweir |*
3048cdf0e10cSrcweir |* Beschreibung ob rSubEntry direkt oder indirect in *this liegt
3049cdf0e10cSrcweir |* Ersterstellung MI 20.03.97
3050cdf0e10cSrcweir |* Letzte Aenderung MI 20.03.97
3051cdf0e10cSrcweir |*
3052cdf0e10cSrcweir *************************************************************************/
3053cdf0e10cSrcweir
Contains(const DirEntry & rSubEntry) const3054cdf0e10cSrcweir sal_Bool DirEntry::Contains( const DirEntry &rSubEntry ) const
3055cdf0e10cSrcweir {
3056cdf0e10cSrcweir DBG_ASSERT( IsAbs() && rSubEntry.IsAbs(), "must be absolute entries" );
3057cdf0e10cSrcweir
3058cdf0e10cSrcweir sal_uInt16 nThisLevel = Level();
3059cdf0e10cSrcweir sal_uInt16 nSubLevel = rSubEntry.Level();
3060cdf0e10cSrcweir if ( nThisLevel < nSubLevel )
3061cdf0e10cSrcweir {
3062cdf0e10cSrcweir for ( ; nThisLevel; --nThisLevel, --nSubLevel )
3063cdf0e10cSrcweir if ( (*this)[nThisLevel-1] != rSubEntry[nSubLevel-1] )
3064cdf0e10cSrcweir return sal_False;
3065cdf0e10cSrcweir return sal_True;
3066cdf0e10cSrcweir }
3067cdf0e10cSrcweir return sal_False;
3068cdf0e10cSrcweir }
3069cdf0e10cSrcweir
3070cdf0e10cSrcweir /*************************************************************************
3071cdf0e10cSrcweir |*
3072cdf0e10cSrcweir |* DirEntry::Level()
3073cdf0e10cSrcweir |*
3074cdf0e10cSrcweir |* Beschreibung FSYS.SDW
3075cdf0e10cSrcweir |* Ersterstellung MI 03.03.92
3076cdf0e10cSrcweir |* Letzte Aenderung MI 03.03.92
3077cdf0e10cSrcweir |*
3078cdf0e10cSrcweir *************************************************************************/
3079cdf0e10cSrcweir
Level() const3080cdf0e10cSrcweir sal_uInt16 DirEntry::Level() const
3081cdf0e10cSrcweir {
3082cdf0e10cSrcweir DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
3083cdf0e10cSrcweir
3084cdf0e10cSrcweir sal_uInt16 nLevel = 0;
3085cdf0e10cSrcweir const DirEntry *pRes = this;
3086cdf0e10cSrcweir while ( pRes )
3087cdf0e10cSrcweir {
3088cdf0e10cSrcweir pRes = pRes->pParent;
3089cdf0e10cSrcweir nLevel++;
3090cdf0e10cSrcweir }
3091cdf0e10cSrcweir
3092cdf0e10cSrcweir return nLevel;
3093cdf0e10cSrcweir }
3094cdf0e10cSrcweir
3095cdf0e10cSrcweir /*************************************************************************
3096cdf0e10cSrcweir |*
3097cdf0e10cSrcweir |* DirEntry::ConvertNameToSystem()
3098cdf0e10cSrcweir |*
3099cdf0e10cSrcweir |* Beschreibung
3100cdf0e10cSrcweir |* Ersterstellung DV 29.03.96
3101cdf0e10cSrcweir |* Letzte Aenderung DV 29.03.96
3102cdf0e10cSrcweir |*
3103cdf0e10cSrcweir *************************************************************************/
3104cdf0e10cSrcweir
ConvertNameToSystem(const String & rName)3105cdf0e10cSrcweir String DirEntry::ConvertNameToSystem( const String &rName )
3106cdf0e10cSrcweir {
3107cdf0e10cSrcweir return rName;
3108cdf0e10cSrcweir }
3109cdf0e10cSrcweir
3110cdf0e10cSrcweir /*************************************************************************
3111cdf0e10cSrcweir |*
3112cdf0e10cSrcweir |* DirEntry::ConvertSystemToName()
3113cdf0e10cSrcweir |*
3114cdf0e10cSrcweir |* Beschreibung
3115cdf0e10cSrcweir |* Ersterstellung DV 29.03.96
3116cdf0e10cSrcweir |* Letzte Aenderung DV 29.03.96
3117cdf0e10cSrcweir |*
3118cdf0e10cSrcweir *************************************************************************/
3119cdf0e10cSrcweir
ConvertSystemToName(const String & rName)3120cdf0e10cSrcweir String DirEntry::ConvertSystemToName( const String &rName )
3121cdf0e10cSrcweir {
3122cdf0e10cSrcweir return rName;
3123cdf0e10cSrcweir }
3124cdf0e10cSrcweir
3125cdf0e10cSrcweir /*************************************************************************
3126cdf0e10cSrcweir |*
3127cdf0e10cSrcweir |* DirEntry::IsValid()
3128cdf0e10cSrcweir |*
3129cdf0e10cSrcweir |* Beschreibung
3130cdf0e10cSrcweir |* Ersterstellung MI 18.09.93
3131cdf0e10cSrcweir |* Letzte Aenderung TPF 18.09.98
3132cdf0e10cSrcweir |*
3133cdf0e10cSrcweir *************************************************************************/
3134cdf0e10cSrcweir
IsValid() const3135cdf0e10cSrcweir sal_Bool DirEntry::IsValid() const
3136cdf0e10cSrcweir {
3137cdf0e10cSrcweir return (nError == FSYS_ERR_OK);
3138cdf0e10cSrcweir }
3139cdf0e10cSrcweir
3140cdf0e10cSrcweir /*************************************************************************
3141cdf0e10cSrcweir |*
3142cdf0e10cSrcweir |* DirEntry::IsRFSAvailable()
3143cdf0e10cSrcweir |*
3144cdf0e10cSrcweir |* Beschreibung
3145cdf0e10cSrcweir |* Ersterstellung TPF 21.10.98
3146cdf0e10cSrcweir |* Letzte Aenderung TPF 21.10.98
3147cdf0e10cSrcweir |*
3148cdf0e10cSrcweir *************************************************************************/
3149cdf0e10cSrcweir
IsRFSAvailable()3150cdf0e10cSrcweir sal_Bool DirEntry::IsRFSAvailable()
3151cdf0e10cSrcweir {
3152cdf0e10cSrcweir return sal_False;
3153cdf0e10cSrcweir }
3154cdf0e10cSrcweir
3155cdf0e10cSrcweir /*************************************************************************
3156cdf0e10cSrcweir |*
3157cdf0e10cSrcweir |* IsLongNameOnFAT()
3158cdf0e10cSrcweir |*
3159cdf0e10cSrcweir |* Beschreibung ?berpr?ft , ob das DirEntry einen langen
3160cdf0e10cSrcweir |* Filenamen auf einer FAT-Partition enth?lt (EAs).
3161cdf0e10cSrcweir |* (eigentlich nur f?r OS2 interessant)
3162cdf0e10cSrcweir |* Ersterstellung TPF 02.10.98
3163cdf0e10cSrcweir |* Letzte Aenderung TPF 01.03.1999
3164cdf0e10cSrcweir |*
3165cdf0e10cSrcweir *************************************************************************/
3166cdf0e10cSrcweir
IsLongNameOnFAT() const3167cdf0e10cSrcweir sal_Bool DirEntry::IsLongNameOnFAT() const
3168cdf0e10cSrcweir {
3169cdf0e10cSrcweir // FAT-System?
3170cdf0e10cSrcweir DirEntry aTempDirEntry(*this);
3171cdf0e10cSrcweir aTempDirEntry.ToAbs();
3172cdf0e10cSrcweir if (DirEntry::GetPathStyle(aTempDirEntry.GetDevice().GetName().GetChar(0)) != FSYS_STYLE_FAT)
3173cdf0e10cSrcweir {
3174cdf0e10cSrcweir return sal_False; // nein, also false
3175cdf0e10cSrcweir }
3176cdf0e10cSrcweir
3177cdf0e10cSrcweir // DirEntry-Kette auf lange Dateinamen pr?fen
3178cdf0e10cSrcweir for( sal_uInt16 iLevel = this->Level(); iLevel > 0; iLevel-- )
3179cdf0e10cSrcweir {
3180cdf0e10cSrcweir const DirEntry& rEntry = (const DirEntry&) (*this)[iLevel-1];
3181cdf0e10cSrcweir String aBase( rEntry.GetBase() );
3182cdf0e10cSrcweir String aExtension( rEntry.GetExtension() );
3183cdf0e10cSrcweir
3184cdf0e10cSrcweir if (aBase.Len()>8) // Name > 8?
3185cdf0e10cSrcweir {
3186cdf0e10cSrcweir return sal_True;
3187cdf0e10cSrcweir }
3188cdf0e10cSrcweir
3189cdf0e10cSrcweir if (aExtension.Len()>3) // Extension > 3?
3190cdf0e10cSrcweir {
3191cdf0e10cSrcweir return sal_True;
3192cdf0e10cSrcweir }
3193cdf0e10cSrcweir }
3194cdf0e10cSrcweir return sal_False;
3195cdf0e10cSrcweir }
3196cdf0e10cSrcweir
3197cdf0e10cSrcweir //========================================================================
3198cdf0e10cSrcweir
3199cdf0e10cSrcweir #if defined(DBG_UTIL)
3200cdf0e10cSrcweir
FSysTest()3201cdf0e10cSrcweir void FSysTest()
3202cdf0e10cSrcweir {
3203cdf0e10cSrcweir }
3204cdf0e10cSrcweir
3205cdf0e10cSrcweir #endif
3206cdf0e10cSrcweir
3207*73fec56aSmseidel /* vim: set noet sw=4 ts=4: */
3208