├── Etc ├── VDEtc.res ├── VDEtc.dpk ├── pVDEtc.pas └── VDEtc.dproj ├── GAuthenticator.res ├── Gaphics ├── Google.bmp ├── Logger.bmp └── TVDEtc.bmp ├── Logger ├── VDLogger.res ├── VDLogger.dpk ├── fmVDLogger.pas ├── pVDLogger.pas └── VDLogger.dproj ├── AuthTest ├── AuthTest.res ├── AuthTest.dpr ├── fmAuthTest.pas └── fmAuthTest.dfm ├── GoogleOAuth2Authenticator.res ├── QAuthenticator ├── QAuthenticator.res ├── QAuthenticator.dpk ├── pQOAuth2Authenticator.pas └── QAuthenticator.dproj ├── AuthenticatorDesign.pas ├── Common └── pCons.pas ├── pOA2Cons.pas ├── GoogleOAuth2Authenticator.dpk ├── GAuthenticator.dpk ├── LICENSE ├── README.md ├── .GITIGNORE ├── GoogleOAuth2Authenticator.groupproj └── OAuth2AuthenticatorGoogle.pas /Etc/VDEtc.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pasquina/GoogleOAuth2Authenticator/HEAD/Etc/VDEtc.res -------------------------------------------------------------------------------- /GAuthenticator.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pasquina/GoogleOAuth2Authenticator/HEAD/GAuthenticator.res -------------------------------------------------------------------------------- /Gaphics/Google.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pasquina/GoogleOAuth2Authenticator/HEAD/Gaphics/Google.bmp -------------------------------------------------------------------------------- /Gaphics/Logger.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pasquina/GoogleOAuth2Authenticator/HEAD/Gaphics/Logger.bmp -------------------------------------------------------------------------------- /Gaphics/TVDEtc.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pasquina/GoogleOAuth2Authenticator/HEAD/Gaphics/TVDEtc.bmp -------------------------------------------------------------------------------- /Logger/VDLogger.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pasquina/GoogleOAuth2Authenticator/HEAD/Logger/VDLogger.res -------------------------------------------------------------------------------- /AuthTest/AuthTest.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pasquina/GoogleOAuth2Authenticator/HEAD/AuthTest/AuthTest.res -------------------------------------------------------------------------------- /GoogleOAuth2Authenticator.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pasquina/GoogleOAuth2Authenticator/HEAD/GoogleOAuth2Authenticator.res -------------------------------------------------------------------------------- /QAuthenticator/QAuthenticator.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pasquina/GoogleOAuth2Authenticator/HEAD/QAuthenticator/QAuthenticator.res -------------------------------------------------------------------------------- /AuthTest/AuthTest.dpr: -------------------------------------------------------------------------------- 1 | program AuthTest; 2 | 3 | uses 4 | Vcl.Forms, 5 | fmAuthTest in 'fmAuthTest.pas' {fAuthTest}; 6 | 7 | {$R *.res} 8 | 9 | begin 10 | {$IFDEF DEBUG} 11 | ReportMemoryLeaksOnShutdown := True; 12 | {$ENDIF} 13 | 14 | Application.Initialize; 15 | Application.MainFormOnTaskbar := True; 16 | Application.CreateForm(TfAuthTest, fAuthTest); 17 | Application.Run; 18 | end. 19 | -------------------------------------------------------------------------------- /AuthenticatorDesign.pas: -------------------------------------------------------------------------------- 1 | unit AuthenticatorDesign; 2 | 3 | interface 4 | 5 | procedure Register; 6 | 7 | implementation 8 | 9 | uses OAuth2AuthenticatorGoogle, pVDEtc, pVDLogger, System.Classes; 10 | 11 | procedure Register; 12 | begin 13 | RegisterComponents('REST Client', [TOAuth2AuthenticatorGoogle, 14 | TVDEtc, 15 | TVDLogger]); 16 | end; 17 | 18 | end. 19 | -------------------------------------------------------------------------------- /Common/pCons.pas: -------------------------------------------------------------------------------- 1 | unit pCons; 2 | 3 | interface 4 | 5 | const 6 | 7 | { General constants used by most OAuth2 architectural styles for various purposes. } 8 | 9 | ExCode = 'code'; 10 | ExClientID = 'client_id'; 11 | ExClientSecret = 'client_secret'; 12 | ExRedirectURI = 'redirect_uri'; 13 | ExGrantType = 'grant_type'; 14 | ExAuthorizationCode = 'authorization_code'; 15 | 16 | ExAccessToken = 'access_token'; 17 | ExRefreshToken = 'refresh_token'; 18 | ExExpiresIn = 'expires_in'; 19 | 20 | implementation 21 | 22 | end. 23 | -------------------------------------------------------------------------------- /pOA2Cons.pas: -------------------------------------------------------------------------------- 1 | unit pOA2Cons; 2 | 3 | interface 4 | 5 | const 6 | 7 | { From https://accounts.google.com/.well-known/openid-configuration and 8 | https://developers.google.com/identity/protocols/OAuth2InstalledApp } 9 | 10 | ExBaseURL = 'https://www.googleapis.com'; 11 | ExRequestResource = 'oauth2/v4/token'; 12 | ExCode = 'code'; 13 | ExClientID = 'client_id'; 14 | ExClientSecret = 'client_secret'; 15 | ExRedirectURI = 'redirect_uri'; 16 | ExGrantType = 'grant_type'; 17 | ExAuthorizationCode = 'authorization_code'; 18 | 19 | ExAccessToken = 'access_token'; 20 | ExRefreshToken = 'refresh_token'; 21 | ExExpiresIn = 'expires_in'; 22 | 23 | implementation 24 | 25 | end. 26 | -------------------------------------------------------------------------------- /Etc/VDEtc.dpk: -------------------------------------------------------------------------------- 1 | package VDEtc; 2 | 3 | {$R *.res} 4 | {$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} 5 | {$ALIGN 8} 6 | {$ASSERTIONS ON} 7 | {$BOOLEVAL OFF} 8 | {$DEBUGINFO OFF} 9 | {$EXTENDEDSYNTAX ON} 10 | {$IMPORTEDDATA ON} 11 | {$IOCHECKS ON} 12 | {$LOCALSYMBOLS OFF} 13 | {$LONGSTRINGS ON} 14 | {$OPENSTRINGS ON} 15 | {$OPTIMIZATION ON} 16 | {$OVERFLOWCHECKS OFF} 17 | {$RANGECHECKS OFF} 18 | {$REFERENCEINFO OFF} 19 | {$SAFEDIVIDE OFF} 20 | {$STACKFRAMES OFF} 21 | {$TYPEDADDRESS OFF} 22 | {$VARSTRINGCHECKS ON} 23 | {$WRITEABLECONST OFF} 24 | {$MINENUMSIZE 1} 25 | {$IMAGEBASE $400000} 26 | {$DEFINE RELEASE} 27 | {$ENDIF IMPLICITBUILDING} 28 | {$DESCRIPTION 'Program Constants Used By Several Other Components'} 29 | {$LIBSUFFIX AUTO} 30 | {$RUNONLY} 31 | {$IMPLICITBUILD OFF} 32 | 33 | requires 34 | rtl; 35 | 36 | contains 37 | pVDEtc in 'pVDEtc.pas'; 38 | 39 | end. 40 | -------------------------------------------------------------------------------- /Logger/VDLogger.dpk: -------------------------------------------------------------------------------- 1 | package VDLogger; 2 | 3 | {$R *.res} 4 | {$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} 5 | {$ALIGN 8} 6 | {$ASSERTIONS ON} 7 | {$BOOLEVAL OFF} 8 | {$DEBUGINFO OFF} 9 | {$EXTENDEDSYNTAX ON} 10 | {$IMPORTEDDATA ON} 11 | {$IOCHECKS ON} 12 | {$LOCALSYMBOLS ON} 13 | {$LONGSTRINGS ON} 14 | {$OPENSTRINGS ON} 15 | {$OPTIMIZATION OFF} 16 | {$OVERFLOWCHECKS OFF} 17 | {$RANGECHECKS OFF} 18 | {$REFERENCEINFO ON} 19 | {$SAFEDIVIDE OFF} 20 | {$STACKFRAMES ON} 21 | {$TYPEDADDRESS OFF} 22 | {$VARSTRINGCHECKS ON} 23 | {$WRITEABLECONST OFF} 24 | {$MINENUMSIZE 1} 25 | {$IMAGEBASE $400000} 26 | {$DEFINE DEBUG} 27 | {$ENDIF IMPLICITBUILDING} 28 | {$DESCRIPTION 'General Purpose Logging Routines'} 29 | {$LIBSUFFIX AUTO} 30 | {$RUNONLY} 31 | {$IMPLICITBUILD OFF} 32 | 33 | requires 34 | rtl, 35 | vcl; 36 | 37 | contains 38 | pVDLogger in 'pVDLogger.pas', 39 | pVDEtc in '..\Etc\pVDEtc.pas', 40 | fmVDLogger in 'fmVDLogger.pas'; 41 | 42 | end. 43 | -------------------------------------------------------------------------------- /QAuthenticator/QAuthenticator.dpk: -------------------------------------------------------------------------------- 1 | package QAuthenticator; 2 | 3 | {$R *.res} 4 | {$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} 5 | {$ALIGN 8} 6 | {$ASSERTIONS ON} 7 | {$BOOLEVAL OFF} 8 | {$DEBUGINFO OFF} 9 | {$EXTENDEDSYNTAX ON} 10 | {$IMPORTEDDATA ON} 11 | {$IOCHECKS ON} 12 | {$LOCALSYMBOLS ON} 13 | {$LONGSTRINGS ON} 14 | {$OPENSTRINGS ON} 15 | {$OPTIMIZATION OFF} 16 | {$OVERFLOWCHECKS OFF} 17 | {$RANGECHECKS OFF} 18 | {$REFERENCEINFO ON} 19 | {$SAFEDIVIDE OFF} 20 | {$STACKFRAMES ON} 21 | {$TYPEDADDRESS OFF} 22 | {$VARSTRINGCHECKS ON} 23 | {$WRITEABLECONST OFF} 24 | {$MINENUMSIZE 1} 25 | {$IMAGEBASE $400000} 26 | {$DEFINE DEBUG} 27 | {$ENDIF IMPLICITBUILDING} 28 | {$DESCRIPTION 'Quickbooks Authenticator for REST Request/Client'} 29 | {$LIBSUFFIX AUTO} 30 | {$RUNONLY} 31 | {$IMPLICITBUILD OFF} 32 | 33 | requires 34 | rtl; 35 | 36 | contains 37 | pQOAuth2Authenticator in 'pQOAuth2Authenticator.pas', 38 | pCons in '..\Common\pCons.pas'; 39 | 40 | end. 41 | -------------------------------------------------------------------------------- /GoogleOAuth2Authenticator.dpk: -------------------------------------------------------------------------------- 1 | package GoogleOAuth2Authenticator; 2 | 3 | {$R *.res} 4 | {$R *.dres} 5 | {$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} 6 | {$ALIGN 8} 7 | {$ASSERTIONS ON} 8 | {$BOOLEVAL OFF} 9 | {$DEBUGINFO OFF} 10 | {$EXTENDEDSYNTAX ON} 11 | {$IMPORTEDDATA ON} 12 | {$IOCHECKS ON} 13 | {$LOCALSYMBOLS OFF} 14 | {$LONGSTRINGS ON} 15 | {$OPENSTRINGS ON} 16 | {$OPTIMIZATION ON} 17 | {$OVERFLOWCHECKS OFF} 18 | {$RANGECHECKS OFF} 19 | {$REFERENCEINFO OFF} 20 | {$SAFEDIVIDE OFF} 21 | {$STACKFRAMES OFF} 22 | {$TYPEDADDRESS OFF} 23 | {$VARSTRINGCHECKS ON} 24 | {$WRITEABLECONST OFF} 25 | {$MINENUMSIZE 1} 26 | {$IMAGEBASE $400000} 27 | {$DEFINE RELEASE} 28 | {$ENDIF IMPLICITBUILDING} 29 | {$DESCRIPTION 'OAuth2Authenicator for Google'} 30 | {$LIBPREFIX 'dcl'} 31 | {$LIBSUFFIX AUTO} 32 | {$DESIGNONLY} 33 | {$IMPLICITBUILD OFF} 34 | 35 | requires 36 | rtl, 37 | vcl, 38 | vclie, 39 | CustomIPTransport, 40 | bindengine, 41 | bindcomp, 42 | VCLRESTComponents, 43 | RESTComponents; 44 | 45 | contains 46 | AuthenticatorDesign in 'AuthenticatorDesign.pas'; 47 | 48 | end. 49 | -------------------------------------------------------------------------------- /GAuthenticator.dpk: -------------------------------------------------------------------------------- 1 | package GAuthenticator; 2 | 3 | {$R *.res} 4 | {$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} 5 | {$ALIGN 8} 6 | {$ASSERTIONS ON} 7 | {$BOOLEVAL OFF} 8 | {$DEBUGINFO OFF} 9 | {$EXTENDEDSYNTAX ON} 10 | {$IMPORTEDDATA ON} 11 | {$IOCHECKS ON} 12 | {$LOCALSYMBOLS OFF} 13 | {$LONGSTRINGS ON} 14 | {$OPENSTRINGS ON} 15 | {$OPTIMIZATION ON} 16 | {$OVERFLOWCHECKS OFF} 17 | {$RANGECHECKS OFF} 18 | {$REFERENCEINFO OFF} 19 | {$SAFEDIVIDE OFF} 20 | {$STACKFRAMES OFF} 21 | {$TYPEDADDRESS OFF} 22 | {$VARSTRINGCHECKS ON} 23 | {$WRITEABLECONST OFF} 24 | {$MINENUMSIZE 1} 25 | {$IMAGEBASE $400000} 26 | {$DEFINE RELEASE} 27 | {$ENDIF IMPLICITBUILDING} 28 | {$DESCRIPTION 'Extensions to OAuth2Authenticator to support unique Google requirements.'} 29 | {$LIBSUFFIX AUTO} 30 | {$RUNONLY} 31 | {$IMPLICITBUILD OFF} 32 | 33 | requires 34 | rtl, 35 | bindcomp, 36 | dbrtl, 37 | bindengine, 38 | RESTComponents, 39 | CustomIPTransport, 40 | vcl, 41 | vclie, 42 | VCLRESTComponents; 43 | 44 | contains 45 | pOA2Cons in 'pOA2Cons.pas', 46 | OAuth2AuthenticatorGoogle in 'OAuth2AuthenticatorGoogle.pas'; 47 | 48 | end. 49 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Milan Vydareny 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # GoogleOAuth2Authenticator 2 | ## Delphi OAuth2 Authenticator Component 3 | 4 | This component is descended from the TOAuth2Authenticator provided by Embarcadero. It makes extenstion to the Embarcadero component that support the Google implementation of OAuth2. 5 | 6 | ## Caveats 7 | 8 | * The code provided has been tested for Windows VCL 32-bit and VCL 64-bit. 9 | * Because the code uses a TBrowser component, additional development is required to also support FireMonkey and (if possible) Unix. 10 | 11 | ## Usage 12 | 13 | * Install the component in the customary manner you use for your own custom component development. 14 | * Drop the component on a form in place of the customary OAUTH2Authenticator provided by Embarcadero. 15 | * Make sure the TRESTClient you are using is connected to the OAUTH2AuthenticatorGoogle component. 16 | * Provide the component with the appropriate URLs, URIs, Client ID, Client Secret, etc. 17 | * When you make a REST request, Google OAuth2 Authentication will take place if no Access Code is detected. No special handling of authentication is required other than the use and property settings in this component. 18 | -------------------------------------------------------------------------------- /Etc/pVDEtc.pas: -------------------------------------------------------------------------------- 1 | unit pVDEtc; 2 | 3 | interface 4 | 5 | uses 6 | System.Classes; 7 | 8 | Type 9 | TAppIDValues = record 10 | Vendor: String; 11 | App: String; 12 | LogFile: String; 13 | end; 14 | 15 | [ComponentPlatformsAttribute(pidWin32 or pidWin64)] 16 | TVDEtc = class(TComponent) 17 | private 18 | FVendor: String; 19 | FApp: String; 20 | FLogFile: String; 21 | procedure SetVendor(const Value: String); 22 | procedure SetApp(const Value: String); 23 | procedure SetLogFile(const Value: String); 24 | private const 25 | RAppIDValues: TAppIDValues = (Vendor: 'VyDevSoft'; App: 'QBTools'; LogFile: 'QBCube.log'); 26 | protected 27 | public 28 | constructor Create(AOwner: TComponent); override; 29 | published 30 | property Vendor: String read FVendor write SetVendor; 31 | property App: String read FApp write SetApp; 32 | property LogFile: String read FLogFile write SetLogFile; 33 | end; 34 | 35 | implementation 36 | 37 | { TEtc } 38 | 39 | constructor TVDEtc.Create(AOwner: TComponent); 40 | begin 41 | inherited; 42 | Vendor := RAppIDValues.Vendor; 43 | App := RAppIDValues.App; 44 | LogFile := RAppIDValues.LogFile; 45 | end; 46 | 47 | procedure TVDEtc.SetApp(const Value: String); 48 | begin 49 | FApp := Value; 50 | end; 51 | 52 | procedure TVDEtc.SetLogFile(const Value: String); 53 | begin 54 | FLogFile := Value; 55 | end; 56 | 57 | procedure TVDEtc.SetVendor(const Value: String); 58 | begin 59 | FVendor := Value; 60 | end; 61 | 62 | end. 63 | -------------------------------------------------------------------------------- /.GITIGNORE: -------------------------------------------------------------------------------- 1 | # Uncomment these types if you want even more clean repository. But be careful. 2 | # It can make harm to an existing project source. Read explanations below. 3 | # 4 | # Resource files are binaries containing manifest, project icon and version info. 5 | # They can not be viewed as text or compared by diff-tools. Consider replacing them with .rc files. 6 | #*.res 7 | # 8 | # Type library file (binary). In old Delphi versions it should be stored. 9 | # Since Delphi 2009 it is produced from .ridl file and can safely be ignored. 10 | #*.tlb 11 | # 12 | # Diagram Portfolio file. Used by the diagram editor up to Delphi 7. 13 | # Uncomment this if you are not using diagrams or use newer Delphi version. 14 | #*.ddp 15 | # 16 | # Visual LiveBindings file. Added in Delphi XE2. 17 | # Uncomment this if you are not using LiveBindings Designer. 18 | #*.vlb 19 | # 20 | # Deployment Manager configuration file for your project. Added in Delphi XE2. 21 | # Uncomment this if it is not mobile development and you do not use remote debug feature. 22 | #*.deployproj 23 | # 24 | # C++ object files produced when C/C++ Output file generation is configured. 25 | # Uncomment this if you are not using external objects (zlib library for example). 26 | #*.obj 27 | # 28 | 29 | # Delphi compiler-generated binaries (safe to delete) 30 | *.exe 31 | *.dll 32 | *.bpl 33 | *.bpi 34 | *.dcp 35 | *.so 36 | *.apk 37 | *.drc 38 | *.map 39 | *.dres 40 | *.rsm 41 | *.tds 42 | *.dcu 43 | *.lib 44 | *.a 45 | *.o 46 | *.ocx 47 | 48 | # Delphi autogenerated files (duplicated info) 49 | *.cfg 50 | *.hpp 51 | *Resource.rc 52 | 53 | # Delphi local files (user-specific info) 54 | *.local 55 | *.identcache 56 | *.projdata 57 | *.tvsconfig 58 | *.dsk 59 | 60 | # Delphi history and backups 61 | __history/ 62 | __recovery/ 63 | *.~* 64 | 65 | # Castalia statistics file (since XE7 Castalia is distributed with Delphi) 66 | *.stat 67 | -------------------------------------------------------------------------------- /AuthTest/fmAuthTest.pas: -------------------------------------------------------------------------------- 1 | unit fmAuthTest; 2 | 3 | interface 4 | 5 | uses 6 | Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 7 | Vcl.Controls, Vcl.Forms, Vcl.Dialogs, pVDLogger, pVDEtc, Vcl.StdCtrls, 8 | System.Actions, Vcl.ActnList, Vcl.PlatformDefaultStyleActnCtrls, Vcl.ActnMan, 9 | Vcl.CategoryButtons, Vcl.ExtCtrls, Vcl.WinXPanels, Vcl.ComCtrls, System.UITypes; 10 | 11 | type 12 | TfAuthTest = class(TForm) 13 | etcMain: TVDEtc; 14 | logMain: TVDLogger; 15 | cbMain: TCategoryButtons; 16 | amMain: TActionManager; 17 | aShowLogFileName: TAction; 18 | aShowLogFilePath: TAction; 19 | aAddLines: TAction; 20 | spMain: TStackPanel; 21 | Label1: TLabel; 22 | eFirstLine: TEdit; 23 | Label2: TLabel; 24 | eSecondLine: TEdit; 25 | Label3: TLabel; 26 | meAddLines: TMemo; 27 | aAddStringList: TAction; 28 | aDisplayLogfile: TAction; 29 | StatusBar1: TStatusBar; 30 | aCycleLogFile: TAction; 31 | procedure aShowLogFileNameExecute(Sender: TObject); 32 | procedure aShowLogFilePathExecute(Sender: TObject); 33 | procedure aAddLinesExecute(Sender: TObject); 34 | procedure aAddStringListExecute(Sender: TObject); 35 | procedure aDisplayLogfileExecute(Sender: TObject); 36 | procedure aCycleLogFileExecute(Sender: TObject); 37 | private 38 | { Private declarations } 39 | public 40 | { Public declarations } 41 | end; 42 | 43 | var 44 | fAuthTest: TfAuthTest; 45 | 46 | implementation 47 | 48 | {$R *.dfm} 49 | 50 | procedure TfAuthTest.aAddLinesExecute(Sender: TObject); 51 | begin 52 | logMain.LogLine(TLogSource.lsUtility, [eFirstLine.Text, eSecondLine.Text]); 53 | end; 54 | 55 | procedure TfAuthTest.aAddStringListExecute(Sender: TObject); 56 | begin 57 | logMain.LogStrings(TLogSource.lsUtility, meAddLines.Lines); 58 | end; 59 | 60 | procedure TfAuthTest.aCycleLogFileExecute(Sender: TObject); 61 | begin 62 | if logMain.CycleLogfile then 63 | ShowMessage('Logfile Cycle Successful') 64 | else 65 | ShowMessage('Logfile Cycle Failed'); 66 | end; 67 | 68 | procedure TfAuthTest.aDisplayLogfileExecute(Sender: TObject); 69 | begin 70 | logMain.ShowLog; 71 | end; 72 | 73 | procedure TfAuthTest.aShowLogFileNameExecute(Sender: TObject); 74 | begin 75 | MessageDlg(logMain.GetLogFileName, mtInformation, [mbOK], 0); 76 | end; 77 | 78 | procedure TfAuthTest.aShowLogFilePathExecute(Sender: TObject); 79 | begin 80 | MessageDlg(logMain.GetLogFilePath, mtInformation, [mbOK], 0); 81 | end; 82 | 83 | end. 84 | -------------------------------------------------------------------------------- /Logger/fmVDLogger.pas: -------------------------------------------------------------------------------- 1 | unit fmVDLogger; 2 | 3 | interface 4 | 5 | uses VCL.Forms, System.Classes, System.SysUtils, VCL.ComCtrls, VCL.StdCtrls, VCL.Controls; 6 | 7 | type 8 | tgLogger = Class(TCustomForm) 9 | private 10 | FStatusBar: TStatusBar; 11 | FMemo: TMemo; 12 | procedure SetStatusBar(const Value: TStatusBar); 13 | procedure SetMemo(const Value: TMemo); 14 | property Memo: TMemo read FMemo write SetMemo; 15 | property StatusBar: TStatusBar read FStatusBar write SetStatusBar; 16 | procedure OnCloseEvent(Sender: TObject; var Action: TCloseAction); 17 | protected 18 | public 19 | class function CreateLog(AOwner: TComponent; ALogFileName: TFileName): tgLogger; 20 | End; 21 | 22 | implementation 23 | 24 | uses 25 | System.Types, Winapi.Windows; 26 | 27 | { tgLogger } 28 | 29 | class function tgLogger.CreateLog(AOwner: TComponent; ALogFileName: TFileName): tgLogger; 30 | var 31 | LScreen: TRect; 32 | LLogger: tgLogger; 33 | LLogFile: TFileStream; // Log File Access 34 | begin 35 | LLogger := tgLogger.CreateNew(AOwner); // create the form without .dfm 36 | 37 | { Establish all components at run time } 38 | 39 | with LLogger do 40 | begin 41 | // SystemParametersInfo(SPI_GETWORKAREA, 0, @LScreen, 0); 42 | OnClose := OnCloseEvent; // set the on close event 43 | SetBounds(30, 30, 700, 700); // X, Y, Width, Height 44 | Caption := 'Log File Display'; // form caption 45 | 46 | StatusBar := TStatusBar.Create(LLogger); // simple status bar 47 | StatusBar.Parent := LLogger; // parent required for display 48 | StatusBar.SimplePanel := True; // simple panel has one panel 49 | StatusBar.SimpleText := ALogFileName; // show the log file name in status bar 50 | StatusBar.AlignWithMargins := True; // leave a smidge at the border 51 | 52 | Memo := TMemo.Create(LLogger); // create the memo to show the log file 53 | Memo.Parent := LLogger; // parent rquired for display 54 | Memo.Align := TAlign.alClient; // take all the space 55 | Memo.ScrollBars := ssBoth; // allow for really wide content 56 | Memo.ReadOnly := True; // there's no modifying provided 57 | Memo.WordWrap := False; // turn off word wrap (see scroll bars) 58 | Memo.AlignWithMargins := True; // more space for the memo 59 | 60 | LLogFile := TFileStream.Create(ALogFileName, fmOpenRead); // open the inpus 61 | try 62 | Memo.Lines.LoadFromStream(LLogFile, TEncoding.UTF8); // load the memo lines 63 | finally 64 | LLogFile.Free; // free the file resource 65 | end; 66 | end; 67 | Result := LLogger; // return the form object to caller 68 | end; 69 | 70 | procedure tgLogger.OnCloseEvent(Sender: TObject; var Action: TCloseAction); 71 | begin 72 | Action := caFree; // free the form resource 73 | ModalResult := mrCancel; // return cancel 74 | end; 75 | 76 | procedure tgLogger.SetMemo(const Value: TMemo); 77 | begin 78 | FMemo := Value; 79 | end; 80 | 81 | procedure tgLogger.SetStatusBar(const Value: TStatusBar); 82 | begin 83 | FStatusBar := Value; 84 | end; 85 | 86 | end. 87 | -------------------------------------------------------------------------------- /AuthTest/fmAuthTest.dfm: -------------------------------------------------------------------------------- 1 | object fAuthTest: TfAuthTest 2 | Left = 0 3 | Top = 0 4 | Caption = 'Auth Test' 5 | ClientHeight = 412 6 | ClientWidth = 635 7 | Color = clBtnFace 8 | Font.Charset = DEFAULT_CHARSET 9 | Font.Color = clWindowText 10 | Font.Height = -11 11 | Font.Name = 'Tahoma' 12 | Font.Style = [] 13 | OldCreateOrder = False 14 | PixelsPerInch = 96 15 | TextHeight = 13 16 | object cbMain: TCategoryButtons 17 | AlignWithMargins = True 18 | Left = 3 19 | Top = 3 20 | Width = 145 21 | Height = 387 22 | Align = alLeft 23 | ButtonFlow = cbfVertical 24 | ButtonOptions = [boFullSize, boGradientFill, boShowCaptions, boVerticalCategoryCaptions] 25 | Categories = < 26 | item 27 | Caption = 'Logger Tests' 28 | Color = 15466474 29 | Collapsed = False 30 | Items = < 31 | item 32 | Action = aShowLogFilePath 33 | end 34 | item 35 | Action = aShowLogFileName 36 | end 37 | item 38 | Action = aAddLines 39 | end 40 | item 41 | Action = aAddStringList 42 | end 43 | item 44 | Action = aDisplayLogfile 45 | end 46 | item 47 | Action = aCycleLogFile 48 | end> 49 | end> 50 | RegularButtonColor = clWhite 51 | SelectedButtonColor = 15132390 52 | TabOrder = 0 53 | end 54 | object spMain: TStackPanel 55 | AlignWithMargins = True 56 | Left = 154 57 | Top = 3 58 | Width = 478 59 | Height = 387 60 | Align = alClient 61 | ControlCollection = < 62 | item 63 | Control = Label1 64 | end 65 | item 66 | Control = eFirstLine 67 | end 68 | item 69 | Control = Label2 70 | end 71 | item 72 | Control = eSecondLine 73 | end 74 | item 75 | Control = Label3 76 | end 77 | item 78 | Control = meAddLines 79 | HorizontalPositioning = sphpFill 80 | VerticalPositioning = spvpFill 81 | end> 82 | HorizontalPositioning = sphpFill 83 | Padding.Left = 3 84 | Padding.Top = 3 85 | Padding.Right = 3 86 | Padding.Bottom = 3 87 | TabOrder = 1 88 | object Label1: TLabel 89 | Left = 4 90 | Top = 4 91 | Width = 470 92 | Height = 13 93 | Caption = 'First Line to Add to Logfile' 94 | end 95 | object eFirstLine: TEdit 96 | Left = 4 97 | Top = 19 98 | Width = 470 99 | Height = 21 100 | TabOrder = 0 101 | TextHint = 'Enter First Line to Add to Logfile' 102 | end 103 | object Label2: TLabel 104 | Left = 4 105 | Top = 42 106 | Width = 470 107 | Height = 13 108 | Caption = 'Second Line to Add to Logfile' 109 | end 110 | object eSecondLine: TEdit 111 | Left = 4 112 | Top = 57 113 | Width = 470 114 | Height = 21 115 | TabOrder = 1 116 | TextHint = 'Enter Second Line to Add to Logfile' 117 | end 118 | object Label3: TLabel 119 | Left = 4 120 | Top = 80 121 | Width = 470 122 | Height = 13 123 | Caption = 'Memo Lines to Add to Logfile' 124 | end 125 | object meAddLines: TMemo 126 | Left = 4 127 | Top = 95 128 | Width = 470 129 | Height = 89 130 | ScrollBars = ssVertical 131 | TabOrder = 2 132 | WordWrap = False 133 | end 134 | end 135 | object StatusBar1: TStatusBar 136 | Left = 0 137 | Top = 393 138 | Width = 635 139 | Height = 19 140 | Panels = < 141 | item 142 | Width = 50 143 | end> 144 | end 145 | object etcMain: TVDEtc 146 | Vendor = 'VyDevSoft' 147 | App = 'QBTools' 148 | LogFile = 'QBCube.log' 149 | Left = 520 150 | Top = 360 151 | end 152 | object logMain: TVDLogger 153 | Etc = etcMain 154 | Left = 576 155 | Top = 360 156 | end 157 | object amMain: TActionManager 158 | Left = 464 159 | Top = 360 160 | StyleName = 'Platform Default' 161 | object aShowLogFileName: TAction 162 | Category = 'Logger' 163 | Caption = 'Show Log File Name' 164 | OnExecute = aShowLogFileNameExecute 165 | end 166 | object aShowLogFilePath: TAction 167 | Category = 'Logger' 168 | Caption = 'Show Log File Path' 169 | OnExecute = aShowLogFilePathExecute 170 | end 171 | object aAddLines: TAction 172 | Category = 'Logger' 173 | Caption = 'Add Multiple Lines' 174 | OnExecute = aAddLinesExecute 175 | end 176 | object aAddStringList: TAction 177 | Category = 'Logger' 178 | Caption = 'Add Memo Lines' 179 | OnExecute = aAddStringListExecute 180 | end 181 | object aDisplayLogfile: TAction 182 | Category = 'Logger' 183 | Caption = 'Display the Logfile' 184 | OnExecute = aDisplayLogfileExecute 185 | end 186 | object aCycleLogFile: TAction 187 | Category = 'Logger' 188 | Caption = 'Cycle Log File' 189 | OnExecute = aCycleLogFileExecute 190 | end 191 | end 192 | end 193 | -------------------------------------------------------------------------------- /GoogleOAuth2Authenticator.groupproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | {5483D326-1863-4273-9E5E-87A02260EE7A} 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | Default.Personality.12 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 | {62818A14-E2BA-4EBF-8884-FF656B31B273} 99 | Release 100 | Win64 101 | False 102 | 103 | 104 | {D9FF5F52-E65D-4DFF-B46C-EC8410160695} 105 | Release 106 | Win32 107 | False 108 | 109 | 110 | {759F9477-A55A-4A1A-9954-587428843ABD} 111 | Release 112 | Win32;Win64 113 | True 114 | 115 | 116 | {D12F46D5-8601-4AAB-A8F8-EEC1D46A5808} 117 | Debug 118 | Win32 119 | False 120 | 121 | 122 | {C369F23B-51EF-4EC1-A4D9-380B437850EB} 123 | Debug 124 | Win32 125 | False 126 | 127 | 128 | {3F5A3230-5D97-4EC9-92F0-BB0E911F3B9B} 129 | Release 130 | Win32;Win64 131 | True 132 | 133 | 134 | 135 | -------------------------------------------------------------------------------- /QAuthenticator/pQOAuth2Authenticator.pas: -------------------------------------------------------------------------------- 1 | unit pQOAuth2Authenticator; 2 | 3 | interface 4 | 5 | uses 6 | System.SysUtils, System.Classes, Data.Bind.Components, Data.Bind.ObjectScope, REST.Client, REST.Authenticator.OAuth, 7 | pCons, pGetCredentials; 8 | 9 | type 10 | [ComponentPlatformsAttribute(pidWin32 or pidWin64)] 11 | TQOAuth2Authenticator = class(TCustomAuthenticator) 12 | private 13 | FCredMgr: TGetCredentials; 14 | { Private declarations } 15 | function GetAuthCodeGoogle: Boolean; 16 | function GetTokensGoogle: Boolean; 17 | procedure SetCredMgr(const Value: TGetCredentials); 18 | 19 | protected 20 | { Protected declarations } 21 | procedure DoAuthenticate(ARequest: TCustomRESTRequest); override; 22 | procedure WebFormTitleChanged(const ATitle: string; var DoCloseWebView: Boolean); 23 | 24 | public 25 | { Public declarations } 26 | published 27 | { Published declarations } 28 | property CredMgr: TGetCredentials read FCredMgr write SetCredMgr; 29 | end; 30 | 31 | implementation 32 | 33 | uses 34 | REST.Authenticator.OAuth.WebForm.Win, REST.Utils, System.StrUtils, VCL.Dialogs, REST.Types, System.DateUtils; 35 | 36 | { TQOAuth2Authenticator } 37 | 38 | { DoAuthenticate is executed as a result of a REST Request using a Client that uses this 39 | authenticator. It first checks for an access token, and if none is found, invokes the 40 | authentication routines. Finally, the access token is added to the request. } 41 | 42 | procedure TQOAuth2Authenticator.DoAuthenticate(ARequest: TCustomRESTRequest); 43 | begin 44 | if AccessToken = '' then // no access token; must authorize 45 | if GetAuthCodeGoogle then // obtain the authorization code 46 | GetTokensGoogle; // exchange auth code for access tokens 47 | inherited; // normal processing inserts access code into request 48 | end; 49 | 50 | { Extract Authorization Code from the Web Form when returned by Google } 51 | 52 | procedure TQOAuth2Authenticator.WebFormTitleChanged(const ATitle: string; var DoCloseWebView: Boolean); 53 | begin 54 | if (StartsText('Success code', ATitle)) then // if success code indicated 55 | begin 56 | AuthCode := Copy( // save the authorization code 57 | ATitle, 14, Length(ATitle)); 58 | if (AuthCode <> '') then // if authorization code found 59 | DoCloseWebView := True; // close the browser form 60 | end; 61 | end; 62 | 63 | { Display browser window with OAuth2 login screen } 64 | 65 | function TQOAuth2Authenticator.GetAuthCodeGoogle: Boolean; 66 | var 67 | LURL: TStringBuilder; 68 | LBrowser: Tfrm_OAuthWebForm; 69 | begin 70 | Result := False; // assume failure 71 | { build the URL to obtain the authorization code } 72 | LURL := TStringBuilder.Create; // create the URL build area 73 | try 74 | LURL.Append(AuthorizationEndpoint); 75 | LURL.AppendFormat('?response_type=%s', [URIEncode('code')]); 76 | LURL.AppendFormat('&client_id=%s', [URIEncode(ClientID)]); 77 | LURL.AppendFormat('&redirect_uri=%s', [URIEncode(RedirectionEndPoint)]); 78 | LURL.AppendFormat('&scope=%s', [URIEncode(Scope)]); 79 | LURL.AppendFormat('&login_hint=%s', [URIEncode(LoginHint)]); 80 | { Display the OAuth2 in a web browser } 81 | LBrowser := Tfrm_OAuthWebForm.Create(nil); // create the browser form 82 | try 83 | LBrowser.OnTitleChanged := WebFormTitleChanged; // event to check for an auth code 84 | LBrowser.ShowWithURL(LURL.ToString); // show the OAuth2 web page 85 | finally 86 | LBrowser.Release; // free the browser window 87 | if AuthCode <> '' then 88 | Result := True; // auth code successfully obtained 89 | end; 90 | finally 91 | LURL.Free; // free the URL build area 92 | end; 93 | end; 94 | 95 | { Exchange the authorization code from Google for the access tokens } 96 | 97 | function TQOAuth2Authenticator.GetTokensGoogle: Boolean; 98 | var 99 | LClient: TRESTClient; // to request the exchange 100 | LRequest: TRestRequest; // to request the exchange 101 | LToken: string; // local token hold area 102 | begin 103 | LClient := TRESTClient.Create(ExBaseURL); // create the client 104 | LRequest := TRestRequest.Create(nil); // create the request 105 | try 106 | LRequest.Client := LClient; // chain the request to the client 107 | LRequest.Method := rmPOST; 108 | LRequest.Resource := ExRequestResource; 109 | // required parameters 110 | LRequest.AddParameter(ExCode, AuthCode, pkGETorPOST); 111 | LRequest.AddParameter(ExClientID, ClientID, pkGETorPOST); 112 | LRequest.AddParameter(ExClientSecret, ClientSecret, pkGETorPOST); 113 | LRequest.AddParameter(ExRedirectURI, RedirectionEndPoint, pkGETorPOST); 114 | LRequest.AddParameter(ExGrantType, ExAuthorizationCode, pkGETorPOST); 115 | 116 | LRequest.Execute; // attempt token exchange 117 | 118 | { Test successful return of tokens. Save if returned. } 119 | 120 | if LRequest.Response.GetSimpleValue(ExAccessToken, LToken) then 121 | begin 122 | AccessToken := LToken; // save access token if present 123 | end; 124 | 125 | if LRequest.Response.GetSimpleValue(ExRefreshToken, LToken) then 126 | begin 127 | RefreshToken := LToken; // save refresh token if present 128 | end; 129 | 130 | if LRequest.Response.GetSimpleValue(ExExpiresIn, LToken) then 131 | begin 132 | AccessTokenExpiry := IncSecond( // save token expiry as datetime 133 | Now(), LToken.ToInteger); 134 | end; 135 | 136 | if (AccessToken <> '') and (RefreshToken <> '') then 137 | Result := True // both tokens must be present to return true 138 | else 139 | Result := False; // failed to get tokens 140 | 141 | finally 142 | LRequest.Free; // release resources 143 | LClient.Free; // release resources 144 | end; 145 | end; 146 | 147 | procedure TQOAuth2Authenticator.SetCredMgr( 148 | const Value: TGetCredentials); 149 | begin 150 | FCredMgr := Value; 151 | end; 152 | 153 | end. 154 | -------------------------------------------------------------------------------- /OAuth2AuthenticatorGoogle.pas: -------------------------------------------------------------------------------- 1 | unit OAuth2AuthenticatorGoogle; 2 | 3 | interface 4 | 5 | uses 6 | System.SysUtils, System.Classes, Data.Bind.Components, Data.Bind.ObjectScope, REST.Client, REST.Authenticator.OAuth; 7 | 8 | type 9 | [ComponentPlatformsAttribute(pidWin32 or pidWin64)] 10 | TOAuth2AuthenticatorGoogle = class(TOAuth2Authenticator) 11 | private 12 | { Private declarations } 13 | FLoginHint: string; 14 | procedure SetLoginHint(const Value: string); 15 | function GetAuthCodeGoogle: Boolean; 16 | function GetTokensGoogle: Boolean; 17 | 18 | protected 19 | { Protected declarations } 20 | procedure DoAuthenticate(ARequest: TCustomRESTRequest); override; 21 | procedure WebFormTitleChanged(const ATitle: string; var DoCloseWebView: Boolean); 22 | 23 | public 24 | { Public declarations } 25 | published 26 | { Published declarations } 27 | property LoginHint: string // Google allows for a Login Hint to make the process a little eaier 28 | read FLoginHint write SetLoginHint; 29 | end; 30 | 31 | implementation 32 | 33 | uses 34 | REST.Authenticator.OAuth.WebForm.Win, REST.Utils, System.StrUtils, VCL.Dialogs, REST.Types, pOA2Cons, System.DateUtils; 35 | 36 | { TOAuth2AuthenticatorGoogle } 37 | 38 | { DoAuthenticate is executed as a result of a REST Request using a Client that uses this 39 | authenticator. It first checks for an access token, and if none is found, invokes the 40 | authentication routines. Finally, the access token is added to the request. } 41 | 42 | procedure TOAuth2AuthenticatorGoogle.DoAuthenticate(ARequest: TCustomRESTRequest); 43 | begin 44 | if AccessToken = '' then // no access token; must authorize 45 | if GetAuthCodeGoogle then // obtain the authorization code 46 | GetTokensGoogle; // exchange auth code for access tokens 47 | inherited; // normal processing inserts access code into request 48 | end; 49 | 50 | procedure TOAuth2AuthenticatorGoogle.SetLoginHint(const Value: string); 51 | begin 52 | FLoginHint := Value; 53 | end; 54 | 55 | { Extract Authorization Code from the Web Form when returned by Google } 56 | 57 | procedure TOAuth2AuthenticatorGoogle.WebFormTitleChanged(const ATitle: string; var DoCloseWebView: Boolean); 58 | begin 59 | if (StartsText('Success code', ATitle)) then // if success code indicated 60 | begin 61 | AuthCode := Copy( // save the authorization code 62 | ATitle, 14, Length(ATitle)); 63 | if (AuthCode <> '') then // if authorization code found 64 | DoCloseWebView := True; // close the browser form 65 | end; 66 | end; 67 | 68 | { Display browser window with OAuth2 login screen } 69 | 70 | function TOAuth2AuthenticatorGoogle.GetAuthCodeGoogle: Boolean; 71 | var 72 | LURL: TStringBuilder; 73 | LBrowser: Tfrm_OAuthWebForm; 74 | begin 75 | Result := False; // assume failure 76 | { build the URL to obtain the authorization code } 77 | LURL := TStringBuilder.Create; // create the URL build area 78 | try 79 | LURL.Append(AuthorizationEndpoint); 80 | LURL.AppendFormat('?response_type=%s', [URIEncode('code')]); 81 | LURL.AppendFormat('&client_id=%s', [URIEncode(ClientID)]); 82 | LURL.AppendFormat('&redirect_uri=%s', [URIEncode(RedirectionEndPoint)]); 83 | LURL.AppendFormat('&scope=%s', [URIEncode(Scope)]); 84 | LURL.AppendFormat('&login_hint=%s', [URIEncode(LoginHint)]); 85 | { Display the OAuth2 in a web browser } 86 | LBrowser := Tfrm_OAuthWebForm.Create(nil); // create the browser form 87 | try 88 | LBrowser.OnTitleChanged := WebFormTitleChanged; // event to check for an auth code 89 | LBrowser.ShowWithURL(LURL.ToString); // show the OAuth2 web page 90 | finally 91 | LBrowser.Release; // free the browser window 92 | if AuthCode <> '' then 93 | Result := True; // auth code successfully obtained 94 | end; 95 | finally 96 | LURL.Free; // free the URL build area 97 | end; 98 | end; 99 | 100 | { Exchange the authorization code from Google for the access tokens } 101 | 102 | function TOAuth2AuthenticatorGoogle.GetTokensGoogle: Boolean; 103 | var 104 | LClient: TRESTClient; // to request the exchange 105 | LRequest: TRestRequest; // to request the exchange 106 | LToken: string; // local token hold area 107 | begin 108 | LClient := TRESTClient.Create(ExBaseURL); // create the client 109 | LRequest := TRestRequest.Create(nil); // create the request 110 | try 111 | LRequest.Client := LClient; // chain the request to the client 112 | LRequest.Method := rmPOST; 113 | LRequest.Resource := ExRequestResource; 114 | // required parameters 115 | LRequest.AddParameter(ExCode, AuthCode, pkGETorPOST); 116 | LRequest.AddParameter(ExClientID, ClientID, pkGETorPOST); 117 | LRequest.AddParameter(ExClientSecret, ClientSecret, pkGETorPOST); 118 | LRequest.AddParameter(ExRedirectURI, RedirectionEndPoint, pkGETorPOST); 119 | LRequest.AddParameter(ExGrantType, ExAuthorizationCode, pkGETorPOST); 120 | 121 | LRequest.Execute; // attempt token exchange 122 | 123 | { Test successful return of tokens. Save if returned. } 124 | 125 | if LRequest.Response.GetSimpleValue(ExAccessToken, LToken) then 126 | begin 127 | AccessToken := LToken; // save access token if present 128 | end; 129 | 130 | if LRequest.Response.GetSimpleValue(ExRefreshToken, LToken) then 131 | begin 132 | RefreshToken := LToken; // save refresh token if present 133 | end; 134 | 135 | if LRequest.Response.GetSimpleValue(ExExpiresIn, LToken) then 136 | begin 137 | AccessTokenExpiry := IncSecond( // save token expiry as datetime 138 | Now(), LToken.ToInteger); 139 | end; 140 | 141 | if (AccessToken <> '') and (RefreshToken <> '') then 142 | Result := True // both tokens must be present to return true 143 | else 144 | Result := False; // failed to get tokens 145 | 146 | finally 147 | LRequest.Free; // release resources 148 | LClient.Free; // release resources 149 | end; 150 | end; 151 | 152 | end. 153 | -------------------------------------------------------------------------------- /Logger/pVDLogger.pas: -------------------------------------------------------------------------------- 1 | unit pVDLogger; 2 | 3 | interface 4 | 5 | uses 6 | System.SysUtils, System.IOUtils, System.Classes, {fgMemoDisplay,} WinAPI.Windows, 7 | pVDEtc; 8 | 9 | type 10 | TLogSource = (lsUtility, lsDiscovery, lsAuthenticate, lsTokenExchange, lsTokenRefresh); 11 | TLogSources = set of TLogSource; 12 | SLogSource = String; 13 | 14 | ELogFileError = class(Exception); 15 | ELogFileNoParams = class(ELogFileError); 16 | 17 | [ComponentPlatformsAttribute(pidWin32 or pidWin64)] 18 | TVDLogger = class(TComponent) 19 | private 20 | FLogFileName: TFileName; 21 | FLogFile: TFileStream; 22 | FLogFilePath: TFileName; 23 | FEtc: TVDEtc; 24 | procedure SetLogFileName(const Value: TFileName); 25 | procedure SetLogFile(const Value: TFileStream); 26 | procedure SetLogFilePath(const Value: TFileName); 27 | procedure SetEtc(const Value: TVDEtc); 28 | procedure CalcLogFileLocs(const AEtc: TVDEtc); 29 | property LogFile: TFileStream read FLogFile write SetLogFile; 30 | protected 31 | function FormatLogHeader(const ATimeStamp: TDateTime; ALogSource: TLogSource): String; 32 | procedure Loaded; override; 33 | public 34 | procedure LogStrings(const ALogSource: TLogSource; const AMsgText: TStringList); overload; 35 | procedure LogStrings(const ALogSource: TLogSource; const AMsgText: TStrings); overload; 36 | procedure LogLine(const ALogSource: TLogSource; const AMsgLine: array of String); 37 | procedure ShowLog; 38 | function CycleLogfile: Boolean; 39 | function GetLogFilePath: TFileName; 40 | function GetLogFileName: TFileName; 41 | property LogFileName: TFileName read GetLogFileName write SetLogFileName; 42 | property LogFilePath: TFileName read GetLogFilePath write SetLogFilePath; 43 | constructor Create(AOwner: TComponent); override; 44 | published 45 | property Etc: TVDEtc read FEtc write SetEtc; 46 | end; 47 | 48 | const 49 | 50 | SLogSources: array [TLogSource] of String = ('Utility', 'Discovery Document', 'Authenticate', 'Token Exchange', 'Token Refresh'); 51 | 52 | implementation 53 | 54 | uses 55 | System.DateUtils, VCL.Dialogs, VCL.Forms, fmVDLogger; 56 | 57 | { TVDLogger } 58 | 59 | { Application constants are universally specified in the Etc component. This 60 | retrieves the values for the log path and file name for ongoing use. } 61 | 62 | procedure TVDLogger.CalcLogFileLocs(const AEtc: TVDEtc); 63 | begin 64 | try 65 | if not Assigned(AEtc) then // be sure Etc component is assigned 66 | raise ELogFileNoParams.Create('Missing reference to Etc component.'); 67 | with AEtc do // need Vendor, App and Filename 68 | begin // create the filename and path 69 | LogFilePath := TPath.Combine(TPath.Combine(GetHomePath, Vendor), App); 70 | LogFileName := TPath.Combine(LogFilePath, LogFile); 71 | end; 72 | except 73 | on E: ELogFileNoParams do // missing etc component 74 | MessageDlg(E.Message, mtError, [mbOK], 0); // inform tdhe usere 75 | end; 76 | end; 77 | 78 | constructor TVDLogger.Create(AOwner: TComponent); 79 | begin 80 | inherited Create(AOwner); // not much to see here 81 | end; 82 | 83 | { To start a new log file the old file is simply renamed with the current timestamp. 84 | The next attempt to make a log entry will simply create a new log file. } 85 | 86 | function TVDLogger.CycleLogfile: Boolean; 87 | var 88 | LNewName: TFileName; 89 | LBasicFilename: TFileName; 90 | LFormatSettings: TFormatSettings; 91 | begin 92 | LBasicFilename := TPath.GetFileNameWithoutExtension(LogFileName); 93 | LFormatSettings := TFormatSettings.Create; 94 | LFormatSettings.DateSeparator := '-'; 95 | LFormatSettings.TimeSeparator := '-'; 96 | LFormatSettings.ShortDateFormat := 'yyyy-mm-dd'; 97 | LFormatSettings.LongTimeFormat := 'hh-nn-ss'; 98 | LBasicFilename := DateTimeToStr(Now(), LFormatSettings) + ' ' + LBasicFilename + '.log'; 99 | LNewName := TPath.Combine(LogFilePath, LBasicFilename); 100 | if RenameFile(LogFileName, LNewName) then 101 | Result := True 102 | else 103 | Result := False; 104 | end; 105 | 106 | { Formatting the log source converts the enumeration received to a readable string. The 107 | Timestamp is formatted as an ISO8601 date and time. } 108 | 109 | function TVDLogger.FormatLogHeader(const ATimeStamp: TDateTime; ALogSource: TLogSource): String; 110 | const 111 | LLogHeaderMask: String = '**** %s; Source: %s'; // format string 112 | begin // is this thread safe? 113 | Result := Format(LLogHeaderMask, [DateToISO8601(ATimeStamp, False), SLogSources[ALogSource]]); 114 | end; 115 | 116 | function TVDLogger.GetLogFileName: TFileName; 117 | begin 118 | Result := FLogFileName; // return the log filename already determined 119 | end; 120 | 121 | function TVDLogger.GetLogFilePath: TFileName; 122 | begin 123 | Result := FLogFilePath; // return the log path already determined 124 | end; 125 | 126 | { Now that all components have been loaded we can obtain the full path and file 127 | name of the log file from the Etc component. } 128 | 129 | procedure TVDLogger.Loaded; 130 | begin 131 | Inherited; 132 | CalcLogFileLocs(Etc); // obtain and save the log file path and file name 133 | end; 134 | 135 | { Logging a series of single lines causes a stringlist to be built. Then the LogText procedure is 136 | invoked that will add a header line and save the completed entry to the log file. } 137 | 138 | procedure TVDLogger.LogLine(const ALogSource: TLogSource; const AMsgLine: array of String); 139 | var 140 | LMessageList: TStringList; // work list 141 | LMessageLine: String; // for iteration 142 | begin 143 | LMessageList := TStringList.Create; // create the work list 144 | try 145 | for LMessageLine in AMsgLine do // prdocess each line of the input arrayi 146 | LMessageList.Add(LMessageLine); // add the line to the stringlist 147 | LogStrings(ALogSource, LMessageList); // invoke the log list procedure 148 | finally 149 | LMessageList.Free; // return the resource 150 | end; 151 | end; 152 | 153 | { This overload is intended primarily as a workaround for handling TMemo lines, that 154 | are actually TMemoStrings, not TStrings. TMemoStrings do not handle TrailingLineBreak 155 | correctly (it is completely ignored). Hence we need to build a real TStringList 156 | for submission tdo the LogStrings Routine. } 157 | 158 | procedure TVDLogger.LogStrings(const ALogSource: TLogSource; 159 | const AMsgText: TStrings); 160 | var 161 | LStringList: TStringList; // string list to receive input lines 162 | begin 163 | LStringList := TStringList.Create; // create the string list 164 | try 165 | LStringList.Assign(AMsgText); // assign the input lines to the stringlist 166 | LogStrings(ALogSource, LStringList); // invoke the logging routine using the new list 167 | finally 168 | LStringList.Free; // return resources after all done 169 | end; 170 | end; 171 | 172 | { General purpose routine that logs a stringlist. Note that the so-called TStrings of a TMemo 173 | are not suitable for this routine. The overloaded method that accepts TStrings should be used 174 | instead. } 175 | 176 | procedure TVDLogger.LogStrings(const ALogSource: TLogSource; const AMsgText: TStringList); 177 | var 178 | LMode: Word; // log file mode 179 | LMsgTimeStamp: String; // time stamp appended as first line 180 | begin 181 | if not FileExists(LogFileName) then // check for presence of existing log file 182 | begin 183 | ForceDirectories(LogFilePath); // if no file, ensure the path exists 184 | LMode := fmCreate; // create the file since none exists 185 | end 186 | else 187 | LMode := fmOpenReadWrite; // if file exists, simply append 188 | 189 | LogFile := TFileStream.Create(LogFileName, LMode or fmShareDenyWrite); // create the stream writer 190 | try 191 | LogFile.Seek(0, soFromEnd); // position at the end of the file 192 | LMsgTimeStamp := FormatLogHeader(Now(), ALogSource); // format the timestamp (local time) 193 | AMsgText.Insert(0, LMsgTimeStamp); // insert the timestamp as the first line 194 | AMsgText.SaveToStream(LogFile, TEncoding.UTF8); // write the completed set of lines to the log 195 | finally 196 | LogFile.Free; // return resources 197 | end; 198 | end; 199 | 200 | procedure TVDLogger.SetEtc(const Value: TVDEtc); 201 | begin 202 | FEtc := Value; 203 | end; 204 | 205 | procedure TVDLogger.SetLogFile(const Value: TFileStream); 206 | begin 207 | FLogFile := Value; 208 | end; 209 | 210 | procedure TVDLogger.SetLogFileName(const Value: TFileName); 211 | begin 212 | FLogFileName := Value; 213 | end; 214 | 215 | procedure TVDLogger.SetLogFilePath(const Value: TFileName); 216 | begin 217 | FLogFilePath := Value; 218 | end; 219 | 220 | { Display the current log file in a read-only memo box. The current log 221 | file name is stored as a property of the class. } 222 | 223 | procedure TVDLogger.ShowLog; 224 | var 225 | LgMemoDisplay: tgLogger; // pointer to the form for display 226 | begin 227 | if FileExists(LogFileName) then // first make sure we actually have a log file 228 | begin 229 | LgMemoDisplay := tgLogger.CreateLog(Self, LogFileName); 230 | // LgMemoDisplay := TgMemoDisplay.CreateAux(Self, LogFileName); // create the window 231 | LgMemoDisplay.Show; // show triggers the log file retrieval 232 | end 233 | else 234 | ShowMessage('There is no current log file.'); // inform the user if there is no current log file 235 | end; 236 | 237 | end. 238 | -------------------------------------------------------------------------------- /QAuthenticator/QAuthenticator.dproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | {D12F46D5-8601-4AAB-A8F8-EEC1D46A5808} 4 | QAuthenticator.dpk 5 | 19.2 6 | None 7 | True 8 | Debug 9 | Win32 10 | 3 11 | Package 12 | 13 | 14 | true 15 | 16 | 17 | true 18 | Base 19 | true 20 | 21 | 22 | true 23 | Base 24 | true 25 | 26 | 27 | true 28 | Base 29 | true 30 | 31 | 32 | true 33 | Cfg_1 34 | true 35 | true 36 | 37 | 38 | true 39 | Base 40 | true 41 | 42 | 43 | .\$(Platform)\$(Config) 44 | .\$(Platform)\$(Config) 45 | false 46 | false 47 | false 48 | false 49 | false 50 | true 51 | true 52 | System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) 53 | All 54 | QAuthenticator 55 | true 56 | true 57 | 1033 58 | CompanyName=VyDevSoft;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=QAuthenticator;LegalCopyright= ©2021 Milan Vydareny VyDev Software;LegalTrademarks=;OriginalFilename=;ProgramID=com.VyDevsoft.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 59 | Quickbooks Authenticator for REST Request/Client 60 | true 61 | true 62 | $(Auto) 63 | 64 | 65 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) 66 | Debug 67 | true 68 | CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 69 | 1033 70 | 71 | 72 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) 73 | Debug 74 | true 75 | CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 76 | 1033 77 | 78 | 79 | DEBUG;$(DCC_Define) 80 | true 81 | false 82 | true 83 | true 84 | true 85 | 86 | 87 | false 88 | true 89 | 1033 90 | 91 | 92 | false 93 | RELEASE;$(DCC_Define) 94 | 0 95 | 0 96 | 97 | 98 | 99 | MainSource 100 | 101 | 102 | 103 | 104 | 105 | Cfg_2 106 | Base 107 | 108 | 109 | Base 110 | 111 | 112 | Cfg_1 113 | Base 114 | 115 | 116 | 117 | Delphi.Personality.12 118 | Package 119 | 120 | 121 | 122 | QAuthenticator.dpk 123 | 124 | 125 | Microsoft Office 2000 Sample Automation Server Wrapper Components 126 | Microsoft Office XP Sample Automation Server Wrapper Components 127 | 128 | 129 | 130 | 131 | 132 | true 133 | 134 | 135 | 136 | 137 | true 138 | 139 | 140 | 141 | 142 | true 143 | 144 | 145 | 146 | 147 | QAuthenticator.bpl 148 | true 149 | 150 | 151 | 152 | 153 | 1 154 | 155 | 156 | 0 157 | 158 | 159 | 160 | 161 | classes 162 | 1 163 | 164 | 165 | classes 166 | 1 167 | 168 | 169 | 170 | 171 | res\xml 172 | 1 173 | 174 | 175 | res\xml 176 | 1 177 | 178 | 179 | 180 | 181 | library\lib\armeabi-v7a 182 | 1 183 | 184 | 185 | 186 | 187 | library\lib\armeabi 188 | 1 189 | 190 | 191 | library\lib\armeabi 192 | 1 193 | 194 | 195 | 196 | 197 | library\lib\armeabi-v7a 198 | 1 199 | 200 | 201 | 202 | 203 | library\lib\mips 204 | 1 205 | 206 | 207 | library\lib\mips 208 | 1 209 | 210 | 211 | 212 | 213 | library\lib\armeabi-v7a 214 | 1 215 | 216 | 217 | library\lib\arm64-v8a 218 | 1 219 | 220 | 221 | 222 | 223 | library\lib\armeabi-v7a 224 | 1 225 | 226 | 227 | 228 | 229 | res\drawable 230 | 1 231 | 232 | 233 | res\drawable 234 | 1 235 | 236 | 237 | 238 | 239 | res\values 240 | 1 241 | 242 | 243 | res\values 244 | 1 245 | 246 | 247 | 248 | 249 | res\values-v21 250 | 1 251 | 252 | 253 | res\values-v21 254 | 1 255 | 256 | 257 | 258 | 259 | res\values 260 | 1 261 | 262 | 263 | res\values 264 | 1 265 | 266 | 267 | 268 | 269 | res\drawable 270 | 1 271 | 272 | 273 | res\drawable 274 | 1 275 | 276 | 277 | 278 | 279 | res\drawable-xxhdpi 280 | 1 281 | 282 | 283 | res\drawable-xxhdpi 284 | 1 285 | 286 | 287 | 288 | 289 | res\drawable-xxxhdpi 290 | 1 291 | 292 | 293 | res\drawable-xxxhdpi 294 | 1 295 | 296 | 297 | 298 | 299 | res\drawable-ldpi 300 | 1 301 | 302 | 303 | res\drawable-ldpi 304 | 1 305 | 306 | 307 | 308 | 309 | res\drawable-mdpi 310 | 1 311 | 312 | 313 | res\drawable-mdpi 314 | 1 315 | 316 | 317 | 318 | 319 | res\drawable-hdpi 320 | 1 321 | 322 | 323 | res\drawable-hdpi 324 | 1 325 | 326 | 327 | 328 | 329 | res\drawable-xhdpi 330 | 1 331 | 332 | 333 | res\drawable-xhdpi 334 | 1 335 | 336 | 337 | 338 | 339 | res\drawable-mdpi 340 | 1 341 | 342 | 343 | res\drawable-mdpi 344 | 1 345 | 346 | 347 | 348 | 349 | res\drawable-hdpi 350 | 1 351 | 352 | 353 | res\drawable-hdpi 354 | 1 355 | 356 | 357 | 358 | 359 | res\drawable-xhdpi 360 | 1 361 | 362 | 363 | res\drawable-xhdpi 364 | 1 365 | 366 | 367 | 368 | 369 | res\drawable-xxhdpi 370 | 1 371 | 372 | 373 | res\drawable-xxhdpi 374 | 1 375 | 376 | 377 | 378 | 379 | res\drawable-xxxhdpi 380 | 1 381 | 382 | 383 | res\drawable-xxxhdpi 384 | 1 385 | 386 | 387 | 388 | 389 | res\drawable-small 390 | 1 391 | 392 | 393 | res\drawable-small 394 | 1 395 | 396 | 397 | 398 | 399 | res\drawable-normal 400 | 1 401 | 402 | 403 | res\drawable-normal 404 | 1 405 | 406 | 407 | 408 | 409 | res\drawable-large 410 | 1 411 | 412 | 413 | res\drawable-large 414 | 1 415 | 416 | 417 | 418 | 419 | res\drawable-xlarge 420 | 1 421 | 422 | 423 | res\drawable-xlarge 424 | 1 425 | 426 | 427 | 428 | 429 | res\values 430 | 1 431 | 432 | 433 | res\values 434 | 1 435 | 436 | 437 | 438 | 439 | 1 440 | 441 | 442 | 1 443 | 444 | 445 | 0 446 | 447 | 448 | 449 | 450 | 1 451 | .framework 452 | 453 | 454 | 1 455 | .framework 456 | 457 | 458 | 0 459 | 460 | 461 | 462 | 463 | 1 464 | .dylib 465 | 466 | 467 | 1 468 | .dylib 469 | 470 | 471 | 0 472 | .dll;.bpl 473 | 474 | 475 | 476 | 477 | 1 478 | .dylib 479 | 480 | 481 | 1 482 | .dylib 483 | 484 | 485 | 1 486 | .dylib 487 | 488 | 489 | 1 490 | .dylib 491 | 492 | 493 | 1 494 | .dylib 495 | 496 | 497 | 0 498 | .bpl 499 | 500 | 501 | 502 | 503 | 0 504 | 505 | 506 | 0 507 | 508 | 509 | 0 510 | 511 | 512 | 0 513 | 514 | 515 | 0 516 | 517 | 518 | 0 519 | 520 | 521 | 0 522 | 523 | 524 | 0 525 | 526 | 527 | 528 | 529 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 530 | 1 531 | 532 | 533 | 534 | 535 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 536 | 1 537 | 538 | 539 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 540 | 1 541 | 542 | 543 | 544 | 545 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 546 | 1 547 | 548 | 549 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 550 | 1 551 | 552 | 553 | 554 | 555 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 556 | 1 557 | 558 | 559 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 560 | 1 561 | 562 | 563 | 564 | 565 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 566 | 1 567 | 568 | 569 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 570 | 1 571 | 572 | 573 | 574 | 575 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 576 | 1 577 | 578 | 579 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 580 | 1 581 | 582 | 583 | 584 | 585 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 586 | 1 587 | 588 | 589 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 590 | 1 591 | 592 | 593 | 594 | 595 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 596 | 1 597 | 598 | 599 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 600 | 1 601 | 602 | 603 | 604 | 605 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 606 | 1 607 | 608 | 609 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 610 | 1 611 | 612 | 613 | 614 | 615 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 616 | 1 617 | 618 | 619 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 620 | 1 621 | 622 | 623 | 624 | 625 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 626 | 1 627 | 628 | 629 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 630 | 1 631 | 632 | 633 | 634 | 635 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 636 | 1 637 | 638 | 639 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 640 | 1 641 | 642 | 643 | 644 | 645 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 646 | 1 647 | 648 | 649 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 650 | 1 651 | 652 | 653 | 654 | 655 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 656 | 1 657 | 658 | 659 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 660 | 1 661 | 662 | 663 | 664 | 665 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 666 | 1 667 | 668 | 669 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 670 | 1 671 | 672 | 673 | 674 | 675 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 676 | 1 677 | 678 | 679 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 680 | 1 681 | 682 | 683 | 684 | 685 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 686 | 1 687 | 688 | 689 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 690 | 1 691 | 692 | 693 | 694 | 695 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 696 | 1 697 | 698 | 699 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 700 | 1 701 | 702 | 703 | 704 | 705 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 706 | 1 707 | 708 | 709 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 710 | 1 711 | 712 | 713 | 714 | 715 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 716 | 1 717 | 718 | 719 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 720 | 1 721 | 722 | 723 | 724 | 725 | 1 726 | 727 | 728 | 1 729 | 730 | 731 | 732 | 733 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 734 | 1 735 | 736 | 737 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 738 | 1 739 | 740 | 741 | 742 | 743 | 744 | 745 | 746 | 1 747 | 748 | 749 | 1 750 | 751 | 752 | 1 753 | 754 | 755 | 756 | 757 | 758 | 759 | 760 | Contents\Resources 761 | 1 762 | 763 | 764 | Contents\Resources 765 | 1 766 | 767 | 768 | 769 | 770 | library\lib\armeabi-v7a 771 | 1 772 | 773 | 774 | library\lib\arm64-v8a 775 | 1 776 | 777 | 778 | 1 779 | 780 | 781 | 1 782 | 783 | 784 | 1 785 | 786 | 787 | 1 788 | 789 | 790 | 1 791 | 792 | 793 | 1 794 | 795 | 796 | 0 797 | 798 | 799 | 800 | 801 | library\lib\armeabi-v7a 802 | 1 803 | 804 | 805 | 806 | 807 | 1 808 | 809 | 810 | 1 811 | 812 | 813 | 814 | 815 | Assets 816 | 1 817 | 818 | 819 | Assets 820 | 1 821 | 822 | 823 | 824 | 825 | Assets 826 | 1 827 | 828 | 829 | Assets 830 | 1 831 | 832 | 833 | 834 | 835 | 836 | 837 | 838 | 839 | 840 | 841 | 842 | 843 | 844 | 845 | True 846 | True 847 | 848 | 849 | 12 850 | 851 | 852 | 853 | 854 | 855 | -------------------------------------------------------------------------------- /Logger/VDLogger.dproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | {759F9477-A55A-4A1A-9954-587428843ABD} 4 | VDLogger.dpk 5 | 19.2 6 | None 7 | True 8 | Debug 9 | Win32 10 | 3 11 | Package 12 | 13 | 14 | true 15 | 16 | 17 | true 18 | Base 19 | true 20 | 21 | 22 | true 23 | Base 24 | true 25 | 26 | 27 | true 28 | Base 29 | true 30 | 31 | 32 | true 33 | Cfg_1 34 | true 35 | true 36 | 37 | 38 | true 39 | Base 40 | true 41 | 42 | 43 | true 44 | Cfg_2 45 | true 46 | true 47 | 48 | 49 | $(BDSCOMMONDIR)\DCU\$(Platform) 50 | .\$(Platform)\$(Config) 51 | false 52 | false 53 | false 54 | false 55 | false 56 | true 57 | true 58 | System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) 59 | All 60 | VDLogger 61 | true 62 | 1033 63 | CompanyName=VyDev Software;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=Logger;LegalCopyright=© 2021 Milan Vydareny VyDevSoftware;LegalTrademarks=;OriginalFilename=Logger;ProgramID=com.VyDevSoft.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 64 | General Purpose Logging Routines 65 | true 66 | true 67 | $(Auto) 68 | 69 | 70 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) 71 | Debug 72 | true 73 | CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 74 | 1033 75 | 76 | 77 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) 78 | Debug 79 | CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 80 | 81 | 82 | DEBUG;$(DCC_Define) 83 | true 84 | false 85 | true 86 | true 87 | true 88 | 89 | 90 | false 91 | true 92 | 1033 93 | 94 | 95 | false 96 | RELEASE;$(DCC_Define) 97 | 0 98 | 0 99 | 100 | 101 | CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 102 | 103 | 104 | 105 | MainSource 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | Cfg_2 114 | Base 115 | 116 | 117 | Base 118 | 119 | 120 | Cfg_1 121 | Base 122 | 123 | 124 | 125 | Delphi.Personality.12 126 | Package 127 | 128 | 129 | 130 | VDLogger.dpk 131 | 132 | 133 | Microsoft Office 2000 Sample Automation Server Wrapper Components 134 | Microsoft Office XP Sample Automation Server Wrapper Components 135 | 136 | 137 | 138 | 139 | 140 | true 141 | 142 | 143 | 144 | 145 | true 146 | 147 | 148 | 149 | 150 | true 151 | 152 | 153 | 154 | 155 | VDLogger.bpl 156 | true 157 | 158 | 159 | 160 | 161 | 1 162 | 163 | 164 | 0 165 | 166 | 167 | 168 | 169 | classes 170 | 1 171 | 172 | 173 | classes 174 | 1 175 | 176 | 177 | 178 | 179 | res\xml 180 | 1 181 | 182 | 183 | res\xml 184 | 1 185 | 186 | 187 | 188 | 189 | library\lib\armeabi-v7a 190 | 1 191 | 192 | 193 | 194 | 195 | library\lib\armeabi 196 | 1 197 | 198 | 199 | library\lib\armeabi 200 | 1 201 | 202 | 203 | 204 | 205 | library\lib\armeabi-v7a 206 | 1 207 | 208 | 209 | 210 | 211 | library\lib\mips 212 | 1 213 | 214 | 215 | library\lib\mips 216 | 1 217 | 218 | 219 | 220 | 221 | library\lib\armeabi-v7a 222 | 1 223 | 224 | 225 | library\lib\arm64-v8a 226 | 1 227 | 228 | 229 | 230 | 231 | library\lib\armeabi-v7a 232 | 1 233 | 234 | 235 | 236 | 237 | res\drawable 238 | 1 239 | 240 | 241 | res\drawable 242 | 1 243 | 244 | 245 | 246 | 247 | res\values 248 | 1 249 | 250 | 251 | res\values 252 | 1 253 | 254 | 255 | 256 | 257 | res\values-v21 258 | 1 259 | 260 | 261 | res\values-v21 262 | 1 263 | 264 | 265 | 266 | 267 | res\values 268 | 1 269 | 270 | 271 | res\values 272 | 1 273 | 274 | 275 | 276 | 277 | res\drawable 278 | 1 279 | 280 | 281 | res\drawable 282 | 1 283 | 284 | 285 | 286 | 287 | res\drawable-xxhdpi 288 | 1 289 | 290 | 291 | res\drawable-xxhdpi 292 | 1 293 | 294 | 295 | 296 | 297 | res\drawable-xxxhdpi 298 | 1 299 | 300 | 301 | res\drawable-xxxhdpi 302 | 1 303 | 304 | 305 | 306 | 307 | res\drawable-ldpi 308 | 1 309 | 310 | 311 | res\drawable-ldpi 312 | 1 313 | 314 | 315 | 316 | 317 | res\drawable-mdpi 318 | 1 319 | 320 | 321 | res\drawable-mdpi 322 | 1 323 | 324 | 325 | 326 | 327 | res\drawable-hdpi 328 | 1 329 | 330 | 331 | res\drawable-hdpi 332 | 1 333 | 334 | 335 | 336 | 337 | res\drawable-xhdpi 338 | 1 339 | 340 | 341 | res\drawable-xhdpi 342 | 1 343 | 344 | 345 | 346 | 347 | res\drawable-mdpi 348 | 1 349 | 350 | 351 | res\drawable-mdpi 352 | 1 353 | 354 | 355 | 356 | 357 | res\drawable-hdpi 358 | 1 359 | 360 | 361 | res\drawable-hdpi 362 | 1 363 | 364 | 365 | 366 | 367 | res\drawable-xhdpi 368 | 1 369 | 370 | 371 | res\drawable-xhdpi 372 | 1 373 | 374 | 375 | 376 | 377 | res\drawable-xxhdpi 378 | 1 379 | 380 | 381 | res\drawable-xxhdpi 382 | 1 383 | 384 | 385 | 386 | 387 | res\drawable-xxxhdpi 388 | 1 389 | 390 | 391 | res\drawable-xxxhdpi 392 | 1 393 | 394 | 395 | 396 | 397 | res\drawable-small 398 | 1 399 | 400 | 401 | res\drawable-small 402 | 1 403 | 404 | 405 | 406 | 407 | res\drawable-normal 408 | 1 409 | 410 | 411 | res\drawable-normal 412 | 1 413 | 414 | 415 | 416 | 417 | res\drawable-large 418 | 1 419 | 420 | 421 | res\drawable-large 422 | 1 423 | 424 | 425 | 426 | 427 | res\drawable-xlarge 428 | 1 429 | 430 | 431 | res\drawable-xlarge 432 | 1 433 | 434 | 435 | 436 | 437 | res\values 438 | 1 439 | 440 | 441 | res\values 442 | 1 443 | 444 | 445 | 446 | 447 | 1 448 | 449 | 450 | 1 451 | 452 | 453 | 0 454 | 455 | 456 | 457 | 458 | 1 459 | .framework 460 | 461 | 462 | 1 463 | .framework 464 | 465 | 466 | 0 467 | 468 | 469 | 470 | 471 | 1 472 | .dylib 473 | 474 | 475 | 1 476 | .dylib 477 | 478 | 479 | 0 480 | .dll;.bpl 481 | 482 | 483 | 484 | 485 | 1 486 | .dylib 487 | 488 | 489 | 1 490 | .dylib 491 | 492 | 493 | 1 494 | .dylib 495 | 496 | 497 | 1 498 | .dylib 499 | 500 | 501 | 1 502 | .dylib 503 | 504 | 505 | 0 506 | .bpl 507 | 508 | 509 | 510 | 511 | 0 512 | 513 | 514 | 0 515 | 516 | 517 | 0 518 | 519 | 520 | 0 521 | 522 | 523 | 0 524 | 525 | 526 | 0 527 | 528 | 529 | 0 530 | 531 | 532 | 0 533 | 534 | 535 | 536 | 537 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 538 | 1 539 | 540 | 541 | 542 | 543 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 544 | 1 545 | 546 | 547 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 548 | 1 549 | 550 | 551 | 552 | 553 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 554 | 1 555 | 556 | 557 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 558 | 1 559 | 560 | 561 | 562 | 563 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 564 | 1 565 | 566 | 567 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 568 | 1 569 | 570 | 571 | 572 | 573 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 574 | 1 575 | 576 | 577 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 578 | 1 579 | 580 | 581 | 582 | 583 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 584 | 1 585 | 586 | 587 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 588 | 1 589 | 590 | 591 | 592 | 593 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 594 | 1 595 | 596 | 597 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 598 | 1 599 | 600 | 601 | 602 | 603 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 604 | 1 605 | 606 | 607 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 608 | 1 609 | 610 | 611 | 612 | 613 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 614 | 1 615 | 616 | 617 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 618 | 1 619 | 620 | 621 | 622 | 623 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 624 | 1 625 | 626 | 627 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 628 | 1 629 | 630 | 631 | 632 | 633 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 634 | 1 635 | 636 | 637 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 638 | 1 639 | 640 | 641 | 642 | 643 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 644 | 1 645 | 646 | 647 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 648 | 1 649 | 650 | 651 | 652 | 653 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 654 | 1 655 | 656 | 657 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 658 | 1 659 | 660 | 661 | 662 | 663 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 664 | 1 665 | 666 | 667 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 668 | 1 669 | 670 | 671 | 672 | 673 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 674 | 1 675 | 676 | 677 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 678 | 1 679 | 680 | 681 | 682 | 683 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 684 | 1 685 | 686 | 687 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 688 | 1 689 | 690 | 691 | 692 | 693 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 694 | 1 695 | 696 | 697 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 698 | 1 699 | 700 | 701 | 702 | 703 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 704 | 1 705 | 706 | 707 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 708 | 1 709 | 710 | 711 | 712 | 713 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 714 | 1 715 | 716 | 717 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 718 | 1 719 | 720 | 721 | 722 | 723 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 724 | 1 725 | 726 | 727 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 728 | 1 729 | 730 | 731 | 732 | 733 | 1 734 | 735 | 736 | 1 737 | 738 | 739 | 740 | 741 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 742 | 1 743 | 744 | 745 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 746 | 1 747 | 748 | 749 | 750 | 751 | 752 | 753 | 754 | 1 755 | 756 | 757 | 1 758 | 759 | 760 | 1 761 | 762 | 763 | 764 | 765 | 766 | 767 | 768 | Contents\Resources 769 | 1 770 | 771 | 772 | Contents\Resources 773 | 1 774 | 775 | 776 | 777 | 778 | library\lib\armeabi-v7a 779 | 1 780 | 781 | 782 | library\lib\arm64-v8a 783 | 1 784 | 785 | 786 | 1 787 | 788 | 789 | 1 790 | 791 | 792 | 1 793 | 794 | 795 | 1 796 | 797 | 798 | 1 799 | 800 | 801 | 1 802 | 803 | 804 | 0 805 | 806 | 807 | 808 | 809 | library\lib\armeabi-v7a 810 | 1 811 | 812 | 813 | 814 | 815 | 1 816 | 817 | 818 | 1 819 | 820 | 821 | 822 | 823 | Assets 824 | 1 825 | 826 | 827 | Assets 828 | 1 829 | 830 | 831 | 832 | 833 | Assets 834 | 1 835 | 836 | 837 | Assets 838 | 1 839 | 840 | 841 | 842 | 843 | 844 | 845 | 846 | 847 | 848 | 849 | 850 | 851 | 852 | 853 | True 854 | True 855 | 856 | 857 | 12 858 | 859 | 860 | 861 | 862 | 863 | -------------------------------------------------------------------------------- /Etc/VDEtc.dproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | {3F5A3230-5D97-4EC9-92F0-BB0E911F3B9B} 4 | VDEtc.dpk 5 | 19.2 6 | None 7 | True 8 | Release 9 | Win32 10 | 3 11 | Package 12 | 13 | 14 | true 15 | 16 | 17 | true 18 | Base 19 | true 20 | 21 | 22 | true 23 | Base 24 | true 25 | 26 | 27 | true 28 | Base 29 | true 30 | 31 | 32 | true 33 | Cfg_1 34 | true 35 | true 36 | 37 | 38 | true 39 | Base 40 | true 41 | 42 | 43 | true 44 | Cfg_2 45 | true 46 | true 47 | 48 | 49 | true 50 | Cfg_2 51 | true 52 | true 53 | 54 | 55 | $(BDSCOMMONDIR)\DCU\$(Platform) 56 | .\$(Platform)\$(Config) 57 | false 58 | false 59 | false 60 | false 61 | false 62 | true 63 | true 64 | System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) 65 | All 66 | VDEtc 67 | 1033 68 | CompanyName=VyDev Software;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=Etc;LegalCopyright=© 2021 Milan Vydareny VyDev Software;LegalTrademarks=;OriginalFilename=;ProgramID=com.VyDevSoft.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 69 | Program Constants Used By Several Other Components 70 | true 71 | true 72 | $(Auto) 73 | true 74 | true 75 | 76 | 77 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) 78 | Debug 79 | true 80 | CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 81 | 1033 82 | 83 | 84 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) 85 | Debug 86 | true 87 | CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 88 | 1033 89 | 90 | 91 | DEBUG;$(DCC_Define) 92 | true 93 | false 94 | true 95 | true 96 | true 97 | 98 | 99 | false 100 | true 101 | 1033 102 | 103 | 104 | false 105 | RELEASE;$(DCC_Define) 106 | 0 107 | 0 108 | 109 | 110 | 5 111 | CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.5;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 112 | 113 | 114 | 4 115 | CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.4;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 116 | 117 | 118 | 119 | MainSource 120 | 121 | 122 | 123 | 124 | Cfg_2 125 | Base 126 | 127 | 128 | Base 129 | 130 | 131 | Cfg_1 132 | Base 133 | 134 | 135 | 136 | Delphi.Personality.12 137 | Package 138 | 139 | 140 | 141 | VDEtc.dpk 142 | 143 | 144 | Microsoft Office 2000 Sample Automation Server Wrapper Components 145 | Microsoft Office XP Sample Automation Server Wrapper Components 146 | 147 | 148 | 149 | 150 | 151 | true 152 | 153 | 154 | 155 | 156 | true 157 | 158 | 159 | 160 | 161 | true 162 | 163 | 164 | 165 | 166 | VDEtc.bpl 167 | true 168 | 169 | 170 | 171 | 172 | 1 173 | 174 | 175 | 0 176 | 177 | 178 | 179 | 180 | classes 181 | 1 182 | 183 | 184 | classes 185 | 1 186 | 187 | 188 | 189 | 190 | res\xml 191 | 1 192 | 193 | 194 | res\xml 195 | 1 196 | 197 | 198 | 199 | 200 | library\lib\armeabi-v7a 201 | 1 202 | 203 | 204 | 205 | 206 | library\lib\armeabi 207 | 1 208 | 209 | 210 | library\lib\armeabi 211 | 1 212 | 213 | 214 | 215 | 216 | library\lib\armeabi-v7a 217 | 1 218 | 219 | 220 | 221 | 222 | library\lib\mips 223 | 1 224 | 225 | 226 | library\lib\mips 227 | 1 228 | 229 | 230 | 231 | 232 | library\lib\armeabi-v7a 233 | 1 234 | 235 | 236 | library\lib\arm64-v8a 237 | 1 238 | 239 | 240 | 241 | 242 | library\lib\armeabi-v7a 243 | 1 244 | 245 | 246 | 247 | 248 | res\drawable 249 | 1 250 | 251 | 252 | res\drawable 253 | 1 254 | 255 | 256 | 257 | 258 | res\values 259 | 1 260 | 261 | 262 | res\values 263 | 1 264 | 265 | 266 | 267 | 268 | res\values-v21 269 | 1 270 | 271 | 272 | res\values-v21 273 | 1 274 | 275 | 276 | 277 | 278 | res\values 279 | 1 280 | 281 | 282 | res\values 283 | 1 284 | 285 | 286 | 287 | 288 | res\drawable 289 | 1 290 | 291 | 292 | res\drawable 293 | 1 294 | 295 | 296 | 297 | 298 | res\drawable-xxhdpi 299 | 1 300 | 301 | 302 | res\drawable-xxhdpi 303 | 1 304 | 305 | 306 | 307 | 308 | res\drawable-xxxhdpi 309 | 1 310 | 311 | 312 | res\drawable-xxxhdpi 313 | 1 314 | 315 | 316 | 317 | 318 | res\drawable-ldpi 319 | 1 320 | 321 | 322 | res\drawable-ldpi 323 | 1 324 | 325 | 326 | 327 | 328 | res\drawable-mdpi 329 | 1 330 | 331 | 332 | res\drawable-mdpi 333 | 1 334 | 335 | 336 | 337 | 338 | res\drawable-hdpi 339 | 1 340 | 341 | 342 | res\drawable-hdpi 343 | 1 344 | 345 | 346 | 347 | 348 | res\drawable-xhdpi 349 | 1 350 | 351 | 352 | res\drawable-xhdpi 353 | 1 354 | 355 | 356 | 357 | 358 | res\drawable-mdpi 359 | 1 360 | 361 | 362 | res\drawable-mdpi 363 | 1 364 | 365 | 366 | 367 | 368 | res\drawable-hdpi 369 | 1 370 | 371 | 372 | res\drawable-hdpi 373 | 1 374 | 375 | 376 | 377 | 378 | res\drawable-xhdpi 379 | 1 380 | 381 | 382 | res\drawable-xhdpi 383 | 1 384 | 385 | 386 | 387 | 388 | res\drawable-xxhdpi 389 | 1 390 | 391 | 392 | res\drawable-xxhdpi 393 | 1 394 | 395 | 396 | 397 | 398 | res\drawable-xxxhdpi 399 | 1 400 | 401 | 402 | res\drawable-xxxhdpi 403 | 1 404 | 405 | 406 | 407 | 408 | res\drawable-small 409 | 1 410 | 411 | 412 | res\drawable-small 413 | 1 414 | 415 | 416 | 417 | 418 | res\drawable-normal 419 | 1 420 | 421 | 422 | res\drawable-normal 423 | 1 424 | 425 | 426 | 427 | 428 | res\drawable-large 429 | 1 430 | 431 | 432 | res\drawable-large 433 | 1 434 | 435 | 436 | 437 | 438 | res\drawable-xlarge 439 | 1 440 | 441 | 442 | res\drawable-xlarge 443 | 1 444 | 445 | 446 | 447 | 448 | res\values 449 | 1 450 | 451 | 452 | res\values 453 | 1 454 | 455 | 456 | 457 | 458 | 1 459 | 460 | 461 | 1 462 | 463 | 464 | 0 465 | 466 | 467 | 468 | 469 | 1 470 | .framework 471 | 472 | 473 | 1 474 | .framework 475 | 476 | 477 | 0 478 | 479 | 480 | 481 | 482 | 1 483 | .dylib 484 | 485 | 486 | 1 487 | .dylib 488 | 489 | 490 | 0 491 | .dll;.bpl 492 | 493 | 494 | 495 | 496 | 1 497 | .dylib 498 | 499 | 500 | 1 501 | .dylib 502 | 503 | 504 | 1 505 | .dylib 506 | 507 | 508 | 1 509 | .dylib 510 | 511 | 512 | 1 513 | .dylib 514 | 515 | 516 | 0 517 | .bpl 518 | 519 | 520 | 521 | 522 | 0 523 | 524 | 525 | 0 526 | 527 | 528 | 0 529 | 530 | 531 | 0 532 | 533 | 534 | 0 535 | 536 | 537 | 0 538 | 539 | 540 | 0 541 | 542 | 543 | 0 544 | 545 | 546 | 547 | 548 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 549 | 1 550 | 551 | 552 | 553 | 554 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 555 | 1 556 | 557 | 558 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 559 | 1 560 | 561 | 562 | 563 | 564 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 565 | 1 566 | 567 | 568 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 569 | 1 570 | 571 | 572 | 573 | 574 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 575 | 1 576 | 577 | 578 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 579 | 1 580 | 581 | 582 | 583 | 584 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 585 | 1 586 | 587 | 588 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 589 | 1 590 | 591 | 592 | 593 | 594 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 595 | 1 596 | 597 | 598 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 599 | 1 600 | 601 | 602 | 603 | 604 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 605 | 1 606 | 607 | 608 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 609 | 1 610 | 611 | 612 | 613 | 614 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 615 | 1 616 | 617 | 618 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 619 | 1 620 | 621 | 622 | 623 | 624 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 625 | 1 626 | 627 | 628 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 629 | 1 630 | 631 | 632 | 633 | 634 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 635 | 1 636 | 637 | 638 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 639 | 1 640 | 641 | 642 | 643 | 644 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 645 | 1 646 | 647 | 648 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 649 | 1 650 | 651 | 652 | 653 | 654 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 655 | 1 656 | 657 | 658 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 659 | 1 660 | 661 | 662 | 663 | 664 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 665 | 1 666 | 667 | 668 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 669 | 1 670 | 671 | 672 | 673 | 674 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 675 | 1 676 | 677 | 678 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 679 | 1 680 | 681 | 682 | 683 | 684 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 685 | 1 686 | 687 | 688 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 689 | 1 690 | 691 | 692 | 693 | 694 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 695 | 1 696 | 697 | 698 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 699 | 1 700 | 701 | 702 | 703 | 704 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 705 | 1 706 | 707 | 708 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 709 | 1 710 | 711 | 712 | 713 | 714 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 715 | 1 716 | 717 | 718 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 719 | 1 720 | 721 | 722 | 723 | 724 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 725 | 1 726 | 727 | 728 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 729 | 1 730 | 731 | 732 | 733 | 734 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 735 | 1 736 | 737 | 738 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 739 | 1 740 | 741 | 742 | 743 | 744 | 1 745 | 746 | 747 | 1 748 | 749 | 750 | 751 | 752 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 753 | 1 754 | 755 | 756 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 757 | 1 758 | 759 | 760 | 761 | 762 | 763 | 764 | 765 | 1 766 | 767 | 768 | 1 769 | 770 | 771 | 1 772 | 773 | 774 | 775 | 776 | 777 | 778 | 779 | Contents\Resources 780 | 1 781 | 782 | 783 | Contents\Resources 784 | 1 785 | 786 | 787 | 788 | 789 | library\lib\armeabi-v7a 790 | 1 791 | 792 | 793 | library\lib\arm64-v8a 794 | 1 795 | 796 | 797 | 1 798 | 799 | 800 | 1 801 | 802 | 803 | 1 804 | 805 | 806 | 1 807 | 808 | 809 | 1 810 | 811 | 812 | 1 813 | 814 | 815 | 0 816 | 817 | 818 | 819 | 820 | library\lib\armeabi-v7a 821 | 1 822 | 823 | 824 | 825 | 826 | 1 827 | 828 | 829 | 1 830 | 831 | 832 | 833 | 834 | Assets 835 | 1 836 | 837 | 838 | Assets 839 | 1 840 | 841 | 842 | 843 | 844 | Assets 845 | 1 846 | 847 | 848 | Assets 849 | 1 850 | 851 | 852 | 853 | 854 | 855 | 856 | 857 | 858 | 859 | 860 | 861 | 862 | 863 | 864 | True 865 | True 866 | 867 | 868 | 12 869 | 870 | 871 | 872 | 873 | 874 | --------------------------------------------------------------------------------