xref: /aoo41x/main/tools/source/fsys/wntmsc.cxx (revision 79aad27f)
1*89b56da7SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*89b56da7SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*89b56da7SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*89b56da7SAndrew Rist  * distributed with this work for additional information
6*89b56da7SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*89b56da7SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*89b56da7SAndrew Rist  * "License"); you may not use this file except in compliance
9*89b56da7SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*89b56da7SAndrew Rist  *
11*89b56da7SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*89b56da7SAndrew Rist  *
13*89b56da7SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*89b56da7SAndrew Rist  * software distributed under the License is distributed on an
15*89b56da7SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*89b56da7SAndrew Rist  * KIND, either express or implied.  See the License for the
17*89b56da7SAndrew Rist  * specific language governing permissions and limitations
18*89b56da7SAndrew Rist  * under the License.
19*89b56da7SAndrew Rist  *
20*89b56da7SAndrew Rist  *************************************************************/
21*89b56da7SAndrew Rist 
22*89b56da7SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_tools.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #ifdef _MSC_VER
28cdf0e10cSrcweir #pragma warning (push,1)
29cdf0e10cSrcweir #endif
30cdf0e10cSrcweir #include <stdio.h>
31cdf0e10cSrcweir #include <ctype.h>
32cdf0e10cSrcweir #include <limits.h>
33cdf0e10cSrcweir #ifdef _MSC_VER
34cdf0e10cSrcweir #pragma warning (pop)
35cdf0e10cSrcweir #endif
36cdf0e10cSrcweir 
37cdf0e10cSrcweir #include "wntmsc.hxx"
38cdf0e10cSrcweir #include <tools/errinf.hxx>
39cdf0e10cSrcweir #include <tools/debug.hxx>
40cdf0e10cSrcweir #include <tools/list.hxx>
41cdf0e10cSrcweir #include <tools/wldcrd.hxx>
42cdf0e10cSrcweir #include <tools/fsys.hxx>
43cdf0e10cSrcweir #include <tools/bigint.hxx>
44cdf0e10cSrcweir 
45cdf0e10cSrcweir DECLARE_LIST( DirEntryList, DirEntry* );
46cdf0e10cSrcweir DECLARE_LIST( FSysSortList, FSysSort* );
47cdf0e10cSrcweir DECLARE_LIST( FileStatList, FileStat* );
48cdf0e10cSrcweir 
49cdf0e10cSrcweir int Sys2SolarError_Impl( int nSysErr );
50cdf0e10cSrcweir 
51cdf0e10cSrcweir static sal_Bool   bLastCaseSensitive    = sal_False;
52cdf0e10cSrcweir 
53cdf0e10cSrcweir //--------------------------------------------------------------------
54cdf0e10cSrcweir 
Upper_Impl(const ByteString & rStr)55cdf0e10cSrcweir ByteString Upper_Impl( const ByteString &rStr )
56cdf0e10cSrcweir {
57cdf0e10cSrcweir     ByteString aRet( rStr.GetBuffer() ); // es muss ein neuer String entstehen!
58cdf0e10cSrcweir     CharUpperBuff( (char*) aRet.GetBuffer(), aRet.Len() );
59cdf0e10cSrcweir     return aRet;
60cdf0e10cSrcweir }
61cdf0e10cSrcweir 
62cdf0e10cSrcweir //--------------------------------------------------------------------
63cdf0e10cSrcweir 
opendir(const char * pPfad)64cdf0e10cSrcweir DIR *opendir( const char* pPfad )
65cdf0e10cSrcweir {
66cdf0e10cSrcweir     DIR *pDir = new DIR;
67cdf0e10cSrcweir     if ( pDir )
68cdf0e10cSrcweir         pDir->p = (char*) pPfad;
69cdf0e10cSrcweir     return pDir;
70cdf0e10cSrcweir }
71cdf0e10cSrcweir 
readdir(DIR * pDir)72cdf0e10cSrcweir struct dirent *readdir( DIR *pDir )
73cdf0e10cSrcweir {
74cdf0e10cSrcweir     bool bOk = false;
75cdf0e10cSrcweir     if ( pDir->p )
76cdf0e10cSrcweir     {
77cdf0e10cSrcweir         char *pBuf = new char[ strlen( pDir->p ) + 5 ];
78cdf0e10cSrcweir         if ( pBuf )
79cdf0e10cSrcweir         {
80cdf0e10cSrcweir             // *.* dahinter, ggf mit "\\" abtrennen (falls nicht schon da)
81cdf0e10cSrcweir             strcpy( pBuf, pDir->p );
82cdf0e10cSrcweir             strcat( pBuf, "\\*.*" + ( *(pBuf + strlen( pBuf ) - 1 ) == '\\' ) );
83cdf0e10cSrcweir             CharUpperBuff( pBuf, strlen(pBuf) );
84cdf0e10cSrcweir             pDir->h = FindFirstFile( pBuf, &pDir->aDirEnt );
85cdf0e10cSrcweir             bOk = pDir->h != INVALID_HANDLE_VALUE;
86cdf0e10cSrcweir             pDir->p = NULL;
87cdf0e10cSrcweir             delete [] pBuf;
88cdf0e10cSrcweir         }
89cdf0e10cSrcweir         else
90cdf0e10cSrcweir             pDir->h = INVALID_HANDLE_VALUE;
91cdf0e10cSrcweir     }
92cdf0e10cSrcweir     else
93cdf0e10cSrcweir     {
94cdf0e10cSrcweir         bOk = FindNextFile( pDir->h, &pDir->aDirEnt );
95cdf0e10cSrcweir     }
96cdf0e10cSrcweir 
97cdf0e10cSrcweir     return bOk ? &pDir->aDirEnt : NULL;
98cdf0e10cSrcweir }
99cdf0e10cSrcweir 
closedir(DIR * pDir)100cdf0e10cSrcweir int closedir( DIR *pDir )
101cdf0e10cSrcweir {
102cdf0e10cSrcweir     sal_Bool bOk = sal_False;
103cdf0e10cSrcweir     if ( pDir )
104cdf0e10cSrcweir     {
105cdf0e10cSrcweir         bOk = 0 != pDir->p || FindClose( pDir->h );
106cdf0e10cSrcweir         delete pDir;
107cdf0e10cSrcweir     }
108cdf0e10cSrcweir     return bOk;
109cdf0e10cSrcweir }
110cdf0e10cSrcweir 
111cdf0e10cSrcweir /*************************************************************************
112cdf0e10cSrcweir |*
113cdf0e10cSrcweir |*    DirEntry::GetPathStyle() const
114cdf0e10cSrcweir |*
115cdf0e10cSrcweir |*    Beschreibung
116cdf0e10cSrcweir |*    Ersterstellung    MI 11.05.95
117cdf0e10cSrcweir |*    Letzte Aenderung  MI 11.05.95
118cdf0e10cSrcweir |*
119cdf0e10cSrcweir *************************************************************************/
120cdf0e10cSrcweir 
GetPathStyle_Impl(const String & rDevice,FSysPathStyle & rStyle)121cdf0e10cSrcweir ErrCode GetPathStyle_Impl( const String &rDevice, FSysPathStyle &rStyle )
122cdf0e10cSrcweir {
123cdf0e10cSrcweir     ByteString aRootDir(rDevice, osl_getThreadTextEncoding());
124cdf0e10cSrcweir     if ( aRootDir.Len() && aRootDir.GetBuffer()[aRootDir.Len()-1] != '\\' )
125cdf0e10cSrcweir         aRootDir += '\\';
126cdf0e10cSrcweir 
127cdf0e10cSrcweir     char sVolumeName[256];
128cdf0e10cSrcweir     char sFileSysName[16];
129cdf0e10cSrcweir     DWORD nSerial[2];
130cdf0e10cSrcweir     DWORD nMaxCompLen[2];
131cdf0e10cSrcweir     DWORD nFlags[2];
132cdf0e10cSrcweir 
133cdf0e10cSrcweir     // Windows95 hat VFAT, WindowsNT nicht
134cdf0e10cSrcweir     DWORD nVer = GetVersion();
135cdf0e10cSrcweir     sal_Bool bW95 = ( nVer & 0xFF ) >= 4;
136cdf0e10cSrcweir 
137cdf0e10cSrcweir     FSysFailOnErrorImpl();
138cdf0e10cSrcweir     rStyle = FSYS_STYLE_UNKNOWN;
139cdf0e10cSrcweir     if ( GetVolumeInformation(
140cdf0e10cSrcweir             (char*) aRootDir.GetBuffer(),
141cdf0e10cSrcweir             sVolumeName, 256, (LPDWORD) &nSerial, (LPDWORD) &nMaxCompLen,
142cdf0e10cSrcweir             (LPDWORD) &nFlags, sFileSysName, 16 ) )
143cdf0e10cSrcweir     {
144cdf0e10cSrcweir         // FAT/VFAT?
145cdf0e10cSrcweir         if ( 0 == strcmp( "FAT", sFileSysName ) )
146cdf0e10cSrcweir             rStyle = bW95 ? FSYS_STYLE_VFAT : FSYS_STYLE_FAT;
147cdf0e10cSrcweir 
148cdf0e10cSrcweir         // NTFS?
149cdf0e10cSrcweir         else if ( 0 == strcmp( "NTFS", sFileSysName ) )
150cdf0e10cSrcweir             rStyle = FSYS_STYLE_NTFS;
151cdf0e10cSrcweir 
152cdf0e10cSrcweir         // HPFS?
153cdf0e10cSrcweir         else if ( 0 == strcmp( "HPFS", sFileSysName ) )
154cdf0e10cSrcweir             rStyle = FSYS_STYLE_HPFS;
155cdf0e10cSrcweir 
156cdf0e10cSrcweir         // NWCOMPA/NWFS?
157cdf0e10cSrcweir         else if ( 0 == strncmp( "NW", sFileSysName, 2 ) )
158cdf0e10cSrcweir             rStyle = FSYS_STYLE_NWFS;
159cdf0e10cSrcweir 
160cdf0e10cSrcweir         return ERRCODE_NONE;
161cdf0e10cSrcweir     }
162cdf0e10cSrcweir 
163cdf0e10cSrcweir     return ERRCODE_IO_INVALIDDEVICE;
164cdf0e10cSrcweir }
165cdf0e10cSrcweir 
GetPathStyle(const String & rDevice)166cdf0e10cSrcweir FSysPathStyle DirEntry::GetPathStyle( const String &rDevice )
167cdf0e10cSrcweir {
168cdf0e10cSrcweir 
169cdf0e10cSrcweir     FSysPathStyle eStyle;
170cdf0e10cSrcweir     GetPathStyle_Impl( rDevice, eStyle );
171cdf0e10cSrcweir     return eStyle;
172cdf0e10cSrcweir }
173cdf0e10cSrcweir 
174cdf0e10cSrcweir /*************************************************************************
175cdf0e10cSrcweir |*
176cdf0e10cSrcweir |*    DirEntry::IsCaseSensitive()
177cdf0e10cSrcweir |*
178cdf0e10cSrcweir |*    Beschreibung      FSYS.SDW
179cdf0e10cSrcweir |*    Ersterstellung    MI  10.06.93
180cdf0e10cSrcweir |*    Letzte Aenderung  TPF 26.02.1999
181cdf0e10cSrcweir |*
182cdf0e10cSrcweir *************************************************************************/
183cdf0e10cSrcweir 
IsCaseSensitive(FSysPathStyle eFormatter) const184cdf0e10cSrcweir sal_Bool DirEntry::IsCaseSensitive( FSysPathStyle eFormatter ) const
185cdf0e10cSrcweir {
186cdf0e10cSrcweir 
187cdf0e10cSrcweir     if (eFormatter==FSYS_STYLE_HOST)
188cdf0e10cSrcweir     {
189cdf0e10cSrcweir /*
190cdf0e10cSrcweir         DirEntry            aRoot(*this);
191cdf0e10cSrcweir         aRoot.ToAbs();
192cdf0e10cSrcweir         aRoot =             aRoot[Level()-1];
193cdf0e10cSrcweir         String aRootDir =   aRoot.GetFull(FSYS_STYLE_HOST, sal_True);
194cdf0e10cSrcweir 
195cdf0e10cSrcweir         char sVolumeName[256];
196cdf0e10cSrcweir         DWORD nVolumeSerial;
197cdf0e10cSrcweir         DWORD nMaxCompLen;
198cdf0e10cSrcweir         DWORD nFlags;
199cdf0e10cSrcweir         char sFileSysName[16];
200cdf0e10cSrcweir 
201cdf0e10cSrcweir         if ( GetVolumeInformation(  (char*) aRootDir.GetStr(),
202cdf0e10cSrcweir                                     sVolumeName,
203cdf0e10cSrcweir                                     256,
204cdf0e10cSrcweir                                     (LPDWORD) &nVolumeSerial,
205cdf0e10cSrcweir                                     (LPDWORD) &nMaxCompLen,
206cdf0e10cSrcweir                                     (LPDWORD) &nFlags,
207cdf0e10cSrcweir                                     sFileSysName,
208cdf0e10cSrcweir                                     16 ))
209cdf0e10cSrcweir         {
210cdf0e10cSrcweir             return (nFlags & FS_CASE_SENSITIVE) ? sal_True : sal_False;
211cdf0e10cSrcweir         }
212cdf0e10cSrcweir         else
213cdf0e10cSrcweir         {
214cdf0e10cSrcweir             return sal_False;
215cdf0e10cSrcweir         }
216cdf0e10cSrcweir */
217cdf0e10cSrcweir         //
218cdf0e10cSrcweir         // guter versuch, aber FS_CASE_SENSITIVE ist D?nnsinn in T?ten:
219cdf0e10cSrcweir         //
220cdf0e10cSrcweir         // sFileSysName     FS_CASE_SENSITIVE
221cdf0e10cSrcweir         // FAT              sal_False
222cdf0e10cSrcweir         // NTFS             sal_True !!!
223cdf0e10cSrcweir         // NWCompat         sal_False
224cdf0e10cSrcweir         // Samba            sal_False
225cdf0e10cSrcweir         //
226cdf0e10cSrcweir         // NT spricht auch NTFS lediglich case preserving an, also ist unter NT alles case insensitiv
227cdf0e10cSrcweir         //
228cdf0e10cSrcweir 
229cdf0e10cSrcweir         return sal_False;
230cdf0e10cSrcweir     }
231cdf0e10cSrcweir     else
232cdf0e10cSrcweir     {
233cdf0e10cSrcweir         sal_Bool isCaseSensitive = sal_False;   // ich bin unter win32, also ist der default case insensitiv
234cdf0e10cSrcweir         switch ( eFormatter )
235cdf0e10cSrcweir         {
236cdf0e10cSrcweir             case FSYS_STYLE_MAC:
237cdf0e10cSrcweir             case FSYS_STYLE_FAT:
238cdf0e10cSrcweir             case FSYS_STYLE_VFAT:
239cdf0e10cSrcweir             case FSYS_STYLE_NTFS:
240cdf0e10cSrcweir             case FSYS_STYLE_NWFS:
241cdf0e10cSrcweir             case FSYS_STYLE_HPFS:
242cdf0e10cSrcweir             case FSYS_STYLE_DETECT:
243cdf0e10cSrcweir                 {
244cdf0e10cSrcweir                     isCaseSensitive = sal_False;
245cdf0e10cSrcweir                     break;
246cdf0e10cSrcweir                 }
247cdf0e10cSrcweir             case FSYS_STYLE_SYSV:
248cdf0e10cSrcweir             case FSYS_STYLE_BSD:
249cdf0e10cSrcweir                 {
250cdf0e10cSrcweir                     isCaseSensitive = sal_True;
251cdf0e10cSrcweir                     break;
252cdf0e10cSrcweir                 }
253cdf0e10cSrcweir             default:
254cdf0e10cSrcweir                 {
255cdf0e10cSrcweir                     isCaseSensitive = sal_False;    // ich bin unter win32, also ist der default case insensitiv
256cdf0e10cSrcweir                     break;
257cdf0e10cSrcweir                 }
258cdf0e10cSrcweir         }
259cdf0e10cSrcweir         return isCaseSensitive;
260cdf0e10cSrcweir     }
261cdf0e10cSrcweir }
262cdf0e10cSrcweir 
263cdf0e10cSrcweir /*************************************************************************
264cdf0e10cSrcweir |*
265cdf0e10cSrcweir |*    DirEntry::ToAbs()
266cdf0e10cSrcweir |*
267cdf0e10cSrcweir |*    Beschreibung      FSYS.SDW
268cdf0e10cSrcweir |*    Ersterstellung    MI 26.04.91
269cdf0e10cSrcweir |*    Letzte Aenderung  MA 02.12.91
270cdf0e10cSrcweir |*
271cdf0e10cSrcweir *************************************************************************/
272cdf0e10cSrcweir 
ToAbs()273cdf0e10cSrcweir sal_Bool DirEntry::ToAbs()
274cdf0e10cSrcweir {
275cdf0e10cSrcweir     DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
276cdf0e10cSrcweir 
277cdf0e10cSrcweir     if ( FSYS_FLAG_VOLUME == eFlag )
278cdf0e10cSrcweir     {
279cdf0e10cSrcweir         eFlag = FSYS_FLAG_ABSROOT;
280cdf0e10cSrcweir         return sal_True;
281cdf0e10cSrcweir     }
282cdf0e10cSrcweir 
283cdf0e10cSrcweir     if ( IsAbs() )
284cdf0e10cSrcweir     {
285cdf0e10cSrcweir         return sal_True;
286cdf0e10cSrcweir     }
287cdf0e10cSrcweir 
288cdf0e10cSrcweir 
289cdf0e10cSrcweir     char sBuf[256];
290cdf0e10cSrcweir     char *pOld;
291cdf0e10cSrcweir     ByteString aFullName( GetFull(), osl_getThreadTextEncoding() );
292cdf0e10cSrcweir     FSysFailOnErrorImpl();
293cdf0e10cSrcweir     if ( GetFullPathName((char*)aFullName.GetBuffer(),256,sBuf,&pOld) > 511 )
294cdf0e10cSrcweir         return sal_False;
295cdf0e10cSrcweir 
296cdf0e10cSrcweir     *this = DirEntry( String(sBuf, osl_getThreadTextEncoding() ));
297cdf0e10cSrcweir     return sal_True;
298cdf0e10cSrcweir }
299cdf0e10cSrcweir 
300cdf0e10cSrcweir 
301cdf0e10cSrcweir /*************************************************************************
302cdf0e10cSrcweir |*
303cdf0e10cSrcweir |*    DirEntry::GetVolume()
304cdf0e10cSrcweir |*
305cdf0e10cSrcweir |*    Beschreibung      FSYS.SDW
306cdf0e10cSrcweir |*    Ersterstellung    MI 27.08.92
307cdf0e10cSrcweir |*    Letzte Aenderung  MI 28.08.92
308cdf0e10cSrcweir |*
309cdf0e10cSrcweir *************************************************************************/
310cdf0e10cSrcweir 
GetVolume() const311cdf0e10cSrcweir String DirEntry::GetVolume() const
312cdf0e10cSrcweir {
313cdf0e10cSrcweir   DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
314cdf0e10cSrcweir 
315cdf0e10cSrcweir     String aRet;
316cdf0e10cSrcweir     const DirEntry *pTop = ImpGetTopPtr();
317cdf0e10cSrcweir     ByteString aName = ByteString( pTop->aName ).ToLowerAscii();
318cdf0e10cSrcweir 
319cdf0e10cSrcweir     if ( ( pTop->eFlag == FSYS_FLAG_ABSROOT ||
320cdf0e10cSrcweir            pTop->eFlag == FSYS_FLAG_RELROOT ||
321cdf0e10cSrcweir            pTop->eFlag == FSYS_FLAG_VOLUME )
322cdf0e10cSrcweir          && aName != "a:" && aName != "b:" && Exists() )
323cdf0e10cSrcweir     {
324cdf0e10cSrcweir         char sFileSysName[256];
325cdf0e10cSrcweir         char sVolumeName[256];
326cdf0e10cSrcweir         DWORD nVolumeNameLen = 256;
327cdf0e10cSrcweir         DWORD nSerial[2];
328cdf0e10cSrcweir         DWORD nMaxCompLen[2];
329cdf0e10cSrcweir         DWORD nFlags[2];
330cdf0e10cSrcweir         ByteString aRootDir = pTop->aName;
331cdf0e10cSrcweir         FSysFailOnErrorImpl();
332cdf0e10cSrcweir 
333cdf0e10cSrcweir         // Network-Device zuerst probieren wegen langsamer Samba-Drives
334cdf0e10cSrcweir         if ( !WNetGetConnection( (char*) aRootDir.GetBuffer(),
335cdf0e10cSrcweir                                  sVolumeName, &nVolumeNameLen ) )
336cdf0e10cSrcweir             aRet = String( sVolumeName, osl_getThreadTextEncoding());
337cdf0e10cSrcweir 
338cdf0e10cSrcweir         // dann den VolumeNamen fuer lokale Drives
339cdf0e10cSrcweir         if ( aRet.Len() == 0 )
340cdf0e10cSrcweir         {
341cdf0e10cSrcweir             aRootDir += "\\";
342cdf0e10cSrcweir             if ( GetVolumeInformation( (char*) aRootDir.GetBuffer(),
343cdf0e10cSrcweir                                        sVolumeName, 256,
344cdf0e10cSrcweir                                        (LPDWORD) &nSerial, (LPDWORD) &nMaxCompLen,
345cdf0e10cSrcweir                                        (LPDWORD) &nFlags, sFileSysName, 256 ) )
346cdf0e10cSrcweir                 aRet = String( sVolumeName, osl_getThreadTextEncoding());
347cdf0e10cSrcweir         }
348cdf0e10cSrcweir     }
349cdf0e10cSrcweir 
350cdf0e10cSrcweir     return aRet;
351cdf0e10cSrcweir }
352cdf0e10cSrcweir 
353cdf0e10cSrcweir /*************************************************************************
354cdf0e10cSrcweir |*
355cdf0e10cSrcweir |*    DirEntry::SetCWD()
356cdf0e10cSrcweir |*
357cdf0e10cSrcweir |*    Beschreibung      FSYS.SDW
358cdf0e10cSrcweir |*    Ersterstellung    MI 26.04.91
359cdf0e10cSrcweir |*    Letzte Aenderung  MI 21.05.92
360cdf0e10cSrcweir |*
361cdf0e10cSrcweir *************************************************************************/
362cdf0e10cSrcweir 
SetCWD(sal_Bool bSloppy) const363cdf0e10cSrcweir sal_Bool DirEntry::SetCWD( sal_Bool bSloppy ) const
364cdf0e10cSrcweir {
365cdf0e10cSrcweir     DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
366cdf0e10cSrcweir 
367cdf0e10cSrcweir     FSysFailOnErrorImpl();
368cdf0e10cSrcweir 
369cdf0e10cSrcweir     if ( eFlag == FSYS_FLAG_CURRENT && !aName.Len() )
370cdf0e10cSrcweir         return sal_True;
371cdf0e10cSrcweir 
372cdf0e10cSrcweir     if ( SetCurrentDirectory(ByteString(GetFull(), osl_getThreadTextEncoding()).GetBuffer()) )
373cdf0e10cSrcweir     {
374cdf0e10cSrcweir         return sal_True;
375cdf0e10cSrcweir     }
376cdf0e10cSrcweir 
377cdf0e10cSrcweir     if ( bSloppy && pParent &&
378cdf0e10cSrcweir          SetCurrentDirectory(ByteString(pParent->GetFull(), osl_getThreadTextEncoding()).GetBuffer()) )
379cdf0e10cSrcweir     {
380cdf0e10cSrcweir         return sal_True;
381cdf0e10cSrcweir     }
382cdf0e10cSrcweir 
383cdf0e10cSrcweir     return sal_False;
384cdf0e10cSrcweir }
385cdf0e10cSrcweir 
386cdf0e10cSrcweir //-------------------------------------------------------------------------
387cdf0e10cSrcweir 
Init()388cdf0e10cSrcweir USHORT DirReader_Impl::Init()
389cdf0e10cSrcweir {
390cdf0e10cSrcweir     // Block-Devices auflisten?
391cdf0e10cSrcweir     if ( pDir->eAttrMask & FSYS_KIND_BLOCK )
392cdf0e10cSrcweir     {
393cdf0e10cSrcweir         // CWD merken
394cdf0e10cSrcweir         DirEntry aCurrentDir;
395cdf0e10cSrcweir         aCurrentDir.ToAbs();
396cdf0e10cSrcweir 
397cdf0e10cSrcweir         // einzeln auf Existenz und Masken-konformit"at pr"ufen
398cdf0e10cSrcweir         USHORT nRead = 0;
399cdf0e10cSrcweir         char sDrive[3] = { '?', ':', 0 };
400cdf0e10cSrcweir         char sRoot[4] = { '?', ':', '\\', 0 };
401cdf0e10cSrcweir         for ( char c = 'a'; c <= 'z'; c++ )
402cdf0e10cSrcweir         {
403cdf0e10cSrcweir             sDrive[0] = c;
404cdf0e10cSrcweir             sRoot[0] = c;
405cdf0e10cSrcweir             DirEntry* pDrive = new DirEntry( sDrive, FSYS_FLAG_VOLUME, FSYS_STYLE_HOST );
406cdf0e10cSrcweir             if ( pDir->aNameMask.Matches( String( ByteString(sDrive), osl_getThreadTextEncoding())) && GetDriveType( sRoot ) != 1 )
407cdf0e10cSrcweir             {
408cdf0e10cSrcweir                 if ( pDir->pStatLst ) //Status fuer Sort gewuenscht?
409cdf0e10cSrcweir                 {
410cdf0e10cSrcweir                     FileStat *pNewStat = new FileStat( *pDrive );
411cdf0e10cSrcweir                     pDir->ImpSortedInsert( pDrive, pNewStat );
412cdf0e10cSrcweir                 }
413cdf0e10cSrcweir                 else
414cdf0e10cSrcweir                     pDir->ImpSortedInsert( pDrive, NULL );
415cdf0e10cSrcweir                 ++nRead;
416cdf0e10cSrcweir             }
417cdf0e10cSrcweir             else
418cdf0e10cSrcweir                 delete pDrive;
419cdf0e10cSrcweir         }
420cdf0e10cSrcweir 
421cdf0e10cSrcweir         // CWD restaurieren
422cdf0e10cSrcweir         aCurrentDir.SetCWD();
423cdf0e10cSrcweir         return nRead;
424cdf0e10cSrcweir     }
425cdf0e10cSrcweir 
426cdf0e10cSrcweir     return 0;
427cdf0e10cSrcweir }
428cdf0e10cSrcweir 
429cdf0e10cSrcweir //-------------------------------------------------------------------------
430cdf0e10cSrcweir 
Read()431cdf0e10cSrcweir USHORT DirReader_Impl::Read()
432cdf0e10cSrcweir {
433cdf0e10cSrcweir     // Directories und Files auflisten?
434cdf0e10cSrcweir     if ( ( pDir->eAttrMask & FSYS_KIND_DIR ||
435cdf0e10cSrcweir            pDir->eAttrMask & FSYS_KIND_FILE ) &&
436cdf0e10cSrcweir            ( ( pDosEntry = readdir( pDosDir ) ) != NULL ) )
437cdf0e10cSrcweir     {
438cdf0e10cSrcweir         // Gross/Kleinschreibung nicht beruecksichtigen
439cdf0e10cSrcweir         ByteString aLowerName = pDosEntry->d_name;
440cdf0e10cSrcweir         CharLowerBuff( (char*) aLowerName.GetBuffer(), aLowerName.Len() );
441cdf0e10cSrcweir 
442cdf0e10cSrcweir         // Flags pruefen
443cdf0e10cSrcweir         sal_Bool bIsDirAndWantsDir =
444cdf0e10cSrcweir                 ( ( pDir->eAttrMask & FSYS_KIND_DIR ) &&
445cdf0e10cSrcweir #ifdef ICC
446cdf0e10cSrcweir                     ( pDosEntry->d_type & ( strcmp(pDosEntry->d_name,".") ||
447cdf0e10cSrcweir                       strcmp(pDosEntry->d_name,"..")) ) );
448cdf0e10cSrcweir #else
449cdf0e10cSrcweir                     ( pDosEntry->d_type & DOS_DIRECT ) );
450cdf0e10cSrcweir #endif
451cdf0e10cSrcweir         sal_Bool bIsFileAndWantsFile =
452cdf0e10cSrcweir                 ( ( pDir->eAttrMask & FSYS_KIND_FILE ) &&
453cdf0e10cSrcweir #ifdef ICC
454cdf0e10cSrcweir                     !( pDosEntry->d_type & ( strcmp(pDosEntry->d_name,".") ||
455cdf0e10cSrcweir                       strcmp(pDosEntry->d_name,"..")) ) &&
456cdf0e10cSrcweir #else
457cdf0e10cSrcweir                     !( pDosEntry->d_type & DOS_DIRECT ) &&
458cdf0e10cSrcweir #endif
459cdf0e10cSrcweir                     !( pDosEntry->d_type & DOS_VOLUMEID ) );
460cdf0e10cSrcweir         sal_Bool bIsHidden = (pDosEntry->d_type & _A_HIDDEN) != 0;
461cdf0e10cSrcweir         sal_Bool bWantsHidden = 0 == ( pDir->eAttrMask & FSYS_KIND_VISIBLE );
462cdf0e10cSrcweir         if ( ( bIsDirAndWantsDir || bIsFileAndWantsFile ) &&
463cdf0e10cSrcweir              ( bWantsHidden || !bIsHidden ) &&
464cdf0e10cSrcweir              pDir->aNameMask.Matches( String(aLowerName, osl_getThreadTextEncoding()) ) )
465cdf0e10cSrcweir         {
466cdf0e10cSrcweir #ifdef DBG_UTIL
467cdf0e10cSrcweir             DbgOutf( "%s %s flags:%x found",
468cdf0e10cSrcweir                 pDosEntry->d_name,
469cdf0e10cSrcweir                 bIsFileAndWantsFile ? "file" : "dir",
470cdf0e10cSrcweir                 pDosEntry->d_type );
471cdf0e10cSrcweir #endif
472cdf0e10cSrcweir             DirEntryFlag eFlag =
473cdf0e10cSrcweir                     0 == strcmp( pDosEntry->d_name, "." ) ? FSYS_FLAG_CURRENT
474cdf0e10cSrcweir                 :   0 == strcmp( pDosEntry->d_name, ".." ) ? FSYS_FLAG_PARENT
475cdf0e10cSrcweir                 :   FSYS_FLAG_NORMAL;
476cdf0e10cSrcweir             DirEntry *pTemp = new DirEntry( ByteString(pDosEntry->d_name),
477cdf0e10cSrcweir                                             eFlag, FSYS_STYLE_NTFS );
478cdf0e10cSrcweir #ifdef FEAT_FSYS_DOUBLESPEED
479cdf0e10cSrcweir             pTemp->ImpSetStat( new FileStat( (void*) pDosDir, (void*) 0 ) );
480cdf0e10cSrcweir #endif
481cdf0e10cSrcweir             if ( pParent )
482cdf0e10cSrcweir                 pTemp->ImpChangeParent( new DirEntry( *pParent ), sal_False );
483cdf0e10cSrcweir             if ( pDir->pStatLst ) //Status fuer Sort gewuenscht?
484cdf0e10cSrcweir             {
485cdf0e10cSrcweir                 FileStat *pNewStat = new FileStat( (void*) pDosDir, (void*) 0 );
486cdf0e10cSrcweir                 pDir->ImpSortedInsert( pTemp, pNewStat );
487cdf0e10cSrcweir             }
488cdf0e10cSrcweir             else
489cdf0e10cSrcweir                 pDir->ImpSortedInsert( pTemp, NULL );
490cdf0e10cSrcweir             return 1;
491cdf0e10cSrcweir         }
492cdf0e10cSrcweir #ifdef DBG_UTIL
493cdf0e10cSrcweir         else
494cdf0e10cSrcweir             DbgOutf( "%s flags:%x skipped",
495cdf0e10cSrcweir                 pDosEntry->d_name,
496cdf0e10cSrcweir                 pDosEntry->d_type );
497cdf0e10cSrcweir #endif
498cdf0e10cSrcweir 
499cdf0e10cSrcweir     }
500cdf0e10cSrcweir     else
501cdf0e10cSrcweir         bReady = sal_True;
502cdf0e10cSrcweir     return 0;
503cdf0e10cSrcweir }
504cdf0e10cSrcweir 
505cdf0e10cSrcweir /*************************************************************************
506cdf0e10cSrcweir |*
507cdf0e10cSrcweir |*    InitFileStat()
508cdf0e10cSrcweir |*
509cdf0e10cSrcweir |*    Beschreibung      gemeinsamer Teil der Ctoren fuer FileStat
510cdf0e10cSrcweir |*    Ersterstellung    MI 28.08.92
511cdf0e10cSrcweir |*    Letzte Aenderung  MI 28.08.92
512cdf0e10cSrcweir |*
513cdf0e10cSrcweir *************************************************************************/
514cdf0e10cSrcweir 
ImpInit(void * p)515cdf0e10cSrcweir void FileStat::ImpInit( void* p )
516cdf0e10cSrcweir {
517cdf0e10cSrcweir     _WIN32_FIND_DATAA *pDirEnt = (_WIN32_FIND_DATAA*) p;
518cdf0e10cSrcweir 
519cdf0e10cSrcweir     nError = FSYS_ERR_OK;
520cdf0e10cSrcweir     nSize = pDirEnt->nFileSizeLow;
521cdf0e10cSrcweir 
522cdf0e10cSrcweir     SYSTEMTIME aSysTime;
523cdf0e10cSrcweir     FILETIME aLocTime;
524cdf0e10cSrcweir 
525cdf0e10cSrcweir     // use the last write date / time when the creation date / time isn't set
526cdf0e10cSrcweir     if ( ( pDirEnt->ftCreationTime.dwLowDateTime == 0 ) &&
527cdf0e10cSrcweir          ( pDirEnt->ftCreationTime.dwHighDateTime == 0 ) )
528cdf0e10cSrcweir     {
529cdf0e10cSrcweir         pDirEnt->ftCreationTime.dwLowDateTime = pDirEnt->ftLastWriteTime.dwLowDateTime;
530cdf0e10cSrcweir         pDirEnt->ftCreationTime.dwHighDateTime = pDirEnt->ftLastWriteTime.dwHighDateTime;
531cdf0e10cSrcweir     }
532cdf0e10cSrcweir 
533cdf0e10cSrcweir     // use the last write date / time when the last accessed date / time isn't set
534cdf0e10cSrcweir     if ( ( pDirEnt->ftLastAccessTime.dwLowDateTime == 0 ) &&
535cdf0e10cSrcweir          ( pDirEnt->ftLastAccessTime.dwHighDateTime == 0 ) )
536cdf0e10cSrcweir     {
537cdf0e10cSrcweir         pDirEnt->ftLastAccessTime.dwLowDateTime = pDirEnt->ftLastWriteTime.dwLowDateTime;
538cdf0e10cSrcweir         pDirEnt->ftLastAccessTime.dwHighDateTime = pDirEnt->ftLastWriteTime.dwHighDateTime;
539cdf0e10cSrcweir     }
540cdf0e10cSrcweir 
541cdf0e10cSrcweir     FileTimeToLocalFileTime( &pDirEnt->ftCreationTime, &aLocTime );
542cdf0e10cSrcweir     FileTimeToSystemTime( &aLocTime, &aSysTime );
543cdf0e10cSrcweir     aDateCreated  = Date( aSysTime.wDay, aSysTime.wMonth, aSysTime.wYear );
544cdf0e10cSrcweir     aTimeCreated  = Time( aSysTime.wHour, aSysTime.wMinute,
545cdf0e10cSrcweir                             aSysTime.wSecond, 0 );
546cdf0e10cSrcweir 
547cdf0e10cSrcweir     FileTimeToLocalFileTime( &pDirEnt->ftLastWriteTime, &aLocTime );
548cdf0e10cSrcweir     FileTimeToSystemTime( &aLocTime, &aSysTime );
549cdf0e10cSrcweir     aDateModified = Date( aSysTime.wDay, aSysTime.wMonth, aSysTime.wYear );
550cdf0e10cSrcweir     aTimeModified = Time( aSysTime.wHour, aSysTime.wMinute,
551cdf0e10cSrcweir                             aSysTime.wSecond, 0 );
552cdf0e10cSrcweir 
553cdf0e10cSrcweir     FileTimeToLocalFileTime( &pDirEnt->ftLastAccessTime, &aLocTime );
554cdf0e10cSrcweir     FileTimeToSystemTime( &aLocTime, &aSysTime );
555cdf0e10cSrcweir     aDateAccessed = Date( aSysTime.wDay, aSysTime.wMonth, aSysTime.wYear );
556cdf0e10cSrcweir     aTimeAccessed = Time( aSysTime.wHour, aSysTime.wMinute,
557cdf0e10cSrcweir                             aSysTime.wSecond, 0 );
558cdf0e10cSrcweir 
559cdf0e10cSrcweir     nKindFlags = FSYS_KIND_FILE;
560cdf0e10cSrcweir     if ( pDirEnt->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
561cdf0e10cSrcweir         nKindFlags = FSYS_KIND_DIR;
562cdf0e10cSrcweir }
563cdf0e10cSrcweir 
564cdf0e10cSrcweir /*************************************************************************
565cdf0e10cSrcweir |*
566cdf0e10cSrcweir |*    FileStat::FileStat()
567cdf0e10cSrcweir |*
568cdf0e10cSrcweir |*    Beschreibung      FSYS.SDW
569cdf0e10cSrcweir |*    Ersterstellung    MI 27.08.92
570cdf0e10cSrcweir |*    Letzte Aenderung  MI 28.08.92
571cdf0e10cSrcweir |*
572cdf0e10cSrcweir *************************************************************************/
573cdf0e10cSrcweir 
FileStat(const void * pInfo,const void *)574cdf0e10cSrcweir FileStat::FileStat( const void *pInfo,      // struct dirent
575cdf0e10cSrcweir                     const void * ):         // dummy
576cdf0e10cSrcweir     aDateCreated(0),
577cdf0e10cSrcweir     aTimeCreated(0),
578cdf0e10cSrcweir     aDateModified(0),
579cdf0e10cSrcweir     aTimeModified(0),
580cdf0e10cSrcweir     aDateAccessed(0),
581cdf0e10cSrcweir     aTimeAccessed(0)
582cdf0e10cSrcweir {
583cdf0e10cSrcweir     ImpInit( ( (dirent*) pInfo ) );
584cdf0e10cSrcweir }
585cdf0e10cSrcweir 
586cdf0e10cSrcweir /*************************************************************************
587cdf0e10cSrcweir |*
588cdf0e10cSrcweir |*    FileStat::Update()
589cdf0e10cSrcweir |*
590cdf0e10cSrcweir |*    Beschreibung      FSYS.SDW
591cdf0e10cSrcweir |*    Ersterstellung    MI 27.08.92
592cdf0e10cSrcweir |*    Letzte Aenderung  MI 28.08.92
593cdf0e10cSrcweir |*
594cdf0e10cSrcweir *************************************************************************/
595cdf0e10cSrcweir 
596cdf0e10cSrcweir #ifdef _MSC_VER
597cdf0e10cSrcweir #pragma warning(push, 1)
598cdf0e10cSrcweir #pragma warning(disable: 4917)
599cdf0e10cSrcweir #endif
600cdf0e10cSrcweir #include <shlobj.h>
601cdf0e10cSrcweir #ifdef _MSC_VER
602cdf0e10cSrcweir #pragma warning(pop)
603cdf0e10cSrcweir #endif
604cdf0e10cSrcweir 
605cdf0e10cSrcweir #ifdef UNICODE
606cdf0e10cSrcweir #define lstrchr     wcschr
607cdf0e10cSrcweir #define lstrncmp    wcsncmp
608cdf0e10cSrcweir #else
609cdf0e10cSrcweir #define lstrchr     strchr
610cdf0e10cSrcweir #define lstrncmp    strncmp
611cdf0e10cSrcweir #endif
612cdf0e10cSrcweir 
613cdf0e10cSrcweir //---------------------------------------------------------------------------
614cdf0e10cSrcweir 
SHFreeMem(void * p)615cdf0e10cSrcweir void SHFreeMem( void *p )
616cdf0e10cSrcweir {
617cdf0e10cSrcweir     LPMALLOC    pMalloc = NULL;
618cdf0e10cSrcweir 
619cdf0e10cSrcweir     if ( SUCCEEDED(SHGetMalloc(&pMalloc)) )
620cdf0e10cSrcweir     {
621cdf0e10cSrcweir         pMalloc->Free( p );
622cdf0e10cSrcweir         pMalloc->Release();
623cdf0e10cSrcweir     }
624cdf0e10cSrcweir }
625cdf0e10cSrcweir 
626cdf0e10cSrcweir //---------------------------------------------------------------------------
627cdf0e10cSrcweir 
SHGetIDListFromPath(HWND hwndOwner,LPCTSTR pszPath,LPITEMIDLIST * ppidl)628cdf0e10cSrcweir HRESULT SHGetIDListFromPath( HWND hwndOwner, LPCTSTR pszPath, LPITEMIDLIST *ppidl )
629cdf0e10cSrcweir {
630cdf0e10cSrcweir     if ( IsBadWritePtr(ppidl, sizeof(LPITEMIDLIST)) )
631cdf0e10cSrcweir         return E_INVALIDARG;
632cdf0e10cSrcweir 
633cdf0e10cSrcweir     LPSHELLFOLDER   pDesktopFolder = NULL;
634cdf0e10cSrcweir 
635cdf0e10cSrcweir     HRESULT hResult = SHGetDesktopFolder( &pDesktopFolder );
636cdf0e10cSrcweir     if ( FAILED(hResult) )
637cdf0e10cSrcweir         return hResult;
638cdf0e10cSrcweir 
639cdf0e10cSrcweir     ULONG   chEaten = lstrlen( pszPath );
640cdf0e10cSrcweir     DWORD   dwAttributes = FILE_ATTRIBUTE_DIRECTORY;
641cdf0e10cSrcweir 
642cdf0e10cSrcweir #ifdef UNICODE
643cdf0e10cSrcweir     LPOLESTR    wszPath = pszPath;
644cdf0e10cSrcweir #else
645cdf0e10cSrcweir     WCHAR   wszPath[MAX_PATH];
646cdf0e10cSrcweir     MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, pszPath, -1, wszPath, MAX_PATH );
647cdf0e10cSrcweir #endif
648cdf0e10cSrcweir 
649cdf0e10cSrcweir     hResult = pDesktopFolder->ParseDisplayName( hwndOwner, (LPBC)NULL, wszPath, &chEaten, ppidl, &dwAttributes );
650cdf0e10cSrcweir     pDesktopFolder->Release();
651cdf0e10cSrcweir 
652cdf0e10cSrcweir     return hResult;
653cdf0e10cSrcweir }
654cdf0e10cSrcweir 
655cdf0e10cSrcweir //---------------------------------------------------------------------------
656cdf0e10cSrcweir 
SHGetFolderFromIDList(LPCITEMIDLIST pidl,LPSHELLFOLDER * ppFolder)657cdf0e10cSrcweir HRESULT SHGetFolderFromIDList( LPCITEMIDLIST pidl, LPSHELLFOLDER *ppFolder )
658cdf0e10cSrcweir {
659cdf0e10cSrcweir     if ( IsBadWritePtr(ppFolder, sizeof(LPSHELLFOLDER)) )
660cdf0e10cSrcweir         return E_INVALIDARG;
661cdf0e10cSrcweir 
662cdf0e10cSrcweir     *ppFolder = NULL;
663cdf0e10cSrcweir 
664cdf0e10cSrcweir     LPSHELLFOLDER pDesktopFolder = NULL;
665cdf0e10cSrcweir 
666cdf0e10cSrcweir     HRESULT hResult = SHGetDesktopFolder( &pDesktopFolder );
667cdf0e10cSrcweir     if ( FAILED(hResult) )
668cdf0e10cSrcweir         return hResult;
669cdf0e10cSrcweir 
670cdf0e10cSrcweir     hResult = pDesktopFolder->BindToObject( pidl, (LPBC)NULL, IID_IShellFolder, (LPVOID *)ppFolder );
671cdf0e10cSrcweir     pDesktopFolder->Release();
672cdf0e10cSrcweir 
673cdf0e10cSrcweir     return hResult;
674cdf0e10cSrcweir }
675cdf0e10cSrcweir 
676cdf0e10cSrcweir //---------------------------------------------------------------------------
677cdf0e10cSrcweir 
SHResolvePath(HWND hwndOwner,LPCTSTR pszPath,LPITEMIDLIST * ppidl)678cdf0e10cSrcweir HRESULT SHResolvePath( HWND hwndOwner, LPCTSTR pszPath, LPITEMIDLIST *ppidl )
679cdf0e10cSrcweir {
680cdf0e10cSrcweir     // If hwndOwner is NULL, use the desktop window, because dialogs need a parent
681cdf0e10cSrcweir 
682cdf0e10cSrcweir #ifdef BOOTSTRAP
683cdf0e10cSrcweir     return  NO_ERROR;
684cdf0e10cSrcweir #else
685cdf0e10cSrcweir     if ( !hwndOwner )
686cdf0e10cSrcweir         hwndOwner = GetDesktopWindow();
687cdf0e10cSrcweir 
688cdf0e10cSrcweir     HRESULT hResult = NOERROR;
689cdf0e10cSrcweir     LPTSTR  pszPathCopy;
690cdf0e10cSrcweir     LPTSTR  pszTrailingPath;
691cdf0e10cSrcweir     TCHAR   cBackup = 0;
692cdf0e10cSrcweir 
693cdf0e10cSrcweir     // First make a copy of the path
694cdf0e10cSrcweir 
695cdf0e10cSrcweir     pszPathCopy = new TCHAR[lstrlen(pszPath) + 1];
696cdf0e10cSrcweir     if ( pszPathCopy )
697cdf0e10cSrcweir         lstrcpy( pszPathCopy, pszPath );
698cdf0e10cSrcweir     else
699cdf0e10cSrcweir         return E_OUTOFMEMORY;
700cdf0e10cSrcweir 
701cdf0e10cSrcweir     // Determine the first token
702cdf0e10cSrcweir 
703cdf0e10cSrcweir     if ( !lstrncmp( pszPathCopy, "\\\\", 2 ) )
704cdf0e10cSrcweir         pszTrailingPath = lstrchr( pszPathCopy + 2, '\\' );
705cdf0e10cSrcweir     else
706cdf0e10cSrcweir         pszTrailingPath = lstrchr( pszPathCopy, '\\' );
707cdf0e10cSrcweir 
708cdf0e10cSrcweir     // Now scan the path tokens
709cdf0e10cSrcweir 
710cdf0e10cSrcweir     while ( SUCCEEDED(hResult) )
711cdf0e10cSrcweir     {
712cdf0e10cSrcweir         if ( pszTrailingPath )
713cdf0e10cSrcweir         {
714cdf0e10cSrcweir             cBackup = *(++pszTrailingPath);
715cdf0e10cSrcweir             *pszTrailingPath = 0;
716cdf0e10cSrcweir         }
717cdf0e10cSrcweir 
718cdf0e10cSrcweir         LPITEMIDLIST    pidl = NULL;
719cdf0e10cSrcweir 
720cdf0e10cSrcweir         // Make item ID list from leading path
721cdf0e10cSrcweir 
722cdf0e10cSrcweir         hResult = SHGetIDListFromPath( hwndOwner, pszPathCopy, &pidl );
723cdf0e10cSrcweir 
724cdf0e10cSrcweir         // if path exists try to open it as folder
725cdf0e10cSrcweir 
726cdf0e10cSrcweir         if ( SUCCEEDED(hResult) )
727cdf0e10cSrcweir         {
728cdf0e10cSrcweir             // Only open the folder if it was not the last token
729cdf0e10cSrcweir 
730cdf0e10cSrcweir             if ( pszTrailingPath )
731cdf0e10cSrcweir             {
732cdf0e10cSrcweir                 LPSHELLFOLDER   pFolder;
733cdf0e10cSrcweir 
734cdf0e10cSrcweir                 // Create a folder instance
735cdf0e10cSrcweir                 hResult = SHGetFolderFromIDList( pidl, &pFolder);
736cdf0e10cSrcweir 
737cdf0e10cSrcweir                 // Is it a folder ?
738cdf0e10cSrcweir                 if ( SUCCEEDED(hResult) )
739cdf0e10cSrcweir                 {
740cdf0e10cSrcweir                     // No try to instantiate an enumerator.
741cdf0e10cSrcweir                     // This should popup a login dialog if any
742cdf0e10cSrcweir 
743cdf0e10cSrcweir                     LPENUMIDLIST    pEnum = NULL;
744cdf0e10cSrcweir 
745cdf0e10cSrcweir                     hResult = pFolder->EnumObjects( hwndOwner,
746cdf0e10cSrcweir                         SHCONTF_NONFOLDERS | SHCONTF_FOLDERS | SHCONTF_INCLUDEHIDDEN,
747cdf0e10cSrcweir                         &pEnum );
748cdf0e10cSrcweir 
749cdf0e10cSrcweir                     // Release the enumerator interface
750cdf0e10cSrcweir                     if ( SUCCEEDED(hResult) )
751cdf0e10cSrcweir                         pEnum->Release();
752cdf0e10cSrcweir 
753cdf0e10cSrcweir                     // Release the folder interface
754cdf0e10cSrcweir                     pFolder->Release();
755cdf0e10cSrcweir                 }
756cdf0e10cSrcweir 
757cdf0e10cSrcweir                 SHFreeMem( pidl );
758cdf0e10cSrcweir             }
759cdf0e10cSrcweir             else // It was the last token
760cdf0e10cSrcweir             {
761cdf0e10cSrcweir                 if ( ppidl )
762cdf0e10cSrcweir                     *ppidl = pidl;
763cdf0e10cSrcweir                 else
764cdf0e10cSrcweir                     SHFreeMem( pidl );
765cdf0e10cSrcweir             }
766cdf0e10cSrcweir         }
767cdf0e10cSrcweir 
768cdf0e10cSrcweir 
769cdf0e10cSrcweir         // Forward to next token
770cdf0e10cSrcweir 
771cdf0e10cSrcweir         if ( pszTrailingPath )
772cdf0e10cSrcweir         {
773cdf0e10cSrcweir             *pszTrailingPath = cBackup;
774cdf0e10cSrcweir             pszTrailingPath = lstrchr( pszTrailingPath, '\\' );
775cdf0e10cSrcweir         }
776cdf0e10cSrcweir         else
777cdf0e10cSrcweir             break;
778cdf0e10cSrcweir     }
779cdf0e10cSrcweir 
780cdf0e10cSrcweir     // Free the working copy of the path
781cdf0e10cSrcweir     delete pszPathCopy;
782cdf0e10cSrcweir 
783cdf0e10cSrcweir     // NOERROR or OLE error code
784cdf0e10cSrcweir     return hResult;
785cdf0e10cSrcweir #endif
786cdf0e10cSrcweir }
787cdf0e10cSrcweir 
788cdf0e10cSrcweir //---------------------------------------------------------------------------
789cdf0e10cSrcweir // The Wrapper
790cdf0e10cSrcweir //---------------------------------------------------------------------------
791cdf0e10cSrcweir 
Exists_Impl(const ByteString & crPath)792cdf0e10cSrcweir sal_Bool Exists_Impl( const ByteString & crPath )
793cdf0e10cSrcweir {
794cdf0e10cSrcweir     // We do not know if OLE was initialized for this thread
795cdf0e10cSrcweir 
796cdf0e10cSrcweir     CoInitialize( NULL );
797cdf0e10cSrcweir 
798cdf0e10cSrcweir     sal_Bool    bSuccess = SUCCEEDED( SHResolvePath(NULL, crPath.GetBuffer(), NULL) );
799cdf0e10cSrcweir 
800cdf0e10cSrcweir     CoUninitialize();
801cdf0e10cSrcweir 
802cdf0e10cSrcweir     return bSuccess;
803cdf0e10cSrcweir }
804cdf0e10cSrcweir 
805cdf0e10cSrcweir //---------------------------------------------------------------------------
806cdf0e10cSrcweir 
Update(const DirEntry & rDirEntry,sal_Bool bForceAccess)807cdf0e10cSrcweir sal_Bool FileStat::Update( const DirEntry& rDirEntry, sal_Bool bForceAccess )
808cdf0e10cSrcweir {
809cdf0e10cSrcweir         nSize = 0;
810cdf0e10cSrcweir         nKindFlags = 0;
811cdf0e10cSrcweir         aCreator.Erase();
812cdf0e10cSrcweir         aType.Erase();
813cdf0e10cSrcweir         aDateCreated = Date(0);
814cdf0e10cSrcweir         aTimeCreated = Time(0);
815cdf0e10cSrcweir         aDateModified = Date(0);
816cdf0e10cSrcweir         aTimeModified = Time(0);
817cdf0e10cSrcweir         aDateAccessed = Date(0);
818cdf0e10cSrcweir         aTimeAccessed = Time(0);
819cdf0e10cSrcweir 
820cdf0e10cSrcweir         if ( !rDirEntry.IsValid() )
821cdf0e10cSrcweir         {
822cdf0e10cSrcweir             nError = FSYS_ERR_UNKNOWN;
823cdf0e10cSrcweir             nKindFlags = 0;
824cdf0e10cSrcweir             return sal_False;
825cdf0e10cSrcweir         }
826cdf0e10cSrcweir 
827cdf0e10cSrcweir         // Sonderbehandlung falls es sich um eine Root ohne Laufwerk handelt
828cdf0e10cSrcweir 
829cdf0e10cSrcweir         if ( !rDirEntry.aName.Len() && rDirEntry.eFlag == FSYS_FLAG_ABSROOT )
830cdf0e10cSrcweir         {
831cdf0e10cSrcweir             nKindFlags = FSYS_KIND_DIR;
832cdf0e10cSrcweir             nError = FSYS_ERR_OK;
833cdf0e10cSrcweir             return sal_True;
834cdf0e10cSrcweir         }
835cdf0e10cSrcweir 
836cdf0e10cSrcweir         // keine Error-Boxen anzeigen
837cdf0e10cSrcweir         FSysFailOnErrorImpl();
838cdf0e10cSrcweir 
839cdf0e10cSrcweir         // Redirect
840cdf0e10cSrcweir         String aPath( rDirEntry.GetFull() );
841cdf0e10cSrcweir #ifndef BOOTSTRAP
842cdf0e10cSrcweir         FSysRedirector::DoRedirect( aPath );
843cdf0e10cSrcweir #endif
844cdf0e10cSrcweir         DirEntry aDirEntry( aPath );
845cdf0e10cSrcweir 
846cdf0e10cSrcweir         // ist ein Medium im Laufwerk?
847cdf0e10cSrcweir         HACK("wie?")
848cdf0e10cSrcweir         sal_Bool bAccess = sal_True;
849cdf0e10cSrcweir         const DirEntry *pTop = aDirEntry.ImpGetTopPtr();
850cdf0e10cSrcweir         ByteString aName = ByteString(pTop->aName).ToLowerAscii();
851cdf0e10cSrcweir         if ( !bForceAccess &&
852cdf0e10cSrcweir                 ( pTop->eFlag == FSYS_FLAG_ABSROOT ||
853cdf0e10cSrcweir                 pTop->eFlag == FSYS_FLAG_RELROOT ||
854cdf0e10cSrcweir                 pTop->eFlag == FSYS_FLAG_VOLUME ) )
855cdf0e10cSrcweir             if ( aName == "a:" || aName == "b:" )
856cdf0e10cSrcweir                 bAccess = sal_False;
857cdf0e10cSrcweir             else
858cdf0e10cSrcweir                 DBG_TRACE( "FSys: will access removable device!" );
859cdf0e10cSrcweir         if ( bAccess && ( aName == "a:" || aName == "b:" ) ) {
860cdf0e10cSrcweir             DBG_WARNING( "floppy will clatter" );
861cdf0e10cSrcweir         }
862cdf0e10cSrcweir 
863cdf0e10cSrcweir         // Sonderbehandlung, falls es sich um ein Volume handelt
864cdf0e10cSrcweir         if ( aDirEntry.eFlag == FSYS_FLAG_VOLUME ||
865cdf0e10cSrcweir              aDirEntry.eFlag == FSYS_FLAG_ABSROOT )
866cdf0e10cSrcweir         {
867cdf0e10cSrcweir             if ( aDirEntry.eFlag == FSYS_FLAG_VOLUME )
868cdf0e10cSrcweir                 nKindFlags = FSYS_KIND_DEV | ( aDirEntry.aName.Len() == 2
869cdf0e10cSrcweir                                         ? FSYS_KIND_BLOCK
870cdf0e10cSrcweir                                         : FSYS_KIND_CHAR );
871cdf0e10cSrcweir             else
872cdf0e10cSrcweir                 nKindFlags = FSYS_KIND_DIR;
873cdf0e10cSrcweir 
874cdf0e10cSrcweir             if ( !bAccess )
875cdf0e10cSrcweir             {
876cdf0e10cSrcweir                 if ( aDirEntry.eFlag == FSYS_FLAG_VOLUME )
877cdf0e10cSrcweir                     nKindFlags |= FSYS_KIND_REMOVEABLE;
878cdf0e10cSrcweir                 nError = FSYS_ERR_NOTEXISTS;
879cdf0e10cSrcweir                 nKindFlags = 0;
880cdf0e10cSrcweir                 return sal_False;
881cdf0e10cSrcweir             }
882cdf0e10cSrcweir 
883cdf0e10cSrcweir             ByteString aRootDir = aDirEntry.aName;
884cdf0e10cSrcweir             aRootDir += ByteString( "\\" );
885cdf0e10cSrcweir             UINT nType = GetDriveType( (char *) aRootDir.GetBuffer() );       //TPF: 2i
886cdf0e10cSrcweir             if ( nType == 1 || nType == 0 )
887cdf0e10cSrcweir             {
888cdf0e10cSrcweir                 nError = FSYS_ERR_NOTEXISTS;
889cdf0e10cSrcweir                 nKindFlags = 0;
890cdf0e10cSrcweir                 return sal_False;
891cdf0e10cSrcweir             }
892cdf0e10cSrcweir 
893cdf0e10cSrcweir             if ( aDirEntry.eFlag == FSYS_FLAG_VOLUME )
894cdf0e10cSrcweir                 nKindFlags = nKindFlags |
895cdf0e10cSrcweir                      ( ( nType == DRIVE_REMOVABLE ) ? FSYS_KIND_REMOVEABLE : 0 ) |
896cdf0e10cSrcweir                      ( ( nType == DRIVE_FIXED     ) ? FSYS_KIND_FIXED      : 0 ) |
897cdf0e10cSrcweir                      ( ( nType == DRIVE_REMOTE    ) ? FSYS_KIND_REMOTE     : 0 ) |
898cdf0e10cSrcweir                      ( ( nType == DRIVE_RAMDISK   ) ? FSYS_KIND_RAM        : 0 ) |
899cdf0e10cSrcweir                      ( ( nType == DRIVE_CDROM     ) ? FSYS_KIND_CDROM      : 0 ) |
900cdf0e10cSrcweir                      ( ( nType == 0               ) ? FSYS_KIND_UNKNOWN    : 0 );
901cdf0e10cSrcweir 
902cdf0e10cSrcweir             nError = ERRCODE_NONE;
903cdf0e10cSrcweir 
904cdf0e10cSrcweir             return sal_True;
905cdf0e10cSrcweir         }
906cdf0e10cSrcweir 
907cdf0e10cSrcweir         // Statusinformation vom Betriebssystem holen
908cdf0e10cSrcweir         HANDLE h; //()
909cdf0e10cSrcweir         _WIN32_FIND_DATAA aEntry = {};
910cdf0e10cSrcweir         DirEntry aAbsEntry( aDirEntry );
911cdf0e10cSrcweir         if ( bAccess && aAbsEntry.ToAbs() )
912cdf0e10cSrcweir         {
913cdf0e10cSrcweir             // im Namen k"onnen auch ';*?' als normale Zeichen vorkommen
914cdf0e10cSrcweir             ByteString aFilePath( aAbsEntry.GetFull(), osl_getThreadTextEncoding() );
915cdf0e10cSrcweir 
916cdf0e10cSrcweir             // MI: dann gehen Umlaute auf Novell-Servern nicht / wozu ueberhaupt
917cdf0e10cSrcweir             // CharUpperBuff( (char*) aFilePath.GetStr(), aFilePath.Len() );
918cdf0e10cSrcweir             DBG_TRACE1( "FileStat: %s", aFilePath.GetBuffer() );
919cdf0e10cSrcweir             h = aFilePath.Len() < 230
920cdf0e10cSrcweir                     // die Win32-API ist hier sehr schwammig
921cdf0e10cSrcweir                     ? FindFirstFile( (char *) aFilePath.GetBuffer(), &aEntry )//TPF: 2i
922cdf0e10cSrcweir                     : INVALID_HANDLE_VALUE;
923cdf0e10cSrcweir 
924cdf0e10cSrcweir             if ( INVALID_HANDLE_VALUE != h )
925cdf0e10cSrcweir             {
926cdf0e10cSrcweir                 if ( !( aEntry.dwFileAttributes & 0x40 ) ) // com1: etc. e.g. not encrypted (means normal)
927cdf0e10cSrcweir                 {
928cdf0e10cSrcweir                     ByteString  aUpperName = Upper_Impl(ByteString(aAbsEntry.GetName(), osl_getThreadTextEncoding()));
929cdf0e10cSrcweir 
930cdf0e10cSrcweir                     // HRO: #74051# Compare also with short alternate filename
931cdf0e10cSrcweir                     if ( aUpperName != Upper_Impl( aEntry.cFileName ) && aUpperName != Upper_Impl( aEntry.cAlternateFileName ) )
932cdf0e10cSrcweir                         h = INVALID_HANDLE_VALUE;
933cdf0e10cSrcweir                 }
934cdf0e10cSrcweir             }
935cdf0e10cSrcweir 
936cdf0e10cSrcweir             if ( INVALID_HANDLE_VALUE == h )
937cdf0e10cSrcweir             {
938cdf0e10cSrcweir                 DWORD   dwError = GetLastError();
939cdf0e10cSrcweir 
940cdf0e10cSrcweir                 if ( ERROR_BAD_NET_NAME == dwError )
941cdf0e10cSrcweir                 {
942cdf0e10cSrcweir                     nKindFlags = FSYS_KIND_UNKNOWN;
943cdf0e10cSrcweir                     nError = FSYS_ERR_NOTEXISTS;
944cdf0e10cSrcweir                     return sal_False;
945cdf0e10cSrcweir                 }
946cdf0e10cSrcweir 
947cdf0e10cSrcweir                 // UNC-Volume?
948cdf0e10cSrcweir                 DirEntry *pTop = aAbsEntry.ImpGetTopPtr();
949cdf0e10cSrcweir                 if ( pTop->GetFlag() == FSYS_FLAG_ABSROOT &&
950cdf0e10cSrcweir                      ( pTop->aName.Len() > 1 && (pTop->aName.GetBuffer()[1] != ':' )) )
951cdf0e10cSrcweir                 {
952cdf0e10cSrcweir                     if ( bForceAccess )
953cdf0e10cSrcweir                     {
954cdf0e10cSrcweir                         if ( Exists_Impl( aFilePath ) )
955cdf0e10cSrcweir                     {
956cdf0e10cSrcweir                         nKindFlags = FSYS_KIND_DIR|FSYS_KIND_REMOTE;
957cdf0e10cSrcweir                         nError = FSYS_ERR_OK;
958cdf0e10cSrcweir                         return sal_True;
959cdf0e10cSrcweir                     }
960cdf0e10cSrcweir                     else
961cdf0e10cSrcweir                     {
962cdf0e10cSrcweir                         nKindFlags = FSYS_KIND_UNKNOWN;
963cdf0e10cSrcweir                         nError = FSYS_ERR_NOTEXISTS;
964cdf0e10cSrcweir                         return sal_False;
965cdf0e10cSrcweir                     }
966cdf0e10cSrcweir                     }
967cdf0e10cSrcweir                 }
968cdf0e10cSrcweir             }
969cdf0e10cSrcweir         }
970cdf0e10cSrcweir         else
971cdf0e10cSrcweir             h = INVALID_HANDLE_VALUE;
972cdf0e10cSrcweir 
973cdf0e10cSrcweir         if ( h == INVALID_HANDLE_VALUE )
974cdf0e10cSrcweir         {
975cdf0e10cSrcweir             // Sonderbehandlung falls es sich um eine Wildcard handelt
976cdf0e10cSrcweir             ByteString aTempName( aDirEntry.GetName(), osl_getThreadTextEncoding() );
977cdf0e10cSrcweir             if ( strchr( aTempName.GetBuffer(), '?' ) ||
978cdf0e10cSrcweir                  strchr( aTempName.GetBuffer(), '*' ) ||
979cdf0e10cSrcweir                  strchr( aTempName.GetBuffer(), ';' ) )
980cdf0e10cSrcweir             {
981cdf0e10cSrcweir                 nKindFlags = FSYS_KIND_WILD;
982cdf0e10cSrcweir                 nError = FSYS_ERR_OK;
983cdf0e10cSrcweir                 return sal_True;
984cdf0e10cSrcweir             }
985cdf0e10cSrcweir 
986cdf0e10cSrcweir             if ( bAccess )
987cdf0e10cSrcweir             {
988cdf0e10cSrcweir                 nError = FSYS_ERR_NOTEXISTS;
989cdf0e10cSrcweir                 nKindFlags = FSYS_KIND_UNKNOWN;
990cdf0e10cSrcweir             }
991cdf0e10cSrcweir             else
992cdf0e10cSrcweir                 nKindFlags = FSYS_KIND_REMOVEABLE;
993cdf0e10cSrcweir         }
994cdf0e10cSrcweir         else
995cdf0e10cSrcweir         {
996cdf0e10cSrcweir             ImpInit( &aEntry );
997cdf0e10cSrcweir             FindClose( h );
998cdf0e10cSrcweir         }
999cdf0e10cSrcweir 
1000cdf0e10cSrcweir         if ( 0 != nError )
1001cdf0e10cSrcweir             nKindFlags = 0;
1002cdf0e10cSrcweir 
1003cdf0e10cSrcweir         return 0 == nError;
1004cdf0e10cSrcweir 
1005cdf0e10cSrcweir }
1006cdf0e10cSrcweir 
IsRedirectable_Impl(const ByteString & rPath)1007cdf0e10cSrcweir sal_Bool IsRedirectable_Impl( const ByteString &rPath )
1008cdf0e10cSrcweir {
1009cdf0e10cSrcweir     if ( rPath.Len() >= 3 && ':' == rPath.GetBuffer()[1] )
1010cdf0e10cSrcweir     {
1011cdf0e10cSrcweir         ByteString aVolume = rPath.Copy( 0, 3 );
1012cdf0e10cSrcweir         UINT nType = GetDriveType( (char *) aVolume.GetBuffer() );
1013cdf0e10cSrcweir         SetLastError( ERROR_SUCCESS );
1014cdf0e10cSrcweir         return DRIVE_FIXED != nType;
1015cdf0e10cSrcweir     }
1016cdf0e10cSrcweir     return sal_False;
1017cdf0e10cSrcweir }
1018cdf0e10cSrcweir 
1019cdf0e10cSrcweir /*************************************************************************
1020cdf0e10cSrcweir |*
1021cdf0e10cSrcweir |*    TempDirImpl()
1022cdf0e10cSrcweir |*
1023cdf0e10cSrcweir |*    Beschreibung      liefert den Namens des Directories fuer temporaere
1024cdf0e10cSrcweir |*                      Dateien
1025cdf0e10cSrcweir |*    Ersterstellung    MI 16.03.94
1026cdf0e10cSrcweir |*    Letzte Aenderung  MI 16.03.94
1027cdf0e10cSrcweir |*
1028cdf0e10cSrcweir *************************************************************************/
1029cdf0e10cSrcweir 
TempDirImpl(char * pBuf)1030cdf0e10cSrcweir const char* TempDirImpl( char *pBuf )
1031cdf0e10cSrcweir {
1032cdf0e10cSrcweir     if ( !GetTempPath( MAX_PATH, pBuf ) &&
1033cdf0e10cSrcweir         !GetWindowsDirectory( pBuf, MAX_PATH ) &&
1034cdf0e10cSrcweir         !GetEnvironmentVariable( "HOMEPATH", pBuf, MAX_PATH ) )
1035cdf0e10cSrcweir         return 0;
1036cdf0e10cSrcweir 
1037cdf0e10cSrcweir     return pBuf;
1038cdf0e10cSrcweir }
1039cdf0e10cSrcweir 
1040cdf0e10cSrcweir //=======================================================================
1041cdf0e10cSrcweir 
QueryDiskSpace(const String & rPath,BigInt & rFreeBytes,BigInt & rTotalBytes)1042cdf0e10cSrcweir ErrCode FileStat::QueryDiskSpace( const String &rPath,
1043cdf0e10cSrcweir                                   BigInt &rFreeBytes, BigInt &rTotalBytes )
1044cdf0e10cSrcweir {
1045cdf0e10cSrcweir     DWORD nSectorsPerCluster;   /* address of sectors per cluster   */
1046cdf0e10cSrcweir     DWORD nBytesPerSector;      /* address of bytes per sector  */
1047cdf0e10cSrcweir     DWORD nFreeClusters;        /* address of number of free clusters   */
1048cdf0e10cSrcweir     DWORD nClusters;            /* address of total number of clusters  */
1049cdf0e10cSrcweir 
1050cdf0e10cSrcweir     ByteString aVol( DirEntry(rPath).ImpGetTopPtr()->GetName(), osl_getThreadTextEncoding());
1051cdf0e10cSrcweir     bool bOK = GetDiskFreeSpace( aVol.GetBuffer(),
1052cdf0e10cSrcweir                         &nSectorsPerCluster, &nBytesPerSector,
1053cdf0e10cSrcweir                         &nFreeClusters, &nClusters );
1054cdf0e10cSrcweir     if ( !bOK )
1055cdf0e10cSrcweir         return Sys2SolarError_Impl( GetLastError() );
1056cdf0e10cSrcweir 
1057cdf0e10cSrcweir     BigInt aBytesPerCluster( BigInt(nSectorsPerCluster) *
1058cdf0e10cSrcweir                              BigInt(nBytesPerSector) );
1059cdf0e10cSrcweir     rFreeBytes = aBytesPerCluster * BigInt(nFreeClusters);
1060cdf0e10cSrcweir     rTotalBytes = aBytesPerCluster * BigInt(nClusters);
1061cdf0e10cSrcweir     return 0;
1062cdf0e10cSrcweir }
1063cdf0e10cSrcweir 
1064cdf0e10cSrcweir //=========================================================================
1065cdf0e10cSrcweir 
FSysEnableSysErrorBox(sal_Bool bEnable)1066cdf0e10cSrcweir void FSysEnableSysErrorBox( sal_Bool bEnable )
1067cdf0e10cSrcweir {   // Preserve other Bits!!
1068cdf0e10cSrcweir     sal_uInt32 nErrorMode = SetErrorMode( bEnable ? 0 : SEM_FAILCRITICALERRORS|SEM_NOOPENFILEERRORBOX );
1069cdf0e10cSrcweir     if ( bEnable )
1070cdf0e10cSrcweir         nErrorMode &= ~(SEM_FAILCRITICALERRORS|SEM_NOOPENFILEERRORBOX);
1071cdf0e10cSrcweir     else
1072cdf0e10cSrcweir         nErrorMode |= (SEM_FAILCRITICALERRORS|SEM_NOOPENFILEERRORBOX);
1073cdf0e10cSrcweir     SetErrorMode( nErrorMode );
1074cdf0e10cSrcweir }
1075cdf0e10cSrcweir 
1076cdf0e10cSrcweir 
1077cdf0e10cSrcweir 
1078