Subversion Repositories Kolibri OS

Rev

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