xref: /AOO41X/main/tools/source/stream/strmwnt.cxx (revision 89b56da77b74925c286b3e777681ba8dda16bf41)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // no include "precompiled_tools.hxx" because this file is included in strmsys.cxx
25 
26 /*
27     Todo: StreamMode <-> AllocateMemory
28 */
29 
30 #include <string.h>
31 #include <limits.h>
32 
33 #include <tools/svwin.h>
34 
35 #include <tools/debug.hxx>
36 #include <tools/fsys.hxx>
37 #include <tools/stream.hxx>
38 
39 // class FileBase
40 #include <osl/file.hxx>
41 using namespace osl;
42 
43 // -----------------------------------------------------------------------
44 
45 // --------------
46 // - StreamData -
47 // --------------
48 
49 class StreamData
50 {
51 public:
52     HANDLE      hFile;
53 
StreamData()54                 StreamData()
55                 {
56                     hFile = 0;
57                 }
58 };
59 
60 // -----------------------------------------------------------------------
61 
GetSvError(DWORD nWntError)62 static sal_uIntPtr GetSvError( DWORD nWntError )
63 {
64     static struct { DWORD wnt; sal_uIntPtr sv; } errArr[] =
65     {
66         { ERROR_SUCCESS,                SVSTREAM_OK },
67         { ERROR_ACCESS_DENIED,          SVSTREAM_ACCESS_DENIED },
68         { ERROR_ACCOUNT_DISABLED,       SVSTREAM_ACCESS_DENIED },
69         { ERROR_ACCOUNT_EXPIRED,        SVSTREAM_ACCESS_DENIED },
70         { ERROR_ACCOUNT_RESTRICTION,    SVSTREAM_ACCESS_DENIED },
71         { ERROR_ATOMIC_LOCKS_NOT_SUPPORTED, SVSTREAM_INVALID_PARAMETER },
72         { ERROR_BAD_PATHNAME,           SVSTREAM_PATH_NOT_FOUND },
73         // Filename too long
74         { ERROR_BUFFER_OVERFLOW,        SVSTREAM_INVALID_PARAMETER },
75         { ERROR_DIRECTORY,              SVSTREAM_INVALID_PARAMETER },
76         { ERROR_DRIVE_LOCKED,           SVSTREAM_LOCKING_VIOLATION },
77         { ERROR_FILE_NOT_FOUND,         SVSTREAM_FILE_NOT_FOUND },
78         { ERROR_FILENAME_EXCED_RANGE,   SVSTREAM_INVALID_PARAMETER },
79         { ERROR_INVALID_ACCESS,         SVSTREAM_INVALID_ACCESS },
80         { ERROR_INVALID_DRIVE,          SVSTREAM_PATH_NOT_FOUND },
81         { ERROR_INVALID_HANDLE,         SVSTREAM_INVALID_HANDLE },
82         { ERROR_INVALID_NAME,           SVSTREAM_PATH_NOT_FOUND },
83         { ERROR_INVALID_PARAMETER,      SVSTREAM_INVALID_PARAMETER },
84         { ERROR_IS_SUBST_PATH,          SVSTREAM_INVALID_PARAMETER },
85         { ERROR_IS_SUBST_TARGET,        SVSTREAM_INVALID_PARAMETER },
86         { ERROR_LOCK_FAILED,            SVSTREAM_LOCKING_VIOLATION },
87         { ERROR_LOCK_VIOLATION,         SVSTREAM_LOCKING_VIOLATION },
88         { ERROR_NEGATIVE_SEEK,          SVSTREAM_SEEK_ERROR },
89         { ERROR_PATH_NOT_FOUND,         SVSTREAM_PATH_NOT_FOUND },
90         { ERROR_READ_FAULT,             SVSTREAM_READ_ERROR },
91         { ERROR_SEEK,                   SVSTREAM_SEEK_ERROR },
92         { ERROR_SEEK_ON_DEVICE,         SVSTREAM_SEEK_ERROR },
93         { ERROR_SHARING_BUFFER_EXCEEDED,SVSTREAM_SHARE_BUFF_EXCEEDED },
94         { ERROR_SHARING_PAUSED,         SVSTREAM_SHARING_VIOLATION },
95         { ERROR_SHARING_VIOLATION,      SVSTREAM_SHARING_VIOLATION },
96         { ERROR_TOO_MANY_OPEN_FILES,    SVSTREAM_TOO_MANY_OPEN_FILES },
97         { ERROR_WRITE_FAULT,            SVSTREAM_WRITE_ERROR },
98         { ERROR_WRITE_PROTECT,          SVSTREAM_ACCESS_DENIED },
99         { ERROR_DISK_FULL,              SVSTREAM_DISK_FULL },
100 
101         { (DWORD)0xFFFFFFFF, SVSTREAM_GENERALERROR }
102     };
103 
104     sal_uIntPtr nRetVal = SVSTREAM_GENERALERROR;    // Standardfehler
105     int i=0;
106     do
107     {
108         if( errArr[i].wnt == nWntError )
109         {
110             nRetVal = errArr[i].sv;
111             break;
112         }
113         i++;
114     } while( errArr[i].wnt != (DWORD)0xFFFFFFFF );
115     return nRetVal;
116 }
117 
118 /*************************************************************************
119 |*
120 |*    SvFileStream::SvFileStream()
121 |*
122 |*    Beschreibung      STREAM.SDW
123 |*    Ersterstellung    OV 17.06.94
124 |*    Letzte Aenderung  TPF 15.07.98
125 |*
126 *************************************************************************/
127 
SvFileStream(const String & rFileName,StreamMode nMode)128 SvFileStream::SvFileStream( const String& rFileName, StreamMode nMode )
129 {
130     bIsOpen             = sal_False;
131     nLockCounter        = 0;
132     bIsWritable         = sal_False;
133     pInstanceData       = new StreamData;
134 
135     SetBufferSize( 8192 );
136     // convert URL to SystemPath, if necessary
137     ::rtl::OUString aFileName, aNormPath;
138 
139     if ( FileBase::getSystemPathFromFileURL( rFileName, aFileName ) != FileBase::E_None )
140         aFileName = rFileName;
141     Open( aFileName, nMode );
142 }
143 
144 /*************************************************************************
145 |*
146 |*    SvFileStream::SvFileStream()
147 |*
148 |*    Beschreibung      STREAM.SDW
149 |*    Ersterstellung    OV 22.11.94
150 |*    Letzte Aenderung  TPF 15.07.98
151 |*
152 *************************************************************************/
153 
SvFileStream()154 SvFileStream::SvFileStream()
155 {
156     bIsOpen             = sal_False;
157     nLockCounter        = 0;
158     bIsWritable         = sal_False;
159     pInstanceData       = new StreamData;
160 
161     SetBufferSize( 8192 );
162 }
163 
164 /*************************************************************************
165 |*
166 |*    SvFileStream::~SvFileStream()
167 |*
168 |*    Beschreibung      STREAM.SDW
169 |*    Ersterstellung    OV 14.06.94
170 |*    Letzte Aenderung  OV 14.06.94
171 |*
172 *************************************************************************/
173 
~SvFileStream()174 SvFileStream::~SvFileStream()
175 {
176     Close();
177     if (pInstanceData)
178         delete pInstanceData;
179 }
180 
181 /*************************************************************************
182 |*
183 |*    SvFileStream::GetFileHandle()
184 |*
185 |*    Beschreibung      STREAM.SDW
186 |*    Ersterstellung    OV 14.06.94
187 |*    Letzte Aenderung  OV 14.06.94
188 |*
189 *************************************************************************/
190 
GetFileHandle() const191 sal_uIntPtr SvFileStream::GetFileHandle() const
192 {
193     return (sal_uIntPtr)pInstanceData->hFile;
194 }
195 
196 /*************************************************************************
197 |*
198 |*    SvFileStream::IsA()
199 |*
200 |*    Beschreibung      STREAM.SDW
201 |*    Ersterstellung    OV 14.06.94
202 |*    Letzte Aenderung  OV 14.06.94
203 |*
204 *************************************************************************/
205 
IsA() const206 sal_uInt16 SvFileStream::IsA() const
207 {
208     return ID_FILESTREAM;
209 }
210 
211 /*************************************************************************
212 |*
213 |*    SvFileStream::GetData()
214 |*
215 |*    Beschreibung      STREAM.SDW, Prueft nicht Eof; IsEof danach rufbar
216 |*    Ersterstellung    OV 15.06.94
217 |*    Letzte Aenderung  TPF 15.07.98
218 |*
219 *************************************************************************/
220 
GetData(void * pData,sal_uIntPtr nSize)221 sal_uIntPtr SvFileStream::GetData( void* pData, sal_uIntPtr nSize )
222 {
223     DWORD nCount = 0;
224     if( IsOpen() )
225     {
226         bool bResult = ReadFile(pInstanceData->hFile,(LPVOID)pData,nSize,&nCount,NULL);
227         if( !bResult )
228         {
229             sal_uIntPtr nTestError = GetLastError();
230             SetError(::GetSvError( nTestError ) );
231         }
232     }
233     return (DWORD)nCount;
234 }
235 
236 /*************************************************************************
237 |*
238 |*    SvFileStream::PutData()
239 |*
240 |*    Beschreibung      STREAM.SDW
241 |*    Ersterstellung    OV 15.06.94
242 |*    Letzte Aenderung  TPF 15.07.98
243 |*
244 *************************************************************************/
245 
PutData(const void * pData,sal_uIntPtr nSize)246 sal_uIntPtr SvFileStream::PutData( const void* pData, sal_uIntPtr nSize )
247 {
248     DWORD nCount = 0;
249     if( IsOpen() )
250     {
251         if(!WriteFile(pInstanceData->hFile,(LPVOID)pData,nSize,&nCount,NULL))
252             SetError(::GetSvError( GetLastError() ) );
253     }
254     return nCount;
255 }
256 
257 /*************************************************************************
258 |*
259 |*    SvFileStream::SeekPos()
260 |*
261 |*    Beschreibung      STREAM.SDW
262 |*    Ersterstellung    OV 15.06.94
263 |*    Letzte Aenderung  TPF 15.07.98
264 |*
265 *************************************************************************/
266 
SeekPos(sal_uIntPtr nPos)267 sal_uIntPtr SvFileStream::SeekPos( sal_uIntPtr nPos )
268 {
269     DWORD nNewPos = 0;
270     if( IsOpen() )
271     {
272         if( nPos != STREAM_SEEK_TO_END )
273             // 64-Bit files werden nicht unterstuetzt
274             nNewPos=SetFilePointer(pInstanceData->hFile,nPos,NULL,FILE_BEGIN);
275         else
276             nNewPos=SetFilePointer(pInstanceData->hFile,0L,NULL,FILE_END);
277 
278         if( nNewPos == 0xFFFFFFFF )
279         {
280             SetError(::GetSvError( GetLastError() ) );
281             nNewPos = 0L;
282         }
283     }
284     else
285         SetError( SVSTREAM_GENERALERROR );
286     return (sal_uIntPtr)nNewPos;
287 }
288 
289 /*************************************************************************
290 |*
291 |*    SvFileStream::Tell()
292 |*
293 |*    Beschreibung      STREAM.SDW
294 |*    Ersterstellung    OV 15.06.94
295 |*    Letzte Aenderung  OV 15.06.94
296 |*
297 *************************************************************************/
298 /*
299 sal_uIntPtr SvFileStream::Tell()
300 {
301     sal_uIntPtr nPos = 0L;
302 
303     if( IsOpen() )
304     {
305         DWORD nPos;
306         nPos = SetFilePointer(pInstanceData->hFile,0L,NULL,FILE_CURRENT);
307         if( nPos = 0xFFFFFFFF )
308         {
309             SetError( ::GetSvError( GetLastError() ) );
310             nPos = 0L;
311         }
312     }
313     return nPos;
314 }
315 */
316 
317 /*************************************************************************
318 |*
319 |*    SvFileStream::FlushData()
320 |*
321 |*    Beschreibung      STREAM.SDW
322 |*    Ersterstellung    OV 15.06.94
323 |*    Letzte Aenderung  TPF 15.07.98
324 |*
325 *************************************************************************/
326 
FlushData()327 void SvFileStream::FlushData()
328 {
329     if( IsOpen() )
330     {
331         if( !FlushFileBuffers(pInstanceData->hFile) )
332             SetError(::GetSvError(GetLastError()));
333     }
334 }
335 
336 /*************************************************************************
337 |*
338 |*    SvFileStream::LockRange()
339 |*
340 |*    Beschreibung      STREAM.SDW
341 |*    Ersterstellung    OV 15.06.94
342 |*    Letzte Aenderung  TPF 15.07.98
343 |*
344 *************************************************************************/
345 
LockRange(sal_uIntPtr nByteOffset,sal_uIntPtr nBytes)346 sal_Bool SvFileStream::LockRange( sal_uIntPtr nByteOffset, sal_uIntPtr nBytes )
347 {
348     bool bRetVal = false;
349     if( IsOpen() )
350     {
351         bRetVal = ::LockFile(pInstanceData->hFile,nByteOffset,0L,nBytes,0L );
352         if( !bRetVal )
353             SetError(::GetSvError(GetLastError()));
354     }
355     return bRetVal;
356 }
357 
358 /*************************************************************************
359 |*
360 |*    SvFileStream::UnlockRange()
361 |*
362 |*    Beschreibung      STREAM.SDW
363 |*    Ersterstellung    OV 15.06.94
364 |*    Letzte Aenderung  TPF 15.07.98
365 |*
366 *************************************************************************/
367 
UnlockRange(sal_uIntPtr nByteOffset,sal_uIntPtr nBytes)368 sal_Bool SvFileStream::UnlockRange( sal_uIntPtr nByteOffset, sal_uIntPtr nBytes )
369 {
370     bool bRetVal = false;
371     if( IsOpen() )
372     {
373         bRetVal = ::UnlockFile(pInstanceData->hFile,nByteOffset,0L,nBytes,0L );
374         if( !bRetVal )
375             SetError(::GetSvError(GetLastError()));
376     }
377     return bRetVal;
378 }
379 
380 /*************************************************************************
381 |*
382 |*    SvFileStream::LockFile()
383 |*
384 |*    Beschreibung      STREAM.SDW
385 |*    Ersterstellung    OV 15.06.94
386 |*    Letzte Aenderung  OV 15.06.94
387 |*
388 *************************************************************************/
389 
LockFile()390 sal_Bool SvFileStream::LockFile()
391 {
392     sal_Bool bRetVal = sal_False;
393     if( !nLockCounter )
394     {
395         if( LockRange( 0L, LONG_MAX ) )
396         {
397             nLockCounter = 1;
398             bRetVal = sal_True;
399         }
400     }
401     else
402     {
403         nLockCounter++;
404         bRetVal = sal_True;
405     }
406     return bRetVal;
407 }
408 
409 /*************************************************************************
410 |*
411 |*    SvFileStream::UnlockFile()
412 |*
413 |*    Beschreibung      STREAM.SDW
414 |*    Ersterstellung    OV 15.06.94
415 |*    Letzte Aenderung  OV 15.06.94
416 |*
417 *************************************************************************/
418 
UnlockFile()419 sal_Bool SvFileStream::UnlockFile()
420 {
421     sal_Bool bRetVal = sal_False;
422     if( nLockCounter > 0)
423     {
424         if( nLockCounter == 1)
425         {
426             if( UnlockRange( 0L, LONG_MAX ) )
427             {
428                 nLockCounter = 0;
429                 bRetVal = sal_True;
430             }
431         }
432         else
433         {
434             nLockCounter--;
435             bRetVal = sal_True;
436         }
437     }
438     return bRetVal;
439 }
440 
441 
442 /*************************************************************************
443 |*
444 |*    SvFileStream::Open()
445 |*
446 |*    Beschreibung      STREAM.SDW
447 |*    Ersterstellung    OV 15.06.94
448 |*    Letzte Aenderung  TPF 15.07.98
449 |*
450 *************************************************************************/
451 /*
452       NOCREATE       TRUNC   NT-Action
453       ----------------------------------------------
454          0 (Create)    0     OPEN_ALWAYS
455          0 (Create)    1     CREATE_ALWAYS
456          1             0     OPEN_EXISTING
457          1             1     TRUNCATE_EXISTING
458 */
459 
Open(const String & rFilename,StreamMode nMode)460 void SvFileStream::Open( const String& rFilename, StreamMode nMode )
461 {
462     String aParsedFilename(rFilename);
463 
464     SetLastError( ERROR_SUCCESS );
465     Close();
466     SvStream::ClearBuffer();
467 
468     eStreamMode = nMode;
469     eStreamMode &= ~STREAM_TRUNC; // beim ReOpen nicht cutten
470 
471     //    !!! NoOp: Ansonsten ToAbs() verwendern
472     //    !!! DirEntry aDirEntry( rFilename );
473     //    !!! aFilename = aDirEntry.GetFull();
474     aFilename = aParsedFilename;
475 #ifdef BOOTSTRAP
476     ByteString aFileNameA( aFilename, gsl_getSystemTextEncoding());
477 #else
478     ByteString aFileNameA( aFilename, osl_getThreadTextEncoding());
479     FSysRedirector::DoRedirect( aFilename );
480 #endif
481     SetLastError( ERROR_SUCCESS );  // ggf. durch Redirector geaendert!
482 
483     /*
484     #ifdef DBG_UTIL
485     String aTraceStr( "SvFileStream::Open(): " );
486     aTraceStr += aFilename;
487     DBG_TRACE( aTraceStr );
488     #endif
489     */
490 
491     DWORD   nOpenAction;
492     DWORD   nShareMode      = FILE_SHARE_READ | FILE_SHARE_WRITE;
493     DWORD   nAccessMode     = 0L;
494     UINT    nOldErrorMode = SetErrorMode( SEM_FAILCRITICALERRORS|SEM_NOOPENFILEERRORBOX );
495 
496     if( nMode & STREAM_SHARE_DENYREAD)
497         nShareMode &= ~FILE_SHARE_READ;
498 
499     if( nMode & STREAM_SHARE_DENYWRITE)
500         nShareMode &= ~FILE_SHARE_WRITE;
501 
502     if( nMode & STREAM_SHARE_DENYALL)
503         nShareMode = 0;
504 
505     if( (nMode & STREAM_READ) )
506         nAccessMode |= GENERIC_READ;
507     if( (nMode & STREAM_WRITE) )
508         nAccessMode |= GENERIC_WRITE;
509 
510     if( nAccessMode == GENERIC_READ )       // ReadOnly ?
511         nMode |= STREAM_NOCREATE;   // wenn ja, nicht erzeugen
512 
513     // Zuordnung siehe obige Wahrheitstafel
514     if( !(nMode & STREAM_NOCREATE) )
515     {
516         if( nMode & STREAM_TRUNC )
517             nOpenAction = CREATE_ALWAYS;
518         else
519             nOpenAction = OPEN_ALWAYS;
520     }
521     else
522     {
523         if( nMode & STREAM_TRUNC )
524             nOpenAction = TRUNCATE_EXISTING;
525         else
526             nOpenAction = OPEN_EXISTING;
527     }
528 
529     pInstanceData->hFile = CreateFile(
530         aFileNameA.GetBuffer(),
531         nAccessMode,
532         nShareMode,
533         (LPSECURITY_ATTRIBUTES)NULL,
534         nOpenAction,
535         FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS,
536         (HANDLE) NULL
537     );
538 
539     if(  pInstanceData->hFile!=INVALID_HANDLE_VALUE && (
540         // Hat Create Always eine existierende Datei ueberschrieben ?
541         GetLastError() == ERROR_ALREADY_EXISTS ||
542         // Hat Open Always eine neue Datei angelegt ?
543         GetLastError() == ERROR_FILE_NOT_FOUND  ))
544     {
545         // wenn ja, dann alles OK
546         if( nOpenAction == OPEN_ALWAYS || nOpenAction == CREATE_ALWAYS )
547             SetLastError( ERROR_SUCCESS );
548     }
549 
550     // Bei Fehler pruefen, ob wir lesen duerfen
551     if( (pInstanceData->hFile==INVALID_HANDLE_VALUE) &&
552          (nAccessMode & GENERIC_WRITE))
553     {
554         sal_uIntPtr nErr = ::GetSvError( GetLastError() );
555         if(nErr==SVSTREAM_ACCESS_DENIED || nErr==SVSTREAM_SHARING_VIOLATION)
556         {
557             nMode &= (~STREAM_WRITE);
558             nAccessMode = GENERIC_READ;
559             // OV, 28.1.97: Win32 setzt die Datei auf 0-Laenge, wenn
560             // die Openaction CREATE_ALWAYS ist!!!!
561             nOpenAction = OPEN_EXISTING;
562             SetLastError( ERROR_SUCCESS );
563             pInstanceData->hFile = CreateFile(
564                 aFileNameA.GetBuffer(),
565                 GENERIC_READ,
566                 nShareMode,
567                 (LPSECURITY_ATTRIBUTES)NULL,
568                 nOpenAction,
569                 FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS,
570                 (HANDLE) NULL
571             );
572             if( GetLastError() == ERROR_ALREADY_EXISTS )
573                 SetLastError( ERROR_SUCCESS );
574         }
575     }
576 
577     if( GetLastError() != ERROR_SUCCESS )
578     {
579         bIsOpen = sal_False;
580         SetError(::GetSvError( GetLastError() ) );
581     }
582     else
583     {
584         bIsOpen     = sal_True;
585         // pInstanceData->bIsEof = sal_False;
586         if( nAccessMode & GENERIC_WRITE )
587             bIsWritable = sal_True;
588     }
589     SetErrorMode( nOldErrorMode );
590 }
591 
592 /*************************************************************************
593 |*
594 |*    SvFileStream::ReOpen()
595 |*
596 |*    Beschreibung      STREAM.SDW
597 |*    Ersterstellung    OV 15.06.94
598 |*    Letzte Aenderung  OV 15.06.94
599 |*
600 *************************************************************************/
601 
ReOpen()602 void SvFileStream::ReOpen()
603 {
604     if( !bIsOpen && aFilename.Len() )
605         Open( aFilename, eStreamMode );
606 }
607 
608 /*************************************************************************
609 |*
610 |*    SvFileStream::Close()
611 |*
612 |*    Beschreibung      STREAM.SDW
613 |*    Ersterstellung    OV 15.06.94
614 |*    Letzte Aenderung  TPF 15.07.98
615 |*
616 *************************************************************************/
617 
Close()618 void SvFileStream::Close()
619 {
620     if( IsOpen() )
621     {
622         if( nLockCounter )
623         {
624             nLockCounter = 1;
625             UnlockFile();
626         }
627         Flush();
628         CloseHandle( pInstanceData->hFile );
629     }
630     bIsOpen     = sal_False;
631     nLockCounter= 0;
632     bIsWritable = sal_False;
633     SvStream::ClearBuffer();
634     SvStream::ClearError();
635 }
636 
637 /*************************************************************************
638 |*
639 |*    SvFileStream::ResetError()
640 |*
641 |*    Beschreibung      STREAM.SDW; Setzt Filepointer auf Dateianfang
642 |*    Ersterstellung    OV 15.06.94
643 |*    Letzte Aenderung  OV 15.06.94
644 |*
645 *************************************************************************/
646 
ResetError()647 void SvFileStream::ResetError()
648 {
649     SvStream::ClearError();
650 }
651 
652 /*************************************************************************
653 |*
654 |*    SvFileStream::SetSize()
655 |*
656 |*    Beschreibung      STREAM.SDW
657 |*    Ersterstellung    OV 19.10.95
658 |*    Letzte Aenderung  TPF 15.07.98
659 |*
660 *************************************************************************/
661 
SetSize(sal_uIntPtr nSize)662 void SvFileStream::SetSize( sal_uIntPtr nSize )
663 {
664 
665     if( IsOpen() )
666     {
667         int bError = sal_False;
668         HANDLE hFile = pInstanceData->hFile;
669         sal_uIntPtr nOld = SetFilePointer( hFile, 0L, NULL, FILE_CURRENT );
670         if( nOld != 0xffffffff )
671         {
672             if( SetFilePointer(hFile,nSize,NULL,FILE_BEGIN ) != 0xffffffff)
673             {
674                 bool bSucc = SetEndOfFile( hFile );
675                 if( !bSucc )
676                     bError = sal_True;
677             }
678             if( SetFilePointer( hFile,nOld,NULL,FILE_BEGIN ) == 0xffffffff)
679                 bError = sal_True;
680         }
681         if( bError )
682             SetError(::GetSvError( GetLastError() ) );
683     }
684 }
685 
686