Subversion Repositories Kolibri OS

Rev

Rev 7210 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. #ifndef INCLUDE_FILESYSTEM_H
  2. #define INCLUDE_FILESYSTEM_H
  3. #print "[include <file_system.h>]\n"
  4.  
  5. #ifndef INCLUDE_DATE_H
  6. #include "../lib/date.h"
  7. #endif
  8.  
  9. :struct f70{
  10.         dword   func;
  11.         dword   param1;
  12.         dword   param2;
  13.         dword   param3;
  14.         dword   param4;
  15.         char    rezerv;
  16.         dword   name;
  17. };
  18.  
  19. :struct BDVK {
  20.         dword   readonly:1, hidden:1, system:1, volume_label:1, isfolder:1, notarchived:1, :0;
  21.         byte    type_name;
  22.         byte    rez1, rez2, selected;
  23.         dword   timecreate;
  24.         date    datecreate;
  25.         dword   timelastaccess;
  26.         date    datelastaccess;
  27.         dword   timelastedit;
  28.         date    datelastedit;
  29.         dword   sizelo;
  30.         dword   sizehi;
  31.         char    name[518];
  32. };
  33.  
  34.  
  35.  
  36.  
  37.  
  38.   ///////////////////////////
  39.  //   Ïàðàìåòðû ôàéëà     //
  40. ///////////////////////////
  41. :f70 getinfo_file_70;
  42. :dword GetFileInfo(dword file_path, bdvk_struct)
  43. {    
  44.     getinfo_file_70.func = 5;
  45.     getinfo_file_70.param1 =
  46.     getinfo_file_70.param2 =
  47.     getinfo_file_70.param3 = 0;
  48.     getinfo_file_70.param4 = bdvk_struct;
  49.     getinfo_file_70.rezerv = 0;
  50.     getinfo_file_70.name = file_path;
  51.     $mov eax,70
  52.     $mov ebx,#getinfo_file_70.func
  53.     $int 0x40
  54. }
  55.  
  56.   /////////////////////////////////////
  57.  //   Èçìåíåíèå ïàðàìåòðîâ ôàéëà    //
  58. /////////////////////////////////////
  59. :f70 setinfo_file_70;
  60. :dword SetFileInfo(dword file_path, bdvk_struct)
  61. {    
  62.     setinfo_file_70.func = 6;
  63.     setinfo_file_70.param1 =
  64.     setinfo_file_70.param2 =
  65.     setinfo_file_70.param3 = 0;
  66.     setinfo_file_70.param4 = bdvk_struct;
  67.     setinfo_file_70.rezerv = 0;
  68.     setinfo_file_70.name = file_path;
  69.     $mov eax,70
  70.     $mov ebx,#setinfo_file_70.func
  71.     $int 0x40
  72. }
  73.  
  74.   ///////////////////////////
  75.  //   Çàïóñê ïðîãðàììû    //
  76. ///////////////////////////
  77. :f70 run_file_70;
  78. :signed int RunProgram(dword run_path, run_param)
  79. {      
  80.     run_file_70.func = 7;
  81.     run_file_70.param1 =
  82.     run_file_70.param3 =
  83.     run_file_70.param4 =
  84.     run_file_70.rezerv = 0;
  85.     run_file_70.param2 = run_param;
  86.     run_file_70.name = run_path;
  87.     $mov eax,70
  88.     $mov ebx,#run_file_70.func
  89.     $int 0x40
  90. }
  91.  
  92.   ///////////////////////////
  93.  //    Ñîçäàíèå ïàïêè     //
  94. ///////////////////////////
  95. :f70 create_dir_70;
  96. :int CreateDir(dword new_folder_path)
  97. {
  98.         create_dir_70.func = 9;
  99.         create_dir_70.param1 =
  100.         create_dir_70.param2 =
  101.         create_dir_70.param3 =
  102.         create_dir_70.param4 =
  103.         create_dir_70.rezerv = 0;
  104.         create_dir_70.name = new_folder_path;
  105.         $mov eax,70
  106.         $mov ebx,#create_dir_70.func
  107.         $int 0x40
  108. }
  109.  
  110.   ////////////////////////////
  111.  //  Óäàëåíèå ôàéëà/ïàïêè  //
  112. ////////////////////////////
  113. :f70 del_file_70;      
  114. :int DeleteFile(dword del_file_path)
  115. {    
  116.         del_file_70.func = 8;
  117.         del_file_70.param1 =
  118.         del_file_70.param2 =
  119.         del_file_70.param3 =
  120.         del_file_70.param4 =
  121.         del_file_70.rezerv = 0;
  122.         del_file_70.name = del_file_path;
  123.         $mov eax,70
  124.         $mov ebx,#del_file_70.func
  125.         $int 0x40
  126. }
  127.  
  128.   ////////////////////////////
  129.  //     Ïðî÷èòàòü ôàéë     //
  130. ////////////////////////////
  131. :f70 read_file_70;
  132. :int ReadFile(dword offset, data_size, buffer, file_path)
  133. {
  134.         read_file_70.func = 0;
  135.         read_file_70.param1 = offset;
  136.         read_file_70.param2 = 0;
  137.         read_file_70.param3 = data_size;
  138.         read_file_70.param4 = buffer;
  139.         read_file_70.rezerv = 0;
  140.         read_file_70.name = file_path;
  141.         $mov eax,70
  142.         $mov ebx,#read_file_70.func
  143.         $int 0x40
  144. }
  145.  
  146. :f70 write_file_70;
  147. :int WriteFile(dword data_size, buffer, file_path)
  148. {
  149.         write_file_70.func = 2;
  150.         write_file_70.param1 = 0;
  151.         write_file_70.param2 = 0;
  152.         write_file_70.param3 = data_size;
  153.         write_file_70.param4 = buffer;
  154.         write_file_70.rezerv = 0;
  155.         write_file_70.name = file_path;
  156.         $mov eax,70
  157.         $mov ebx,#write_file_70.func
  158.         $int 0x40
  159. }
  160.  
  161.   ////////////////////////////////////////
  162.  //     WriteInFileThatAlredyExists    //
  163. ////////////////////////////////////////
  164. :f70 write_file_offset_70;
  165. :int WriteFileWithOffset(dword offset, data_size, buffer, file_path)
  166. {
  167.         write_file_offset_70.func = 3;
  168.         write_file_offset_70.param1 = offset;
  169.         write_file_offset_70.param2 = 0;
  170.         write_file_offset_70.param3 = data_size;
  171.         write_file_offset_70.param4 = buffer;
  172.         write_file_offset_70.rezerv = 0;
  173.         write_file_offset_70.name = file_path;
  174.         $mov eax,70
  175.         $mov ebx,#write_file_offset_70.func
  176.         $int 0x40
  177. }
  178.  
  179.  
  180.   ///////////////////////////
  181.  //    Ïðî÷èòàòü ïàïêó    //
  182. ///////////////////////////
  183. :f70 read_dir_70;
  184. :int ReadDir(dword file_count, read_buffer, dir_path)
  185. {
  186.         read_dir_70.func = 1;
  187.         read_dir_70.param1 =
  188.         read_dir_70.param2 =
  189.         read_dir_70.rezerv = 0;
  190.         read_dir_70.param3 = file_count;
  191.         read_dir_70.param4 = read_buffer;
  192.         read_dir_70.name = dir_path;
  193.         $mov eax,70
  194.         $mov ebx,#read_dir_70.func
  195.         $int 0x40
  196. }
  197.  
  198. :bool dir_exists(dword fpath)
  199. {
  200.         BDVK fpath_atr;
  201.         if (GetFileInfo(fpath, #fpath_atr) != 0) return false;
  202.         return fpath_atr.isfolder;
  203. }
  204. :bool file_exists(dword fpath)
  205. {
  206.         BDVK ReadFile_atr;
  207.         if (! GetFileInfo(fpath, #ReadFile_atr)) return true;
  208.         return false;
  209. }
  210.  
  211.  
  212. :int GetFile(dword buf, filesize, read_path)
  213. {
  214.         int return_val = 0;
  215.         BDVK ReadFile_atr;
  216.         dword rBuf;
  217.         if (! GetFileInfo(read_path, #ReadFile_atr))
  218.         {
  219.                 rBuf = malloc(ReadFile_atr.sizelo);    
  220.                 if (! ReadFile(0, ReadFile_atr.sizelo, rBuf, read_path))
  221.                 {
  222.                         ESDWORD[buf] = rBuf;
  223.                         ESDWORD[filesize] = ReadFile_atr.sizelo;
  224.                         return_val = 1;
  225.                 }
  226.         }
  227.         free(rBuf);
  228.         return return_val;
  229. }
  230.  
  231. enum
  232. {
  233.         DIRS_ALL,
  234.         DIRS_NOROOT,
  235.         DIRS_ONLYREAL
  236. };
  237. :int GetDir(dword dir_buf, file_count, path, doptions)
  238. {
  239.         dword buf, fcount, error;
  240.         buf = malloc(32);
  241.         error = ReadDir(0, buf, path);
  242.         if (!error)
  243.         {
  244.                 fcount = ESDWORD[buf+8];
  245.                 buf = realloc(buf, fcount+1*304+32);
  246.                 ReadDir(fcount, buf, path);
  247.                 //fcount=EBX;
  248.  
  249.                 if (doptions == DIRS_ONLYREAL)
  250.                 {
  251.                         if (!strcmp(".",buf+72)) {fcount--; memmov(buf,buf+304,fcount*304);}
  252.                         if (!strcmp("..",buf+72)) {fcount--; memmov(buf,buf+304,fcount*304);}
  253.                 }
  254.                 if (doptions == DIRS_NOROOT)
  255.                 {
  256.                         if (!strcmp(".",buf+72)) {fcount--; memmov(buf,buf+304,fcount*304);}
  257.                 }
  258.  
  259.                 ESDWORD[dir_buf] = buf;
  260.                 ESDWORD[file_count] = fcount;
  261.         }
  262.         else
  263.         {
  264.                 ESDWORD[file_count] = 0;
  265.                 ESDWORD[dir_buf] = free(buf);
  266.         }
  267.         return error;
  268. }
  269.  
  270. :dword abspath(dword relative_path) //GetAbsolutePathFromRelative()
  271. {
  272.         char absolute_path[4096];
  273.         if (ESBYTE[relative_path]=='/')
  274.         {
  275.                 strcpy(#absolute_path, relative_path);
  276.         }
  277.         else
  278.         {
  279.                 strcpy(#absolute_path, I_Path);
  280.                 absolute_path[strrchr(#absolute_path, '/')] = '\0';
  281.                 strcat(#absolute_path, relative_path);
  282.         }
  283.         return #absolute_path;
  284. }
  285.  
  286. :dword GetIni(dword ini_path, ini_name) //search it on /kolibrios/ then on /sys/
  287. {
  288.         strcpy(ini_path, "/kolibrios/settings/");
  289.         strcat(ini_path, ini_name);
  290.         if (!file_exists(ini_path)) {
  291.                 strcpy(ini_path, "/sys/SETTINGS/");
  292.                 strcat(ini_path, ini_name);
  293.         }
  294.         return ini_path;
  295. }
  296.  
  297. :byte ConvertSize_size_prefix[8];
  298. :dword ConvertSize(dword bytes)
  299. {
  300.   byte size_nm[4];
  301.   if (bytes>=1073741824) strlcpy(#size_nm, "Gb",2);
  302.   else if (bytes>=1048576) strlcpy(#size_nm, "Mb",2);
  303.   else if (bytes>=1024) strlcpy(#size_nm, "Kb",2);
  304.   else strlcpy(#size_nm, "b ",2);
  305.   while (bytes>1023) bytes >>= 10;
  306.   sprintf(#ConvertSize_size_prefix,"%d %s",bytes,#size_nm);
  307.   return #ConvertSize_size_prefix;
  308. }
  309. :dword ConvertSize64(dword bytes_lo, bytes_hi)
  310. {
  311.   if (bytes_hi > 0) {
  312.         if (bytes_lo>=1073741824) bytes_lo >>= 30; else bytes_lo = 0;
  313.         sprintf(#ConvertSize_size_prefix,"%d Gb",bytes_hi<<2 + bytes_lo);
  314.         return #ConvertSize_size_prefix;
  315.   }
  316.   else return ConvertSize(bytes_lo);
  317. }
  318. :dword notify(dword notify_param)
  319. {
  320.         return RunProgram("/sys/@notify", notify_param);
  321. }
  322. :void die(dword _last_msg)
  323. {
  324.         notify(_last_msg);
  325.         ExitProcess();
  326. }
  327. :unsigned char size[25]=0;
  328. :dword ConvertSizeToKb(unsigned int bytes)
  329. {
  330.         unsigned int kb;
  331.         dword kb_line;
  332.  
  333.         if (bytes >= 1024)
  334.         {
  335.                 kb_line = itoa(bytes / 1024);
  336.                 strcpy(#size, kb_line);
  337.                 strcat(#size, " Kb");          
  338.         }
  339.         else {
  340.                 kb_line = itoa(bytes);
  341.                 strcpy(#size, kb_line);
  342.                 strcat(#size, " b");
  343.         }
  344.  
  345.         return #size;
  346. }
  347.  
  348. :int CopyFileAtOnce(dword size, copyFrom, copyTo)
  349. dword cbuf;
  350. int error;
  351. {
  352.         cbuf = malloc(size);
  353.         if (error = ReadFile(0, size, cbuf, copyFrom))
  354.         {
  355.                 debugln("Error: CopyFileAtOnce->ReadFile");
  356.         }
  357.         else
  358.         {
  359.                 if (error = WriteFile(size, cbuf, copyTo)) debugln("Error: CopyFileAtOnce->WriteFile");
  360.         }
  361.         free(cbuf);
  362.         return error;
  363. }
  364.  
  365. :int CopyFileByBlocks(dword size, copyFrom, copyTo)
  366. dword cbuf;
  367. int error=-1;
  368. dword offpos=0;
  369. int block_size=1024*4024; //copy by 4 MiBs
  370. {
  371.         cbuf = malloc(block_size);
  372.         WriteFile(0, 0, copyTo); //create file
  373.         while(offpos < size)
  374.         {
  375.                 error = ReadFile(offpos, block_size, cbuf, copyFrom);
  376.                 if (error = 6) { //File ended before last byte was readed
  377.                         block_size = EBX;
  378.                         error=0;
  379.                 }
  380.                 else
  381.                         if (error!=0) break;
  382.                 if (error = WriteFileWithOffset(offpos, block_size, cbuf, copyTo)) break;
  383.                 offpos += block_size;
  384.         }
  385.         free(cbuf);
  386.         return error;
  387. }
  388.  
  389.  
  390. #endif