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;
46 DFWAD_LOG_DEFAULT
= DFWAD_LOG_INFO
;
49 SArray
= array of ShortString
;
51 TWADEditor
= class abstract(TObject
)
53 function ReadFile(FileName
: string): Boolean;
55 function ReadFile2(FileName
: string): Boolean; virtual; abstract;
56 function ReadMemory(Data
: Pointer; Len
: LongWord
): Boolean; virtual; abstract;
57 procedure FreeWAD(); virtual; abstract;
58 procedure CreateImage(); virtual; abstract;
59 function AddResource(Data
: Pointer; Len
: LongWord
; Name
: string; Section
: string): Boolean; virtual; abstract; overload
;
60 function AddResource(FileName
, Name
, Section
: string): Boolean; overload
; virtual; abstract;
61 function AddAlias(Res
, Alias
: string): Boolean; virtual; abstract;
62 procedure AddSection(Name
: string); virtual; abstract;
63 procedure RemoveResource(Section
, Resource
: string); virtual; abstract;
64 procedure SaveTo(FileName
: string); virtual; abstract;
65 function HaveResource(Section
, Resource
: string): Boolean; virtual; abstract;
66 function HaveSection(Section
: string): Boolean; virtual; abstract;
67 function GetResource(Section
, Resource
: string; var pData
: Pointer; var Len
: Integer): Boolean; virtual; abstract;
68 function GetSectionList(): SArray
; virtual; abstract;
69 function GetResourcesList(Section
: string): SArray
; virtual; abstract;
71 function GetLastError
: Integer; virtual; abstract;
72 function GetLastErrorStr
: String; virtual; abstract;
73 function GetResourcesCount
: Word; virtual; abstract;
74 function GetVersion
: Byte; virtual; abstract;
77 TWADEditorClass
= class of TWADEditor
;
79 TWADEditorMapping
= class sealed(TObject
)
82 FWADEditorClass
: TWADEditorClass
;
84 constructor CreateEx(const name
: String; const eclass
: TWADEditorClass
);
85 property Name
: String read FName
;
86 property WADEditorClass
: TWADEditorClass read FWADEditorClass
;
89 TWADEditorFactory
= class sealed(TObject
)
91 FMappings
: TStringList
;
92 FDefault
: TWADEditorClass
;
95 destructor Destroy
; override;
96 procedure RegisterEditor(const name
: String; const eclass
: TWADEditorClass
);
97 procedure SetDefaultEditor(const name
: String);
98 function CreateEditor(const name
: String): TWADEditor
;
99 function CreateDefaultEditor(): TWADEditor
;
100 function OpenFile(FileName
: String): TWADEditor
;
101 function OpenMemory(Data
: Pointer; Len
: Integer): TWADEditor
;
102 procedure GetRegistredEditors(var list
: TStringList
);
105 // TWADEditor_1 deprecated
106 TWADEditor_1
= class sealed(TObject
)
110 constructor Create();
111 destructor Destroy(); override;
113 function ReadFile(FileName
: string): Boolean;
114 function ReadMemory(Data
: Pointer; Len
: LongWord
): Boolean;
115 procedure CreateImage();
116 function AddResource(Data
: Pointer; Len
: LongWord
; Name
: string; Section
: string): Boolean; overload
;
117 function AddResource(FileName
, Name
, Section
: string): Boolean; overload
;
118 function AddAlias(Res
, Alias
: string): Boolean;
119 procedure AddSection(Name
: string);
120 procedure RemoveResource(Section
, Resource
: string);
121 procedure SaveTo(FileName
: string);
122 function HaveResource(Section
, Resource
: string): Boolean;
123 function HaveSection(Section
: string): Boolean;
124 function GetResource(Section
, Resource
: string; var pData
: Pointer; var Len
: Integer): Boolean;
125 function GetSectionList(): SArray
;
126 function GetResourcesList(Section
: string): SArray
;
128 function GetLastError
: Integer;
129 function GetLastErrorStr
: String;
130 function GetResourcesCount
: Word;
131 function GetVersion
: Byte;
134 procedure g_ProcessResourceStr(ResourceStr
: String; var FileName
, SectionName
, ResourceName
: String); overload
;
135 procedure g_ProcessResourceStr(ResourceStr
: String; FileName
, SectionName
, ResourceName
: PString
); overload
;
137 function gWADEditorFactory
: TWADEditorFactory
;
140 gWADEditorLogLevel
: Integer = DFWAD_LOG_INFO
;
144 uses SysUtils
, Math
, utils
;
147 uWADEditorFactory
: TWADEditorFactory
;
150 // Resource = [Archive ":"] [{slash} Section {slash}slash] Name.
151 // slash = "/" | "\".
152 procedure g_ProcessResourceStr(ResourceStr
: String; var FileName
, SectionName
, ResourceName
: String);
154 g_ProcessResourceStr(ResourceStr
, @FileName
, @SectionName
, @ResourceName
);
157 procedure g_ProcessResourceStr(ResourceStr
: AnsiString
; FileName
, SectionName
, ResourceName
: PAnsiString
);
158 var i
, j
: Integer; sn
: AnsiString
;
160 i
:= Max(1, LastDelimiter(':', ResourceStr
));
162 if FileName
<> nil then
163 FileName
^ := LeftStr(ResourceStr
, i
- 1);
165 if (SectionName
<> nil) or (ResourceName
<> nil) then
167 for i
:= i
to High(ResourceStr
) do
168 if ResourceStr
[i
] in ['\', '/', ':'] = False then
170 sn
:= Copy(ResourceStr
, i
);
172 j
:= LastDelimiter('/\', sn
);
173 if ResourceName
<> nil then
174 ResourceName
^ := Copy(sn
, j
+ 1);
176 if SectionName
<> nil then
178 for j
:= j
downto 0 do
179 if (j
> 0) and (sn
[j
] in ['\', '/'] = False) then
181 if SectionName
<> nil then
182 SectionName
^ := LeftStr(sn
, j
);
189 function TWADEditor
.ReadFile(FileName
: String): Boolean;
192 fname
:= findFileCIStr(FileName
);
193 Result
:= ReadFile2(fname
);
196 { TWADEditorMapping }
198 constructor TWADEditorMapping
.CreateEx(const name
: String; const eclass
: TWADEditorClass
);
202 FWADEditorClass
:= eclass
;
205 { TWADEditorFactory }
207 constructor TWADEditorFactory
.Create
;
209 FMappings
:= TStringList
.Create();
213 destructor TWADEditorFactory
.Destroy
;
216 for i
:= 0 to FMappings
.Count
- 1 do
217 FMappings
.Objects
[i
].Free();
222 procedure TWADEditorFactory
.RegisterEditor(const name
: String; const eclass
: TWADEditorClass
);
224 if FMappings
.IndexOf(UpperCase(name
)) <> -1 then
225 raise Exception
.Create('Registering a duplicate WAD Editor name <' + name
+ '>');
226 if FDefault
= nil then
228 FMappings
.AddObject(UpperCase(name
), TWADEditorMapping
.CreateEx(name
, eclass
));
231 procedure TWADEditorFactory
.SetDefaultEditor(const name
: String);
234 i
:= FMappings
.IndexOf(UpperCase(name
));
236 raise Exception
.Create('No WAD Editor was registred by the name <' + name
+ '>');
237 FDefault
:= TWADEditorMapping(FMappings
.Objects
[i
]).WADEditorClass
;
240 function TWADEditorFactory
.CreateEditor(const name
: String): TWADEditor
;
245 Result
:= CreateDefaultEditor();
249 i
:= FMappings
.IndexOf(UpperCase(name
));
251 raise Exception
.Create('No WAD Editor was registred by the name <' + name
+ '>');
252 Result
:= TWADEditorMapping(FMappings
.Objects
[i
]).WADEditorClass
.Create();
256 function TWADEditorFactory
.CreateDefaultEditor(): TWADEditor
;
258 if FDefault
= nil then
259 raise Exception
.Create('No default WAD Editor was registred');
260 Result
:= FDefault
.Create();
263 function TWADEditorFactory
.OpenFile(FileName
: String): TWADEditor
;
264 var i
: Integer; tmp
: TWADEditor
; fname
: String;
267 if FMappings
<> nil then
269 fname
:= findFileCIStr(FileName
);
270 for i
:= 0 to FMappings
.Count
- 1 do
272 tmp
:= TWADEditorMapping(FMappings
.Objects
[i
]).WADEditorClass
.Create();
273 if tmp
.ReadFile2(fname
) then
283 function TWADEditorFactory
.OpenMemory(Data
: Pointer; Len
: Integer): TWADEditor
;
284 var i
: Integer; tmp
: TWADEditor
;
287 if FMappings
<> nil then
289 for i
:= 0 to FMappings
.Count
- 1 do
291 tmp
:= TWADEditorMapping(FMappings
.Objects
[i
]).WADEditorClass
.Create();
292 if tmp
.ReadMemory(Data
, Len
) then
302 procedure TWADEditorFactory
.GetRegistredEditors(var list
: TStringList
);
306 for i
:= 0 to FMappings
.Count
- 1 do
307 list
.Add(TWADEditorMapping(FMappings
.Objects
[i
]).Name
);
310 function gWADEditorFactory
: TWADEditorFactory
;
312 if not Assigned(uWADEditorFactory
) then
313 uWADEditorFactory
:= TWADEditorFactory
.Create();
314 Result
:= uWADEditorFactory
;
319 constructor TWADEditor_1
.Create();
321 FBase
:= gWADEditorFactory
.CreateDefaultEditor();
324 destructor TWADEditor_1
.Destroy();
331 procedure TWADEditor_1
.CreateImage();
336 procedure TWADEditor_1
.FreeWAD();
341 function TWADEditor_1
.ReadFile(FileName
: String): Boolean;
344 Result
:= FBase
.ReadFile(FileName
);
345 if Result
= False then
347 tmp
:= gWADEditorFactory
.OpenFile(FileName
);
357 function TWADEditor_1
.ReadMemory(Data
: Pointer; Len
: LongWord
): Boolean;
360 Result
:= FBase
.ReadMemory(Data
, Len
);
361 if Result
= False then
363 tmp
:= gWADEditorFactory
.OpenMemory(Data
, Len
);
373 procedure TWADEditor_1
.SaveTo(FileName
: string);
374 var fname
: AnsiString
;
376 fname
:= findFileCIStr(FileName
);
380 function TWADEditor_1
.AddAlias(Res
, Alias
: string): Boolean;
382 Result
:= FBase
.AddAlias(Res
, Alias
);
385 function TWADEditor_1
.AddResource(Data
: Pointer; Len
: LongWord
; Name
: string; Section
: string): Boolean;
387 Result
:= FBase
.AddResource(Data
, Len
, Name
, Section
);
390 function TWADEditor_1
.AddResource(FileName
, Name
, Section
: string): Boolean;
391 var fname
: AnsiString
;
393 fname
:= findFileCIStr(FileName
);
394 Result
:= FBase
.AddResource(fname
, Name
, Section
);
397 procedure TWADEditor_1
.AddSection(Name
: string);
399 FBase
.AddSection(Name
);
402 function TWADEditor_1
.GetSectionList(): SArray
;
404 Result
:= FBase
.GetSectionList();
407 function TWADEditor_1
.HaveSection(Section
: string): Boolean;
409 Result
:= FBase
.HaveSection(Section
);
412 function TWADEditor_1
.GetResourcesList(Section
: string): SArray
;
414 Result
:= FBase
.GetResourcesList(Section
);
417 function TWADEditor_1
.HaveResource(Section
, Resource
: string): Boolean;
419 Result
:= FBase
.HaveResource(Section
, Resource
);
422 function TWADEditor_1
.GetResource(Section
, Resource
: string; var pData
: Pointer; var Len
: Integer): Boolean;
424 Result
:= FBase
.GetResource(Section
, Resource
, pData
, Len
);
427 procedure TWADEditor_1
.RemoveResource(Section
, Resource
: string);
429 FBase
.RemoveResource(Section
, Resource
);
432 function TWADEditor_1
.GetLastError
: Integer;
434 Result
:= FBase
.GetLastError();
437 function TWADEditor_1
.GetLastErrorStr
: String;
439 Result
:= FBase
.GetLastErrorStr();
442 function TWADEditor_1
.GetResourcesCount
: Word;
444 Result
:= FBase
.GetResourcesCount();
447 function TWADEditor_1
.GetVersion
: Byte;
449 Result
:= FBase
.GetVersion
;
453 FreeAndNil(uWADEditorFactory
);