From 32fd704d83897b77d4e1e304c7c459198e645dac Mon Sep 17 00:00:00 2001 From: Daniele Teti Date: Mon, 25 May 2020 15:12:46 +0200 Subject: [PATCH] New version of MVCFramework.Console.pas with the New Sample --- packages/d104/dmvcframeworkDT.dpk | 58 + packages/d104/dmvcframeworkDT.dproj | 1072 ++++++++++++++++ packages/d104/dmvcframeworkRT.dpk | 142 +++ packages/d104/dmvcframeworkRT.dproj | 1125 +++++++++++++++++ packages/d104/dmvcframework_group.groupproj | 60 + samples/consolesample/ConsoleSample.dpr | 55 + samples/consolesample/ConsoleSample.dproj | 772 +++++++++++ sources/MVCFramework.Console.pas | 263 +++- .../general/Several/DMVCFrameworkTests.dproj | 63 +- .../general/Several/DMVCFrameworkTests.res | Bin 57140 -> 109732 bytes unittests/general/TestServer/TestServer.dpr | 49 +- unittests/general/TestServer/TestServer.dproj | 61 +- 12 files changed, 3566 insertions(+), 154 deletions(-) create mode 100644 packages/d104/dmvcframeworkDT.dpk create mode 100644 packages/d104/dmvcframeworkDT.dproj create mode 100644 packages/d104/dmvcframeworkRT.dpk create mode 100644 packages/d104/dmvcframeworkRT.dproj create mode 100644 packages/d104/dmvcframework_group.groupproj create mode 100644 samples/consolesample/ConsoleSample.dpr create mode 100644 samples/consolesample/ConsoleSample.dproj diff --git a/packages/d104/dmvcframeworkDT.dpk b/packages/d104/dmvcframeworkDT.dpk new file mode 100644 index 00000000..5937ca01 --- /dev/null +++ b/packages/d104/dmvcframeworkDT.dpk @@ -0,0 +1,58 @@ +package dmvcframeworkDT; + +{$R *.res} +{$R *.dres} +{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION OFF} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES ON} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DEFINE DEBUG} +{$ENDIF IMPLICITBUILDING} +{$DESCRIPTION 'DelphiMVCFramework IDE Expert'} +{$LIBSUFFIX '104'} +{$IMPLICITBUILD ON} + +requires + rtl, + designide, + ExpertsCreators, + IndySystem, + IndyProtocols, + IndyCore, + dbrtl, + dmvcframeworkRT; + +contains + DMVC.Expert.CodeGen.NewControllerUnit in '..\..\ideexpert\DMVC.Expert.CodeGen.NewControllerUnit.pas', + DMVC.Expert.CodeGen.NewDMVCProject in '..\..\ideexpert\DMVC.Expert.CodeGen.NewDMVCProject.pas', + DMVC.Expert.CodeGen.NewProject in '..\..\ideexpert\DMVC.Expert.CodeGen.NewProject.pas', + DMVC.Expert.CodeGen.NewUnit in '..\..\ideexpert\DMVC.Expert.CodeGen.NewUnit.pas', + DMVC.Expert.CodeGen.NewWebModuleUnit in '..\..\ideexpert\DMVC.Expert.CodeGen.NewWebModuleUnit.pas', + DMVC.Expert.CodeGen.SourceFile in '..\..\ideexpert\DMVC.Expert.CodeGen.SourceFile.pas', + DMVC.Expert.CodeGen.Templates in '..\..\ideexpert\DMVC.Expert.CodeGen.Templates.pas', + DMVC.Expert.Forms.NewProjectWizard in '..\..\ideexpert\DMVC.Expert.Forms.NewProjectWizard.pas' {frmDMVCNewProject}, + DMVC.Expert.Forms.NewUnitWizard in '..\..\ideexpert\DMVC.Expert.Forms.NewUnitWizard.pas' {frmDMVCNewUnit}, + DMVC.Expert.NewUnitWizardEx in '..\..\ideexpert\DMVC.Expert.NewUnitWizardEx.pas', + DMVC.Expert.ProjectWizardEx in '..\..\ideexpert\DMVC.Expert.ProjectWizardEx.pas', + DMVC.Expert.Registration in '..\..\ideexpert\DMVC.Expert.Registration.pas', + DMVC.Splash.Registration in '..\..\ideexpert\DMVC.Splash.Registration.pas'; + +end. diff --git a/packages/d104/dmvcframeworkDT.dproj b/packages/d104/dmvcframeworkDT.dproj new file mode 100644 index 00000000..3656ed90 --- /dev/null +++ b/packages/d104/dmvcframeworkDT.dproj @@ -0,0 +1,1072 @@ + + + {84344511-1DC2-41BA-8689-9F36C1D475BE} + dmvcframeworkDT.dpk + 19.0 + None + True + Debug + Win32 + 1 + Package + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + .\$(Platform)\$(Config) + .\$(Platform)\$(Config) + false + false + false + false + false + true + true + System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) + All + dmvcframeworkDT + 1040 + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + DelphiMVCFramework IDE Expert + + + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + true + 1033 + rtl;IndySystem;IndyProtocols;IndyCore;dbrtl;dmvcframeworkRT;$(DCC_UsePackage) + ..\..\sources;$(DCC_UnitSearchPath) + + + rtl;IndySystem;IndyProtocols;IndyCore;dbrtl;$(DCC_UsePackage) + + + DEBUG;$(DCC_Define) + true + false + true + true + true + + + false + true + 1033 + 104 + false + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + true + 1033 + + + + MainSource + + + + + + + + + + + + + + + + + +
frmDMVCNewProject
+
+ +
frmDMVCNewUnit
+
+ + + + + + ICON + DMVCNewProjectIcon + + + ICON + DMVCNewUnitIcon + + + BITMAP + SplashScreen + + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + +
+ + Delphi.Personality.12 + Package + + + + dmvcframeworkDT.dpk + + + Embarcadero C++Builder Office 2000 Servers Package + Embarcadero C++Builder Office XP Servers Package + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + + + + + + true + + + + + dmvcframeworkDT.bpl + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + 1 + + + 0 + + + + + classes + 1 + + + classes + 1 + + + + + res\xml + 1 + + + res\xml + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\armeabi + 1 + + + library\lib\armeabi + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\mips + 1 + + + library\lib\mips + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-v21 + 1 + + + res\values-v21 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-ldpi + 1 + + + res\drawable-ldpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-small + 1 + + + res\drawable-small + 1 + + + + + res\drawable-normal + 1 + + + res\drawable-normal + 1 + + + + + res\drawable-large + 1 + + + res\drawable-large + 1 + + + + + res\drawable-xlarge + 1 + + + res\drawable-xlarge + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + 1 + + + 1 + + + 0 + + + + + 1 + .framework + + + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 1 + .dylib + + + 0 + .dll;.bpl + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + + + + + 1 + + + 1 + + + 1 + + + + + + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 0 + + + + + library\lib\armeabi-v7a + 1 + + + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + + + + + + + + + + + True + False + + + 12 + + + + +
diff --git a/packages/d104/dmvcframeworkRT.dpk b/packages/d104/dmvcframeworkRT.dpk new file mode 100644 index 00000000..af6399a8 --- /dev/null +++ b/packages/d104/dmvcframeworkRT.dpk @@ -0,0 +1,142 @@ +package dmvcframeworkRT; + +{$R *.res} +{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION OFF} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES ON} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DEFINE DEBUG} +{$ENDIF IMPLICITBUILDING} +{$DESCRIPTION 'DMVCFramework 3.x'} +{$LIBSUFFIX '104'} +{$RUNONLY} +{$IMPLICITBUILD ON} + +requires + rtl, + inet, + dclcommon, + dcldb, + FireDAC, + IndyCore, + IndyProtocols, + FireDACIBDriver, + FireDACMySQLDriver, + loggerproRT, + FireDACPgDriver, + FireDACSqliteDriver; + +contains + Web.ApacheConst in 'c:\program files (x86)\embarcadero\studio\20.0\source\Internet\Web.ApacheConst.pas', + Web.Win.IsapiHTTP in 'c:\program files (x86)\embarcadero\studio\20.0\source\Internet\Web.Win.IsapiHTTP.pas', + Web.ApacheHTTP in 'c:\program files (x86)\embarcadero\studio\20.0\source\Internet\Web.ApacheHTTP.pas', + Web.HTTPDMethods in 'c:\program files (x86)\embarcadero\studio\20.0\source\Internet\Web.HTTPDMethods.pas', + Web.HTTPDImpl, + JsonDataObjects in '..\..\sources\JsonDataObjects.pas', + MVCFramework.ActiveRecord in '..\..\sources\MVCFramework.ActiveRecord.pas', + MVCFramework.ActiveRecordController in '..\..\sources\MVCFramework.ActiveRecordController.pas', + MVCFramework.ApplicationSession in '..\..\sources\MVCFramework.ApplicationSession.pas', + MVCFramework.Cache in '..\..\sources\MVCFramework.Cache.pas', + MVCFramework.Commons in '..\..\sources\MVCFramework.Commons.pas', + MVCFramework.Console in '..\..\sources\MVCFramework.Console.pas', + MVCFramework.DataSet.Utils in '..\..\sources\MVCFramework.DataSet.Utils.pas', + MVCFramework.DuckTyping in '..\..\sources\MVCFramework.DuckTyping.pas', + MVCFramework.FireDAC.Utils in '..\..\sources\MVCFramework.FireDAC.Utils.pas', + MVCFramework.HMAC in '..\..\sources\MVCFramework.HMAC.pas', + MVCFramework.JSONRPC.Client in '..\..\sources\MVCFramework.JSONRPC.Client.pas', + MVCFramework.JSONRPC in '..\..\sources\MVCFramework.JSONRPC.pas', + MVCFramework.JWT in '..\..\sources\MVCFramework.JWT.pas', + MVCFramework.Logger in '..\..\sources\MVCFramework.Logger.pas', + MVCFramework.Middleware.Analytics in '..\..\sources\MVCFramework.Middleware.Analytics.pas', + MVCFramework.Middleware.Authentication in '..\..\sources\MVCFramework.Middleware.Authentication.pas', + MVCFramework.Middleware.Authentication.RoleBasedAuthHandler in '..\..\sources\MVCFramework.Middleware.Authentication.RoleBasedAuthHandler.pas', + MVCFramework.Middleware.Compression in '..\..\sources\MVCFramework.Middleware.Compression.pas', + MVCFramework.Middleware.CORS in '..\..\sources\MVCFramework.Middleware.CORS.pas', + MVCFramework.Middleware.JWT in '..\..\sources\MVCFramework.Middleware.JWT.pas', + MVCFramework.Middleware.SecurityHeaders in '..\..\sources\MVCFramework.Middleware.SecurityHeaders.pas', + MVCFramework.MultiMap in '..\..\sources\MVCFramework.MultiMap.pas', + MVCFramework in '..\..\sources\MVCFramework.pas', + MVCFramework.Patches in '..\..\sources\MVCFramework.Patches.pas', + MVCFramework.RESTAdapter in '..\..\sources\MVCFramework.RESTAdapter.pas', + MVCFramework.RESTClient in '..\..\sources\MVCFramework.RESTClient.pas', + MVCFramework.Router in '..\..\sources\MVCFramework.Router.pas', + MVCFramework.RQL.AST2FirebirdSQL in '..\..\sources\MVCFramework.RQL.AST2FirebirdSQL.pas', + MVCFramework.RQL.AST2InterbaseSQL in '..\..\sources\MVCFramework.RQL.AST2InterbaseSQL.pas', + MVCFramework.RQL.AST2MySQL in '..\..\sources\MVCFramework.RQL.AST2MySQL.pas', + MVCFramework.RQL.AST2PostgreSQL in '..\..\sources\MVCFramework.RQL.AST2PostgreSQL.pas', + MVCFramework.RQL.AST2SQLite in '..\..\sources\MVCFramework.RQL.AST2SQLite.pas', + MVCFramework.RQL.Parser in '..\..\sources\MVCFramework.RQL.Parser.pas', + MVCFramework.Rtti.Utils in '..\..\sources\MVCFramework.Rtti.Utils.pas', + MVCFramework.Serializer.Abstract in '..\..\sources\MVCFramework.Serializer.Abstract.pas', + MVCFramework.Serializer.Commons in '..\..\sources\MVCFramework.Serializer.Commons.pas', + MVCFramework.Serializer.Defaults in '..\..\sources\MVCFramework.Serializer.Defaults.pas', + MVCFramework.Serializer.Intf in '..\..\sources\MVCFramework.Serializer.Intf.pas', + MVCFramework.Serializer.JsonDataObjects.CustomTypes in '..\..\sources\MVCFramework.Serializer.JsonDataObjects.CustomTypes.pas', + MVCFramework.Serializer.JsonDataObjects in '..\..\sources\MVCFramework.Serializer.JsonDataObjects.pas', + MVCFramework.Session in '..\..\sources\MVCFramework.Session.pas', + MVCFramework.SysControllers in '..\..\sources\MVCFramework.SysControllers.pas', + MVCFramework.SystemJSONUtils in '..\..\sources\MVCFramework.SystemJSONUtils.pas', + MVCFramework.View.Cache in '..\..\sources\MVCFramework.View.Cache.pas', + MVCFramework.Controllers.Register in '..\..\sources\MVCFramework.Controllers.Register.pas', + MVCFramework.SQLGenerators.Firebird in '..\..\sources\MVCFramework.SQLGenerators.Firebird.pas', + MVCFramework.SQLGenerators.Interbase in '..\..\sources\MVCFramework.SQLGenerators.Interbase.pas', + MVCFramework.SQLGenerators.MySQL in '..\..\sources\MVCFramework.SQLGenerators.MySQL.pas', + MVCFramework.SQLGenerators.PostgreSQL in '..\..\sources\MVCFramework.SQLGenerators.PostgreSQL.pas', + MVCFramework.SQLGenerators.Sqlite in '..\..\sources\MVCFramework.SQLGenerators.Sqlite.pas', + MVCFramework.Swagger.Commons in '..\..\sources\MVCFramework.Swagger.Commons.pas', + MVCFramework.Middleware.Swagger in '..\..\sources\MVCFramework.Middleware.Swagger.pas', + Json.Common.Helpers in '..\..\lib\swagdoc\Source\Json.Common.Helpers.pas', + Json.Schema.Common.Types in '..\..\lib\swagdoc\Source\Json.Schema.Common.Types.pas', + Json.Schema.Field.Arrays in '..\..\lib\swagdoc\Source\Json.Schema.Field.Arrays.pas', + Json.Schema.Field.Booleans in '..\..\lib\swagdoc\Source\Json.Schema.Field.Booleans.pas', + Json.Schema.Field.DateTimes in '..\..\lib\swagdoc\Source\Json.Schema.Field.DateTimes.pas', + Json.Schema.Field.Enums in '..\..\lib\swagdoc\Source\Json.Schema.Field.Enums.pas', + Json.Schema.Field.Numbers in '..\..\lib\swagdoc\Source\Json.Schema.Field.Numbers.pas', + Json.Schema.Field.Objects in '..\..\lib\swagdoc\Source\Json.Schema.Field.Objects.pas', + Json.Schema.Field in '..\..\lib\swagdoc\Source\Json.Schema.Field.pas', + Json.Schema.Field.Strings in '..\..\lib\swagdoc\Source\Json.Schema.Field.Strings.pas', + Json.Schema in '..\..\lib\swagdoc\Source\Json.Schema.pas', + Swag.Common.Consts in '..\..\lib\swagdoc\Source\Swag.Common.Consts.pas', + Swag.Common.Types.Helpers in '..\..\lib\swagdoc\Source\Swag.Common.Types.Helpers.pas', + Swag.Common.Types in '..\..\lib\swagdoc\Source\Swag.Common.Types.pas', + Swag.Doc.Definition in '..\..\lib\swagdoc\Source\Swag.Doc.Definition.pas', + Swag.Doc.FileLoader in '..\..\lib\swagdoc\Source\Swag.Doc.FileLoader.pas', + Swag.Doc.Info.Contact in '..\..\lib\swagdoc\Source\Swag.Doc.Info.Contact.pas', + Swag.Doc.Info.License in '..\..\lib\swagdoc\Source\Swag.Doc.Info.License.pas', + Swag.Doc.Info in '..\..\lib\swagdoc\Source\Swag.Doc.Info.pas', + Swag.Doc in '..\..\lib\swagdoc\Source\Swag.Doc.pas', + Swag.Doc.Path.Operation in '..\..\lib\swagdoc\Source\Swag.Doc.Path.Operation.pas', + Swag.Doc.Path.Operation.RequestParameter in '..\..\lib\swagdoc\Source\Swag.Doc.Path.Operation.RequestParameter.pas', + Swag.Doc.Path.Operation.Response in '..\..\lib\swagdoc\Source\Swag.Doc.Path.Operation.Response.pas', + Swag.Doc.Path.Operation.ResponseHeaders in '..\..\lib\swagdoc\Source\Swag.Doc.Path.Operation.ResponseHeaders.pas', + Swag.Doc.Path in '..\..\lib\swagdoc\Source\Swag.Doc.Path.pas', + Swag.Doc.SecurityDefinition in '..\..\lib\swagdoc\Source\Swag.Doc.SecurityDefinition.pas', + Swag.Doc.SecurityDefinitionApiKey in '..\..\lib\swagdoc\Source\Swag.Doc.SecurityDefinitionApiKey.pas', + Swag.Doc.SecurityDefinitionBasic in '..\..\lib\swagdoc\Source\Swag.Doc.SecurityDefinitionBasic.pas', + Swag.Doc.SecurityDefinitionOAuth2 in '..\..\lib\swagdoc\Source\Swag.Doc.SecurityDefinitionOAuth2.pas', + Swag.Doc.Tags in '..\..\lib\swagdoc\Source\Swag.Doc.Tags.pas', + MVCFramework.Middleware.Trace in '..\..\sources\MVCFramework.Middleware.Trace.pas', + MVCFramework.Nullables in '..\..\sources\MVCFramework.Nullables.pas'; + +end. + + + diff --git a/packages/d104/dmvcframeworkRT.dproj b/packages/d104/dmvcframeworkRT.dproj new file mode 100644 index 00000000..e01101c6 --- /dev/null +++ b/packages/d104/dmvcframeworkRT.dproj @@ -0,0 +1,1125 @@ + + + {96D17257-AF74-48CB-9893-7BCCB56A069D} + dmvcframeworkRT.dpk + 19.0 + None + True + Debug + Win32 + 1 + Package + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + .\$(Platform)\$(Config) + .\$(Platform)\$(Config) + false + false + false + false + false + true + true + System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) + All + dmvcframeworkRT + true + 1040 + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + DMVCFramework - CopyRight (2010-2020) Daniele Teti and the DMVCFramework Team + + + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + rtl;dbrtl;IndySystem;IndyProtocols;IndyCore;dmvcframeworkDT;$(DCC_UsePackage) + + + rtl;dbrtl;IndySystem;IndyProtocols;IndyCore;$(DCC_UsePackage) + + + DEBUG;$(DCC_Define) + true + false + true + true + true + + + true + 1033 + 3 + DMVCFramework 3.x + 104 + true + false + true + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + + MainSource + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + + + + Delphi.Personality.12 + Package + + + + dmvcframeworkRT.dpk + + + Embarcadero C++Builder Office 2000 Servers Package + Embarcadero C++Builder Office XP Servers Package + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + + + + + + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + dmvcframeworkRT.bpl + true + + + + + 1 + + + 0 + + + + + classes + 1 + + + classes + 1 + + + + + res\xml + 1 + + + res\xml + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\armeabi + 1 + + + library\lib\armeabi + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\mips + 1 + + + library\lib\mips + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-v21 + 1 + + + res\values-v21 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-ldpi + 1 + + + res\drawable-ldpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-small + 1 + + + res\drawable-small + 1 + + + + + res\drawable-normal + 1 + + + res\drawable-normal + 1 + + + + + res\drawable-large + 1 + + + res\drawable-large + 1 + + + + + res\drawable-xlarge + 1 + + + res\drawable-xlarge + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + 1 + + + 1 + + + 0 + + + + + 1 + .framework + + + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 1 + .dylib + + + 0 + .dll;.bpl + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + + + + + 1 + + + 1 + + + 1 + + + + + + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 0 + + + + + library\lib\armeabi-v7a + 1 + + + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + + + + + + + + + + + True + False + + + 12 + + + + + diff --git a/packages/d104/dmvcframework_group.groupproj b/packages/d104/dmvcframework_group.groupproj new file mode 100644 index 00000000..6615cd45 --- /dev/null +++ b/packages/d104/dmvcframework_group.groupproj @@ -0,0 +1,60 @@ + + + {EA879EE4-1245-4456-AED9-57FDF63577E6} + + + + + + + + + + + + + + Default.Personality.12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/samples/consolesample/ConsoleSample.dpr b/samples/consolesample/ConsoleSample.dpr new file mode 100644 index 00000000..6b2b7c29 --- /dev/null +++ b/samples/consolesample/ConsoleSample.dpr @@ -0,0 +1,55 @@ +program ConsoleSample; + +{$APPTYPE CONSOLE} +{$R *.res} + +uses + System.SysUtils, + System.TypInfo, + MVCFramework.Console; + +var + F, B, I: Integer; + lFGColorName, lBGColorName: String; + lSize: TMVCConsoleSize; + +begin + var c: Char := GetCh; + WriteLn('Hai premuto ', c); + readln; + try + for F := 0 to 15 do + begin + TextBackground(Black); + TextColor(TConsoleColor(F)); + lFGColorName := ColorName(TConsoleColor(F)); + WriteLn(''.PadLeft(40)); + WriteLn(('** TEST FOREGROUND COLOR: ' + lFGColorName + ' **').PadLeft(40)); + WriteLn(''.PadLeft(40)); + for B := 0 to 15 do + begin + lBGColorName := ColorName(TConsoleColor(B)); + TextBackground(TConsoleColor(B)); + WriteLn((lFGColorName + ' on ' + lBGColorName).PadLeft(40)); + end; + end; + readln; + ResetConsole; + ClrScr; + lSize := GetConsoleSize; + WriteLn(Format('Console Size: %d columns x %d rows', [lSize.Columns, lSize.Rows])); + lSize := GetConsoleBufferSize; + WriteLn(Format('Console Buffer Size: %d columns x %d rows', [lSize.Columns, lSize.Rows])); + readln; + GotoXY(0, 0); + Write('X'); + GotoXY(lSize.Columns - 1, lSize.Rows - 2); + Write('X'); + + except + on E: Exception do + WriteLn(E.ClassName, ': ', E.Message); + end; + readln; + +end. diff --git a/samples/consolesample/ConsoleSample.dproj b/samples/consolesample/ConsoleSample.dproj new file mode 100644 index 00000000..68504d2c --- /dev/null +++ b/samples/consolesample/ConsoleSample.dproj @@ -0,0 +1,772 @@ + + + {0773B622-EDC6-4AB9-B808-288CF5B5931C} + 19.0 + None + True + Debug + Win32 + 1 + Console + ConsoleSample.dpr + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + .\$(Platform)\$(Config) + .\$(Platform)\$(Config) + false + false + false + false + false + System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) + ConsoleSample + + + DBXSqliteDriver;RESTComponents;fmxase;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;bindcompvclsmp;emsclientfiredac;tethering;svnui;DataSnapFireDAC;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;svn;DBXOracleDriver;inetdb;emsedge;fmx;FireDACIBDriver;fmxdae;vcledge;FireDACDBXDriver;dbexpress;IndyCore;vclx;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;DataSnapConnectors;VCLRESTComponents;soapserver;vclie;bindengine;DBXMySQLDriver;CloudService;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;vcl;IndyIPServer;DBXSybaseASEDriver;IndySystem;FireDACDb2Driver;dsnapcon;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;FireDAC;emshosting;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;soaprtl;DbxCommonDriver;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;dmvcframeworkRT;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;dmvcframeworkDT;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;inetdbxpress;FireDACMongoDBDriver;DataSnapServerMidas;$(DCC_UsePackage) + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + true + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + + + DBXSqliteDriver;RESTComponents;fmxase;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;bindcompvclsmp;emsclientfiredac;tethering;DataSnapFireDAC;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;DBXOracleDriver;inetdb;emsedge;fmx;FireDACIBDriver;fmxdae;vcledge;FireDACDBXDriver;dbexpress;IndyCore;vclx;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;DataSnapConnectors;VCLRESTComponents;soapserver;vclie;bindengine;DBXMySQLDriver;CloudService;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;vcl;IndyIPServer;DBXSybaseASEDriver;IndySystem;FireDACDb2Driver;dsnapcon;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;FireDAC;emshosting;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;soaprtl;DbxCommonDriver;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;inetdbxpress;FireDACMongoDBDriver;DataSnapServerMidas;$(DCC_UsePackage) + true + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + + + DEBUG;$(DCC_Define) + true + false + true + true + true + + + false + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + + MainSource + + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + + + + Delphi.Personality.12 + Application + + + + ConsoleSample.dpr + + + + True + False + + + + + ConsoleSample.exe + true + + + + + true + + + + + true + + + + + true + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + classes + 1 + + + classes + 1 + + + + + res\xml + 1 + + + res\xml + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\armeabi + 1 + + + library\lib\armeabi + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\mips + 1 + + + library\lib\mips + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-v21 + 1 + + + res\values-v21 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-ldpi + 1 + + + res\drawable-ldpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-small + 1 + + + res\drawable-small + 1 + + + + + res\drawable-normal + 1 + + + res\drawable-normal + 1 + + + + + res\drawable-large + 1 + + + res\drawable-large + 1 + + + + + res\drawable-xlarge + 1 + + + res\drawable-xlarge + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + Contents\MacOS + 1 + .framework + + + Contents\MacOS + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + 0 + .dll;.bpl + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + Contents\Resources\StartUp\ + 0 + + + Contents\Resources\StartUp\ + 0 + + + 0 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + 1 + + + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).launchscreen + 64 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + + + Contents + 1 + + + Contents + 1 + + + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + Contents\MacOS + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + library\lib\armeabi-v7a + 1 + + + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + + + + + + + + + + + 12 + + + + + diff --git a/sources/MVCFramework.Console.pas b/sources/MVCFramework.Console.pas index d536aff0..15b5a938 100644 --- a/sources/MVCFramework.Console.pas +++ b/sources/MVCFramework.Console.pas @@ -26,118 +26,241 @@ unit MVCFramework.Console; interface +uses +{$IFDEF MSWINDOWS} + WinApi.Windows, System.SysUtils +{$ENDIF} +{$IFDEF LINUX} +{$ENDIF} + ; + type - TConsoleMode = (Normal, Bright); - TConsoleColor = (Black = 30, Red = 31, Green = 32, Yellow = 33, Blue = 34, Magenta = 35, Cyan = 36, White = 37); +{$IFDEF MSWINDOWS} + // https://stackoverflow.com/questions/17125440/c-win32-console-color + // https://docs.microsoft.com/en-us/dotnet/api/system.consolecolor?view=netcore-3.1 + TConsoleColor = (Black = 0, // The color black. + DarkBlue = 1, // The color dark blue. + DarkGreen = 2, // The color dark green. + DarkCyan = 3, // The color dark cyan (dark blue-green). + DarkRed = 4, // The color dark red. + DarkMagenta = 5, // The color dark magenta (dark purplish-red). + DarkYellow = 6, // The color dark yellow (ochre). + Gray = 7, // The color gray. + DarkGray = 8, // The color dark gray. + Blue = 9, // The color blue. + Green = 10, // The color green. + Cyan = 11, // The color Cyan(Blue - green). + Red = 12, // The color red. + Magenta = 13, // The color magenta (purplish-red). + Yellow = 14, // The color yellow. + White = 15 // The color white. + ); +{$ENDIF} + +type + EMVCConsole = class(Exception) + + end; + + TMVCConsoleSize = record + Columns: Word; + Rows: Word; + end; procedure ResetConsole; -procedure TextColor(const Color: TConsoleColor); -procedure TextBackground(const Color: TConsoleColor); -procedure SetMode(const ConsoleMode: TConsoleMode); +procedure TextColor(const color: TConsoleColor); +procedure TextBackground(const color: TConsoleColor); +procedure GotoXY(const X, Y: Byte); +function GetConsoleSize: TMVCConsoleSize; +function GetConsoleBufferSize: TMVCConsoleSize; +procedure ClrScr; +function GetCh: Char; + +function ColorName(const color: TConsoleColor): String; implementation uses - -{$IFDEF MSWINDOWS} - WinApi.Windows, - -{$ENDIF} - System.SysUtils; + System.TypInfo; const ESC = Chr(27); var - GForeGround: TConsoleColor; - GBackGround: TConsoleColor; - GMode: TConsoleMode = TConsoleMode.Normal; + GForeGround: Integer; + GBackGround: Integer; + GOutHandle: THandle = INVALID_HANDLE_VALUE; + GInputHandle: THandle = INVALID_HANDLE_VALUE; -function ToBackGround(const ForeGround: Byte): Byte; +function ColorName(const color: TConsoleColor): String; begin - if (GMode = TConsoleMode.Bright) and (ForeGround <> Byte(TConsoleColor.Black)) then - begin - Result := ForeGround + 10 + 60; - end - else - begin - Result := ForeGround + 10; - end; + Result := GetEnumName(TypeInfo(TConsoleColor), Ord(color)); end; {$IFDEF LINUX} - -procedure EnableVirtualTerminalProcessing; inline; +procedure Init; inline; begin - // do nothing + end; -{$ELSE} - -procedure EnableVirtualTerminalProcessing; inline; - -const - ENABLE_VIRTUAL_TERMINAL_PROCESSING = $0004; - -var - hOut: THandle; - dwMode: UInt32; +procedure UpdateMode; begin - hOut := GetStdHandle(STD_OUTPUT_HANDLE); - if hOut = INVALID_HANDLE_VALUE then - raise Exception.CreateFmt('GetLastError() = %d', [GetLastError]); - dwMode := 0; - if (not GetConsoleMode(hOut, &dwMode)) then - raise Exception.CreateFmt('GetLastError() = %d', [GetLastError]); +end; - dwMode := dwMode or ENABLE_VIRTUAL_TERMINAL_PROCESSING; - if (not SetConsoleMode(hOut, dwMode)) then - raise Exception.CreateFmt('GetLastError() = %d', [GetLastError]); +function GetConsoleSize: TMVCConsoleSize; +begin + raise EMVCConsole.Create('Not Implemented'); +end; + +function GetConsoleBufferSize: TMVCConsoleSize; +begin + raise EMVCConsole.Create('Not Implemented'); +end; + +procedure ClrScr; +begin + raise EMVCConsole.Create('Not Implemented'); +end; + +{$ENDIF} +{$IFDEF MSWINDOWS} + +procedure ClrScr; +var + lSize: TMVCConsoleSize; + dwConSize: UInt32; + lStartCoord: _COORD; + lCharsWritten: UInt32; + lConsoleScreenBufferInfo: _CONSOLE_SCREEN_BUFFER_INFO; +begin + // https://docs.microsoft.com/en-us/windows/console/clearing-the-screen + lSize := GetConsoleBufferSize; + dwConSize := lSize.Columns * lSize.Rows; + lStartCoord.X := 0; + lStartCoord.Y := 0; + if not FillConsoleOutputCharacter(GOutHandle, ' ', dwConSize, lStartCoord, lCharsWritten) then + raise EMVCConsole.CreateFmt('Cannot fill console with blank char - GetLastError() = %d', [GetLastError]); + + if not GetConsoleScreenBufferInfo(GOutHandle, lConsoleScreenBufferInfo) then + raise EMVCConsole.CreateFmt('Cannot GetConsoleScreenBufferInfo - GetLastError() = %d', [GetLastError]); + + if not FillConsoleOutputAttribute(GOutHandle, lConsoleScreenBufferInfo.wAttributes, dwConSize, lStartCoord, + lCharsWritten) then + raise EMVCConsole.CreateFmt('Cannot FillConsoleOutputAttribute - GetLastError() = %d', [GetLastError]); + + GotoXY(0, 0); +end; + +function GetConsoleSize: TMVCConsoleSize; +var + lConsoleScreenBufferInfo: _CONSOLE_SCREEN_BUFFER_INFO; +begin + if not GetConsoleScreenBufferInfo(GOutHandle, lConsoleScreenBufferInfo) then + raise EMVCConsole.CreateFmt('Cannot Get Console Size - GetLastError() = %d', [GetLastError]); + Result.Columns := lConsoleScreenBufferInfo.srWindow.Right - lConsoleScreenBufferInfo.srWindow.Left + 1; + Result.Rows := lConsoleScreenBufferInfo.srWindow.Bottom - lConsoleScreenBufferInfo.srWindow.Top + 1; +end; + +procedure EnsureStdInput; +begin + if GInputHandle = INVALID_HANDLE_VALUE then + begin + GInputHandle := GetStdHandle(STD_INPUT_HANDLE); + if GInputHandle = INVALID_HANDLE_VALUE then + begin + raise EMVCConsole.CreateFmt('Cannot Get STD_INPUT_HANDLE - GetLastError() = %d', [GetLastError]); + end; + end; +end; + +function GetCh: Char; +var + lMode, lCC: DWORD; + C: Char; +begin + EnsureStdInput; + C := #0; + Win32Check(GetConsoleMode(GInputHandle, lMode)); + Win32Check(SetConsoleMode(GInputHandle, lMode and (not(ENABLE_LINE_INPUT or ENABLE_ECHO_INPUT)))); + try + lCC := 0; + Win32Check(ReadConsole(GInputHandle, @C, SizeOf(Char), lCC, nil)); + finally + Win32Check(SetConsoleMode(GInputHandle, lMode)); + end; + Result := C; +end; + +function GetConsoleBufferSize: TMVCConsoleSize; +var + lConsoleScreenBufferInfo: _CONSOLE_SCREEN_BUFFER_INFO; +begin + if not GetConsoleScreenBufferInfo(GOutHandle, lConsoleScreenBufferInfo) then + raise EMVCConsole.CreateFmt('Cannot Get Console Buffer Size - GetLastError() = %d', [GetLastError]); + Result.Columns := lConsoleScreenBufferInfo.dwSize.X; + Result.Rows := lConsoleScreenBufferInfo.dwSize.Y; +end; + +procedure Init; inline; +begin + GOutHandle := GetStdHandle(STD_OUTPUT_HANDLE); + if GOutHandle = INVALID_HANDLE_VALUE then + raise EMVCConsole.CreateFmt('Cannot Get STD_OUTPUT_HANDLE - GetLastError() = %d', [GetLastError]); +end; + +procedure UpdateMode; +begin + SetConsoleTextAttribute(GOutHandle, Ord(GForeGround) or Ord(GBackGround)); +end; + +procedure GotoXY(const X, Y: Byte); +var + lCoord: _COORD; +begin + lCoord.X := X; + lCoord.Y := Y; + if not SetConsoleCursorPosition(GOutHandle, lCoord) then + begin + raise EMVCConsole.Create('Invalid Coordinates'); + end; end; {$ENDIF} procedure ResetConsole; begin - write(ESC + '[0m'); + // write(ESC + '[0m'); + GForeGround := Ord(TConsoleColor.DarkGray); + GBackGround := Ord(TConsoleColor.Black); + UpdateMode; end; -function GetColorString: string; +procedure TextColor(const color: TConsoleColor); begin - if GMode = TConsoleMode.Bright then - Result := Format('[%d;1;%dm', [Byte(GForeGround), ToBackGround(Byte(GBackGround))]) - else - Result := Format('[%d;%dm', [Byte(GForeGround), ToBackGround(Byte(GBackGround))]); + GForeGround := Ord(color); + UpdateMode; + // write(ESC + GetColorString); end; -procedure TextColor(const Color: TConsoleColor); +procedure TextBackground(const color: TConsoleColor); begin - GForeGround := Color; - write(ESC + GetColorString); + GBackGround := Ord(color) shl 4; + UpdateMode; + // write(ESC + GetColorString); end; -procedure TextBackground(const Color: TConsoleColor); +procedure SetDefaults; begin - GBackGround := Color; - write(ESC + GetColorString); -end; - -procedure SetMode(const ConsoleMode: TConsoleMode); -begin - GMode := ConsoleMode; -end; - -procedure InitDefault; -begin - GForeGround := TConsoleColor.White; - GBackGround := TConsoleColor.Black; + GForeGround := Ord(TConsoleColor.White); + GBackGround := Ord(TConsoleColor.Black); + UpdateMode; end; initialization -EnableVirtualTerminalProcessing; -InitDefault; +Init; +SetDefaults; finalization diff --git a/unittests/general/Several/DMVCFrameworkTests.dproj b/unittests/general/Several/DMVCFrameworkTests.dproj index a3ea1c0e..7abdf646 100644 --- a/unittests/general/Several/DMVCFrameworkTests.dproj +++ b/unittests/general/Several/DMVCFrameworkTests.dproj @@ -1,7 +1,7 @@  {0582DE6A-D716-46D3-8CBD-84AD73A4B536} - 18.8 + 19.0 VCL True GUI @@ -818,6 +818,16 @@ 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + 1 @@ -837,6 +847,16 @@ 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + 1 @@ -936,6 +956,16 @@ 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + 1 @@ -947,6 +977,16 @@ 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + 1 @@ -991,6 +1031,26 @@ 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + 1 @@ -1013,6 +1073,7 @@ + 1 diff --git a/unittests/general/Several/DMVCFrameworkTests.res b/unittests/general/Several/DMVCFrameworkTests.res index 6876088a6648ed90b09c480197508e4404c57dbc..48f203c4a3f68f8df7c8a4f67ca1889069b7b898 100644 GIT binary patch literal 109732 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

B-#XG%bh)N?gxawfA-%;B>1=SY0-I@Lc% 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 I2>8kW0h0=QvH$=8 diff --git a/unittests/general/TestServer/TestServer.dpr b/unittests/general/TestServer/TestServer.dpr index 401a4fe8..330ce41b 100644 --- a/unittests/general/TestServer/TestServer.dpr +++ b/unittests/general/TestServer/TestServer.dpr @@ -2,18 +2,17 @@ {$APPTYPE CONSOLE} - uses System.SysUtils, IdHTTPWebBrokerBridge, Web.WebReq, - {$IFNDEF LINUX} +{$IFNDEF LINUX} Winapi.Windows, - {$ENDIF } +{$ENDIF } Web.WebBroker, MVCFramework.Commons, MVCFramework.Console, - WebModuleUnit in 'WebModuleUnit.pas' {MainWebModule: TWebModule}, + WebModuleUnit in 'WebModuleUnit.pas' {MainWebModule: TWebModule} , TestServerControllerU in 'TestServerControllerU.pas', TestServerControllerExceptionU in 'TestServerControllerExceptionU.pas', SpeedMiddlewareU in 'SpeedMiddlewareU.pas', @@ -24,27 +23,27 @@ uses TestServerControllerJSONRPCU in 'TestServerControllerJSONRPCU.pas', MVCFramework.JSONRPC in '..\..\..\sources\MVCFramework.JSONRPC.pas', RandomUtilsU in '..\..\..\samples\commons\RandomUtilsU.pas', - MVCFramework.Serializer.JsonDataObjects.OptionalCustomTypes in '..\..\..\sources\MVCFramework.Serializer.JsonDataObjects.OptionalCustomTypes.pas'; + MVCFramework.Serializer.JsonDataObjects.OptionalCustomTypes + in '..\..\..\sources\MVCFramework.Serializer.JsonDataObjects.OptionalCustomTypes.pas'; {$R *.res} - procedure Logo; begin + ResetConsole(); Writeln; - SetMode(TConsoleMode.Bright); - TextBackground(TConsoleColor.Black); - TextColor(TConsoleColor.Red); - WriteLn(' ██████╗ ███╗ ███╗██╗ ██╗ ██████╗ ███████╗███████╗██████╗ ██╗ ██╗███████╗██████╗'); - WriteLn(' ██╔══██╗████╗ ████║██║ ██║██╔════╝ ██╔════╝██╔════╝██╔══██╗██║ ██║██╔════╝██╔══██╗'); - WriteLn(' ██║ ██║██╔████╔██║██║ ██║██║ ███████╗█████╗ ██████╔╝██║ ██║█████╗ ██████╔╝'); - WriteLn(' ██║ ██║██║╚██╔╝██║╚██╗ ██╔╝██║ ╚════██║██╔══╝ ██╔══██╗╚██╗ ██╔╝██╔══╝ ██╔══██╗'); - WriteLn(' ██████╔╝██║ ╚═╝ ██║ ╚████╔╝ ╚██████╗ ███████║███████╗██║ ██║ ╚████╔╝ ███████╗██║ ██║'); - WriteLn(' ╚═════╝ ╚═╝ ╚═╝ ╚═══╝ ╚═════╝ ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚══════╝╚═╝ ╚═╝'); - WriteLn(' '); - TextColor(TConsoleColor.Yellow); - WriteLn('DMVCFRAMEWORK VERSION: ', DMVCFRAMEWORK_VERSION); - TextColor(TConsoleColor.White); + TextBackground(Black); + TextColor(Red); + Writeln(' ██████╗ ███╗ ███╗██╗ ██╗ ██████╗ ███████╗███████╗██████╗ ██╗ ██╗███████╗██████╗'); + Writeln(' ██╔══██╗████╗ ████║██║ ██║██╔════╝ ██╔════╝██╔════╝██╔══██╗██║ ██║██╔════╝██╔══██╗'); + Writeln(' ██║ ██║██╔████╔██║██║ ██║██║ ███████╗█████╗ ██████╔╝██║ ██║█████╗ ██████╔╝'); + Writeln(' ██║ ██║██║╚██╔╝██║╚██╗ ██╔╝██║ ╚════██║██╔══╝ ██╔══██╗╚██╗ ██╔╝██╔══╝ ██╔══██╗'); + Writeln(' ██████╔╝██║ ╚═╝ ██║ ╚████╔╝ ╚██████╗ ███████║███████╗██║ ██║ ╚████╔╝ ███████╗██║ ██║'); + Writeln(' ╚═════╝ ╚═╝ ╚═╝ ╚═══╝ ╚═════╝ ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚══════╝╚═╝ ╚═╝'); + Writeln(' '); + TextColor(Yellow); + Writeln('DMVCFRAMEWORK VERSION: ', DMVCFRAMEWORK_VERSION); + TextColor(White); end; procedure RunServer(APort: Integer); @@ -52,10 +51,11 @@ var LServer: TIdHTTPWebBrokerBridge; begin Logo; - WriteLn(Format('Starting HTTP Server or port %d', [APort])); + Writeln(Format('Starting HTTP Server or port %d', [APort])); LServer := TIdHTTPWebBrokerBridge.Create(nil); try - LServer.OnParseAuthentication := TMVCParseAuthentication.OnParseAuthentication; + LServer.OnParseAuthentication := + TMVCParseAuthentication.OnParseAuthentication; LServer.DefaultPort := APort; LServer.Active := True; { more info about MaxConnections @@ -64,9 +64,10 @@ begin { more info about ListenQueue http://www.indyproject.org/docsite/html/frames.html?frmname=topic&frmfile=TIdCustomTCPServer_ListenQueue.html } LServer.ListenQueue := 200; - WriteLn('Press RETURN to stop the server'); + Writeln('Press RETURN to stop the server'); ReadLn; - WriteLn('Server stopped'); + Writeln('Server stopped'); + ResetConsole(); finally LServer.Free; end; @@ -80,7 +81,7 @@ begin RunServer(9999); except on E: Exception do - WriteLn(E.ClassName, ': ', E.Message); + Writeln(E.ClassName, ': ', E.Message); end; end. diff --git a/unittests/general/TestServer/TestServer.dproj b/unittests/general/TestServer/TestServer.dproj index ffb309c6..f4aec73a 100644 --- a/unittests/general/TestServer/TestServer.dproj +++ b/unittests/general/TestServer/TestServer.dproj @@ -4,20 +4,15 @@ TestServer.dpr True CI - 36993 + 1 Console None - 18.8 + 19.0 Win32 true - - true - Base - true - true Base @@ -33,18 +28,6 @@ Base true - - true - Cfg_2 - true - true - - - true - Cfg_2 - true - true - true Cfg_2 @@ -65,35 +48,6 @@ $(BDS)\bin\delphi_PROJECTICON.ico $(BDS)\bin\delphi_PROJECTICNS.icns - - package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= - Debug - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png - true - true - true - true - true - true - true - true - true - true - $(BDS)\bin\Artwork\Android\FM_NotificationIcon_24x24.png - $(BDS)\bin\Artwork\Android\FM_NotificationIcon_36x36.png - $(BDS)\bin\Artwork\Android\FM_NotificationIcon_48x48.png - $(BDS)\bin\Artwork\Android\FM_NotificationIcon_72x72.png - $(BDS)\bin\Artwork\Android\FM_NotificationIcon_96x96.png - android-support-v4.dex.jar;cloud-messaging.dex.jar;com-google-android-gms.play-services-ads-base.17.2.0.dex.jar;com-google-android-gms.play-services-ads-identifier.16.0.0.dex.jar;com-google-android-gms.play-services-ads-lite.17.2.0.dex.jar;com-google-android-gms.play-services-ads.17.2.0.dex.jar;com-google-android-gms.play-services-analytics-impl.16.0.8.dex.jar;com-google-android-gms.play-services-analytics.16.0.8.dex.jar;com-google-android-gms.play-services-base.16.0.1.dex.jar;com-google-android-gms.play-services-basement.16.2.0.dex.jar;com-google-android-gms.play-services-gass.17.2.0.dex.jar;com-google-android-gms.play-services-identity.16.0.0.dex.jar;com-google-android-gms.play-services-maps.16.1.0.dex.jar;com-google-android-gms.play-services-measurement-base.16.4.0.dex.jar;com-google-android-gms.play-services-measurement-sdk-api.16.4.0.dex.jar;com-google-android-gms.play-services-stats.16.0.1.dex.jar;com-google-android-gms.play-services-tagmanager-v4-impl.16.0.8.dex.jar;com-google-android-gms.play-services-tasks.16.0.1.dex.jar;com-google-android-gms.play-services-wallet.16.0.1.dex.jar;com-google-firebase.firebase-analytics.16.4.0.dex.jar;com-google-firebase.firebase-common.16.1.0.dex.jar;com-google-firebase.firebase-iid-interop.16.0.1.dex.jar;com-google-firebase.firebase-iid.17.1.1.dex.jar;com-google-firebase.firebase-measurement-connector.17.0.1.dex.jar;com-google-firebase.firebase-messaging.17.5.0.dex.jar;fmx.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar - Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) Debug @@ -111,12 +65,6 @@ false true - - Debug - - - Debug - 1033 CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName) @@ -166,11 +114,6 @@ - False - True - True - False - True True False