- Timestamp:
- Jun 4, 2019 2:48:23 PM (6 years ago)
- Location:
- trunk/src/VBox/Main
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Main/include/MachineImplMoveVM.h
r78836 r78968 74 74 } 75 75 76 void printItem(bool fLog) const; 76 #ifdef DEBUG 77 void logItem() const; 78 #endif 77 79 78 80 HRESULT m_code; … … 138 140 HRESULT moveAllDisks(const std::map<Utf8Str, MEDIUMTASKMOVE>& listOfDisks, const Utf8Str* strTargetFolder = NULL); 139 141 HRESULT restoreAllDisks(const std::map<Utf8Str, MEDIUMTASKMOVE>& listOfDisks); 140 bool isMediumTypeSupportedForMoving (const ComPtr<IMedium> &pMedium);142 bool isMediumTypeSupportedForMovingThrowsHresult(const ComPtr<IMedium> &pMedium); 141 143 }; 142 144 -
trunk/src/VBox/Main/src-server/MachineImplMoveVM.cpp
r78836 r78968 128 128 129 129 130 void MachineMoveVM::ErrorInfoItem::printItem(bool fLog) const 130 #ifdef DEBUG 131 void MachineMoveVM::ErrorInfoItem::logItem() const 131 132 { 132 if (fLog) 133 { 134 Log2(("(The error code is %Rrc): %s\n",m_code, m_description.c_str())); 135 } 136 else 137 RTPrintf("(The error code is %Rrc): %s\n",m_code, m_description.c_str()); 133 Log2(("(The error code is %Rrc): %s\n", m_code, m_description.c_str())); 138 134 } 135 #endif 139 136 140 137 HRESULT MachineMoveVM::init() … … 149 146 size_t len = m_targetPath.length() + 2; 150 147 if (len >= RTPATH_MAX) 151 { 152 return m_pMachine->setError(VBOX_E_IPRT_ERROR, 153 m_pMachine->tr(Utf8Str("The destination path exceeds " 154 "the maximum value.").c_str())); 155 } 148 return m_pMachine->setError(VBOX_E_IPRT_ERROR, m_pMachine->tr("The destination path exceeds the maximum value.")); 156 149 157 150 /** @todo r=bird: I need to add a Utf8Str method or iprt/cxx/path.h thingy … … 174 167 */ 175 168 176 try 169 try /** @todo r=bird: What's the point of the try/catch here now? */ 177 170 { 178 171 RTFOFF cbTotal = 0; … … 183 176 int vrc = RTFsQuerySizes(strTargetFolder.c_str(), &cbTotal, &cbFree, &cbBlock, &cbSector); 184 177 if (FAILED(vrc)) 185 { 186 return m_pMachine->setErrorBoth(E_FAIL, vrc, 187 m_pMachine->tr(Utf8StrFmt("Unable to move machine. Can't get " 188 "the destination storage size (%s)", 189 strTargetFolder.c_str()).c_str())); 190 } 178 return m_pMachine->setErrorBoth(VBOX_E_IPRT_ERROR, vrc, 179 m_pMachine->tr("Unable to determine free space at move destination ('%s'): %Rrc"), 180 strTargetFolder.c_str(), vrc); 191 181 192 182 RTDIR hDir; 193 Utf8Str strTempFile = strTargetFolder + "test.txt";194 183 vrc = RTDirOpen(&hDir, strTargetFolder.c_str()); 195 184 if (RT_FAILURE(vrc)) 196 185 return m_pMachine->setErrorVrc(vrc); 197 else 198 { 199 RTFILE hFile; 200 vrc = RTFileOpen(&hFile, strTempFile.c_str(), RTFILE_O_OPEN_CREATE | RTFILE_O_READWRITE | RTFILE_O_DENY_NONE); 201 if (RT_FAILURE(vrc)) 202 { 203 return m_pMachine->setErrorVrc(vrc, 204 m_pMachine->tr(Utf8StrFmt("Can't create a test file test.txt in the %s. " 205 "Check the access rights of the destination " 206 "folder.", strTargetFolder.c_str()).c_str())); 207 } 208 209 /** @todo r=vvp: Do we need to check each return result here? Looks excessively. 210 * And it's not so important for the test file. */ 211 RTFileClose(hFile); 212 RTFileDelete(strTempFile.c_str()); 186 187 Utf8Str strTempFile = strTargetFolder + "test.txt"; 188 RTFILE hFile; 189 vrc = RTFileOpen(&hFile, strTempFile.c_str(), RTFILE_O_OPEN_CREATE | RTFILE_O_READWRITE | RTFILE_O_DENY_NONE); 190 if (RT_FAILURE(vrc)) 191 { 213 192 RTDirClose(hDir); 214 } 193 return m_pMachine->setErrorVrc(vrc, 194 m_pMachine->tr("Can't create a test file test.txt in the %s. Check the access rights of the destination folder."), 195 strTargetFolder.c_str()); 196 } 197 198 /** @todo r=vvp: Do we need to check each return result here? Looks excessively. 199 * And it's not so important for the test file. 200 * bird: I'd just do AssertRC on the same line, though the deletion 201 * of the test is a little important. */ 202 vrc = RTFileClose(hFile); AssertRC(vrc); 203 RTFileDelete(strTempFile.c_str()); 204 vrc = RTDirClose(hDir); AssertRC(vrc); 215 205 216 206 Log2(("blocks: total %RTfoff, free %RTfoff ", cbTotal, cbFree)); … … 221 211 vrc = RTFsQueryProperties(strTargetFolder.c_str(), &properties); 222 212 if (FAILED(vrc)) 223 return m_pMachine->setErrorVrc(vrc); 224 225 Utf8StrFmt info ("disk properties:\n" 226 "remote: %s \n" 227 "read only: %s \n" 228 "compressed: %s \n", 229 properties.fRemote == true ? "true":"false", 230 properties.fReadOnly == true ? "true":"false", 231 properties.fCompressed == true ? "true":"false"); 232 233 Log2(("%s \n", info.c_str())); 213 return m_pMachine->setErrorVrc(vrc, "RTFsQueryProperties(%s): %Rrc", strTargetFolder.c_str(), vrc); 214 215 Log2(("disk properties:\n" 216 "remote: %RTbool\n" 217 "read only: %RTbool\n" 218 "compressed: %RTbool\n", 219 properties.fRemote, 220 properties.fReadOnly, 221 properties.fCompressed)); 234 222 235 223 /* Get the original VM path */ … … 266 254 if ( m_type.equals("basic") 267 255 && strLogFolder.contains(strSettingsFilePath)) 268 {269 256 m_vmFolders.insert(std::make_pair(VBox_LogFolder, strLogFolder)); 270 }271 257 272 258 Utf8Str strStateFilePath; … … 275 261 hrc = m_pMachine->COMGETTER(State)(&machineState); 276 262 if (FAILED(hrc)) 277 263 return hrc; 278 264 279 265 if (machineState == MachineState_Saved) … … 291 277 hrc = m_pMachine->COMGETTER(SnapshotFolder)(bstr_snapshotFolder.asOutParam()); 292 278 if (FAILED(hrc)) 293 279 return hrc; 294 280 295 281 strSnapshotFolder = bstr_snapshotFolder; … … 303 289 hrc = m_pMachine->COMGETTER(Id)(bstrSrcMachineId.asOutParam()); 304 290 if (FAILED(hrc)) 305 291 return hrc; 306 292 307 293 ComPtr<IMachine> newSrcMachine; 308 294 hrc = m_pMachine->i_getVirtualBox()->FindMachine(bstrSrcMachineId.raw(), newSrcMachine.asOutParam()); 309 295 if (FAILED(hrc)) 310 296 return hrc; 311 297 } 312 298 … … 315 301 */ 316 302 317 long longneededFreeSpace = 0;303 int64_t neededFreeSpace = 0; 318 304 319 305 /* Actual file list */ … … 329 315 hrc = m_pMachine->COMGETTER(SnapshotCount)(&cSnapshots); 330 316 if (FAILED(hrc)) 331 317 return hrc; 332 318 333 319 if (cSnapshots > 0) … … 339 325 hrc = m_pMachine->FindSnapshot(Bstr(id).raw(), pSnapshot.asOutParam()); 340 326 if (FAILED(hrc)) 341 327 return hrc; 342 328 hrc = createMachineList(pSnapshot, machineList); 343 329 if (FAILED(hrc)) 344 330 return hrc; 345 331 } 346 332 } … … 352 338 hrc = queryMediasForAllStates(machineList); 353 339 if (FAILED(hrc)) 354 355 356 { 340 return hrc; 341 342 { /** @todo r=bird: What're the scopes for?? */ 357 343 uint64_t totalMediumsSize = 0; 358 344 359 345 for (size_t i = 0; i < m_llMedias.size(); ++i) 360 346 { 361 LONG64 cbSize = 0;362 347 MEDIUMTASKCHAINMOVE &mtc = m_llMedias.at(i); 363 348 for (size_t a = mtc.chain.size(); a > 0; --a) 364 349 { 365 350 Bstr bstrLocation; 366 Utf8Str strLocation;367 351 Utf8Str name = mtc.chain[a - 1].strBaseName; 368 352 ComPtr<IMedium> plMedium = mtc.chain[a - 1].pMedium; 369 353 hrc = plMedium->COMGETTER(Location)(bstrLocation.asOutParam()); 370 354 if (FAILED(hrc)) 371 372 373 strLocation = bstrLocation;355 return hrc; 356 357 Utf8Str strLocation = bstrLocation; 374 358 375 359 /*if an image is located in the actual VM folder it will be added to the actual list */ 360 /** @todo r=bird: This isn't sane wrt unix paths (should 361 * be startsWith)... And on windows there is the matter of 362 * two kinds of slashes. */ 376 363 if (strLocation.contains(strSettingsFilePath)) 377 364 { 365 LONG64 cbSize = 0; 378 366 hrc = plMedium->COMGETTER(Size)(&cbSize); 379 367 if (FAILED(hrc)) 380 368 return hrc; 381 369 382 370 std::pair<std::map<Utf8Str, MEDIUMTASKMOVE>::iterator,bool> ret; … … 428 416 Log2(("The state file %s wasn't added into the moved list. Couldn't get the file size.\n", 429 417 name.c_str())); 430 return m_pMachine->setErrorVrc(vrc); 418 return m_pMachine->setErrorVrc(vrc, 419 m_pMachine->tr("Failed to get file size for '%s': %Rrc"), 420 name.c_str(), vrc); 431 421 } 432 422 } … … 448 438 neededFreeSpace += totalLogSize; 449 439 if (cbFree - neededFreeSpace <= _1M) 450 { 451 return m_pMachine->setError(VBOX_E_IPRT_ERROR, 452 m_pMachine->tr(Utf8StrFmt("There is lack of disk space " 453 "(%Rrc)", VERR_OUT_OF_RESOURCES).c_str())); 454 } 440 return m_pMachine->setError(E_FAIL, 441 m_pMachine->tr("Insufficient disk space availble (%RTfoff needed, %RTfoff free)"), 442 neededFreeSpace, cbFree); 455 443 456 444 fileList_t filesList; … … 475 463 } 476 464 else 477 Log2(("The log file %s wasn't added into the moved list. " 478 "Couldn't get the file size.\n", strFile.c_str())); 465 Log2(("The log file %s wasn't added into the moved list. Couldn't get the file size.\n", strFile.c_str())); 479 466 ++it; 480 467 } … … 496 483 LogRel(("but free space on destination is %RTfoff\n", cbFree)); 497 484 return m_pMachine->setError(VBOX_E_IPRT_ERROR, 498 m_pMachine->tr( Utf8StrFmt ("There is lack of disk space"499 " (%Rrc)", VERR_OUT_OF_RESOURCES).c_str()));485 m_pMachine->tr("Insufficient disk space availble (%RTfoff needed, %RTfoff free)"), 486 neededFreeSpace, cbFree); 500 487 } 501 488 … … 519 506 1); 520 507 if (FAILED(hrc)) 521 { 522 return m_pMachine->setError(VBOX_E_IPRT_ERROR, 523 m_pMachine->tr(Utf8StrFmt("Couldn't correctly setup the progress " 524 "object for moving VM operation (%Rrc)", hrc).c_str())); 525 } 508 return m_pMachine->setError(hrc, 509 m_pMachine->tr("Couldn't correctly setup the progress object for moving VM operation")); 526 510 } 527 511 … … 693 677 if (RT_FAILURE(vrc)) 694 678 { 679 /** @todo r=bird: tr() cannot translate formatted messages like this! 680 * I would suggest you add methods to the task for doing 681 * both of these things in one go: 682 * appendAndSetErrorBothV(HRESULT,int,const char *,va_list) 683 * appendAndSetErrorBoth(HRESULT,int,const char *,...) 684 * appendAndSetErrorVrc(int,const char *,...) 685 */ 686 695 687 Utf8StrFmt errorDesc("Could not create snapshots folder '%s' (%Rrc)", strTrgSnapshotFolder.c_str(), vrc); 696 688 taskMoveVM->m_errorsList.push_back(ErrorInfoItem(VBOX_E_IPRT_ERROR, errorDesc.c_str())); … … 709 701 /* Move to next sub-operation. */ 710 702 hrc = taskMoveVM->m_pProgress->SetNextOperation(BstrFmt(machine->tr("Copy the save state file '%s' ..."), 711 RTPathFilename(sst.strSaveStateFile.c_str())).raw(), sst.uWeight); 703 RTPathFilename(sst.strSaveStateFile.c_str())).raw(), 704 sst.uWeight); 712 705 if (FAILED(hrc)) 713 706 throw hrc; … … 717 710 if (RT_FAILURE(vrc)) 718 711 { 712 /** @todo r=bird: See first error push_back in MachineMoveVM::i_MoveVMThreadTask */ 719 713 Utf8StrFmt errorDesc("Could not copy state file '%s' to '%s' (%Rrc)", 720 714 sst.strSaveStateFile.c_str(), strTrgSaveState.c_str(), vrc); … … 755 749 756 750 hrc = taskMoveVM->m_pProgress->SetNextOperation(BstrFmt(machine->tr("Copy Machine settings file '%s' ..."), 757 (*machineConfFile).machineUserData.strName.c_str()).raw(), 1); 751 (*machineConfFile).machineUserData.strName.c_str()).raw(), 752 1); 758 753 if (FAILED(hrc)) 759 754 throw hrc; … … 767 762 if (RT_FAILURE(vrc)) 768 763 { 764 /** @todo r=bird: See first error push_back in MachineMoveVM::i_MoveVMThreadTask */ 769 765 Utf8StrFmt errorDesc("Could not create a home machine folder '%s' (%Rrc)", 770 766 strTargetSettingsFilePath.c_str(), vrc); … … 795 791 if (RT_FAILURE(vrc)) 796 792 { 793 /** @todo r=bird: See first error push_back in MachineMoveVM::i_MoveVMThreadTask */ 797 794 Utf8StrFmt errorDesc("Could not copy the setting file '%s' to '%s' (%Rrc)", 798 795 strSettingsFilePath.c_str(), strTargetSettingsFilePath.stripFilename().c_str(), vrc); … … 802 799 } 803 800 804 Log2(("The setting file %s has been copied into the folder %s\n", strSettingsFilePath.c_str(),805 801 Log2(("The setting file %s has been copied into the folder %s\n", 802 strSettingsFilePath.c_str(), strTargetSettingsFilePath.stripFilename().c_str())); 806 803 807 804 /* save new file in case of restoring */ … … 813 810 /* Moving Machine log files */ 814 811 { 815 Log2(("Copy machine log files 812 Log2(("Copy machine log files\n")); 816 813 817 814 if (taskMoveVM->m_vmFolders[VBox_LogFolder].isNotEmpty()) … … 829 826 if (RT_FAILURE(vrc)) 830 827 { 828 /** @todo r=bird: See first error push_back in MachineMoveVM::i_MoveVMThreadTask */ 831 829 Utf8StrFmt errorDesc("Could not create log folder '%s' (%Rrc)", 832 830 strTargetLogFolderPath.c_str(), vrc); … … 851 849 /* Move to next sub-operation. */ 852 850 hrc = taskMoveVM->m_pProgress->SetNextOperation(BstrFmt(machine->tr("Copying the log file '%s' ..."), 853 RTPathFilename(strFullSourceFilePath.c_str())).raw(),851 RTPathFilename(strFullSourceFilePath.c_str())).raw(), 854 852 1); 855 853 if (FAILED(hrc)) … … 860 858 if (RT_FAILURE(vrc)) 861 859 { 860 /** @todo r=bird: See first error push_back in MachineMoveVM::i_MoveVMThreadTask */ 862 861 Utf8StrFmt errorDesc("Could not copy the log file '%s' to '%s' (%Rrc)", 863 862 strFullSourceFilePath.c_str(), … … 1143 1142 strTargetImageName.append(RTPATH_DELIMITER).append(strLocation); 1144 1143 rc = m_pProgress->SetNextOperation(BstrFmt(machine->tr("Moving medium '%ls' ..."), 1145 bstrSrcName.raw()).raw(),1146 1144 bstrSrcName.raw()).raw(), 1145 mt.uWeight); 1147 1146 if (FAILED(rc)) throw rc; 1148 1147 } … … 1151 1150 strTargetImageName = mt.strBaseName;//Should contain full path to the image 1152 1151 rc = m_pProgress->SetNextOperation(BstrFmt(machine->tr("Moving medium '%ls' back..."), 1153 bstrSrcName.raw()).raw(),1154 1152 bstrSrcName.raw()).raw(), 1153 mt.uWeight); 1155 1154 if (FAILED(rc)) throw rc; 1156 1155 } … … 1277 1276 if (RT_SUCCESS(vrc)) 1278 1277 { 1278 /** @todo r=bird: RTDIRENTRY is big and this function is doing 1279 * unrestrained recursion of arbritrary depth. Four things: 1280 * - Add a depth counter parameter and refuse to go deeper than 1281 * a certain reasonable limit. 1282 * - Split this method into a main and a worker, placing 1283 * RTDIRENTRY on the stack in the main and passing it onto to 1284 * worker as a parameter. 1285 * - RTDirRead may fail for reasons other than 1286 * VERR_NO_MORE_FILES. For instance someone could create an 1287 * entry with a name longer than RTDIRENTRY have space to 1288 * store (windows host with UTF-16 encoding shorter than 255 1289 * chars, but UTF-8 encoding longer than 260). 1290 * - enmType can be RTDIRENTRYTYPE_UNKNOWN if the file system or 1291 * the host doesn't return the information. See 1292 * RTDIRENTRY::enmType. Use RTDirQueryUnknownType() to get the 1293 * actual type. */ 1279 1294 RTDIRENTRY DirEntry; 1280 1295 while (RT_SUCCESS(RTDirRead(hDir, &DirEntry, NULL))) … … 1303 1318 else if (vrc == VERR_FILE_NOT_FOUND) 1304 1319 { 1320 /** @todo r=bird: See first error push_back in MachineMoveVM::i_MoveVMThreadTask */ 1305 1321 Utf8StrFmt errorDesc("Folder '%s' doesn't exist (%Rrc)", strRootFolder.c_str(), vrc); 1306 1322 m_errorsList.push_back(ErrorInfoItem(VERR_FILE_NOT_FOUND, errorDesc.c_str())); … … 1310 1326 else 1311 1327 { 1328 /** @todo r=bird: See first error push_back in MachineMoveVM::i_MoveVMThreadTask */ 1312 1329 Utf8StrFmt errorDesc("Could not open folder '%s' (%Rrc)", strRootFolder.c_str(), vrc); 1313 1330 m_errorsList.push_back(ErrorInfoItem(VBOX_E_IPRT_ERROR, errorDesc.c_str())); … … 1334 1351 if (RT_FAILURE(vrc)) 1335 1352 { 1353 /** @todo r=bird: See first error push_back in MachineMoveVM::i_MoveVMThreadTask */ 1336 1354 Utf8StrFmt errorDesc("Could not delete file '%s' (%Rrc)", listOfFiles.at(i).c_str(), hrc); 1337 1355 m_errorsList.push_back(ErrorInfoItem(VBOX_E_IPRT_ERROR, errorDesc.c_str())); … … 1343 1361 } 1344 1362 } 1345 catch (HRESULT aRc)1363 catch (HRESULT aRc) /** @todo r=bird: Pointless as you do nada beyond this point, so just return instead of throw hrc above! */ 1346 1364 { 1347 1365 hrc = aRc; 1348 1366 } 1349 catch (...) 1367 catch (...) /** @todo appendAndSetErrorXxxx could make this unnecessary too! */ 1350 1368 { 1351 1369 hrc = VirtualBoxBase::handleUnexpectedExceptions(m_pMachine, RT_SRC_POS); … … 1381 1399 else 1382 1400 { 1383 Utf8StrFmt errorDesc("Could not get the size of file '%s' (%Rrc)", fullPath.c_str(), vrc); 1401 /** @todo r=bird: See first error push_back in MachineMoveVM::i_MoveVMThreadTask */ 1402 Utf8StrFmt errorDesc("Could not get the size of file '%s': %Rrc", fullPath.c_str(), vrc); 1384 1403 m_errorsList.push_back(ErrorInfoItem(VBOX_E_IPRT_ERROR, errorDesc.c_str())); 1385 1404 … … 1413 1432 std::vector< ComObjPtr<Machine> > &aMachineList) const 1414 1433 { 1415 HRESULT rc = S_OK;1416 1434 Bstr name; 1417 rc = pSnapshot->COMGETTER(Name)(name.asOutParam());1435 HRESULT rc = pSnapshot->COMGETTER(Name)(name.asOutParam()); 1418 1436 if (FAILED(rc)) return rc; 1419 1437 … … 1475 1493 try 1476 1494 { 1477 bool fPass = isMediumTypeSupportedForMoving (pMedium);1478 if (!fPass)1495 bool fPass = isMediumTypeSupportedForMovingThrowsHresult(pMedium); 1496 if (!fPass) 1479 1497 { 1480 Log2(("Skipping file % s because of this medium type hasn't been supported for moving.\n",1481 Utf8Str(bstrLocation.raw()).c_str()));1498 Log2(("Skipping file %ls because of this medium type hasn't been supported for moving.\n", 1499 bstrLocation.raw())); 1482 1500 continue; 1483 1501 } 1484 } catch (HRESULT aRc) 1502 } 1503 catch (HRESULT aRc) 1485 1504 { 1486 1505 return aRc; … … 1512 1531 MEDIUMTASKMOVE mt;// = {false, "basename", NULL, 0, 0}; 1513 1532 mt.strBaseName = bstrLocation; 1514 Utf8Str strFolder = m_vmFolders[VBox_SnapshotFolder]; 1515 if (strFolder.isNotEmpty() && mt.strBaseName.contains(strFolder)) 1516 { 1533 Utf8Str const &strFolder = m_vmFolders[VBox_SnapshotFolder]; 1534 if (strFolder.isNotEmpty() && mt.strBaseName.contains(strFolder)) /** @todo r=bird: contains? Shouldn't it be startsWith and take mixed slashes (windows) and stuff into account? */ 1517 1535 mt.fSnapshot = true; 1518 }1519 1536 else 1520 1537 mt.fSnapshot = false; … … 1567 1584 if (RT_FAILURE(vrc)) 1568 1585 { 1586 /** @todo r=bird: See first error push_back in MachineMoveVM::i_MoveVMThreadTask */ 1569 1587 Utf8StrFmt errorDesc("Could not get file size of '%s' (%Rrc)", sst.strSaveStateFile.c_str(), vrc); 1570 1588 m_errorsList.push_back(ErrorInfoItem(VBOX_E_IPRT_ERROR, errorDesc.c_str())); … … 1605 1623 } 1606 1624 1607 bool MachineMoveVM::isMediumTypeSupportedForMoving(const ComPtr<IMedium> &pMedium) 1625 /** @todo r=bird: An option better than throwing stuff here would be to use S_OK 1626 * for true, S_FALSE for false and other values for errors. 1627 * UnattendedImpl.cpp and others does this. */ 1628 bool MachineMoveVM::isMediumTypeSupportedForMovingThrowsHresult(const ComPtr<IMedium> &pMedium) 1608 1629 { 1609 HRESULT rc = S_OK; 1630 HRESULT rc = S_OK; /** @todo r=bird: This mess with my brain. Assigning S_OK and then first use is receiving the return 1631 * value of a call. That's plain copy&past lazyness and deliberate code obfuscation. */ 1610 1632 bool fSupported = true; 1611 1633 Bstr bstrLocation; … … 1613 1635 if (FAILED(rc)) 1614 1636 { 1615 fSupported = false; 1637 fSupported = false; /** @todo r=bird: Why waste time setting fSupport here?? */ 1616 1638 throw rc; 1617 1639 } … … 1646 1668 { 1647 1669 Log2(("Skipping medium %s. VHDX format is supported in \"read-only\" mode only. \n", 1648 Utf8Str(bstrLocation.raw()).c_str())); 1649 fSupported = false; 1670 Utf8Str(bstrLocation.raw()).c_str())); /** @todo r=bird: You should log UTF-16 string directly using \%ls. */ 1671 fSupported = false; /** @todo return immediately? */ 1650 1672 } 1651 1673 … … 1668 1690 1669 1691 //only ISO image is moved. Otherwise adding some information into log file 1692 /** @todo r=bird: Log2 is only doing debug logging, so perhaps LogRel() 1693 * here or fix the comment. */ 1670 1694 bool fIso = ext.endsWith(".iso", Utf8Str::CaseInsensitive); 1671 1695 if (fIso == false)
Note:
See TracChangeset
for help on using the changeset viewer.