1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_tools.hxx" 30*cdf0e10cSrcweir 31*cdf0e10cSrcweir #if defined WNT 32*cdf0e10cSrcweir #ifndef _SVWIN_H 33*cdf0e10cSrcweir #include <io.h> 34*cdf0e10cSrcweir #include <tools/svwin.h> 35*cdf0e10cSrcweir #endif 36*cdf0e10cSrcweir 37*cdf0e10cSrcweir #elif defined(OS2) 38*cdf0e10cSrcweir #include <sys/types.h> 39*cdf0e10cSrcweir #include <sys/stat.h> 40*cdf0e10cSrcweir #include <fcntl.h> 41*cdf0e10cSrcweir #include <share.h> 42*cdf0e10cSrcweir #include <io.h> 43*cdf0e10cSrcweir 44*cdf0e10cSrcweir #elif defined UNX 45*cdf0e10cSrcweir #include <fcntl.h> 46*cdf0e10cSrcweir #include <unistd.h> 47*cdf0e10cSrcweir #include <sys/stat.h> 48*cdf0e10cSrcweir 49*cdf0e10cSrcweir #endif 50*cdf0e10cSrcweir 51*cdf0e10cSrcweir #include <ctype.h> 52*cdf0e10cSrcweir #include <errno.h> 53*cdf0e10cSrcweir #include <stdlib.h> 54*cdf0e10cSrcweir #include <string.h> 55*cdf0e10cSrcweir 56*cdf0e10cSrcweir #include <stdio.h> 57*cdf0e10cSrcweir #include "comdep.hxx" 58*cdf0e10cSrcweir #include <tools/fsys.hxx> 59*cdf0e10cSrcweir #include <tools/stream.hxx> 60*cdf0e10cSrcweir #include <osl/file.hxx> 61*cdf0e10cSrcweir 62*cdf0e10cSrcweir using namespace ::osl; 63*cdf0e10cSrcweir 64*cdf0e10cSrcweir /************************************************************************* 65*cdf0e10cSrcweir |* 66*cdf0e10cSrcweir |* FileCopier::FileCopier() 67*cdf0e10cSrcweir |* 68*cdf0e10cSrcweir |* Beschreibung FSYS.SDW 69*cdf0e10cSrcweir |* Ersterstellung MI 13.04.94 70*cdf0e10cSrcweir |* Letzte Aenderung MI 13.04.94 71*cdf0e10cSrcweir |* 72*cdf0e10cSrcweir *************************************************************************/ 73*cdf0e10cSrcweir 74*cdf0e10cSrcweir FileCopier::FileCopier() : 75*cdf0e10cSrcweir 76*cdf0e10cSrcweir nBytesTotal ( 0 ), 77*cdf0e10cSrcweir nBytesCopied( 0 ), 78*cdf0e10cSrcweir nBlockSize ( 4096 ), 79*cdf0e10cSrcweir pImp ( new FileCopier_Impl ) 80*cdf0e10cSrcweir 81*cdf0e10cSrcweir { 82*cdf0e10cSrcweir } 83*cdf0e10cSrcweir 84*cdf0e10cSrcweir // ----------------------------------------------------------------------- 85*cdf0e10cSrcweir 86*cdf0e10cSrcweir FileCopier::FileCopier( const DirEntry& rSource, const DirEntry& rTarget ) : 87*cdf0e10cSrcweir 88*cdf0e10cSrcweir aSource ( rSource ), 89*cdf0e10cSrcweir aTarget ( rTarget ), 90*cdf0e10cSrcweir nBytesTotal ( 0 ), 91*cdf0e10cSrcweir nBytesCopied( 0 ), 92*cdf0e10cSrcweir nBlockSize ( 4096 ), 93*cdf0e10cSrcweir pImp ( new FileCopier_Impl ) 94*cdf0e10cSrcweir 95*cdf0e10cSrcweir { 96*cdf0e10cSrcweir } 97*cdf0e10cSrcweir 98*cdf0e10cSrcweir // ----------------------------------------------------------------------- 99*cdf0e10cSrcweir 100*cdf0e10cSrcweir FileCopier::FileCopier( const FileCopier& rCopier ) : 101*cdf0e10cSrcweir 102*cdf0e10cSrcweir aSource ( rCopier.aSource ), 103*cdf0e10cSrcweir aTarget ( rCopier.aTarget ), 104*cdf0e10cSrcweir nBytesTotal ( 0 ), 105*cdf0e10cSrcweir nBytesCopied ( 0 ), 106*cdf0e10cSrcweir aProgressLink ( rCopier.aProgressLink ), 107*cdf0e10cSrcweir nBlockSize ( 4096 ), 108*cdf0e10cSrcweir pImp ( new FileCopier_Impl ) 109*cdf0e10cSrcweir 110*cdf0e10cSrcweir { 111*cdf0e10cSrcweir } 112*cdf0e10cSrcweir 113*cdf0e10cSrcweir /************************************************************************* 114*cdf0e10cSrcweir |* 115*cdf0e10cSrcweir |* FileCopier::~FileCopier() 116*cdf0e10cSrcweir |* 117*cdf0e10cSrcweir |* Beschreibung FSYS.SDW 118*cdf0e10cSrcweir |* Ersterstellung MI 13.04.94 119*cdf0e10cSrcweir |* Letzte Aenderung MI 13.04.94 120*cdf0e10cSrcweir |* 121*cdf0e10cSrcweir *************************************************************************/ 122*cdf0e10cSrcweir 123*cdf0e10cSrcweir FileCopier::~FileCopier() 124*cdf0e10cSrcweir { 125*cdf0e10cSrcweir delete pImp; 126*cdf0e10cSrcweir } 127*cdf0e10cSrcweir 128*cdf0e10cSrcweir /************************************************************************* 129*cdf0e10cSrcweir |* 130*cdf0e10cSrcweir |* FileCopier::operator =() 131*cdf0e10cSrcweir |* 132*cdf0e10cSrcweir |* Beschreibung FSYS.SDW 133*cdf0e10cSrcweir |* Ersterstellung MI 13.04.94 134*cdf0e10cSrcweir |* Letzte Aenderung MI 13.04.94 135*cdf0e10cSrcweir |* 136*cdf0e10cSrcweir *************************************************************************/ 137*cdf0e10cSrcweir 138*cdf0e10cSrcweir FileCopier& FileCopier::operator = ( const FileCopier &rCopier ) 139*cdf0e10cSrcweir { 140*cdf0e10cSrcweir aSource = rCopier.aSource; 141*cdf0e10cSrcweir aTarget = rCopier.aTarget; 142*cdf0e10cSrcweir nBytesTotal = rCopier.nBytesTotal; 143*cdf0e10cSrcweir nBytesCopied = rCopier.nBytesCopied; 144*cdf0e10cSrcweir nBytesCopied = rCopier.nBytesCopied; 145*cdf0e10cSrcweir nBlockSize = rCopier.nBlockSize; 146*cdf0e10cSrcweir aProgressLink = rCopier.aProgressLink; 147*cdf0e10cSrcweir *pImp = *(rCopier.pImp); 148*cdf0e10cSrcweir return *this; 149*cdf0e10cSrcweir } 150*cdf0e10cSrcweir 151*cdf0e10cSrcweir /************************************************************************* 152*cdf0e10cSrcweir |* 153*cdf0e10cSrcweir |* FileCopier::Progress() 154*cdf0e10cSrcweir |* 155*cdf0e10cSrcweir |* Beschreibung FSYS.SDW 156*cdf0e10cSrcweir |* Ersterstellung MI 13.04.94 157*cdf0e10cSrcweir |* Letzte Aenderung MI 13.04.94 158*cdf0e10cSrcweir |* 159*cdf0e10cSrcweir *************************************************************************/ 160*cdf0e10cSrcweir 161*cdf0e10cSrcweir sal_Bool FileCopier::Progress() 162*cdf0e10cSrcweir { 163*cdf0e10cSrcweir if ( !aProgressLink ) 164*cdf0e10cSrcweir return sal_True; 165*cdf0e10cSrcweir else 166*cdf0e10cSrcweir { 167*cdf0e10cSrcweir if ( aProgressLink.Call( this ) ) 168*cdf0e10cSrcweir return sal_True; 169*cdf0e10cSrcweir return ( 0 == Error( ERRCODE_ABORT, 0, 0 ) ); 170*cdf0e10cSrcweir } 171*cdf0e10cSrcweir } 172*cdf0e10cSrcweir 173*cdf0e10cSrcweir //--------------------------------------------------------------------------- 174*cdf0e10cSrcweir 175*cdf0e10cSrcweir ErrCode FileCopier::Error( ErrCode eErr, const DirEntry* pSource, const DirEntry* pTarget ) 176*cdf0e10cSrcweir { 177*cdf0e10cSrcweir // kein Fehler oder kein ErrorHandler? 178*cdf0e10cSrcweir if ( !eErr || !pImp->aErrorLink ) 179*cdf0e10cSrcweir // => Error beibehalten 180*cdf0e10cSrcweir return eErr; 181*cdf0e10cSrcweir 182*cdf0e10cSrcweir // sonst gesetzten ErrorHandler fragen 183*cdf0e10cSrcweir pImp->pErrSource = pSource; 184*cdf0e10cSrcweir pImp->pErrTarget = pTarget; 185*cdf0e10cSrcweir pImp->eErr = eErr; 186*cdf0e10cSrcweir ErrCode eRet = (ErrCode) pImp->aErrorLink.Call( this ); 187*cdf0e10cSrcweir pImp->pErrSource = 0; 188*cdf0e10cSrcweir pImp->pErrTarget = 0; 189*cdf0e10cSrcweir return eRet; 190*cdf0e10cSrcweir } 191*cdf0e10cSrcweir 192*cdf0e10cSrcweir //--------------------------------------------------------------------------- 193*cdf0e10cSrcweir 194*cdf0e10cSrcweir const DirEntry* FileCopier::GetErrorSource() const 195*cdf0e10cSrcweir { 196*cdf0e10cSrcweir return pImp->pErrSource; 197*cdf0e10cSrcweir } 198*cdf0e10cSrcweir 199*cdf0e10cSrcweir //--------------------------------------------------------------------------- 200*cdf0e10cSrcweir 201*cdf0e10cSrcweir const DirEntry* FileCopier::GetErrorTarget() const 202*cdf0e10cSrcweir { 203*cdf0e10cSrcweir return pImp->pErrTarget; 204*cdf0e10cSrcweir } 205*cdf0e10cSrcweir 206*cdf0e10cSrcweir //--------------------------------------------------------------------------- 207*cdf0e10cSrcweir 208*cdf0e10cSrcweir ErrCode FileCopier::GetError() const 209*cdf0e10cSrcweir { 210*cdf0e10cSrcweir return pImp->eErr; 211*cdf0e10cSrcweir } 212*cdf0e10cSrcweir 213*cdf0e10cSrcweir //--------------------------------------------------------------------------- 214*cdf0e10cSrcweir 215*cdf0e10cSrcweir void FileCopier::SetErrorHdl( const Link &rLink ) 216*cdf0e10cSrcweir { 217*cdf0e10cSrcweir pImp->aErrorLink = rLink; 218*cdf0e10cSrcweir } 219*cdf0e10cSrcweir 220*cdf0e10cSrcweir //--------------------------------------------------------------------------- 221*cdf0e10cSrcweir 222*cdf0e10cSrcweir const Link& FileCopier::GetErrorHdl() const 223*cdf0e10cSrcweir { 224*cdf0e10cSrcweir return pImp->aErrorLink ; 225*cdf0e10cSrcweir } 226*cdf0e10cSrcweir 227*cdf0e10cSrcweir /************************************************************************* 228*cdf0e10cSrcweir |* 229*cdf0e10cSrcweir |* FileCopier::Execute() 230*cdf0e10cSrcweir |* 231*cdf0e10cSrcweir |* Beschreibung FSYS.SDW 232*cdf0e10cSrcweir |* Ersterstellung MI 13.04.94 233*cdf0e10cSrcweir |* Letzte Aenderung PB 16.06.00 234*cdf0e10cSrcweir |* 235*cdf0e10cSrcweir *************************************************************************/ 236*cdf0e10cSrcweir 237*cdf0e10cSrcweir FSysError FileCopier::DoCopy_Impl( 238*cdf0e10cSrcweir const DirEntry &rSource, const DirEntry &rTarget ) 239*cdf0e10cSrcweir { 240*cdf0e10cSrcweir FSysError eRet = FSYS_ERR_OK; 241*cdf0e10cSrcweir ErrCode eWarn = FSYS_ERR_OK; 242*cdf0e10cSrcweir 243*cdf0e10cSrcweir // HPFS->FAT? 244*cdf0e10cSrcweir FSysPathStyle eSourceStyle = DirEntry::GetPathStyle( rSource.ImpGetTopPtr()->GetName() ); 245*cdf0e10cSrcweir FSysPathStyle eTargetStyle = DirEntry::GetPathStyle( rTarget.ImpGetTopPtr()->GetName() ); 246*cdf0e10cSrcweir sal_Bool bMakeShortNames = ( eSourceStyle == FSYS_STYLE_HPFS && eTargetStyle == FSYS_STYLE_FAT ); 247*cdf0e10cSrcweir 248*cdf0e10cSrcweir // Zieldateiname ggf. kuerzen 249*cdf0e10cSrcweir DirEntry aTgt; 250*cdf0e10cSrcweir if ( bMakeShortNames ) 251*cdf0e10cSrcweir { 252*cdf0e10cSrcweir aTgt = rTarget.GetPath(); 253*cdf0e10cSrcweir aTgt.MakeShortName( rTarget.GetName() ); 254*cdf0e10cSrcweir } 255*cdf0e10cSrcweir else 256*cdf0e10cSrcweir aTgt = rTarget; 257*cdf0e10cSrcweir 258*cdf0e10cSrcweir // kein Move wenn Namen gekuerzt werden muessten 259*cdf0e10cSrcweir if ( bMakeShortNames && FSYS_ACTION_MOVE == ( pImp->nActions & FSYS_ACTION_MOVE ) && aTgt != rTarget ) 260*cdf0e10cSrcweir return ERRCODE_IO_NAMETOOLONG; 261*cdf0e10cSrcweir 262*cdf0e10cSrcweir // source is directory? 263*cdf0e10cSrcweir FileStat aSourceFileStat( rSource ); 264*cdf0e10cSrcweir if ( aSourceFileStat.IsKind( FSYS_KIND_DIR ) ) 265*cdf0e10cSrcweir { 266*cdf0e10cSrcweir #ifdef OS2 267*cdf0e10cSrcweir CHAR szSource[CCHMAXPATHCOMP]; 268*cdf0e10cSrcweir HOBJECT hSourceObject; 269*cdf0e10cSrcweir 270*cdf0e10cSrcweir strcpy(szSource, ByteString(rSource.GetFull(), osl_getThreadTextEncoding()).GetBuffer()); 271*cdf0e10cSrcweir hSourceObject = WinQueryObject(szSource); 272*cdf0e10cSrcweir 273*cdf0e10cSrcweir if ( hSourceObject ) 274*cdf0e10cSrcweir { 275*cdf0e10cSrcweir PSZ pszSourceName; 276*cdf0e10cSrcweir PSZ pszTargetName; 277*cdf0e10cSrcweir CHAR szTarget[CCHMAXPATHCOMP]; 278*cdf0e10cSrcweir HOBJECT hTargetObject; 279*cdf0e10cSrcweir HOBJECT hReturn = NULLHANDLE; 280*cdf0e10cSrcweir 281*cdf0e10cSrcweir strcpy(szTarget, ByteString(rTarget.GetFull(), osl_getThreadTextEncoding()).GetBuffer()); 282*cdf0e10cSrcweir pszTargetName = strrchr(szTarget, '\\'); 283*cdf0e10cSrcweir pszSourceName = strrchr(szSource, '\\'); 284*cdf0e10cSrcweir 285*cdf0e10cSrcweir hTargetObject = WinQueryObject(szTarget); 286*cdf0e10cSrcweir 287*cdf0e10cSrcweir if ( hTargetObject ) 288*cdf0e10cSrcweir WinDestroyObject(hTargetObject); 289*cdf0e10cSrcweir 290*cdf0e10cSrcweir if ( pszTargetName && pszSourceName ) 291*cdf0e10cSrcweir { 292*cdf0e10cSrcweir *pszTargetName = '\0'; 293*cdf0e10cSrcweir pszSourceName++; 294*cdf0e10cSrcweir pszTargetName++; 295*cdf0e10cSrcweir 296*cdf0e10cSrcweir if(strcmp(pszSourceName, pszTargetName) == 0) 297*cdf0e10cSrcweir { 298*cdf0e10cSrcweir hTargetObject = WinQueryObject(szTarget); 299*cdf0e10cSrcweir 300*cdf0e10cSrcweir if(pImp->nActions & FSYS_ACTION_MOVE) 301*cdf0e10cSrcweir { 302*cdf0e10cSrcweir hReturn = WinMoveObject(hSourceObject, hTargetObject, 0); 303*cdf0e10cSrcweir } 304*cdf0e10cSrcweir else 305*cdf0e10cSrcweir { 306*cdf0e10cSrcweir hReturn = WinCopyObject(hSourceObject, hTargetObject, 0); 307*cdf0e10cSrcweir } 308*cdf0e10cSrcweir if ( bMakeShortNames && aTarget.Exists() ) 309*cdf0e10cSrcweir aTarget.Kill(); 310*cdf0e10cSrcweir return hReturn ? FSYS_ERR_OK : FSYS_ERR_UNKNOWN; 311*cdf0e10cSrcweir } 312*cdf0e10cSrcweir } 313*cdf0e10cSrcweir } 314*cdf0e10cSrcweir #endif 315*cdf0e10cSrcweir // recursive copy 316*cdf0e10cSrcweir eRet = Error( aTgt.MakeDir() ? FSYS_ERR_OK : FSYS_ERR_UNKNOWN, 0, &aTgt ); 317*cdf0e10cSrcweir Dir aSourceDir( rSource, FSYS_KIND_DIR|FSYS_KIND_FILE ); 318*cdf0e10cSrcweir for ( sal_uInt16 n = 0; ERRCODE_TOERROR(eRet) == FSYS_ERR_OK && n < aSourceDir.Count(); ++n ) 319*cdf0e10cSrcweir { 320*cdf0e10cSrcweir const DirEntry &rSubSource = aSourceDir[n]; 321*cdf0e10cSrcweir DirEntryFlag eFlag = rSubSource.GetFlag(); 322*cdf0e10cSrcweir if ( eFlag != FSYS_FLAG_CURRENT && eFlag != FSYS_FLAG_PARENT ) 323*cdf0e10cSrcweir { 324*cdf0e10cSrcweir DirEntry aSubTarget( aTgt ); 325*cdf0e10cSrcweir aSubTarget += rSubSource.GetName(); 326*cdf0e10cSrcweir eRet = DoCopy_Impl( rSubSource, aSubTarget ); 327*cdf0e10cSrcweir if ( eRet && !eWarn ) 328*cdf0e10cSrcweir eWarn = eRet; 329*cdf0e10cSrcweir } 330*cdf0e10cSrcweir } 331*cdf0e10cSrcweir } 332*cdf0e10cSrcweir else if ( aSourceFileStat.IsKind(FSYS_KIND_FILE) ) 333*cdf0e10cSrcweir { 334*cdf0e10cSrcweir if ( ( FSYS_ACTION_KEEP_EXISTING == ( pImp->nActions & FSYS_ACTION_KEEP_EXISTING ) ) && 335*cdf0e10cSrcweir aTgt.Exists() ) 336*cdf0e10cSrcweir { 337*cdf0e10cSrcweir // Do not overwrite existing file in target folder. 338*cdf0e10cSrcweir return ERRCODE_NONE; 339*cdf0e10cSrcweir } 340*cdf0e10cSrcweir 341*cdf0e10cSrcweir // copy file 342*cdf0e10cSrcweir nBytesCopied = 0; 343*cdf0e10cSrcweir nBytesTotal = FileStat( rSource ).GetSize(); 344*cdf0e10cSrcweir 345*cdf0e10cSrcweir ::rtl::OUString aFileName; 346*cdf0e10cSrcweir FileBase::getFileURLFromSystemPath( ::rtl::OUString(rSource.GetFull()), aFileName ); 347*cdf0e10cSrcweir SvFileStream aSrc( aFileName, STREAM_READ|STREAM_NOCREATE|STREAM_SHARE_DENYNONE ); 348*cdf0e10cSrcweir 349*cdf0e10cSrcweir if ( !aSrc.GetError() ) 350*cdf0e10cSrcweir { 351*cdf0e10cSrcweir #ifdef UNX 352*cdf0e10cSrcweir struct stat buf; 353*cdf0e10cSrcweir if ( fstat( aSrc.GetFileHandle(), &buf ) == -1 ) 354*cdf0e10cSrcweir eRet = Error( FSYS_ERR_ACCESSDENIED, 0, &aTgt ); 355*cdf0e10cSrcweir #endif 356*cdf0e10cSrcweir ::rtl::OUString aTargetFileName; 357*cdf0e10cSrcweir FileBase::getFileURLFromSystemPath( ::rtl::OUString(aTgt.GetFull()), aTargetFileName ); 358*cdf0e10cSrcweir 359*cdf0e10cSrcweir SvFileStream aTargetStream( aTargetFileName, STREAM_WRITE | STREAM_TRUNC | STREAM_SHARE_DENYWRITE ); 360*cdf0e10cSrcweir if ( !aTargetStream.GetError() ) 361*cdf0e10cSrcweir { 362*cdf0e10cSrcweir #ifdef UNX 363*cdf0e10cSrcweir if ( fchmod( aTargetStream.GetFileHandle(), buf.st_mode ) == -1 ) 364*cdf0e10cSrcweir eRet = Error( FSYS_ERR_ACCESSDENIED, 0, &aTgt ); 365*cdf0e10cSrcweir #endif 366*cdf0e10cSrcweir size_t nAllocSize = 0, nSize = 0; 367*cdf0e10cSrcweir char *pBuf = 0; 368*cdf0e10cSrcweir while ( Progress() && nSize == nAllocSize && eRet == FSYS_ERR_OK ) 369*cdf0e10cSrcweir { 370*cdf0e10cSrcweir // adjust the block-size 371*cdf0e10cSrcweir if ( nBlockSize > nAllocSize ) 372*cdf0e10cSrcweir { 373*cdf0e10cSrcweir delete[] pBuf; 374*cdf0e10cSrcweir nAllocSize = nBlockSize; 375*cdf0e10cSrcweir pBuf = new char[nAllocSize]; 376*cdf0e10cSrcweir } 377*cdf0e10cSrcweir 378*cdf0e10cSrcweir // copy one block 379*cdf0e10cSrcweir nSize = aSrc.Read( pBuf, nBlockSize ); 380*cdf0e10cSrcweir aTargetStream.Write( pBuf, nSize ); 381*cdf0e10cSrcweir if ( aTargetStream.GetError() ) 382*cdf0e10cSrcweir eRet = Error( aTargetStream.GetError(), 0, &aTgt ); 383*cdf0e10cSrcweir 384*cdf0e10cSrcweir // adjust counters 385*cdf0e10cSrcweir nBytesCopied += nSize; 386*cdf0e10cSrcweir if ( nBytesCopied > nBytesTotal ) 387*cdf0e10cSrcweir nBytesTotal = nBytesCopied; 388*cdf0e10cSrcweir } 389*cdf0e10cSrcweir delete[] pBuf; 390*cdf0e10cSrcweir } 391*cdf0e10cSrcweir else 392*cdf0e10cSrcweir eRet = Error( aTargetStream.GetError(), 0, &aTgt ); 393*cdf0e10cSrcweir 394*cdf0e10cSrcweir // unvollstaendiges File wieder loeschen 395*cdf0e10cSrcweir aTargetStream.Close(); 396*cdf0e10cSrcweir 397*cdf0e10cSrcweir if ( nBytesCopied != nBytesTotal ) 398*cdf0e10cSrcweir { 399*cdf0e10cSrcweir aTgt.Kill(); 400*cdf0e10cSrcweir } 401*cdf0e10cSrcweir } 402*cdf0e10cSrcweir else 403*cdf0e10cSrcweir eRet = Error( aSrc.GetError(), &rSource, 0 ); 404*cdf0e10cSrcweir } 405*cdf0e10cSrcweir else if ( aSourceFileStat.IsKind(FSYS_KIND_NONE) ) 406*cdf0e10cSrcweir eRet = Error( ERRCODE_IO_NOTEXISTS, &rSource, 0 ); 407*cdf0e10cSrcweir else 408*cdf0e10cSrcweir eRet = Error( ERRCODE_IO_NOTSUPPORTED, &rSource, 0 ); 409*cdf0e10cSrcweir 410*cdf0e10cSrcweir #ifdef WNT 411*cdf0e10cSrcweir // Set LastWriteTime and Attributes of the target identical with the source 412*cdf0e10cSrcweir 413*cdf0e10cSrcweir if ( FSYS_ERR_OK == ERRCODE_TOERROR(eRet) ) 414*cdf0e10cSrcweir { 415*cdf0e10cSrcweir WIN32_FIND_DATA fdSource; 416*cdf0e10cSrcweir ByteString aFullSource(aSource.GetFull(), osl_getThreadTextEncoding()); 417*cdf0e10cSrcweir ByteString aFullTarget(aTgt.GetFull(), osl_getThreadTextEncoding()); 418*cdf0e10cSrcweir HANDLE hFind = FindFirstFile( aFullSource.GetBuffer() , &fdSource ); 419*cdf0e10cSrcweir if ( hFind != INVALID_HANDLE_VALUE ) 420*cdf0e10cSrcweir { 421*cdf0e10cSrcweir FindClose( hFind ); 422*cdf0e10cSrcweir 423*cdf0e10cSrcweir HANDLE hFile = CreateFile( aFullTarget.GetBuffer(), GENERIC_WRITE, 424*cdf0e10cSrcweir FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, 425*cdf0e10cSrcweir OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); 426*cdf0e10cSrcweir 427*cdf0e10cSrcweir if ( hFile != INVALID_HANDLE_VALUE ) 428*cdf0e10cSrcweir { 429*cdf0e10cSrcweir SetFileTime( hFile, NULL, NULL, &fdSource.ftLastWriteTime ); 430*cdf0e10cSrcweir CloseHandle( hFile ); 431*cdf0e10cSrcweir } 432*cdf0e10cSrcweir 433*cdf0e10cSrcweir SetFileAttributes( aFullTarget.GetBuffer(), fdSource.dwFileAttributes ); 434*cdf0e10cSrcweir } 435*cdf0e10cSrcweir } 436*cdf0e10cSrcweir #endif 437*cdf0e10cSrcweir // bei Move ggf. das File/Dir loeschen 438*cdf0e10cSrcweir if ( FSYS_ERR_OK == ERRCODE_TOERROR(eRet) && ( pImp->nActions & FSYS_ACTION_MOVE ) ) 439*cdf0e10cSrcweir { 440*cdf0e10cSrcweir ErrCode eKillErr = Error( rSource.Kill() | ERRCODE_WARNING_MASK, &rSource, 0 ); 441*cdf0e10cSrcweir if ( eKillErr != ERRCODE_WARNING_MASK ) 442*cdf0e10cSrcweir { 443*cdf0e10cSrcweir if ( rSource.Exists() ) 444*cdf0e10cSrcweir // loeschen ging nicht => dann die Kopie wieder loeschen 445*cdf0e10cSrcweir aTgt.Kill( pImp->nActions ); 446*cdf0e10cSrcweir if ( !eWarn ) 447*cdf0e10cSrcweir eWarn = eKillErr; 448*cdf0e10cSrcweir } 449*cdf0e10cSrcweir } 450*cdf0e10cSrcweir 451*cdf0e10cSrcweir return !eRet ? eWarn : eRet; 452*cdf0e10cSrcweir } 453*cdf0e10cSrcweir 454*cdf0e10cSrcweir // ----------------------------------------------------------------------- 455*cdf0e10cSrcweir 456*cdf0e10cSrcweir FSysError FileCopier::Execute( FSysAction nActions ) 457*cdf0e10cSrcweir { 458*cdf0e10cSrcweir return ExecuteExact( nActions ); 459*cdf0e10cSrcweir } 460*cdf0e10cSrcweir 461*cdf0e10cSrcweir // ----------------------------------------------------------------------- 462*cdf0e10cSrcweir 463*cdf0e10cSrcweir FSysError FileCopier::ExecuteExact( FSysAction nActions, FSysExact eExact ) 464*cdf0e10cSrcweir { 465*cdf0e10cSrcweir DirEntry aAbsSource = DirEntry( aSource); 466*cdf0e10cSrcweir DirEntry aAbsTarget = DirEntry( aTarget ); 467*cdf0e10cSrcweir pImp->nActions = nActions; 468*cdf0e10cSrcweir 469*cdf0e10cSrcweir // check if both pathes are accessible and source and target are different 470*cdf0e10cSrcweir if ( !aAbsTarget.ToAbs() || !aAbsSource.ToAbs() || aAbsTarget == aAbsSource ) 471*cdf0e10cSrcweir return FSYS_ERR_ACCESSDENIED; 472*cdf0e10cSrcweir 473*cdf0e10cSrcweir // check if copy would be endless recursive into itself 474*cdf0e10cSrcweir if ( FSYS_ACTION_RECURSIVE == ( nActions & FSYS_ACTION_RECURSIVE ) && 475*cdf0e10cSrcweir aAbsSource.Contains( aAbsTarget ) ) 476*cdf0e10cSrcweir return ERRCODE_IO_RECURSIVE; 477*cdf0e10cSrcweir 478*cdf0e10cSrcweir // target is directory? 479*cdf0e10cSrcweir if ( eExact == FSYS_NOTEXACT && 480*cdf0e10cSrcweir FileStat( aAbsTarget ).IsKind(FSYS_KIND_DIR) && FileStat( aAbsSource ).IsKind(FSYS_KIND_FILE) ) 481*cdf0e10cSrcweir // append name of source 482*cdf0e10cSrcweir aAbsTarget += aSource.GetName(); 483*cdf0e10cSrcweir 484*cdf0e10cSrcweir // recursive copy 485*cdf0e10cSrcweir return DoCopy_Impl( aAbsSource, aAbsTarget ); 486*cdf0e10cSrcweir } 487