Subversion Repositories Kolibri OS

Rev

Rev 763 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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