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