better handles error and cancellation when copying

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25772 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Jérôme Duval
2008-06-02 22:34:48 +00:00
parent 1d0b3c1590
commit 87905063c3
3 changed files with 25 additions and 13 deletions
+22 -10
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 2005-2006, Jérôme DUVAL. All rights reserved. * Copyright 2005-2008, Jérôme DUVAL. All rights reserved.
* Distributed under the terms of the MIT License. * Distributed under the terms of the MIT License.
*/ */
@@ -76,7 +76,10 @@ CopyEngine::MessageReceived(BMessage*msg)
fWindow->GetTargetMenu()); fWindow->GetTargetMenu());
if (err != B_OK) { if (err != B_OK) {
ERR("Start failed"); ERR("Start failed");
SetStatusMessage("Installation aborted.");
BMessenger(fWindow).SendMessage(RESET_INSTALL); BMessenger(fWindow).SendMessage(RESET_INSTALL);
} else {
BMessenger(fWindow).SendMessage(INSTALL_FINISHED);
} }
break; break;
} }
@@ -229,7 +232,10 @@ CopyEngine::Start(BMenu *srcMenu, BMenu *targetMenu)
// copy source volume // copy source volume
BDirectory targetDir(targetDirectory.Path()); BDirectory targetDir(targetDirectory.Path());
BDirectory srcDir(srcDirectory.Path()); BDirectory srcDir(srcDirectory.Path());
CopyFolder(srcDir, targetDir); err = CopyFolder(srcDir, targetDir);
if (err != B_OK)
return err;
// copy selected packages // copy selected packages
if (fPackages) { if (fPackages) {
@@ -239,25 +245,28 @@ CopyEngine::Start(BMenu *srcMenu, BMenu *targetMenu)
int32 count = fPackages->CountItems(); int32 count = fPackages->CountItems();
for (int32 i = 0; i < count; i++) { for (int32 i = 0; i < count; i++) {
if (fControl->CheckUserCanceled()) if (fControl->CheckUserCanceled())
return B_OK; return B_CANCELED;
Package *p = static_cast<Package*>(fPackages->ItemAt(i)); Package *p = static_cast<Package*>(fPackages->ItemAt(i));
packageDir.SetTo(&srcDir, p->Folder()); packageDir.SetTo(&srcDir, p->Folder());
CopyFolder(packageDir, targetDir); err = CopyFolder(packageDir, targetDir);
if (err != B_OK)
break;
} }
} }
if (!fControl->CheckUserCanceled()) { if (err != B_OK)
LaunchFinishScript(targetDirectory); return err;
BMessage msg(INSTALL_FINISHED); if (fControl->CheckUserCanceled())
BMessenger(fWindow).SendMessage(&msg); return B_CANCELED;
}
LaunchFinishScript(targetDirectory);
return B_OK; return B_OK;
} }
void status_t
CopyEngine::CopyFolder(BDirectory &srcDir, BDirectory &targetDir) CopyEngine::CopyFolder(BDirectory &srcDir, BDirectory &targetDir)
{ {
BEntry entry; BEntry entry;
@@ -283,8 +292,11 @@ CopyEngine::CopyFolder(BDirectory &srcDir, BDirectory &targetDir)
BPath path; BPath path;
entry.GetPath(&path); entry.GetPath(&path);
ERR2("error while copying %s", path.Path()); ERR2("error while copying %s", path.Path());
return err;
} }
} }
return B_OK;
} }
+1 -1
View File
@@ -32,7 +32,7 @@ class CopyEngine : public BLooper {
private: private:
void LaunchInitScript(BPath &path); void LaunchInitScript(BPath &path);
void LaunchFinishScript(BPath &path); void LaunchFinishScript(BPath &path);
void CopyFolder(BDirectory &srcDir, BDirectory &targetDir); status_t CopyFolder(BDirectory &srcDir, BDirectory &targetDir);
InstallerWindow *fWindow; InstallerWindow *fWindow;
BDiskDeviceRoster fDDRoster; BDiskDeviceRoster fDDRoster;
+2 -2
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 2005, Jérôme DUVAL. All rights reserved. * Copyright 2005-2008, Jérôme DUVAL. All rights reserved.
* Distributed under the terms of the MIT License. * Distributed under the terms of the MIT License.
*/ */
@@ -213,7 +213,6 @@ InstallerWindow::MessageReceived(BMessage *msg)
if (fCopyEngine->Cancel()) { if (fCopyEngine->Cancel()) {
fInstallStatus = kCancelled; fInstallStatus = kCancelled;
SetStatusMessage("Installation cancelled."); SetStatusMessage("Installation cancelled.");
PostMessage(RESET_INSTALL);
} }
break; break;
case kFinished: case kFinished:
@@ -263,6 +262,7 @@ InstallerWindow::MessageReceived(BMessage *msg)
} }
case INSTALL_FINISHED: case INSTALL_FINISHED:
fBeginButton->SetLabel("Quit"); fBeginButton->SetLabel("Quit");
SetStatusMessage("Installation completed.");
fInstallStatus = kFinished; fInstallStatus = kFinished;
DisableInterface(false); DisableInterface(false);
break; break;