├── 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 |
--------------------------------------------------------------------------------