xref: /haiku/src/add-ons/disk_systems/ntfs/NTFSAddOn.cpp (revision d284f7cc43cc0d1106c3b0c40e62c58107648573)
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