unit frmmain; {$mode objfpc}{$H+} // Define USESYNAPSE if you want to force use of synapse { $DEFINE USESYNAPSE} // For version 2.6.4, synapse is the only option. {$IFDEF VER2_6} {$DEFINE USESYNAPSE} {$ENDIF} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, synautil, IniFiles, googlebase, googleservice, googleclient, googlecalendar; type { TMainForm } TAccessTokenState = (acsWaiting,acsOK,acsCancel); TMainForm = class(TForm) BCancel: TButton; BSetAccess: TButton; BFetchCalendars: TButton; BFetchEvents: TButton; EAccessCode: TEdit; GBAccess: TGroupBox; LEvents: TLabel; LEAccess: TLabel; LBCalendars: TListBox; LBEvents: TListBox; procedure BCancelClick(Sender: TObject); procedure BFetchEventsClick(Sender: TObject); procedure BSetAccessClick(Sender: TObject); procedure BFetchCalendarsClick(Sender: TObject); Procedure DoUserConsent(Const AURL : String; Out AAuthCode : String) ; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure LBCalendarsSelectionChange(Sender: TObject; User: boolean); private { private declarations } FAccessState : TAccessTokenState; FClient : TGoogleClient; FCalendarAPI: TCalendarAPI; calendarList: TCalendarList; FCurrentCalendar : TCalendarListEntry; events : TEvents; procedure LoadAuthConfig; procedure SaveRefreshToken; public { public declarations } end; var MainForm: TMainForm; implementation uses {$ifdef windows}windows,{$endif} jsonparser, // needed fpoauth2, lclintf, {$IFDEF USESYNAPSE} ssl_openssl, synapsewebclient {$ELSE} fphttpwebclient {$ENDIF} ; {$R *.lfm} { TMainForm } procedure TMainForm.FormCreate(Sender: TObject); begin // Register calendar resources. TCalendarAPI.RegisterAPIResources; // Set up google client. FClient:=TGoogleClient.Create(Self); {$IFDEF USESYNAPSE} FClient.WebClient:=TSynapseWebClient.Create(Self); {$ELSE} FClient.WebClient:=TFPHTTPWebClient.Create(Self); {$ENDIF} FClient.WebClient.RequestSigner:=FClient.AuthHandler; FClient.WebClient.LogFile:='requests.log'; FClient.AuthHandler.WebClient:=FClient.WebClient; FClient.AuthHandler.Config.AccessType:=atOffLine; // We want to enter a code. FClient.OnUserConsent:=@DoUserConsent; // Create a calendar API and connect it to the client. FCalendarAPI:=TCalendarAPI.Create(Self); FCalendarAPI.GoogleClient:=FClient; // Load configuration LoadAuthConfig; end; procedure TMainForm.FormDestroy(Sender: TObject); begin FreeAndNil(CalendarList); FreeAndNil(Events); end; procedure TMainForm.LBCalendarsSelectionChange(Sender: TObject; User: boolean); begin BFetchEvents.Enabled:=User and (LBCalendars.ItemIndex<>-1); if BFetchEvents.Enabled then begin FCurrentCalendar:=LBCalendars.Items.Objects[LBCalendars.ItemIndex] as TCalendarListEntry; if (FCurrentCalendar.Summary<>'') then LEvents.Caption:='Events for calendar : '+FCurrentCalendar.Summary else LEvents.Caption:='Events for calendar : '+FCurrentCalendar.ID; end else begin LEvents.Caption:='Events for calendar :