Przeglądaj źródła

* Create API description as Pascal

Michaël Van Canneyt 3 lat temu
rodzic
commit
ebd7bb7cb9

+ 25 - 3
packages/fcl-web/src/jsonrpc/fpjsonrpc.pp

@@ -272,6 +272,7 @@ Type
     Function CreateAPI(aOptions : TCreateAPIOptions): TJSONObject; overload;
     Function CreateAPI : TJSONObject; overload;
     // Return API Description including namespace, as a string. If options are not specified, APICreator.DefaultOptions is used.
+    Function APIAsPascal(aOptions : TCreateAPIOptions; aUnitName : string) : String; virtual;
     Function APIAsString(aOptions : TCreateAPIOptions) : TJSONStringType; virtual;
     Function APIAsString : TJSONStringType; virtual;
     Property APICreator : TAPIDescriptionCreator Read FAPICreator Write  SetAPICreator;
@@ -481,9 +482,8 @@ resourcestring
 
 implementation
 
-{$IFDEF WMDEBUG}
-uses dbugintf;
-{$ENDIF}
+
+uses {$IFDEF WMDEBUG}dbugintf, {$ENDIF} fprpccodegen;
 
 function CreateJSONErrorObject(const AMessage: String; const ACode: Integer
   ): TJSONObject;
@@ -1440,6 +1440,28 @@ begin
   Result:=CreateAPI(APICreator.DefaultOptions);
 end;
 
+function TCustomJSONRPCDispatcher.APIAsPascal(aOptions: TCreateAPIOptions; aUnitName: string): String;
+
+Var
+  J : TJSONObject;
+  Gen : TAPIClientCodeGen;
+
+begin
+  J:=APICreator.CreateAPI(aOptions);
+  try
+    Gen:=TAPIClientCodeGen.Create(Self);
+    if aUnitName='' then
+      aUnitName:='services';
+    Gen.OutputUnitName:=aUnitName;
+    Gen.API:=J;
+    Gen.Execute;
+    Result:=Gen.Source.Text;
+  finally
+    Gen.Free;
+    J.Free;
+  end;
+end;
+
 function TCustomJSONRPCDispatcher.APIAsString(aOptions: TCreateAPIOptions): TJSONStringType;
 
 Var

+ 34 - 8
packages/fcl-web/src/jsonrpc/webjsonrpc.pp

@@ -296,26 +296,52 @@ end;
 
 Function TCustomJSONRPCModule.GetAPI(aDisp : TCustomJSONRPCDispatcher; ARequest: TRequest) : TJSONStringType;
 
+  Function GetV(Name1,Name2 : String) : string;
+
+  begin
+    Result:=aRequest.QueryFields.Values[Name1];
+    if (Result='') and (Name2<>'') then
+      Result:=aRequest.QueryFields.Values[Name2];
+  end;
+
+
 var
-  B : Boolean;
+  B,asPascal : Boolean;
   APIOptions : TCreateAPIOptions;
+  aUnit,Fmt : string;
 
 begin
   B:=False;
   APIOptions:=[];
-  if (aRequest.QueryFields.Values['extended']<>'') or (aRequest.QueryFields.Values['full']<>'') then
+  Fmt:=GetV('format','fmt');
+  asPascal:=(Fmt='pas') or (fmt='pascal');
+  if asPascal then
     begin
-    Include(APIOptions,caoFullParams);
+    APIOptions:=[caoFullParams];
+    aUnit:=GetV('unit','unitname');
     B:=true;
-    end;
-  if (aRequest.QueryFields.Values['formatted']<>'') or (aRequest.QueryFields.Values['humanreadable']<>'') then
+    end
+  else
     begin
-    Include(APIOptions,caoFormatted);
-    B:=true;
+    Fmt:=GetV('extended','full');
+    if (Fmt<>'') then
+      begin
+      Include(APIOptions,caoFullParams);
+      B:=true;
+      end;
+    Fmt:=GetV('formatted','humanreadable');
+    if (Fmt<>'') then
+      begin
+      Include(APIOptions,caoFormatted);
+      B:=true;
+      end;
     end;
   if Not B then
     APIOptions:=aDisp.APICreator.DefaultOptions;
-  Result:=aDisp.APIAsString(APIOptions);
+  if asPascal then
+    Result:=aDisp.APIAsPascal(APIOptions,aUnit)
+  else
+    Result:=aDisp.APIAsString(APIOptions);
 end;
 
 procedure TCustomJSONRPCModule.HandleRequest(ARequest: TRequest; AResponse: TResponse);