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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
#include "File.class.h"
#include <VFS/VFS.ns.h>
#include <TaskManager/Task.ns.h>
File::File() : m_file(NULL), m_valid(false), m_writable(false), m_position(0) {
}
File::File(String filename, u8int mode, FSNode* start) :
m_file(NULL), m_valid(false), m_writable(false), m_position(0) {
open(filename, mode, start);
}
File::~File() {
close();
}
bool File::open(String filename, u8int mode, FSNode* start) {
if (m_valid) return false;
FSNode* node = VFS::find(filename, start);
if (node == NULL) return false;
if (node->type() != NT_FILE) return false;
m_file = (FileNode*) node;
m_writable = (mode != FM_READ);
if (!m_file->writable() and m_writable) return false;
if (mode == FM_READ or mode == FM_REPLACE) {
m_position = 0;
} else if (mode == FM_TRUNCATE) {
if (!m_file->truncate()) return false;
m_position = 0;
} else if (mode == FM_APPEND) {
m_position = m_file->getLength();
}
if (m_writable)
m_file->m_readers++;
else
m_file->m_writers++;
Task::currentProcess->registerFileDescriptor(this);
m_valid = true;
return true;
}
u32int File::read(u32int max_length, u8int *data) {
if (!m_valid) return 0;
u32int l = m_file->read(m_position, max_length, data);
m_position += l;
return l;
}
bool File::write(u32int length, u8int *data) {
if (!m_valid) return false;
if (!m_writable) return false;
if (m_file->write(m_position, length, data)) {
m_position += length;
return true;
}
return false;
}
bool File::seek(u64int count, u8int mode) {
if (!m_valid) return false;
if (mode == SM_FORWARD) {
if (m_position + count <= m_file->getLength()) {
m_position += count;
return true;
} else {
return false;
}
} else if (mode == SM_BACKWARD) {
if (count <= m_position) {
m_position -= count;
return true;
} else {
return false;
}
} else if (mode == SM_BEGINNING) {
if (count <= m_file->getLength()) {
m_position = count;
return true;
} else {
return false;
}
} else if (mode == SM_END) {
if (count <= m_file->getLength()) {
m_position = m_file->getLength() - count;
return true;
} else {
return false;
}
}
return false;
}
void File::close(bool unregisterFD) {
if (!m_valid) return;
if (m_writable)
m_file->m_writers--;
else
m_file->m_readers--;
m_valid = false;
m_file = NULL;
m_position = 0;
m_writable = false;
if (unregisterFD) Task::currentProcess->unregisterFileDescriptor(this);
}
|