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