aboutsummaryrefslogtreecommitdiffstats
path: root/unicode/plugins/SDK/UPluginDefs.pas
blob: 45bae864d823ee8e133de1b7b6a5d99a175e429d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
unit uPluginDefs;
{*********************
  uPluginDefs
  Some basic structures and functions used to communicate with plugins
  Usable as Delphi plugin SDK
*********************}

interface

{$IFDEF FPC}
  {$MODE Delphi}
{$ENDIF}

{$I switches.inc}

type
  dword = LongWord;

  //Compatibility with 64 Bit Systems
  {$IFDEF CPU32}
  TwParam = integer;
  TlParam = pointer; //lParam is used for 32 bit addresses. dword is large enough
  {$ELSE}
  TwParam = int64;
  TlParam = pointer; //lParam used for 64 bit addresses in 64 bit systems (FreePascal)
  {$ENDIF}
  //wParam is mainly used for ordinals
  //lparam is mainly used for pointers

  //----------------
  // TUS_PluginInfo - some infos from plugin to core.
  // Send when Plugininfo procedure is called
  // ---
  // Version structure:
  // First  byte: Head Revison
  // Second byte: Sub Revison
  // Third  byte: Sub Revision 2
  // Fourth byte: Letter (For Bug Fix releases. 0 or 'a' .. 'z')
  //----------------
  PUS_PluginInfo = ^TUS_PluginInfo;
  TUS_PluginInfo = record
    cbSize:       integer;    //Size of this record (usefull if record will be extended in the future)

    Name:         array [0..31] of char;      //Name of the Plugin
    Version:      dword;                      //Version of the Plugin
    Description:  array [0..127] of char;     //Description, what does this Plugin do
    Author:       array [0..31] of char;      //Author of this Plugin
    AuthorEmail:  array [0..63] of char;      //Authors Email
    Homepage:     array [0..63] of char;      //Homepage of Plugin/Author
  end;
  AUS_PluginInfo = array of TUS_PluginInfo;
  PAUS_PluginInfo = ^AUS_PluginInfo;

  //----------------
  // TUS_Hook - Structure of the Hook function
  // Return 0 if the Hook should be continue,
  // or a non zero Value, if the Hook should be Interuped
  // In this Case the Caller of the Notifier gets the Return Value
  // Return Value Should not be -1
  //----------------
  TUS_Hook            = function (wParam: TwParam; lParam: TlParam): integer; stdcall;
  TUS_Hook_of_Object  = function (wParam: TwParam; lParam: TlParam): integer of Object;

  //----------------
  // TUS_Service - Structure of the Service function
  // This function is called if the Registered Service is Called
  // Return Value Should not be SERVICE_NOT_FOUND
  //----------------
  TUS_Service           = function (wParam: TwParam; lParam: TlParam): integer; stdcall;
  TUS_Service_of_Object = function (wParam: TwParam; lParam: TlParam): integer of Object;

  //----------------
  // TUS_PluginInterface - Structure that Includes all Methods callable
  // from the Plugins
  //----------------
  PUS_PluginInterface = ^TUS_PluginInterface;
  TUS_PluginInterface = record
    {******** Hook specific Methods ********}
    {Function Creates a new Hookable Event and Returns the Handle
     or 0 on Failure. (Name already exists)}
    CreateHookableEvent: function (EventName: PChar): THandle; stdcall;

    {Function Destroys an Event and Unhooks all Hooks to this Event.
     0 on success, not 0 on Failure}
    DestroyHookableEvent: function (hEvent: THandle): integer; stdcall;

    {Function start calling the Hook Chain
     0 if Chain is called until the End, -1 if Event Handle is not valid
     otherwise Return Value of the Hook that breaks the Chain}
    NotivyEventHooks: function (hEvent: THandle; wParam: TwParam; lParam: TlParam): integer; stdcall;

    {Function Hooks an Event by Name.
     Returns Hook Handle on Success, otherwise 0}
    HookEvent: function (EventName: PChar; HookProc: TUS_Hook): THandle; stdcall;

    {Function Removes the Hook from the Chain
     Returns 0 on Success}
    UnHookEvent: function (hHook: THandle): integer; stdcall;

    {Function Returns Non Zero if a Event with the given Name Exists,
     otherwise 0}
    EventExists: function (EventName: PChar): integer; stdcall;

    {******** Service specific Methods ********}
    {Function Creates a new Service and Returns the Services Handle
     or 0 on Failure. (Name already exists)}
    CreateService: function (ServiceName: PChar; ServiceProc: TUS_Service): THandle; stdcall;

    {Function Destroys a Service.
     0 on success, not 0 on Failure}
    DestroyService: function (hService: THandle): integer; stdcall;

    {Function Calls a Services Proc
     Returns Services Return Value or SERVICE_NOT_FOUND on Failure}
    CallService: function (ServiceName: PChar; wParam: TwParam; lParam: TlParam): integer; stdcall;

    {Function Returns Non Zero if a Service with the given Name Exists,
     otherwise 0}
    ServiceExists: function (ServiceName: PChar): integer; stdcall;
  end;

  //----------------
  //TModuleInfo: Info about Modules. Result of Core/GetModuleInfo
  //----------------
  PModuleInfo = ^TModuleInfo;
  TModuleInfo = record
    Name:         string;
    Version:      LongWord;
    Description:  string;
  end;
  AModuleInfo = array of TModuleInfo;

  //----------------
  // Procs that should be exported by Plugin Dlls
  //----------------
  //Procedure is called to check if this is USDx Plugin
  //Info is Pointer to this Plugins Info. Size is already set. Don't write over this limit
  Proc_PluginInfo = procedure (Info: PUS_PluginInfo); stdcall;

  //Called on Plugins Load. If Non Zero is Returned => abort Loading
  //PInterface is Pointer to PluginInterface
  Func_Load = function (const PInterface: PUS_PluginInterface): integer; stdcall;

  //Called on Plugins Init. If Non Zero is Returned => abort Loading
  //PInterface is Pointer to PluginInterface
  Func_Init = function (const PInterface: PUS_PluginInterface): integer; stdcall;

  //Called on Plugins Deinit.
  //PInterface is Pointer to PluginInterface
  Proc_DeInit = procedure (const PInterface: PUS_PluginInterface); stdcall;

//----------------
// Some Default Constants
//----------------
const
  {Returned if Service is not found from CallService}
  SERVICE_NOT_FOUND = LongInt($80000000);

  //for use in Service 'Core/ShowMessage' lParam(Symbol)
  CORE_SM_NOSYMBOL= 0;
  CORE_SM_ERROR   = 1;
  CORE_SM_WARNING = 2;
  CORE_SM_INFO    = 3;

//----------------
// Some functions to Handle Version dwords
//----------------
function MakeVersion(const HeadRevision, SubVersion, SubVersion2: byte; Letter: char): dword;
function VersionToString(const Version: dword): string;

implementation

//--------------
// MakeVersion - converts 4 values to a valid version dword
//--------------
function MakeVersion(const HeadRevision, SubVersion, SubVersion2: byte; Letter: char): dword;
begin
  if(letter < 'a') or (Letter > 'z') then
    letter := chr(0);

  Result := (HeadRevision shl 24) or (SubVersion shl 16) or (SubVersion2 shl 8) or Ord(Letter);
end;

//--------------
// VersiontoString - Returns some beauty '1.0.2a' like string
//--------------
function VersionToString(const Version: dword): string;
begin // to-do : Write VersiontoString without SysUtils dependence
  //Result := InttoStr((ver and $FF000000) shr 24);
  Result := '1.0.1'
end;

end.