aboutsummaryrefslogtreecommitdiffstats
path: root/src/base/UHooks.pas
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/base/UHooks.pas134
1 files changed, 68 insertions, 66 deletions
diff --git a/src/base/UHooks.pas b/src/base/UHooks.pas
index ba948e6b..ab830090 100644
--- a/src/base/UHooks.pas
+++ b/src/base/UHooks.pas
@@ -27,7 +27,7 @@ unit UHooks;
{*********************
THookManager
- Class for saving, managing and calling of Hooks.
+ Class for saving, managing and calling of hooks.
Saves all hookable events and their subscribers
*********************}
interface
@@ -38,28 +38,29 @@ interface
{$I switches.inc}
-uses uPluginDefs,
- SysUtils;
+uses
+ uPluginDefs,
+ SysUtils;
type
//Record that saves info from Subscriber
PSubscriberInfo = ^TSubscriberInfo;
TSubscriberInfo = record
- Self: THandle; //ID of this Subscription (First Word: ID of Subscription; 2nd Word: ID of Hook)
+ Self: THandle; //ID of this Subscription (First word: ID of Subscription; 2nd word: ID of Hook)
Next: PSubscriberInfo; //Pointer to next Item in HookChain
- Owner: Integer; //For Error Handling and Plugin Unloading.
+ Owner: integer; //For Error Handling and Plugin Unloading.
//Here is s/t tricky
//To avoid writing of Wrapping Functions to Hook an Event with a Class
//We save a Normal Proc or a Method of a Class
- Case isClass: boolean of
+ case isClass: boolean of
False: (Proc: TUS_Hook); //Proc that will be called on Event
True: (ProcOfClass: TUS_Hook_of_Object);
end;
TEventInfo = record
- Name: String[60]; //Name of Event
+ Name: string[60]; //Name of Event
FirstSubscriber: PSubscriberInfo; //First subscriber in chain
LastSubscriber: PSubscriberInfo; //Last " (for easier subscriber adding
end;
@@ -67,22 +68,22 @@ type
THookManager = class
private
Events: array of TEventInfo;
- SpaceinEvents: Word; //Number of empty Items in Events Array. (e.g. Deleted Items)
+ SpaceinEvents: word; //Number of empty Items in Events Array. (e.g. Deleted Items)
- Procedure FreeSubscriber(const EventIndex: Word; const Last, Cur: PSubscriberInfo);
+ procedure FreeSubscriber(const EventIndex: word; const Last, Cur: PSubscriberInfo);
public
- constructor Create(const SpacetoAllocate: Word);
+ constructor Create(const SpacetoAllocate: word);
- Function AddEvent (const EventName: PChar): THandle;
- Function DelEvent (hEvent: THandle): Integer;
+ function AddEvent (const EventName: Pchar): THandle;
+ function DelEvent (hEvent: THandle): integer;
- Function AddSubscriber (const EventName: PChar; const Proc: TUS_Hook = nil; const ProcOfClass: TUS_Hook_of_Object = nil): THandle;
- Function DelSubscriber (const hSubscriber: THandle): Integer;
+ function AddSubscriber (const EventName: Pchar; const Proc: TUS_Hook = nil; const ProcOfClass: TUS_Hook_of_Object = nil): THandle;
+ function DelSubscriber (const hSubscriber: THandle): integer;
- Function CallEventChain (const hEvent: THandle; const wParam: TwParam; lParam: TlParam): Integer;
- Function EventExists (const EventName: PChar): Integer;
+ function CallEventChain (const hEvent: THandle; const wParam: TwParam; lParam: TlParam): integer;
+ function EventExists (const EventName: Pchar): integer;
- Procedure DelbyOwner(const Owner: Integer);
+ procedure DelbyOwner(const Owner: integer);
end;
function HookTest(wParam: TwParam; lParam: TlParam): integer; stdcall;
@@ -91,6 +92,7 @@ var
HookManager: THookManager;
implementation
+
uses
ULog,
UCore;
@@ -98,14 +100,14 @@ uses
//------------
// Create - Creates Class and Set Standard Values
//------------
-constructor THookManager.Create(const SpacetoAllocate: Word);
-var I: Integer;
+constructor THookManager.Create(const SpacetoAllocate: word);
+var I: integer;
begin
inherited Create();
//Get the Space and "Zero" it
SetLength (Events, SpacetoAllocate);
- For I := 0 to SpacetoAllocate-1 do
+ for I := 0 to SpacetoAllocate-1 do
Events[I].Name[1] := chr(0);
SpaceinEvents := SpacetoAllocate;
@@ -118,19 +120,19 @@ end;
//------------
// AddEvent - Adds an Event and return the Events Handle or 0 on Failure
//------------
-Function THookManager.AddEvent (const EventName: PChar): THandle;
-var I: Integer;
+function THookManager.AddEvent (const EventName: Pchar): THandle;
+var I: integer;
begin
Result := 0;
if (EventExists(EventName) = 0) then
begin
- If (SpaceinEvents > 0) then
+ if (SpaceinEvents > 0) then
begin
//There is already Space available
//Go Search it!
- For I := 0 to High(Events) do
- If (Events[I].Name[1] = chr(0)) then
+ for I := 0 to High(Events) do
+ if (Events[I].Name[1] = chr(0)) then
begin //Found Space
Result := I;
Dec(SpaceinEvents);
@@ -168,7 +170,7 @@ end;
//------------
// DelEvent - Deletes an Event by Handle Returns False on Failure
//------------
-Function THookManager.DelEvent (hEvent: THandle): Integer;
+function THookManager.DelEvent (hEvent: THandle): integer;
var
Cur, Last: PSubscriberInfo;
begin
@@ -176,12 +178,12 @@ begin
Result := -1;
- If (Length(Events) > hEvent) AND (Events[hEvent].Name[1] <> chr(0)) then
+ if (Length(Events) > hEvent) and (Events[hEvent].Name[1] <> chr(0)) then
begin //Event exists
//Free the Space for all Subscribers
Cur := Events[hEvent].FirstSubscriber;
- While (Cur <> nil) do
+ while (Cur <> nil) do
begin
Last := Cur;
Cur := Cur.Next;
@@ -207,7 +209,7 @@ end;
// AddSubscriber - Adds an Subscriber to the Event by Name
// Returns Handle of the Subscribtion or 0 on Failure
//------------
-Function THookManager.AddSubscriber (const EventName: PChar; const Proc: TUS_Hook; const ProcOfClass: TUS_Hook_of_Object): THandle;
+function THookManager.AddSubscriber (const EventName: Pchar; const Proc: TUS_Hook; const ProcOfClass: TUS_Hook_of_Object): THandle;
var
EventHandle: THandle;
EventIndex: Cardinal;
@@ -215,11 +217,11 @@ var
begin
Result := 0;
- If (@Proc <> nil) or (@ProcOfClass <> nil) then
+ if (@Proc <> nil) or (@ProcOfClass <> nil) then
begin
EventHandle := EventExists(EventName);
- If (EventHandle <> 0) then
+ if (EventHandle <> 0) then
begin
EventIndex := EventHandle - 1;
@@ -232,7 +234,7 @@ begin
//Add Owner
Cur.Owner := Core.CurExecuted;
- If (@Proc = nil) then
+ if (@Proc = nil) then
begin //Use the ProcofClass Method
Cur.isClass := True;
Cur.ProcOfClass := ProcofClass;
@@ -243,20 +245,20 @@ begin
Cur.Proc := Proc;
end;
- //Create Handle (1st Word: Handle of Event; 2nd Word: unique ID
- If (Events[EventIndex].LastSubscriber = nil) then
+ //Create Handle (1st word: Handle of Event; 2nd word: unique ID
+ if (Events[EventIndex].LastSubscriber = nil) then
begin
- If (Events[EventIndex].FirstSubscriber = nil) then
+ if (Events[EventIndex].FirstSubscriber = nil) then
begin
Result := (EventHandle SHL 16);
Events[EventIndex].FirstSubscriber := Cur;
end
- Else
+ else
begin
Result := Events[EventIndex].FirstSubscriber.Self + 1;
end;
end
- Else
+ else
begin
Result := Events[EventIndex].LastSubscriber.Self + 1;
Events[EventIndex].LastSubscriber.Next := Cur;
@@ -277,10 +279,10 @@ end;
//------------
// FreeSubscriber - Helper for DelSubscriber. Prevents Loss of Chain Items. Frees Memory.
//------------
-Procedure THookManager.FreeSubscriber(const EventIndex: Word; const Last, Cur: PSubscriberInfo);
+procedure THookManager.FreeSubscriber(const EventIndex: word; const Last, Cur: PSubscriberInfo);
begin
//Delete from Chain
- If (Last <> nil) then
+ if (Last <> nil) then
begin
Last.Next := Cur.Next;
end
@@ -290,7 +292,7 @@ begin
end;
//Was this Last subscription ?
- If (Cur = Events[EventIndex].LastSubscriber) then
+ if (Cur = Events[EventIndex].LastSubscriber) then
begin //Change Last Subscriber
Events[EventIndex].LastSubscriber := Last;
end;
@@ -302,16 +304,16 @@ end;
//------------
// DelSubscriber - Deletes a Subscribtion by Handle, return non Zero on Failure
//------------
-Function THookManager.DelSubscriber (const hSubscriber: THandle): Integer;
+function THookManager.DelSubscriber (const hSubscriber: THandle): integer;
var
EventIndex: Cardinal;
Cur, Last: PSubscriberInfo;
begin
Result := -1;
- EventIndex := ((hSubscriber AND (High(THandle) xor High(Word))) SHR 16) - 1;
+ EventIndex := ((hSubscriber and (High(THandle) xor High(word))) SHR 16) - 1;
//Existing Event ?
- If (EventIndex < Length(Events)) AND (Events[EventIndex].Name[1] <> chr(0)) then
+ if (EventIndex < Length(Events)) and (Events[EventIndex].Name[1] <> chr(0)) then
begin
Result := -2; //Return -1 on not existing Event, -2 on not existing Subscription
@@ -320,9 +322,9 @@ begin
Last := nil;
//go through the chain ...
- While (Cur <> nil) do
+ while (Cur <> nil) do
begin
- If (Cur.Self = hSubscriber) then
+ if (Cur.Self = hSubscriber) then
begin //Found Subscription we searched for
FreeSubscriber(EventIndex, Last, Cur);
@@ -347,16 +349,16 @@ end;
// CallEventChain - Calls the Chain of a specified EventHandle
// Returns: -1: Handle doesn't Exist, 0 Chain is called until the End
//------------
-Function THookManager.CallEventChain (const hEvent: THandle; const wParam: TwParam; lParam: TlParam): Integer;
+function THookManager.CallEventChain (const hEvent: THandle; const wParam: TwParam; lParam: TlParam): integer;
var
EventIndex: Cardinal;
Cur: PSubscriberInfo;
- CurExecutedBackup: Integer; //backup of Core.CurExecuted Attribute
+ CurExecutedBackup: integer; //backup of Core.CurExecuted Attribute
begin
Result := -1;
EventIndex := hEvent - 1;
- If ((EventIndex <= High(Events)) AND (Events[EventIndex].Name[1] <> chr(0))) then
+ if ((EventIndex <= High(Events)) and (Events[EventIndex].Name[1] <> chr(0))) then
begin //Existing Event
//Backup CurExecuted
CurExecutedBackup := Core.CurExecuted;
@@ -365,7 +367,7 @@ begin
Cur := Events[EventIndex].FirstSubscriber;
Result := 0;
//Call Hooks until the Chain is at the End or breaked
- While ((Cur <> nil) AND (Result = 0)) do
+ while ((Cur <> nil) and (Result = 0)) do
begin
//Set CurExecuted
Core.CurExecuted := Cur.Owner;
@@ -389,21 +391,21 @@ end;
//------------
// EventExists - Returns non Zero if an Event with the given Name exists
//------------
-Function THookManager.EventExists (const EventName: PChar): Integer;
+function THookManager.EventExists (const EventName: Pchar): integer;
var
- I: Integer;
- Name: String[60];
+ I: integer;
+ Name: string[60];
begin
Result := 0;
- //If (Length(EventName) <
- Name := String(EventName);
+ //if (Length(EventName) <
+ Name := string(EventName);
//Sure not to search for empty space
- If (Name[1] <> chr(0)) then
+ if (Name[1] <> chr(0)) then
begin
//Search for Event
- For I := 0 to High(Events) do
- If (Events[I].Name = Name) then
+ for I := 0 to High(Events) do
+ if (Events[I].Name = Name) then
begin //Event found
Result := I + 1;
Break;
@@ -414,31 +416,31 @@ end;
//------------
// DelbyOwner - Dels all Subscriptions by a specific Owner. (For Clean Plugin/Module unloading)
//------------
-Procedure THookManager.DelbyOwner(const Owner: Integer);
+procedure THookManager.DelbyOwner(const Owner: integer);
var
- I: Integer;
+ I: integer;
Cur, Last: PSubscriberInfo;
begin
//Search for Owner in all Hooks Chains
- For I := 0 to High(Events) do
+ for I := 0 to High(Events) do
begin
- If (Events[I].Name[1] <> chr(0)) then
+ if (Events[I].Name[1] <> chr(0)) then
begin
Last := nil;
Cur := Events[I].FirstSubscriber;
//Went Through Chain
- While (Cur <> nil) do
+ while (Cur <> nil) do
begin
- If (Cur.Owner = Owner) then
+ if (Cur.Owner = Owner) then
begin //Found Subscription by Owner -> Delete
FreeSubscriber(I, Last, Cur);
- If (Last <> nil) then
+ if (Last <> nil) then
Cur := Last.Next
else
Cur := Events[I].FirstSubscriber;
end
- Else
+ else
begin
//Next Item:
Last := Cur;
@@ -453,7 +455,7 @@ end;
function HookTest(wParam: TwParam; lParam: TlParam): integer; stdcall;
begin
Result := 0; //Don't break the chain
- Core.ShowMessage(CORE_SM_INFO, PChar(String(PChar(Pointer(lParam))) + ': ' + String(PChar(Pointer(wParam)))));
+ Core.ShowMessage(CORE_SM_INFO, Pchar(string(Pchar(Pointer(lParam))) + ': ' + string(Pchar(Pointer(wParam)))));
end;
end.