Support for creating and deleting (the latter not yet implemented) file disk devices. Added file system addition.

git-svn-id: file:///srv/svn/repos/haiku/trunk/current@3601 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Ingo Weinhold 2003-06-22 23:00:20 +00:00
parent bdc530c737
commit 38d5e95af9
2 changed files with 105 additions and 15 deletions

View File

@ -14,6 +14,7 @@ class KDiskDevice;
class KDiskDeviceJob; class KDiskDeviceJob;
class KDiskDeviceJobQueue; class KDiskDeviceJobQueue;
class KDiskSystem; class KDiskSystem;
class KFileDiskDevice;
class KPartition; class KPartition;
class KDiskDeviceManager { class KDiskDeviceManager {
@ -41,12 +42,19 @@ public:
KDiskDevice *FindDevice(partition_id id, bool noShadow = true); KDiskDevice *FindDevice(partition_id id, bool noShadow = true);
KPartition *FindPartition(const char *path, bool noShadow = true); KPartition *FindPartition(const char *path, bool noShadow = true);
KPartition *FindPartition(partition_id id, bool noShadow = true); KPartition *FindPartition(partition_id id, bool noShadow = true);
KFileDiskDevice *FindFileDevice(const char *filePath,
bool noShadow = true);
KDiskDevice *RegisterDevice(const char *path, bool noShadow = true); KDiskDevice *RegisterDevice(const char *path, bool noShadow = true);
KDiskDevice *RegisterDevice(partition_id id, bool noShadow = true); KDiskDevice *RegisterDevice(partition_id id, bool noShadow = true);
KDiskDevice *RegisterNextDevice(int32 *cookie); KDiskDevice *RegisterNextDevice(int32 *cookie);
KPartition *RegisterPartition(const char *path, bool noShadow = true); KPartition *RegisterPartition(const char *path, bool noShadow = true);
KPartition *RegisterPartition(partition_id id, bool noShadow = true); KPartition *RegisterPartition(partition_id id, bool noShadow = true);
KFileDiskDevice *RegisterFileDevice(const char *filePath,
bool noShadow = true);
status_t CreateFileDevice(const char *filePath, int32 *device = 0);
status_t DeleteFileDevice(const char *filePath);
// manager must be locked // manager must be locked
int32 CountDevices(); int32 CountDevices();
@ -94,6 +102,7 @@ private:
bool _RemoveDevice(KDiskDevice *device); bool _RemoveDevice(KDiskDevice *device);
status_t _Scan(const char *path); status_t _Scan(const char *path);
status_t _ScanDevice(KDiskDevice *device);
status_t _ScanPartition(KPartition *partition); status_t _ScanPartition(KPartition *partition);
BLocker fLock; BLocker fLock;

View File

@ -12,6 +12,7 @@
#include "KDiskDeviceManager.h" #include "KDiskDeviceManager.h"
#include "KDiskDeviceUtils.h" #include "KDiskDeviceUtils.h"
#include "KDiskSystem.h" #include "KDiskSystem.h"
#include "KFileDiskDevice.h"
#include "KFileSystem.h" #include "KFileSystem.h"
#include "KPartition.h" #include "KPartition.h"
#include "KPartitioningSystem.h" #include "KPartitioningSystem.h"
@ -58,6 +59,7 @@ DBG(OUT("file system: %s\n", moduleName));
} }
close_module_list(list); close_module_list(list);
} }
DBG(OUT("number of disk systems: %ld\n", CountDiskSystems()));
// TODO: Watch the disk systems and the relevant directories. // TODO: Watch the disk systems and the relevant directories.
} }
@ -174,6 +176,21 @@ KDiskDeviceManager::FindPartition(partition_id id, bool noShadow)
return NULL; return NULL;
} }
// FindFileDevice
KFileDiskDevice *
KDiskDeviceManager::FindFileDevice(const char *filePath, bool noShadow)
{
// TODO: Handle shadows correctly!
for (int32 i = 0; KDiskDevice *device = fDevices.ItemAt(i); i++) {
KFileDiskDevice *fileDevice = dynamic_cast<KFileDiskDevice*>(device);
if (fileDevice && fileDevice->FilePath()
&& !strcmp(filePath, fileDevice->FilePath())) {
return fileDevice;
}
}
return NULL;
}
// RegisterDevice // RegisterDevice
KDiskDevice * KDiskDevice *
KDiskDeviceManager::RegisterDevice(const char *path, bool noShadow) KDiskDeviceManager::RegisterDevice(const char *path, bool noShadow)
@ -248,6 +265,64 @@ KDiskDeviceManager::RegisterPartition(partition_id id, bool noShadow)
return NULL; return NULL;
} }
// RegisterFileDevice
KFileDiskDevice *
KDiskDeviceManager::RegisterFileDevice(const char *filePath, bool noShadow)
{
if (ManagerLocker locker = this) {
if (KFileDiskDevice *device = FindFileDevice(filePath, noShadow)) {
device->Register();
return device;
}
}
return NULL;
}
// CreateFileDevice
status_t
KDiskDeviceManager::CreateFileDevice(const char *filePath, int32 *deviceID)
{
if (!filePath)
return B_BAD_VALUE;
status_t error = B_ERROR;
KFileDiskDevice *device = NULL;
if (ManagerLocker locker = this) {
// check, if the device does already exist
if (FindFileDevice(filePath))
return B_FILE_EXISTS;
// allocate a KFileDiskDevice
device = new(nothrow) KFileDiskDevice;
if (!device)
return B_NO_MEMORY;
// initialize and add the device
error = device->SetTo(filePath);
if (error == B_OK && !fDevices.AddItem(device))
error = B_NO_MEMORY;
// set result / cleanup und failure
if (error != B_OK) {
delete device;
return error;
}
if (deviceID)
*deviceID = device->ID();
device->Register();
}
// scan device
if (error == B_OK && device) {
_ScanDevice(device);
device->Unregister();
}
return error;
}
// DeleteFileDevice
status_t
KDiskDeviceManager::DeleteFileDevice(const char *filePath)
{
// not implemented
return B_ERROR;
}
// CountDevices // CountDevices
int32 int32
KDiskDeviceManager::CountDevices() KDiskDeviceManager::CountDevices()
@ -411,17 +486,7 @@ KDiskDeviceManager::InitialDeviceScan()
if (error == B_OK) { if (error == B_OK) {
int32 cookie = 0; int32 cookie = 0;
while (KDiskDevice *device = RegisterNextDevice(&cookie)) { while (KDiskDevice *device = RegisterNextDevice(&cookie)) {
if (device->WriteLock()) { error = _ScanDevice(device);
// scan the device
if (device->HasMedia()) {
error = _ScanPartition(device);
if (error != B_OK) {
// ...
error = B_OK;
}
}
device->WriteUnlock();
}
device->Unregister(); device->Unregister();
} }
} }
@ -444,16 +509,12 @@ KDiskDeviceManager::_AddPartitioningSystem(const char *name)
status_t status_t
KDiskDeviceManager::_AddFileSystem(const char *name) KDiskDeviceManager::_AddFileSystem(const char *name)
{ {
// TODO: Uncomment when KFileSystem is implemented.
/*
if (!name) if (!name)
return B_BAD_VALUE; return B_BAD_VALUE;
KDiskSystem *diskSystem = new(nothrow) KFileSystem(name); KDiskSystem *diskSystem = new(nothrow) KFileSystem(name);
if (!diskSystem) if (!diskSystem)
return B_NO_MEMORY; return B_NO_MEMORY;
return _AddDiskSystem(diskSystem); return _AddDiskSystem(diskSystem);
*/
return B_ERROR;
} }
// _AddDiskSystem // _AddDiskSystem
@ -541,6 +602,26 @@ DBG(OUT(" found device: %s\n", path));
return error; return error;
} }
// _ScanDevice
status_t
KDiskDeviceManager::_ScanDevice(KDiskDevice *device)
{
status_t error = B_OK;
if (device->WriteLock()) {
// scan the device
if (device->HasMedia()) {
error = _ScanPartition(device);
if (error != B_OK) {
// ...
error = B_OK;
}
}
device->WriteUnlock();
} else
error = B_ERROR;
return error;
}
// _ScanPartition // _ScanPartition
status_t status_t
KDiskDeviceManager::_ScanPartition(KPartition *partition) KDiskDeviceManager::_ScanPartition(KPartition *partition)