Subversion Repositories Kolibri OS

Rev

Rev 6759 | Rev 7031 | 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
 
5640 pavelyakov 219
:struct __PATH
220
{
221
	dword file(...);
222
	dword path(...);
223
};
5646 pavelyakov 224
 
5640 pavelyakov 225
:char __PATH_NEW[4096];
226
:dword __PATH::path(dword PATH)
227
{
5648 pavelyakov 228
	dword pos;
229
	if(!PATH) return self.dir;
230
	pos = PATH;
6759 leency 231
	if(DSBYTE[pos]=='/') || (!strncmp(PATH,"./",2))
5640 pavelyakov 232
	{
6759 leency 233
		return PATH;
5640 pavelyakov 234
	}
5648 pavelyakov 235
	sprintf(#__PATH_NEW,"%s/%s",self.dir,PATH);
5646 pavelyakov 236
	return #__PATH_NEW;
5640 pavelyakov 237
}
238
 
239
:dword __PATH::file(dword name)
240
{
241
	dword ret;
242
	ret = name;
243
	while(DSBYTE[name])
244
	{
245
		if(DSBYTE[name]=='/')ret = name+1;
246
		name++;
247
	}
248
	return ret;
249
}
250
 
251
:struct IO
252
{
253
	dword buffer_data;
254
	dword size_dir;
255
	dword count_dirs,count_files;
256
	signed FILES_SIZE;
257
	dword file_name;
258
	double size(...);
259
	dword get_size_dir(dword name);
260
	signed count(dword path);
261
	signed int run(dword path,param);
262
	byte del(...);
263
	dword read(...);
264
	int write(...);
265
	byte copy(...);
266
	byte move(...);
267
	dword set(...);
5730 pavelyakov 268
	dword readKPACK(dword path1);
5640 pavelyakov 269
	dword convert_size();
270
	__DIR dir;
271
	__PATH path;
272
	__FILE file;
273
	____BDVK BDVK;
274
}io;
275
:byte __ConvertSize_size_prefix[8];
276
:dword IO::convert_size()
277
{
278
	byte size_nm[3];
279
	dword bytes;
280
	bytes = FILES_SIZE;
5646 pavelyakov 281
	if (bytes>=1073741824) strlcpy(#size_nm, __T__GB,2);
282
	else if (bytes>=1048576) strlcpy(#size_nm, __T__MB,2);
283
	else if (bytes>=1024) strlcpy(#size_nm, __T__KB,2);
284
	else strlcpy(#size_nm, __T___B,1);
5640 pavelyakov 285
	while (bytes>1023) bytes/=1024;
286
	sprintf(#__ConvertSize_size_prefix,"%d %s",bytes,#size_nm);
287
	return #__ConvertSize_size_prefix;
288
}
5751 leency 289
:dword IO::readKPACK(dword path1)
290
{
291
	EAX = 68;
292
	EBX = 27;
293
	ECX = path1;
294
	$int 0x40;
295
	FILES_SIZE = EDX;
296
	buffer_data = EAX;
297
	return buffer_data;
298
}
5640 pavelyakov 299
:int IO::write(dword PATH,data)
300
{
301
	file.write(0,strlen(data),data,PATH);
302
}
5800 pavelyakov 303
:char BYTE_HEAD_FILE_KPCK[4];
5640 pavelyakov 304
:dword IO::read(dword PATH)
305
{
5745 leency 306
	int result;
5640 pavelyakov 307
	___GetFileInfo(PATH, #BDVK);
5800 pavelyakov 308
	if(BDVK.isfolder)return false;
309
	file.read(0,4,#BYTE_HEAD_FILE_KPCK,PATH);
310
	IF(DSDWORD[#BYTE_HEAD_FILE_KPCK]=='KCPK')return readKPACK(PATH);
5640 pavelyakov 311
	FILES_SIZE = BDVK.sizelo;
312
	buffer_data = malloc(FILES_SIZE+1);
5745 leency 313
	result = file.read(0,FILES_SIZE,buffer_data,PATH);
314
	if (result!=0) buffer_data = free(buffer_data);	//file read failed
5751 leency 315
	return buffer_data;
5640 pavelyakov 316
}
317
 
318
:signed int IO::run(dword rpath,rparam)
319
{
320
	__file_F70.func = 7;
321
    __file_F70.param1 =
322
    __file_F70.param3 =
323
    __file_F70.param4 =
324
    __file_F70.rezerv = 0;
325
    __file_F70.param2 = rparam;
5646 pavelyakov 326
    __file_F70.name = path.path(rpath);
6759 leency 327
    debugln(__file_F70.name);
5640 pavelyakov 328
    $mov eax,70
329
    $mov ebx,#__file_F70.func
330
    $int 0x40
331
}
332
:signed IO::count(dword PATH)
333
{
334
	byte buf[32];
335
	if(!___ReadDir(0, #buf, PATH))
336
	{
337
		dir.count = ESDWORD[#buf+8];
338
		return dir.count;
339
	}
340
	return -1;
341
}
5646 pavelyakov 342
 
5640 pavelyakov 343
:double IO::size(dword PATH)
344
{
345
	dword i,tmp_buf,count_dir,count_file;
346
	dword filename;
347
	double size_tmp;
348
	double tmp;
349
	if(!PATH)return 0;
350
	if(___GetFileInfo(PATH, #BDVK))return -1;
351
	if(BDVK.isfolder)
352
	{
5648 pavelyakov 353
		tmp_buf = dir.load(PATH,DIR_ONLYREAL);
5640 pavelyakov 354
		if(dir.count<1)return 0;
355
		count_dir = dir.count;
356
		i = 0;
357
		size_tmp = 0;
358
		count_file = malloc(4096);
359
		while(i
360
		{
361
			filename = i*304+tmp_buf+72;
362
			sprintf(count_file,"%s/%s",PATH,filename);
363
			tmp = size(count_file);
364
			if(tmp==-1)return -1;
365
			size_tmp += tmp;
366
			i++;
367
			if (TestBit(ESDWORD[filename-40], 4))count_dirs++;
368
			else count_files++;
369
		}
370
 
371
		free(tmp_buf);
372
		free(count_file);
373
		FILES_SIZE = size_tmp;
374
		return FILES_SIZE;
375
	}
376
	FILES_SIZE = BDVK.sizelo;
377
	count_files++;
378
	return FILES_SIZE;
379
}
380
:byte IO::del(dword PATH)
381
{
382
	dword i,tmp_buf,count_dir,count_file;
383
	if(!PATH)return 0;
384
	if(___GetFileInfo(PATH, #BDVK))return false;
385
	if(BDVK.isfolder)
386
	{
5648 pavelyakov 387
		tmp_buf = dir.load(PATH,DIR_ONLYREAL);
5640 pavelyakov 388
		count_dir = dir.count;
389
		i = 0;
390
		count_file = malloc(4096);
391
		while(i
392
		{
393
			sprintf(count_file,"%s/%s",PATH,i*304+tmp_buf+72);
394
			if(!del(count_file))return false;
395
			i++;
396
		}
397
		free(tmp_buf);
398
		free(count_file);
399
	}
400
	file.del(PATH);
401
	return true;
402
}
403
:dword IO::set(dword PATH,atr)
404
{
405
	dword i,tmp_buf,count_dir,count_file;
406
	byte cmd_read,cmd_hide,cmd_system;
407
	if(!PATH)return 0;
408
	if(___GetFileInfo(PATH, #BDVK))return false;
409
	cmd_read   = atr&11b;
410
	atr>>=2;
411
	cmd_hide   = atr&11b;
412
	atr>>=2;
413
	cmd_system = atr&11b;
414
	if(BDVK.isfolder)
415
	{
5648 pavelyakov 416
		tmp_buf = dir.load(PATH,DIR_ONLYREAL);
5640 pavelyakov 417
		count_dir = dir.count;
418
		i = 0;
419
		count_file = malloc(4096);
420
		while(i
421
		{
422
			sprintf(count_file,"%s/%s",PATH,i*304+tmp_buf+72);
423
			file.set(PATH,atr);
424
			i++;
425
		}
426
		free(tmp_buf);
427
		free(count_file);
428
		return 0;
429
	}
430
	if(cmd_read)
431
	{
432
		if(cmd_read&01b)BDVK.readonly = true;
433
		else BDVK.readonly = false;
434
	}
435
	if(cmd_hide)
436
	{
437
		if(cmd_hide&01b)BDVK.hidden = true;
438
		else BDVK.hidden = false;
439
	}
440
	if(cmd_system)
441
	{
442
		if(cmd_system&01b)BDVK.system = true;
443
		else BDVK.system = false;
444
	}
445
	file.set(PATH);
446
}
447
:byte IO::copy(dword PATH,PATH1)
448
{
449
	dword i,tmp_buf,count_dir,count_file;
450
	dword _path_;
451
	byte ret;
452
	if(!PATH)return 0;
453
	if(___GetFileInfo(PATH, #BDVK))return false;
454
	_path_ = malloc(4096);
455
	if(BDVK.isfolder)
456
	{
457
		sprintf(_path_,"%s/%s",PATH1,path.file(PATH));
458
		dir.make(_path_);
5648 pavelyakov 459
		tmp_buf = dir.load(PATH,DIR_ONLYREAL);
5640 pavelyakov 460
		count_dir = dir.count;
461
		i = 0;
462
		count_file = malloc(4096);
463
		while(i
464
		{
465
			sprintf(count_file,"%s/%s",PATH,i*304+tmp_buf+72);
466
			if(!copy(count_file,_path_))return false;
467
			i++;
468
		}
469
		free(tmp_buf);
470
		free(count_file);
471
		free(_path_);
472
		return true;
473
	}
474
	read(PATH);
475
	sprintf(_path_,"%s/%s",PATH1,path.file(PATH));
476
	ret = file.write(FILES_SIZE,buffer_data,_path_);
477
	free(_path_);
478
	if(!ret)return true;
479
	return false;
480
}
481
:byte IO::move(dword PATH,PATH1)
482
{
483
	if(copy(PATH,PATH1))if(del(PATH))return true;
484
	return false;
485
}
486
 
487
#endif