3f13946bcb1dea1532c6805ad57af2ae4854449a
1 (* Copyright (C) DooM 2D:Forever Developers
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 3 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *)
16 {$INCLUDE a_modes.inc}
19 {$DEFINE SFS_DFWAD_DEBUG}
20 {$DEFINE SFS_MAPDETECT_FX}
22 interface
24 uses
28 type
32 private
39 function GetResourceEx (name: AnsiString; wantMap: Boolean; var pData: Pointer; var Len: Integer; logError: Boolean=true): Boolean;
41 public
50 function GetResource (name: AnsiString; var pData: Pointer; var Len: Integer; logError: Boolean=true): Boolean;
51 function GetMapResource (name: AnsiString; var pData: Pointer; var Len: Integer; logError: Boolean=true): Boolean;
54 // returns `nil` if file wasn't found
67 // return fixed AnsiString or empty AnsiString
71 var
76 implementation
78 uses
83 begin
86 begin
87 //e_WriteLog(Format('findDiskWad: error looking for [%s]', [fname]), MSG_NOTIFY);
89 begin
91 //e_WriteLog(Format(' looking for [%s]', [fname]), MSG_NOTIFY);
93 begin
95 //e_WriteLog(Format(' looking for [%s]', [fname]), MSG_NOTIFY);
98 end
99 else
100 begin
101 exit;
104 //e_WriteLog(Format('findDiskWad: FOUND [%s]', [fname]), MSG_NOTIFY);
110 var
112 begin
118 var
120 begin
122 begin
124 begin
129 exit;
136 var
138 begin
140 begin
142 begin
144 exit;
151 var
153 begin
157 begin
160 begin
162 begin
166 exit;
173 var
175 begin
179 begin
182 begin
184 exit;
191 var
193 begin
196 begin
198 begin
201 exit;
210 { TWADFile }
212 begin
218 begin
225 begin
231 begin
233 //if fFileName <> '' then e_WriteLog(Format('TWADFile.ReadFile: [%s] closed', [fFileName]), MSG_NOTIFY);
238 //FIXME: detect text maps properly here
240 var
241 //sign: packed array [0..2] of Char;
243 begin
247 try
250 (*
251 fs.readBuffer(sign, 3);
252 result := (sign = MAP_SIGNATURE);
253 if not result then result := (sign[0] = 'm') and (sign[1] = 'a') and (sign[2] = 'p');
254 *)
255 except
258 exit;
264 // returns `nil` if file wasn't found
266 var
269 begin
271 // backwards, due to possible similar names and such
273 begin
277 begin
278 try
280 except
290 var
292 begin
296 begin
297 //writeln('[', s, '] -> [', Copy(s, 1, i-2), ']');
304 function TWADFile.GetResourceEx (name: AnsiString; wantMap: Boolean; var pData: Pointer; var Len: Integer; logError: Boolean=true): Boolean;
305 var
311 //sign: packed array [0..2] of Char;
313 {$IFNDEF SFS_MAPDETECT_FX}
315 {$ENDIF}
316 begin
323 begin
328 begin
331 end
332 else
333 begin
336 // backwards, due to possible similar names and such
338 begin
342 begin
343 // i found her (maybe)
345 begin
348 begin
350 end
351 else
352 begin
354 if not StrEquCI1251(Copy(fi.path, length(fi.path)+1-length(rpath), length(fi.path)), rpath) then continue; // alas
357 try
359 except
363 begin
365 if logError then e_WriteLog(Format('DFWAD: can''t open file [%s] in [%s]', [name, fFileName]), MSG_WARNING);
366 break;
368 // if we want only maps, check if this is map
369 {$IFDEF SFS_MAPDETECT_FX}
371 begin
373 {$IF DEFINED(D2D_NEW_MAP_READER_DBG)}
374 e_LogWritefln('DFWAD: checking for good map in wad [%s], file [%s] (#%d)', [fFileName, fi.fname, f]);
375 {$ENDIF}
376 try
377 //fs.readBuffer(sign, 3);
378 //goodMap := (sign = MAP_SIGNATURE);
379 //if not goodMap then goodMap := (sign[0] = 'm') and (sign[1] = 'a') and (sign[2] = 'p');
381 {$IF DEFINED(D2D_NEW_MAP_READER_DBG)}
384 else
386 {$ENDIF}
387 except
390 begin
391 {$IF DEFINED(D2D_NEW_MAP_READER_DBG)}
393 {$ENDIF}
395 continue;
399 {$ENDIF}
403 try
406 finally
408 begin
415 {$IFNDEF SFS_MAPDETECT_FX}
417 begin
420 begin
421 //Move(pData^, sign, 3);
422 //goodMap := (sign = MAP_SIGNATURE);
424 try
426 except
432 begin
433 //e_WriteLog(Format(' not a map in wad [%s], file [%s] (#%d)', [fFileName, fi.fname, f]), MSG_NOTIFY);
437 continue;
440 {$ENDIF}
442 {$IFDEF SFS_DFWAD_DEBUG}
444 e_WriteLog(Format('DFWAD: file [%s] FOUND in [%s]; size is %d bytes', [name, fFileName, Len]), MSG_NOTIFY);
445 {$ENDIF}
446 exit;
449 if logError then e_WriteLog(Format('DFWAD: file [%s] not found in [%s]', [name, fFileName]), MSG_WARNING);
452 function TWADFile.GetResource (name: AnsiString; var pData: Pointer; var Len: Integer; logError: Boolean=true): Boolean;
453 begin
457 function TWADFile.GetMapResource (name: AnsiString; var pData: Pointer; var Len: Integer; logError: Boolean=true): Boolean;
458 begin
463 var
467 begin
471 begin
475 {$IF DEFINED(D2D_NEW_MAP_READER)}
476 //e_LogWritefln('DFWAD: checking for map in wad [%s], file [%s] (#%d)', [fFileName, fi.fname, f]);
477 {$ENDIF}
479 begin
483 begin
488 begin
498 var
500 //f: Integer;
501 //fi: TSFSFileInfo;
502 begin
504 //e_WriteLog(Format('TWADFile.ReadFile: [%s]', [FileName]), MSG_NOTIFY);
508 begin
510 exit;
512 {$IFDEF SFS_DFWAD_DEBUG}
514 {$ENDIF}
515 // cache this wad
516 try
518 begin
520 end
521 else
522 begin
525 except
526 exit;
531 {$IFDEF SFS_DFWAD_DEBUG}
532 if wadoptDebug then e_WriteLog(Format('TWADFile.ReadFile: [%s] opened', [fFileName]), MSG_NOTIFY);
533 {$ENDIF}
538 var
542 var
545 //f: Integer;
546 //fi: TSFSFileInfo;
547 begin
551 begin
553 Exit;
558 {$IFDEF SFS_DFWAD_DEBUG}
560 {$ENDIF}
562 try
565 begin
567 Exit;
569 except
571 Exit;
578 {$IFDEF SFS_DFWAD_DEBUG}
579 if wadoptDebug then e_WriteLog(Format('TWADFile.ReadMemory: [%s] opened', [fFileName]), MSG_NOTIFY);
580 {$ENDIF}
582 {
583 for f := 0 to fIter.Count-1 do
584 begin
585 fi := fIter.Files[f];
586 if fi = nil then continue;
587 st := fIter.volume.OpenFileByIndex(f);
588 if st = nil then
589 begin
590 e_WriteLog(Format('[%s]: [%s : %s] CAN''T OPEN', [fFileName, fi.path, fi.name]), MSG_NOTIFY);
591 end
592 else
593 begin
594 e_WriteLog(Format('[%s]: [%s : %s] %u', [fFileName, fi.path, fi.name, st.size]), MSG_NOTIFY);
595 st.Free;
596 end;
597 end;
598 //fIter.volume.OpenFileByIndex(0);
599 }
605 begin