xref: /trunk/main/tools/source/fsys/dirent.cxx (revision 73fec56a8c7e87333c35112dd7464c115a13a8c8)
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