mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-09 01:49:39 +02:00
* Added small improvement to JSONRPCHandlermanager to ease creating descendents with customized behaviour:
moved creation of defs to virtual procedure. Uses a global classvar to determine default item type. * Implemented GetClassNames and GetMethodsOfClass * Added Clear. git-svn-id: trunk@28190 -
This commit is contained in:
parent
e65c4e13e0
commit
c3f24cc775
@ -240,6 +240,7 @@ Type
|
|||||||
Property ArgumentCount : Integer Read FArgumentCount Write FArgumentCount;
|
Property ArgumentCount : Integer Read FArgumentCount Write FArgumentCount;
|
||||||
Property ParamDefs : TJSONParamDefs Read GetParamDefs Write SetParamDefs;
|
Property ParamDefs : TJSONParamDefs Read GetParamDefs Write SetParamDefs;
|
||||||
end;
|
end;
|
||||||
|
TJSONRPCHandlerDefClass = Class of TJSONRPCHandlerDef;
|
||||||
|
|
||||||
{ TJSONRPCHandlerDefs }
|
{ TJSONRPCHandlerDefs }
|
||||||
|
|
||||||
@ -261,6 +262,7 @@ Type
|
|||||||
FRegistering: Boolean;
|
FRegistering: Boolean;
|
||||||
Protected
|
Protected
|
||||||
procedure Initialize; virtual;
|
procedure Initialize; virtual;
|
||||||
|
procedure DoClear; virtual;
|
||||||
// Handler support
|
// Handler support
|
||||||
Procedure RemoveHandlerDef(Const Index : Integer); virtual; abstract;
|
Procedure RemoveHandlerDef(Const Index : Integer); virtual; abstract;
|
||||||
function AddHandlerDef(Const AClassName,AMethodName : TJSONStringType) : TJSONRPCHandlerDef; virtual; abstract;
|
function AddHandlerDef(Const AClassName,AMethodName : TJSONStringType) : TJSONRPCHandlerDef; virtual; abstract;
|
||||||
@ -279,6 +281,7 @@ Type
|
|||||||
Function GetHandler(Const AClassName,AMethodName : TJSONStringType; AOwner : TComponent; Out AContainer : TComponent): TCustomJSONRPCHandler;
|
Function GetHandler(Const AClassName,AMethodName : TJSONStringType; AOwner : TComponent; Out AContainer : TComponent): TCustomJSONRPCHandler;
|
||||||
Procedure GetClassNames (List : TStrings); // Should be a stringlist of TJSONStringType
|
Procedure GetClassNames (List : TStrings); // Should be a stringlist of TJSONStringType
|
||||||
Procedure GetMethodsOfClass(Const AClassName : TJSONStringType; List : TStrings); // Should be a stringlist of TJSONStringType
|
Procedure GetMethodsOfClass(Const AClassName : TJSONStringType; List : TStrings); // Should be a stringlist of TJSONStringType
|
||||||
|
Procedure Clear;
|
||||||
// properties
|
// properties
|
||||||
Property Registering : Boolean Read FRegistering;
|
Property Registering : Boolean Read FRegistering;
|
||||||
Property HandlerCount : Integer Read GetHandlerDefCount;
|
Property HandlerCount : Integer Read GetHandlerDefCount;
|
||||||
@ -292,6 +295,8 @@ Type
|
|||||||
Private
|
Private
|
||||||
FHandlerDefs : TJSONRPCHandlerDefs;
|
FHandlerDefs : TJSONRPCHandlerDefs;
|
||||||
Protected
|
Protected
|
||||||
|
procedure DoClear; override;
|
||||||
|
Function CreateDefs : TJSONRPCHandlerDefs; virtual;
|
||||||
Procedure RemoveHandlerDef(Const Index : Integer); override;
|
Procedure RemoveHandlerDef(Const Index : Integer); override;
|
||||||
function AddHandlerDef(Const AClassName,AMethodName : TJSONStringType) : TJSONRPCHandlerDef; override;
|
function AddHandlerDef(Const AClassName,AMethodName : TJSONStringType) : TJSONRPCHandlerDef; override;
|
||||||
function IndexOfHandlerDef(Const AClassName,AMethodName : TJSONStringType) : Integer; override;
|
function IndexOfHandlerDef(Const AClassName,AMethodName : TJSONStringType) : Integer; override;
|
||||||
@ -329,10 +334,11 @@ Function CreateErrorForRequest(Const Req,Error : TJSONData) : TJSONData;
|
|||||||
|
|
||||||
Function JSONRPCHandlerManager : TCustomJSONRPCHandlerManager;
|
Function JSONRPCHandlerManager : TCustomJSONRPCHandlerManager;
|
||||||
|
|
||||||
// Class that will be created. Must be set before first call to JSONRPCHandlerManager.
|
|
||||||
Var
|
Var
|
||||||
|
// Class that will be created. Must be set before first call to JSONRPCHandlerManager.
|
||||||
JSONRPCHandlerManagerClass : TCustomJSONRPCHandlerManagerClass = TJSONRPCHandlerManager;
|
JSONRPCHandlerManagerClass : TCustomJSONRPCHandlerManagerClass = TJSONRPCHandlerManager;
|
||||||
|
// Class of Defs that will be created by TJSONRPCHandlerManager. Must be set before first call to JSONRPCHandlerManager.
|
||||||
|
DefaultJSONRPCHandlerDefClass : TJSONRPCHandlerDefClass = TJSONRPCHandlerDef;
|
||||||
|
|
||||||
Const
|
Const
|
||||||
// JSON RPC 2.0 error codes
|
// JSON RPC 2.0 error codes
|
||||||
@ -1167,7 +1173,22 @@ begin
|
|||||||
// Do nothing
|
// Do nothing
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCustomJSONRPCHandlerManager.UnregisterHandler(const AClassName,
|
procedure TCustomJSONRPCHandlerManager.DoClear;
|
||||||
|
Var
|
||||||
|
I : Integer;
|
||||||
|
D : TJSONRPCHandlerDef;
|
||||||
|
C,M : String;
|
||||||
|
begin
|
||||||
|
For I:=HandlerCount-1 downto 0 do
|
||||||
|
begin
|
||||||
|
D:=HandlerDefs[i];
|
||||||
|
C:=D.HandlerClassName;
|
||||||
|
M:=D.HandlerMethodName;
|
||||||
|
UnregisterHandler(C,M);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
Procedure TCustomJSONRPCHandlerManager.UnregisterHandler(Const AClassName,
|
||||||
AMethodName: TJSONStringType);
|
AMethodName: TJSONStringType);
|
||||||
|
|
||||||
Var
|
Var
|
||||||
@ -1184,8 +1205,8 @@ begin
|
|||||||
JSONRPCError(SErrUnknownJSONRPCMethodHandler,[AMethodName]);
|
JSONRPCError(SErrUnknownJSONRPCMethodHandler,[AMethodName]);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCustomJSONRPCHandlerManager.RegisterDatamodule(
|
Procedure TCustomJSONRPCHandlerManager.RegisterDatamodule(
|
||||||
const AClass: TDatamoduleClass; const AHandlerClassName: TJSONStringType);
|
Const AClass: TDatamoduleClass; Const AHandlerClassName: TJSONStringType);
|
||||||
|
|
||||||
Var
|
Var
|
||||||
DM : TDatamodule;
|
DM : TDatamodule;
|
||||||
@ -1228,19 +1249,17 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TCustomJSONRPCHandlerManager.RegisterHandler(
|
Function TCustomJSONRPCHandlerManager.RegisterHandler(
|
||||||
const AMethodName: TJSONStringType;
|
Const AMethodName: TJSONStringType; AClass: TCustomJSONRPCHandlerClass;
|
||||||
AClass: TCustomJSONRPCHandlerClass;
|
AArgumentCount: Integer): TJSONRPCHandlerDef;
|
||||||
AArgumentCount : Integer = 0): TJSONRPCHandlerDef;
|
|
||||||
|
|
||||||
begin
|
begin
|
||||||
Result:=RegisterHandler('',AMethodName,AClass,AArgumentCount);
|
Result:=RegisterHandler('',AMethodName,AClass,AArgumentCount);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TCustomJSONRPCHandlerManager.RegisterHandler(
|
Function TCustomJSONRPCHandlerManager.RegisterHandler(Const AClassName,
|
||||||
const AClassName,AMethodName: String;
|
AMethodName: TJSONStringType; AClass: TCustomJSONRPCHandlerClass;
|
||||||
AClass: TCustomJSONRPCHandlerClass;
|
AArgumentCount: Integer): TJSONRPCHandlerDef;
|
||||||
AArgumentCount : Integer = 0): TJSONRPCHandlerDef;
|
|
||||||
|
|
||||||
Var
|
Var
|
||||||
I : Integer;
|
I : Integer;
|
||||||
@ -1264,7 +1283,7 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TCustomJSONRPCHandlerManager.FindHandlerDefByName(const AClassName,
|
Function TCustomJSONRPCHandlerManager.FindHandlerDefByName(Const AClassName,
|
||||||
AMethodName: TJSONStringType): TJSONRPCHandlerDef;
|
AMethodName: TJSONStringType): TJSONRPCHandlerDef;
|
||||||
|
|
||||||
Var
|
Var
|
||||||
@ -1278,7 +1297,7 @@ begin
|
|||||||
Result:=GetHandlerDef(I);
|
Result:=GetHandlerDef(I);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TCustomJSONRPCHandlerManager.GetHandlerDefByName(const AClassName,
|
Function TCustomJSONRPCHandlerManager.GetHandlerDefByName(Const AClassName,
|
||||||
AMethodName: TJSONStringType): TJSONRPCHandlerDef;
|
AMethodName: TJSONStringType): TJSONRPCHandlerDef;
|
||||||
begin
|
begin
|
||||||
Result:=FindHandlerDefByName(AClassName,AMethodName);
|
Result:=FindHandlerDefByName(AClassName,AMethodName);
|
||||||
@ -1289,8 +1308,8 @@ begin
|
|||||||
JSONRPCError(SErrUnknownJSONRPCMethodHandler,[AMethodName]);
|
JSONRPCError(SErrUnknownJSONRPCMethodHandler,[AMethodName]);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TCustomJSONRPCHandlerManager.GetHandler(
|
Function TCustomJSONRPCHandlerManager.GetHandler(
|
||||||
const ADef: TJSONRPCHandlerDef; AOwner: TComponent; out AContainer: TComponent
|
Const ADef: TJSONRPCHandlerDef; AOwner: TComponent; Out AContainer: TComponent
|
||||||
): TCustomJSONRPCHandler;
|
): TCustomJSONRPCHandler;
|
||||||
|
|
||||||
Var
|
Var
|
||||||
@ -1304,8 +1323,8 @@ begin
|
|||||||
Result:=ADef.CreateInstance(O,AContainer);
|
Result:=ADef.CreateInstance(O,AContainer);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TCustomJSONRPCHandlerManager.GetHandler(const AClassName,
|
Function TCustomJSONRPCHandlerManager.GetHandler(Const AClassName,
|
||||||
AMethodName: TJSONStringType; AOwner: TComponent; out AContainer: TComponent
|
AMethodName: TJSONStringType; AOwner: TComponent; Out AContainer: TComponent
|
||||||
): TCustomJSONRPCHandler;
|
): TCustomJSONRPCHandler;
|
||||||
|
|
||||||
Var
|
Var
|
||||||
@ -1316,31 +1335,65 @@ begin
|
|||||||
Result:=GetHandler(D,AOwner,AContainer);
|
Result:=GetHandler(D,AOwner,AContainer);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCustomJSONRPCHandlerManager.GetClassNames(List: TStrings);
|
Procedure TCustomJSONRPCHandlerManager.GetClassNames(List: TStrings);
|
||||||
begin
|
|
||||||
|
|
||||||
|
Var
|
||||||
|
D : TJSONRPCHandlerDef;
|
||||||
|
I : Integer;
|
||||||
|
|
||||||
|
begin
|
||||||
|
For I:=0 to HandlerCount-1 do
|
||||||
|
begin
|
||||||
|
D:=HandlerDefs[i];
|
||||||
|
If List.IndexOf(D.HandlerClassName)=-1 then
|
||||||
|
List.Add(D.HandlerClassName);
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCustomJSONRPCHandlerManager.GetMethodsOfClass(
|
Procedure TCustomJSONRPCHandlerManager.GetMethodsOfClass(
|
||||||
const AClassName: TJSONStringType; List: TStrings);
|
Const AClassName: TJSONStringType; List: TStrings);
|
||||||
begin
|
Var
|
||||||
|
D : TJSONRPCHandlerDef;
|
||||||
|
I : Integer;
|
||||||
|
|
||||||
|
begin
|
||||||
|
For I:=0 to HandlerCount-1 do
|
||||||
|
begin
|
||||||
|
D:=HandlerDefs[i];
|
||||||
|
If AClassName=D.HandlerClassName then
|
||||||
|
List.Add(D.HandlerMethodName);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
Procedure TCustomJSONRPCHandlerManager.Clear;
|
||||||
|
begin
|
||||||
|
DoClear;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ TJSONRPCHandlerManager }
|
{ TJSONRPCHandlerManager }
|
||||||
|
|
||||||
procedure TJSONRPCHandlerManager.RemoveHandlerDef(const Index: Integer);
|
procedure TJSONRPCHandlerManager.DoClear;
|
||||||
|
begin
|
||||||
|
FHandlerDefs.Clear;
|
||||||
|
end;
|
||||||
|
|
||||||
|
Function TJSONRPCHandlerManager.CreateDefs: TJSONRPCHandlerDefs;
|
||||||
|
begin
|
||||||
|
Result:=TJSONRPCHandlerDefs.Create(DefaultJSONRPCHandlerDefClass);
|
||||||
|
end;
|
||||||
|
|
||||||
|
Procedure TJSONRPCHandlerManager.RemoveHandlerDef(Const Index: Integer);
|
||||||
begin
|
begin
|
||||||
FHandlerDefs.Delete(Index);
|
FHandlerDefs.Delete(Index);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TJSONRPCHandlerManager.AddHandlerDef(const AClassName,
|
function TJSONRPCHandlerManager.AddHandlerDef(Const AClassName,
|
||||||
AMethodName: TJSONStringType): TJSONRPCHandlerDef;
|
AMethodName: TJSONStringType): TJSONRPCHandlerDef;
|
||||||
begin
|
begin
|
||||||
Result:=FHandlerDefs.AddHandler(AClassName,AMethodName);
|
Result:=FHandlerDefs.AddHandler(AClassName,AMethodName);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TJSONRPCHandlerManager.IndexOfHandlerDef(const AClassName,
|
function TJSONRPCHandlerManager.IndexOfHandlerDef(Const AClassName,
|
||||||
AMethodName: TJSONStringType): Integer;
|
AMethodName: TJSONStringType): Integer;
|
||||||
begin
|
begin
|
||||||
Result:=FHandlerDefs.IndexOfHandler(AClassName,AMethodName);
|
Result:=FHandlerDefs.IndexOfHandler(AClassName,AMethodName);
|
||||||
@ -1357,13 +1410,13 @@ begin
|
|||||||
Result:=FHandlerDefs.Count;
|
Result:=FHandlerDefs.Count;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
constructor TJSONRPCHandlerManager.Create(AOwner: TComponent);
|
Constructor TJSONRPCHandlerManager.Create(AOwner: TComponent);
|
||||||
begin
|
begin
|
||||||
inherited Create(AOwner);
|
inherited Create(AOwner);
|
||||||
FHandlerDefs:=TJSONRPCHandlerDefs.Create(TJSONRPCHandlerDef);
|
FHandlerDefs:=CreateDefs;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
destructor TJSONRPCHandlerManager.Destroy;
|
Destructor TJSONRPCHandlerManager.Destroy;
|
||||||
begin
|
begin
|
||||||
FreeAndNil(FHandlerDefs);
|
FreeAndNil(FHandlerDefs);
|
||||||
inherited Destroy;
|
inherited Destroy;
|
||||||
|
Loading…
Reference in New Issue
Block a user