Patch by Bryce Groff with changes by myself:

* Added missing name parameter to the partitioning system module child creation
  and child creation validation hooks. Pass the name to them.
* Added BPartitionParameterEditor interface, which is/will be used for editing
  disk system specific parameters.
* Implemented partition parameter editors for BFS initialization and Intel
  partition map child creation.
* Fixed the incorrect supported child partition type iteration in the Intel
  partition map add-on. It does now return actual types.
* Handle the "active" flag parameter in the Intel partitioning system module.
* DriveSetup:
  - Replaced the "Create" submenu by a simple menu item. The type can now by
    chosen in the dialog.
  - Make use of initialization and child creation parameter editors. Some
    non-generic code has been moved to the respective editor implementations
    (BFS, intel partitioning system).


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@31658 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Ingo Weinhold
2009-07-20 20:29:16 +00:00
parent 4bb65f96fc
commit 7f96148cac
33 changed files with 751 additions and 292 deletions
@@ -57,8 +57,8 @@ typedef struct partition_module_info {
bool (*validate_initialize)(partition_data* partition, char* name,
const char* parameters);
bool (*validate_create_child)(partition_data* partition, off_t* start,
off_t* size, const char* type, const char* parameters,
int32* index);
off_t* size, const char* type, const char* name,
const char* parameters, int32* index);
status_t (*get_partitionable_spaces)(partition_data* partition,
partitionable_space_data* buffer, int32 count,
int32* actualCount);
@@ -100,8 +100,9 @@ typedef struct partition_module_info {
status_t (*initialize)(int fd, partition_id partition, const char* name,
const char *parameters, off_t partitionSize, disk_job_id job);
status_t (*create_child)(int fd, partition_id partition, off_t offset,
off_t size, const char* type, const char* parameters,
disk_job_id job, partition_id* childID);
off_t size, const char* type, const char* name,
const char* parameters, disk_job_id job,
partition_id* childID);
// childID is used for the return value, but is also an optional input
// parameter -- -1 to be ignored
status_t (*delete_child)(int fd, partition_id partition, partition_id child,
+5 -5
View File
@@ -9,7 +9,7 @@
#include <SupportDefs.h>
class BDiskDeviceParameterEditor;
class BPartitionParameterEditor;
class BList;
class BMutablePartition;
class BPartitionHandle;
@@ -33,7 +33,7 @@ public:
const BMutablePartition* partition);
virtual status_t GetInitializationParameterEditor(
const BMutablePartition* partition,
BDiskDeviceParameterEditor** editor);
BPartitionParameterEditor** editor);
virtual status_t ValidateInitialize(
const BMutablePartition* partition,
BString* name, const char* parameters);
@@ -107,10 +107,10 @@ public:
const char* type);
virtual status_t GetContentParameterEditor(
BDiskDeviceParameterEditor** editor);
BPartitionParameterEditor** editor);
virtual status_t GetParameterEditor(
const BMutablePartition* child,
BDiskDeviceParameterEditor** editor);
BPartitionParameterEditor** editor);
virtual status_t ValidateSetContentParameters(
const char* parameters);
virtual status_t ValidateSetParameters(
@@ -122,7 +122,7 @@ public:
virtual status_t GetChildCreationParameterEditor(
const char* type,
BDiskDeviceParameterEditor** editor);
BPartitionParameterEditor** editor);
virtual status_t ValidateCreateChild(off_t* offset,
off_t* size, const char* type,
BString* name, const char* parameters);
+9 -5
View File
@@ -6,6 +6,7 @@
#ifndef _PARTITION_H
#define _PARTITION_H
#include <DiskDeviceDefs.h>
#include <Messenger.h>
#include <Mime.h>
@@ -14,7 +15,7 @@
class BBitmap;
class BDiskDevice;
class BDiskDeviceParameterEditor;
class BPartitionParameterEditor;
class BDiskDeviceVisitor;
class BDiskSystem;
class BMutablePartition;
@@ -128,13 +129,13 @@ public:
bool CanEditParameters() const;
status_t GetParameterEditor(
BDiskDeviceParameterEditor** editor);
BPartitionParameterEditor** editor);
status_t SetParameters(const char* parameters);
bool CanEditContentParameters(
bool* whileMounted = NULL) const;
status_t GetContentParameterEditor(
BDiskDeviceParameterEditor** editor);
BPartitionParameterEditor** editor);
status_t SetContentParameters(const char* parameters);
status_t GetNextSupportedType(int32 *cookie,
@@ -152,7 +153,7 @@ public:
bool CanInitialize(const char* diskSystem) const;
status_t GetInitializationParameterEditor(
const char* system,
BDiskDeviceParameterEditor** editor) const;
BPartitionParameterEditor** editor) const;
status_t ValidateInitialize(const char* diskSystem,
BString* name, const char* parameters);
status_t Initialize(const char* diskSystem,
@@ -164,7 +165,7 @@ public:
bool CanCreateChild() const;
status_t GetChildCreationParameterEditor(
const char* type,
BDiskDeviceParameterEditor** editor) const;
BPartitionParameterEditor** editor) const;
status_t ValidateCreateChild(off_t* start, off_t* size,
const char* type, BString* name,
const char* parameters) const;
@@ -176,6 +177,8 @@ public:
bool CanDeleteChild(int32 index) const;
status_t DeleteChild(int32 index);
bool SupportsChildName() const;
private:
class Delegate;
@@ -230,4 +233,5 @@ private:
Delegate* fDelegate;
};
#endif // _PARTITION_H
@@ -0,0 +1,34 @@
/*
* Copyright 2009, Bryce Groff, [email protected].
* Distributed under the terms of the MIT License.
*/
#ifndef _PARTITION_PARAMETER_EDITOR_H
#define _PARTITION_PARAMETER_EDITOR_H
#include <View.h>
// BPartitionParameterEditor
class BPartitionParameterEditor {
public:
BPartitionParameterEditor();
virtual ~BPartitionParameterEditor();
virtual bool FinishedEditing();
virtual BView* View();
virtual status_t GetParameters(BString* parameters);
// TODO: Those are child creation specific and shouldn't be in a generic
// interface. Something like a
// GenericPartitionParameterChanged(partition_parameter_type,
// const BVariant&)
// would be better.
virtual status_t PartitionTypeChanged(const char* type);
virtual status_t PartitionNameChanged(const char* name);
};
#endif //_PARTITION_PARAMETER_EDITOR_H
+9 -2
View File
@@ -5,7 +5,9 @@
* Distributed under the terms of the MIT License.
*/
#include "BFSAddOn.h"
#include "InitializeParameterEditor.h"
#include <new>
@@ -100,10 +102,15 @@ BFSAddOn::CanInitialize(const BMutablePartition* partition)
// GetInitializationParameterEditor
status_t
BFSAddOn::GetInitializationParameterEditor(const BMutablePartition* partition,
BDiskDeviceParameterEditor** editor)
BPartitionParameterEditor** editor)
{
// TODO: Implement!
*editor = NULL;
try {
*editor = new InitializeBFSEditor();
} catch (std::bad_alloc) {
return B_NO_MEMORY;
}
return B_OK;
}
+1 -1
View File
@@ -21,7 +21,7 @@ public:
const BMutablePartition* partition);
virtual status_t GetInitializationParameterEditor(
const BMutablePartition* partition,
BDiskDeviceParameterEditor** editor);
BPartitionParameterEditor** editor);
virtual status_t ValidateInitialize(
const BMutablePartition* partition,
BString* name, const char* parameters);
@@ -0,0 +1,136 @@
/*
* Copyright 2009, Bryce Groff, [email protected].
* Distributed under the terms of the MIT License.
*/
#include <stdio.h>
#include "InitializeParameterEditor.h"
#include <Button.h>
#include <GroupLayoutBuilder.h>
#include <GridLayoutBuilder.h>
#include <MenuField.h>
#include <MenuItem.h>
#include <PartitionParameterEditor.h>
#include <PopUpMenu.h>
#include <SpaceLayoutItem.h>
#include <View.h>
#include <Window.h>
static uint32 MSG_BLOCK_SIZE = 'blsz';
InitializeBFSEditor::InitializeBFSEditor()
:
BPartitionParameterEditor(),
fView(NULL),
fNameTC(NULL),
fBlockSizeMF(NULL),
fParameters(NULL)
{
_CreateViewControls();
}
InitializeBFSEditor::~InitializeBFSEditor()
{
}
BView*
InitializeBFSEditor::View()
{
return fView;
}
bool
InitializeBFSEditor::FinishedEditing()
{
fParameters = "";
if (BMenuItem* item = fBlockSizeMF->Menu()->FindMarked()) {
const char* size;
BMessage* message = item->Message();
if (!message || message->FindString("size", &size) < B_OK)
size = "2048";
// TODO: use libroot driver settings API
fParameters << "block_size " << size << ";\n";
}
fParameters << "name " << fNameTC->Text() << ";\n";
return true;
}
status_t
InitializeBFSEditor::GetParameters(BString* parameters)
{
if (parameters == NULL)
return B_BAD_VALUE;
*parameters = fParameters;
return B_OK;
}
status_t
InitializeBFSEditor::PartitionNameChanged(const char* name)
{
fNameTC->SetText(name);
return B_OK;
}
void
InitializeBFSEditor::_CreateViewControls()
{
fNameTC = new BTextControl("Name", "Haiku", NULL);
// TODO find out what is the max length for this specific FS partition name
fNameTC->TextView()->SetMaxBytes(31);
BPopUpMenu* blocksizeMenu = new BPopUpMenu("Blocksize");
BMessage* message = new BMessage(MSG_BLOCK_SIZE);
message->AddString("size", "1024");
blocksizeMenu->AddItem(new BMenuItem("1024 (Mostly small files)",
message));
message = new BMessage(MSG_BLOCK_SIZE);
message->AddString("size", "2048");
BMenuItem* defaultItem = new BMenuItem("2048 (Recommended)", message);
blocksizeMenu->AddItem(defaultItem);
message = new BMessage(MSG_BLOCK_SIZE);
message->AddString("size", "4096");
blocksizeMenu->AddItem(new BMenuItem("4096", message));
message = new BMessage(MSG_BLOCK_SIZE);
message->AddString("size", "8192");
blocksizeMenu->AddItem(new BMenuItem("8192 (Mostly large files)",
message));
fBlockSizeMF = new BMenuField("Blocksize", blocksizeMenu, NULL);
defaultItem->SetMarked(true);
fView = BGroupLayoutBuilder(B_VERTICAL, 5)
.Add(BSpaceLayoutItem::CreateVerticalStrut(10))
// test views
.Add(BGridLayoutBuilder(10, 10)
// row 1
.Add(BSpaceLayoutItem::CreateHorizontalStrut(5), 0, 0)
.Add(fNameTC->CreateLabelLayoutItem(), 1, 0)
.Add(fNameTC->CreateTextViewLayoutItem(), 2, 0)
.Add(BSpaceLayoutItem::CreateHorizontalStrut(10), 3, 0)
// row 2
.Add(BSpaceLayoutItem::CreateHorizontalStrut(10), 0, 1)
.Add(fBlockSizeMF->CreateLabelLayoutItem(), 1, 1)
.Add(fBlockSizeMF->CreateMenuBarLayoutItem(), 2, 1)
.Add(BSpaceLayoutItem::CreateHorizontalStrut(5), 3, 1)
)
;
}
@@ -0,0 +1,38 @@
/*
* Copyright 2009, Bryce Groff, [email protected].
* Distributed under the terms of the MIT License.
*/
#ifndef _INITIALIZE_PARAMETER_EDITOR
#define _INITIALIZE_PARAMETER_EDITOR
#include <PartitionParameterEditor.h>
#include <MenuField.h>
#include <TextControl.h>
#include <String.h>
#include <View.h>
class InitializeBFSEditor : public BPartitionParameterEditor {
public:
InitializeBFSEditor();
virtual ~InitializeBFSEditor();
virtual bool FinishedEditing();
virtual BView* View();
virtual status_t GetParameters(BString* parameters);
virtual status_t PartitionNameChanged(const char* name);
private:
void _CreateViewControls();
BView* fView;
BTextControl* fNameTC;
BMenuField* fBlockSizeMF;
BString fParameters;
};
#endif //_INITIALIZE_PARAMETER_EDITOR
+1
View File
@@ -7,6 +7,7 @@ SEARCH_SOURCE += [ FDirName $(HAIKU_TOP) src add-ons kernel file_systems bfs ] ;
Addon <disk_system>bfs :
BFSAddOn.cpp
InitializeParameterEditor.cpp
bfs_disk_system.cpp
@@ -0,0 +1,71 @@
/*
* Copyright 2009, Bryce Groff, [email protected].
* Distributed under the terms of the MIT License.
*/
#include "CreationParameterEditor.h"
#include <DiskDeviceTypes.h>
#include <GroupLayoutBuilder.h>
#include <PartitionParameterEditor.h>
#include <View.h>
PrimaryPartitionEditor::PrimaryPartitionEditor()
:
BPartitionParameterEditor(),
fView(NULL),
fActiveCB(NULL),
fParameters(NULL)
{
fActiveCB = new BCheckBox("active", "Active Partition", NULL);
fView = BGroupLayoutBuilder(B_VERTICAL, 4)
.Add(fActiveCB)
;
}
PrimaryPartitionEditor::~PrimaryPartitionEditor()
{
}
BView*
PrimaryPartitionEditor::View()
{
return fView;
}
bool
PrimaryPartitionEditor::FinishedEditing()
{
if (fActiveCB->IsEnabled()) {
if (fActiveCB->Value() == B_CONTROL_ON)
fParameters.SetTo("active true ;");
else
fParameters.SetTo("active false ;");
} else fParameters.SetTo("");
return true;
}
status_t
PrimaryPartitionEditor::GetParameters(BString* parameters)
{
if (fParameters == NULL)
return B_BAD_VALUE;
*parameters = fParameters;
return B_OK;
}
status_t
PrimaryPartitionEditor::PartitionTypeChanged(const char* type)
{
fActiveCB->SetEnabled(strcmp(type, kPartitionTypeIntelExtended) != 0);
return B_OK;
}
@@ -0,0 +1,34 @@
/*
* Copyright 2009, Bryce Groff, [email protected].
* Distributed under the terms of the MIT License.
*/
#ifndef _CREATION_PARAMETER_EDITOR
#define _CREATION_PARAMETER_EDITOR
#include <PartitionParameterEditor.h>
#include <CheckBox.h>
#include <String.h>
#include <View.h>
class PrimaryPartitionEditor : public BPartitionParameterEditor {
public:
PrimaryPartitionEditor();
virtual ~PrimaryPartitionEditor();
virtual bool FinishedEditing();
virtual BView* View();
virtual status_t GetParameters(BString* parameters);
virtual status_t PartitionTypeChanged(const char* type);
private:
BView* fView;
BCheckBox* fActiveCB;
BString fParameters;
};
#endif //_CREATION_PARAMETER_EDITOR
@@ -99,7 +99,7 @@ ExtendedPartitionAddOn::CanInitialize(const BMutablePartition* partition)
// GetInitializationParameterEditor
status_t
ExtendedPartitionAddOn::GetInitializationParameterEditor(
const BMutablePartition* partition, BDiskDeviceParameterEditor** editor)
const BMutablePartition* partition, BPartitionParameterEditor** editor)
{
// Nothing to edit, really.
*editor = NULL;
@@ -307,7 +307,7 @@ info->PrintToStream();
// GetChildCreationParameterEditor
status_t
ExtendedPartitionHandle::GetChildCreationParameterEditor(const char* type,
BDiskDeviceParameterEditor** editor)
BPartitionParameterEditor** editor)
{
// TODO: We actually need an editor here.
*editor = NULL;
@@ -23,7 +23,7 @@ public:
const BMutablePartition* partition);
virtual status_t GetInitializationParameterEditor(
const BMutablePartition* partition,
BDiskDeviceParameterEditor** editor);
BPartitionParameterEditor** editor);
virtual status_t ValidateInitialize(
const BMutablePartition* partition,
BString* name, const char* parameters);
@@ -54,7 +54,7 @@ public:
virtual status_t GetChildCreationParameterEditor(
const char* type,
BDiskDeviceParameterEditor** editor);
BPartitionParameterEditor** editor);
virtual status_t ValidateCreateChild(off_t* offset,
off_t* size, const char* type,
BString* name, const char* parameters);
+1
View File
@@ -16,6 +16,7 @@ Addon <disk_system>intel :
IntelDiskSystem.cpp
ExtendedPartitionAddOn.cpp
PartitionMapAddOn.cpp
CreationParameterEditor.cpp
# kernel sources
PartitionMap.cpp
@@ -3,6 +3,7 @@
* Distributed under the terms of the MIT License.
*/
#include "CreationParameterEditor.h"
#include "PartitionMapAddOn.h"
#include <new>
@@ -99,7 +100,7 @@ PartitionMapAddOn::CanInitialize(const BMutablePartition* partition)
// GetInitializationParameterEditor
status_t
PartitionMapAddOn::GetInitializationParameterEditor(
const BMutablePartition* partition, BDiskDeviceParameterEditor** editor)
const BMutablePartition* partition, BPartitionParameterEditor** editor)
{
// Nothing to edit, really.
*editor = NULL;
@@ -263,58 +264,25 @@ PartitionMapHandle::GetNextSupportedType(const BMutablePartition* child,
{
TRACE("%p->PartitionMapHandle::GetNextSupportedType(child: %p, "
"cookie: %ld)\n", this, child, *cookie);
// TODO: What are we supposed to do with the child?
// we support creating two types, primary and extended
if (*cookie < 0 || *cookie > 1)
return B_ENTRY_NOT_FOUND;
// check if there are any spaces at all
// TODO: check if the spaces have enough size at all
BPartitioningInfo info;
status_t ret = GetPartitioningInfo(&info);
if (ret < B_OK)
return ret;
if (info.CountPartitionableSpaces() == 0)
return B_ENTRY_NOT_FOUND;
// adjust the cookie here already so that we don't have
// to worry about it when returning early below
*cookie = *cookie + 1;
if (*cookie == 1) {
// On first iteration, check if we can create more primary
// partitions. If this is not possible, we cannot create
// any extended partitions either.
for (int32 i = 0; i < 4; i++) {
PrimaryPartition* primary = fPartitionMap.PrimaryPartitionAt(i);
if (primary->IsEmpty()) {
*type = kPartitionTypeIntelPrimary;
return B_OK;
}
}
} else if (*cookie == 2) {
// On second iteration, check if we can create more primary
// partitions. Also check if there already is an extended
// partition, only if there is at least one empty and no
// extended partition, we can create an extended partition.
bool foundExtended = false;
bool foundEmpty = false;
for (int32 i = 0; i < 4; i++) {
PrimaryPartition* primary = fPartitionMap.PrimaryPartitionAt(i);
if (primary->IsEmpty())
foundEmpty = true;
else if (primary->IsExtended())
foundExtended = true;
}
if (foundEmpty && !foundExtended) {
*type = kPartitionTypeIntelExtended;
return B_OK;
}
int32 index = *cookie;
const partition_type* nextType;
while (true) {
nextType = fPartitionMap.GetNextSupportedPartitionType(index);
if (nextType == NULL)
return B_ENTRY_NOT_FOUND;
index++;
if (nextType->used)
break;
}
return B_ENTRY_NOT_FOUND;
if (!nextType)
return B_ENTRY_NOT_FOUND;
type->SetTo(nextType->name);
*cookie = index;
return B_OK;
}
@@ -347,10 +315,15 @@ PartitionMapHandle::GetPartitioningInfo(BPartitioningInfo* info)
// GetChildCreationParameterEditor
status_t
PartitionMapHandle::GetChildCreationParameterEditor(const char* type,
BDiskDeviceParameterEditor** editor)
BPartitionParameterEditor** editor)
{
// TODO: We actually need an editor here.
*editor = NULL;
try {
*editor = new PrimaryPartitionEditor();
} catch (std::bad_alloc) {
return B_NO_MEMORY;
}
return B_OK;
}
@@ -373,7 +346,11 @@ PartitionMapHandle::ValidateCreateChild(off_t* _offset, off_t* _size,
name->Truncate(0);
// check parameters
// TODO:...
void* handle = parse_driver_settings_string(parameters);
if (handle == NULL)
return B_ERROR;
bool active = get_driver_boolean_parameter(handle, "active", false, true);
// do we have a spare primary partition?
if (fPartitionMap.CountNonEmptyPrimaryPartitions() == 4)
@@ -481,11 +458,15 @@ PartitionMapHandle::CreateChild(off_t offset, off_t size,
return B_BAD_VALUE;
// check name
if (name && strlen(name) > 0)
if (name && *name != '\0')
return B_BAD_VALUE;
// check parameters
// TODO:...
void* handle = parse_driver_settings_string(parameters);
if (handle == NULL)
return B_ERROR;
bool active = get_driver_boolean_parameter(handle, "active", false, true);
// get a spare primary partition
PrimaryPartition* primary = NULL;
@@ -533,7 +514,7 @@ PartitionMapHandle::CreateChild(off_t offset, off_t size,
// we picked the first empty primary partition.)
BMutablePartition* partition = Partition();
BMutablePartition* child;
error = partition->CreateChild(primary->Index(), typeString, NULL,
error = partition->CreateChild(primary->Index(), typeString, name,
parameters, &child);
if (error != B_OK)
return error;
@@ -546,8 +527,6 @@ PartitionMapHandle::CreateChild(off_t offset, off_t size,
child->SetChildCookie(primary);
// init the primary partition
bool active = false;
// TODO: Get from parameters!
primary->SetTo(offset, size, type.Type(), active, partition->BlockSize());
// TODO: If the child is an extended partition, we should trigger its
@@ -23,7 +23,7 @@ public:
const BMutablePartition* partition);
virtual status_t GetInitializationParameterEditor(
const BMutablePartition* partition,
BDiskDeviceParameterEditor** editor);
BPartitionParameterEditor** editor);
virtual status_t ValidateInitialize(
const BMutablePartition* partition,
BString* name, const char* parameters);
@@ -54,7 +54,7 @@ public:
virtual status_t GetChildCreationParameterEditor(
const char* type,
BDiskDeviceParameterEditor** editor);
BPartitionParameterEditor** editor);
virtual status_t ValidateCreateChild(off_t* offset,
off_t* size, const char* type,
BString* name, const char* parameters);
@@ -43,11 +43,6 @@
using std::nothrow;
// partition_type
struct partition_type {
uint8 type;
const char *name;
};
static const char* const kUnrecognizedTypeString = "Unrecognized Type ";
static const size_t kUnrecognizedTypeStringLength = 18;
@@ -55,36 +50,39 @@ static const size_t kUnrecognizedTypeStringLength = 18;
static const struct partition_type kPartitionTypes[] = {
// these entries must be sorted by type (currently not)
// TODO: Standardize naming.
{ 0x00, "empty" },
{ 0x01, "FAT 12-bit" },
{ 0x02, "Xenix root" },
{ 0x03, "Xenix user" },
{ 0x04, "FAT 16-bit (dos 3.0)" },
{ 0x05, /*"Extended Partition"*/INTEL_EXTENDED_PARTITION_NAME },
{ 0x06, "FAT 16-bit (dos 3.31)" },
{ 0x07, "OS/2 IFS, Windows NT, Advanced Unix" },
{ 0x0b, "FAT 32-bit" },
{ 0x0c, "FAT 32-bit, LBA-mapped" },
{ 0x0d, "FAT 16-bit, LBA-mapped" },
{ 0x0f, /*"Extended Partition, LBA-mapped"*/INTEL_EXTENDED_PARTITION_NAME },
{ 0x42, "Windows 2000 marker (switches to a proprietary partition table)" },
{ 0x4d, "QNX 4" },
{ 0x4e, "QNX 4 2nd part" },
{ 0x4f, "QNX 4 3rd part" },
{ 0x78, "XOSL boot loader" },
{ 0x82, "Linux swapfile" },
{ 0x83, "Linux native" },
{ 0x85, /*"Linux extendend partition"*/INTEL_EXTENDED_PARTITION_NAME },
{ 0xa5, "FreeBSD" },
{ 0xa6, "OpenBSD" },
{ 0xa7, "NextSTEP" },
{ 0xa8, "MacOS X" },
{ 0xa9, "NetBSD" },
{ 0xab, "MacOS X boot" },
{ 0xaf, "MacOS X HFS" },
{ 0xbe, "Solaris 8 boot" },
{ 0xeb, /*"BeOS"*/ BFS_NAME },
{ 0, NULL }
{ 0x00, "empty", true },
{ 0x01, "FAT 12-bit", false},
{ 0x02, "Xenix root", false },
{ 0x03, "Xenix user", false },
{ 0x04, "FAT 16-bit (dos 3.0)", false },
{ 0x05, /*"Extended Partition"*/INTEL_EXTENDED_PARTITION_NAME, false },
{ 0x06, "FAT 16-bit (dos 3.31)", false },
{ 0x07, "OS/2 IFS, Windows NT, Advanced Unix", true },
{ 0x0b, "FAT 32-bit", false },
{ 0x0c, "FAT 32-bit, LBA-mapped", true },
{ 0x0d, "FAT 16-bit, LBA-mapped", false },
{ 0x0f, /*"Extended Partition, LBA-mapped"*/INTEL_EXTENDED_PARTITION_NAME,
true },
{ 0x42, "Windows 2000 marker (switches to a proprietary partition table)",
false },
{ 0x4d, "QNX 4", true },
{ 0x4e, "QNX 4 2nd part", false },
{ 0x4f, "QNX 4 3rd part", false },
{ 0x78, "XOSL boot loader", false },
{ 0x82, "Linux swapfile", true },
{ 0x83, "Linux native", true },
{ 0x85, /*"Linux extendend partition"*/INTEL_EXTENDED_PARTITION_NAME,
false },
{ 0xa5, "FreeBSD", true },
{ 0xa6, "OpenBSD", true },
{ 0xa7, "NextSTEP", false },
{ 0xa8, "MacOS X", true },
{ 0xa9, "NetBSD", true },
{ 0xab, "MacOS X boot", true },
{ 0xaf, "MacOS X HFS", true },
{ 0xbe, "Solaris 8 boot", false },
{ 0xeb, /*"BeOS"*/ BFS_NAME, true },
{ 0, NULL, false }
};
static const struct partition_type kPartitionContentTypes[] = {
@@ -835,3 +833,12 @@ PartitionMap::Check(off_t sessionSize) const
return result;
}
const partition_type*
PartitionMap::GetNextSupportedPartitionType(uint32 index)
{
if (index > (sizeof(kPartitionTypes) / sizeof(partition_type) - 2))
return NULL;
return kPartitionTypes + index;
}
@@ -14,6 +14,7 @@
// NOTE: <http://www.win.tue.nl/~aeb/partitions/partition_tables-2.html>
#include <SupportDefs.h>
#include <driver_settings.h>
#ifndef _USER_MODE
# include <util/kernel_cpp.h>
@@ -27,6 +28,14 @@
#define BFS_NAME "BFS Filesystem"
// partition_type
struct partition_type {
uint8 type;
const char *name;
bool used;
};
// is_empty_type
static inline bool
is_empty_type(uint8 type)
@@ -287,6 +296,7 @@ public:
const Partition* PartitionAt(int32 index) const;
bool Check(off_t sessionSize) const;
const partition_type* GetNextSupportedPartitionType(uint32 cookie);
private:
PrimaryPartition fPrimaries[4];
@@ -530,7 +530,7 @@ validate_create_child_partition(partition_data *partition, off_t *start,
*/
bool
pm_validate_create_child(partition_data *partition, off_t *start, off_t *size,
const char *type, const char *parameters, int32 *index)
const char *type, const char *name, const char *parameters, int32 *index)
{
TRACE(("intel: pm_validate_create_child\n"));
@@ -540,6 +540,7 @@ pm_validate_create_child(partition_data *partition, off_t *start, off_t *size,
return false;
}
// TODO: check name
// TODO: check parameters
// type check
if (!is_type_valid_pm(type, partition))
@@ -1291,8 +1292,8 @@ pm_initialize(int fd, partition_id partitionID, const char *name,
*/
status_t
pm_create_child(int fd, partition_id partitionID, off_t offset, off_t size,
const char *type, const char *parameters, disk_job_id job,
partition_id *childID)
const char *type, const char *name, const char *parameters,
disk_job_id job, partition_id *childID)
{
TRACE(("intel: pm_create_child\n"));
@@ -1318,7 +1319,7 @@ pm_create_child(int fd, partition_id partitionID, off_t offset, off_t size,
int32 index = 0;
if (!pm_validate_create_child(partition, &validatedOffset, &validatedSize,
type, parameters, &index)) {
type, name, parameters, &index)) {
return B_BAD_VALUE;
}
@@ -1338,12 +1339,26 @@ pm_create_child(int fd, partition_id partitionID, off_t offset, off_t size,
PartitionType ptype;
ptype.SetType(type);
// check parameters
void *handle = parse_driver_settings_string(parameters);
if (handle == NULL)
return B_ERROR;
bool active = get_driver_boolean_parameter(handle, "active", false, true);
// set the active flags to false
if (active) {
for (int i = 0; i < 4; i++) {
PrimaryPartition *partition = map->PrimaryPartitionAt(i);
partition->SetActive(false);
}
}
primary->SetPartitionTableOffset(0);
primary->SetOffset(validatedOffset);
primary->SetSize(validatedSize);
primary->SetType(ptype.Type());
// TODO: correctly fill active parameter
primary->SetActive(false);
primary->SetActive(active);
// write changes to disk
PartitionMapWriter writer(fd, 0, partition->size);
@@ -1602,7 +1617,7 @@ ep_validate_initialize(partition_data *partition, char *name,
// ep_validate_create_child
bool
ep_validate_create_child(partition_data *partition, off_t *_start, off_t *_size,
const char *type, const char *parameters, int32 *index)
const char *type, const char *name, const char *parameters, int32 *index)
// index - returns position of the new partition (the last one)
{
TRACE(("intel: ep_validate_create_child\n"));
@@ -2049,7 +2064,7 @@ ep_initialize(int fd, partition_id partitionID, const char *name,
*/
status_t
ep_create_child(int fd, partition_id partitionID, off_t offset, off_t size,
const char *type, const char *parameters, disk_job_id job,
const char *type, const char *name, const char *parameters, disk_job_id job,
partition_id *childID)
{
TRACE(("intel: ep_create_child\n"));
@@ -2077,7 +2092,7 @@ ep_create_child(int fd, partition_id partitionID, off_t offset, off_t size,
int32 index = 0;
if (!ep_validate_create_child(partition, &validatedOffset, &validatedSize,
type, parameters, &index)) {
type, name, parameters, &index)) {
return B_BAD_VALUE;
}
@@ -25,8 +25,8 @@ bool pm_validate_set_type(partition_data *partition, const char *type);
bool pm_validate_initialize(partition_data *partition, char *name,
const char *parameters);
bool pm_validate_create_child(partition_data *partition, off_t *start,
off_t *size, const char *type, const char *parameters,
int32 *index);
off_t *size, const char *type, const char *name,
const char *parameters, int32 *index);
status_t pm_get_partitionable_spaces(partition_data *partition,
partitionable_space_data *buffer, int32 count,
@@ -49,8 +49,9 @@ status_t pm_set_type(int fd, partition_id partitionID, const char *type,
status_t pm_initialize(int fd, partition_id partitionID, const char *name,
const char *parameters, off_t partitionSize, disk_job_id job);
status_t pm_create_child(int fd, partition_id partitionID, off_t offset,
off_t size, const char *type, const char *parameters,
disk_job_id job, partition_id *childID);
off_t size, const char *type, const char *name,
const char *parameters, disk_job_id job,
partition_id *childID);
status_t pm_delete_child(int fd, partition_id partitionID,
partition_id childID, disk_job_id job);
@@ -71,8 +72,8 @@ bool ep_validate_set_type(partition_data *partition, const char *type);
bool ep_validate_initialize(partition_data *partition, char *name,
const char *parameters);
bool ep_validate_create_child(partition_data *partition, off_t *_start,
off_t *_size, const char *type, const char *parameters,
int32 *index);
off_t *_size, const char *type, const char* name,
const char *parameters, int32 *index);
status_t ep_get_partitionable_spaces(partition_data *partition,
partitionable_space_data *buffer, int32 count,
int32 *actualCount);
@@ -94,8 +95,9 @@ status_t ep_set_type(int fd, partition_id partitionID, const char *type,
status_t ep_initialize(int fd, partition_id partitionID, const char *name,
const char *parameters, off_t partitionSize, disk_job_id job);
status_t ep_create_child(int fd, partition_id partitionID, off_t offset,
off_t size, const char *type, const char *parameters,
disk_job_id job, partition_id *childID);
off_t size, const char *type, const char *name,
const char *parameters, disk_job_id job,
partition_id *childID);
status_t ep_delete_child(int fd, partition_id partitionID,
partition_id childID, disk_job_id job);
+75 -28
View File
@@ -10,8 +10,9 @@
#include "CreateParamsPanel.h"
#include "Support.h"
#include <Box.h>
#include <Button.h>
#include <GridLayoutBuilder.h>
#include <DiskDeviceTypes.h>
#include <GroupLayoutBuilder.h>
#include <GroupView.h>
#include <MenuField.h>
@@ -19,6 +20,8 @@
#include <Message.h>
#include <MessageFilter.h>
#include <PopUpMenu.h>
#include <PartitionParameterEditor.h>
#include <Partition.h>
#include <Slider.h>
#include <SpaceLayoutItem.h>
#include <String.h>
@@ -31,9 +34,11 @@ public:
fPanel(target)
{
}
virtual ~EscapeFilter()
{
}
virtual filter_result Filter(BMessage* message, BHandler** target)
{
filter_result result = B_DISPATCH_MESSAGE;
@@ -54,6 +59,7 @@ public:
}
return result;
}
private:
CreateParamsPanel* fPanel;
};
@@ -64,11 +70,12 @@ private:
enum {
MSG_OK = 'okok',
MSG_CANCEL = 'cncl',
MSG_PARTITION_TYPE = 'prty'
MSG_PARTITION_TYPE = 'type'
};
CreateParamsPanel::CreateParamsPanel(BWindow* window, off_t offset, off_t size)
CreateParamsPanel::CreateParamsPanel(BWindow* window, BPartition* partition,
off_t offset, off_t size)
: BWindow(BRect(300.0, 200.0, 600.0, 300.0), 0, B_MODAL_WINDOW_LOOK,
B_MODAL_SUBSET_WINDOW_FEEL,
B_ASYNCHRONOUS_CONTROLS | B_AUTO_UPDATE_SIZE_LIMITS),
@@ -83,7 +90,7 @@ CreateParamsPanel::CreateParamsPanel(BWindow* window, off_t offset, off_t size)
// so that we do not run over a signed int32.
offset /= kMegaByte;
size /= kMegaByte;
_CreateViewControls(offset, size);
_CreateViewControls(partition, offset, size);
}
@@ -117,6 +124,12 @@ CreateParamsPanel::MessageReceived(BMessage* message)
release_sem(fExitSemaphore);
break;
case MSG_PARTITION_TYPE:
const char* type;
message->FindString("type", &type);
fEditor->PartitionTypeChanged(type);
break;
default:
BWindow::MessageReceived(message);
}
@@ -124,7 +137,8 @@ CreateParamsPanel::MessageReceived(BMessage* message)
int32
CreateParamsPanel::Go(off_t& offset, off_t& size, BString& type)
CreateParamsPanel::Go(off_t& offset, off_t& size, BString& name,
BString& type, BString& parameters)
{
// run the window thread, to get an initial layout of the controls
Hide();
@@ -154,16 +168,28 @@ CreateParamsPanel::Go(off_t& offset, off_t& size, BString& type)
return GO_CANCELED;
if (fReturnValue == GO_SUCCESS) {
// Return the value back as bytes.
size = (off_t)fSizeSlider->Size() * kMegaByte;
offset = (off_t)fSizeSlider->Offset() * kMegaByte;
// get name
name.SetTo(fNameTextControl->Text());
// get type
if (BMenuItem* item = fTypeMenuField->Menu()->FindMarked()) {
const char* _type;
BMessage* message = item->Message();
if (!message || message->FindString("type", &_type) < B_OK)
_type = "BFS Filesystem";
_type = kPartitionTypeBFS;
type << _type;
}
// Return the value back as bytes.
size = (off_t)fSizeSlider->Size() * kMegaByte;
offset = (off_t)fSizeSlider->Offset() * kMegaByte;
// get editors parameters
if (fEditor->FinishedEditing()) {
status_t status = fEditor->GetParameters(&parameters);
if (status != B_OK)
fReturnValue = status;
}
}
int32 value = fReturnValue;
@@ -184,38 +210,59 @@ CreateParamsPanel::Cancel()
void
CreateParamsPanel::_CreateViewControls(off_t offset, off_t size)
CreateParamsPanel::_CreateViewControls(BPartition* parent, off_t offset,
off_t size)
{
// Setup the controls
//TODO Add all the partition types that we want/can use
fTypePopUpMenu = new BPopUpMenu("Partition Type");
BMessage* message = new BMessage(MSG_PARTITION_TYPE);
message->AddString("type", "BFS Filesystem");
BMenuItem *item = new BMenuItem("BFS Filesystem", message);
fTypePopUpMenu->AddItem(item);
item->SetMarked(true);
fTypeMenuField = new BMenuField("Partition Type", fTypePopUpMenu, NULL);
fSizeSlider = new SizeSlider("Slider", "Partition Size", NULL, offset,
offset + size);
fSizeSlider->SetPosition(1.0);
fNameTextControl = new BTextControl("Name Control", "Partition Name",
"", NULL);
if (!parent->SupportsChildName())
fNameTextControl->SetEnabled(false);
fTypePopUpMenu = new BPopUpMenu("Partition Type");
int32 cookie = 0;
BString supportedType;
while (parent->GetNextSupportedChildType(&cookie, &supportedType)
== B_OK) {
BMessage* message = new BMessage(MSG_PARTITION_TYPE);
message->AddString("type", supportedType);
BMenuItem* item = new BMenuItem(supportedType, message);
fTypePopUpMenu->AddItem(item);
if (strcmp(supportedType, kPartitionTypeBFS) == 0)
item->SetMarked(true);
}
fTypeMenuField = new BMenuField("Partition Type", fTypePopUpMenu, NULL);
fOKButton = new BButton("Create", new BMessage(MSG_OK));
fCancelButton = new BButton("Cancel", new BMessage(MSG_CANCEL));
BView* infoView = BGroupLayoutBuilder(B_VERTICAL, 3)
.Add(fSizeSlider)
.Add(fNameTextControl)
.Add(fTypeMenuField)
;
BBox* infoBox = new BBox(B_FANCY_BORDER, infoView);
parent->GetChildCreationParameterEditor(NULL, &fEditor);
BBox* parameterBox = new BBox(B_FANCY_BORDER, fEditor->View());
BView* rootView = BGroupLayoutBuilder(B_VERTICAL, 4)
.Add(BSpaceLayoutItem::CreateVerticalStrut(5))
// slider and types
.Add(infoBox)
.Add(BSpaceLayoutItem::CreateVerticalStrut(10))
// test views
.Add(BGridLayoutBuilder(10, 10)
// row 1
.Add(BSpaceLayoutItem::CreateHorizontalStrut(5), 0, 0)
.Add(fSizeSlider, 1, 0)
.Add(BSpaceLayoutItem::CreateVerticalStrut(5), 1, 0)
.Add(fTypeMenuField, 1, 1)
)
// editor's view
.Add(parameterBox)
// controls
.AddGroup(B_HORIZONTAL, 10)
+11 -5
View File
@@ -13,6 +13,7 @@
#include <Window.h>
#include <InterfaceKit.h>
#include <PartitionParameterEditor.h>
#include <Partition.h>
class BMenuField;
@@ -22,28 +23,33 @@ class SizeSlider;
class CreateParamsPanel : public BWindow {
public:
CreateParamsPanel(BWindow* window,
off_t offset, off_t size);
BPartition* parent, off_t offset,
off_t size);
virtual ~CreateParamsPanel();
virtual bool QuitRequested();
virtual void MessageReceived(BMessage* message);
int32 Go(off_t& offset, off_t& size,
BString& parameters);
int32 Go(off_t& offset, off_t& size, BString& name,
BString& type, BString& parameters);
void Cancel();
private:
void _CreateViewControls(off_t offset, off_t size);
void _CreateViewControls(BPartition* parent,
off_t offset, off_t size);
class EscapeFilter;
EscapeFilter* fEscapeFilter;
sem_id fExitSemaphore;
BWindow* fWindow;
int32 fReturnValue;
BPartitionParameterEditor* fEditor;
BPopUpMenu* fTypePopUpMenu;
BMenuField* fTypeMenuField;
BTextControl* fNameTextControl;
SizeSlider* fSizeSlider;
BButton* fOKButton;
BButton* fCancelButton;
+27 -53
View File
@@ -8,6 +8,7 @@
#include "InitParamsPanel.h"
#include <driver_settings.h>
#include <stdio.h>
#include <Button.h>
@@ -31,9 +32,11 @@ public:
fPanel(target)
{
}
virtual ~EscapeFilter()
{
}
virtual filter_result Filter(BMessage* message, BHandler** target)
{
filter_result result = B_DISPATCH_MESSAGE;
@@ -54,6 +57,7 @@ public:
}
return result;
}
private:
InitParamsPanel* fPanel;
};
@@ -69,7 +73,8 @@ enum {
};
InitParamsPanel::InitParamsPanel(BWindow* window)
InitParamsPanel::InitParamsPanel(BWindow* window, const BString& diskSystem,
BPartition* partition)
: BWindow(BRect(300.0, 200.0, 600.0, 300.0), 0, B_MODAL_WINDOW_LOOK,
B_MODAL_SUBSET_WINDOW_FEEL,
B_ASYNCHRONOUS_CONTROLS | B_AUTO_UPDATE_SIZE_LIMITS),
@@ -80,53 +85,17 @@ InitParamsPanel::InitParamsPanel(BWindow* window)
{
AddCommonFilter(fEscapeFilter);
fNameTC = new BTextControl("Name", NULL, NULL);
// TODO find out what is the max length for this specific FS partition name
fNameTC->TextView()->SetMaxBytes(31);
BPopUpMenu* blocksizeMenu = new BPopUpMenu("Blocksize");
BMessage* message = new BMessage(MSG_BLOCK_SIZE);
message->AddString("size", "1024");
blocksizeMenu->AddItem(new BMenuItem("1024 (Mostly small files)", message));
message = new BMessage(MSG_BLOCK_SIZE);
message->AddString("size", "2048");
BMenuItem* defaultItem = new BMenuItem("2048 (Recommended)", message);
blocksizeMenu->AddItem(defaultItem);
message = new BMessage(MSG_BLOCK_SIZE);
message->AddString("size", "4096");
blocksizeMenu->AddItem(new BMenuItem("4096", message));
message = new BMessage(MSG_BLOCK_SIZE);
message->AddString("size", "8192");
blocksizeMenu->AddItem(new BMenuItem("8192 (Mostly large files)", message));
fBlockSizeMF = new BMenuField("Blocksize", blocksizeMenu, NULL);
defaultItem->SetMarked(true);
BButton* okButton = new BButton("Initialize", new BMessage(MSG_OK));
BButton* cancelButton = new BButton("Cancel", new BMessage(MSG_CANCEL));
BView* rootView = BGroupLayoutBuilder(B_VERTICAL, 5)
partition->GetInitializationParameterEditor(diskSystem.String(),
&fEditor);
BView* rootView = BGroupLayoutBuilder(B_VERTICAL, 5)
.Add(BSpaceLayoutItem::CreateVerticalStrut(10))
// test views
.Add(BGridLayoutBuilder(10, 10)
// row 1
.Add(BSpaceLayoutItem::CreateHorizontalStrut(5), 0, 0)
.Add(fNameTC->CreateLabelLayoutItem(), 1, 0)
.Add(fNameTC->CreateTextViewLayoutItem(), 2, 0)
.Add(BSpaceLayoutItem::CreateHorizontalStrut(10), 3, 0)
// row 2
.Add(BSpaceLayoutItem::CreateHorizontalStrut(10), 0, 1)
.Add(fBlockSizeMF->CreateLabelLayoutItem(), 1, 1)
.Add(fBlockSizeMF->CreateMenuBarLayoutItem(), 2, 1)
.Add(BSpaceLayoutItem::CreateHorizontalStrut(5), 3, 1)
)
.Add(fEditor->View())
// controls
.AddGroup(B_HORIZONTAL, 10)
@@ -144,6 +113,11 @@ InitParamsPanel::InitParamsPanel(BWindow* window)
AddChild(rootView);
SetDefaultButton(okButton);
// If the partition had a previous name, set to that name.
BString name = partition->ContentName();
if (name.Length() > 0)
fEditor->PartitionNameChanged(name.String());
AddToSubset(fWindow);
}
@@ -199,9 +173,6 @@ InitParamsPanel::Go(BString& name, BString& parameters)
MoveTo((parentFrame.left + parentFrame.right - frame.Width()) / 2.0,
(parentFrame.top + parentFrame.bottom - frame.Height()) / 2.0);
fNameTC->SetText(name.String());
fNameTC->MakeFocus(true);
Show();
Unlock();
@@ -218,15 +189,18 @@ InitParamsPanel::Go(BString& name, BString& parameters)
return GO_CANCELED;
if (fReturnValue == GO_SUCCESS) {
name = fNameTC->Text();
parameters = "";
if (BMenuItem* item = fBlockSizeMF->Menu()->FindMarked()) {
const char* size;
BMessage* message = item->Message();
if (!message || message->FindString("size", &size) < B_OK)
size = "2048";
// TODO: use libroot driver settings API
parameters << "block_size " << size << ";\n";
if (fEditor->FinishedEditing()) {
status_t err = fEditor->GetParameters(&parameters);
if (err == B_OK) {
void* handle = parse_driver_settings_string(
parameters.String());
if (handle != NULL) {
const char* string = get_driver_parameter(handle, "name",
NULL, NULL);
name.SetTo(string);
}
} else
fReturnValue = err;
}
}
+7 -4
View File
@@ -10,6 +10,8 @@
#include "Support.h"
#include <Partition.h>
#include <PartitionParameterEditor.h>
#include <Window.h>
class BMenuField;
@@ -18,7 +20,9 @@ class BTextControl;
class InitParamsPanel : public BWindow {
public:
InitParamsPanel(BWindow* window);
InitParamsPanel(BWindow* window,
const BString& diskSystem,
BPartition* partition);
virtual ~InitParamsPanel();
virtual bool QuitRequested();
@@ -33,9 +37,8 @@ private:
sem_id fExitSemaphore;
BWindow* fWindow;
int32 fReturnValue;
BTextControl* fNameTC;
BMenuField* fBlockSizeMF;
BPartitionParameterEditor* fEditor;
};
#endif // INIT_PARAMS_PANEL_H
+17 -44
View File
@@ -168,6 +168,8 @@ MainWindow::MainWindow(BRect frame)
new BMessage(MSG_SURFACE_TEST));
fRescanMI = new BMenuItem("Rescan", new BMessage(MSG_RESCAN));
fCreateMI = new BMenuItem("Create" B_UTF8_ELLIPSIS,
new BMessage(MSG_CREATE), 'C');
fDeleteMI = new BMenuItem("Delete", new BMessage(MSG_DELETE), 'D');
fMountMI = new BMenuItem("Mount", new BMessage(MSG_MOUNT), 'M');
@@ -188,8 +190,7 @@ MainWindow::MainWindow(BRect frame)
// Parition menu
fPartitionMenu = new BMenu("Partition");
fCreateMenu = new BMenu("Create");
fPartitionMenu->AddItem(fCreateMenu);
fPartitionMenu->AddItem(fCreateMI);
fInitMenu = new BMenu("Initialize");
fPartitionMenu->AddItem(fInitMenu);
@@ -263,10 +264,7 @@ MainWindow::MessageReceived(BMessage* message)
break;
case MSG_CREATE: {
BString diskSystemName;
//if (message->FindString("disk system", &diskSystemName) != B_OK)
// break;
_Create(fCurrentDisk, fCurrentPartitionID, diskSystemName);
_Create(fCurrentDisk, fCurrentPartitionID);
break;
}
@@ -469,10 +467,6 @@ void
MainWindow::_UpdateMenus(BDiskDevice* disk,
partition_id selectedPartition, partition_id parentID)
{
// clean out Create and Init menu
while (BMenuItem* item = fCreateMenu->RemoveItem(0L))
delete item;
while (BMenuItem* item = fInitMenu->RemoveItem(0L))
delete item;
@@ -488,6 +482,7 @@ MainWindow::_UpdateMenus(BDiskDevice* disk,
fEjectMI->SetEnabled(disk->IsRemovableMedia());
// fSurfaceTestMI->SetEnabled(true);
fSurfaceTestMI->SetEnabled(false);
fCreateMI->SetEnabled(false);
// Create menu and items
fPartitionMenu->SetEnabled(true);
@@ -496,12 +491,14 @@ MainWindow::_UpdateMenus(BDiskDevice* disk,
if (selectedPartition <= -2)
parentPartition = disk->FindDescendant(parentID);
if (parentPartition && parentPartition->ContainsPartitioningSystem())
fCreateMI->SetEnabled(true);
BPartition* partition = disk->FindDescendant(selectedPartition);
if (partition == NULL)
partition = disk;
bool prepared = disk->PrepareModifications() == B_OK;
fCreateMenu->SetEnabled(prepared);
fInitMenu->SetEnabled(prepared);
fDeleteMI->SetEnabled(prepared);
@@ -532,27 +529,6 @@ MainWindow::_UpdateMenus(BDiskDevice* disk,
fInitMenu->AddItem(item);
}
if (parentPartition != NULL) {
BString supportedChildType;
int32 cookie = 0;
status_t ret;
while ((ret = parentPartition->GetNextSupportedChildType(&cookie,
&supportedChildType)) == B_OK) {
BMessage* message = new BMessage(MSG_CREATE);
message->AddInt32("parent id", parentID);
message->AddInt32("space id", selectedPartition);
message->AddString("type", supportedChildType);
BMenuItem* item = new BMenuItem(supportedChildType.String(),
message);
fCreateMenu->AddItem(item);
}
if (fCreateMenu->CountItems() == 0)
fprintf(stderr, "Failed to get supported child types: %s\n",
strerror(ret));
} else {
fCreateMenu->SetEnabled(false);
}
if (prepared)
disk->CancelModifications();
@@ -804,14 +780,11 @@ MainWindow::_Initialize(BDiskDevice* disk, partition_id selectedPartition,
return;
}
// TODO: use partition initialization editor
// (partition->GetInitializationParameterEditor())
BString name = partition->ContentName();
BString name;
BString parameters;
if (diskSystemName == "Be File System") {
if (name.Length() == 0)
name = "Haiku";
InitParamsPanel* panel = new InitParamsPanel(this);
InitParamsPanel* panel = new InitParamsPanel(this, diskSystemName,
partition);
if (panel->Go(name, parameters) == GO_CANCELED)
return;
} else if (diskSystemName == "Intel Partition Map") {
@@ -880,8 +853,7 @@ MainWindow::_Initialize(BDiskDevice* disk, partition_id selectedPartition,
void
MainWindow::_Create(BDiskDevice* disk, partition_id selectedPartition,
const BString& partitionType)
MainWindow::_Create(BDiskDevice* disk, partition_id selectedPartition)
{
if (!disk || selectedPartition > -2) {
_DisplayPartitionError("The currently selected partition is not"
@@ -942,12 +914,13 @@ MainWindow::_Create(BDiskDevice* disk, partition_id selectedPartition,
off_t offset = currentSelection->Offset();
off_t size = currentSelection->Size();
CreateParamsPanel* panel = new CreateParamsPanel(this, offset, size);
if (panel->Go(offset, size, type) == GO_CANCELED)
CreateParamsPanel* panel = new CreateParamsPanel(this, parent, offset,
size);
if (panel->Go(offset, size, name, type, parameters) == GO_CANCELED)
return;
ret = parent->ValidateCreateChild(&offset, &size, type.String(),
NULL, NULL);
&name, parameters.String());
if (ret != B_OK) {
_DisplayPartitionError("Validation of the given creation "
@@ -968,7 +941,7 @@ MainWindow::_Create(BDiskDevice* disk, partition_id selectedPartition,
return;
ret = parent->CreateChild(offset, size, type.String(),
NULL, parameters.String());
name.String(), parameters.String());
if (ret != B_OK) {
_DisplayPartitionError("Creation of the partition has failed\n");
+2 -3
View File
@@ -67,8 +67,7 @@ private:
partition_id selectedPartition,
const BString& diskSystemName);
void _Create(BDiskDevice* disk,
partition_id selectedPartition,
const BString& partitionType);
partition_id selectedPartition);
void _Delete(BDiskDevice* disk,
partition_id selectedPartition);
@@ -85,13 +84,13 @@ private:
BMenu* fDiskMenu;
BMenu* fPartitionMenu;
BMenu* fInitMenu;
BMenu* fCreateMenu;
BMenuItem* fFormatMI;
BMenuItem* fEjectMI;
BMenuItem* fSurfaceTestMI;
BMenuItem* fRescanMI;
BMenuItem* fCreateMI;
BMenuItem* fDeleteMI;
BMenuItem* fMountMI;
BMenuItem* fUnmountMI;
+1
View File
@@ -76,6 +76,7 @@ MergeObject <libbe>storage_kit.o :
Partition.cpp
PartitionDelegate.cpp
PartitioningInfo.cpp
PartitionParameterEditor.cpp
PartitionReference.cpp
CreateChildJob.cpp
@@ -52,7 +52,7 @@ BDiskSystemAddOn::CanInitialize(const BMutablePartition* partition)
// GetInitializationParameterEditor
status_t
BDiskSystemAddOn::GetInitializationParameterEditor(
const BMutablePartition* partition, BDiskDeviceParameterEditor** editor)
const BMutablePartition* partition, BPartitionParameterEditor** editor)
{
return B_NOT_SUPPORTED;
}
@@ -297,7 +297,7 @@ BPartitionHandle::SetType(BMutablePartition* child, const char* type)
// GetContentParameterEditor
status_t
BPartitionHandle::GetContentParameterEditor(BDiskDeviceParameterEditor** editor)
BPartitionHandle::GetContentParameterEditor(BPartitionParameterEditor** editor)
{
return B_NOT_SUPPORTED;
}
@@ -306,7 +306,7 @@ BPartitionHandle::GetContentParameterEditor(BDiskDeviceParameterEditor** editor)
// GetParameterEditor
status_t
BPartitionHandle::GetParameterEditor(const BMutablePartition* child,
BDiskDeviceParameterEditor** editor)
BPartitionParameterEditor** editor)
{
return B_NOT_SUPPORTED;
}
@@ -349,7 +349,7 @@ BPartitionHandle::SetParameters(BMutablePartition* child,
// GetChildCreationParameterEditor
status_t
BPartitionHandle::GetChildCreationParameterEditor(const char* type,
BDiskDeviceParameterEditor** editor)
BPartitionParameterEditor** editor)
{
return B_NOT_SUPPORTED;
}
+16 -8
View File
@@ -212,6 +212,14 @@ BPartition::IsBusy() const
}
// SupportsChildName
bool
BPartition::SupportsChildName() const
{
return _SupportsChildOperation(NULL, B_DISK_SYSTEM_SUPPORTS_NAME);
}
// Flags
/*! \brief Returns the flags for this partitions.
@@ -557,11 +565,11 @@ BPartition::Mount(const char* mountPoint, uint32 mountFlags,
mountPoint = mountPointPath.Path();
markerPath = mountPointPath;
markerPath.Append(skAutoCreatePrefix);
// create the directory
if (mkdir(mountPoint, S_IRWXU | S_IRWXG | S_IRWXO) < 0)
return errno;
if (mkdir(markerPath.Path(), S_IRWXU | S_IRWXG | S_IRWXO) < 0) {
rmdir(mountPoint);
return errno;
@@ -1075,7 +1083,7 @@ BPartition::CanEditParameters() const
// GetParameterEditor
status_t
BPartition::GetParameterEditor(BDiskDeviceParameterEditor** editor)
BPartition::GetParameterEditor(BPartitionParameterEditor** editor)
{
BPartition* parent = Parent();
if (!parent || !fDelegate)
@@ -1109,7 +1117,7 @@ BPartition::CanEditContentParameters(bool* whileMounted) const
// GetContentParameterEditor
status_t
BPartition::GetContentParameterEditor(BDiskDeviceParameterEditor** editor)
BPartition::GetContentParameterEditor(BPartitionParameterEditor** editor)
{
if (!fDelegate)
return B_NO_INIT;
@@ -1131,7 +1139,7 @@ BPartition::SetContentParameters(const char* parameters)
// GetNextSupportedType
status_t
BPartition::GetNextSupportedType(int32 *cookie, BString* type) const
BPartition::GetNextSupportedType(int32* cookie, BString* type) const
{
TRACE("%p->BPartition::GetNextSupportedType(%ld)\n", this, *cookie);
@@ -1149,7 +1157,7 @@ BPartition::GetNextSupportedType(int32 *cookie, BString* type) const
// GetNextSupportedChildType
status_t
BPartition::GetNextSupportedChildType(int32 *cookie, BString* type) const
BPartition::GetNextSupportedChildType(int32* cookie, BString* type) const
{
TRACE("%p->BPartition::GetNextSupportedChildType(%ld)\n", this, *cookie);
@@ -1185,7 +1193,7 @@ BPartition::CanInitialize(const char* diskSystem) const
// GetInitializationParameterEditor
status_t
BPartition::GetInitializationParameterEditor(const char* diskSystem,
BDiskDeviceParameterEditor** editor) const
BPartitionParameterEditor** editor) const
{
if (!fDelegate)
return B_NO_INIT;
@@ -1238,7 +1246,7 @@ BPartition::CanCreateChild() const
// GetChildCreationParameterEditor
status_t
BPartition::GetChildCreationParameterEditor(const char* type,
BDiskDeviceParameterEditor** editor) const
BPartitionParameterEditor** editor) const
{
if (!fDelegate)
return B_NO_INIT;
@@ -339,7 +339,7 @@ BPartition::Delegate::SetType(Delegate* child, const char* type)
// GetContentParameterEditor
status_t
BPartition::Delegate::GetContentParameterEditor(
BDiskDeviceParameterEditor** editor) const
BPartitionParameterEditor** editor) const
{
if (!fPartitionHandle)
return B_NO_INIT;
@@ -351,7 +351,7 @@ BPartition::Delegate::GetContentParameterEditor(
// GetParameterEditor
status_t
BPartition::Delegate::GetParameterEditor(Delegate* child,
BDiskDeviceParameterEditor** editor) const
BPartitionParameterEditor** editor) const
{
if (!fPartitionHandle || !child)
return B_NO_INIT;
@@ -443,7 +443,7 @@ BPartition::Delegate::CanInitialize(const char* diskSystem) const
// GetInitializationParameterEditor
status_t
BPartition::Delegate::GetInitializationParameterEditor(
const char* diskSystem, BDiskDeviceParameterEditor** editor) const
const char* diskSystem, BPartitionParameterEditor** editor) const
{
// get the disk system add-on
DiskSystemAddOnManager* manager = DiskSystemAddOnManager::Default();
@@ -540,7 +540,7 @@ BPartition::Delegate::GetPartitioningInfo(BPartitioningInfo* info)
// GetChildCreationParameterEditor
status_t
BPartition::Delegate::GetChildCreationParameterEditor(const char* type,
BDiskDeviceParameterEditor** editor) const
BPartitionParameterEditor** editor) const
{
if (!fPartitionHandle)
return B_NO_INIT;
@@ -67,9 +67,9 @@ public:
status_t SetType(Delegate* child, const char* type);
status_t GetContentParameterEditor(
BDiskDeviceParameterEditor** editor) const;
BPartitionParameterEditor** editor) const;
status_t GetParameterEditor(Delegate* child,
BDiskDeviceParameterEditor** editor) const;
BPartitionParameterEditor** editor) const;
status_t SetContentParameters(const char* parameters);
status_t SetParameters(Delegate* child,
const char* parameters);
@@ -82,7 +82,7 @@ public:
bool CanInitialize(const char* diskSystem) const;
status_t GetInitializationParameterEditor(
const char* system,
BDiskDeviceParameterEditor** editor) const;
BPartitionParameterEditor** editor) const;
status_t ValidateInitialize(const char* diskSystem,
BString* name, const char* parameters);
status_t Initialize(const char* diskSystem,
@@ -96,7 +96,7 @@ public:
status_t GetChildCreationParameterEditor(
const char* system,
BDiskDeviceParameterEditor** editor) const;
BPartitionParameterEditor** editor) const;
status_t ValidateCreateChild(off_t* start, off_t* size,
const char* type, BString* name,
const char* parameters) const;
@@ -0,0 +1,109 @@
/*
* Copyright 2009, Bryce Groff, brycegroff@gmail.com.
* Distributed under the terms of the MIT License.
*/
#include <PartitionParameterEditor.h>
#include <String.h>
#include <View.h>
BPartitionParameterEditor::BPartitionParameterEditor()
{
}
BPartitionParameterEditor::~BPartitionParameterEditor()
{
}
/*! \brief Returns a view containing the controls needed for editing the
parameters.
To be overridden by derived classes.
The base class version returns \c NULL.
The returned BView is added to a window occasionally and removed, when
editing is done. The view belongs to the editor and needs to be deleted
by it. Subsequent calls to this method may return the same view, or each
time delete the old one and return a new one.
\return A view containing the controls needed for editing the parameters.
\c NULL can be returned, if no parameters are needed.
*/
BView*
BPartitionParameterEditor::View()
{
return NULL;
}
// FinishedEditing
/*! \brief Called when the user finishes editing the parameters.
To be overridden by derived classes.
The base class version returns \c true.
The method is supposed to check whether the parameters the user set,
are valid, and, if so, return \c true. Otherwise return \c false.
\return \c true, if the current parameters are valid, \c false otherwise.
*/
bool
BPartitionParameterEditor::FinishedEditing()
{
return true;
}
/*! \brief Returns the edited parameters.
To be overridden by derived classes.
The base class version returns an empty string.
\param parameters A BString to be set to the edited parameters.
\return \c B_OK, if everything went fine, another error code otherwise.
*/
status_t
BPartitionParameterEditor::GetParameters(BString* parameters)
{
status_t error = (parameters ? B_OK : B_BAD_VALUE);
if (error == B_OK)
parameters->SetTo("");
return error;
}
/*! \brief Called when type information has changed.
To be overridden by derived classes.
The base class version returns B_OK.
\param type A string that is the new type.
\return \c B_OK, if everything went fine, another error code otherwise.
*/
status_t
BPartitionParameterEditor::PartitionTypeChanged(const char* type)
{
return B_OK;
}
/*! \brief Called when name information has changed.
To be overridden by derived classes.
The base class version returns B_OK.
\param name A string that is the new name.
\return \c B_OK, if everything went fine, another error code otherwise.
*/
status_t
BPartitionParameterEditor::PartitionNameChanged(const char* name)
{
return B_OK;
}
@@ -434,8 +434,7 @@ KPartitioningSystem::CreateChild(KPartition* partition, off_t offset,
// let the module do its job
result = fModule->create_child(fd, partition->ID(), offset, size,
type, parameters, job, &childID);
// TODO: Added name parameter to create_child() hook.
type, name, parameters, job, &childID);
// find and return the child
*child = KDiskDeviceManager::Default()->FindPartition(childID);