Subversion Repositories Kolibri OS

Rev

Rev 8129 | Rev 8170 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 8129 Rev 8133
Line 1... Line 1...
1
#ifndef __MENUET_FILE_H_INCLUDED_
1
#ifndef __KOLIBRI_FILE_H_INCLUDED_
2
#define __MENUET_FILE_H_INCLUDED_
2
#define __KOLIBRI_FILE_H_INCLUDED_
Line 3... Line 3...
3
 
3
 
4
#include 
4
#include 
Line 5... Line 5...
5
#include 
5
#include 
Line 65... Line 65...
65
	TFileData FileOpen(const char *name, unsigned int buffer_length)
65
	TFileData FileOpen(const char *name, unsigned int buffer_length)
66
	{
66
	{
67
		if (!name || !name[0]) return 0;
67
		if (!name || !name[0]) return 0;
68
		unsigned int name_len = StrLen(name) + 1;
68
		unsigned int name_len = StrLen(name) + 1;
69
		unsigned int data_len = (_FileDataStruct::PosName + name_len + 3) & ~3;
69
		unsigned int data_len = (_FileDataStruct::PosName + name_len + 3) & ~3;
70
		buffer_length = (buffer_length / MENUET_FILE_BLOCK_SIZE) * MENUET_FILE_BLOCK_SIZE;
70
		buffer_length = (buffer_length / KOLIBRI_FILE_BLOCK_SIZE) * KOLIBRI_FILE_BLOCK_SIZE;
71
		if (buffer_length) data_len += buffer_length + 2*sizeof(unsigned int);
71
		if (buffer_length) data_len += buffer_length + 2*sizeof(unsigned int);
72
		TFileData file = (TFileData)Alloc(_FileDataStruct::PosName + data_len);
72
		TFileData file = (TFileData)Alloc(_FileDataStruct::PosName + data_len);
73
		if (!file) return 0;
73
		if (!file) return 0;
74
		file->length = -1;
74
		file->length = -1;
75
		file->position = 0;
75
		file->position = 0;
Line 117... Line 117...
117
		unsigned int *buffer;
117
		unsigned int *buffer;
118
		if (!file_data || !mem || size <= 0) return -1;
118
		if (!file_data || !mem || size <= 0) return -1;
119
		if (file_data->buffer) buffer = file_data->buffer;
119
		if (file_data->buffer) buffer = file_data->buffer;
120
		else if (temp_mem)
120
		else if (temp_mem)
121
		{
121
		{
122
			buffer = (unsigned int*)((char*)temp_mem + MENUET_FILE_BLOCK_SIZE);
122
			buffer = (unsigned int*)((char*)temp_mem + KOLIBRI_FILE_BLOCK_SIZE);
123
		}
123
		}
124
		else return 0;
124
		else return 0;
125
		if (!buffer[1]) return 0;
125
		if (!buffer[1]) return 0;
126
		if (file_data->position >= file_data->length)
126
		if (file_data->position >= file_data->length)
127
		{
127
		{
Line 140... Line 140...
140
 
140
 
141
	int _FileReadSystem(TFileData file_data, void *mem, int size)
141
	int _FileReadSystem(TFileData file_data, void *mem, int size)
142
	{
142
	{
143
		int res;
143
		int res;
144
		unsigned int len0, len1;
144
		unsigned int len0, len1;
145
		size /= MENUET_FILE_BLOCK_SIZE;
145
		size /= KOLIBRI_FILE_BLOCK_SIZE;
146
		if (!file_data || !mem || size <= 0) return -1;
146
		if (!file_data || !mem || size <= 0) return -1;
147
		file_data->access_param[0] = 0;
147
		file_data->access_param[0] = 0;
148
		file_data->access_param[1] = (file_data->position / MENUET_FILE_BLOCK_SIZE) * MENUET_FILE_BLOCK_SIZE;
148
		file_data->access_param[1] = (file_data->position / KOLIBRI_FILE_BLOCK_SIZE) * KOLIBRI_FILE_BLOCK_SIZE;
149
		file_data->access_param[2] = 0;
149
		file_data->access_param[2] = 0;
150
		file_data->access_param[3] = size * MENUET_FILE_BLOCK_SIZE;
150
		file_data->access_param[3] = size * KOLIBRI_FILE_BLOCK_SIZE;
151
		file_data->access_param[4] = (unsigned int)mem;
151
		file_data->access_param[4] = (unsigned int)mem;
152
		res = _FileAccess(file_data->access_param);
152
		res = _FileAccess(file_data->access_param);
153
		if (res != 0 && res != 6) return (res & 255) - 1024;
153
		if (res != 0 && res != 6) return (res & 255) - 1024;
154
		if (file_data->length <= file_data->position) return 0;
154
		if (file_data->length <= file_data->position) return 0;
155
		len0 = file_data->length - file_data->position;
155
		len0 = file_data->length - file_data->position;
156
		len1 = size * MENUET_FILE_BLOCK_SIZE - (file_data->position % MENUET_FILE_BLOCK_SIZE);
156
		len1 = size * KOLIBRI_FILE_BLOCK_SIZE - (file_data->position % KOLIBRI_FILE_BLOCK_SIZE);
157
		return (len0 <= len1) ? len0 : len1;
157
		return (len0 <= len1) ? len0 : len1;
Line 158... Line 158...
158
	}
158
	}
159
 
159
 
Line 165... Line 165...
165
		if (file_data->buffer) buffer = file_data->buffer;
165
		if (file_data->buffer) buffer = file_data->buffer;
166
		else
166
		else
167
		{
167
		{
168
			if (!temp_mem)
168
			if (!temp_mem)
169
			{
169
			{
170
				temp_mem = Alloc(MENUET_FILE_BLOCK_SIZE + 2*sizeof(unsigned int));
170
				temp_mem = Alloc(KOLIBRI_FILE_BLOCK_SIZE + 2*sizeof(unsigned int));
171
				if (!temp_mem) return -10;
171
				if (!temp_mem) return -10;
172
			}
172
			}
173
			buffer = (unsigned int*)((char*)temp_mem + MENUET_FILE_BLOCK_SIZE);
173
			buffer = (unsigned int*)((char*)temp_mem + KOLIBRI_FILE_BLOCK_SIZE);
174
			buffer[0] = MENUET_FILE_BLOCK_SIZE;
174
			buffer[0] = KOLIBRI_FILE_BLOCK_SIZE;
175
		}
175
		}
176
		buffer[1] = buffer[0];
176
		buffer[1] = buffer[0];
177
		res = _FileReadSystem(file_data, (char*)buffer - buffer[1], buffer[1]);
177
		res = _FileReadSystem(file_data, (char*)buffer - buffer[1], buffer[1]);
178
		if (res < 0) buffer[1] = 0;
178
		if (res < 0) buffer[1] = 0;
179
		else buffer[1] -= file_data->position % MENUET_FILE_BLOCK_SIZE;
179
		else buffer[1] -= file_data->position % KOLIBRI_FILE_BLOCK_SIZE;
180
		return res;
180
		return res;
181
	}
181
	}
Line 182... Line 182...
182
 
182
 
183
	int FileTestRead(TFileData file_data)
183
	int FileTestRead(TFileData file_data)
Line 198... Line 198...
198
		res = _FileReadBuffer(file_data, mem, size);
198
		res = _FileReadBuffer(file_data, mem, size);
199
		if (res < 0 || res >= size) return res;
199
		if (res < 0 || res >= size) return res;
200
		read_len = res;
200
		read_len = res;
201
		mem = (char*)mem + res;
201
		mem = (char*)mem + res;
202
		size -= res;
202
		size -= res;
203
		tlen = file_data->position % MENUET_FILE_BLOCK_SIZE;
203
		tlen = file_data->position % KOLIBRI_FILE_BLOCK_SIZE;
204
		if (tlen)
204
		if (tlen)
205
		{
205
		{
206
			res = _FileBufferSystem(file_data, temp_mem);
206
			res = _FileBufferSystem(file_data, temp_mem);
207
			if (res < 0)
207
			if (res < 0)
208
			{
208
			{
Line 218... Line 218...
218
				return read_len;
218
				return read_len;
219
			}
219
			}
220
			mem = (char*)mem + res;
220
			mem = (char*)mem + res;
221
			size -= res;
221
			size -= res;
222
		}
222
		}
223
		if (size >= (file_data->buffer ? file_data->buffer[0] : MENUET_FILE_BLOCK_SIZE))
223
		if (size >= (file_data->buffer ? file_data->buffer[0] : KOLIBRI_FILE_BLOCK_SIZE))
224
		{
224
		{
225
			res = _FileReadSystem(file_data, mem, size);
225
			res = _FileReadSystem(file_data, mem, size);
226
			if (res < 0)
226
			if (res < 0)
227
			{
227
			{
228
				if (temp_mem) Free(temp_mem);
228
				if (temp_mem) Free(temp_mem);
229
				return read_len ? read_len : res;
229
				return read_len ? read_len : res;
230
			}
230
			}
231
			file_data->position += res;
231
			file_data->position += res;
232
			read_len += res;
232
			read_len += res;
233
			if (res < (size / MENUET_FILE_BLOCK_SIZE) * MENUET_FILE_BLOCK_SIZE)
233
			if (res < (size / KOLIBRI_FILE_BLOCK_SIZE) * KOLIBRI_FILE_BLOCK_SIZE)
234
			{
234
			{
235
				if (temp_mem) Free(temp_mem);
235
				if (temp_mem) Free(temp_mem);
236
				return read_len;
236
				return read_len;
237
			}
237
			}
238
			mem = (char*)mem + res;
238
			mem = (char*)mem + res;
Line 272... Line 272...
272
	};
272
	};
273
}
273
}
Line 274... Line 274...
274
 
274
 
Line 275... Line 275...
275
#endif  // else: def  __MENUET__
275
#endif  // else: def  __MENUET__