lazarus/components/googleapis/demo/discovery/frmmain.pp

430 lines
9.8 KiB
ObjectPascal

unit frmmain;
{$mode objfpc}{$H+}
// Define this if you want to use synapse.
{ $DEFINE USESYNAPSE}
// For 2.6.4, synapse is currently the only option.
// You will need to add lazsynapsewebclient to the requires list.
{$IFDEF VER2_6}
{$DEFINE USESYNAPSE}
{$ENDIF}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
ComCtrls, ActnList, Menus, ListViewFilterEdit, restbase, googleclient,
googlediscovery, frmgenoptions, frmview;
type
{ TMainForm }
TMainForm = class(TForm)
APreViewRest: TAction;
AGenCode: TAction;
AViewHelp: TAction;
ASaveREST: TAction;
APreferredOnly: TAction;
AQuit: TAction;
AFetch: TAction;
ActionList1: TActionList;
EFilter: TEdit;
ILDiscovery: TImageList;
Label1: TLabel;
LVServices: TListView;
MainMenu1: TMainMenu;
MenuItem1: TMenuItem;
MenuItem2: TMenuItem;
MAPI: TMenuItem;
MenuItem3: TMenuItem;
MenuItem4: TMenuItem;
MenuItem5: TMenuItem;
MenuItem6: TMenuItem;
MIQuit: TMenuItem;
MIPreferredOnly: TMenuItem;
MServices: TMenuItem;
SDJSON: TSaveDialog;
SBDiscovery: TStatusBar;
ToolBar1: TToolBar;
ToolButton1: TToolButton;
ToolButton2: TToolButton;
ToolButton3: TToolButton;
ToolButton4: TToolButton;
ToolButton5: TToolButton;
ToolButton6: TToolButton;
procedure APreViewRestExecute(Sender: TObject);
procedure APreViewRestUpdate(Sender: TObject);
procedure ASaveRESTExecute(Sender: TObject);
procedure ASaveRESTUpdate(Sender: TObject);
procedure AGenCodeExecute(Sender: TObject);
procedure AGenCodeUpdate(Sender: TObject);
procedure AQuitExecute(Sender: TObject);
procedure AViewHelpExecute(Sender: TObject);
procedure AViewHelpUpdate(Sender: TObject);
procedure BFetchClick(Sender: TObject);
procedure CBPreferredOnlyChange(Sender: TObject);
procedure EFilterChange(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ private declarations }
FClient : TGoogleClient;
FDiscoveryAPI : TDiscoveryAPI;
FDirectory : TDirectoryList;
Function CurrentAPI : TDirectoryListTypeitemsItem;
procedure DoFetch;
procedure DownLoadRestAPI(Const AName,AURL: String);
procedure GenerateCode(const AName, AURL: String);
function HttpGetBinary(AURL: String; S: TStream): Boolean;
procedure ShowDiscovery(PreferredOnly: Boolean; FilterOn: String);
procedure UpdateCaption;
procedure ViewFile(AFileName: String);
procedure ViewFile(AStream: TStream; ASyntax: TSyntax; ACaption: String);
procedure ViewRestAPI(const AName, AURL: String);
public
{ public declarations }
end;
var
MainForm: TMainForm;
implementation
{$R *.lfm}
uses
ssl_openssl,
jsonparser, // needed
fpoauth2, lclintf,
{$IFDEF USESYNAPSE}
synapsewebclient,
httpsend,
{$ELSE}
fphttpclient,
fphttpwebclient,
{$ENDIF}
googlediscoverytopas;
{ TMainForm }
procedure TMainForm.FormCreate(Sender: TObject);
begin
// set up communication.
FClient:=TGoogleClient.Create(Self);
{$IFDEF USESYNAPSE}
FClient.WebClient:=TSynapseWebClient.Create(Self);
{$ELSE}
FClient.WebClient:=TFPHTTPWebClient.Create(Self);
{$ENDIF}
// Register all classes so they can be streamed.
TDiscoveryAPI.RegisterAPIResources;
// create the API and hook it up to the google client.
FDiscoveryAPI:=TDiscoveryAPI.Create(Self);
FDiscoveryAPI.GoogleClient:=FClient;
// The code generator uses it's own objects.
TDiscoveryJSONToPas.RegisterAllObjects;
UpdateCaption;
end;
procedure TMainForm.BFetchClick(Sender: TObject);
begin
DoFetch;
end;
procedure TMainForm.AQuitExecute(Sender: TObject);
begin
Close;
end;
procedure TMainForm.AViewHelpExecute(Sender: TObject);
begin
OpenURL(CurrentAPI.DocumentationLink);
end;
procedure TMainForm.AViewHelpUpdate(Sender: TObject);
begin
(Sender as TAction).Enabled:=Assigned(CurrentAPI) and (CurrentAPI.documentationLink<>'');
end;
procedure TMainForm.ASaveRESTUpdate(Sender: TObject);
begin
(Sender as TAction).Enabled:=Assigned(CurrentAPI) and (CurrentAPI.discoveryRestUrl<>'');
end;
procedure TMainForm.AGenCodeExecute(Sender: TObject);
Var
DLI : TDirectoryListTypeitemsItem;
begin
DLI:=CurrentAPI;
GenerateCode(DLI.Name,DLI.DiscoveryRestUrl);
end;
procedure TMainForm.AGenCodeUpdate(Sender: TObject);
begin
(Sender as TAction).Enabled:=Assigned(CurrentAPI) and (CurrentAPI.discoveryRestUrl<>'')
end;
procedure TMainForm.ViewFile(AFileName : String);
begin
With TViewForm.Create(Nil) do
begin
Caption:='Viewing file: '+AFileName;
FileName:=AFileName;
Show;
end;
end;
procedure TMainForm.ViewFile(AStream : TStream; ASyntax : TSyntax; ACaption : String);
begin
With TViewForm.Create(Nil) do
begin
AStream.POsition:=0;
Caption:='Viewing: '+ACaption;
Stream:=AStream;
Syntax:=ASyntax;
FreeStream:=True;
Show;
end;
end;
Function TMainForm.HttpGetBinary(AURL : String; S : TStream) : Boolean;
begin
{$IFDEF USESYNAPSE}
Result:=httpsend.HttpGetBinary(AURL,S);
{$ELSE}
try
TFPHTTPClient.SimpleGet(AURL,S);
S.Position:=0;
Result:=True;
except
Result:=False;
end;
{$ENDIF}
end;
procedure TMainForm.GenerateCode(const AName, AURL: String);
Var
S : TMemoryStream;
FO : TGenCodeFormOptions;
DP : TDiscoveryJSONToPas;
begin
FO:=Nil;
DP:=Nil;
S:=TMemoryStream.Create;
try
if HttpGetBinary(AURL,S) then
begin
S.Position:=0;
FO:=TGenCodeFormOptions.Create(Self);
FO.UnitName:=AName;
If FO.ShowModal=mrOK then
begin
DP:=TDiscoveryJSONToPas.Create(Self);
DP.LoadFromStream(S);
DP.BaseClassName:=FO.BaseClass;
DP.OutputUnitName:=FO.UnitName;
DP.ExtraUnits:=FO.ExtraUnits;
DP.ClassPrefix:=FO.Prefix;
DP.SaveToFile(FO.FileName);
if FO.DoPreview then
ViewFile(FO.FileName);
end;
end;
Finally
FO.Free;
DP.Free;
S.Free;
end;
end;
procedure TMainForm.DownLoadRestAPI(const AName, AURL: String);
Var
S : TMemoryStream;
begin
S:=TMemoryStream.Create;
try
if HttpGetBinary(AURL,S) then
begin
SDJSON.FileName:='google'+aname+'.json';
If SDJSON.Execute then
With TFileStream.Create(SDJSON.FileName,fmCreate) do
try
CopyFrom(S,0);
finally
Free;
end;
end;
finally
S.Free;
end;
end;
procedure TMainForm.ViewRestAPI(const AName, AURL: String);
Var
S : TMemoryStream;
begin
S:=TMemoryStream.Create;
try
if HttpGetBinary(AURL,S) then
begin
ViewFile(S,sJSON,'REST discovery for '+AName);
S:=Nil;
end;
finally
S.Free;
end;
end;
procedure TMainForm.ASaveRESTExecute(Sender: TObject);
Var
DLI : TDirectoryListTypeitemsItem;
begin
DLI:=CurrentAPI;
DownLoadRestAPI(DLI.Name,DLI.DiscoveryRestUrl);
end;
procedure TMainForm.APreViewRestUpdate(Sender: TObject);
begin
(Sender as TAction).Enabled:=Assigned(CurrentAPI) and (CurrentAPI.discoveryRestUrl<>'');
end;
procedure TMainForm.APreViewRestExecute(Sender: TObject);
Var
DLI : TDirectoryListTypeitemsItem;
begin
DLI:=CurrentAPI;
ViewRestAPI(DLI.Name,DLI.DiscoveryRestUrl);
end;
procedure TMainForm.CBPreferredOnlyChange(Sender: TObject);
begin
if (LVServices.Items.Count>0) then
ShowDiscovery(MIPreferredOnly.Checked,EFilter.Text);
end;
procedure TMainForm.EFilterChange(Sender: TObject);
begin
if (LVServices.Items.Count>0) then
ShowDiscovery(MIPreferredOnly.Checked,EFilter.Text);
end;
procedure TMainForm.UpdateCaption;
Var
C : Integer;
begin
C:=LVServices.Items.Count;
if (C=0) then
Caption:='Google Discovery Service Demo'
else
Caption:=Format('Google Discovery Service Demo (%d services)',[C]);
SBDiscovery.Panels[0].Text:=Format('%d items',[C]);
end;
function TMainForm.CurrentAPI: TDirectoryListTypeitemsItem;
begin
If Assigned(LVServices.Selected) and Assigned(LVServices.Selected.Data) then
Result:=TDirectoryListTypeitemsItem(LVServices.Selected.Data)
else
Result:=Nil;
end;
procedure TMainForm.ShowDiscovery(PreferredOnly : Boolean; FilterOn : String);
Function DoComma(S : TStringArray) : String;
Var
I : String;
begin
Result:='';
For I in S do
begin
if Result<>'' then
Result:=Result+',';
Result:=Result+I;
end;
end;
Function Contains(S: String) : Boolean; inline;
begin
Result:=Pos(FilterOn,LowerCase(S))<>0;
end;
Function ShowItem (DLI : TDirectoryListTypeitemsItem) : Boolean;
begin
Result:=DLI.Preferred or (Not PreferredOnly);
if Result and (FilterOn<>'') then
begin
Result:=Contains(DLI.Name)
or Contains(DLI.Title)
or Contains(DLI.kind)
or Contains(DLI.description)
or Contains(DoComma(DLI.Labels));
end;
end;
Var
DLI : TDirectoryListTypeitemsItem;
LI : TListItem;
begin
FilterOn:=LowerCase(Filteron);
LVServices.Items.BeginUpdate;
try
LVServices.Items.Clear;
LVServices.Column[1].Visible:=Not PreferredOnly;
For DLI in FDirectory.Items do
if ShowItem(DLI) then
begin
LI:=LVServices.Items.Add;
LI.Caption:=DLI.name;
LI.Data:=DLI;
With LI.SubItems,DLI do
begin
Add(BoolToStr(preferred,'True','False'));
Add(id);
Add(title);
Add(version);
Add(description);
Add(discoveryLink);
Add(discoveryRestUrl);
Add(documentationLink);
Add(icons.x16);
Add(icons.x32);
Add(DoComma(labels));
end;
end;
UpdateCaption;
finally
LVServices.Items.EndUpdate;
end;
end;
procedure TMainForm.DoFetch;
begin
// Free any previous list.
FreeAndNil(FDirectory);
// Get the new list using a default ApisResource.
FDirectory:=FDiscoveryAPI.ApisResource.List();
ShowDiscovery(MIPreferredOnly.Checked,EFilter.Text);
end;
end.