From 1ebf3204636c8934f32068a9420b983b90f542b4 Mon Sep 17 00:00:00 2001 From: threedeyes <3dEyes@gmail.com> Date: Sat, 3 Nov 2012 13:00:22 +0000 Subject: [PATCH] NTFS: Added simple disk_system add-on for ntfs --- build/jam/HaikuImage | 2 +- src/add-ons/disk_systems/Jamfile | 1 + .../ntfs/InitializeParameterEditor.cpp | 97 ++++++++++ .../ntfs/InitializeParameterEditor.h | 40 ++++ src/add-ons/disk_systems/ntfs/Jamfile | 15 ++ src/add-ons/disk_systems/ntfs/NTFSAddOn.cpp | 182 ++++++++++++++++++ src/add-ons/disk_systems/ntfs/NTFSAddOn.h | 53 +++++ src/add-ons/disk_systems/ntfs/NTFSAddOn.rdef | 15 ++ 8 files changed, 404 insertions(+), 1 deletion(-) create mode 100644 src/add-ons/disk_systems/ntfs/InitializeParameterEditor.cpp create mode 100644 src/add-ons/disk_systems/ntfs/InitializeParameterEditor.h create mode 100644 src/add-ons/disk_systems/ntfs/Jamfile create mode 100644 src/add-ons/disk_systems/ntfs/NTFSAddOn.cpp create mode 100644 src/add-ons/disk_systems/ntfs/NTFSAddOn.h create mode 100644 src/add-ons/disk_systems/ntfs/NTFSAddOn.rdef diff --git a/build/jam/HaikuImage b/build/jam/HaikuImage index 342cf2bc9c..ac9c364511 100644 --- a/build/jam/HaikuImage +++ b/build/jam/HaikuImage @@ -670,7 +670,7 @@ AddFilesToHaikuImage system add-ons Screen\ Savers : $(SYSTEM_ADD_ONS_SCREENSAVERS) ; AddFilesToHaikuImage system add-ons disk_systems - : intel bfs ; + : intel bfs ntfs ; # decorators AddDirectoryToHaikuImage home config add-ons decorators ; diff --git a/src/add-ons/disk_systems/Jamfile b/src/add-ons/disk_systems/Jamfile index 10a858cfab..6262e19a6f 100644 --- a/src/add-ons/disk_systems/Jamfile +++ b/src/add-ons/disk_systems/Jamfile @@ -2,3 +2,4 @@ SubDir HAIKU_TOP src add-ons disk_systems ; SubInclude HAIKU_TOP src add-ons disk_systems bfs ; SubInclude HAIKU_TOP src add-ons disk_systems intel ; +SubInclude HAIKU_TOP src add-ons disk_systems ntfs ; diff --git a/src/add-ons/disk_systems/ntfs/InitializeParameterEditor.cpp b/src/add-ons/disk_systems/ntfs/InitializeParameterEditor.cpp new file mode 100644 index 0000000000..ac44bfc8cf --- /dev/null +++ b/src/add-ons/disk_systems/ntfs/InitializeParameterEditor.cpp @@ -0,0 +1,97 @@ +/* + * Copyright 2009-2010, Stephan Aßmus + * Copyright 2009, Bryce Groff, brycegroff@gmail.com. + * Distributed under the terms of the MIT License. + */ + + +#include + +#include "InitializeParameterEditor.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +static uint32 MSG_NAME_CHANGED = 'nmch'; + + +InitializeNTFSEditor::InitializeNTFSEditor() + : + BPartitionParameterEditor(), + fView(NULL), + fNameTC(NULL), + fParameters(NULL) +{ + _CreateViewControls(); +} + + +InitializeNTFSEditor::~InitializeNTFSEditor() +{ +} + + +BView* +InitializeNTFSEditor::View() +{ + return fView; +} + + +bool +InitializeNTFSEditor::FinishedEditing() +{ + fParameters = ""; + fParameters << "name \"" << fNameTC->Text() << "\";\n"; + + return true; +} + + +status_t +InitializeNTFSEditor::GetParameters(BString* parameters) +{ + if (parameters == NULL) + return B_BAD_VALUE; + + *parameters = fParameters; + return B_OK; +} + + +status_t +InitializeNTFSEditor::PartitionNameChanged(const char* name) +{ + fNameTC->SetText(name); + return B_OK; +} + + +void +InitializeNTFSEditor::_CreateViewControls() +{ + fNameTC = new BTextControl("Name:", "Haiku", NULL); + fNameTC->SetModificationMessage(new BMessage(MSG_NAME_CHANGED)); + // TODO find out what is the max length for this specific FS partition name + fNameTC->TextView()->SetMaxBytes(31); + + float spacing = be_control_look->DefaultItemSpacing(); + + fView = BGridLayoutBuilder(spacing, spacing) + // row 1 + .Add(fNameTC->CreateLabelLayoutItem(), 0, 0) + .Add(fNameTC->CreateTextViewLayoutItem(), 1, 0).View() + ; +} diff --git a/src/add-ons/disk_systems/ntfs/InitializeParameterEditor.h b/src/add-ons/disk_systems/ntfs/InitializeParameterEditor.h new file mode 100644 index 0000000000..bdb66471d8 --- /dev/null +++ b/src/add-ons/disk_systems/ntfs/InitializeParameterEditor.h @@ -0,0 +1,40 @@ +/* + * Copyright 2009-2010, Stephan Aßmus + * Copyright 2009, Bryce Groff, brycegroff@gmail.com. + * Distributed under the terms of the MIT License. + */ +#ifndef _INITIALIZE_PARAMETER_EDITOR +#define _INITIALIZE_PARAMETER_EDITOR + + +#include +#include + +class BCheckBox; +class BMenuField; +class BTextControl; +class BView; + + +class InitializeNTFSEditor : public BPartitionParameterEditor { +public: + InitializeNTFSEditor(); + virtual ~InitializeNTFSEditor(); + + 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; + + BString fParameters; +}; + + +#endif //_INITIALIZE_PARAMETER_EDITOR diff --git a/src/add-ons/disk_systems/ntfs/Jamfile b/src/add-ons/disk_systems/ntfs/Jamfile new file mode 100644 index 0000000000..342108b552 --- /dev/null +++ b/src/add-ons/disk_systems/ntfs/Jamfile @@ -0,0 +1,15 @@ +SubDir HAIKU_TOP src add-ons disk_systems ntfs ; + +UsePrivateKernelHeaders ; +UsePrivateHeaders shared storage ; + +SEARCH_SOURCE += [ FDirName $(HAIKU_TOP) src add-ons kernel file_systems ntfs ] ; + +AddResources ntfs : NTFSAddOn.rdef ; + +Addon ntfs : + NTFSAddOn.cpp + InitializeParameterEditor.cpp + + : be $(HAIKU_LOCALE_LIBS) $(TARGET_LIBSUPC++) libshared.a +; diff --git a/src/add-ons/disk_systems/ntfs/NTFSAddOn.cpp b/src/add-ons/disk_systems/ntfs/NTFSAddOn.cpp new file mode 100644 index 0000000000..75a2ac53f2 --- /dev/null +++ b/src/add-ons/disk_systems/ntfs/NTFSAddOn.cpp @@ -0,0 +1,182 @@ +/* + * Copyright 2007, Ingo Weinhold, ingo_weinhold@gmx.de. + * Copyright 2008-2012, Axel Dörfler, axeld@pinc-software.de. + * Copyright 2012, Gerasim Troeglazov (3dEyes**), 3dEyes@gmail.com + * + * Distributed under the terms of the MIT License. + */ + + +#include "NTFSAddOn.h" +#include "InitializeParameterEditor.h" + +#include + +#include +#include +#include +#include + +#include +#include + +#include +#include + +#include +#include + +#ifdef ASSERT +# undef ASSERT +#endif + + +using std::nothrow; + +#define kPartitionTypeNTFS "NTFS File System" + +static const uint32 kDiskSystemFlags = + 0 + | B_DISK_SYSTEM_SUPPORTS_INITIALIZING + | B_DISK_SYSTEM_SUPPORTS_CONTENT_NAME +; + +#define TRACE printf + +NTFSAddOn::NTFSAddOn() + : BDiskSystemAddOn(kPartitionTypeNTFS, kDiskSystemFlags) +{ +} + + +NTFSAddOn::~NTFSAddOn() +{ +} + + +status_t +NTFSAddOn::CreatePartitionHandle(BMutablePartition* partition, + BPartitionHandle** _handle) +{ + NTFSPartitionHandle* handle = new(nothrow) NTFSPartitionHandle(partition); + if (!handle) + return B_NO_MEMORY; + + status_t error = handle->Init(); + if (error != B_OK) { + delete handle; + return error; + } + + *_handle = handle; + + return B_OK; +} + + +bool +NTFSAddOn::CanInitialize(const BMutablePartition* partition) +{ + return true; +} + + +status_t +NTFSAddOn::ValidateInitialize(const BMutablePartition* partition, BString* name, + const char* parameterString) +{ + if (!CanInitialize(partition) || !name) + return B_BAD_VALUE; + + if (name->Length() >= MAX_PATH) + name->Truncate(MAX_PATH - 1); + + name->ReplaceAll('/', '-'); + + return B_OK; +} + + +status_t +NTFSAddOn::Initialize(BMutablePartition* partition, const char* name, + const char* parameterString, BPartitionHandle** _handle) +{ + if (!CanInitialize(partition) || name == NULL) + return B_BAD_VALUE; + + NTFSPartitionHandle* handle = new(nothrow) NTFSPartitionHandle(partition); + if (!handle) + return B_NO_MEMORY; + ObjectDeleter handleDeleter(handle); + + status_t error = partition->SetContentType(Name()); + if (error != B_OK) + return error; + + partition->SetContentName(name); + partition->SetContentParameters(parameterString); + uint32 blockSize = 4096; + partition->SetBlockSize(blockSize); + partition->SetContentSize(partition->Size() / blockSize * blockSize); + partition->Changed(B_PARTITION_CHANGED_INITIALIZATION); + + *_handle = handleDeleter.Detach(); + return B_OK; +} + + +status_t +NTFSAddOn::GetParameterEditor(B_PARAMETER_EDITOR_TYPE type, + BPartitionParameterEditor** editor) +{ + *editor = NULL; + if (type == B_INITIALIZE_PARAMETER_EDITOR) { + try { + *editor = new InitializeNTFSEditor(); + } catch (std::bad_alloc) { + return B_NO_MEMORY; + } + return B_OK; + } + return B_NOT_SUPPORTED; +} + + +NTFSPartitionHandle::NTFSPartitionHandle(BMutablePartition* partition) + : BPartitionHandle(partition) +{ +} + + +NTFSPartitionHandle::~NTFSPartitionHandle() +{ +} + + +status_t +NTFSPartitionHandle::Init() +{ + return B_OK; +} + + +uint32 +NTFSPartitionHandle::SupportedOperations(uint32 mask) +{ + return kDiskSystemFlags & mask; +} + + +status_t +get_disk_system_add_ons(BList* addOns) +{ + NTFSAddOn* addOn = new(nothrow) NTFSAddOn; + if (!addOn) + return B_NO_MEMORY; + + if (!addOns->AddItem(addOn)) { + delete addOn; + return B_NO_MEMORY; + } + return B_OK; +} diff --git a/src/add-ons/disk_systems/ntfs/NTFSAddOn.h b/src/add-ons/disk_systems/ntfs/NTFSAddOn.h new file mode 100644 index 0000000000..8d6edbb577 --- /dev/null +++ b/src/add-ons/disk_systems/ntfs/NTFSAddOn.h @@ -0,0 +1,53 @@ +/* + * Copyright 2007, Ingo Weinhold, ingo_weinhold@gmx.de. + * Copyright 2008-2012, Axel Dörfler, axeld@pinc-software.de. + * Copyright 2012, Gerasim Troeglazov (3dEyes**), 3dEyes@gmail.com + * + * Distributed under the terms of the MIT License. + */ + +#ifndef _NTFS_ADD_ON_H +#define _NTFS_ADD_ON_H + +#include + +#ifndef MAX_PATH +#define MAX_PATH 1024 +#endif + +class NTFSAddOn : public BDiskSystemAddOn { +public: + NTFSAddOn(); + virtual ~NTFSAddOn(); + + virtual status_t CreatePartitionHandle( + BMutablePartition* partition, + BPartitionHandle** handle); + virtual status_t GetParameterEditor( + B_PARAMETER_EDITOR_TYPE type, + BPartitionParameterEditor** editor); + + virtual bool CanInitialize( + const BMutablePartition* partition); + virtual status_t ValidateInitialize( + const BMutablePartition* partition, + BString* name, const char* parameters); + virtual status_t Initialize(BMutablePartition* partition, + const char* name, const char* parameters, + BPartitionHandle** handle); +}; + + +class NTFSPartitionHandle : public BPartitionHandle { +public: + NTFSPartitionHandle( + BMutablePartition* partition); + ~NTFSPartitionHandle(); + + status_t Init(); + + virtual uint32 SupportedOperations(uint32 mask); +}; + + +#endif // _NTFS_ADD_ON_H diff --git a/src/add-ons/disk_systems/ntfs/NTFSAddOn.rdef b/src/add-ons/disk_systems/ntfs/NTFSAddOn.rdef new file mode 100644 index 0000000000..44435fe18f --- /dev/null +++ b/src/add-ons/disk_systems/ntfs/NTFSAddOn.rdef @@ -0,0 +1,15 @@ +/* + * NTFSAddOn.rdef + */ + +resource app_signature "application/x-vnd.Haiku-NTFSAddOn"; + +resource app_version { + major = 0, + middle = 0, + minor = 1, + variety = 0, + internal = 0, + short_info = "0.0.1", + long_info = "Haiku NTFS disk add-on." +};