- Timestamp:
- Apr 29, 2001, 6:23:03 PM (24 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/shell32/shlfileop.c
r5623 r5636 198 198 DWORD FromAttr; 199 199 DWORD ToAttr; 200 LPSTR pTempFrom; 200 201 LPSTR pTempTo = NULL; 201 LPSTR pTempFrom; 202 LPSTR pNextFrom; 203 LPSTR pNextTo; 202 LPSTR pFromFile; 204 203 LPSTR pToFile; 205 204 206 205 FILEOP_FLAGS OFl = ((FILEOP_FLAGS)lpFileOp->fFlags & 0x7ff); 207 206 BOOL Multi = TRUE; 208 BOOL withFileName = FALSE;207 BOOL withFileName; 209 208 BOOL not_overwrite; 210 BOOL toSingle;211 BOOL StarStar;212 BOOL copyOk;209 BOOL ToSingle; 210 BOOL BothDir; 211 BOOL ToWithoutBackSlash; 213 212 long lenFrom = -1; 214 213 long lenTo = -1; 214 long lenTempFrom; 215 215 long lenTempTo; 216 216 long retCode = 0x75; 217 217 long TempretCode = 0; 218 long lenNextFrom; 219 long lenNextTo; 218 long where = 0; 220 219 SHFILEOPSTRUCTA nlpFileOp = *(lpFileOp); 221 HANDLE 220 HANDLE hFind; 222 221 WIN32_FIND_DATAA wfd; 223 222 … … 234 233 TRACE("File Copy:\n"); 235 234 #ifdef __WIN32OS2__ 236 pTempTo = HeapAlloc(GetProcessHeap(), 0, 4 * MAX_PATH+4); 237 pNextFrom = &pTempTo[2*MAX_PATH+2]; 238 pNextTo = &pNextFrom[MAX_PATH+1]; 235 pTempTo = HeapAlloc(GetProcessHeap(), 0, 3 * MAX_PATH+6); 236 pTempFrom = &pTempTo[2*MAX_PATH+2]; 239 237 /* 240 238 * FOF_MULTIDESTFILES, FOF_NOCONFIRMATION, FOF_FILESONLY are implemented … … 246 244 if (OFl) { 247 245 if (OFl & (-1 - (FOF_CONFIRMMOUSE | FOF_SILENT | FOF_NOCONFIRMATION | FOF_SIMPLEPROGRESS | FOF_NOCONFIRMMKDIR))) { 248 FIXME(__FUNCTION__" FO_COPY with this fFlags not implemented:% 2x ,stub\n",lpFileOp->fFlags);246 FIXME(__FUNCTION__" FO_COPY with this fFlags not implemented:%x ,stub\n",lpFileOp->fFlags); 249 247 lpFileOp->fAnyOperationsAborted=TRUE; 250 248 } else { 251 249 // not FOF_SILENT, not FOF_SIMPLEPROGRESS, not FOF_NOCONFIRMMKDIR 252 FIXME(__FUNCTION__" FO_COPY with this lpFileOp->fFlags not full implemented:0x% 2x ,stub\n",lpFileOp->fFlags);250 FIXME(__FUNCTION__" FO_COPY with this lpFileOp->fFlags not full implemented:0x%x ,stub\n",lpFileOp->fFlags); 253 251 } /* endif */ 254 252 } /* endif */ … … 267 265 268 266 if (Multi) pTo += lenTo + 1; 269 if(!pTo[0]) break; 267 if(!pTo[0]) { 268 nlpFileOp.fAnyOperationsAborted=TRUE; 269 where = 13; 270 break; 271 } 270 272 271 273 TRACE(" From='%s' To='%s'\n", pFrom, pTo); … … 275 277 276 278 lenFrom=strlen(pFrom); 277 strcpy(pNextFrom,pFrom); 278 FromAttr = GetFileAttributesA(pNextFrom); 279 StarStar = FALSE; 279 strcpy(pTempFrom,pFrom); 280 FromAttr = GetFileAttributesA(pTempFrom); 280 281 281 282 if (Multi) { … … 285 286 // multi target, each one for one source. ? last target + more than one source (all source files an one dir as target) 286 287 287 toSingle = ((pTo[lenTo+1]=='\0') || !Multi); 288 withFileName = FALSE; 288 ToSingle = ((pTo[lenTo+1]=='\0') || !Multi); 289 289 290 290 strcpy(pTempTo,pTo); 291 291 PathRemoveBackslashA(pTempTo); 292 ToWithoutBackSlash = (strlen(pTempTo)==lenTo); 292 293 ToAttr = GetFileAttributesA(pTempTo); 293 if (ToAttr == -1 || !(ToAttr & FILE_ATTRIBUTE_DIRECTORY)) { 294 withFileName = ((lenTo == strlen(pTempTo)) || !toSingle); 295 if (withFileName) { 294 295 BothDir = (Multi && 296 ToWithoutBackSlash && 297 (-1 != (FromAttr | ToAttr)) && 298 (ToAttr & FromAttr & FILE_ATTRIBUTE_DIRECTORY)); 299 300 withFileName = (!BothDir && 301 (ToWithoutBackSlash || !ToSingle) && 302 (ToAttr == -1 || !(ToAttr & FILE_ATTRIBUTE_DIRECTORY))); 303 304 if (withFileName) { 296 305 // Target must not be an directory 297 PathRemoveFileSpecA(pTempTo); 298 ToAttr = GetFileAttributesA(pTempTo); 299 } 306 PathRemoveFileSpecA(pTempTo); 307 ToAttr = GetFileAttributesA(pTempTo); 300 308 } 301 if (ToAttr == -1) { 309 if ((ToAttr == -1) || 310 !(ToAttr & FILE_ATTRIBUTE_DIRECTORY) || 311 (!withFileName && !ToSingle) ) { 302 312 nlpFileOp.fAnyOperationsAborted=TRUE; 313 where = 1; 303 314 break; 304 315 } 305 if (!(ToAttr & FILE_ATTRIBUTE_DIRECTORY) || (!withFileName && !toSingle) ) {306 // never Create directory at this time307 nlpFileOp.fAnyOperationsAborted=TRUE;308 /* retCode=0x279; */309 break;310 }311 316 lenTempTo = strlen(pTempTo); 312 317 withFileName = (((lenTempTo + 1) < lenTo) || (PathIsRootA(pTo) && lenTempTo < lenTo)); 313 318 PathAddBackslashA(pTempTo); 314 StarStar = (Multi && !withFileName &&315 (ToAttr & FILE_ATTRIBUTE_DIRECTORY) &&316 (FromAttr != -1) &&317 (FromAttr & FILE_ATTRIBUTE_DIRECTORY) &&318 (0!=strcmp(pTempTo,pTo)));319 319 } 320 320 321 if (FromAttr == -1 || StarStar) {321 if (FromAttr == -1 || BothDir) { 322 322 // is Source an existing directory\*.* ? 323 323 if (FromAttr == -1) { 324 PathRemoveFileSpecA(p NextFrom);325 FromAttr = GetFileAttributesA(p NextFrom);324 PathRemoveFileSpecA(pTempFrom); 325 FromAttr = GetFileAttributesA(pTempFrom); 326 326 } 327 PathAddBackslashA(pNextFrom); 328 lenNextFrom = strlen(pNextFrom); 329 pToFile=&pNextFrom[lenNextFrom]; 327 328 PathAddBackslashA(pTempFrom); 329 lenTempFrom = strlen(pTempFrom); 330 pFromFile=&pTempFrom[lenTempFrom]; 330 331 331 332 if (FromAttr == -1 || 332 (( 0==strcmp(pNextFrom,pFrom)) && !PathIsRootA(pFrom)) ||333 ((lenTempFrom==lenFrom) && !PathIsRootA(pFrom)) || 333 334 !(FromAttr & FILE_ATTRIBUTE_DIRECTORY) || 334 !((0==strcmp(&pFrom[len NextFrom],"*.*")) || StarStar)) {335 !((0==strcmp(&pFrom[lenTempFrom],"*.*")) || BothDir)) { 335 336 retCode=0x402; 336 337 nlpFileOp.fAnyOperationsAborted=TRUE; 338 where = 2; 337 339 break; 338 340 } 339 341 340 strcpy(p ToFile, "*.*");341 hFind = FindFirstFileA(p NextFrom, &wfd);342 strcpy(pFromFile, "*.*"); 343 hFind = FindFirstFileA(pTempFrom, &wfd); 342 344 if (INVALID_HANDLE_VALUE == hFind) { 343 345 nlpFileOp.fAnyOperationsAborted=TRUE; 344 346 retCode=0x79; 347 where = 3; 345 348 break; 346 349 } 347 nlpFileOp.pFrom = pNextFrom; 348 strcpy(pNextTo,pTo); 349 pNextTo[strlen(pNextTo)+1]='\0'; 350 351 nlpFileOp.pFrom = pTempFrom; 352 // single copy never with FOF_MULTIDESTFILES, I can use lpFileOp->pTo as nlpFileOp.pTo, 353 // I need no different targetarea for the name 350 354 nlpFileOp.fFlags = (nlpFileOp.fFlags & (-1 - (FOF_MULTIDESTFILES))); 351 355 … … 360 364 } /* endif */ 361 365 362 strcpy(p ToFile,wfd.cFileName);363 p NextFrom[strlen(pNextFrom)+1]='\0';366 strcpy(pFromFile,wfd.cFileName); 367 pTempFrom[strlen(pTempFrom)+1]='\0'; 364 368 365 369 TempretCode = SHFileOperationA (&nlpFileOp); 366 370 367 if (nlpFileOp.fAnyOperationsAborted) { /*retCode=0x179;*/break;}371 if (nlpFileOp.fAnyOperationsAborted) {where = 4;break;} 368 372 369 373 } while(FindNextFileA(hFind, &wfd)); 370 374 371 375 FindClose(hFind); 372 if (nlpFileOp.fAnyOperationsAborted) break;376 if (nlpFileOp.fAnyOperationsAborted) {where = 5;break;} 373 377 continue; 374 378 } … … 378 382 pToFile = &pTempTo[lenTempTo]; 379 383 // Check Source 380 strcpy(pToFile,p NextFrom);384 strcpy(pToFile,pTempFrom); 381 385 PathRemoveBackslashA(pToFile); 382 386 if (strlen(pToFile)<lenFrom) { 383 387 nlpFileOp.fAnyOperationsAborted=TRUE; 384 388 retCode=0x402; 389 where = 6; 385 390 break; 386 391 } /* endif */ 387 392 388 393 // target name in target or from source 389 p TempFrom= NULL;394 pFromFile = NULL; 390 395 if (withFileName) { 391 396 if ((pFrom[lenFrom+1]=='\0') || (Multi && !(pTo[lenTo+1]=='\0'))) { 392 p TempFrom= pTo;397 pFromFile = pTo; 393 398 } /* endif */ 394 399 } else { … … 396 401 if (!Multi || !(pFrom[lenFrom+1]=='\0') || 397 402 // only target+\, target without \ has 0x402 398 (Multi && (FromAttr & FILE_ATTRIBUTE_DIRECTORY) && (ToAttr & FILE_ATTRIBUTE_DIRECTORY))) {399 p TempFrom = pNextFrom;403 (Multi && (FromAttr & ToAttr & FILE_ATTRIBUTE_DIRECTORY))) { 404 pFromFile = pTempFrom; 400 405 } 401 406 } /* endif */ 402 407 403 if (!p TempFrom) {408 if (!pFromFile) { 404 409 nlpFileOp.fAnyOperationsAborted=TRUE; 410 where = 7; 405 411 break; 406 412 } /* endif */ 407 413 408 414 // move isolated target filename 409 strcpy(pToFile,p TempFrom);415 strcpy(pToFile,pFromFile); 410 416 PathRemoveFileSpecA(pToFile); 411 417 PathAddBackslashA(pToFile); 412 418 413 strcpy(pToFile,&p TempFrom[strlen(pToFile)]);419 strcpy(pToFile,&pFromFile[strlen(pToFile)]); 414 420 ToAttr = GetFileAttributesA(pTempTo); 415 421 416 422 417 423 if (FromAttr == -1) { 418 FIXME(__FUNCTION__" FO_COPY with Source %s not implementiert ,stub\n",p NextFrom);424 FIXME(__FUNCTION__" FO_COPY with Source %s not implementiert ,stub\n",pTempFrom); 419 425 nlpFileOp.fAnyOperationsAborted=TRUE; 420 retCode=0x76;426 where = 8; 421 427 break; 422 428 } … … 430 436 nlpFileOp.fAnyOperationsAborted=TRUE; 431 437 retCode=0x10003; 438 where = 9; 432 439 break; 433 440 } … … 435 442 lenTempTo = strlen(pTempTo); 436 443 437 PathAddBackslashA(p NextFrom);438 strcat(p NextFrom, "*.*");439 p NextFrom[strlen(pNextFrom)+1]='\0';440 nlpFileOp.pFrom = p NextFrom;444 PathAddBackslashA(pTempFrom); 445 strcat(pTempFrom, "*.*"); 446 pTempFrom[strlen(pTempFrom)+1]='\0'; 447 nlpFileOp.pFrom = pTempFrom; 441 448 442 449 pTempTo[lenTempTo+1]='\0'; … … 450 457 451 458 } else { 452 if (!(ToAttr & FILE_ATTRIBUTE_DIRECTORY)) { 453 FIXME(__FUNCTION__" FO_COPY only with %s -> %t ? ,stub\n",pNextFrom,pTo); 454 nlpFileOp.fAnyOperationsAborted=TRUE; 455 retCode=0x77; 456 break; 457 } 458 if (strlen(pToFile)==0) { 459 nlpFileOp.fAnyOperationsAborted=TRUE; 460 retCode=0x78; 461 break; 462 } else { 463 nlpFileOp.fAnyOperationsAborted=TRUE; 464 retCode=0x80; 465 break; 466 } /* endif */ 459 FIXME(__FUNCTION__" FO_COPY unexpected with %s -> %s ? ,stub\n",pTempFrom,pTo); 460 nlpFileOp.fAnyOperationsAborted=TRUE; 461 where = 10; 462 retCode=0x77; 463 break; 467 464 468 465 } … … 472 469 if (!(ToAttr == -1) && (ToAttr & FILE_ATTRIBUTE_DIRECTORY)) { 473 470 nlpFileOp.fAnyOperationsAborted=TRUE; 471 where = 11; 472 break; 473 } 474 if (0==strcmp(pTempFrom, pTempTo)) { 475 nlpFileOp.fAnyOperationsAborted=TRUE; 476 retCode = 0x71; 477 where = 12; 474 478 break; 475 479 } 476 480 // first try to copy 477 if (CopyFileA(p NextFrom, pTempTo, not_overwrite)) continue;481 if (CopyFileA(pTempFrom, pTempTo, not_overwrite)) continue; 478 482 479 483 if (not_overwrite) { 480 484 if (SHELL_ConfirmDialog (ASK_OVERWRITE_FILE, pTempTo)) 481 485 // second try to copy after confirm 482 if (CopyFileA(p NextFrom, pTempTo, FALSE)) continue;486 if (CopyFileA(pTempFrom, pTempTo, FALSE)) continue; 483 487 } /* endif */ 484 488 … … 495 499 } 496 500 if (lpFileOp->fAnyOperationsAborted==TRUE) { 497 TRACE(__FUNCTION__" Setting AnyOpsAborted=TRUE \n");501 TRACE(__FUNCTION__" Setting AnyOpsAborted=TRUE ret=0x%x, at=%i with %s -> %s\n",retCode,where,pFrom,pTo); 498 502 return retCode; 499 503 } /* endif */ … … 596 600 return (GetDriveTypeA(root) == DRIVE_REMOTE); 597 601 } 602
Note:
See TracChangeset
for help on using the changeset viewer.