1 /* 2 * Copyright 2007, Ingo Weinhold, ingo_weinhold@gmx.de. 3 * Copyright 2008-2012, Axel Dörfler, axeld@pinc-software.de. 4 * Copyright 2012, Gerasim Troeglazov (3dEyes**), 3dEyes@gmail.com 5 * 6 * Distributed under the terms of the MIT License. 7 */ 8 9 10 #include "NTFSAddOn.h" 11 #include "InitializeParameterEditor.h" 12 13 #include <new> 14 15 #include <Directory.h> 16 #include <List.h> 17 #include <Path.h> 18 #include <Volume.h> 19 20 #include <DiskDeviceTypes.h> 21 #include <MutablePartition.h> 22 23 #include <AutoDeleter.h> 24 #include <StringForSize.h> 25 26 #include <debug.h> 27 #include <stdio.h> 28 29 #ifdef ASSERT 30 # undef ASSERT 31 #endif 32 33 34 using std::nothrow; 35 36 #define kPartitionTypeNTFS "NT File System" 37 38 static const uint32 kDiskSystemFlags = 39 0 40 | B_DISK_SYSTEM_SUPPORTS_INITIALIZING 41 | B_DISK_SYSTEM_SUPPORTS_CONTENT_NAME 42 ; 43 44 #define TRACE printf 45 46 NTFSAddOn::NTFSAddOn() 47 : BDiskSystemAddOn(kPartitionTypeNTFS, kDiskSystemFlags) 48 { 49 } 50 51 52 NTFSAddOn::~NTFSAddOn() 53 { 54 } 55 56 57 status_t 58 NTFSAddOn::CreatePartitionHandle(BMutablePartition* partition, 59 BPartitionHandle** _handle) 60 { 61 NTFSPartitionHandle* handle = new(nothrow) NTFSPartitionHandle(partition); 62 if (!handle) 63 return B_NO_MEMORY; 64 65 status_t error = handle->Init(); 66 if (error != B_OK) { 67 delete handle; 68 return error; 69 } 70 71 *_handle = handle; 72 73 return B_OK; 74 } 75 76 77 bool 78 NTFSAddOn::CanInitialize(const BMutablePartition* partition) 79 { 80 return true; 81 } 82 83 84 status_t 85 NTFSAddOn::ValidateInitialize(const BMutablePartition* partition, BString* name, 86 const char* parameterString) 87 { 88 if (!CanInitialize(partition) || !name) 89 return B_BAD_VALUE; 90 91 if (name->Length() >= MAX_PATH) 92 name->Truncate(MAX_PATH - 1); 93 94 name->ReplaceAll('/', '-'); 95 96 return B_OK; 97 } 98 99 100 status_t 101 NTFSAddOn::Initialize(BMutablePartition* partition, const char* name, 102 const char* parameterString, BPartitionHandle** _handle) 103 { 104 if (!CanInitialize(partition) || name == NULL) 105 return B_BAD_VALUE; 106 107 NTFSPartitionHandle* handle = new(nothrow) NTFSPartitionHandle(partition); 108 if (!handle) 109 return B_NO_MEMORY; 110 ObjectDeleter<NTFSPartitionHandle> handleDeleter(handle); 111 112 status_t error = partition->SetContentType(Name()); 113 if (error != B_OK) 114 return error; 115 116 partition->SetContentName(name); 117 partition->SetContentParameters(parameterString); 118 uint32 blockSize = 4096; 119 partition->SetBlockSize(blockSize); 120 partition->SetContentSize(partition->Size() / blockSize * blockSize); 121 partition->Changed(B_PARTITION_CHANGED_INITIALIZATION); 122 123 *_handle = handleDeleter.Detach(); 124 return B_OK; 125 } 126 127 128 status_t 129 NTFSAddOn::GetParameterEditor(B_PARAMETER_EDITOR_TYPE type, 130 BPartitionParameterEditor** editor) 131 { 132 *editor = NULL; 133 if (type == B_INITIALIZE_PARAMETER_EDITOR) { 134 try { 135 *editor = new InitializeNTFSEditor(); 136 } catch (std::bad_alloc) { 137 return B_NO_MEMORY; 138 } 139 return B_OK; 140 } 141 return B_NOT_SUPPORTED; 142 } 143 144 145 NTFSPartitionHandle::NTFSPartitionHandle(BMutablePartition* partition) 146 : BPartitionHandle(partition) 147 { 148 } 149 150 151 NTFSPartitionHandle::~NTFSPartitionHandle() 152 { 153 } 154 155 156 status_t 157 NTFSPartitionHandle::Init() 158 { 159 return B_OK; 160 } 161 162 163 uint32 164 NTFSPartitionHandle::SupportedOperations(uint32 mask) 165 { 166 return kDiskSystemFlags & mask; 167 } 168 169 170 status_t 171 get_disk_system_add_ons(BList* addOns) 172 { 173 NTFSAddOn* addOn = new(nothrow) NTFSAddOn; 174 if (!addOn) 175 return B_NO_MEMORY; 176 177 if (!addOns->AddItem(addOn)) { 178 delete addOn; 179 return B_NO_MEMORY; 180 } 181 return B_OK; 182 } 183