Subversion Repositories Kolibri OS

Rev

Rev 763 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
763 bw 1
{utf8}
616 bw 2
 
3
function DecodeErrNo(ErrNo: DWord): Word;
763 bw 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 = ошибка устройства}
616 bw 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
763 bw 27
    Result := 153; { Unknown command (неизвестная команда) }
616 bw 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
 
763 bw 99
 
100
{ FIXME: Поправить RTL, факт отсутствия файла не фиксируется при его открытии. }
616 bw 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;
763 bw 109
  Dummy: Longint;
616 bw 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
 
763 bw 117
  {Формирование имени абсолютного пути}
616 bw 118
  FilePathLen := Length(p);
119
  if p^ <> DirectorySeparator then
120
  begin
763 bw 121
    {XXX: размер буфера CurrDir может оказаться недостаточным}
616 bw 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
 
763 bw 135
  {Создание структуры TKosFile}
616 bw 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
763 bw 144
    { создать файл }
616 bw 145
    InOutRes := DecodeErrNo(kos_rewritefile(KosFile, RecSize));
146
  end else
763 bw 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
790 bw 155
  begin
763 bw 156
    FreeMem(KosFile);
790 bw 157
    FileRec(f).Handle := DWord(-1);
158
  end;
616 bw 159
end;