Subversion Repositories Kolibri OS

Rev

Rev 7768 | Rev 7889 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
5640 pavelyakov 1
//IO library
5660 pavelyakov 2
 
3
/*
4
	class IO:
6021 leency 5
		io.count(path)           -     path
6
		io.size(path)            -  (/) path
7
		io.run(path,param)       -   path   param
8
		io.write(size,data,path) -     data   path
9
		io.read(path)            -   path     
10
		io.move(path1,path2)     -  (/)  path1  path2
11
		io.copy(path1,path2)     -  (/)  path1  path2
12
		io.set(path,attribute)   -    (/)
13
		io.del(path)             -  (/)
5660 pavelyakov 14
 
6021 leency 15
		io.dir.load(path)        -      path (    free!!!)
16
		io.dir.position(number)  -       number
17
		io.dir.make(path)        -   path
5660 pavelyakov 18
 
6021 leency 19
		io.dir.buffer            -     - (io.dir.load)
20
		io.dir.count             -    - (io.count)
5660 pavelyakov 21
*/
22
 
5640 pavelyakov 23
#ifndef INCLUDE_IO_H
24
#define INCLUDE_IO_H
25
 
26
#ifndef INCLUDE_DATE_H
27
#include "../lib/date.h"
28
#endif
29
 
30
#ifdef LANG_RUS
31
	#define __T__GB ""
32
	#define __T__MB ""
33
	#define __T__KB ""
34
	#define __T___B ""
35
#else
36
	#define __T__GB "Gb"
37
	#define __T__MB "Mb"
38
	#define __T__KB "Kb"
39
	#define __T___B "B"
40
#endif
41
 
42
#define ATR_READONLY   000001b
43
#define ATR_HIDDEN     000100b
44
#define ATR_SYSTEM     010000b
45
 
46
#define ATR_NOREADONLY 000010b
47
#define ATR_NOHIDDEN   001000b
48
#define ATR_NOSYSTEM   100000b
49
 
50
:enum
51
{
52
	DIR_ALL,
53
	DIR_NOROOT,
54
	DIR_ONLYREAL
55
};
56
 
57
:struct ___f70{
58
	dword	func;
59
	dword	param1;
60
	dword	param2;
61
	dword	param3;
62
	dword	param4;
63
	char	rezerv;
64
	dword	name;
65
}__file_F70;
66
 
67
:int ___ReadDir(dword file_count, read_buffer, dir_path)
68
{
69
	__file_F70.func = 1;
70
	__file_F70.param1 =
71
	__file_F70.param2 =
72
	__file_F70.rezerv = 0;
73
	__file_F70.param3 = file_count;
74
	__file_F70.param4 = read_buffer;
5646 pavelyakov 75
	__file_F70.name = io.path.path(dir_path);
5640 pavelyakov 76
	$mov eax,70
77
	$mov ebx,#__file_F70.func
78
	$int 0x40
79
}
80
 
81
:dword ___GetFileInfo(dword file_path, bdvk_struct)
82
{
83
    __file_F70.func = 5;
84
    __file_F70.param1 =
85
    __file_F70.param2 =
86
    __file_F70.param3 = 0;
87
    __file_F70.param4 = bdvk_struct;
88
    __file_F70.rezerv = 0;
5646 pavelyakov 89
    __file_F70.name = io.path.path(file_path);
5640 pavelyakov 90
    $mov eax,70
91
    $mov ebx,#__file_F70.func
92
    $int 0x40
93
}
94
 
95
:struct ____BDVK {
96
	dword	readonly:1, hidden:1, system:1, volume_label:1, isfolder:1, notarchived:1, :0;
97
	byte	type_name;
98
	byte	rez1, rez2, selected;
99
	dword   timecreate;
100
	date 	datecreate;
101
	dword	timelastaccess;
102
	date	datelastaccess;
103
	dword	timelastedit;
104
	date	datelastedit;
105
	dword	sizelo;
106
	dword	sizehi;
107
	char	name[518];
108
};
109
 
110
:struct __FILE
111
{
112
	dword count;
113
	int del(...);
114
	int read(...);
115
	int write(...);
116
	dword set(...);
117
};
118
:dword __FILE::set(dword file_path)
119
{
120
    __file_F70.func = 6;
121
    __file_F70.param1 =
122
    __file_F70.param2 =
123
    __file_F70.param3 = 0;
124
    __file_F70.param4 = #io.BDVK;
125
    __file_F70.rezerv = 0;
5646 pavelyakov 126
    __file_F70.name = io.path.path(file_path);
5640 pavelyakov 127
    $mov eax,70
128
    $mov ebx,#__file_F70.func
129
    $int 0x40
130
}
131
:int __FILE::del(dword PATH)
132
{
133
	__file_F70.func = 8;
134
	__file_F70.param1 =
135
	__file_F70.param2 =
136
	__file_F70.param3 =
137
	__file_F70.param4 =
138
	__file_F70.rezerv = 0;
5646 pavelyakov 139
	__file_F70.name = io.path.path(PATH);
5640 pavelyakov 140
	$mov eax,70
141
	$mov ebx,#__file_F70.func
142
	$int 0x40
143
}
144
:int __FILE::read(dword read_pos, read_file_size, read_buffer, read_file_path)
145
{
146
	__file_F70.func = 0;
147
	__file_F70.param1 = read_pos;
148
	__file_F70.param2 = 0;
149
	__file_F70.param3 = read_file_size;
150
	__file_F70.param4 = read_buffer;
151
	__file_F70.rezerv = 0;
5646 pavelyakov 152
	__file_F70.name = io.path.path(read_file_path);
5640 pavelyakov 153
	$mov eax,70
154
	$mov ebx,#__file_F70.func
155
	$int 0x40
156
}
157
:int __FILE::write(dword write_file_size, write_buffer, write_file_path)
158
{
159
	__file_F70.func = 2;
160
	__file_F70.param1 = 0;
161
	__file_F70.param2 = 0;
162
	__file_F70.param3 = write_file_size;
163
	__file_F70.param4 = write_buffer;
164
	__file_F70.rezerv = 0;
5646 pavelyakov 165
	__file_F70.name = io.path.path(write_file_path);
5640 pavelyakov 166
	$mov eax,70
167
	$mov ebx,#__file_F70.func
168
	$int 0x40
169
}
170
:struct __DIR
171
{
172
	int make(dword name);
5648 pavelyakov 173
	dword load(...);
5646 pavelyakov 174
	dword position(dword i);
5640 pavelyakov 175
	dword buffer;
176
	signed count;
177
};
5646 pavelyakov 178
:dword __DIR::position(dword i)
179
{
180
	return i*304+buffer+72;
181
}
5640 pavelyakov 182
:int __DIR::make(dword new_folder_path)
183
{
184
	__file_F70.func = 9;
185
	__file_F70.param1 =
186
	__file_F70.param2 =
187
	__file_F70.param3 =
188
	__file_F70.param4 =
189
	__file_F70.rezerv = 0;
5646 pavelyakov 190
	__file_F70.name = io.path.path(new_folder_path);
5640 pavelyakov 191
	$mov eax,70
192
	$mov ebx,#__file_F70.func
193
	$int 0x40
194
}
195
 
5648 pavelyakov 196
:dword __DIR::load(dword PATH;byte options)
197
{
198
	io.count(PATH);
199
	if(count!=-1)
200
	{
201
		buffer = malloc(count+1*304+32);
202
		___ReadDir(count, buffer, PATH);
203
		if (options == DIR_ONLYREAL)
204
		{
205
			if (!strcmp(".",buffer+72)){count--; memmov(buffer,buffer+304,count*304);}
206
			if (!strcmp("..",buffer+72)){count--; memmov(buffer,buffer+304,count*304);}
207
			return buffer;
208
		}
209
		if (options == DIR_NOROOT)
210
		{
211
			if (!strcmp(".",buffer+72)) memmov(buffer,buffer+304,count*304-304);
212
			return buffer;
213
		}
214
		return buffer;
215
	}
216
	return NULL;
217
}
218
 
7773 leency 219
:void get_path_name(dword BUF,PATH)
220
{
221
	dword beg = PATH;
222
	dword pos = PATH;
223
	dword sav = PATH;
224
	dword i;
225
	while(DSBYTE[pos])
226
	{
227
		if(DSBYTE[pos]=='/')sav = pos;
228
		pos++;
229
	}
230
	i = sav-beg;
231
	while(i)
232
	{
233
		DSBYTE[BUF] = DSBYTE[beg];
234
		beg++;
235
		BUF++;
236
		i--;
237
	}
238
	DSBYTE[BUF] = 0;
239
}
240
 
5640 pavelyakov 241
:struct __PATH
242
{
243
	dword file(...);
244
	dword path(...);
245
};
5646 pavelyakov 246
 
5640 pavelyakov 247
:char __PATH_NEW[4096];
248
:dword __PATH::path(dword PATH)
249
{
7773 leency 250
	char self_dir[4096];
5648 pavelyakov 251
	dword pos;
7773 leency 252
 
253
	get_path_name(#self_dir,I_Path);
254
 
255
	if(!PATH) return #self_dir;
5648 pavelyakov 256
	pos = PATH;
6759 leency 257
	if(DSBYTE[pos]=='/') || (!strncmp(PATH,"./",2))
5640 pavelyakov 258
	{
6759 leency 259
		return PATH;
5640 pavelyakov 260
	}
7773 leency 261
	strcpy(#__PATH_NEW, #self_dir);
7768 leency 262
	chrcat(#__PATH_NEW, '/');
263
	strcpy(#__PATH_NEW, PATH);
5646 pavelyakov 264
	return #__PATH_NEW;
5640 pavelyakov 265
}
266
 
267
:dword __PATH::file(dword name)
268
{
269
	dword ret;
270
	ret = name;
271
	while(DSBYTE[name])
272
	{
273
		if(DSBYTE[name]=='/')ret = name+1;
274
		name++;
275
	}
276
	return ret;
277
}
278
 
279
:struct IO
280
{
281
	dword buffer_data;
282
	dword size_dir;
283
	dword count_dirs,count_files;
284
	signed FILES_SIZE;
285
	dword file_name;
286
	double size(...);
287
	dword get_size_dir(dword name);
288
	signed count(dword path);
289
	signed int run(dword path,param);
290
	byte del(...);
291
	dword read(...);
292
	int write(...);
293
	byte copy(...);
294
	byte move(...);
295
	dword set(...);
5730 pavelyakov 296
	dword readKPACK(dword path1);
5640 pavelyakov 297
	dword convert_size();
298
	__DIR dir;
299
	__PATH path;
300
	__FILE file;
301
	____BDVK BDVK;
302
}io;
303
:byte __ConvertSize_size_prefix[8];
304
:dword IO::convert_size()
305
{
306
	byte size_nm[3];
307
	dword bytes;
308
	bytes = FILES_SIZE;
5646 pavelyakov 309
	if (bytes>=1073741824) strlcpy(#size_nm, __T__GB,2);
310
	else if (bytes>=1048576) strlcpy(#size_nm, __T__MB,2);
311
	else if (bytes>=1024) strlcpy(#size_nm, __T__KB,2);
312
	else strlcpy(#size_nm, __T___B,1);
5640 pavelyakov 313
	while (bytes>1023) bytes/=1024;
314
	sprintf(#__ConvertSize_size_prefix,"%d %s",bytes,#size_nm);
315
	return #__ConvertSize_size_prefix;
316
}
5751 leency 317
:dword IO::readKPACK(dword path1)
318
{
319
	EAX = 68;
320
	EBX = 27;
321
	ECX = path1;
322
	$int 0x40;
323
	FILES_SIZE = EDX;
324
	buffer_data = EAX;
325
	return buffer_data;
326
}
5640 pavelyakov 327
:int IO::write(dword PATH,data)
328
{
329
	file.write(0,strlen(data),data,PATH);
330
}
5800 pavelyakov 331
:char BYTE_HEAD_FILE_KPCK[4];
5640 pavelyakov 332
:dword IO::read(dword PATH)
333
{
5745 leency 334
	int result;
5640 pavelyakov 335
	___GetFileInfo(PATH, #BDVK);
5800 pavelyakov 336
	if(BDVK.isfolder)return false;
337
	file.read(0,4,#BYTE_HEAD_FILE_KPCK,PATH);
338
	IF(DSDWORD[#BYTE_HEAD_FILE_KPCK]=='KCPK')return readKPACK(PATH);
5640 pavelyakov 339
	FILES_SIZE = BDVK.sizelo;
340
	buffer_data = malloc(FILES_SIZE+1);
5745 leency 341
	result = file.read(0,FILES_SIZE,buffer_data,PATH);
342
	if (result!=0) buffer_data = free(buffer_data);	//file read failed
5751 leency 343
	return buffer_data;
5640 pavelyakov 344
}
345
 
346
:signed int IO::run(dword rpath,rparam)
347
{
348
	__file_F70.func = 7;
349
    __file_F70.param1 =
350
    __file_F70.param3 =
351
    __file_F70.param4 =
352
    __file_F70.rezerv = 0;
353
    __file_F70.param2 = rparam;
5646 pavelyakov 354
    __file_F70.name = path.path(rpath);
5640 pavelyakov 355
    $mov eax,70
356
    $mov ebx,#__file_F70.func
357
    $int 0x40
358
}
359
:signed IO::count(dword PATH)
360
{
361
	byte buf[32];
362
	if(!___ReadDir(0, #buf, PATH))
363
	{
364
		dir.count = ESDWORD[#buf+8];
365
		return dir.count;
366
	}
367
	return -1;
368
}
5646 pavelyakov 369
 
5640 pavelyakov 370
:double IO::size(dword PATH)
371
{
372
	dword i,tmp_buf,count_dir,count_file;
373
	dword filename;
374
	double size_tmp;
375
	double tmp;
376
	if(!PATH)return 0;
377
	if(___GetFileInfo(PATH, #BDVK))return -1;
378
	if(BDVK.isfolder)
379
	{
5648 pavelyakov 380
		tmp_buf = dir.load(PATH,DIR_ONLYREAL);
5640 pavelyakov 381
		if(dir.count<1)return 0;
382
		count_dir = dir.count;
383
		i = 0;
384
		size_tmp = 0;
385
		count_file = malloc(4096);
386
		while(i
387
		{
388
			filename = i*304+tmp_buf+72;
389
			sprintf(count_file,"%s/%s",PATH,filename);
390
			tmp = size(count_file);
391
			if(tmp==-1)return -1;
392
			size_tmp += tmp;
393
			i++;
394
			if (TestBit(ESDWORD[filename-40], 4))count_dirs++;
395
			else count_files++;
396
		}
397
 
398
		free(tmp_buf);
399
		free(count_file);
400
		FILES_SIZE = size_tmp;
401
		return FILES_SIZE;
402
	}
403
	FILES_SIZE = BDVK.sizelo;
404
	count_files++;
405
	return FILES_SIZE;
406
}
407
:byte IO::del(dword PATH)
408
{
409
	dword i,tmp_buf,count_dir,count_file;
410
	if(!PATH)return 0;
411
	if(___GetFileInfo(PATH, #BDVK))return false;
412
	if(BDVK.isfolder)
413
	{
5648 pavelyakov 414
		tmp_buf = dir.load(PATH,DIR_ONLYREAL);
5640 pavelyakov 415
		count_dir = dir.count;
416
		i = 0;
417
		count_file = malloc(4096);
418
		while(i
419
		{
420
			sprintf(count_file,"%s/%s",PATH,i*304+tmp_buf+72);
421
			if(!del(count_file))return false;
422
			i++;
423
		}
424
		free(tmp_buf);
425
		free(count_file);
426
	}
427
	file.del(PATH);
428
	return true;
429
}
430
:dword IO::set(dword PATH,atr)
431
{
432
	dword i,tmp_buf,count_dir,count_file;
433
	byte cmd_read,cmd_hide,cmd_system;
434
	if(!PATH)return 0;
435
	if(___GetFileInfo(PATH, #BDVK))return false;
436
	cmd_read   = atr&11b;
437
	atr>>=2;
438
	cmd_hide   = atr&11b;
439
	atr>>=2;
440
	cmd_system = atr&11b;
441
	if(BDVK.isfolder)
442
	{
5648 pavelyakov 443
		tmp_buf = dir.load(PATH,DIR_ONLYREAL);
5640 pavelyakov 444
		count_dir = dir.count;
445
		i = 0;
446
		count_file = malloc(4096);
447
		while(i
448
		{
449
			sprintf(count_file,"%s/%s",PATH,i*304+tmp_buf+72);
450
			file.set(PATH,atr);
451
			i++;
452
		}
453
		free(tmp_buf);
454
		free(count_file);
455
		return 0;
456
	}
457
	if(cmd_read)
458
	{
459
		if(cmd_read&01b)BDVK.readonly = true;
460
		else BDVK.readonly = false;
461
	}
462
	if(cmd_hide)
463
	{
464
		if(cmd_hide&01b)BDVK.hidden = true;
465
		else BDVK.hidden = false;
466
	}
467
	if(cmd_system)
468
	{
469
		if(cmd_system&01b)BDVK.system = true;
470
		else BDVK.system = false;
471
	}
472
	file.set(PATH);
473
}
474
:byte IO::copy(dword PATH,PATH1)
475
{
476
	dword i,tmp_buf,count_dir,count_file;
477
	dword _path_;
478
	byte ret;
479
	if(!PATH)return 0;
480
	if(___GetFileInfo(PATH, #BDVK))return false;
481
	_path_ = malloc(4096);
482
	if(BDVK.isfolder)
483
	{
484
		sprintf(_path_,"%s/%s",PATH1,path.file(PATH));
485
		dir.make(_path_);
5648 pavelyakov 486
		tmp_buf = dir.load(PATH,DIR_ONLYREAL);
5640 pavelyakov 487
		count_dir = dir.count;
488
		i = 0;
489
		count_file = malloc(4096);
490
		while(i
491
		{
492
			sprintf(count_file,"%s/%s",PATH,i*304+tmp_buf+72);
493
			if(!copy(count_file,_path_))return false;
494
			i++;
495
		}
496
		free(tmp_buf);
497
		free(count_file);
498
		free(_path_);
499
		return true;
500
	}
501
	read(PATH);
502
	sprintf(_path_,"%s/%s",PATH1,path.file(PATH));
503
	ret = file.write(FILES_SIZE,buffer_data,_path_);
504
	free(_path_);
505
	if(!ret)return true;
506
	return false;
507
}
508
:byte IO::move(dword PATH,PATH1)
509
{
510
	if(copy(PATH,PATH1))if(del(PATH))return true;
511
	return false;
512
}
513
 
514
#endif