From 87905063c3507da17f019b07f4b370cfe1fb319f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Mon, 2 Jun 2008 22:34:48 +0000 Subject: [PATCH] better handles error and cancellation when copying git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25772 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/apps/installer/CopyEngine.cpp | 32 ++++++++++++++++++-------- src/apps/installer/CopyEngine.h | 2 +- src/apps/installer/InstallerWindow.cpp | 4 ++-- 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/src/apps/installer/CopyEngine.cpp b/src/apps/installer/CopyEngine.cpp index e5134800fe..2297f94d3b 100644 --- a/src/apps/installer/CopyEngine.cpp +++ b/src/apps/installer/CopyEngine.cpp @@ -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. */ @@ -76,7 +76,10 @@ CopyEngine::MessageReceived(BMessage*msg) fWindow->GetTargetMenu()); if (err != B_OK) { ERR("Start failed"); + SetStatusMessage("Installation aborted."); BMessenger(fWindow).SendMessage(RESET_INSTALL); + } else { + BMessenger(fWindow).SendMessage(INSTALL_FINISHED); } break; } @@ -229,7 +232,10 @@ CopyEngine::Start(BMenu *srcMenu, BMenu *targetMenu) // copy source volume BDirectory targetDir(targetDirectory.Path()); BDirectory srcDir(srcDirectory.Path()); - CopyFolder(srcDir, targetDir); + err = CopyFolder(srcDir, targetDir); + + if (err != B_OK) + return err; // copy selected packages if (fPackages) { @@ -239,25 +245,28 @@ CopyEngine::Start(BMenu *srcMenu, BMenu *targetMenu) int32 count = fPackages->CountItems(); for (int32 i = 0; i < count; i++) { if (fControl->CheckUserCanceled()) - return B_OK; + return B_CANCELED; Package *p = static_cast(fPackages->ItemAt(i)); packageDir.SetTo(&srcDir, p->Folder()); - CopyFolder(packageDir, targetDir); + err = CopyFolder(packageDir, targetDir); + if (err != B_OK) + break; } } - if (!fControl->CheckUserCanceled()) { - LaunchFinishScript(targetDirectory); + if (err != B_OK) + return err; - BMessage msg(INSTALL_FINISHED); - BMessenger(fWindow).SendMessage(&msg); - } + if (fControl->CheckUserCanceled()) + return B_CANCELED; + + LaunchFinishScript(targetDirectory); return B_OK; } -void +status_t CopyEngine::CopyFolder(BDirectory &srcDir, BDirectory &targetDir) { BEntry entry; @@ -283,8 +292,11 @@ CopyEngine::CopyFolder(BDirectory &srcDir, BDirectory &targetDir) BPath path; entry.GetPath(&path); ERR2("error while copying %s", path.Path()); + return err; } } + + return B_OK; } diff --git a/src/apps/installer/CopyEngine.h b/src/apps/installer/CopyEngine.h index 2c42fd4de6..9f9c76039a 100644 --- a/src/apps/installer/CopyEngine.h +++ b/src/apps/installer/CopyEngine.h @@ -32,7 +32,7 @@ class CopyEngine : public BLooper { private: void LaunchInitScript(BPath &path); void LaunchFinishScript(BPath &path); - void CopyFolder(BDirectory &srcDir, BDirectory &targetDir); + status_t CopyFolder(BDirectory &srcDir, BDirectory &targetDir); InstallerWindow *fWindow; BDiskDeviceRoster fDDRoster; diff --git a/src/apps/installer/InstallerWindow.cpp b/src/apps/installer/InstallerWindow.cpp index d969345de0..fdb020b60e 100644 --- a/src/apps/installer/InstallerWindow.cpp +++ b/src/apps/installer/InstallerWindow.cpp @@ -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. */ @@ -213,7 +213,6 @@ InstallerWindow::MessageReceived(BMessage *msg) if (fCopyEngine->Cancel()) { fInstallStatus = kCancelled; SetStatusMessage("Installation cancelled."); - PostMessage(RESET_INSTALL); } break; case kFinished: @@ -263,6 +262,7 @@ InstallerWindow::MessageReceived(BMessage *msg) } case INSTALL_FINISHED: fBeginButton->SetLabel("Quit"); + SetStatusMessage("Installation completed."); fInstallStatus = kFinished; DisableInterface(false); break;