bool SourceVisitor::Visit(BPartition *partition, int32 level) { BPath path; if (partition->GetPath(&path) == B_OK) printf("SourceVisitor::Visit(BPartition *) : %s\n", path.Path()); printf("SourceVisitor::Visit(BPartition *) : %s\n", partition->ContentName()); if (partition->ContentType() == NULL) return false; bool isBootPartition = false; if (partition->IsMounted()) { BPath mountPoint; partition->GetMountPoint(&mountPoint); isBootPartition = strcmp(BOOT_PATH, mountPoint.Path()) == 0; } if (!isBootPartition && strcmp(partition->ContentType(), kPartitionTypeBFS) != 0) { // Except only BFS partitions, except this is the boot partition // (ISO9660 with write overlay for example). return false; } // TODO: We could probably check if this volume contains // the Haiku kernel or something. Does it make sense to "install" // from your BFS volume containing the music collection? // TODO: Then the check for BFS could also be removed above. char label[255]; char menuLabel[255]; make_partition_label(partition, label, menuLabel, false); PartitionMenuItem* item = new PartitionMenuItem(partition->ContentName(), label, menuLabel, new BMessage(SOURCE_PARTITION), partition->ID()); item->SetMarked(isBootPartition); fMenu->AddItem(item); return false; }
void InstallerWindow::_UpdateControls() { PartitionMenuItem* srcItem = (PartitionMenuItem*)fSrcMenu->FindMarked(); BString label; if (srcItem) { label = srcItem->MenuLabel(); } else { if (fSrcMenu->CountItems() == 0) label = TR_CMT("<none>", "No partition available"); else label = ((PartitionMenuItem*)fSrcMenu->ItemAt(0))->MenuLabel(); } fSrcMenuField->MenuItem()->SetLabel(label.String()); // Disable any unsuitable target items, check if at least one partition // is suitable. bool foundOneSuitableTarget = false; for (int32 i = fDestMenu->CountItems() - 1; i >= 0; i--) { PartitionMenuItem* dstItem = (PartitionMenuItem*)fDestMenu->ItemAt(i); if (srcItem != NULL && dstItem->ID() == srcItem->ID()) { // Prevent the user from having picked the same partition as source // and destination. dstItem->SetEnabled(false); dstItem->SetMarked(false); } else dstItem->SetEnabled(dstItem->IsValidTarget()); if (dstItem->IsEnabled()) foundOneSuitableTarget = true; } PartitionMenuItem* dstItem = (PartitionMenuItem*)fDestMenu->FindMarked(); if (dstItem) { label = dstItem->MenuLabel(); } else { if (fDestMenu->CountItems() == 0) label = TR_CMT("<none>", "No partition available"); else label = TR("Please choose target"); } fDestMenuField->MenuItem()->SetLabel(label.String()); if (srcItem && dstItem) { char message[255]; sprintf(message, TR("Press the Begin button to install from '%1s' " "onto '%2s'."), srcItem->Name(), dstItem->Name()); _SetStatusMessage(message); } else if (srcItem) { _SetStatusMessage(TR("Choose the disk you want to install onto from " "the pop-up menu. Then click \"Begin\".")); } else if (dstItem) { _SetStatusMessage(TR("Choose the source disk from the " "pop-up menu. Then click \"Begin\".")); } else { _SetStatusMessage(TR("Choose the source and destination disk from the " "pop-up menus. Then click \"Begin\".")); } fInstallStatus = kReadyForInstall; fBeginButton->SetLabel(TR("Begin")); fBeginButton->SetEnabled(srcItem && dstItem); // adjust "Write Boot Sector" button if (dstItem) { char buffer[256]; snprintf(buffer, sizeof(buffer), TR("Write boot sector to '%s'"), dstItem->Name()); label = buffer; } else label = TR("Write boot sector"); fMakeBootableButton->SetEnabled(dstItem); fMakeBootableButton->SetLabel(label.String()); if (!fEncouragedToSetupPartitions && !foundOneSuitableTarget) { // Focus the users attention on the DriveSetup button fEncouragedToSetupPartitions = true; PostMessage(ENCOURAGE_DRIVESETUP); } }