* added checks for installing on source volume, or boot volume
* added alert for file error: lots of errors happening when updating a volume: * it seems BEntry::IsDirectory() returns false whereas it should return true for some directories this is to be checked with a test app * boot volume is now marked automatically as the source volume (a rule is yet to be found for the target volume) git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@16066 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
19de443e9a
commit
bc1301d336
@ -8,9 +8,10 @@
|
|||||||
#include "PartitionMenuItem.h"
|
#include "PartitionMenuItem.h"
|
||||||
#include "FSUndoRedo.h"
|
#include "FSUndoRedo.h"
|
||||||
#include "FSUtils.h"
|
#include "FSUtils.h"
|
||||||
#include <FindDirectory.h>
|
#include <Alert.h>
|
||||||
#include <DiskDeviceVisitor.h>
|
#include <DiskDeviceVisitor.h>
|
||||||
#include <DiskDeviceTypes.h>
|
#include <DiskDeviceTypes.h>
|
||||||
|
#include <FindDirectory.h>
|
||||||
#include <Path.h>
|
#include <Path.h>
|
||||||
#include <String.h>
|
#include <String.h>
|
||||||
#include <VolumeRoster.h>
|
#include <VolumeRoster.h>
|
||||||
@ -22,6 +23,8 @@
|
|||||||
#define CALLED()
|
#define CALLED()
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
const char BOOT_PATH[] = "/boot";
|
||||||
|
|
||||||
extern void SizeAsString(off_t size, char *string);
|
extern void SizeAsString(off_t size, char *string);
|
||||||
|
|
||||||
class SourceVisitor : public BDiskDeviceVisitor
|
class SourceVisitor : public BDiskDeviceVisitor
|
||||||
@ -127,6 +130,10 @@ CopyEngine::Start(BMenu *srcMenu, BMenu *targetMenu)
|
|||||||
} else
|
} else
|
||||||
return; // shouldn't happen
|
return; // shouldn't happen
|
||||||
|
|
||||||
|
// check if target is initialized
|
||||||
|
// ask if init or mount as is
|
||||||
|
// check if target has enough space
|
||||||
|
|
||||||
BPath srcDirectory;
|
BPath srcDirectory;
|
||||||
if (fDDRoster.GetPartitionWithID(srcItem->ID(), &device, &partition) == B_OK) {
|
if (fDDRoster.GetPartitionWithID(srcItem->ID(), &device, &partition) == B_OK) {
|
||||||
if (partition->GetMountPoint(&srcDirectory)!=B_OK)
|
if (partition->GetMountPoint(&srcDirectory)!=B_OK)
|
||||||
@ -137,23 +144,20 @@ CopyEngine::Start(BMenu *srcMenu, BMenu *targetMenu)
|
|||||||
} else
|
} else
|
||||||
return; // shouldn't happen
|
return; // shouldn't happen
|
||||||
|
|
||||||
// check not installing on boot volume
|
// check not installing on itself
|
||||||
BVolume bootVolume;
|
if (strcmp(srcDirectory.Path(), targetDirectory.Path()) == 0) {
|
||||||
BDirectory bootDir;
|
SetStatusMessage("You can't install the contents of a disk onto itself. Please choose a different disk.");
|
||||||
BEntry bootEntry;
|
return;
|
||||||
BPath bootPath;
|
}
|
||||||
BVolumeRoster().GetBootVolume(&bootVolume);
|
|
||||||
bootVolume.GetRootDirectory(&bootDir);
|
// check not installing on boot volume
|
||||||
bootDir.GetEntry(&bootEntry);
|
if ((strncmp(BOOT_PATH, targetDirectory.Path(), strlen(BOOT_PATH)) == 0)
|
||||||
bootEntry.GetPath(&bootPath);
|
&& ((new BAlert("", "Are you sure you want to install onto the current boot disk? \
|
||||||
printf("Copying to boot disk ? '%s' / '%s'\n", bootPath.Path(), targetDirectory.Path());
|
The installer will have to reboot your machine if you proceed.", "OK", "Cancel", 0,
|
||||||
if (strncmp(bootPath.Path(), targetDirectory.Path(), strlen(bootPath.Path())) == 0) {
|
B_WIDTH_AS_USUAL, B_STOP_ALERT))->Go() != 0)) {
|
||||||
|
SetStatusMessage("Installation stopped.");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// check if target is initialized
|
|
||||||
|
|
||||||
// ask if init ou mount as is
|
|
||||||
|
|
||||||
LaunchInitScript(targetDirectory);
|
LaunchInitScript(targetDirectory);
|
||||||
|
|
||||||
@ -163,10 +167,10 @@ CopyEngine::Start(BMenu *srcMenu, BMenu *targetMenu)
|
|||||||
CopyFolder(srcDir, targetDir);
|
CopyFolder(srcDir, targetDir);
|
||||||
|
|
||||||
// copy selected packages
|
// copy selected packages
|
||||||
srcDirectory.Append(PACKAGES_DIRECTORY);
|
|
||||||
srcDir.SetTo(srcDirectory.Path());
|
|
||||||
BDirectory packageDir;
|
|
||||||
if (fPackages) {
|
if (fPackages) {
|
||||||
|
srcDirectory.Append(PACKAGES_DIRECTORY);
|
||||||
|
srcDir.SetTo(srcDirectory.Path());
|
||||||
|
BDirectory packageDir;
|
||||||
int32 count = fPackages->CountItems();
|
int32 count = fPackages->CountItems();
|
||||||
for (int32 i=0; i<count; i++) {
|
for (int32 i=0; i<count; i++) {
|
||||||
Package *p = static_cast<Package*>(fPackages->ItemAt(i));
|
Package *p = static_cast<Package*>(fPackages->ItemAt(i));
|
||||||
@ -176,6 +180,9 @@ CopyEngine::Start(BMenu *srcMenu, BMenu *targetMenu)
|
|||||||
}
|
}
|
||||||
|
|
||||||
LaunchFinishScript(targetDirectory);
|
LaunchFinishScript(targetDirectory);
|
||||||
|
|
||||||
|
BMessage msg(INSTALL_FINISHED);
|
||||||
|
BMessenger(fWindow).SendMessage(&msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -240,7 +247,14 @@ SourceVisitor::Visit(BDiskDevice *device)
|
|||||||
if (device->GetPath(&path)==B_OK)
|
if (device->GetPath(&path)==B_OK)
|
||||||
printf("SourceVisitor::Visit(BDiskDevice *) : %s type:%s, contentType:%s\n",
|
printf("SourceVisitor::Visit(BDiskDevice *) : %s type:%s, contentType:%s\n",
|
||||||
path.Path(), device->Type(), device->ContentType());
|
path.Path(), device->Type(), device->ContentType());
|
||||||
fMenu->AddItem(new PartitionMenuItem(NULL, device->ContentName(), NULL, new BMessage(SRC_PARTITION), device->ID()));
|
PartitionMenuItem *item = new PartitionMenuItem(NULL, device->ContentName(), NULL, new BMessage(SRC_PARTITION), device->ID());
|
||||||
|
if (device->IsMounted()) {
|
||||||
|
BPath mountPoint;
|
||||||
|
device->GetMountPoint(&mountPoint);
|
||||||
|
if (strcmp(BOOT_PATH, mountPoint.Path())==0)
|
||||||
|
item->SetMarked(true);
|
||||||
|
}
|
||||||
|
fMenu->AddItem(item);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -254,7 +268,14 @@ SourceVisitor::Visit(BPartition *partition, int32 level)
|
|||||||
if (partition->GetPath(&path)==B_OK)
|
if (partition->GetPath(&path)==B_OK)
|
||||||
printf("SourceVisitor::Visit(BPartition *) : %s\n", path.Path());
|
printf("SourceVisitor::Visit(BPartition *) : %s\n", path.Path());
|
||||||
printf("SourceVisitor::Visit(BPartition *) : %s\n", partition->Name());
|
printf("SourceVisitor::Visit(BPartition *) : %s\n", partition->Name());
|
||||||
fMenu->AddItem(new PartitionMenuItem(NULL, partition->ContentName(), NULL, new BMessage(SRC_PARTITION), partition->ID()));
|
PartitionMenuItem *item = new PartitionMenuItem(NULL, partition->ContentName(), NULL, new BMessage(SRC_PARTITION), partition->ID());
|
||||||
|
if (partition->IsMounted()) {
|
||||||
|
BPath mountPoint;
|
||||||
|
partition->GetMountPoint(&mountPoint);
|
||||||
|
if (strcmp(BOOT_PATH, mountPoint.Path())==0)
|
||||||
|
item->SetMarked(true);
|
||||||
|
}
|
||||||
|
fMenu->AddItem(item);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
*/
|
*/
|
||||||
#include "InstallerCopyLoopControl.h"
|
#include "InstallerCopyLoopControl.h"
|
||||||
#include "InstallerWindow.h"
|
#include "InstallerWindow.h"
|
||||||
|
#include <Alert.h>
|
||||||
|
|
||||||
InstallerCopyLoopControl::InstallerCopyLoopControl(InstallerWindow *window)
|
InstallerCopyLoopControl::InstallerCopyLoopControl(InstallerWindow *window)
|
||||||
: fWindow(window),
|
: fWindow(window),
|
||||||
@ -17,6 +18,15 @@ bool
|
|||||||
InstallerCopyLoopControl::FileError(const char *message, const char *name, status_t error,
|
InstallerCopyLoopControl::FileError(const char *message, const char *name, status_t error,
|
||||||
bool allowContinue)
|
bool allowContinue)
|
||||||
{
|
{
|
||||||
|
char buffer[512];
|
||||||
|
sprintf(buffer, message, name, strerror(error));
|
||||||
|
|
||||||
|
if (allowContinue)
|
||||||
|
return (new BAlert("", buffer, "Cancel", "OK", 0,
|
||||||
|
B_WIDTH_AS_USUAL, B_STOP_ALERT))->Go() != 0;
|
||||||
|
|
||||||
|
(new BAlert("", buffer, "Cancel", 0, 0,
|
||||||
|
B_WIDTH_AS_USUAL, B_STOP_ALERT))->Go();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -171,6 +171,7 @@ InstallerWindow::MessageReceived(BMessage *msg)
|
|||||||
fPackagesView->GetPackagesToInstall(list, &size);
|
fPackagesView->GetPackagesToInstall(list, &size);
|
||||||
fCopyEngine->SetPackagesList(list);
|
fCopyEngine->SetPackagesList(list);
|
||||||
BMessenger(fCopyEngine).SendMessage(ENGINE_START);
|
BMessenger(fCopyEngine).SendMessage(ENGINE_START);
|
||||||
|
DisableInterface(true);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SHOW_BOTTOM_MESSAGE:
|
case SHOW_BOTTOM_MESSAGE:
|
||||||
@ -199,13 +200,21 @@ InstallerWindow::MessageReceived(BMessage *msg)
|
|||||||
if (msg->FindString("status", &status) == B_OK)
|
if (msg->FindString("status", &status) == B_OK)
|
||||||
SetStatusMessage(status);
|
SetStatusMessage(status);
|
||||||
}
|
}
|
||||||
|
case INSTALL_FINISHED:
|
||||||
|
DisableInterface(false);
|
||||||
|
break;
|
||||||
case B_SOME_APP_LAUNCHED:
|
case B_SOME_APP_LAUNCHED:
|
||||||
case B_SOME_APP_QUIT:
|
case B_SOME_APP_QUIT:
|
||||||
{
|
{
|
||||||
const char *signature;
|
const char *signature;
|
||||||
if (msg->FindString("be:signature", &signature)==B_OK
|
if (msg->FindString("be:signature", &signature)==B_OK
|
||||||
&& strcasecmp(signature, DRIVESETUP_SIG)==0) {
|
&& strcasecmp(signature, DRIVESETUP_SIG)==0) {
|
||||||
DisableInterface(msg->what == B_SOME_APP_LAUNCHED);
|
fDriveSetupLaunched = msg->what == B_SOME_APP_LAUNCHED;
|
||||||
|
DisableInterface(fDriveSetupLaunched);
|
||||||
|
if (fDriveSetupLaunched)
|
||||||
|
SetStatusMessage("Running DriveSetup" B_UTF8_ELLIPSIS "\nClose DriveSetup to continue with the\ninstallation.");
|
||||||
|
else
|
||||||
|
StartScan();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -263,16 +272,10 @@ InstallerWindow::LaunchDriveSetup()
|
|||||||
void
|
void
|
||||||
InstallerWindow::DisableInterface(bool disable)
|
InstallerWindow::DisableInterface(bool disable)
|
||||||
{
|
{
|
||||||
if (!disable) {
|
|
||||||
StartScan();
|
|
||||||
}
|
|
||||||
fDriveSetupLaunched = disable;
|
|
||||||
fBeginButton->SetEnabled(!disable);
|
fBeginButton->SetEnabled(!disable);
|
||||||
fSetupButton->SetEnabled(!disable);
|
fSetupButton->SetEnabled(!disable);
|
||||||
fSrcMenuField->SetEnabled(!disable);
|
fSrcMenuField->SetEnabled(!disable);
|
||||||
fDestMenuField->SetEnabled(!disable);
|
fDestMenuField->SetEnabled(!disable);
|
||||||
if (disable)
|
|
||||||
SetStatusMessage("Running DriveSetup" B_UTF8_ELLIPSIS "\nClose DriveSetup to continue with the\ninstallation.");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
#define INSTALLER_RIGHT 402
|
#define INSTALLER_RIGHT 402
|
||||||
|
|
||||||
const uint32 STATUS_MESSAGE = 'iSTM';
|
const uint32 STATUS_MESSAGE = 'iSTM';
|
||||||
|
const uint32 INSTALL_FINISHED = 'iIFN';
|
||||||
const char PACKAGES_DIRECTORY[] = "_packages_";
|
const char PACKAGES_DIRECTORY[] = "_packages_";
|
||||||
|
|
||||||
class InstallerWindow : public BWindow {
|
class InstallerWindow : public BWindow {
|
||||||
|
Loading…
Reference in New Issue
Block a user