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
25 Classes,
29 type
31 private
38 function GetResourceEx (name: AnsiString; wantMap: Boolean; var pData: Pointer; var Len: Integer; logError: Boolean=true): Boolean;
40 public
49 function GetResource (name: AnsiString; var pData: Pointer; var Len: Integer; logError: Boolean=true): Boolean;
50 function GetMapResource (name: AnsiString; var pData: Pointer; var Len: Integer; logError: Boolean=true): Boolean;
53 // returns `nil` if file wasn't found
66 // return fixed AnsiString or empty AnsiString
70 var
75 implementation
77 uses
82 begin
85 begin
86 //e_WriteLog(Format('findDiskWad: error looking for [%s]', [fname]), MSG_NOTIFY);
88 begin
90 //e_WriteLog(Format(' looking for [%s]', [fname]), MSG_NOTIFY);
92 begin
94 //e_WriteLog(Format(' looking for [%s]', [fname]), MSG_NOTIFY);
97 end
98 else
99 begin
100 exit;
103 //e_WriteLog(Format('findDiskWad: FOUND [%s]', [fname]), MSG_NOTIFY);
109 var
111 begin
117 var
119 begin
121 begin
123 begin
128 exit;
135 var
137 begin
139 begin
141 begin
143 exit;
150 var
152 begin
156 begin
159 begin
161 begin
165 exit;
172 var
174 begin
178 begin
181 begin
183 exit;
190 var
192 begin
195 begin
197 begin
200 exit;
209 { TWADFile }
211 begin
217 begin
224 begin
230 begin
232 //if fFileName <> '' then e_WriteLog(Format('TWADFile.ReadFile: [%s] closed', [fFileName]), MSG_NOTIFY);
237 //FIXME: detect text maps properly here
239 var
240 //sign: packed array [0..2] of Char;
242 begin
246 try
249 (*
250 fs.readBuffer(sign, 3);
251 result := (sign = MAP_SIGNATURE);
252 if not result then result := (sign[0] = 'm') and (sign[1] = 'a') and (sign[2] = 'p');
253 *)
254 except
257 exit;
263 // returns `nil` if file wasn't found
265 var
268 begin
270 // backwards, due to possible similar names and such
272 begin
276 begin
277 try
279 except
289 var
291 begin
295 begin
296 //writeln('[', s, '] -> [', Copy(s, 1, i-2), ']');
303 function TWADFile.GetResourceEx (name: AnsiString; wantMap: Boolean; var pData: Pointer; var Len: Integer; logError: Boolean=true): Boolean;
304 var
310 //sign: packed array [0..2] of Char;
312 {$IFNDEF SFS_MAPDETECT_FX}
314 {$ENDIF}
315 begin
322 begin
327 begin
330 end
331 else
332 begin
335 // backwards, due to possible similar names and such
337 begin
341 begin
342 // i found her (maybe)
344 begin
347 begin
349 end
350 else
351 begin
353 if not StrEquCI1251(Copy(fi.path, length(fi.path)+1-length(rpath), length(fi.path)), rpath) then continue; // alas
356 try
358 except
362 begin
364 if logError then e_WriteLog(Format('DFWAD: can''t open file [%s] in [%s]', [name, fFileName]), TMsgType.Warning);
365 break;
367 // if we want only maps, check if this is map
368 {$IFDEF SFS_MAPDETECT_FX}
370 begin
372 {$IF DEFINED(D2D_NEW_MAP_READER_DBG)}
373 e_LogWritefln('DFWAD: checking for good map in wad [%s], file [%s] (#%d)', [fFileName, fi.fname, f]);
374 {$ENDIF}
375 try
376 //fs.readBuffer(sign, 3);
377 //goodMap := (sign = MAP_SIGNATURE);
378 //if not goodMap then goodMap := (sign[0] = 'm') and (sign[1] = 'a') and (sign[2] = 'p');
380 {$IF DEFINED(D2D_NEW_MAP_READER_DBG)}
383 else
385 {$ENDIF}
386 except
389 begin
390 {$IF DEFINED(D2D_NEW_MAP_READER_DBG)}
392 {$ENDIF}
394 continue;
398 {$ENDIF}
402 try
405 finally
407 begin
414 {$IFNDEF SFS_MAPDETECT_FX}
416 begin
419 begin
420 //Move(pData^, sign, 3);
421 //goodMap := (sign = MAP_SIGNATURE);
423 try
425 except
431 begin
432 //e_WriteLog(Format(' not a map in wad [%s], file [%s] (#%d)', [fFileName, fi.fname, f]), MSG_NOTIFY);
436 continue;
439 {$ENDIF}
441 {$IFDEF SFS_DFWAD_DEBUG}
443 e_WriteLog(Format('DFWAD: file [%s] FOUND in [%s]; size is %d bytes', [name, fFileName, Len]), TMsgType.Notify);
444 {$ENDIF}
445 exit;
448 if logError then e_WriteLog(Format('DFWAD: file [%s] not found in [%s]', [name, fFileName]), TMsgType.Warning);
451 function TWADFile.GetResource (name: AnsiString; var pData: Pointer; var Len: Integer; logError: Boolean=true): Boolean;
452 begin
456 function TWADFile.GetMapResource (name: AnsiString; var pData: Pointer; var Len: Integer; logError: Boolean=true): Boolean;
457 begin
462 var
466 begin
470 begin
474 {$IF DEFINED(D2D_NEW_MAP_READER)}
475 //e_LogWritefln('DFWAD: checking for map in wad [%s], file [%s] (#%d)', [fFileName, fi.fname, f]);
476 {$ENDIF}
478 begin
482 begin
487 begin
497 var
499 //f: Integer;
500 //fi: TSFSFileInfo;
501 begin
503 //e_WriteLog(Format('TWADFile.ReadFile: [%s]', [FileName]), MSG_NOTIFY);
507 begin
509 exit;
511 {$IFDEF SFS_DFWAD_DEBUG}
512 if wadoptDebug then e_WriteLog(Format('TWADFile.ReadFile: FOUND [%s]', [rfn]), TMsgType.Notify);
513 {$ENDIF}
514 // cache this wad
515 try
517 begin
519 end
520 else
521 begin
524 except
525 exit;
530 {$IFDEF SFS_DFWAD_DEBUG}
531 if wadoptDebug then e_WriteLog(Format('TWADFile.ReadFile: [%s] opened', [fFileName]), TMsgType.Notify);
532 {$ENDIF}
537 var
541 var
544 //f: Integer;
545 //fi: TSFSFileInfo;
546 begin
550 begin
552 Exit;
557 {$IFDEF SFS_DFWAD_DEBUG}
559 {$ENDIF}
561 try
564 begin
566 Exit;
568 except
570 Exit;
577 {$IFDEF SFS_DFWAD_DEBUG}
578 if wadoptDebug then e_WriteLog(Format('TWADFile.ReadMemory: [%s] opened', [fFileName]), TMsgType.Notify);
579 {$ENDIF}
581 {
582 for f := 0 to fIter.Count-1 do
583 begin
584 fi := fIter.Files[f];
585 if fi = nil then continue;
586 st := fIter.volume.OpenFileByIndex(f);
587 if st = nil then
588 begin
589 e_WriteLog(Format('[%s]: [%s : %s] CAN''T OPEN', [fFileName, fi.path, fi.name]), MSG_NOTIFY);
590 end
591 else
592 begin
593 e_WriteLog(Format('[%s]: [%s : %s] %u', [fFileName, fi.path, fi.name, st.size]), MSG_NOTIFY);
594 st.Free;
595 end;
596 end;
597 //fIter.volume.OpenFileByIndex(0);
598 }
604 begin