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
, utils
;
134 uWADEditorFactory
: TWADEditorFactory
;
136 procedure g_ProcessResourceStr(ResourceStr
: String; var FileName
, SectionName
, ResourceName
: String);
139 for i
:= Length(ResourceStr
) downto 1 do
140 if ResourceStr
[i
] = ':' then
143 FileName
:= Copy(ResourceStr
, 1, i
-1);
145 for a
:= i
+1 to Length(ResourceStr
) do
146 if (ResourceStr
[a
] = '\') or (ResourceStr
[a
] = '/') then Break
;
148 ResourceName
:= Copy(ResourceStr
, a
+1, Length(ResourceStr
)-Abs(a
));
149 SectionName
:= Copy(ResourceStr
, i
+1, Length(ResourceStr
)-Length(ResourceName
)-Length(FileName
)-2);
152 procedure g_ProcessResourceStr(ResourceStr
: AnsiString; FileName
, SectionName
, ResourceName
: PAnsiString);
153 var a
, i
, l1
, l2
: Integer;
155 for i
:= Length(ResourceStr
) downto 1 do
156 if ResourceStr
[i
] = ':' then
159 if FileName
<> nil then
161 FileName
^ := Copy(ResourceStr
, 1, i
-1);
162 l1
:= Length(FileName
^);
167 for a
:= i
+1 to Length(ResourceStr
) do
168 if (ResourceStr
[a
] = '\') or (ResourceStr
[a
] = '/') then Break
;
170 if ResourceName
<> nil then
172 ResourceName
^ := Copy(ResourceStr
, a
+1, Length(ResourceStr
)-Abs(a
));
173 l2
:= Length(ResourceName
^);
178 if SectionName
<> nil then
179 SectionName
^ := Copy(ResourceStr
, i
+1, Length(ResourceStr
)-l2
-l1
-2);
184 function TWADEditor
.ReadFile(FileName
: String): Boolean;
187 fname
:= findFileCIStr(FileName
);
188 Result
:= ReadFile2(fname
);
191 { TWADEditorMapping }
193 constructor TWADEditorMapping
.CreateEx(const name
: String; const eclass
: TWADEditorClass
);
197 FWADEditorClass
:= eclass
;
200 { TWADEditorFactory }
202 constructor TWADEditorFactory
.Create
;
204 FMappings
:= TStringList
.Create();
208 destructor TWADEditorFactory
.Destroy
;
211 for i
:= 0 to FMappings
.Count
- 1 do
212 FMappings
.Objects
[i
].Free();
217 procedure TWADEditorFactory
.RegisterEditor(const name
: String; const eclass
: TWADEditorClass
);
219 if FMappings
.IndexOf(UpperCase(name
)) <> -1 then
220 raise Exception
.Create('Registering a duplicate WAD Editor name <' + name
+ '>');
221 if FDefault
= nil then
223 FMappings
.AddObject(UpperCase(name
), TWADEditorMapping
.CreateEx(name
, eclass
));
226 procedure TWADEditorFactory
.SetDefaultEditor(const name
: String);
229 i
:= FMappings
.IndexOf(UpperCase(name
));
231 raise Exception
.Create('No WAD Editor was registred by the name <' + name
+ '>');
232 FDefault
:= TWADEditorMapping(FMappings
.Objects
[i
]).WADEditorClass
;
235 function TWADEditorFactory
.CreateEditor(const name
: String): TWADEditor
;
240 Result
:= CreateDefaultEditor();
244 i
:= FMappings
.IndexOf(UpperCase(name
));
246 raise Exception
.Create('No WAD Editor was registred by the name <' + name
+ '>');
247 Result
:= TWADEditorMapping(FMappings
.Objects
[i
]).WADEditorClass
.Create();
251 function TWADEditorFactory
.CreateDefaultEditor(): TWADEditor
;
253 if FDefault
= nil then
254 raise Exception
.Create('No default WAD Editor was registred');
255 Result
:= FDefault
.Create();
258 function TWADEditorFactory
.OpenFile(FileName
: String): TWADEditor
;
259 var i
: Integer; tmp
: TWADEditor
; fname
: String;
262 if FMappings
<> nil then
264 fname
:= findFileCIStr(FileName
);
265 for i
:= 0 to FMappings
.Count
- 1 do
267 tmp
:= gWADEditorFactory
.CreateEditor(FMappings
[i
]);
268 if tmp
.ReadFile2(fname
) then
278 function TWADEditorFactory
.OpenMemory(Data
: Pointer; Len
: Integer): TWADEditor
;
279 var i
: Integer; tmp
: TWADEditor
;
282 if FMappings
<> nil then
284 for i
:= 0 to FMappings
.Count
- 1 do
286 tmp
:= gWADEditorFactory
.CreateEditor(FMappings
[i
]);
287 if tmp
.ReadMemory(Data
, Len
) then
297 procedure TWADEditorFactory
.GetRegistredEditors(var list
: TStringList
);
301 for i
:= 0 to FMappings
.Count
- 1 do
302 list
.Add(TWADEditorMapping(FMappings
.Objects
[i
]).Name
);
305 function gWADEditorFactory
: TWADEditorFactory
;
307 if not Assigned(uWADEditorFactory
) then
308 uWADEditorFactory
:= TWADEditorFactory
.Create();
309 Result
:= uWADEditorFactory
;
314 constructor TWADEditor_1
.Create();
316 FBase
:= gWADEditorFactory
.CreateDefaultEditor();
319 destructor TWADEditor_1
.Destroy();
326 procedure TWADEditor_1
.CreateImage();
331 procedure TWADEditor_1
.FreeWAD();
336 function TWADEditor_1
.ReadFile(FileName
: String): Boolean;
339 Result
:= FBase
.ReadFile(FileName
);
340 if Result
= False then
342 tmp
:= gWADEditorFactory
.OpenFile(FileName
);
352 function TWADEditor_1
.ReadMemory(Data
: Pointer; Len
: LongWord): Boolean;
355 Result
:= FBase
.ReadMemory(Data
, Len
);
356 if Result
= False then
358 tmp
:= gWADEditorFactory
.OpenMemory(Data
, Len
);
368 procedure TWADEditor_1
.SaveTo(FileName
: string);
369 var fname
: AnsiString;
371 fname
:= findFileCIStr(FileName
);
375 function TWADEditor_1
.AddAlias(Res
, Alias
: string): Boolean;
377 Result
:= FBase
.AddAlias(Res
, Alias
);
380 function TWADEditor_1
.AddResource(Data
: Pointer; Len
: LongWord; Name
: string; Section
: string): Boolean;
382 Result
:= FBase
.AddResource(Data
, Len
, Name
, Section
);
385 function TWADEditor_1
.AddResource(FileName
, Name
, Section
: string): Boolean;
386 var fname
: AnsiString;
388 fname
:= findFileCIStr(FileName
);
389 Result
:= FBase
.AddResource(fname
, Name
, Section
);
392 procedure TWADEditor_1
.AddSection(Name
: string);
394 FBase
.AddSection(Name
);
397 function TWADEditor_1
.GetSectionList(): SArray
;
399 Result
:= FBase
.GetSectionList();
402 function TWADEditor_1
.HaveSection(Section
: string): Boolean;
404 Result
:= FBase
.HaveSection(Section
);
407 function TWADEditor_1
.GetResourcesList(Section
: string): SArray
;
409 Result
:= FBase
.GetResourcesList(Section
);
412 function TWADEditor_1
.HaveResource(Section
, Resource
: string): Boolean;
414 Result
:= FBase
.HaveResource(Section
, Resource
);
417 function TWADEditor_1
.GetResource(Section
, Resource
: string; var pData
: Pointer; var Len
: Integer): Boolean;
419 Result
:= FBase
.GetResource(Section
, Resource
, pData
, Len
);
422 procedure TWADEditor_1
.RemoveResource(Section
, Resource
: string);
424 FBase
.RemoveResource(Section
, Resource
);
427 function TWADEditor_1
.GetLastError
: Integer;
429 Result
:= FBase
.GetLastError();
432 function TWADEditor_1
.GetLastErrorStr
: String;
434 Result
:= FBase
.GetLastErrorStr();
437 function TWADEditor_1
.GetResourcesCount
: Word;
439 Result
:= FBase
.GetResourcesCount();
442 function TWADEditor_1
.GetVersion
: Byte;
444 Result
:= FBase
.GetVersion
;
448 FreeAndNil(uWADEditorFactory
);