summaryrefslogtreecommitdiff
path: root/Source/Kernel/VFS/Part.ns.cpp
blob: 7184f9084d4b83554322a0c2c981844a5c05adea (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include "Part.ns.h"

namespace Part {

Vector<BlockDevice*> devices;
Vector<Partition*> partitions;

void readPartitionTable(BlockDevice *dev) {	//TODO : read partition table from device
	partitions.push(new Partition(dev, 0, 0, dev->blocks()));	//Insert whole device as a partition
}

void registerDevice(BlockDevice *dev) {
	unregisterDevice(dev);

	asm volatile("cli");

	readPartitionTable(dev);

	bool inserted = false;
	for (u32int i = 0; i < devices.size(); i++) {
		if (devices[i] == 0) {
			devices[i] = dev;
			inserted = true;
			break;
		}
	}
	if (!inserted) devices.push(dev);

	asm volatile("sti");
}

void unregisterDevice(BlockDevice *dev) {
	asm volatile("cli");
	//Unregister && delete partitions
	for (u32int i = 0; i < partitions.size(); i++) {
		if (partitions[i]->getDevice() == dev) {
			delete partitions[i];
			partitions[i] = partitions.back();
			partitions.pop();
			i--;
		}
	}
	//Unregister device
	for (u32int i = 0; i < devices.size(); i++) {
		if (devices[i] == dev) devices[i] = 0;
	}
	if (!devices.empty() && devices.back() == 0) devices.pop();

	asm volatile("sti");
}

u32int getDeviceID(BlockDevice* dev) {
	for (u32int i = 0; i < devices.size(); i++) {
		if (devices[i] == dev) return i;
	}
	return (u32int) - 1;
}

BlockDevice* dev(String _class, u32int idx) {
	for (u32int i = 0; i < devices.size(); i++) {
		String devclass = devices[i]->getClass();
		if (devclass == _class or (devclass.size() > _class.size() and devclass.substr(0, _class.size()) == _class)) {
			if (idx == 0) {
				return devices[i];
			} else {
				idx--;
			}
		}
	}
	return NULL;
}

Partition* part(BlockDevice* dev, u32int idx) {
	for (u32int i = 0; i < partitions.size(); i++) {
		if (partitions[i]->getDevice() == dev) {
			if (idx == 0) {
				return partitions[i];
			} else {
				idx--;
			}
		}
	}
	return NULL;
}

}