Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
5598 pavelyakov 1
#ifndef INCLUDE_FILESYSTEM_H
2
#define INCLUDE_FILESYSTEM_H
7219 leency 3
#print "[include ]\n"
5598 pavelyakov 4
 
5640 pavelyakov 5
#ifndef INCLUDE_DATE_H
6
#include "../lib/date.h"
5598 pavelyakov 7
#endif
8
 
7878 leency 9
#ifndef INCLUDE_COLLECTION_H
10
#include "../lib/collection.h"
11
#endif
12
 
7369 leency 13
//===================================================//
14
//                                                   //
15
//              Basic System Functions               //
16
//                                                   //
17
//===================================================//
18
 
5487 leency 19
:struct f70{
3067 leency 20
	dword	func;
21
	dword	param1;
22
	dword	param2;
23
	dword	param3;
24
	dword	param4;
25
	char	rezerv;
26
	dword	name;
27
};
28
 
5487 leency 29
:struct BDVK {
30
	dword	readonly:1, hidden:1, system:1, volume_label:1, isfolder:1, notarchived:1, :0;
3067 leency 31
	byte	type_name;
4898 leency 32
	byte	rez1, rez2, selected;
5487 leency 33
	dword   timecreate;
34
	date 	datecreate;
3067 leency 35
	dword	timelastaccess;
5487 leency 36
	date	datelastaccess;
3067 leency 37
	dword	timelastedit;
5487 leency 38
	date	datelastedit;
3067 leency 39
	dword	sizelo;
40
	dword	sizehi;
41
	char	name[518];
42
};
43
 
44
 
5487 leency 45
 
5472 leency 46
:f70 getinfo_file_70;
3440 leency 47
:dword GetFileInfo(dword file_path, bdvk_struct)
48
{
49
    getinfo_file_70.func = 5;
50
    getinfo_file_70.param1 =
51
    getinfo_file_70.param2 =
52
    getinfo_file_70.param3 = 0;
53
    getinfo_file_70.param4 = bdvk_struct;
54
    getinfo_file_70.rezerv = 0;
55
    getinfo_file_70.name = file_path;
56
    $mov eax,70
57
    $mov ebx,#getinfo_file_70.func
3444 leency 58
    $int 0x40
3440 leency 59
}
60
 
5554 punk_joker 61
:f70 setinfo_file_70;
62
:dword SetFileInfo(dword file_path, bdvk_struct)
63
{
64
    setinfo_file_70.func = 6;
65
    setinfo_file_70.param1 =
66
    setinfo_file_70.param2 =
67
    setinfo_file_70.param3 = 0;
68
    setinfo_file_70.param4 = bdvk_struct;
69
    setinfo_file_70.rezerv = 0;
70
    setinfo_file_70.name = file_path;
71
    $mov eax,70
72
    $mov ebx,#setinfo_file_70.func
73
    $int 0x40
74
}
75
 
5472 leency 76
:f70 run_file_70;
77
:signed int RunProgram(dword run_path, run_param)
3067 leency 78
{
79
    run_file_70.func = 7;
80
    run_file_70.param1 =
81
    run_file_70.param3 =
82
    run_file_70.param4 =
83
    run_file_70.rezerv = 0;
84
    run_file_70.param2 = run_param;
85
    run_file_70.name = run_path;
86
    $mov eax,70
87
    $mov ebx,#run_file_70.func
88
    $int 0x40
89
}
90
 
5472 leency 91
:f70 create_dir_70;
3067 leency 92
:int CreateDir(dword new_folder_path)
93
{
94
	create_dir_70.func = 9;
95
	create_dir_70.param1 =
96
	create_dir_70.param2 =
97
	create_dir_70.param3 =
98
	create_dir_70.param4 =
99
	create_dir_70.rezerv = 0;
100
	create_dir_70.name = new_folder_path;
101
	$mov eax,70
102
	$mov ebx,#create_dir_70.func
103
	$int 0x40
104
}
105
 
5472 leency 106
:f70 del_file_70;
3067 leency 107
:int DeleteFile(dword del_file_path)
108
{
109
	del_file_70.func = 8;
110
	del_file_70.param1 =
111
	del_file_70.param2 =
112
	del_file_70.param3 =
113
	del_file_70.param4 =
114
	del_file_70.rezerv = 0;
115
	del_file_70.name = del_file_path;
116
	$mov eax,70
117
	$mov ebx,#del_file_70.func
118
	$int 0x40
119
}
120
 
5472 leency 121
:f70 read_file_70;
7210 leency 122
:int ReadFile(dword offset, data_size, buffer, file_path)
3067 leency 123
{
124
	read_file_70.func = 0;
7210 leency 125
	read_file_70.param1 = offset;
3067 leency 126
	read_file_70.param2 = 0;
7210 leency 127
	read_file_70.param3 = data_size;
128
	read_file_70.param4 = buffer;
3067 leency 129
	read_file_70.rezerv = 0;
7210 leency 130
	read_file_70.name = file_path;
3067 leency 131
	$mov eax,70
132
	$mov ebx,#read_file_70.func
133
	$int 0x40
134
}
135
 
5472 leency 136
:f70 write_file_70;
7227 leency 137
:int CreateFile(dword data_size, buffer, file_path)
3067 leency 138
{
139
	write_file_70.func = 2;
140
	write_file_70.param1 = 0;
141
	write_file_70.param2 = 0;
7210 leency 142
	write_file_70.param3 = data_size;
143
	write_file_70.param4 = buffer;
3067 leency 144
	write_file_70.rezerv = 0;
7210 leency 145
	write_file_70.name = file_path;
3067 leency 146
	$mov eax,70
147
	$mov ebx,#write_file_70.func
148
	$int 0x40
5542 leency 149
}
3067 leency 150
 
5640 pavelyakov 151
  ////////////////////////////////////////
152
 //     WriteInFileThatAlredyExists    //
153
////////////////////////////////////////
5542 leency 154
:f70 write_file_offset_70;
7227 leency 155
:int WriteFile(dword offset, data_size, buffer, file_path)
5542 leency 156
{
157
	write_file_offset_70.func = 3;
158
	write_file_offset_70.param1 = offset;
159
	write_file_offset_70.param2 = 0;
7210 leency 160
	write_file_offset_70.param3 = data_size;
161
	write_file_offset_70.param4 = buffer;
5542 leency 162
	write_file_offset_70.rezerv = 0;
7210 leency 163
	write_file_offset_70.name = file_path;
5542 leency 164
	$mov eax,70
165
	$mov ebx,#write_file_offset_70.func
166
	$int 0x40
7210 leency 167
}
5542 leency 168
 
5472 leency 169
:f70 read_dir_70;
3067 leency 170
:int ReadDir(dword file_count, read_buffer, dir_path)
3363 leency 171
{
3067 leency 172
	read_dir_70.func = 1;
173
	read_dir_70.param1 =
174
	read_dir_70.param2 =
175
	read_dir_70.rezerv = 0;
176
	read_dir_70.param3 = file_count;
177
	read_dir_70.param4 = read_buffer;
178
	read_dir_70.name = dir_path;
179
	$mov eax,70
180
	$mov ebx,#read_dir_70.func
181
	$int 0x40
182
}
183
 
7533 leency 184
//ECX - buf pointer
7422 leency 185
inline fastcall void SetCurDir( ECX)
186
{
187
	EAX=30;
188
	EBX=1;
189
	$int 0x40
190
}
191
 
7533 leency 192
//ECX - buf pointer
193
//EDX - buf size
194
inline fastcall void GetCurDir( ECX, EDX)
195
{
196
	EAX=30;
197
	EBX=2;
198
	$int 0x40
199
}
200
 
8383 leency 201
void read_file(dword path1, buf, size)
202
{
203
	EAX = 68;
204
	EBX = 27;
205
	ECX = path1;
206
	$int 0x40;
207
	ESDWORD[size] = EDX;
208
	ESDWORD[buf] = EAX;
209
}
210
 
7369 leency 211
//===================================================//
212
//                                                   //
213
//                        Misc                       //
214
//                                                   //
215
//===================================================//
216
 
7202 leency 217
:bool dir_exists(dword fpath)
3440 leency 218
{
7219 leency 219
	char buf[32];
220
	if (!ReadDir(0, #buf, fpath)) return true;
221
	return false;
222
}
223
 
224
/*
225
// This implementation of dir_exists() is faster than
226
// previous but here virtual folders like
227
// '/' and '/tmp' are not recognised as FOLDERS
228
// by GetFileInfo() => BDVK.isfolder attribute :(
229
 
230
:bool dir_exists(dword fpath)
231
{
3440 leency 232
	BDVK fpath_atr;
6930 leency 233
	if (GetFileInfo(fpath, #fpath_atr) != 0) return false;
5487 leency 234
	return fpath_atr.isfolder;
3440 leency 235
}
7219 leency 236
*/
237
 
7202 leency 238
:bool file_exists(dword fpath)
6251 leency 239
{
240
	BDVK ReadFile_atr;
241
	if (! GetFileInfo(fpath, #ReadFile_atr)) return true;
242
	return false;
243
}
3877 leency 244
 
3444 leency 245
enum
3363 leency 246
{
3444 leency 247
	DIRS_ALL,
248
	DIRS_NOROOT,
249
	DIRS_ONLYREAL
250
};
251
:int GetDir(dword dir_buf, file_count, path, doptions)
7878 leency 252
dword buf, fcount, error;
253
char readbuf[32];
3444 leency 254
{
7878 leency 255
	error = ReadDir(0, #readbuf, path);
3363 leency 256
	if (!error)
257
	{
7878 leency 258
		fcount = ESDWORD[#readbuf+8];
259
		buf = malloc(fcount+1*304+32);
3363 leency 260
		ReadDir(fcount, buf, path);
3440 leency 261
		//fcount=EBX;
3444 leency 262
 
263
		if (doptions == DIRS_ONLYREAL)
264
		{
265
			if (!strcmp(".",buf+72)) {fcount--; memmov(buf,buf+304,fcount*304);}
266
			if (!strcmp("..",buf+72)) {fcount--; memmov(buf,buf+304,fcount*304);}
267
		}
268
		if (doptions == DIRS_NOROOT)
269
		{
270
			if (!strcmp(".",buf+72)) {fcount--; memmov(buf,buf+304,fcount*304);}
271
		}
272
 
3363 leency 273
		ESDWORD[dir_buf] = buf;
274
		ESDWORD[file_count] = fcount;
275
	}
3440 leency 276
	else
3067 leency 277
	{
7878 leency 278
		ESDWORD[dir_buf] = 0;
3440 leency 279
		ESDWORD[file_count] = 0;
3067 leency 280
	}
3440 leency 281
	return error;
3067 leency 282
}
283
 
3432 leency 284
:dword abspath(dword relative_path) //GetAbsolutePathFromRelative()
285
{
286
	char absolute_path[4096];
4137 leency 287
	if (ESBYTE[relative_path]=='/')
288
	{
289
		strcpy(#absolute_path, relative_path);
290
	}
291
	else
292
	{
6735 leency 293
		strcpy(#absolute_path, I_Path);
4137 leency 294
		absolute_path[strrchr(#absolute_path, '/')] = '\0';
295
		strcat(#absolute_path, relative_path);
296
	}
3432 leency 297
	return #absolute_path;
298
}
5483 leency 299
 
7202 leency 300
:dword GetIni(dword ini_path, ini_name) //search it on /kolibrios/ then on /sys/
7197 leency 301
{
7202 leency 302
	strcpy(ini_path, "/kolibrios/settings/");
303
	strcat(ini_path, ini_name);
304
	if (!file_exists(ini_path)) {
7213 leency 305
		strcpy(ini_path, "/sys/SETTINGS/");
7202 leency 306
		strcat(ini_path, ini_name);
7197 leency 307
	}
7202 leency 308
	return ini_path;
7197 leency 309
}
310
 
7369 leency 311
:dword notify(dword notify_param)
312
{
313
	return RunProgram("/sys/@notify", notify_param);
314
}
315
 
316
:void die(dword _last_msg)
317
{
318
	notify(_last_msg);
319
	ExitProcess();
320
}
321
 
322
//===================================================//
323
//                                                   //
324
//                   Convert Size                    //
325
//                                                   //
326
//===================================================//
327
 
5591 pavelyakov 328
:byte ConvertSize_size_prefix[8];
5576 pavelyakov 329
:dword ConvertSize(dword bytes)
5483 leency 330
{
5591 pavelyakov 331
  byte size_nm[4];
5803 leency 332
  if (bytes>=1073741824) strlcpy(#size_nm, "Gb",2);
333
  else if (bytes>=1048576) strlcpy(#size_nm, "Mb",2);
334
  else if (bytes>=1024) strlcpy(#size_nm, "Kb",2);
335
  else strlcpy(#size_nm, "b ",2);
6989 leency 336
  while (bytes>1023) bytes >>= 10;
5591 pavelyakov 337
  sprintf(#ConvertSize_size_prefix,"%d %s",bytes,#size_nm);
338
  return #ConvertSize_size_prefix;
5493 leency 339
}
7219 leency 340
 
6988 leency 341
:dword ConvertSize64(dword bytes_lo, bytes_hi)
342
{
343
  if (bytes_hi > 0) {
6989 leency 344
	if (bytes_lo>=1073741824) bytes_lo >>= 30; else bytes_lo = 0;
345
	sprintf(#ConvertSize_size_prefix,"%d Gb",bytes_hi<<2 + bytes_lo);
6988 leency 346
	return #ConvertSize_size_prefix;
347
  }
348
  else return ConvertSize(bytes_lo);
349
}
7219 leency 350
 
7369 leency 351
:unsigned char size[25];
5493 leency 352
:dword ConvertSizeToKb(unsigned int bytes)
353
{
354
	dword kb_line;
355
 
6568 leency 356
	if (bytes >= 1024)
357
	{
358
		kb_line = itoa(bytes / 1024);
359
		strcpy(#size, kb_line);
360
		strcat(#size, " Kb");
361
	}
362
	else {
363
		kb_line = itoa(bytes);
364
		strcpy(#size, kb_line);
365
		strcat(#size, " b");
366
	}
5493 leency 367
 
368
	return #size;
5598 pavelyakov 369
}
7210 leency 370
 
7369 leency 371
//===================================================//
372
//                                                   //
373
//                      Copy                         //
374
//                                                   //
375
//===================================================//
376
 
7210 leency 377
:int CopyFileAtOnce(dword size, copyFrom, copyTo)
378
dword cbuf;
379
int error;
380
{
381
	cbuf = malloc(size);
382
	if (error = ReadFile(0, size, cbuf, copyFrom))
383
	{
384
		debugln("Error: CopyFileAtOnce->ReadFile");
385
	}
386
	else
387
	{
7227 leency 388
		if (error = CreateFile(size, cbuf, copyTo)) debugln("Error: CopyFileAtOnce->CreateFile");
7210 leency 389
	}
390
	free(cbuf);
391
	return error;
392
}
393
 
394
:int CopyFileByBlocks(dword size, copyFrom, copyTo)
395
dword cbuf;
396
int error=-1;
397
dword offpos=0;
7227 leency 398
int block_size=1024*1024*4; //copy by 4 MiB
7210 leency 399
{
7227 leency 400
	if (GetFreeRAM()>1024*78) {
401
		//Set block size 32 MiB
402
		block_size <<= 3;
403
	}
7210 leency 404
	cbuf = malloc(block_size);
7227 leency 405
	if (error = CreateFile(0, 0, copyTo))
406
	{
407
		debugln("Error: CopyFileByBlocks->CreateFile");
408
		size = -1;
409
	}
7210 leency 410
	while(offpos < size)
411
	{
412
		error = ReadFile(offpos, block_size, cbuf, copyFrom);
413
		if (error = 6) { //File ended before last byte was readed
414
			block_size = EBX;
7227 leency 415
			if (block_size+offpos>=size) error=0;
7210 leency 416
		}
417
		else
7227 leency 418
			if (error!=0) {
419
				debugln("Error: CopyFileByBlocks->ReadFile");
420
				break;
421
			}
422
		if (error = WriteFile(offpos, block_size, cbuf, copyTo)) {
423
			debugln("Error: CopyFileByBlocks->WriteFile");
424
			break;
425
		}
7210 leency 426
		offpos += block_size;
427
	}
428
	free(cbuf);
429
	return error;
430
}
431
 
7369 leency 432
//===================================================//
433
//                                                   //
434
//                  Directory Size                   //
435
//                                                   //
436
//===================================================//
7210 leency 437
 
7878 leency 438
:struct DIR_SIZE
7369 leency 439
{
440
	BDVK dir_info;
441
	dword folders;
442
	dword files;
443
	dword bytes;
7878 leency 444
	dword get();
445
	dword calculate_loop();
446
};
7369 leency 447
 
7878 leency 448
:dword DIR_SIZE::get(dword way1)
7369 leency 449
{
450
	folders = files = bytes = 0;
7878 leency 451
	if (!way1) return 0;
452
	calculate_loop(way1);
7369 leency 453
}
454
 
7878 leency 455
:dword DIR_SIZE::calculate_loop(dword way)
7369 leency 456
{
457
	dword dirbuf, fcount, i, filename;
458
	dword cur_file;
7878 leency 459
	if (!way) return 0;
7369 leency 460
	if (dir_exists(way))
461
	{
462
		cur_file = malloc(4096);
463
		// In the process of recursive descent, memory must be allocated dynamically,
464
		// because the static memory -> was a bug !!! But unfortunately pass away to sacrifice speed.
465
		GetDir(#dirbuf, #fcount, way, DIRS_ONLYREAL);
466
		for (i=0; i
467
		{
468
			filename = i*304+dirbuf+72;
469
			sprintf(cur_file,"%s/%s",way,filename);
470
 
471
			if (TestBit(ESDWORD[filename-40], 4) )
472
			{
473
				folders++;
474
				calculate_loop(cur_file);
475
			}
476
			else
477
			{
478
				GetFileInfo(cur_file, #dir_info);
479
				bytes += dir_info.sizelo;
480
				files++;
481
			}
482
		}
483
		free(cur_file);
484
		free(dirbuf);
485
	}
7878 leency 486
	return files;
7369 leency 487
}
488
 
7878 leency 489
 
5598 pavelyakov 490
#endif