- Timestamp:
- Apr 28, 2001, 6:14:33 PM (24 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/shell32/shlfileop.c
r5576 r5623 185 185 } 186 186 187 #ifdef __WIN32OS2__188 /************************************************************************189 * Creation from dir for SHFileOperation (FO_COPY)190 *191 */192 193 LPSTR DirForFileOperationA (LPSTR pTo, DWORD *dwAttr, LPSHFILEOPSTRUCTA lpFileOp, BOOL toSingle)194 {195 196 LPSTR pTempTo = NULL;197 long lenTo;198 BOOL withFileName = FALSE;199 if(pTo[0]) {200 lenTo = strlen(pTo);201 pTempTo = HeapAlloc(GetProcessHeap(), 0, lenTo + MAX_PATH);202 203 }204 *dwAttr = -1;205 if (pTempTo) {206 strcpy(pTempTo,pTo);207 PathRemoveBackslashA(pTempTo);208 *dwAttr = GetFileAttributesA(pTempTo);209 if (*(dwAttr) == -1 || !(*(dwAttr) & FILE_ATTRIBUTE_DIRECTORY)) {210 withFileName = ((lenTo == strlen(pTempTo)) || !toSingle);211 if (withFileName) {212 // Target must not be an directory213 PathRemoveFileSpecA(pTempTo);214 *(dwAttr) = GetFileAttributesA(pTempTo);215 }216 }217 if ((*(dwAttr) == -1) ||218 ( !(*(dwAttr) & FILE_ATTRIBUTE_DIRECTORY) || (!withFileName && !toSingle) )) {219 // !toSingle == !(&pTo[strlen(pTo)+1]=="\0") redundant ?220 if (!withFileName && !toSingle) {221 FIXME(__FUNCTION__" FO_COPY tagetdir and FOF_MULTIDESTFILES not implemented ? ,stub\n");222 };223 // never Create directory at this time224 HeapFree(GetProcessHeap(), 0, pTempTo);225 pTempTo = NULL;226 // }227 }228 }229 if (!pTempTo) lpFileOp->fAnyOperationsAborted=TRUE;230 return pTempTo;231 }232 #endif233 234 187 /************************************************************************* 235 188 * SHFileOperationA [SHELL32.243] … … 243 196 LPSTR pTo = (LPSTR)lpFileOp->pTo; 244 197 #ifdef __WIN32OS2__ 245 DWORD ToAttr; 246 DWORD FromAttr; 247 LPSTR pToFile; 248 LPSTR pTempTo = NULL; 249 LPSTR pTempFrom; 250 251 FILEOP_FLAGS OFl = ((FILEOP_FLAGS)lpFileOp->fFlags & 0x7ff); 252 BOOL Multi = (lpFileOp->fFlags & FOF_MULTIDESTFILES); 253 BOOL withFileName = FALSE; 254 BOOL not_overwrite; 255 BOOL copyOk; 256 long lenTo; 198 DWORD FromAttr; 199 DWORD ToAttr; 200 LPSTR pTempTo = NULL; 201 LPSTR pTempFrom; 202 LPSTR pNextFrom; 203 LPSTR pNextTo; 204 LPSTR pToFile; 205 206 FILEOP_FLAGS OFl = ((FILEOP_FLAGS)lpFileOp->fFlags & 0x7ff); 207 BOOL Multi = TRUE; 208 BOOL withFileName = FALSE; 209 BOOL not_overwrite; 210 BOOL toSingle; 211 BOOL StarStar; 212 BOOL copyOk; 213 long lenFrom = -1; 214 long lenTo = -1; 215 long lenTempTo; 216 long retCode = 0x75; 217 long TempretCode = 0; 218 long lenNextFrom; 219 long lenNextTo; 220 SHFILEOPSTRUCTA nlpFileOp = *(lpFileOp); 221 HANDLE hFind; 222 WIN32_FIND_DATAA wfd; 223 257 224 /* default no error 258 225 */ 259 226 lpFileOp->fAnyOperationsAborted=FALSE; 227 nlpFileOp.fAnyOperationsAborted=FALSE; 260 228 #else 261 229 LPSTR pTempTo; … … 266 234 TRACE("File Copy:\n"); 267 235 #ifdef __WIN32OS2__ 236 pTempTo = HeapAlloc(GetProcessHeap(), 0, 4 * MAX_PATH+4); 237 pNextFrom = &pTempTo[2*MAX_PATH+2]; 238 pNextTo = &pNextFrom[MAX_PATH+1]; 268 239 /* 269 * FOF_MULTIDESTFILES, FOF_NOCONFIRMATION are implemented240 * FOF_MULTIDESTFILES, FOF_NOCONFIRMATION, FOF_FILESONLY are implemented 270 241 * FOF_CONFIRMMOUSE, FOF_SILENT, FOF_NOCONFIRMMKDIR, FOF_SIMPLEPROGRESS are not implemented and ignored 271 242 * if any other flag set, an error occurs 272 243 */ 273 OFl = (OFl & (-1 - (FOF_MULTIDESTFILES)));274 275 276 277 278 279 244 OFl = (OFl & (-1 - (FOF_MULTIDESTFILES | FOF_FILESONLY))); 245 OFl = (OFl ^ (FOF_SILENT | FOF_NOCONFIRMATION | FOF_SIMPLEPROGRESS | FOF_NOCONFIRMMKDIR)); 246 if (OFl) { 247 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); 249 lpFileOp->fAnyOperationsAborted=TRUE; 250 } else { 280 251 // not FOF_SILENT, not FOF_SIMPLEPROGRESS, not FOF_NOCONFIRMMKDIR 281 FIXME(__FUNCTION__" FO_COPY with this fFlags not full implemented:%2x ,stub\n",lpFileOp->fFlags); 282 } /* endif */ 283 } /* endif */ 284 285 not_overwrite = (!(lpFileOp->fFlags & FOF_NOCONFIRMATION)); 286 while(!Multi && !lpFileOp->fAnyOperationsAborted) { 287 // single targetdir 288 pTempTo = DirForFileOperationA(pTo, &ToAttr, lpFileOp, TRUE); 289 290 if (!pTempTo) break; 291 292 lenTo = strlen(pTempTo); 293 withFileName = (((lenTo + 1) < strlen(pTo)) || (PathIsRootA(pTo) && lenTo < strlen(pTo))); 294 PathAddBackslashA(pTempTo); 295 break; 296 } 297 if (!lpFileOp->fAnyOperationsAborted) { 298 TRACE("File Copy:\n"); 299 #ifdef __WIN32OS2__ 300 while(pFrom[0]) { 301 #endif 302 if(!pTo[0]) break; 303 304 TRACE(" From='%s' To='%s'\n", pFrom, pTo); 305 306 if (Multi) { 307 // multi target, each one for one source. ? last 308 pTempTo = DirForFileOperationA(pTo, &ToAttr, lpFileOp, FALSE); 309 if (pTempTo) { 310 311 lenTo = strlen(pTempTo); 312 withFileName = (((lenTo + 1) < strlen(pTo)) || (PathIsRootA(pTo) && lenTo < strlen(pTo))); 313 PathAddBackslashA(pTempTo); 314 } 315 } 316 if (pTempTo) { 317 lenTo = strlen(pTempTo); 318 pToFile = &pTempTo[lenTo]; 252 FIXME(__FUNCTION__" FO_COPY with this lpFileOp->fFlags not full implemented:0x%2x ,stub\n",lpFileOp->fFlags); 253 } /* endif */ 254 } /* endif */ 255 256 not_overwrite = (!(lpFileOp->fFlags & FOF_NOCONFIRMATION)); 257 258 // fix for more then one source for one target 259 pToFile = pTempTo; 260 261 while((pFrom+=lenFrom+1)[0] && !nlpFileOp.fAnyOperationsAborted) { 262 263 if (!withFileName && Multi && (pTo[lenTo+1]=='\0')) { 264 // Win Bug ? 265 Multi = FALSE; 266 } /* endif */ 267 268 if (Multi) pTo += lenTo + 1; 269 if(!pTo[0]) break; 270 271 TRACE(" From='%s' To='%s'\n", pFrom, pTo); 272 273 // fix for more then one source for one target 274 pToFile[0] = '\0'; 275 276 lenFrom=strlen(pFrom); 277 strcpy(pNextFrom,pFrom); 278 FromAttr = GetFileAttributesA(pNextFrom); 279 StarStar = FALSE; 280 281 if (Multi) { 282 lenTo = strlen(pTo); 283 // single targetdir !Multi 284 Multi = (Multi && (lpFileOp->fFlags & FOF_MULTIDESTFILES)); 285 // multi target, each one for one source. ? last target + more than one source (all source files an one dir as target) 286 287 toSingle = ((pTo[lenTo+1]=='\0') || !Multi); 288 withFileName = FALSE; 289 290 strcpy(pTempTo,pTo); 291 PathRemoveBackslashA(pTempTo); 292 ToAttr = GetFileAttributesA(pTempTo); 293 if (ToAttr == -1 || !(ToAttr & FILE_ATTRIBUTE_DIRECTORY)) { 294 withFileName = ((lenTo == strlen(pTempTo)) || !toSingle); 295 if (withFileName) { 296 // Target must not be an directory 297 PathRemoveFileSpecA(pTempTo); 298 ToAttr = GetFileAttributesA(pTempTo); 299 } 300 } 301 if (ToAttr == -1) { 302 nlpFileOp.fAnyOperationsAborted=TRUE; 303 break; 304 } 305 if (!(ToAttr & FILE_ATTRIBUTE_DIRECTORY) || (!withFileName && !toSingle) ) { 306 // never Create directory at this time 307 nlpFileOp.fAnyOperationsAborted=TRUE; 308 /* retCode=0x279; */ 309 break; 310 } 311 lenTempTo = strlen(pTempTo); 312 withFileName = (((lenTempTo + 1) < lenTo) || (PathIsRootA(pTo) && lenTempTo < lenTo)); 313 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 } 320 321 if (FromAttr == -1 || StarStar) { 322 // is Source an existing directory\*.* ? 323 if (FromAttr == -1) { 324 PathRemoveFileSpecA(pNextFrom); 325 FromAttr = GetFileAttributesA(pNextFrom); 326 } 327 PathAddBackslashA(pNextFrom); 328 lenNextFrom = strlen(pNextFrom); 329 pToFile=&pNextFrom[lenNextFrom]; 330 331 if (FromAttr == -1 || 332 ((0==strcmp(pNextFrom,pFrom)) && !PathIsRootA(pFrom)) || 333 !(FromAttr & FILE_ATTRIBUTE_DIRECTORY) || 334 !((0==strcmp(&pFrom[lenNextFrom],"*.*")) || StarStar)) { 335 retCode=0x402; 336 nlpFileOp.fAnyOperationsAborted=TRUE; 337 break; 338 } 339 340 strcpy(pToFile, "*.*"); 341 hFind = FindFirstFileA(pNextFrom, &wfd); 342 if (INVALID_HANDLE_VALUE == hFind) { 343 nlpFileOp.fAnyOperationsAborted=TRUE; 344 retCode=0x79; 345 break; 346 } 347 nlpFileOp.pFrom = pNextFrom; 348 strcpy(pNextTo,pTo); 349 pNextTo[strlen(pNextTo)+1]='\0'; 350 nlpFileOp.fFlags = (nlpFileOp.fFlags & (-1 - (FOF_MULTIDESTFILES))); 351 352 TRACE(__FUNCTION__" Copy between Subdir %s -> %s'\n", nlpFileOp.pFrom, nlpFileOp.pTo); 353 354 do { 355 TRACE(__FUNCTION__" find '%s'\n", wfd.cFileName); 356 if (0==strcmp(wfd.cFileName,".")) continue; 357 if (0==strcmp(wfd.cFileName,"..")) continue; 358 if ((nlpFileOp.fFlags & FOF_FILESONLY) && (FILE_ATTRIBUTE_DIRECTORY & wfd.dwFileAttributes)) { 359 continue; 360 } /* endif */ 361 362 strcpy(pToFile,wfd.cFileName); 363 pNextFrom[strlen(pNextFrom)+1]='\0'; 364 365 TempretCode = SHFileOperationA (&nlpFileOp); 366 367 if (nlpFileOp.fAnyOperationsAborted) {/*retCode=0x179;*/break;} 368 369 } while(FindNextFileA(hFind, &wfd)); 370 371 FindClose(hFind); 372 if (nlpFileOp.fAnyOperationsAborted) break; 373 continue; 374 } 375 376 377 lenTempTo = strlen(pTempTo); 378 pToFile = &pTempTo[lenTempTo]; 379 // Check Source 380 strcpy(pToFile,pNextFrom); 381 PathRemoveBackslashA(pToFile); 382 if (strlen(pToFile)<lenFrom) { 383 nlpFileOp.fAnyOperationsAborted=TRUE; 384 retCode=0x402; 385 break; 386 } /* endif */ 387 319 388 // target name in target or from source 320 if (withFileName) { 321 if ((pFrom[strlen(pFrom)+1]=='\0') || 322 (Multi && !(pTo[strlen(pTo)+1]=='\0'))) { 323 pTempFrom = pTo; 324 } else { 325 // more then one source for one targetfile 326 lpFileOp->fAnyOperationsAborted=TRUE; 327 break; 328 } /* endif */ 329 } else { 330 pTempFrom = pFrom; 331 } /* endif */ 332 // isolate target filename 333 strcpy(pToFile,pTempFrom); 334 PathRemoveFileSpecA(pToFile); 335 PathAddBackslashA(pToFile); 336 lenTo = strlen(pToFile); 337 338 strcpy(pToFile,&pTempFrom[lenTo]); 339 FromAttr = GetFileAttributesA(pFrom); 340 if (FromAttr & FILE_ATTRIBUTE_DIRECTORY) { 341 if (!(FromAttr == -1)) { 342 FIXME(__FUNCTION__" FO_COPY only with sourcedir not implemented ,stub\n"); 343 }; 344 lpFileOp->fAnyOperationsAborted=TRUE; 345 break; 346 } 347 ToAttr = GetFileAttributesA(pTempTo); 348 if (!(ToAttr == -1) && (ToAttr & FILE_ATTRIBUTE_DIRECTORY)) { 349 lpFileOp->fAnyOperationsAborted=TRUE; 350 break; 351 } 389 pTempFrom = NULL; 390 if (withFileName) { 391 if ((pFrom[lenFrom+1]=='\0') || (Multi && !(pTo[lenTo+1]=='\0'))) { 392 pTempFrom = pTo; 393 } /* endif */ 394 } else { 395 // Multi Target 396 if (!Multi || !(pFrom[lenFrom+1]=='\0') || 397 // only target+\, target without \ has 0x402 398 (Multi && (FromAttr & FILE_ATTRIBUTE_DIRECTORY) && (ToAttr & FILE_ATTRIBUTE_DIRECTORY))) { 399 pTempFrom = pNextFrom; 400 } 401 } /* endif */ 402 403 if (!pTempFrom) { 404 nlpFileOp.fAnyOperationsAborted=TRUE; 405 break; 406 } /* endif */ 407 408 // move isolated target filename 409 strcpy(pToFile,pTempFrom); 410 PathRemoveFileSpecA(pToFile); 411 PathAddBackslashA(pToFile); 412 413 strcpy(pToFile,&pTempFrom[strlen(pToFile)]); 414 ToAttr = GetFileAttributesA(pTempTo); 415 416 417 if (FromAttr == -1) { 418 FIXME(__FUNCTION__" FO_COPY with Source %s not implementiert ,stub\n",pNextFrom); 419 nlpFileOp.fAnyOperationsAborted=TRUE; 420 retCode=0x76; 421 break; 422 } 423 if (FromAttr & FILE_ATTRIBUTE_DIRECTORY) { 424 if (ToAttr == -1) { 425 // Try to create an new Directory and enter in it 426 TRACE(" Creating Directory '%s'\n", pTempTo); 427 SHCreateDirectory(NULL,pTempTo); 428 ToAttr = GetFileAttributesA(pTempTo); 429 if (ToAttr == -1) { 430 nlpFileOp.fAnyOperationsAborted=TRUE; 431 retCode=0x10003; 432 break; 433 } 434 435 lenTempTo = strlen(pTempTo); 436 437 PathAddBackslashA(pNextFrom); 438 strcat(pNextFrom, "*.*"); 439 pNextFrom[strlen(pNextFrom)+1]='\0'; 440 nlpFileOp.pFrom = pNextFrom; 441 442 pTempTo[lenTempTo+1]='\0'; 443 nlpFileOp.pTo = pTempTo; 444 445 TRACE(__FUNCTION__" Entering Directory '%s'\n", nlpFileOp.pTo); 446 TempretCode = SHFileOperationA (&nlpFileOp); 447 448 if (nlpFileOp.fAnyOperationsAborted) {break;} 449 continue; 450 451 } 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 */ 467 468 } 469 470 } 471 472 if (!(ToAttr == -1) && (ToAttr & FILE_ATTRIBUTE_DIRECTORY)) { 473 nlpFileOp.fAnyOperationsAborted=TRUE; 474 break; 475 } 352 476 // first try to copy 353 copyOk = CopyFileA(pFrom, pTempTo, not_overwrite);354 355 if (!copyOk &¬_overwrite) {356 477 if (CopyFileA(pNextFrom, pTempTo, not_overwrite)) continue; 478 479 if (not_overwrite) { 480 if (SHELL_ConfirmDialog (ASK_OVERWRITE_FILE, pTempTo)) 357 481 // second try to copy after confirm 358 copyOk = CopyFileA(pFrom, pTempTo, FALSE); 359 } /* endif */ 360 if (!copyOk) lpFileOp->fAnyOperationsAborted=TRUE; 361 // fix for mor then one source for one target 362 pToFile[0] = '\0'; 363 364 if (!withFileName && Multi && (pTo[strlen(pTo)+1]=='\0')) { 365 // Win Bug ? 366 Multi = FALSE; 367 } /* endif */ 368 if (Multi) HeapFree(GetProcessHeap(), 0, pTempTo); 369 } 370 371 pFrom += strlen(pFrom) + 1; 372 373 if (Multi) pTo += strlen(pTo) + 1; 374 375 } 376 } /* endif */ 377 if (!Multi && pTempTo) HeapFree(GetProcessHeap(), 0, pTempTo); 378 379 if (lpFileOp->fAnyOperationsAborted==TRUE) { 380 TRACE(__FUNCTION__" Setting AnyOpsAborted=TRUE\n"); 381 return 0x75l; 382 } else { 383 TRACE(__FUNCTION__" Setting AnyOpsAborted=FALSE\n"); 482 if (CopyFileA(pNextFrom, pTempTo, FALSE)) continue; 384 483 } /* endif */ 385 return 0; 484 485 nlpFileOp.fAnyOperationsAborted=TRUE; 486 } 487 488 if (pTempTo) HeapFree(GetProcessHeap(), 0, pTempTo); 489 490 if (nlpFileOp.fAnyOperationsAborted) { 491 lpFileOp->fAnyOperationsAborted=TRUE; 492 if (TempretCode > retCode) { 493 retCode = TempretCode; 494 } /* endif */ 495 } 496 if (lpFileOp->fAnyOperationsAborted==TRUE) { 497 TRACE(__FUNCTION__" Setting AnyOpsAborted=TRUE\n"); 498 return retCode; 499 } /* endif */ 500 501 TRACE(__FUNCTION__" Setting AnyOpsAborted=FALSE\n"); 502 return 0; 386 503 #else 387 504 while(1) {
Note:
See TracChangeset
for help on using the changeset viewer.