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