unit UCore;
interface
uses uPluginDefs, uCoreModule, UHooks, UServices, uModules;
{*********************
TCore
Class manages all CoreModules, teh StartUp, teh MainLoop and the shutdown process
Also it does some Error Handling, and maybe sometime multithreaded Loading ;)
*********************}
{$IFDEF FPC}
{$MODE Delphi}
{$ENDIF}
{$I switches.inc}
type
TModuleListItem = record
Module: TCoreModule; //Instance of the Modules Class
Info: TModuleInfo; //ModuleInfo returned by Modules Modulinfo Proc
NeedsDeInit: Boolean; //True if Module was succesful inited
end;
TCore = class
private
//Some Hook Handles. See Plugin SDKs Hooks.txt for Infos
hLoadingFinished: THandle;
hMainLoop: THandle;
hLoadTextures: THandle;
hExitQuery: THandle;
hExit: THandle;
hDebug: THandle;
hError: THandle;
sReportError: THandle;
sReportDebug: THandle;
Modules: Array [0..High(CORE_MODULES_TO_LOAD)] of TModuleListItem;
//Function Get all Modules and Creates them
Function GetModules: Boolean;
//Loads Core and all Modules
Function Load: Boolean;
//Inits Core and all Modules
Function Init: Boolean;
//DeInits Core and all Modules
Function DeInit: Boolean;
//Load the Core
Function LoadCore: Boolean;
//Init the Core
Function InitCore: Boolean;
//DeInit the Core
Function DeInitCore: Boolean;
//Called one Time per Frame
Function MainLoop: Boolean;
public
Hooks: THookManager; //Teh Hook Manager ;)
Services: TServiceManager;//The Service Manager
CurExecuted: Integer; //ID of Plugin or Module curently Executed
Name: String; //Name of this Application
Version: LongWord; //Version of this ". For Info Look PluginDefs Functions
//---------------
//Main Methods to control the Core:
//---------------
Constructor Create(const cName: String; const cVersion: LongWord);
//Starts Loading and Init Process. Then Runs MainLoop. DeInits on Shutdown
Procedure Run;
//--------------
// Hook and Service Procs:
//--------------
Function ShowMessage(wParam, lParam: DWord): integer; //Shows a Message (lParam: PChar Text, wParam: Symbol)
{Function ShowMessage(wParam, lParam: DWord): integer; //Shows a Message (lParam: PChar Text, wParam: Symbol)
Function ShowMessage(wParam, lParam: DWord): integer; //Shows a Message (lParam: PChar Text, wParam: Symbol)}
end;
var
Core: TCore;
implementation
{$IFDEF win32}
uses Windows;
{$ENDIF}
//-------------
// Create - Creates Class + Hook and Service Manager
//-------------
Constructor TCore.Create(const cName: String; const cVersion: LongWord);
begin
Name := cName;
Version := cVersion;
CurExecuted := 0;
Hooks := THookManager.Create(50);
Services := TServiceManager.Create;
end;
//-------------
//Starts Loading and Init Process. Then Runs MainLoop. DeInits on Shutdown
//-------------
Procedure TCore.Run;
var
noError: Boolean;
begin
//Get Modules
Try
noError := GetModules;
Except
noError := False;
end;
//Loading
if (noError) then
begin
Try
noError := Load;
Except
noError := False;
end;
end
else
Self.ShowMessage(CORE_SM_ERROR, Integer(PChar('')));
end;
//-------------
//Called one Time per Frame
//-------------
Function TCore.MainLoop: Boolean;
begin
Result := True;
end;
//-------------
//Function Get all Modules and Creates them
//-------------
Function TCore.GetModules: Boolean;
var
I: Integer;
begin
For I := 0 to high(Modules) do
begin
Modules[I].NeedsDeInit := False;
Modules[I].Module := CORE_MODULES_TO_LOAD[I].Create;
Modules[I].Module.Info(@Modules[I].Info);
end;
end;
//-------------
//Loads Core and all Modules
//-------------
Function TCore.Load: Boolean;
var
I: Integer;
begin
Result := LoadCore;
I := 0;
While ((Result = True) AND (I <= High(CORE_MODULES_TO_LOAD))) do
begin
Result := Modules[I].Module.Load;
Inc(I);
end;
end;
//-------------
//Inits Core and all Modules
//-------------
Function TCore.Init: Boolean;
var
I: Integer;
begin
Result := InitCore;
I := 0;
While ((Result = True) AND (I <= High(CORE_MODULES_TO_LOAD))) do
begin
Result := Modules[I].Module.Init;
Inc(I);
end;
end;
//-------------
//DeInits Core and all Modules
//-------------
Function TCore.DeInit: Boolean;
var
I: Integer;
label Continue;
begin
I := High(CORE_MODULES_TO_LOAD);
Continue:
Try
While (I >= 0) do
begin
If (Modules[I].NeedsDeInit) then
Modules[I].Module.DeInit;
Dec(I);
end;
Except
end;
If (I >= 0) then
GoTo Continue;
DeInitCore;
end;
//-------------
//Load the Core
//-------------
Function TCore.LoadCore: Boolean;
begin
hLoadingFinished := Hooks.AddEvent('Core/LoadingFinished');
hMainLoop := Hooks.AddEvent('Core/MainLoop');
hLoadTextures := Hooks.AddEvent('Core/LoadTextures');
hExitQuery := Hooks.AddEvent('Core/ExitQuery');
hExit := Hooks.AddEvent('Core/Exit');
hDebug := Hooks.AddEvent('Core/NewDebugInfo');
hError := Hooks.AddEvent('Core/NewError');
sReportError := Services.AddService('Core/ReportError');
sReportDebug := Services.AddService('Core/ReportDebug');
end;
//-------------
//Init the Core
//-------------
Function TCore.InitCore: Boolean;
begin
//Dont Init s.th. atm.
end;
//-------------
//DeInit the Core
//-------------
Function TCore.DeInitCore: Boolean;
begin
// to-do : write TService-/HookManager.Free and call it here
end;
//-------------
//Shows a MessageDialog (lParam: PChar Text, wParam: Symbol)
//-------------
Function TCore.ShowMessage(wParam, lParam: DWord): integer;
var Params: Cardinal;
begin
Result := -1;
{$IFDEF win32}
If (ptr(lParam)<>nil) then
begin
Params := MB_OK;
Case wParam of
CORE_SM_ERROR: Params := Params or MB_ICONERROR;
CORE_SM_WARNING: Params := Params or MB_ICONWARNING;
CORE_SM_INFO: Params := Params or MB_ICONINFORMATION;
end;
//Anzeigen:
Result := Messagebox(0, ptr(lParam), PChar(Name), Params);
end;
{$ENDIF}
// to-do : write ShowMessage for other OSes
end;
end.