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