Subversion Repositories Kolibri OS

Rev

Rev 616 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. {utf8}
  2.  
  3. function DecodeErrNo(ErrNo: DWord): Word;
  4. {0 = успешно
  5.  1 = не определена база и/или раздел жёсткого диска (подфункциями 7, 8 функции 21)
  6.  2 = функция не поддерживается для данной файловой системы
  7.  3 = неизвестная файловая система
  8.  4 = зарезервировано, никогда не возвращается в текущей реализации
  9.  5 = файл не найден
  10.  6 = файл закончился
  11.  7 = указатель вне памяти приложения
  12.  8 = диск заполнен
  13.  9 = таблица FAT разрушена
  14.  10 = доступ запрещён
  15.  11 = ошибка устройства}
  16. begin
  17.   case ErrNo of
  18.     0: Result := 0;
  19.     1: Result := 152;
  20.     2: Result := 153;
  21.     3: Result := 151;
  22.     4: Result := 1;
  23.     5: Result := 2;
  24.     6: Result := 0;
  25.     8: Result := 101;
  26.   else
  27.     Result := 153; { Unknown command (неизвестная команда) }
  28.   end;
  29. end;
  30.  
  31. function do_isdevice(handle:thandle): Boolean;
  32. begin
  33.   InOutRes := 211;
  34.   Result := False;
  35. end;
  36.  
  37. procedure do_close(handle: THandle);
  38. begin
  39.   FreeMem(PKosFile(handle));
  40.   InOutRes := 0;
  41. end;
  42.  
  43. procedure do_erase(p : pchar);
  44. begin
  45.   InOutRes := 211;
  46. end;
  47.  
  48. procedure do_rename(p1,p2 : pchar);
  49. begin
  50.   InOutRes := 211;
  51. end;
  52.  
  53. function do_write(handle: THandle; addr: Pointer; len: Longint): Longint;
  54. begin
  55.   PKosFile(handle)^.Size := len;
  56.   PKosFile(handle)^.Data := addr;
  57.   InOutRes := DecodeErrNo(kos_writefile(PKosFile(handle), Result));
  58.   Inc(PKosFile(handle)^.Position, Result);
  59. end;
  60.  
  61. function do_read(handle: THandle; addr: Pointer; len: Longint): Longint;
  62. begin
  63.   PKosFile(handle)^.Size := len;
  64.   PKosFile(handle)^.Data := addr;
  65.   InOutRes := DecodeErrNo(kos_readfile(PKosFile(handle), Result));
  66.   Inc(PKosFile(handle)^.Position, Result);
  67. end;
  68.  
  69. function do_filepos(handle: THandle): Int64;
  70. begin
  71.   Result := PKosFile(handle)^.Position;
  72. end;
  73.  
  74. procedure do_seek(handle: THandle; pos: Int64);
  75. begin
  76.   PKosFile(handle)^.Position := pos;
  77. end;
  78.  
  79. function do_seekend(handle: THandle): Int64;
  80. begin
  81.   InOutRes := 211;
  82.   Result := 0;
  83. end;
  84.  
  85. function do_filesize(handle: THandle): Int64;
  86. var
  87.   BDFE: TKosBDFE;
  88. begin
  89.   PKosFile(handle)^.Data := @BDFE;
  90.   InOutRes := DecodeErrNo(kos_fileinfo(PKosFile(handle)));
  91.   Result := BDFE.Size;
  92. end;
  93.  
  94. procedure do_truncate(handle: THandle; pos: Int64);
  95. begin
  96.   InOutRes := 211;
  97. end;
  98.  
  99.  
  100. { FIXME: Поправить RTL, факт отсутствия файла не фиксируется при его открытии. }
  101. procedure do_open(var f; p: PChar; flags: Longint);
  102. var
  103.   KosFile: PKosFile;
  104.   FilePath: PChar;
  105.   FilePathLen: Longint;
  106.   RecSize: Longint;
  107.   CurrDir: array[0..2048] of Char;
  108.   CurrDirLen: Longint;
  109.   Dummy: Longint;
  110. begin
  111.   case flags and 3 of
  112.     0: FileRec(f).Mode := fmInput;
  113.     1: FileRec(f).Mode := fmOutput;
  114.     2: FileRec(f).Mode := fmInOut;
  115.   end;
  116.  
  117.   {Формирование имени абсолютного пути}
  118.   FilePathLen := Length(p);
  119.   if p^ <> DirectorySeparator then
  120.   begin
  121.     {XXX: размер буфера CurrDir может оказаться недостаточным}
  122.     CurrDirLen := kos_getdir(@CurrDir, SizeOf(CurrDir) - FilePathLen - 1) - 1;
  123.     FilePath := @CurrDir;
  124.  
  125.     if FilePath[CurrDirLen - 1] <> DirectorySeparator then
  126.     begin
  127.       FilePath[CurrDirLen] := DirectorySeparator;
  128.       Inc(CurrDirLen);
  129.     end;
  130.     Move(p^, FilePath[CurrDirLen], FilePathLen + 1);
  131.     Inc(FilePathLen, CurrDirLen);
  132.   end else
  133.     FilePath := p;
  134.  
  135.   {Создание структуры TKosFile}
  136.   RecSize := SizeOf(TKosFile) + FilePathLen;
  137.   KosFile := GetMem(RecSize);
  138.   FillChar(KosFile^, RecSize, 0);
  139.   Move(FilePath^, KosFile^.Name, FilePathLen);
  140.   FileRec(f).Handle := DWord(KosFile);
  141.  
  142.   if flags and $1000 <> 0 then
  143.   begin
  144.     { создать файл }
  145.     InOutRes := DecodeErrNo(kos_rewritefile(KosFile, RecSize));
  146.   end else
  147.   begin
  148.     { попытаться прочитать файл }
  149.     KosFile^.Size := 1;
  150.     KosFile^.Data := @Dummy;
  151.     InOutRes := DecodeErrNo(kos_readfile(KosFile, Dummy));
  152.   end;
  153.  
  154.   if InOutRes <> 0 then
  155.     FreeMem(KosFile);
  156. end;
  157.