X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fshared%2FWADEDITOR.pas;h=0a80f51d4d43091f3be64900719c3180a498e588;hb=9dc9fb8a1d22fe93e498bc3e1cb7358fdcf5d275;hp=903922fccda3b90be88aa5efd675d0f9dacf6650;hpb=1070d03dd32edd73aced8786d3c5a8200a02ed00;p=d2df-sdl.git diff --git a/src/shared/WADEDITOR.pas b/src/shared/WADEDITOR.pas index 903922f..0a80f51 100644 --- a/src/shared/WADEDITOR.pas +++ b/src/shared/WADEDITOR.pas @@ -1,12 +1,6 @@ unit WADEDITOR; -{ ------------------------------------ -WADEDITOR.PAS ÂÅÐÑÈß ÎÒ 26.08.08 - -Ïîääåðæêà âàäîâ âåðñèè 1 ------------------------------------ -} +{$DEFINE SFS_DWFAD_DEBUG} interface @@ -59,7 +53,7 @@ procedure g_ProcessResourceStr (ResourceStr: String; FileName, SectionName, Reso implementation uses - SysUtils, Classes, BinEditor, e_log; + SysUtils, Classes, BinEditor, e_log, g_options; procedure g_ProcessResourceStr (ResourceStr: String; var FileName, SectionName, ResourceName: String); @@ -139,42 +133,78 @@ end; procedure TWADEditor_1.FreeWAD(); begin if fIter <> nil then FreeAndNil(fIter); - if fFileName <> '' then e_WriteLog(Format('TWADEditor_1.ReadFile: [%s] closed', [fFileName]), MSG_NOTIFY); + //if fFileName <> '' then e_WriteLog(Format('TWADEditor_1.ReadFile: [%s] closed', [fFileName]), MSG_NOTIFY); fFileName := ''; end; +function removeExt (s: string): string; +var + i: Integer; +begin + i := length(s)+1; + while (i > 1) and (s[i-1] <> '.') and (s[i-1] <> '/') do Dec(i); + if (i > 1) and (s[i-1] = '.') then + begin + //writeln('[', s, '] -> [', Copy(s, 1, i-2), ']'); + s := Copy(s, 1, i-2); + end; + result := s; +end; + function TWADEditor_1.GetResource (Section, Resource: string; var pData: Pointer; var Len: Integer): Boolean; var f: Integer; fi: TSFSFileInfo; fs: TStream; - fn: string; + fpp: Pointer; + //fn: string; begin Result := False; if not isOpen or (fIter = nil) then Exit; + if length(Resource) = 0 then Exit; // just in case if (length(Section) <> 0) and (Section[length(Section)] <> '/') then Section := Section+'/'; - for f := 0 to fIter.Count-1 do + // backwards, due to possible similar names and such + for f := fIter.Count-1 downto 0 do begin fi := fIter.Files[f]; if fi = nil then continue; - //e_WriteLog(Format('DFWAD: searching for [%s : %s] in [%s]; current is [%s : %s] (%d, %d)', [Section, Resource, fFileName, fi.path, fi.name, SFSStrComp(fi.path, Section), SFSStrComp(fi.name, Resource)]), MSG_NOTIFY); - if (SFSStrComp(fi.path, Section) = 0) and (SFSStrComp(fi.name, Resource) = 0) then + //e_WriteLog(Format('DFWAD: searching for [%s : %s] in [%s]; current is [%s : %s] (%d, %d)', [Section, Resource, fFileName, fi.path, fi.name, SFSStrEqu(fi.path, Section), SFSStrEqu(fi.name, Resource)]), MSG_NOTIFY); + if {SFSStrEqu}SFSDFPathEqu(fi.path, Section) and SFSStrEqu(removeExt(fi.name), Resource) then begin // i found her! - fn := fFileName+'::'+fi.path+fi.name; - fs := SFSFileOpen(fn); + //fn := fFileName+'::'+fi.path+fi.name; + //fs := SFSFileOpen(fn); + try + fs := fIter.volume.OpenFileByIndex(f); + except + fs := nil; + end; if fs = nil then begin - e_WriteLog(Format('DFWAD: can''t open file [%s]', [fn]), MSG_NOTIFY); + e_WriteLog(Format('DFWAD: can''t open file [%s%s] in [%s]', [Section, Resource, fFileName]), MSG_WARNING); break; end; Len := Integer(fs.size); GetMem(pData, Len); - fs.ReadBuffer(pData^, Len); - fs.Free; + fpp := pData; + try + fs.ReadBuffer(pData^, Len); + fpp := nil; + finally + if fpp <> nil then + begin + FreeMem(fpp); + pData := nil; + Len := 0; + end; + fs.Free; + end; result := true; - e_WriteLog(Format('DFWAD: file [%s%s] FOUND in [%s]; size is %d bytes', [Section, Resource, fFileName, Len]), MSG_NOTIFY); + {$IFDEF SFS_DWFAD_DEBUG} + if gSFSDebug then + e_WriteLog(Format('DFWAD: file [%s%s] FOUND in [%s]; size is %d bytes', [Section, Resource, fFileName, Len]), MSG_NOTIFY); + {$ENDIF} exit; end; end; @@ -194,25 +224,63 @@ begin begin fi := fIter.Files[f]; if fi = nil then continue; - if SFSStrComp(fi.path, Section) = 0 then + if length(fi.name) = 0 then continue; + if {SFSStrEqu}SFSDFPathEqu(fi.path, Section) then begin SetLength(result, Length(result)+1); - result[high(result)] := fi.name; + result[high(result)] := removeExt(fi.name); end; end; end; function TWADEditor_1.ReadFile (FileName: string): Boolean; +var + rfn: string; + //f: Integer; + //fi: TSFSFileInfo; begin Result := False; - e_WriteLog(Format('TWADEditor_1.ReadFile: [%s]', [FileName]), MSG_NOTIFY); + //e_WriteLog(Format('TWADEditor_1.ReadFile: [%s]', [FileName]), MSG_NOTIFY); FreeWAD(); - if not FileExists(FileName) then Exit; - fIter := SFSFileList(FileName); + rfn := FileName; + if not FileExists(rfn) then + begin + //if length(rfn) >= 4 then e_WriteLog(Format('XXXX TWADEditor_1.ReadFile: [%s] [%s]', [Copy(rfn, length(rfn)-3, 4), Copy(rfn, 1, length(rfn)-4)]), MSG_NOTIFY); + if (length(rfn) >= 4) and SFSStrEqu(Copy(rfn, length(rfn)-3, 4), '.wad') then + begin + rfn := Copy(rfn, 1, length(rfn)-4); + if FileExists(rfn+'.pk3') then rfn := rfn+'.pk3' + else if FileExists(rfn+'.zip') then rfn := rfn+'.zip' + else rfn := FileName; + {.$IFDEF SFS_DWFAD_DEBUG} + if gSFSDebug then + if FileExists(rfn) then e_WriteLog(Format('TWADEditor_1.ReadFile: FOUND [%s]', [rfn]), MSG_NOTIFY); + {.$ENDIF} + end; + end; + if not FileExists(rfn) then exit; + {$IFDEF SFS_DWFAD_DEBUG} + if gSFSDebug then + e_WriteLog(Format('TWADEditor_1.ReadFile: FOUND [%s]', [rfn]), MSG_NOTIFY); + {$ENDIF} + // cache this wad + SFSAddDataFile(rfn); + fIter := SFSFileList(rfn); if fIter = nil then Exit; - fFileName := FileName; - e_WriteLog(Format('TWADEditor_1.ReadFile: [%s] opened', [fFileName]), MSG_NOTIFY); + fFileName := rfn; + {$IFDEF SFS_DWFAD_DEBUG} + if gSFSDebug then + e_WriteLog(Format('TWADEditor_1.ReadFile: [%s] opened', [fFileName]), MSG_NOTIFY); + {$ENDIF} + { + for f := 0 to fIter.Count-1 do + begin + fi := fIter.Files[f]; + if fi = nil then continue; + e_WriteLog(Format('[%s]: [%s : %s] %u', [fFileName, fi.path, fi.name, fi.size]), MSG_NOTIFY); + end; + } Result := True; end; @@ -222,18 +290,24 @@ var function TWADEditor_1.ReadMemory (Data: Pointer; Len: LongWord): Boolean; var - Signature: array[0..4] of Char; - a: Integer; fn: string; st: TStream = nil; + //f: Integer; + //fi: TSFSFileInfo; begin Result := False; FreeWAD(); - if (Data = nil) or (Len = 0) then Exit; + if (Data = nil) or (Len = 0) then + begin + e_WriteLog('TWADEditor_1.ReadMemory: EMPTY SUBWAD!', MSG_WARNING); + Exit; + end; fn := Format(' -- memwad %d -- ', [uniqueCounter]); Inc(uniqueCounter); - e_WriteLog(Format('TWADEditor_1.ReadMemory: [%s]', [fn]), MSG_NOTIFY); + {$IFDEF SFS_DWFAD_DEBUG} + e_WriteLog(Format('TWADEditor_1.ReadMemory: [%s]', [fn]), MSG_NOTIFY); + {$ENDIF} try st := TSFSMemoryStreamRO.Create(Data, Len); @@ -251,7 +325,28 @@ begin if fIter = nil then Exit; fFileName := fn; - e_WriteLog(Format('TWADEditor_1.ReadMemory: [%s] opened', [fFileName]), MSG_NOTIFY); + {$IFDEF SFS_DWFAD_DEBUG} + e_WriteLog(Format('TWADEditor_1.ReadMemory: [%s] opened', [fFileName]), MSG_NOTIFY); + {$ENDIF} + + { + for f := 0 to fIter.Count-1 do + begin + fi := fIter.Files[f]; + if fi = nil then continue; + st := fIter.volume.OpenFileByIndex(f); + if st = nil then + begin + e_WriteLog(Format('[%s]: [%s : %s] CAN''T OPEN', [fFileName, fi.path, fi.name]), MSG_NOTIFY); + end + else + begin + e_WriteLog(Format('[%s]: [%s : %s] %u', [fFileName, fi.path, fi.name, st.size]), MSG_NOTIFY); + st.Free; + end; + end; + //fIter.volume.OpenFileByIndex(0); + } Result := True; end;