1 {$INCLUDE ../shared/a_modes.inc}
6 // - Create = DFWAD_NOERROR
7 // - FreeWAD = DFWAD_NOERROR
8 // - ReadFile -> DFWAD_ERROR_WADNOTFOUND, DFWAD_ERROR_CANTOPENWAD, DFWAD_ERROR_FILENOTWAD, DFWAD_ERROR_WRONGVERSION, DFWAD_ERROR_READWAD, DFWAD_NOERROR
9 // - ReadMemory -> DFWAD_ERROR_FILENOTWAD, DFWAD_ERROR_WRONGVERSION, DFWAD_NOERROR
10 // - CreateImage -> DFWAD_ERROR_WADNOTLOADED, DFWAD_OPENED_MEMORY, DFWAD_ERROR_CANTOPENWAD, DFWAD_NOERROR
11 // - AddResource (pointer)
12 // - AddResource (filename) -> DFWAD_ERROR_CANTOPENWAD, DFWAD_ERROR_READWAD, DFWAD_NOERROR
19 // - GetResource -> DFWAD_ERROR_WADNOTLOADED, DFWAD_ERROR_RESOURCENOTFOUND, DFWAD_ERROR_CANTOPENWAD, DFWAD_NOERROR
29 DFWAD_ERROR_WADNOTFOUND
= -1;
30 DFWAD_ERROR_CANTOPENWAD
= -2;
31 DFWAD_ERROR_RESOURCENOTFOUND
= -3;
32 DFWAD_ERROR_FILENOTWAD
= -4;
33 DFWAD_ERROR_WADNOTLOADED
= -5;
34 DFWAD_ERROR_READRESOURCE
= -6;
35 DFWAD_ERROR_READWAD
= -7;
36 DFWAD_ERROR_WRONGVERSION
= -8;
39 SArray
= array of ShortString;
41 TWADEditor
= class abstract(TObject
)
43 function ReadFile(FileName
: string): Boolean;
45 function ReadFile2(FileName
: string): Boolean; virtual; abstract;
46 function ReadMemory(Data
: Pointer; Len
: LongWord): Boolean; virtual; abstract;
47 procedure FreeWAD(); virtual; abstract;
48 procedure CreateImage(); virtual; abstract;
49 function AddResource(Data
: Pointer; Len
: LongWord; Name
: string; Section
: string): Boolean; virtual; abstract; overload
;
50 function AddResource(FileName
, Name
, Section
: string): Boolean; overload
; virtual; abstract;
51 function AddAlias(Res
, Alias
: string): Boolean; virtual; abstract;
52 procedure AddSection(Name
: string); virtual; abstract;
53 procedure RemoveResource(Section
, Resource
: string); virtual; abstract;
54 procedure SaveTo(FileName
: string); virtual; abstract;
55 function HaveResource(Section
, Resource
: string): Boolean; virtual; abstract;
56 function HaveSection(Section
: string): Boolean; virtual; abstract;
57 function GetResource(Section
, Resource
: string; var pData
: Pointer; var Len
: Integer): Boolean; virtual; abstract;
58 function GetSectionList(): SArray
; virtual; abstract;
59 function GetResourcesList(Section
: string): SArray
; virtual; abstract;
61 function GetLastError
: Integer; virtual; abstract;
62 function GetLastErrorStr
: String; virtual; abstract;
63 function GetResourcesCount
: Word; virtual; abstract;
64 function GetVersion
: Byte; virtual; abstract;
67 TWADEditorClass
= class of TWADEditor
;
69 TWADEditorMapping
= class sealed(TObject
)
72 FWADEditorClass
: TWADEditorClass
;
74 constructor CreateEx(const name
: String; const eclass
: TWADEditorClass
);
75 property Name
: String read FName
;
76 property WADEditorClass
: TWADEditorClass read FWADEditorClass
;
79 TWADEditorFactory
= class sealed(TObject
)
81 FMappings
: TStringList
;
82 FDefault
: TWADEditorClass
;
85 destructor Destroy
; override;
86 procedure RegisterEditor(const name
: String; const eclass
: TWADEditorClass
);
87 procedure SetDefaultEditor(const name
: String);
88 function CreateEditor(const name
: String): TWADEditor
;
89 function CreateDefaultEditor(): TWADEditor
;
90 function OpenFile(FileName
: String): TWADEditor
;
91 function OpenMemory(Data
: Pointer; Len
: Integer): TWADEditor
;
92 procedure GetRegistredEditors(var list
: TStringList
);
95 // TWADEditor_1 deprecated
96 TWADEditor_1
= class sealed(TObject
)
100 constructor Create();
101 destructor Destroy(); override;
103 function ReadFile(FileName
: string): Boolean;
104 function ReadMemory(Data
: Pointer; Len
: LongWord): Boolean;
105 procedure CreateImage();
106 function AddResource(Data
: Pointer; Len
: LongWord; Name
: string; Section
: string): Boolean; overload
;
107 function AddResource(FileName
, Name
, Section
: string): Boolean; overload
;
108 function AddAlias(Res
, Alias
: string): Boolean;
109 procedure AddSection(Name
: string);
110 procedure RemoveResource(Section
, Resource
: string);
111 procedure SaveTo(FileName
: string);
112 function HaveResource(Section
, Resource
: string): Boolean;
113 function HaveSection(Section
: string): Boolean;
114 function GetResource(Section
, Resource
: string; var pData
: Pointer; var Len
: Integer): Boolean;
115 function GetSectionList(): SArray
;
116 function GetResourcesList(Section
: string): SArray
;
118 function GetLastError
: Integer;
119 function GetLastErrorStr
: String;
120 function GetResourcesCount
: Word;
121 function GetVersion
: Byte;
124 procedure g_ProcessResourceStr(ResourceStr
: String; var FileName
, SectionName
, ResourceName
: String); overload
;
125 procedure g_ProcessResourceStr(ResourceStr
: String; FileName
, SectionName
, ResourceName
: PString); overload
;
127 function gWADEditorFactory
: TWADEditorFactory
;
131 uses SysUtils
, Math
, utils
;
134 uWADEditorFactory
: TWADEditorFactory
;
137 // Resource = [Archive ":"] [{slash} Section {slash}slash] Name.
138 // slash = "/" | "\".
139 procedure g_ProcessResourceStr(ResourceStr
: String; var FileName
, SectionName
, ResourceName
: String);
141 g_ProcessResourceStr(ResourceStr
, @FileName
, @SectionName
, @ResourceName
);
144 procedure g_ProcessResourceStr(ResourceStr
: AnsiString; FileName
, SectionName
, ResourceName
: PAnsiString);
145 var i
, j
: Integer; sn
: AnsiString;
147 i
:= Max(1, LastDelimiter(':', ResourceStr
));
149 if FileName
<> nil then
150 FileName
^ := LeftStr(ResourceStr
, i
- 1);
152 if (SectionName
<> nil) or (ResourceName
<> nil) then
154 for i
:= i
to High(ResourceStr
) do
155 if ResourceStr
[i
] in ['\', '/', ':'] = False then
157 sn
:= Copy(ResourceStr
, i
);
159 j
:= LastDelimiter('/\', sn
);
160 if ResourceName
<> nil then
161 ResourceName
^ := Copy(sn
, j
+ 1);
163 if SectionName
<> nil then
165 for j
:= j
downto 0 do
166 if (j
> 0) and (sn
[j
] in ['\', '/'] = False) then
168 if SectionName
<> nil then
169 SectionName
^ := LeftStr(sn
, j
);
176 function TWADEditor
.ReadFile(FileName
: String): Boolean;
179 fname
:= findFileCIStr(FileName
);
180 Result
:= ReadFile2(fname
);
183 { TWADEditorMapping }
185 constructor TWADEditorMapping
.CreateEx(const name
: String; const eclass
: TWADEditorClass
);
189 FWADEditorClass
:= eclass
;
192 { TWADEditorFactory }
194 constructor TWADEditorFactory
.Create
;
196 FMappings
:= TStringList
.Create();
200 destructor TWADEditorFactory
.Destroy
;
203 for i
:= 0 to FMappings
.Count
- 1 do
204 FMappings
.Objects
[i
].Free();
209 procedure TWADEditorFactory
.RegisterEditor(const name
: String; const eclass
: TWADEditorClass
);
211 if FMappings
.IndexOf(UpperCase(name
)) <> -1 then
212 raise Exception
.Create('Registering a duplicate WAD Editor name <' + name
+ '>');
213 if FDefault
= nil then
215 FMappings
.AddObject(UpperCase(name
), TWADEditorMapping
.CreateEx(name
, eclass
));
218 procedure TWADEditorFactory
.SetDefaultEditor(const name
: String);
221 i
:= FMappings
.IndexOf(UpperCase(name
));
223 raise Exception
.Create('No WAD Editor was registred by the name <' + name
+ '>');
224 FDefault
:= TWADEditorMapping(FMappings
.Objects
[i
]).WADEditorClass
;
227 function TWADEditorFactory
.CreateEditor(const name
: String): TWADEditor
;
232 Result
:= CreateDefaultEditor();
236 i
:= FMappings
.IndexOf(UpperCase(name
));
238 raise Exception
.Create('No WAD Editor was registred by the name <' + name
+ '>');
239 Result
:= TWADEditorMapping(FMappings
.Objects
[i
]).WADEditorClass
.Create();
243 function TWADEditorFactory
.CreateDefaultEditor(): TWADEditor
;
245 if FDefault
= nil then
246 raise Exception
.Create('No default WAD Editor was registred');
247 Result
:= FDefault
.Create();
250 function TWADEditorFactory
.OpenFile(FileName
: String): TWADEditor
;
251 var i
: Integer; tmp
: TWADEditor
; fname
: String;
254 if FMappings
<> nil then
256 fname
:= findFileCIStr(FileName
);
257 for i
:= 0 to FMappings
.Count
- 1 do
259 tmp
:= gWADEditorFactory
.CreateEditor(FMappings
[i
]);
260 if tmp
.ReadFile2(fname
) then
270 function TWADEditorFactory
.OpenMemory(Data
: Pointer; Len
: Integer): TWADEditor
;
271 var i
: Integer; tmp
: TWADEditor
;
274 if FMappings
<> nil then
276 for i
:= 0 to FMappings
.Count
- 1 do
278 tmp
:= gWADEditorFactory
.CreateEditor(FMappings
[i
]);
279 if tmp
.ReadMemory(Data
, Len
) then
289 procedure TWADEditorFactory
.GetRegistredEditors(var list
: TStringList
);
293 for i
:= 0 to FMappings
.Count
- 1 do
294 list
.Add(TWADEditorMapping(FMappings
.Objects
[i
]).Name
);
297 function gWADEditorFactory
: TWADEditorFactory
;
299 if not Assigned(uWADEditorFactory
) then
300 uWADEditorFactory
:= TWADEditorFactory
.Create();
301 Result
:= uWADEditorFactory
;
306 constructor TWADEditor_1
.Create();
308 FBase
:= gWADEditorFactory
.CreateDefaultEditor();
311 destructor TWADEditor_1
.Destroy();
318 procedure TWADEditor_1
.CreateImage();
323 procedure TWADEditor_1
.FreeWAD();
328 function TWADEditor_1
.ReadFile(FileName
: String): Boolean;
331 Result
:= FBase
.ReadFile(FileName
);
332 if Result
= False then
334 tmp
:= gWADEditorFactory
.OpenFile(FileName
);
344 function TWADEditor_1
.ReadMemory(Data
: Pointer; Len
: LongWord): Boolean;
347 Result
:= FBase
.ReadMemory(Data
, Len
);
348 if Result
= False then
350 tmp
:= gWADEditorFactory
.OpenMemory(Data
, Len
);
360 procedure TWADEditor_1
.SaveTo(FileName
: string);
361 var fname
: AnsiString;
363 fname
:= findFileCIStr(FileName
);
367 function TWADEditor_1
.AddAlias(Res
, Alias
: string): Boolean;
369 Result
:= FBase
.AddAlias(Res
, Alias
);
372 function TWADEditor_1
.AddResource(Data
: Pointer; Len
: LongWord; Name
: string; Section
: string): Boolean;
374 Result
:= FBase
.AddResource(Data
, Len
, Name
, Section
);
377 function TWADEditor_1
.AddResource(FileName
, Name
, Section
: string): Boolean;
378 var fname
: AnsiString;
380 fname
:= findFileCIStr(FileName
);
381 Result
:= FBase
.AddResource(fname
, Name
, Section
);
384 procedure TWADEditor_1
.AddSection(Name
: string);
386 FBase
.AddSection(Name
);
389 function TWADEditor_1
.GetSectionList(): SArray
;
391 Result
:= FBase
.GetSectionList();
394 function TWADEditor_1
.HaveSection(Section
: string): Boolean;
396 Result
:= FBase
.HaveSection(Section
);
399 function TWADEditor_1
.GetResourcesList(Section
: string): SArray
;
401 Result
:= FBase
.GetResourcesList(Section
);
404 function TWADEditor_1
.HaveResource(Section
, Resource
: string): Boolean;
406 Result
:= FBase
.HaveResource(Section
, Resource
);
409 function TWADEditor_1
.GetResource(Section
, Resource
: string; var pData
: Pointer; var Len
: Integer): Boolean;
411 Result
:= FBase
.GetResource(Section
, Resource
, pData
, Len
);
414 procedure TWADEditor_1
.RemoveResource(Section
, Resource
: string);
416 FBase
.RemoveResource(Section
, Resource
);
419 function TWADEditor_1
.GetLastError
: Integer;
421 Result
:= FBase
.GetLastError();
424 function TWADEditor_1
.GetLastErrorStr
: String;
426 Result
:= FBase
.GetLastErrorStr();
429 function TWADEditor_1
.GetResourcesCount
: Word;
431 Result
:= FBase
.GetResourcesCount();
434 function TWADEditor_1
.GetVersion
: Byte;
436 Result
:= FBase
.GetVersion
;
440 FreeAndNil(uWADEditorFactory
);