diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index ff7ddbc..2b647fe 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,2 +1,2 @@ -# github: [HashLoad] -open_collective: hashload +# github: [HashLoad] +open_collective: hashload diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 2e2a35c..df0afa7 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -1,19 +1,19 @@ -name: tests - -on: - push: - branches: [ master ] - pull_request: - branches: [ master ] - -jobs: - test: - - runs-on: windows-latest - - steps: - - uses: actions/checkout@v2 - - name: Launch Console Tests - run: ./tests/Console.exe - - name: Launch VCL Tests +name: tests + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + test: + + runs-on: windows-latest + + steps: + - uses: actions/checkout@v2 + - name: Launch Console Tests + run: ./tests/Console.exe + - name: Launch VCL Tests run: ./tests/VCL.exe \ No newline at end of file diff --git a/.gitignore b/.gitignore index 039361a..a5b28f3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,54 +1,81 @@ -modules/ -dist/ -static/ -**/Win32/ -**/Win64/ -**/Linux64/ -**/__history/ -**/__recovery/ -src/*.~* -*.res -*.exe -*.dll -*.bpl -*.bpi -*.dcp -*.so -*.apk -*.drc -*.map -*.dres -*.rsm -*.tds -*.dcu -*.lib -*.a -*.o -*.ocx -*.local -*.identcache -*.projdata -*.tvsconfig -*.dsk -*.dcu -*.exe -*.ico -*.so -*.~* -*.a -*.stat -*.skincfg - -# Mac -*.DS_Store - -#FPC/Laz -lib/ -backup/ -*.lps - -# Code coverage reports -**/console/ -**/vcl/ -dunitx-results.xml -*.bak +modules/ +dist/ +static/ +**/Win32/ +**/Win64/ +**/Linux64/ +**/__history/ +**/__recovery/ +src/*.~* +__history/ +__recovery/ +packages/Win32/ +packages/Win64/ +packages/Linux64/ +packages/dcu/ +packages/dcp/ +packages/bpl/ +*.res +*.exe +*.dll +*.bpl +*.bpi +*.dcp +*.bpl +*.so +*.apk +*.drc +*.map +*.dres +*.rsm +*.tds +*.dcu +*.lib +*.a +*.o +*.ocx +*.local +*.identcache +*.projdata +*.tvsconfig +*.dsk +*.dcu +*.exe +*.ico +*.so +*.~* +*.a +*.stat +*.skincfg + +# Mac +*.DS_Store + +#FPC/Laz +lib/ +backup/ +*.lps + +# Code coverage reports +**/console/ +**/vcl/ +dunitx-results.xml +*.bak + +# Claude Code +.claude/settings.local.json +.claude.json +CLAUDE.md + +# Delphi build output +__history/ +__recovery/ +*.dcu +*.exe +*.dll +*.bpl +*.dcp +*.local +*.identcache +*.tvsconfig +*.dsk diff --git a/LICENSE b/LICENSE index 02bb193..4678abc 100644 --- a/LICENSE +++ b/LICENSE @@ -1,21 +1,21 @@ -MIT License - -Copyright (c) 2025 HashLoad - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +MIT License + +Copyright (c) 2025 HashLoad + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index 5a4e11e..e1c6371 100644 --- a/README.md +++ b/README.md @@ -1,116 +1,116 @@ -

- - Horse - -


-

- Horse is an Express inspired web framework for Delphi and Lazarus.
Designed to ease things up for fast development in a minimalist way and with high performance. -


-

- - - -

- -## ⚙️ Installation -Installation is done using the [`boss install`](https://github.com/HashLoad/boss) command: -``` sh -boss install horse -``` -* (Optional) Install [**wizard**](https://github.com/HashLoad/horse-wizard) - -## ⚡️ Quickstart Delphi -```delphi -uses Horse; - -begin - THorse.Get('/ping', - procedure(Req: THorseRequest; Res: THorseResponse) - begin - Res.Send('pong'); - end); - - THorse.Listen(9000); -end. -``` - -## ⚡️ Quickstart Lazarus -```delphi -{$MODE DELPHI}{$H+} - -uses Horse; - -procedure GetPing(Req: THorseRequest; Res: THorseResponse); -begin - Res.Send('Pong'); -end; - -begin - THorse.Get('/ping', GetPing); - THorse.Listen(9000); -end. -``` - -## 🧬 Official Middlewares - -For a more _maintainable_ middleware _ecosystem_, we've put official middlewares into separate repositories: - -| Middleware | Delphi | Lazarus | -| ------------------------------------------------------------------- | -------------------- | --------------------------- | -| [horse/json](https://github.com/HashLoad/jhonson) |    ✔️ |     ✔️ | -| [horse/basic-auth](https://github.com/HashLoad/horse-basic-auth) |    ✔️ |     ✔️ | -| [horse/cors](https://github.com/HashLoad/horse-cors) |    ✔️ |     ✔️ | -| [horse/stream](https://github.com/HashLoad/horse-octet-stream) |    ✔️ |     ✔️ | -| [horse/jwt](https://github.com/HashLoad/horse-jwt) |    ✔️ |     ✔️ | -| [horse/exception](https://github.com/HashLoad/handle-exception) |    ✔️ |     ✔️ | -| [horse/logger](https://github.com/HashLoad/horse-logger) |    ✔️ |     ✔️ | -| [horse/compression](https://github.com/HashLoad/horse-compression) |    ✔️ |     ✔️ | - -## 🌱 Third Party Middlewares - -This is a list of middlewares that are created by the Horse community, please create a PR if you want to see yours! - -| Middleware | Delphi | Lazarus | -| ---------------------------------------------------------------------------------------------------------- | -------------------- | --------------------------- | -| [bittencourtthulio/etag](https://github.com/bittencourtthulio/Horse-ETag) |    ✔️ |     ✔️ | -| [bittencourtthulio/paginate](https://github.com/bittencourtthulio/Horse-Paginate) |    ✔️ |     ✔️ | -| [bittencourtthulio/cachecontrol](https://github.com/bittencourtthulio/horse-cachecontrol) |    ✔️ |     ❌ | -| [gabrielbaltazar/gbswagger](https://github.com/gabrielbaltazar/gbswagger) |    ✔️ |     ❌ | -| [willhubner/socketIO](https://github.com/WillHubner/Horse-SocketIO) |    ✔️ |     ❌ | -| [dliocode/ratelimit](https://github.com/dliocode/horse-ratelimit) |    ✔️ |     ❌ | -| [dliocode/slowdown](https://github.com/dliocode/horse-slowdown) |    ✔️ |     ❌ | -| [giorgiobazzo/upload](https://github.com/giorgiobazzo/horse-upload) |    ✔️ |     ❌ | -| [dliocode/query](https://github.com/dliocode/horse-query) |    ✔️ |     ❌ | -| [CarlosHe/healthcheck](https://github.com/CarlosHe/horse-healthcheck) |    ✔️ |     ❌ | -| [CarlosHe/staticfiles](https://github.com/CarlosHe/horse-staticfiles) |    ✔️ |     ❌ | -| [CachopaWeb/horse-server-static](https://github.com/CachopaWeb/horse-server-static) |    ✔️ |     ✔️ | -| [arvanus/horse-exception-logger](https://github.com/arvanus/horse-exception-logger) |    ✔️ |     ✔️ | -| [claudneysessa/Horse-CSResponsePagination](https://github.com/claudneysessa/Horse-CSResponsePagination) |    ✔️ |     ❌ | -| [claudneysessa/Horse-XSuperObjects](https://github.com/claudneysessa/Horse-XSuperObjects) |    ✔️ |     ❌ | -| [andre-djsystem/horse-bearer-auth](https://github.com/andre-djsystem/horse-bearer-auth) |    ✔️ |     ✔️ | -| [andre-djsystem/horse-manipulate-request](https://github.com/andre-djsystem/horse-manipulate-request) |    ✔️ |     ✔️ | -| [andre-djsystem/horse-manipulate-response](https://github.com/andre-djsystem/horse-manipulate-response) |    ✔️ |     ✔️ | -| [antoniojmsjr/Horse-IPGeoLocation](https://github.com/antoniojmsjr/Horse-IPGeoLocation) |    ✔️ |     ❌ | -| [antoniojmsjr/Horse-XMLDoc](https://github.com/antoniojmsjr/Horse-XMLDoc) |    ✔️ |     ❌ | -| [isaquepinheiro/horse-jsonbr](https://github.com/HashLoad/JSONBr) |    ✔️ |     ❌ | -| [IagooCesaar/Horse-JsonInterceptor](https://github.com/IagooCesaar/Horse-JsonInterceptor) |    ✔️ |     ❌ | -| [dliocode/horse-datalogger](https://github.com/dliocode/horse-datalogger) |    ✔️ |     ❌ | -| [marcobreveglieri/horse-prometheus-metrics](https://github.com/marcobreveglieri/horse-prometheus-metrics) |    ✔️ |     ❌ | -| [weslleycapelari/horse-documentation](https://github.com/weslleycapelari/horse-documentation) |    ✔️ |     ❌ | - -## Delphi Versions -`Horse` works with Delphi 13 Florence, Delphi 12 Athens, Delphi 11 Alexandria, Delphi 10.4 Sydney, Delphi 10.3 Rio, Delphi 10.2 Tokyo, Delphi 10.1 Berlin, Delphi 10 Seattle, Delphi XE8 and Delphi XE7. - -## 💻 Code Contributors - - - - - -## ⚠️ License - -`Horse` is free and open-source software licensed under the [MIT License](https://github.com/HashLoad/horse/blob/master/LICENSE). - -## 📐 Tests - -![tests](https://github.com/GlerystonMatos/horse/workflows/tests/badge.svg) ![Console Coverage ](https://img.shields.io/badge/console%20coverage-45%25-blue) ![VCL Coverage ](https://img.shields.io/badge/vcl%20coverage-43%25-blue) +

+ + Horse + +


+

+ Horse is an Express inspired web framework for Delphi and Lazarus.
Designed to ease things up for fast development in a minimalist way and with high performance. +


+

+ + + +

+ +## ⚙️ Installation +Installation is done using the [`boss install`](https://github.com/HashLoad/boss) command: +``` sh +boss install horse +``` +* (Optional) Install [**wizard**](https://github.com/HashLoad/horse-wizard) + +## ⚡️ Quickstart Delphi +```delphi +uses Horse; + +begin + THorse.Get('/ping', + procedure(Req: THorseRequest; Res: THorseResponse) + begin + Res.Send('pong'); + end); + + THorse.Listen(9000); +end. +``` + +## ⚡️ Quickstart Lazarus +```delphi +{$MODE DELPHI}{$H+} + +uses Horse; + +procedure GetPing(Req: THorseRequest; Res: THorseResponse); +begin + Res.Send('Pong'); +end; + +begin + THorse.Get('/ping', GetPing); + THorse.Listen(9000); +end. +``` + +## 🧬 Official Middlewares + +For a more _maintainable_ middleware _ecosystem_, we've put official middlewares into separate repositories: + +| Middleware | Delphi | Lazarus | +| ------------------------------------------------------------------- | -------------------- | --------------------------- | +| [horse/json](https://github.com/HashLoad/jhonson) |    ✔️ |     ✔️ | +| [horse/basic-auth](https://github.com/HashLoad/horse-basic-auth) |    ✔️ |     ✔️ | +| [horse/cors](https://github.com/HashLoad/horse-cors) |    ✔️ |     ✔️ | +| [horse/stream](https://github.com/HashLoad/horse-octet-stream) |    ✔️ |     ✔️ | +| [horse/jwt](https://github.com/HashLoad/horse-jwt) |    ✔️ |     ✔️ | +| [horse/exception](https://github.com/HashLoad/handle-exception) |    ✔️ |     ✔️ | +| [horse/logger](https://github.com/HashLoad/horse-logger) |    ✔️ |     ✔️ | +| [horse/compression](https://github.com/HashLoad/horse-compression) |    ✔️ |     ✔️ | + +## 🌱 Third Party Middlewares + +This is a list of middlewares that are created by the Horse community, please create a PR if you want to see yours! + +| Middleware | Delphi | Lazarus | +| ---------------------------------------------------------------------------------------------------------- | -------------------- | --------------------------- | +| [bittencourtthulio/etag](https://github.com/bittencourtthulio/Horse-ETag) |    ✔️ |     ✔️ | +| [bittencourtthulio/paginate](https://github.com/bittencourtthulio/Horse-Paginate) |    ✔️ |     ✔️ | +| [bittencourtthulio/cachecontrol](https://github.com/bittencourtthulio/horse-cachecontrol) |    ✔️ |     ❌ | +| [gabrielbaltazar/gbswagger](https://github.com/gabrielbaltazar/gbswagger) |    ✔️ |     ❌ | +| [willhubner/socketIO](https://github.com/WillHubner/Horse-SocketIO) |    ✔️ |     ❌ | +| [dliocode/ratelimit](https://github.com/dliocode/horse-ratelimit) |    ✔️ |     ❌ | +| [dliocode/slowdown](https://github.com/dliocode/horse-slowdown) |    ✔️ |     ❌ | +| [giorgiobazzo/upload](https://github.com/giorgiobazzo/horse-upload) |    ✔️ |     ❌ | +| [dliocode/query](https://github.com/dliocode/horse-query) |    ✔️ |     ❌ | +| [CarlosHe/healthcheck](https://github.com/CarlosHe/horse-healthcheck) |    ✔️ |     ❌ | +| [CarlosHe/staticfiles](https://github.com/CarlosHe/horse-staticfiles) |    ✔️ |     ❌ | +| [CachopaWeb/horse-server-static](https://github.com/CachopaWeb/horse-server-static) |    ✔️ |     ✔️ | +| [arvanus/horse-exception-logger](https://github.com/arvanus/horse-exception-logger) |    ✔️ |     ✔️ | +| [claudneysessa/Horse-CSResponsePagination](https://github.com/claudneysessa/Horse-CSResponsePagination) |    ✔️ |     ❌ | +| [claudneysessa/Horse-XSuperObjects](https://github.com/claudneysessa/Horse-XSuperObjects) |    ✔️ |     ❌ | +| [andre-djsystem/horse-bearer-auth](https://github.com/andre-djsystem/horse-bearer-auth) |    ✔️ |     ✔️ | +| [andre-djsystem/horse-manipulate-request](https://github.com/andre-djsystem/horse-manipulate-request) |    ✔️ |     ✔️ | +| [andre-djsystem/horse-manipulate-response](https://github.com/andre-djsystem/horse-manipulate-response) |    ✔️ |     ✔️ | +| [antoniojmsjr/Horse-IPGeoLocation](https://github.com/antoniojmsjr/Horse-IPGeoLocation) |    ✔️ |     ❌ | +| [antoniojmsjr/Horse-XMLDoc](https://github.com/antoniojmsjr/Horse-XMLDoc) |    ✔️ |     ❌ | +| [isaquepinheiro/horse-jsonbr](https://github.com/HashLoad/JSONBr) |    ✔️ |     ❌ | +| [IagooCesaar/Horse-JsonInterceptor](https://github.com/IagooCesaar/Horse-JsonInterceptor) |    ✔️ |     ❌ | +| [dliocode/horse-datalogger](https://github.com/dliocode/horse-datalogger) |    ✔️ |     ❌ | +| [marcobreveglieri/horse-prometheus-metrics](https://github.com/marcobreveglieri/horse-prometheus-metrics) |    ✔️ |     ❌ | +| [weslleycapelari/horse-documentation](https://github.com/weslleycapelari/horse-documentation) |    ✔️ |     ❌ | + +## Delphi Versions +`Horse` works with Delphi 13 Florence, Delphi 12 Athens, Delphi 11 Alexandria, Delphi 10.4 Sydney, Delphi 10.3 Rio, Delphi 10.2 Tokyo, Delphi 10.1 Berlin, Delphi 10 Seattle, Delphi XE8 and Delphi XE7. + +## 💻 Code Contributors + + + + + +## ⚠️ License + +`Horse` is free and open-source software licensed under the [MIT License](https://github.com/HashLoad/horse/blob/master/LICENSE). + +## 📐 Tests + +![tests](https://github.com/GlerystonMatos/horse/workflows/tests/badge.svg) ![Console Coverage ](https://img.shields.io/badge/console%20coverage-45%25-blue) ![VCL Coverage ](https://img.shields.io/badge/vcl%20coverage-43%25-blue) diff --git a/boss-lock.json b/boss-lock.json index e77976b..325d727 100644 --- a/boss-lock.json +++ b/boss-lock.json @@ -1,5 +1,5 @@ -{ - "hash": "f1bdf5ed1d7ad7ede4e3809bd35644b0", - "updated": "2019-07-22T23:19:02.3355607-03:00", - "installedModules": {} +{ + "hash": "f1bdf5ed1d7ad7ede4e3809bd35644b0", + "updated": "2019-07-22T23:19:02.3355607-03:00", + "installedModules": {} } \ No newline at end of file diff --git a/boss.json b/boss.json index 5cffd49..2376355 100644 --- a/boss.json +++ b/boss.json @@ -1,9 +1,11 @@ { - "name": "horse", - "description": "", - "version": "1.0.0", - "homepage": "", - "mainsrc": "src/", - "projects": [], - "dependencies": {} -} \ No newline at end of file + "name": "horse", + "description": "Horse web framework \u2014 CrossSocket-compatible fork", + "version": "3.1.95", + "homepage": "https://github.com/freitasjca/horse", + "license": "MIT", + "mainsrc": "src/", + "browsingpath": "src/", + "projects": [], + "dependencies": {} +} diff --git a/samples/delphi/Samples.groupproj b/samples/delphi/Samples.groupproj index 29b0416..3971c21 100644 --- a/samples/delphi/Samples.groupproj +++ b/samples/delphi/Samples.groupproj @@ -1,120 +1,120 @@ - - - {4FB6F995-E4BE-41AD-9DB4-DCAC9C374877} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Default.Personality.12 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + {4FB6F995-E4BE-41AD-9DB4-DCAC9C374877} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Default.Personality.12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/samples/delphi/apache/Apache.dpr b/samples/delphi/apache/Apache.dpr index 9b0159c..548fd34 100644 --- a/samples/delphi/apache/Apache.dpr +++ b/samples/delphi/apache/Apache.dpr @@ -1,44 +1,44 @@ -library Apache; - -{$R *.res} - -(* - httpd.conf entries: - LoadModule apache_horse_module modules/Apache.dll - - SetHandler apache_horse_module-handle - - To use the feature: - http://localhost/apache_horse/ping - These entries assume that the output directory for this project is the apache/modules directory. - httpd.conf entries should be different if the project is changed in these ways: - 1. The TApacheModuleData variable name is changed. - 2. The project is renamed. - 3. The output directory is not the apache/modules directory. - 4. The dynamic library extension depends on a platform. Use .dll on Windows and .so on Linux. -*) - -// Declare exported variable so that Apache can access this module. - -uses Horse, Web.HTTPD24Impl; - -var - ApacheModuleData: TApacheModuleData; - -exports - ApacheModuleData name 'apache_horse_module'; - -begin - // Need to set "HORSE_APACHE" compilation directive - - THorse.DefaultModule := @ApacheModuleData; - THorse.HandlerName := 'apache_horse_module-handle'; - - THorse.Get('/ping', - procedure(Req: THorseRequest; Res: THorseResponse) - begin - Res.Send('pong'); - end); - - THorse.Listen; -end. +library Apache; + +{$R *.res} + +(* + httpd.conf entries: + LoadModule apache_horse_module modules/Apache.dll + + SetHandler apache_horse_module-handle + + To use the feature: + http://localhost/apache_horse/ping + These entries assume that the output directory for this project is the apache/modules directory. + httpd.conf entries should be different if the project is changed in these ways: + 1. The TApacheModuleData variable name is changed. + 2. The project is renamed. + 3. The output directory is not the apache/modules directory. + 4. The dynamic library extension depends on a platform. Use .dll on Windows and .so on Linux. +*) + +// Declare exported variable so that Apache can access this module. + +uses Horse, Web.HTTPD24Impl; + +var + ApacheModuleData: TApacheModuleData; + +exports + ApacheModuleData name 'apache_horse_module'; + +begin + // Need to set "HORSE_APACHE" compilation directive + + THorse.DefaultModule := @ApacheModuleData; + THorse.HandlerName := 'apache_horse_module-handle'; + + THorse.Get('/ping', + procedure(Req: THorseRequest; Res: THorseResponse) + begin + Res.Send('pong'); + end); + + THorse.Listen; +end. diff --git a/samples/delphi/apache/Apache.dproj b/samples/delphi/apache/Apache.dproj index bc02b75..7ab9cb6 100644 --- a/samples/delphi/apache/Apache.dproj +++ b/samples/delphi/apache/Apache.dproj @@ -1,1054 +1,1054 @@ - - - {EAAA22CB-AF62-43BB-90DE-4BDD33737B6A} - 19.5 - None - Apache.dpr - True - Debug - Win64 - 3 - Library - - - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Cfg_1 - true - true - - - true - Cfg_1 - true - true - - - true - Base - true - - - .\$(Platform)\$(Config) - .\$(Platform)\$(Config) - false - false - false - false - false - true - System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) - Apache - HORSE_APACHE;$(DCC_Define) - 1033 - ..\..\..\src;$(DCC_UnitSearchPath) - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - - - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png - 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 - activity-1.1.0.dex.jar;annotation-1.2.0.dex.jar;appcompat-1.2.0.dex.jar;appcompat-resources-1.2.0.dex.jar;asynclayoutinflater-1.0.0.dex.jar;billing-4.0.0.dex.jar;biometric-1.1.0.dex.jar;browser-1.0.0.dex.jar;cloud-messaging.dex.jar;collection-1.1.0.dex.jar;coordinatorlayout-1.0.0.dex.jar;core-1.5.0-rc02.dex.jar;core-common-2.1.0.dex.jar;core-runtime-2.1.0.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;firebase-annotations-16.0.0.dex.jar;firebase-common-20.0.0.dex.jar;firebase-components-17.0.0.dex.jar;firebase-datatransport-18.0.0.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.0.0.dex.jar;firebase-installations-interop-17.0.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-22.0.0.dex.jar;fmx.dex.jar;fragment-1.2.5.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;legacy-support-core-ui-1.0.0.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.2.0.dex.jar;lifecycle-livedata-2.0.0.dex.jar;lifecycle-livedata-core-2.2.0.dex.jar;lifecycle-runtime-2.2.0.dex.jar;lifecycle-service-2.0.0.dex.jar;lifecycle-viewmodel-2.2.0.dex.jar;lifecycle-viewmodel-savedstate-2.2.0.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;play-services-ads-20.1.0.dex.jar;play-services-ads-base-20.1.0.dex.jar;play-services-ads-identifier-17.0.0.dex.jar;play-services-ads-lite-20.1.0.dex.jar;play-services-base-17.5.0.dex.jar;play-services-basement-17.6.0.dex.jar;play-services-cloud-messaging-16.0.0.dex.jar;play-services-drive-17.0.0.dex.jar;play-services-games-21.0.0.dex.jar;play-services-location-18.0.0.dex.jar;play-services-maps-17.0.1.dex.jar;play-services-measurement-base-18.0.0.dex.jar;play-services-measurement-sdk-api-18.0.0.dex.jar;play-services-places-placereport-17.0.0.dex.jar;play-services-stats-17.0.0.dex.jar;play-services-tasks-17.2.0.dex.jar;print-1.0.0.dex.jar;room-common-2.1.0.dex.jar;room-runtime-2.1.0.dex.jar;savedstate-1.0.0.dex.jar;slidingpanelayout-1.0.0.dex.jar;sqlite-2.0.1.dex.jar;sqlite-framework-2.0.1.dex.jar;swiperefreshlayout-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.0.0.dex.jar;transport-runtime-3.0.0.dex.jar;user-messaging-platform-1.0.0.dex.jar;vectordrawable-1.1.0.dex.jar;vectordrawable-animated-1.1.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.1.0.dex.jar - - - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png - 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 - activity-1.1.0.dex.jar;annotation-1.2.0.dex.jar;appcompat-1.2.0.dex.jar;appcompat-resources-1.2.0.dex.jar;asynclayoutinflater-1.0.0.dex.jar;billing-4.0.0.dex.jar;biometric-1.1.0.dex.jar;browser-1.0.0.dex.jar;cloud-messaging.dex.jar;collection-1.1.0.dex.jar;coordinatorlayout-1.0.0.dex.jar;core-1.5.0-rc02.dex.jar;core-common-2.1.0.dex.jar;core-runtime-2.1.0.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;firebase-annotations-16.0.0.dex.jar;firebase-common-20.0.0.dex.jar;firebase-components-17.0.0.dex.jar;firebase-datatransport-18.0.0.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.0.0.dex.jar;firebase-installations-interop-17.0.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-22.0.0.dex.jar;fmx.dex.jar;fragment-1.2.5.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;legacy-support-core-ui-1.0.0.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.2.0.dex.jar;lifecycle-livedata-2.0.0.dex.jar;lifecycle-livedata-core-2.2.0.dex.jar;lifecycle-runtime-2.2.0.dex.jar;lifecycle-service-2.0.0.dex.jar;lifecycle-viewmodel-2.2.0.dex.jar;lifecycle-viewmodel-savedstate-2.2.0.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;play-services-ads-20.1.0.dex.jar;play-services-ads-base-20.1.0.dex.jar;play-services-ads-identifier-17.0.0.dex.jar;play-services-ads-lite-20.1.0.dex.jar;play-services-base-17.5.0.dex.jar;play-services-basement-17.6.0.dex.jar;play-services-cloud-messaging-16.0.0.dex.jar;play-services-drive-17.0.0.dex.jar;play-services-games-21.0.0.dex.jar;play-services-location-18.0.0.dex.jar;play-services-maps-17.0.1.dex.jar;play-services-measurement-base-18.0.0.dex.jar;play-services-measurement-sdk-api-18.0.0.dex.jar;play-services-places-placereport-17.0.0.dex.jar;play-services-stats-17.0.0.dex.jar;play-services-tasks-17.2.0.dex.jar;print-1.0.0.dex.jar;room-common-2.1.0.dex.jar;room-runtime-2.1.0.dex.jar;savedstate-1.0.0.dex.jar;slidingpanelayout-1.0.0.dex.jar;sqlite-2.0.1.dex.jar;sqlite-framework-2.0.1.dex.jar;swiperefreshlayout-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.0.0.dex.jar;transport-runtime-3.0.0.dex.jar;user-messaging-platform-1.0.0.dex.jar;vectordrawable-1.1.0.dex.jar;vectordrawable-animated-1.1.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.1.0.dex.jar - - - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_1024x1024.png - CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers - iPhoneAndiPad - true - Debug - $(MSBuildProjectName) - - - CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers - iPhoneAndiPad - true - - - CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers;ITSAppUsesNonExemptEncryption=false - Debug - - - CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers;ITSAppUsesNonExemptEncryption=false - Debug - - - DBXSqliteDriver;RESTComponents;fmxase;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;bindcompvclsmp;emsclientfiredac;tethering;svnui;DataSnapFireDAC;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;svn;DBXOracleDriver;inetdb;FmxTeeUI;emsedge;fmx;FireDACIBDriver;fmxdae;vcledge;FireDACDBXDriver;dbexpress;IndyCore;boss_ide;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;TeeDB;FireDAC;emshosting;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;Tee;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;DOSCommandDR;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;TeeUI;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;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 - 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 - - - DBXSqliteDriver;RESTComponents;fmxase;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;bindcompvclsmp;emsclientfiredac;tethering;DataSnapFireDAC;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;DBXOracleDriver;inetdb;FmxTeeUI;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;TeeDB;FireDAC;emshosting;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;Tee;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;DOSCommandDR;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;TeeUI;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;inetdbxpress;FireDACMongoDBDriver;DataSnapServerMidas;$(DCC_UsePackage) - Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) - Debug - true - - - DEBUG;$(DCC_Define) - true - false - true - true - true - - - false - true - 1033 - (None) - - - true - (None) - - - false - RELEASE;$(DCC_Define) - 0 - 0 - - - - MainSource - - - Base - - - Cfg_1 - Base - - - Cfg_2 - Base - - - - Delphi.Personality.12 - Application - - - - Apache.dpr - - - ExpressPivotGrid OLAP by Developer Express Inc. - Microsoft Office 2000 Sample Automation Server Wrapper Components - Microsoft Office XP Sample Automation Server Wrapper Components - - - - - - true - - - - - true - - - - - true - - - - - - - 1 - - - Contents\MacOS - 1 - - - 0 - - - - - classes - 64 - - - classes - 64 - - - - - 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-xxxhdpi - 1 - - - res\drawable-xxxhdpi - 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 - - - Contents\MacOS - 1 - .framework - - - 0 - - - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - Contents\MacOS - 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 - - - Contents\MacOS - 1 - .dylib - - - 0 - .bpl - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - Contents\Resources\StartUp\ - 0 - - - Contents\Resources\StartUp\ - 0 - - - Contents\Resources\StartUp\ - 0 - - - 0 - - - - - 1 - - - 1 - - - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - - - ..\ - 1 - - - ..\ - 1 - - - ..\ - 1 - - - - - Contents - 1 - - - Contents - 1 - - - Contents - 1 - - - - - Contents\Resources - 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 - - - Contents\MacOS - 1 - - - 0 - - - - - library\lib\armeabi-v7a - 1 - - - - - 1 - - - 1 - - - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - - - ..\ - 1 - - - ..\ - 1 - - - ..\ - 1 - - - - - 1 - - - 1 - - - 1 - - - - - ..\$(PROJECTNAME).launchscreen - 64 - - - ..\$(PROJECTNAME).launchscreen - 64 - - - - - 1 - - - 1 - - - 1 - - - - - Assets - 1 - - - Assets - 1 - - - - - Assets - 1 - - - Assets - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 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\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 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\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - - - - - - - - - - - - - False - False - False - False - False - False - False - True - True - - - 12 - - - - - + + + {EAAA22CB-AF62-43BB-90DE-4BDD33737B6A} + 19.5 + None + Apache.dpr + True + Debug + Win64 + 3 + Library + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + .\$(Platform)\$(Config) + .\$(Platform)\$(Config) + false + false + false + false + false + true + System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) + Apache + HORSE_APACHE;$(DCC_Define) + 1033 + ..\..\..\src;$(DCC_UnitSearchPath) + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + + + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png + 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 + activity-1.1.0.dex.jar;annotation-1.2.0.dex.jar;appcompat-1.2.0.dex.jar;appcompat-resources-1.2.0.dex.jar;asynclayoutinflater-1.0.0.dex.jar;billing-4.0.0.dex.jar;biometric-1.1.0.dex.jar;browser-1.0.0.dex.jar;cloud-messaging.dex.jar;collection-1.1.0.dex.jar;coordinatorlayout-1.0.0.dex.jar;core-1.5.0-rc02.dex.jar;core-common-2.1.0.dex.jar;core-runtime-2.1.0.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;firebase-annotations-16.0.0.dex.jar;firebase-common-20.0.0.dex.jar;firebase-components-17.0.0.dex.jar;firebase-datatransport-18.0.0.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.0.0.dex.jar;firebase-installations-interop-17.0.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-22.0.0.dex.jar;fmx.dex.jar;fragment-1.2.5.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;legacy-support-core-ui-1.0.0.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.2.0.dex.jar;lifecycle-livedata-2.0.0.dex.jar;lifecycle-livedata-core-2.2.0.dex.jar;lifecycle-runtime-2.2.0.dex.jar;lifecycle-service-2.0.0.dex.jar;lifecycle-viewmodel-2.2.0.dex.jar;lifecycle-viewmodel-savedstate-2.2.0.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;play-services-ads-20.1.0.dex.jar;play-services-ads-base-20.1.0.dex.jar;play-services-ads-identifier-17.0.0.dex.jar;play-services-ads-lite-20.1.0.dex.jar;play-services-base-17.5.0.dex.jar;play-services-basement-17.6.0.dex.jar;play-services-cloud-messaging-16.0.0.dex.jar;play-services-drive-17.0.0.dex.jar;play-services-games-21.0.0.dex.jar;play-services-location-18.0.0.dex.jar;play-services-maps-17.0.1.dex.jar;play-services-measurement-base-18.0.0.dex.jar;play-services-measurement-sdk-api-18.0.0.dex.jar;play-services-places-placereport-17.0.0.dex.jar;play-services-stats-17.0.0.dex.jar;play-services-tasks-17.2.0.dex.jar;print-1.0.0.dex.jar;room-common-2.1.0.dex.jar;room-runtime-2.1.0.dex.jar;savedstate-1.0.0.dex.jar;slidingpanelayout-1.0.0.dex.jar;sqlite-2.0.1.dex.jar;sqlite-framework-2.0.1.dex.jar;swiperefreshlayout-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.0.0.dex.jar;transport-runtime-3.0.0.dex.jar;user-messaging-platform-1.0.0.dex.jar;vectordrawable-1.1.0.dex.jar;vectordrawable-animated-1.1.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.1.0.dex.jar + + + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png + 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 + activity-1.1.0.dex.jar;annotation-1.2.0.dex.jar;appcompat-1.2.0.dex.jar;appcompat-resources-1.2.0.dex.jar;asynclayoutinflater-1.0.0.dex.jar;billing-4.0.0.dex.jar;biometric-1.1.0.dex.jar;browser-1.0.0.dex.jar;cloud-messaging.dex.jar;collection-1.1.0.dex.jar;coordinatorlayout-1.0.0.dex.jar;core-1.5.0-rc02.dex.jar;core-common-2.1.0.dex.jar;core-runtime-2.1.0.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;firebase-annotations-16.0.0.dex.jar;firebase-common-20.0.0.dex.jar;firebase-components-17.0.0.dex.jar;firebase-datatransport-18.0.0.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.0.0.dex.jar;firebase-installations-interop-17.0.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-22.0.0.dex.jar;fmx.dex.jar;fragment-1.2.5.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;legacy-support-core-ui-1.0.0.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.2.0.dex.jar;lifecycle-livedata-2.0.0.dex.jar;lifecycle-livedata-core-2.2.0.dex.jar;lifecycle-runtime-2.2.0.dex.jar;lifecycle-service-2.0.0.dex.jar;lifecycle-viewmodel-2.2.0.dex.jar;lifecycle-viewmodel-savedstate-2.2.0.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;play-services-ads-20.1.0.dex.jar;play-services-ads-base-20.1.0.dex.jar;play-services-ads-identifier-17.0.0.dex.jar;play-services-ads-lite-20.1.0.dex.jar;play-services-base-17.5.0.dex.jar;play-services-basement-17.6.0.dex.jar;play-services-cloud-messaging-16.0.0.dex.jar;play-services-drive-17.0.0.dex.jar;play-services-games-21.0.0.dex.jar;play-services-location-18.0.0.dex.jar;play-services-maps-17.0.1.dex.jar;play-services-measurement-base-18.0.0.dex.jar;play-services-measurement-sdk-api-18.0.0.dex.jar;play-services-places-placereport-17.0.0.dex.jar;play-services-stats-17.0.0.dex.jar;play-services-tasks-17.2.0.dex.jar;print-1.0.0.dex.jar;room-common-2.1.0.dex.jar;room-runtime-2.1.0.dex.jar;savedstate-1.0.0.dex.jar;slidingpanelayout-1.0.0.dex.jar;sqlite-2.0.1.dex.jar;sqlite-framework-2.0.1.dex.jar;swiperefreshlayout-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.0.0.dex.jar;transport-runtime-3.0.0.dex.jar;user-messaging-platform-1.0.0.dex.jar;vectordrawable-1.1.0.dex.jar;vectordrawable-animated-1.1.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.1.0.dex.jar + + + $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_1024x1024.png + CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers + iPhoneAndiPad + true + Debug + $(MSBuildProjectName) + + + CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers + iPhoneAndiPad + true + + + CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers;ITSAppUsesNonExemptEncryption=false + Debug + + + CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers;ITSAppUsesNonExemptEncryption=false + Debug + + + DBXSqliteDriver;RESTComponents;fmxase;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;bindcompvclsmp;emsclientfiredac;tethering;svnui;DataSnapFireDAC;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;svn;DBXOracleDriver;inetdb;FmxTeeUI;emsedge;fmx;FireDACIBDriver;fmxdae;vcledge;FireDACDBXDriver;dbexpress;IndyCore;boss_ide;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;TeeDB;FireDAC;emshosting;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;Tee;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;DOSCommandDR;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;TeeUI;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;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 + 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 + + + DBXSqliteDriver;RESTComponents;fmxase;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;bindcompvclsmp;emsclientfiredac;tethering;DataSnapFireDAC;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;DBXOracleDriver;inetdb;FmxTeeUI;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;TeeDB;FireDAC;emshosting;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;Tee;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;DOSCommandDR;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;TeeUI;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;inetdbxpress;FireDACMongoDBDriver;DataSnapServerMidas;$(DCC_UsePackage) + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + + + DEBUG;$(DCC_Define) + true + false + true + true + true + + + false + true + 1033 + (None) + + + true + (None) + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + + MainSource + + + Base + + + Cfg_1 + Base + + + Cfg_2 + Base + + + + Delphi.Personality.12 + Application + + + + Apache.dpr + + + ExpressPivotGrid OLAP by Developer Express Inc. + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + + + + + + true + + + + + true + + + + + true + + + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + classes + 64 + + + classes + 64 + + + + + 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-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 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 + + + Contents\MacOS + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 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 + + + Contents\MacOS + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + Contents\Resources\StartUp\ + 0 + + + Contents\Resources\StartUp\ + 0 + + + Contents\Resources\StartUp\ + 0 + + + 0 + + + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + ..\ + 1 + + + + + Contents + 1 + + + Contents + 1 + + + Contents + 1 + + + + + Contents\Resources + 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 + + + Contents\MacOS + 1 + + + 0 + + + + + library\lib\armeabi-v7a + 1 + + + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + ..\ + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).launchscreen + 64 + + + ..\$(PROJECTNAME).launchscreen + 64 + + + + + 1 + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 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\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 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\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + + + + + + + + + + + + + False + False + False + False + False + False + False + True + True + + + 12 + + + + + diff --git a/samples/delphi/cgi/CGI.dpr b/samples/delphi/cgi/CGI.dpr index a10d1ba..0354959 100644 --- a/samples/delphi/cgi/CGI.dpr +++ b/samples/delphi/cgi/CGI.dpr @@ -1,18 +1,18 @@ -program CGI; - -{$APPTYPE CONSOLE} -{$R *.res} - -uses Horse; - -begin - // Need to set "HORSE_CGI" compilation directive - - THorse.Get('/ping', - procedure(Req: THorseRequest; Res: THorseResponse) - begin - Res.Send('pong'); - end); - - THorse.Listen; -end. +program CGI; + +{$APPTYPE CONSOLE} +{$R *.res} + +uses Horse; + +begin + // Need to set "HORSE_CGI" compilation directive + + THorse.Get('/ping', + procedure(Req: THorseRequest; Res: THorseResponse) + begin + Res.Send('pong'); + end); + + THorse.Listen; +end. diff --git a/samples/delphi/cgi/CGI.dproj b/samples/delphi/cgi/CGI.dproj index 5a5cf46..346877d 100644 --- a/samples/delphi/cgi/CGI.dproj +++ b/samples/delphi/cgi/CGI.dproj @@ -1,1083 +1,1083 @@ - - - {50F668C7-52F0-4CD4-9D35-D92A31C9DF90} - 19.5 - None - CGI.dpr - True - Debug - Win32 - 1 - Console - - - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - 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) - CGI - HORSE_CGI;$(DCC_Define) - 1033 - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - - - DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;emsclientfiredac;tethering;DataSnapFireDAC;bindcompfmx;FmxTeeUI;fmx;FireDACIBDriver;FireDACDBXDriver;dbexpress;IndyCore;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;FMXTee;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;DataSnapNativeClient;FireDACDSDriver;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;$(DCC_UsePackage) - $(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 - $(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 - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png - - - DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;emsclientfiredac;tethering;DataSnapFireDAC;bindcompfmx;FmxTeeUI;fmx;FireDACIBDriver;FireDACDBXDriver;dbexpress;IndyCore;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;FMXTee;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;DataSnapNativeClient;FireDACDSDriver;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;$(DCC_UsePackage) - $(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 - $(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 - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png - - - DBXSqliteDriver;RESTComponents;fmxase;DBXInterBaseDriver;emsclientfiredac;tethering;DataSnapFireDAC;bindcompfmx;FmxTeeUI;fmx;FireDACIBDriver;FireDACDBXDriver;dbexpress;IndyCore;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;FMXTee;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;DataSnapNativeClient;FireDACDSDriver;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;$(DCC_UsePackage) - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_1024x1024.png - - - CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers - iPhoneAndiPad - true - DBXSqliteDriver;RESTComponents;fmxase;DBXInterBaseDriver;emsclientfiredac;tethering;DataSnapFireDAC;bindcompfmx;FmxTeeUI;fmx;FireDACIBDriver;FireDACDBXDriver;dbexpress;IndyCore;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;FMXTee;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;DataSnapNativeClient;FireDACDSDriver;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;$(DCC_UsePackage);$(DCC_UsePackage) - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_1024x1024.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_120x120.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_180x180.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_2x.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_2x.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_3x.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_3x.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_80x80.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_120x120.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SettingIcon_58x58.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SettingIcon_87x87.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_NotificationIcon_40x40.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_NotificationIcon_60x60.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_152x152.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_167x167.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImage_2x.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageDark_2x.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_80x80.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SettingIcon_58x58.png - $(BDS)\bin\Artwork\iOS\iPad\FM_NotificationIcon_40x40.png - - - CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers;ITSAppUsesNonExemptEncryption=false - Debug - - - CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers;ITSAppUsesNonExemptEncryption=false - Debug - - - DBXSqliteDriver;RESTComponents;fmxase;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;bindcompvclsmp;emsclientfiredac;tethering;svnui;DataSnapFireDAC;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;svn;DBXOracleDriver;inetdb;FmxTeeUI;emsedge;fmx;FireDACIBDriver;fmxdae;vcledge;FireDACDBXDriver;dbexpress;IndyCore;boss_ide;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;TeeDB;FireDAC;emshosting;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;Tee;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;DOSCommandDR;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;TeeUI;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;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;FmxTeeUI;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;TeeDB;FireDAC;emshosting;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;Tee;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;DOSCommandDR;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;TeeUI;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 - (None) - ..\..\..\src;$(DCC_UnitSearchPath) - - - false - RELEASE;$(DCC_Define) - 0 - 0 - - - - MainSource - - - Base - - - Cfg_1 - Base - - - Cfg_2 - Base - - - - Delphi.Personality.12 - Application - - - - CGI.dpr - - - ExpressPivotGrid OLAP by Developer Express Inc. - Microsoft Office 2000 Sample Automation Server Wrapper Components - Microsoft Office XP Sample Automation Server Wrapper Components - - - - - - true - - - - - true - - - - - true - - - - - 1 - - - Contents\MacOS - 1 - - - 0 - - - - - classes - 64 - - - classes - 64 - - - - - 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-xxxhdpi - 1 - - - res\drawable-xxxhdpi - 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 - - - Contents\MacOS - 1 - .framework - - - 0 - - - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - Contents\MacOS - 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 - - - Contents\MacOS - 1 - .dylib - - - 0 - .bpl - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - Contents\Resources\StartUp\ - 0 - - - Contents\Resources\StartUp\ - 0 - - - Contents\Resources\StartUp\ - 0 - - - 0 - - - - - 1 - - - 1 - - - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - - - ..\ - 1 - - - ..\ - 1 - - - ..\ - 1 - - - - - Contents - 1 - - - Contents - 1 - - - Contents - 1 - - - - - Contents\Resources - 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 - - - Contents\MacOS - 1 - - - 0 - - - - - library\lib\armeabi-v7a - 1 - - - - - 1 - - - 1 - - - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - - - ..\ - 1 - - - ..\ - 1 - - - ..\ - 1 - - - - - 1 - - - 1 - - - 1 - - - - - ..\$(PROJECTNAME).launchscreen - 64 - - - ..\$(PROJECTNAME).launchscreen - 64 - - - - - 1 - - - 1 - - - 1 - - - - - Assets - 1 - - - Assets - 1 - - - - - Assets - 1 - - - Assets - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 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\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 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\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - - - - - - - - - - - - False - False - False - False - False - False - False - True - False - - - 12 - - - - - + + + {50F668C7-52F0-4CD4-9D35-D92A31C9DF90} + 19.5 + None + CGI.dpr + True + Debug + Win32 + 1 + Console + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + 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) + CGI + HORSE_CGI;$(DCC_Define) + 1033 + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + + + DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;emsclientfiredac;tethering;DataSnapFireDAC;bindcompfmx;FmxTeeUI;fmx;FireDACIBDriver;FireDACDBXDriver;dbexpress;IndyCore;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;FMXTee;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;DataSnapNativeClient;FireDACDSDriver;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;$(DCC_UsePackage) + $(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 + $(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 + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png + + + DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;emsclientfiredac;tethering;DataSnapFireDAC;bindcompfmx;FmxTeeUI;fmx;FireDACIBDriver;FireDACDBXDriver;dbexpress;IndyCore;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;FMXTee;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;DataSnapNativeClient;FireDACDSDriver;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;$(DCC_UsePackage) + $(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 + $(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 + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png + + + DBXSqliteDriver;RESTComponents;fmxase;DBXInterBaseDriver;emsclientfiredac;tethering;DataSnapFireDAC;bindcompfmx;FmxTeeUI;fmx;FireDACIBDriver;FireDACDBXDriver;dbexpress;IndyCore;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;FMXTee;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;DataSnapNativeClient;FireDACDSDriver;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;$(DCC_UsePackage) + $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_1024x1024.png + + + CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers + iPhoneAndiPad + true + DBXSqliteDriver;RESTComponents;fmxase;DBXInterBaseDriver;emsclientfiredac;tethering;DataSnapFireDAC;bindcompfmx;FmxTeeUI;fmx;FireDACIBDriver;FireDACDBXDriver;dbexpress;IndyCore;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;FMXTee;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;DataSnapNativeClient;FireDACDSDriver;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;$(DCC_UsePackage);$(DCC_UsePackage) + $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_1024x1024.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_120x120.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_180x180.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_2x.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_2x.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_3x.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_3x.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_80x80.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_120x120.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_SettingIcon_58x58.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_SettingIcon_87x87.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_NotificationIcon_40x40.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_NotificationIcon_60x60.png + $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_152x152.png + $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_167x167.png + $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImage_2x.png + $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageDark_2x.png + $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_80x80.png + $(BDS)\bin\Artwork\iOS\iPad\FM_SettingIcon_58x58.png + $(BDS)\bin\Artwork\iOS\iPad\FM_NotificationIcon_40x40.png + + + CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers;ITSAppUsesNonExemptEncryption=false + Debug + + + CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers;ITSAppUsesNonExemptEncryption=false + Debug + + + DBXSqliteDriver;RESTComponents;fmxase;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;bindcompvclsmp;emsclientfiredac;tethering;svnui;DataSnapFireDAC;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;svn;DBXOracleDriver;inetdb;FmxTeeUI;emsedge;fmx;FireDACIBDriver;fmxdae;vcledge;FireDACDBXDriver;dbexpress;IndyCore;boss_ide;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;TeeDB;FireDAC;emshosting;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;Tee;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;DOSCommandDR;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;TeeUI;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;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;FmxTeeUI;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;TeeDB;FireDAC;emshosting;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;Tee;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;DOSCommandDR;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;TeeUI;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 + (None) + ..\..\..\src;$(DCC_UnitSearchPath) + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + + MainSource + + + Base + + + Cfg_1 + Base + + + Cfg_2 + Base + + + + Delphi.Personality.12 + Application + + + + CGI.dpr + + + ExpressPivotGrid OLAP by Developer Express Inc. + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + + + + + + true + + + + + true + + + + + true + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + classes + 64 + + + classes + 64 + + + + + 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-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 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 + + + Contents\MacOS + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 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 + + + Contents\MacOS + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + Contents\Resources\StartUp\ + 0 + + + Contents\Resources\StartUp\ + 0 + + + Contents\Resources\StartUp\ + 0 + + + 0 + + + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + ..\ + 1 + + + + + Contents + 1 + + + Contents + 1 + + + Contents + 1 + + + + + Contents\Resources + 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 + + + Contents\MacOS + 1 + + + 0 + + + + + library\lib\armeabi-v7a + 1 + + + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + ..\ + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).launchscreen + 64 + + + ..\$(PROJECTNAME).launchscreen + 64 + + + + + 1 + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 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\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 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\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + + + + + + + + + + + + False + False + False + False + False + False + False + True + False + + + 12 + + + + + diff --git a/samples/delphi/console/Console.dpr b/samples/delphi/console/Console.dpr index f429575..c91a5e8 100644 --- a/samples/delphi/console/Console.dpr +++ b/samples/delphi/console/Console.dpr @@ -1,28 +1,132 @@ -program Console; - -{$APPTYPE CONSOLE} -{$R *.res} - -uses - Horse, - System.SysUtils; - -begin - {$IFDEF MSWINDOWS} - IsConsole := False; - ReportMemoryLeaksOnShutdown := True; - {$ENDIF} - - THorse.Get('/ping', - procedure(Req: THorseRequest; Res: THorseResponse) - begin - Res.Send('pong'); - end); - - THorse.Listen(9000, - procedure - begin - Writeln(Format('Server is runing on %s:%d', [THorse.Host, THorse.Port])); - Readln; - end); -end. +program Console; + +{$APPTYPE CONSOLE} +{$R *.res} + +uses + Horse, + System.Classes, + System.SysUtils, + {$IFDEF LINUX} + Posix.Signal, // Linux signal constants + {$ENDIF} + Horse.Provider.ISAPI in '..\..\..\src\Horse.Provider.ISAPI.pas', + Horse.Provider.VCL in '..\..\..\src\Horse.Provider.VCL.pas', + Horse.Request in '..\..\..\src\Horse.Request.pas', + Horse.Response in '..\..\..\src\Horse.Response.pas', + Horse.Rtti.Helper in '..\..\..\src\Horse.Rtti.Helper.pas', + Horse.Rtti in '..\..\..\src\Horse.Rtti.pas', + Horse.Session in '..\..\..\src\Horse.Session.pas', + Horse.WebModule in '..\..\..\src\Horse.WebModule.pas', + ThirdParty.Posix.Syslog in '..\..\..\src\ThirdParty.Posix.Syslog.pas', + Web.WebConst in '..\..\..\src\Web.WebConst.pas', + Horse.Callback in '..\..\..\src\Horse.Callback.pas', + Horse.Commons in '..\..\..\src\Horse.Commons.pas', + Horse.Constants in '..\..\..\src\Horse.Constants.pas', + Horse.Core.Files in '..\..\..\src\Horse.Core.Files.pas', + Horse.Core.Group.Contract in '..\..\..\src\Horse.Core.Group.Contract.pas', + Horse.Core.Group in '..\..\..\src\Horse.Core.Group.pas', + Horse.Core.Param.Config in '..\..\..\src\Horse.Core.Param.Config.pas', + Horse.Core.Param.Field.Brackets in '..\..\..\src\Horse.Core.Param.Field.Brackets.pas', + Horse.Core.Param.Field in '..\..\..\src\Horse.Core.Param.Field.pas', + Horse.Core.Param.Header in '..\..\..\src\Horse.Core.Param.Header.pas', + Horse.Core.Param in '..\..\..\src\Horse.Core.Param.pas', + Horse.Core in '..\..\..\src\Horse.Core.pas', + Horse.Core.Route.Contract in '..\..\..\src\Horse.Core.Route.Contract.pas', + Horse.Core.Route in '..\..\..\src\Horse.Core.Route.pas', + Horse.Core.RouterTree.NextCaller in '..\..\..\src\Horse.Core.RouterTree.NextCaller.pas', + Horse.Core.RouterTree in '..\..\..\src\Horse.Core.RouterTree.pas', + Horse.EnvironmentVariables in '..\..\..\src\Horse.EnvironmentVariables.pas', + Horse.Exception.Interrupted in '..\..\..\src\Horse.Exception.Interrupted.pas', + Horse.Exception in '..\..\..\src\Horse.Exception.pas', + Horse.Mime in '..\..\..\src\Horse.Mime.pas', + Horse.Provider.Config in '..\..\..\src\Horse.Provider.Config.pas', + Horse.Provider.Console in '..\..\..\src\Horse.Provider.Console.pas', + Horse.Provider.Daemon in '..\..\..\src\Horse.Provider.Daemon.pas'; + +var + Config: THorseCrossSocketConfig; + {$IFDEF LINUX} + GShutdown: Boolean = False; + {$ENDIF} + +{$IFDEF LINUX} +// Signal handler — called on SIGTERM or SIGINT +procedure HandleSignal(Sig: Integer); cdecl; +begin + GShutdown := True; +end; +{$ENDIF} + + +begin + {$IFDEF MSWINDOWS} + IsConsole := False; + ReportMemoryLeaksOnShutdown := True; + {$ENDIF} + + {$IFDEF LINUX} + // Install signal handlers + signal(SIGTERM, HandleSignal); + signal(SIGINT, HandleSignal); + {$ENDIF} + + + // ── Routes ──────────────────────────────────────────────────────── + THorse.Get('/ping', + procedure(Req: THorseRequest; Res: THorseResponse) + begin + Res.ContentType('text/plain; charset=utf-8'); + Res.Send('pong'); + end); + + THorse.Get('/health', + procedure(Req: THorseRequest; Res: THorseResponse) + begin + Res.Send('{"status":"ok"}'); + end); + + THorse.Post('/echo', + procedure(Req: THorseRequest; Res: THorseResponse) + begin + Res.ContentType(Req.ContentType); + Res.Send(Req.Body); + end); + + // ── Config ──────────────────────────────────────────────────────── + Config := THorseCrossSocketConfig.Default; + Config.IoThreads := 0; // 0 = CrossSocket picks CPU-count threads + Config.MaxBodySize := 8 * 1024 * 1024; // 8 MB + Config.MaxHeaderSize := 8192; + Config.KeepAliveTimeout := 30; + Config.ReadTimeout := 20; + + // ── Start ───────────────────────────────────────────────────────── + // ListenWithConfig is non-blocking: Start() launches epoll/IO threads + // then returns. The main thread MUST block or the process exits. + THorse.ListenWithConfig(8080, Config); + WriteLn('Server started on :8080 (press Ctrl+C to stop)'); + + // ── Keep-alive loop ─────────────────────────────────────────────── + // ReadLn blocks the main thread. In production replace with a + // signal handler (see Phase 8). In Docker, stdin is /dev/null so + // ReadLn returns immediately — use the signal-handler pattern. + + {$IFDEF MSWINDOWS} + ReadLn; + THorse.StopListen; + {$ENDIF} + + {$IFDEF LINUX} + // Keep-alive loop — wakes every 100ms to check GShutdown + while not GShutdown do + Sleep(100); + + WriteLn('Shutdown signal received — draining...'); + THorse.StopListen; + WriteLn('Stopped.'); + {$ENDIF} + + +end. + diff --git a/samples/delphi/console/Console.dproj b/samples/delphi/console/Console.dproj index 4b1c2c7..4c1e650 100644 --- a/samples/delphi/console/Console.dproj +++ b/samples/delphi/console/Console.dproj @@ -1,1149 +1,1170 @@ - - - {2AF29AEE-B106-4674-AB7E-25CE8D53056B} - 20.3 - None - True - Debug - Win32 - 1 - Console - Console.dpr - Console - - - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - 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) - Console - - - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png - 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 - annotation-1.2.0.dex.jar;asynclayoutinflater-1.0.0.dex.jar;billing-4.0.0.dex.jar;browser-1.0.0.dex.jar;cloud-messaging.dex.jar;collection-1.0.0.dex.jar;coordinatorlayout-1.0.0.dex.jar;core-1.5.0-rc02.dex.jar;core-common-2.0.1.dex.jar;core-runtime-2.0.1.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;firebase-annotations-16.0.0.dex.jar;firebase-common-20.0.0.dex.jar;firebase-components-17.0.0.dex.jar;firebase-datatransport-18.0.0.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.0.0.dex.jar;firebase-installations-interop-17.0.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-22.0.0.dex.jar;fmx.dex.jar;fragment-1.0.0.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;legacy-support-core-ui-1.0.0.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.0.0.dex.jar;lifecycle-livedata-2.0.0.dex.jar;lifecycle-livedata-core-2.0.0.dex.jar;lifecycle-runtime-2.0.0.dex.jar;lifecycle-service-2.0.0.dex.jar;lifecycle-viewmodel-2.0.0.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;play-services-ads-20.1.0.dex.jar;play-services-ads-base-20.1.0.dex.jar;play-services-ads-identifier-17.0.0.dex.jar;play-services-ads-lite-20.1.0.dex.jar;play-services-base-17.5.0.dex.jar;play-services-basement-17.6.0.dex.jar;play-services-cloud-messaging-16.0.0.dex.jar;play-services-drive-17.0.0.dex.jar;play-services-games-21.0.0.dex.jar;play-services-location-18.0.0.dex.jar;play-services-maps-17.0.1.dex.jar;play-services-measurement-base-18.0.0.dex.jar;play-services-measurement-sdk-api-18.0.0.dex.jar;play-services-places-placereport-17.0.0.dex.jar;play-services-stats-17.0.0.dex.jar;play-services-tasks-17.2.0.dex.jar;print-1.0.0.dex.jar;room-common-2.1.0.dex.jar;room-runtime-2.1.0.dex.jar;slidingpanelayout-1.0.0.dex.jar;sqlite-2.0.1.dex.jar;sqlite-framework-2.0.1.dex.jar;swiperefreshlayout-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.0.0.dex.jar;transport-runtime-3.0.0.dex.jar;user-messaging-platform-1.0.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.1.0.dex.jar - - - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png - 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 - annotation-1.2.0.dex.jar;asynclayoutinflater-1.0.0.dex.jar;billing-4.0.0.dex.jar;browser-1.0.0.dex.jar;cloud-messaging.dex.jar;collection-1.0.0.dex.jar;coordinatorlayout-1.0.0.dex.jar;core-1.5.0-rc02.dex.jar;core-common-2.0.1.dex.jar;core-runtime-2.0.1.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;firebase-annotations-16.0.0.dex.jar;firebase-common-20.0.0.dex.jar;firebase-components-17.0.0.dex.jar;firebase-datatransport-18.0.0.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.0.0.dex.jar;firebase-installations-interop-17.0.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-22.0.0.dex.jar;fmx.dex.jar;fragment-1.0.0.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;legacy-support-core-ui-1.0.0.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.0.0.dex.jar;lifecycle-livedata-2.0.0.dex.jar;lifecycle-livedata-core-2.0.0.dex.jar;lifecycle-runtime-2.0.0.dex.jar;lifecycle-service-2.0.0.dex.jar;lifecycle-viewmodel-2.0.0.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;play-services-ads-20.1.0.dex.jar;play-services-ads-base-20.1.0.dex.jar;play-services-ads-identifier-17.0.0.dex.jar;play-services-ads-lite-20.1.0.dex.jar;play-services-base-17.5.0.dex.jar;play-services-basement-17.6.0.dex.jar;play-services-cloud-messaging-16.0.0.dex.jar;play-services-drive-17.0.0.dex.jar;play-services-games-21.0.0.dex.jar;play-services-location-18.0.0.dex.jar;play-services-maps-17.0.1.dex.jar;play-services-measurement-base-18.0.0.dex.jar;play-services-measurement-sdk-api-18.0.0.dex.jar;play-services-places-placereport-17.0.0.dex.jar;play-services-stats-17.0.0.dex.jar;play-services-tasks-17.2.0.dex.jar;print-1.0.0.dex.jar;room-common-2.1.0.dex.jar;room-runtime-2.1.0.dex.jar;slidingpanelayout-1.0.0.dex.jar;sqlite-2.0.1.dex.jar;sqlite-framework-2.0.1.dex.jar;swiperefreshlayout-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.0.0.dex.jar;transport-runtime-3.0.0.dex.jar;user-messaging-platform-1.0.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.1.0.dex.jar - - - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_1024x1024.png - CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers - iPhoneAndiPad - true - Debug - $(MSBuildProjectName) - - - CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers - iPhoneAndiPad - true - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_1024x1024.png - - - DBXSqliteDriver;RESTComponents;fmxase;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;bindcompvclsmp;emsclientfiredac;tethering;svnui;DataSnapFireDAC;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;svn;DBXOracleDriver;inetdb;FmxTeeUI;emsedge;fmx;FireDACIBDriver;fmxdae;vcledge;FireDACDBXDriver;dbexpress;IndyCore;boss_ide;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;TeeDB;FireDAC;emshosting;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;Tee;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;DOSCommandDR;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;TeeUI;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;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;FmxTeeUI;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;TeeDB;FireDAC;emshosting;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;Tee;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;DOSCommandDR;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;TeeUI;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 - ..\..\..\src;$(DCC_UnitSearchPath) - 1033 - (None) - - - false - RELEASE;$(DCC_Define) - 0 - 0 - - - - MainSource - - - Base - - - Cfg_1 - Base - - - Cfg_2 - Base - - - - Delphi.Personality.12 - Application - - - - Console.dpr - - - Embarcadero DBExpress DataSnap Native Server Components - Microsoft Office 2000 Sample Automation Server Wrapper Components - Microsoft Office XP Sample Automation Server Wrapper Components - - - - False - False - False - False - True - False - - - - - true - - - - - true - - - - - true - - - - - - 1 - - - Contents\MacOS - 1 - - - 0 - - - - - res\xml - 1 - - - res\xml - 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\drawable-anydpi-v21 - 1 - - - res\drawable-anydpi-v21 - 1 - - - - - res\values - 1 - - - res\values - 1 - - - - - res\values-v21 - 1 - - - res\values-v21 - 1 - - - - - res\values-v31 - 1 - - - res\values-v31 - 1 - - - - - res\values-v35 - 1 - - - res\values-v35 - 1 - - - - - res\drawable-anydpi-v26 - 1 - - - res\drawable-anydpi-v26 - 1 - - - - - res\drawable - 1 - - - res\drawable - 1 - - - - - res\drawable - 1 - - - res\drawable - 1 - - - - - res\drawable - 1 - - - res\drawable - 1 - - - - - res\drawable-anydpi-v33 - 1 - - - res\drawable-anydpi-v33 - 1 - - - - - res\values - 1 - - - res\values - 1 - - - - - res\values-night-v21 - 1 - - - res\values-night-v21 - 1 - - - - - res\drawable - 1 - - - res\drawable - 1 - - - - - res\drawable-xxhdpi - 1 - - - res\drawable-xxhdpi - 1 - - - - - res\drawable-xxxhdpi - 1 - - - res\drawable-xxxhdpi - 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 - - - - - res\drawable-anydpi-v24 - 1 - - - res\drawable-anydpi-v24 - 1 - - - - - res\drawable - 1 - - - res\drawable - 1 - - - - - res\drawable-night-anydpi-v21 - 1 - - - res\drawable-night-anydpi-v21 - 1 - - - - - res\drawable-anydpi-v31 - 1 - - - res\drawable-anydpi-v31 - 1 - - - - - res\drawable-night-anydpi-v31 - 1 - - - res\drawable-night-anydpi-v31 - 1 - - - - - 1 - - - Contents\MacOS - 1 - - - 0 - - - - - Contents\MacOS - 1 - .framework - - - Contents\MacOS - 1 - .framework - - - Contents\MacOS - 1 - .framework - - - 0 - - - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - Contents\MacOS - 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 - - - Contents\MacOS - 1 - .dylib - - - 0 - .bpl - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - Contents\Resources\StartUp\ - 0 - - - Contents\Resources\StartUp\ - 0 - - - Contents\Resources\StartUp\ - 0 - - - 0 - - - - - 1 - - - 1 - - - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - - - ..\ - 1 - - - ..\ - 1 - - - ..\ - 1 - - - - - Contents - 1 - - - Contents - 1 - - - Contents - 1 - - - - - Contents\Resources - 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 - - - Contents\MacOS - 1 - - - 0 - - - - - library\lib\armeabi-v7a - 1 - - - - - 1 - - - 1 - - - 1 - - - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - - - ..\ - 1 - - - ..\ - 1 - - - ..\ - 1 - - - - - 1 - - - 1 - - - 1 - - - - - ..\$(PROJECTNAME).launchscreen - 64 - - - ..\$(PROJECTNAME).launchscreen - 64 - - - - - 1 - - - 1 - - - 1 - - - - - Assets - 1 - - - Assets - 1 - - - - - Assets - 1 - - - Assets - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 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\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 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\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - - - - - - - - - - - - - - 12 - - - - - + + + {2AF29AEE-B106-4674-AB7E-25CE8D53056B} + 19.2 + None + True + Debug + Win32 + 129 + Console + Console.dpr + Console + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + 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) + Console + HORSE_CROSSSOCKET;$(DCC_Define) + ..\..\..\..\Delphi-Cross-Socket;..\..\..\..\Delphi-Cross-Socket\Net;..\..\..\..\Delphi-Cross-Socket\Utils;..\..\..\..\Delphi-Cross-Socket\CnPack\Common;..\..\..\..\Delphi-Cross-Socket\CnPack\Crypto;..\..\..\..\horse-provider-crosssocket\src;..\..\..\..\Delphi-Cross-Socket\DelphiToFPC;$(DCC_UnitSearchPath) + + + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png + 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 + annotation-1.2.0.dex.jar;asynclayoutinflater-1.0.0.dex.jar;billing-4.0.0.dex.jar;browser-1.0.0.dex.jar;cloud-messaging.dex.jar;collection-1.0.0.dex.jar;coordinatorlayout-1.0.0.dex.jar;core-1.5.0-rc02.dex.jar;core-common-2.0.1.dex.jar;core-runtime-2.0.1.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;firebase-annotations-16.0.0.dex.jar;firebase-common-20.0.0.dex.jar;firebase-components-17.0.0.dex.jar;firebase-datatransport-18.0.0.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.0.0.dex.jar;firebase-installations-interop-17.0.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-22.0.0.dex.jar;fmx.dex.jar;fragment-1.0.0.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;legacy-support-core-ui-1.0.0.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.0.0.dex.jar;lifecycle-livedata-2.0.0.dex.jar;lifecycle-livedata-core-2.0.0.dex.jar;lifecycle-runtime-2.0.0.dex.jar;lifecycle-service-2.0.0.dex.jar;lifecycle-viewmodel-2.0.0.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;play-services-ads-20.1.0.dex.jar;play-services-ads-base-20.1.0.dex.jar;play-services-ads-identifier-17.0.0.dex.jar;play-services-ads-lite-20.1.0.dex.jar;play-services-base-17.5.0.dex.jar;play-services-basement-17.6.0.dex.jar;play-services-cloud-messaging-16.0.0.dex.jar;play-services-drive-17.0.0.dex.jar;play-services-games-21.0.0.dex.jar;play-services-location-18.0.0.dex.jar;play-services-maps-17.0.1.dex.jar;play-services-measurement-base-18.0.0.dex.jar;play-services-measurement-sdk-api-18.0.0.dex.jar;play-services-places-placereport-17.0.0.dex.jar;play-services-stats-17.0.0.dex.jar;play-services-tasks-17.2.0.dex.jar;print-1.0.0.dex.jar;room-common-2.1.0.dex.jar;room-runtime-2.1.0.dex.jar;slidingpanelayout-1.0.0.dex.jar;sqlite-2.0.1.dex.jar;sqlite-framework-2.0.1.dex.jar;swiperefreshlayout-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.0.0.dex.jar;transport-runtime-3.0.0.dex.jar;user-messaging-platform-1.0.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.1.0.dex.jar + + + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png + 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 + annotation-1.2.0.dex.jar;asynclayoutinflater-1.0.0.dex.jar;billing-4.0.0.dex.jar;browser-1.0.0.dex.jar;cloud-messaging.dex.jar;collection-1.0.0.dex.jar;coordinatorlayout-1.0.0.dex.jar;core-1.5.0-rc02.dex.jar;core-common-2.0.1.dex.jar;core-runtime-2.0.1.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;firebase-annotations-16.0.0.dex.jar;firebase-common-20.0.0.dex.jar;firebase-components-17.0.0.dex.jar;firebase-datatransport-18.0.0.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.0.0.dex.jar;firebase-installations-interop-17.0.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-22.0.0.dex.jar;fmx.dex.jar;fragment-1.0.0.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;legacy-support-core-ui-1.0.0.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.0.0.dex.jar;lifecycle-livedata-2.0.0.dex.jar;lifecycle-livedata-core-2.0.0.dex.jar;lifecycle-runtime-2.0.0.dex.jar;lifecycle-service-2.0.0.dex.jar;lifecycle-viewmodel-2.0.0.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;play-services-ads-20.1.0.dex.jar;play-services-ads-base-20.1.0.dex.jar;play-services-ads-identifier-17.0.0.dex.jar;play-services-ads-lite-20.1.0.dex.jar;play-services-base-17.5.0.dex.jar;play-services-basement-17.6.0.dex.jar;play-services-cloud-messaging-16.0.0.dex.jar;play-services-drive-17.0.0.dex.jar;play-services-games-21.0.0.dex.jar;play-services-location-18.0.0.dex.jar;play-services-maps-17.0.1.dex.jar;play-services-measurement-base-18.0.0.dex.jar;play-services-measurement-sdk-api-18.0.0.dex.jar;play-services-places-placereport-17.0.0.dex.jar;play-services-stats-17.0.0.dex.jar;play-services-tasks-17.2.0.dex.jar;print-1.0.0.dex.jar;room-common-2.1.0.dex.jar;room-runtime-2.1.0.dex.jar;slidingpanelayout-1.0.0.dex.jar;sqlite-2.0.1.dex.jar;sqlite-framework-2.0.1.dex.jar;swiperefreshlayout-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.0.0.dex.jar;transport-runtime-3.0.0.dex.jar;user-messaging-platform-1.0.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.1.0.dex.jar + + + $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_1024x1024.png + CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers + iPhoneAndiPad + true + Debug + $(MSBuildProjectName) + + + CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers + iPhoneAndiPad + true + + + CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers + Debug + + + DBXSqliteDriver;RESTComponents;fmxase;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;bindcompvclsmp;emsclientfiredac;tethering;svnui;DataSnapFireDAC;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;svn;DBXOracleDriver;inetdb;FmxTeeUI;emsedge;fmx;FireDACIBDriver;fmxdae;vcledge;FireDACDBXDriver;dbexpress;IndyCore;boss_ide;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;TeeDB;FireDAC;emshosting;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;Tee;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;DOSCommandDR;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;TeeUI;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;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;FmxTeeUI;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;TeeDB;FireDAC;emshosting;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;Tee;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;DOSCommandDR;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;TeeUI;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 + + + /usr/bin/xterm -e "%debuggee%" + (None) + + + false + ..\..\..\src;$(DCC_UnitSearchPath) + 1033 + (None) + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + + MainSource + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + + + + Delphi.Personality.12 + Application + + + + Console.dpr + + + File C:\lang\Tools\Code4D\Install-BPLs\Delphi-10.4-Sydney\C4DWizard.bpl not found + + + + False + False + False + False + True + False + True + False + + + + + true + + + + + true + + + + + true + + + + + + Console.exe + 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\drawable-anydpi-v21 + 1 + + + res\drawable-anydpi-v21 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-v21 + 1 + + + res\values-v21 + 1 + + + + + res\values-v31 + 1 + + + res\values-v31 + 1 + + + + + res\values-v35 + 1 + + + res\values-v35 + 1 + + + + + res\drawable-anydpi-v26 + 1 + + + res\drawable-anydpi-v26 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-anydpi-v33 + 1 + + + res\drawable-anydpi-v33 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-night-v21 + 1 + + + res\values-night-v21 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 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 + + + + + res\drawable-anydpi-v24 + 1 + + + res\drawable-anydpi-v24 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-night-anydpi-v21 + 1 + + + res\drawable-night-anydpi-v21 + 1 + + + + + res\drawable-anydpi-v31 + 1 + + + res\drawable-anydpi-v31 + 1 + + + + + res\drawable-night-anydpi-v31 + 1 + + + res\drawable-night-anydpi-v31 + 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\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 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\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 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\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).launchscreen + 64 + + + ..\$(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/samples/delphi/daemon/Daemon.dpr b/samples/delphi/daemon/Daemon.dpr index 4e69506..a05fb58 100644 --- a/samples/delphi/daemon/Daemon.dpr +++ b/samples/delphi/daemon/Daemon.dpr @@ -1,18 +1,18 @@ -program Daemon; - -{$APPTYPE CONSOLE} -{$R *.res} - -uses Horse, System.SysUtils; - -begin - // Need to set "HORSE_DAEMON" compilation directive - - THorse.Get('/ping', - procedure(Req: THorseRequest; Res: THorseResponse) - begin - Res.Send('pong'); - end); - - THorse.Listen; -end. +program Daemon; + +{$APPTYPE CONSOLE} +{$R *.res} + +uses Horse, System.SysUtils; + +begin + // Need to set "HORSE_DAEMON" compilation directive + + THorse.Get('/ping', + procedure(Req: THorseRequest; Res: THorseResponse) + begin + Res.Send('pong'); + end); + + THorse.Listen; +end. diff --git a/samples/delphi/daemon/Daemon.dproj b/samples/delphi/daemon/Daemon.dproj index 21d90c0..daca7c8 100644 --- a/samples/delphi/daemon/Daemon.dproj +++ b/samples/delphi/daemon/Daemon.dproj @@ -1,1058 +1,1058 @@ - - - {3F83277E-6D05-4129-9F4B-8FD4FFC8C3AE} - 19.5 - None - Daemon.dpr - True - Debug - Linux64 - 128 - Console - - - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Cfg_1 - true - 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) - Daemon - HORSE_DAEMON;$(DCC_Define) - 1033 - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - - - 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 - activity-1.1.0.dex.jar;annotation-1.2.0.dex.jar;appcompat-1.2.0.dex.jar;appcompat-resources-1.2.0.dex.jar;asynclayoutinflater-1.0.0.dex.jar;billing-4.0.0.dex.jar;biometric-1.1.0.dex.jar;browser-1.0.0.dex.jar;cloud-messaging.dex.jar;collection-1.1.0.dex.jar;coordinatorlayout-1.0.0.dex.jar;core-1.5.0-rc02.dex.jar;core-common-2.1.0.dex.jar;core-runtime-2.1.0.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;firebase-annotations-16.0.0.dex.jar;firebase-common-20.0.0.dex.jar;firebase-components-17.0.0.dex.jar;firebase-datatransport-18.0.0.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.0.0.dex.jar;firebase-installations-interop-17.0.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-22.0.0.dex.jar;fmx.dex.jar;fragment-1.2.5.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;legacy-support-core-ui-1.0.0.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.2.0.dex.jar;lifecycle-livedata-2.0.0.dex.jar;lifecycle-livedata-core-2.2.0.dex.jar;lifecycle-runtime-2.2.0.dex.jar;lifecycle-service-2.0.0.dex.jar;lifecycle-viewmodel-2.2.0.dex.jar;lifecycle-viewmodel-savedstate-2.2.0.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;play-services-ads-20.1.0.dex.jar;play-services-ads-base-20.1.0.dex.jar;play-services-ads-identifier-17.0.0.dex.jar;play-services-ads-lite-20.1.0.dex.jar;play-services-base-17.5.0.dex.jar;play-services-basement-17.6.0.dex.jar;play-services-cloud-messaging-16.0.0.dex.jar;play-services-drive-17.0.0.dex.jar;play-services-games-21.0.0.dex.jar;play-services-location-18.0.0.dex.jar;play-services-maps-17.0.1.dex.jar;play-services-measurement-base-18.0.0.dex.jar;play-services-measurement-sdk-api-18.0.0.dex.jar;play-services-places-placereport-17.0.0.dex.jar;play-services-stats-17.0.0.dex.jar;play-services-tasks-17.2.0.dex.jar;print-1.0.0.dex.jar;room-common-2.1.0.dex.jar;room-runtime-2.1.0.dex.jar;savedstate-1.0.0.dex.jar;slidingpanelayout-1.0.0.dex.jar;sqlite-2.0.1.dex.jar;sqlite-framework-2.0.1.dex.jar;swiperefreshlayout-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.0.0.dex.jar;transport-runtime-3.0.0.dex.jar;user-messaging-platform-1.0.0.dex.jar;vectordrawable-1.1.0.dex.jar;vectordrawable-animated-1.1.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.1.0.dex.jar - - - 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 - activity-1.1.0.dex.jar;annotation-1.2.0.dex.jar;appcompat-1.2.0.dex.jar;appcompat-resources-1.2.0.dex.jar;asynclayoutinflater-1.0.0.dex.jar;billing-4.0.0.dex.jar;biometric-1.1.0.dex.jar;browser-1.0.0.dex.jar;cloud-messaging.dex.jar;collection-1.1.0.dex.jar;coordinatorlayout-1.0.0.dex.jar;core-1.5.0-rc02.dex.jar;core-common-2.1.0.dex.jar;core-runtime-2.1.0.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;firebase-annotations-16.0.0.dex.jar;firebase-common-20.0.0.dex.jar;firebase-components-17.0.0.dex.jar;firebase-datatransport-18.0.0.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.0.0.dex.jar;firebase-installations-interop-17.0.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-22.0.0.dex.jar;fmx.dex.jar;fragment-1.2.5.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;legacy-support-core-ui-1.0.0.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.2.0.dex.jar;lifecycle-livedata-2.0.0.dex.jar;lifecycle-livedata-core-2.2.0.dex.jar;lifecycle-runtime-2.2.0.dex.jar;lifecycle-service-2.0.0.dex.jar;lifecycle-viewmodel-2.2.0.dex.jar;lifecycle-viewmodel-savedstate-2.2.0.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;play-services-ads-20.1.0.dex.jar;play-services-ads-base-20.1.0.dex.jar;play-services-ads-identifier-17.0.0.dex.jar;play-services-ads-lite-20.1.0.dex.jar;play-services-base-17.5.0.dex.jar;play-services-basement-17.6.0.dex.jar;play-services-cloud-messaging-16.0.0.dex.jar;play-services-drive-17.0.0.dex.jar;play-services-games-21.0.0.dex.jar;play-services-location-18.0.0.dex.jar;play-services-maps-17.0.1.dex.jar;play-services-measurement-base-18.0.0.dex.jar;play-services-measurement-sdk-api-18.0.0.dex.jar;play-services-places-placereport-17.0.0.dex.jar;play-services-stats-17.0.0.dex.jar;play-services-tasks-17.2.0.dex.jar;print-1.0.0.dex.jar;room-common-2.1.0.dex.jar;room-runtime-2.1.0.dex.jar;savedstate-1.0.0.dex.jar;slidingpanelayout-1.0.0.dex.jar;sqlite-2.0.1.dex.jar;sqlite-framework-2.0.1.dex.jar;swiperefreshlayout-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.0.0.dex.jar;transport-runtime-3.0.0.dex.jar;user-messaging-platform-1.0.0.dex.jar;vectordrawable-1.1.0.dex.jar;vectordrawable-animated-1.1.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.1.0.dex.jar - - - CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers - iPhoneAndiPad - true - Debug - $(MSBuildProjectName) - - - CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers - iPhoneAndiPad - true - - - ..\..\..\src;$(DCC_UnitSearchPath) - /usr/bin/xterm -e "%debuggee%" - (None) - - - CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers;ITSAppUsesNonExemptEncryption=false - Debug - - - CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers;ITSAppUsesNonExemptEncryption=false - Debug - - - DBXSqliteDriver;RESTComponents;fmxase;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;bindcompvclsmp;emsclientfiredac;tethering;svnui;DataSnapFireDAC;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;svn;DBXOracleDriver;inetdb;FmxTeeUI;emsedge;fmx;FireDACIBDriver;fmxdae;vcledge;FireDACDBXDriver;dbexpress;IndyCore;boss_ide;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;TeeDB;FireDAC;emshosting;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;Tee;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;DOSCommandDR;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;TeeUI;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;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;FmxTeeUI;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;TeeDB;FireDAC;emshosting;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;Tee;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;DOSCommandDR;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;TeeUI;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 - - - /usr/bin/xterm -e "%debuggee%" - (None) - - - false - 1033 - (None) - - - false - RELEASE;$(DCC_Define) - 0 - 0 - - - - MainSource - - - Base - - - Cfg_1 - Base - - - Cfg_2 - Base - - - - Delphi.Personality.12 - Application - - - - Daemon.dpr - - - Microsoft Office 2000 Sample Automation Server Wrapper Components - Microsoft Office XP Sample Automation Server Wrapper Components - - - - - - true - - - - - true - - - - - true - - - - - - 1 - - - Contents\MacOS - 1 - - - 0 - - - - - classes - 64 - - - classes - 64 - - - - - 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-xxxhdpi - 1 - - - res\drawable-xxxhdpi - 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 - - - Contents\MacOS - 1 - .framework - - - 0 - - - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - Contents\MacOS - 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 - - - Contents\MacOS - 1 - .dylib - - - 0 - .bpl - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - Contents\Resources\StartUp\ - 0 - - - Contents\Resources\StartUp\ - 0 - - - Contents\Resources\StartUp\ - 0 - - - 0 - - - - - 1 - - - 1 - - - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - - - ..\ - 1 - - - ..\ - 1 - - - ..\ - 1 - - - - - Contents - 1 - - - Contents - 1 - - - Contents - 1 - - - - - Contents\Resources - 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 - - - Contents\MacOS - 1 - - - 0 - - - - - library\lib\armeabi-v7a - 1 - - - - - 1 - - - 1 - - - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - - - ..\ - 1 - - - ..\ - 1 - - - ..\ - 1 - - - - - 1 - - - 1 - - - 1 - - - - - ..\$(PROJECTNAME).launchscreen - 64 - - - ..\$(PROJECTNAME).launchscreen - 64 - - - - - 1 - - - 1 - - - 1 - - - - - Assets - 1 - - - Assets - 1 - - - - - Assets - 1 - - - Assets - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 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\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 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\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - - - - - - - - - - - - - False - False - False - False - True - False - False - False - False - - - 12 - - - - - + + + {3F83277E-6D05-4129-9F4B-8FD4FFC8C3AE} + 19.5 + None + Daemon.dpr + True + Debug + Linux64 + 128 + Console + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + 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) + Daemon + HORSE_DAEMON;$(DCC_Define) + 1033 + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + + + 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 + activity-1.1.0.dex.jar;annotation-1.2.0.dex.jar;appcompat-1.2.0.dex.jar;appcompat-resources-1.2.0.dex.jar;asynclayoutinflater-1.0.0.dex.jar;billing-4.0.0.dex.jar;biometric-1.1.0.dex.jar;browser-1.0.0.dex.jar;cloud-messaging.dex.jar;collection-1.1.0.dex.jar;coordinatorlayout-1.0.0.dex.jar;core-1.5.0-rc02.dex.jar;core-common-2.1.0.dex.jar;core-runtime-2.1.0.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;firebase-annotations-16.0.0.dex.jar;firebase-common-20.0.0.dex.jar;firebase-components-17.0.0.dex.jar;firebase-datatransport-18.0.0.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.0.0.dex.jar;firebase-installations-interop-17.0.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-22.0.0.dex.jar;fmx.dex.jar;fragment-1.2.5.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;legacy-support-core-ui-1.0.0.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.2.0.dex.jar;lifecycle-livedata-2.0.0.dex.jar;lifecycle-livedata-core-2.2.0.dex.jar;lifecycle-runtime-2.2.0.dex.jar;lifecycle-service-2.0.0.dex.jar;lifecycle-viewmodel-2.2.0.dex.jar;lifecycle-viewmodel-savedstate-2.2.0.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;play-services-ads-20.1.0.dex.jar;play-services-ads-base-20.1.0.dex.jar;play-services-ads-identifier-17.0.0.dex.jar;play-services-ads-lite-20.1.0.dex.jar;play-services-base-17.5.0.dex.jar;play-services-basement-17.6.0.dex.jar;play-services-cloud-messaging-16.0.0.dex.jar;play-services-drive-17.0.0.dex.jar;play-services-games-21.0.0.dex.jar;play-services-location-18.0.0.dex.jar;play-services-maps-17.0.1.dex.jar;play-services-measurement-base-18.0.0.dex.jar;play-services-measurement-sdk-api-18.0.0.dex.jar;play-services-places-placereport-17.0.0.dex.jar;play-services-stats-17.0.0.dex.jar;play-services-tasks-17.2.0.dex.jar;print-1.0.0.dex.jar;room-common-2.1.0.dex.jar;room-runtime-2.1.0.dex.jar;savedstate-1.0.0.dex.jar;slidingpanelayout-1.0.0.dex.jar;sqlite-2.0.1.dex.jar;sqlite-framework-2.0.1.dex.jar;swiperefreshlayout-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.0.0.dex.jar;transport-runtime-3.0.0.dex.jar;user-messaging-platform-1.0.0.dex.jar;vectordrawable-1.1.0.dex.jar;vectordrawable-animated-1.1.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.1.0.dex.jar + + + 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 + activity-1.1.0.dex.jar;annotation-1.2.0.dex.jar;appcompat-1.2.0.dex.jar;appcompat-resources-1.2.0.dex.jar;asynclayoutinflater-1.0.0.dex.jar;billing-4.0.0.dex.jar;biometric-1.1.0.dex.jar;browser-1.0.0.dex.jar;cloud-messaging.dex.jar;collection-1.1.0.dex.jar;coordinatorlayout-1.0.0.dex.jar;core-1.5.0-rc02.dex.jar;core-common-2.1.0.dex.jar;core-runtime-2.1.0.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;firebase-annotations-16.0.0.dex.jar;firebase-common-20.0.0.dex.jar;firebase-components-17.0.0.dex.jar;firebase-datatransport-18.0.0.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.0.0.dex.jar;firebase-installations-interop-17.0.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-22.0.0.dex.jar;fmx.dex.jar;fragment-1.2.5.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;legacy-support-core-ui-1.0.0.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.2.0.dex.jar;lifecycle-livedata-2.0.0.dex.jar;lifecycle-livedata-core-2.2.0.dex.jar;lifecycle-runtime-2.2.0.dex.jar;lifecycle-service-2.0.0.dex.jar;lifecycle-viewmodel-2.2.0.dex.jar;lifecycle-viewmodel-savedstate-2.2.0.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;play-services-ads-20.1.0.dex.jar;play-services-ads-base-20.1.0.dex.jar;play-services-ads-identifier-17.0.0.dex.jar;play-services-ads-lite-20.1.0.dex.jar;play-services-base-17.5.0.dex.jar;play-services-basement-17.6.0.dex.jar;play-services-cloud-messaging-16.0.0.dex.jar;play-services-drive-17.0.0.dex.jar;play-services-games-21.0.0.dex.jar;play-services-location-18.0.0.dex.jar;play-services-maps-17.0.1.dex.jar;play-services-measurement-base-18.0.0.dex.jar;play-services-measurement-sdk-api-18.0.0.dex.jar;play-services-places-placereport-17.0.0.dex.jar;play-services-stats-17.0.0.dex.jar;play-services-tasks-17.2.0.dex.jar;print-1.0.0.dex.jar;room-common-2.1.0.dex.jar;room-runtime-2.1.0.dex.jar;savedstate-1.0.0.dex.jar;slidingpanelayout-1.0.0.dex.jar;sqlite-2.0.1.dex.jar;sqlite-framework-2.0.1.dex.jar;swiperefreshlayout-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.0.0.dex.jar;transport-runtime-3.0.0.dex.jar;user-messaging-platform-1.0.0.dex.jar;vectordrawable-1.1.0.dex.jar;vectordrawable-animated-1.1.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.1.0.dex.jar + + + CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers + iPhoneAndiPad + true + Debug + $(MSBuildProjectName) + + + CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers + iPhoneAndiPad + true + + + ..\..\..\src;$(DCC_UnitSearchPath) + /usr/bin/xterm -e "%debuggee%" + (None) + + + CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers;ITSAppUsesNonExemptEncryption=false + Debug + + + CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers;ITSAppUsesNonExemptEncryption=false + Debug + + + DBXSqliteDriver;RESTComponents;fmxase;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;bindcompvclsmp;emsclientfiredac;tethering;svnui;DataSnapFireDAC;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;svn;DBXOracleDriver;inetdb;FmxTeeUI;emsedge;fmx;FireDACIBDriver;fmxdae;vcledge;FireDACDBXDriver;dbexpress;IndyCore;boss_ide;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;TeeDB;FireDAC;emshosting;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;Tee;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;DOSCommandDR;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;TeeUI;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;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;FmxTeeUI;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;TeeDB;FireDAC;emshosting;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;Tee;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;DOSCommandDR;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;TeeUI;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 + + + /usr/bin/xterm -e "%debuggee%" + (None) + + + false + 1033 + (None) + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + + MainSource + + + Base + + + Cfg_1 + Base + + + Cfg_2 + Base + + + + Delphi.Personality.12 + Application + + + + Daemon.dpr + + + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + + + + + + true + + + + + true + + + + + true + + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + classes + 64 + + + classes + 64 + + + + + 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-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 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 + + + Contents\MacOS + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 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 + + + Contents\MacOS + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + Contents\Resources\StartUp\ + 0 + + + Contents\Resources\StartUp\ + 0 + + + Contents\Resources\StartUp\ + 0 + + + 0 + + + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + ..\ + 1 + + + + + Contents + 1 + + + Contents + 1 + + + Contents + 1 + + + + + Contents\Resources + 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 + + + Contents\MacOS + 1 + + + 0 + + + + + library\lib\armeabi-v7a + 1 + + + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + ..\ + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).launchscreen + 64 + + + ..\$(PROJECTNAME).launchscreen + 64 + + + + + 1 + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 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\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 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\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + + + + + + + + + + + + + False + False + False + False + True + False + False + False + False + + + 12 + + + + + diff --git a/samples/delphi/isapi/ISAPI.dpr b/samples/delphi/isapi/ISAPI.dpr index 563901b..5fcf2cd 100644 --- a/samples/delphi/isapi/ISAPI.dpr +++ b/samples/delphi/isapi/ISAPI.dpr @@ -1,17 +1,17 @@ -library ISAPI; - -{$R *.res} - -uses Horse; - -begin - // Need to set "HORSE_ISAPI" compilation directive - - THorse.Get('/ping', - procedure(Req: THorseRequest; Res: THorseResponse) - begin - Res.Send('pong'); - end); - - THorse.Listen; -end. +library ISAPI; + +{$R *.res} + +uses Horse; + +begin + // Need to set "HORSE_ISAPI" compilation directive + + THorse.Get('/ping', + procedure(Req: THorseRequest; Res: THorseResponse) + begin + Res.Send('pong'); + end); + + THorse.Listen; +end. diff --git a/samples/delphi/isapi/ISAPI.dproj b/samples/delphi/isapi/ISAPI.dproj index 671f3bb..4e68f41 100644 --- a/samples/delphi/isapi/ISAPI.dproj +++ b/samples/delphi/isapi/ISAPI.dproj @@ -1,1039 +1,1039 @@ - - - {38342A7C-DDC9-4E0D-BB55-B38012FF4F0D} - 19.5 - None - ISAPI.dpr - True - Debug - Win32 - 1 - Library - - - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - 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 - System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) - ISAPI - HORSE_ISAPI;$(DCC_Define) - 1033 - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - - - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png - 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 - activity-1.1.0.dex.jar;annotation-1.2.0.dex.jar;appcompat-1.2.0.dex.jar;appcompat-resources-1.2.0.dex.jar;asynclayoutinflater-1.0.0.dex.jar;billing-4.0.0.dex.jar;biometric-1.1.0.dex.jar;browser-1.0.0.dex.jar;cloud-messaging.dex.jar;collection-1.1.0.dex.jar;coordinatorlayout-1.0.0.dex.jar;core-1.5.0-rc02.dex.jar;core-common-2.1.0.dex.jar;core-runtime-2.1.0.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;firebase-annotations-16.0.0.dex.jar;firebase-common-20.0.0.dex.jar;firebase-components-17.0.0.dex.jar;firebase-datatransport-18.0.0.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.0.0.dex.jar;firebase-installations-interop-17.0.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-22.0.0.dex.jar;fmx.dex.jar;fragment-1.2.5.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;legacy-support-core-ui-1.0.0.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.2.0.dex.jar;lifecycle-livedata-2.0.0.dex.jar;lifecycle-livedata-core-2.2.0.dex.jar;lifecycle-runtime-2.2.0.dex.jar;lifecycle-service-2.0.0.dex.jar;lifecycle-viewmodel-2.2.0.dex.jar;lifecycle-viewmodel-savedstate-2.2.0.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;play-services-ads-20.1.0.dex.jar;play-services-ads-base-20.1.0.dex.jar;play-services-ads-identifier-17.0.0.dex.jar;play-services-ads-lite-20.1.0.dex.jar;play-services-base-17.5.0.dex.jar;play-services-basement-17.6.0.dex.jar;play-services-cloud-messaging-16.0.0.dex.jar;play-services-drive-17.0.0.dex.jar;play-services-games-21.0.0.dex.jar;play-services-location-18.0.0.dex.jar;play-services-maps-17.0.1.dex.jar;play-services-measurement-base-18.0.0.dex.jar;play-services-measurement-sdk-api-18.0.0.dex.jar;play-services-places-placereport-17.0.0.dex.jar;play-services-stats-17.0.0.dex.jar;play-services-tasks-17.2.0.dex.jar;print-1.0.0.dex.jar;room-common-2.1.0.dex.jar;room-runtime-2.1.0.dex.jar;savedstate-1.0.0.dex.jar;slidingpanelayout-1.0.0.dex.jar;sqlite-2.0.1.dex.jar;sqlite-framework-2.0.1.dex.jar;swiperefreshlayout-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.0.0.dex.jar;transport-runtime-3.0.0.dex.jar;user-messaging-platform-1.0.0.dex.jar;vectordrawable-1.1.0.dex.jar;vectordrawable-animated-1.1.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.1.0.dex.jar - - - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png - 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 - activity-1.1.0.dex.jar;annotation-1.2.0.dex.jar;appcompat-1.2.0.dex.jar;appcompat-resources-1.2.0.dex.jar;asynclayoutinflater-1.0.0.dex.jar;billing-4.0.0.dex.jar;biometric-1.1.0.dex.jar;browser-1.0.0.dex.jar;cloud-messaging.dex.jar;collection-1.1.0.dex.jar;coordinatorlayout-1.0.0.dex.jar;core-1.5.0-rc02.dex.jar;core-common-2.1.0.dex.jar;core-runtime-2.1.0.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;firebase-annotations-16.0.0.dex.jar;firebase-common-20.0.0.dex.jar;firebase-components-17.0.0.dex.jar;firebase-datatransport-18.0.0.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.0.0.dex.jar;firebase-installations-interop-17.0.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-22.0.0.dex.jar;fmx.dex.jar;fragment-1.2.5.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;legacy-support-core-ui-1.0.0.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.2.0.dex.jar;lifecycle-livedata-2.0.0.dex.jar;lifecycle-livedata-core-2.2.0.dex.jar;lifecycle-runtime-2.2.0.dex.jar;lifecycle-service-2.0.0.dex.jar;lifecycle-viewmodel-2.2.0.dex.jar;lifecycle-viewmodel-savedstate-2.2.0.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;play-services-ads-20.1.0.dex.jar;play-services-ads-base-20.1.0.dex.jar;play-services-ads-identifier-17.0.0.dex.jar;play-services-ads-lite-20.1.0.dex.jar;play-services-base-17.5.0.dex.jar;play-services-basement-17.6.0.dex.jar;play-services-cloud-messaging-16.0.0.dex.jar;play-services-drive-17.0.0.dex.jar;play-services-games-21.0.0.dex.jar;play-services-location-18.0.0.dex.jar;play-services-maps-17.0.1.dex.jar;play-services-measurement-base-18.0.0.dex.jar;play-services-measurement-sdk-api-18.0.0.dex.jar;play-services-places-placereport-17.0.0.dex.jar;play-services-stats-17.0.0.dex.jar;play-services-tasks-17.2.0.dex.jar;print-1.0.0.dex.jar;room-common-2.1.0.dex.jar;room-runtime-2.1.0.dex.jar;savedstate-1.0.0.dex.jar;slidingpanelayout-1.0.0.dex.jar;sqlite-2.0.1.dex.jar;sqlite-framework-2.0.1.dex.jar;swiperefreshlayout-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.0.0.dex.jar;transport-runtime-3.0.0.dex.jar;user-messaging-platform-1.0.0.dex.jar;vectordrawable-1.1.0.dex.jar;vectordrawable-animated-1.1.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.1.0.dex.jar - - - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_1024x1024.png - CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers - iPhoneAndiPad - true - Debug - $(MSBuildProjectName) - - - CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers - iPhoneAndiPad - true - - - CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers;ITSAppUsesNonExemptEncryption=false - Debug - - - CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers;ITSAppUsesNonExemptEncryption=false - Debug - - - DBXSqliteDriver;RESTComponents;fmxase;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;bindcompvclsmp;emsclientfiredac;tethering;svnui;DataSnapFireDAC;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;svn;DBXOracleDriver;inetdb;FmxTeeUI;emsedge;fmx;FireDACIBDriver;fmxdae;vcledge;FireDACDBXDriver;dbexpress;IndyCore;boss_ide;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;TeeDB;FireDAC;emshosting;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;Tee;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;DOSCommandDR;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;TeeUI;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;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 - 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 - - - DBXSqliteDriver;RESTComponents;fmxase;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;bindcompvclsmp;emsclientfiredac;tethering;DataSnapFireDAC;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;DBXOracleDriver;inetdb;FmxTeeUI;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;TeeDB;FireDAC;emshosting;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;Tee;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;DOSCommandDR;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;TeeUI;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;inetdbxpress;FireDACMongoDBDriver;DataSnapServerMidas;$(DCC_UsePackage) - - - DEBUG;$(DCC_Define) - true - false - true - true - true - - - false - true - (None) - ..\..\..\src;$(DCC_UnitSearchPath) - - - false - RELEASE;$(DCC_Define) - 0 - 0 - - - - MainSource - - - Base - - - Cfg_1 - Base - - - Cfg_2 - Base - - - - Delphi.Personality.12 - Application - - - - ISAPI.dpr - - - ExpressPivotGrid OLAP by Developer Express Inc. - Microsoft Office 2000 Sample Automation Server Wrapper Components - Microsoft Office XP Sample Automation Server Wrapper Components - - - - - - true - - - - - true - - - - - true - - - - - - 1 - - - Contents\MacOS - 1 - - - 0 - - - - - classes - 64 - - - classes - 64 - - - - - 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-xxxhdpi - 1 - - - res\drawable-xxxhdpi - 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 - - - Contents\MacOS - 1 - .framework - - - 0 - - - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - Contents\MacOS - 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 - - - Contents\MacOS - 1 - .dylib - - - 0 - .bpl - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - Contents\Resources\StartUp\ - 0 - - - Contents\Resources\StartUp\ - 0 - - - Contents\Resources\StartUp\ - 0 - - - 0 - - - - - 1 - - - 1 - - - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - - - ..\ - 1 - - - ..\ - 1 - - - ..\ - 1 - - - - - Contents - 1 - - - Contents - 1 - - - Contents - 1 - - - - - Contents\Resources - 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 - - - Contents\MacOS - 1 - - - 0 - - - - - library\lib\armeabi-v7a - 1 - - - - - 1 - - - 1 - - - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - - - ..\ - 1 - - - ..\ - 1 - - - ..\ - 1 - - - - - 1 - - - 1 - - - 1 - - - - - ..\$(PROJECTNAME).launchscreen - 64 - - - ..\$(PROJECTNAME).launchscreen - 64 - - - - - 1 - - - 1 - - - 1 - - - - - Assets - 1 - - - Assets - 1 - - - - - Assets - 1 - - - Assets - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 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\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 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\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - - - - - - - - - - - - - False - False - False - False - False - False - False - True - False - - - 12 - - - - - + + + {38342A7C-DDC9-4E0D-BB55-B38012FF4F0D} + 19.5 + None + ISAPI.dpr + True + Debug + Win32 + 1 + Library + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + 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 + System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) + ISAPI + HORSE_ISAPI;$(DCC_Define) + 1033 + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + + + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png + 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 + activity-1.1.0.dex.jar;annotation-1.2.0.dex.jar;appcompat-1.2.0.dex.jar;appcompat-resources-1.2.0.dex.jar;asynclayoutinflater-1.0.0.dex.jar;billing-4.0.0.dex.jar;biometric-1.1.0.dex.jar;browser-1.0.0.dex.jar;cloud-messaging.dex.jar;collection-1.1.0.dex.jar;coordinatorlayout-1.0.0.dex.jar;core-1.5.0-rc02.dex.jar;core-common-2.1.0.dex.jar;core-runtime-2.1.0.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;firebase-annotations-16.0.0.dex.jar;firebase-common-20.0.0.dex.jar;firebase-components-17.0.0.dex.jar;firebase-datatransport-18.0.0.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.0.0.dex.jar;firebase-installations-interop-17.0.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-22.0.0.dex.jar;fmx.dex.jar;fragment-1.2.5.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;legacy-support-core-ui-1.0.0.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.2.0.dex.jar;lifecycle-livedata-2.0.0.dex.jar;lifecycle-livedata-core-2.2.0.dex.jar;lifecycle-runtime-2.2.0.dex.jar;lifecycle-service-2.0.0.dex.jar;lifecycle-viewmodel-2.2.0.dex.jar;lifecycle-viewmodel-savedstate-2.2.0.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;play-services-ads-20.1.0.dex.jar;play-services-ads-base-20.1.0.dex.jar;play-services-ads-identifier-17.0.0.dex.jar;play-services-ads-lite-20.1.0.dex.jar;play-services-base-17.5.0.dex.jar;play-services-basement-17.6.0.dex.jar;play-services-cloud-messaging-16.0.0.dex.jar;play-services-drive-17.0.0.dex.jar;play-services-games-21.0.0.dex.jar;play-services-location-18.0.0.dex.jar;play-services-maps-17.0.1.dex.jar;play-services-measurement-base-18.0.0.dex.jar;play-services-measurement-sdk-api-18.0.0.dex.jar;play-services-places-placereport-17.0.0.dex.jar;play-services-stats-17.0.0.dex.jar;play-services-tasks-17.2.0.dex.jar;print-1.0.0.dex.jar;room-common-2.1.0.dex.jar;room-runtime-2.1.0.dex.jar;savedstate-1.0.0.dex.jar;slidingpanelayout-1.0.0.dex.jar;sqlite-2.0.1.dex.jar;sqlite-framework-2.0.1.dex.jar;swiperefreshlayout-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.0.0.dex.jar;transport-runtime-3.0.0.dex.jar;user-messaging-platform-1.0.0.dex.jar;vectordrawable-1.1.0.dex.jar;vectordrawable-animated-1.1.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.1.0.dex.jar + + + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png + 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 + activity-1.1.0.dex.jar;annotation-1.2.0.dex.jar;appcompat-1.2.0.dex.jar;appcompat-resources-1.2.0.dex.jar;asynclayoutinflater-1.0.0.dex.jar;billing-4.0.0.dex.jar;biometric-1.1.0.dex.jar;browser-1.0.0.dex.jar;cloud-messaging.dex.jar;collection-1.1.0.dex.jar;coordinatorlayout-1.0.0.dex.jar;core-1.5.0-rc02.dex.jar;core-common-2.1.0.dex.jar;core-runtime-2.1.0.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;firebase-annotations-16.0.0.dex.jar;firebase-common-20.0.0.dex.jar;firebase-components-17.0.0.dex.jar;firebase-datatransport-18.0.0.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.0.0.dex.jar;firebase-installations-interop-17.0.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-22.0.0.dex.jar;fmx.dex.jar;fragment-1.2.5.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;legacy-support-core-ui-1.0.0.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.2.0.dex.jar;lifecycle-livedata-2.0.0.dex.jar;lifecycle-livedata-core-2.2.0.dex.jar;lifecycle-runtime-2.2.0.dex.jar;lifecycle-service-2.0.0.dex.jar;lifecycle-viewmodel-2.2.0.dex.jar;lifecycle-viewmodel-savedstate-2.2.0.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;play-services-ads-20.1.0.dex.jar;play-services-ads-base-20.1.0.dex.jar;play-services-ads-identifier-17.0.0.dex.jar;play-services-ads-lite-20.1.0.dex.jar;play-services-base-17.5.0.dex.jar;play-services-basement-17.6.0.dex.jar;play-services-cloud-messaging-16.0.0.dex.jar;play-services-drive-17.0.0.dex.jar;play-services-games-21.0.0.dex.jar;play-services-location-18.0.0.dex.jar;play-services-maps-17.0.1.dex.jar;play-services-measurement-base-18.0.0.dex.jar;play-services-measurement-sdk-api-18.0.0.dex.jar;play-services-places-placereport-17.0.0.dex.jar;play-services-stats-17.0.0.dex.jar;play-services-tasks-17.2.0.dex.jar;print-1.0.0.dex.jar;room-common-2.1.0.dex.jar;room-runtime-2.1.0.dex.jar;savedstate-1.0.0.dex.jar;slidingpanelayout-1.0.0.dex.jar;sqlite-2.0.1.dex.jar;sqlite-framework-2.0.1.dex.jar;swiperefreshlayout-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.0.0.dex.jar;transport-runtime-3.0.0.dex.jar;user-messaging-platform-1.0.0.dex.jar;vectordrawable-1.1.0.dex.jar;vectordrawable-animated-1.1.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.1.0.dex.jar + + + $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_1024x1024.png + CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers + iPhoneAndiPad + true + Debug + $(MSBuildProjectName) + + + CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers + iPhoneAndiPad + true + + + CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers;ITSAppUsesNonExemptEncryption=false + Debug + + + CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers;ITSAppUsesNonExemptEncryption=false + Debug + + + DBXSqliteDriver;RESTComponents;fmxase;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;bindcompvclsmp;emsclientfiredac;tethering;svnui;DataSnapFireDAC;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;svn;DBXOracleDriver;inetdb;FmxTeeUI;emsedge;fmx;FireDACIBDriver;fmxdae;vcledge;FireDACDBXDriver;dbexpress;IndyCore;boss_ide;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;TeeDB;FireDAC;emshosting;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;Tee;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;DOSCommandDR;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;TeeUI;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;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 + 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 + + + DBXSqliteDriver;RESTComponents;fmxase;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;bindcompvclsmp;emsclientfiredac;tethering;DataSnapFireDAC;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;DBXOracleDriver;inetdb;FmxTeeUI;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;TeeDB;FireDAC;emshosting;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;Tee;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;DOSCommandDR;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;TeeUI;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;inetdbxpress;FireDACMongoDBDriver;DataSnapServerMidas;$(DCC_UsePackage) + + + DEBUG;$(DCC_Define) + true + false + true + true + true + + + false + true + (None) + ..\..\..\src;$(DCC_UnitSearchPath) + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + + MainSource + + + Base + + + Cfg_1 + Base + + + Cfg_2 + Base + + + + Delphi.Personality.12 + Application + + + + ISAPI.dpr + + + ExpressPivotGrid OLAP by Developer Express Inc. + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + + + + + + true + + + + + true + + + + + true + + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + classes + 64 + + + classes + 64 + + + + + 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-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 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 + + + Contents\MacOS + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 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 + + + Contents\MacOS + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + Contents\Resources\StartUp\ + 0 + + + Contents\Resources\StartUp\ + 0 + + + Contents\Resources\StartUp\ + 0 + + + 0 + + + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + ..\ + 1 + + + + + Contents + 1 + + + Contents + 1 + + + Contents + 1 + + + + + Contents\Resources + 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 + + + Contents\MacOS + 1 + + + 0 + + + + + library\lib\armeabi-v7a + 1 + + + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + ..\ + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).launchscreen + 64 + + + ..\$(PROJECTNAME).launchscreen + 64 + + + + + 1 + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 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\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 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\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + + + + + + + + + + + + + False + False + False + False + False + False + False + True + False + + + 12 + + + + + diff --git a/samples/delphi/vcl-ssl/VCL_SSL.dpr b/samples/delphi/vcl-ssl/VCL_SSL.dpr index 7e25a5c..753abc9 100644 --- a/samples/delphi/vcl-ssl/VCL_SSL.dpr +++ b/samples/delphi/vcl-ssl/VCL_SSL.dpr @@ -1,15 +1,15 @@ -program VCL_SSL; - -uses - Vcl.Forms, - Main.Form in 'src\Main.Form.pas' {frmMain}; - -{$R *.res} - -begin - ReportMemoryLeaksOnShutdown := True; - Application.Initialize; - Application.MainFormOnTaskbar := True; - Application.CreateForm(TfrmMain, frmMain); - Application.Run; -end. +program VCL_SSL; + +uses + Vcl.Forms, + Main.Form in 'src\Main.Form.pas' {frmMain}; + +{$R *.res} + +begin + ReportMemoryLeaksOnShutdown := True; + Application.Initialize; + Application.MainFormOnTaskbar := True; + Application.CreateForm(TfrmMain, frmMain); + Application.Run; +end. diff --git a/samples/delphi/vcl-ssl/VCL_SSL.dproj b/samples/delphi/vcl-ssl/VCL_SSL.dproj index 2966c51..326676e 100644 --- a/samples/delphi/vcl-ssl/VCL_SSL.dproj +++ b/samples/delphi/vcl-ssl/VCL_SSL.dproj @@ -1,974 +1,974 @@ - - - {825DB250-2173-4BEE-8EE2-5BCC06052A46} - 19.5 - VCL - True - Debug - Win32 - 1 - Application - VCL_SSL.dpr - - - 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 - System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) - $(BDS)\bin\delphi_PROJECTICON.ico - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png - VCL_SSL - - - vclwinx;DataSnapServer;fmx;emshosting;vclie;DbxCommonDriver;bindengine;IndyIPCommon;VCLRESTComponents;DBXMSSQLDriver;FireDACCommonODBC;emsclient;FireDACCommonDriver;appanalytics;IndyProtocols;vclx;IndyIPClient;dbxcds;vcledge;bindcompvclwinx;FmxTeeUI;emsedge;bindcompfmx;DBXFirebirdDriver;inetdb;FireDACSqliteDriver;DbxClientDriver;FireDACASADriver;Tee;soapmidas;vclactnband;TeeUI;fmxFireDAC;dbexpress;FireDACInfxDriver;DBXMySQLDriver;VclSmp;inet;DataSnapCommon;vcltouch;fmxase;DBXOdbcDriver;dbrtl;FireDACDBXDriver;FireDACOracleDriver;fmxdae;TeeDB;FireDACMSAccDriver;CustomIPTransport;FireDACMSSQLDriver;DataSnapIndy10ServerTransport;DataSnapConnectors;vcldsnap;DBXInterBaseDriver;FireDACMongoDBDriver;IndySystem;FireDACTDataDriver;vcldb;vclFireDAC;bindcomp;FireDACCommon;DataSnapServerMidas;FireDACODBCDriver;emsserverresource;IndyCore;RESTBackendComponents;bindcompdbx;rtl;FireDACMySQLDriver;FireDACADSDriver;RESTComponents;DBXSqliteDriver;vcl;IndyIPServer;dsnapxml;dsnapcon;DataSnapClient;DataSnapProviderClient;adortl;DBXSybaseASEDriver;DBXDb2Driver;vclimg;DataSnapFireDAC;emsclientfiredac;FireDACPgDriver;FireDAC;FireDACDSDriver;inetdbxpress;xmlrtl;tethering;bindcompvcl;dsnap;CloudService;DBXSybaseASADriver;DBXOracleDriver;FireDACDb2Driver;DBXInformixDriver;fmxobj;bindcompvclsmp;FMXTee;DataSnapNativeClient;DatasnapConnectorsFreePascal;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage) - 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 - $(BDS)\bin\default_app.manifest - true - - - vclwinx;DataSnapServer;fmx;emshosting;vclie;DbxCommonDriver;bindengine;IndyIPCommon;VCLRESTComponents;DBXMSSQLDriver;FireDACCommonODBC;emsclient;FireDACCommonDriver;appanalytics;IndyProtocols;vclx;IndyIPClient;dbxcds;vcledge;bindcompvclwinx;FmxTeeUI;emsedge;bindcompfmx;DBXFirebirdDriver;inetdb;FireDACSqliteDriver;DbxClientDriver;FireDACASADriver;Tee;soapmidas;vclactnband;TeeUI;fmxFireDAC;dbexpress;FireDACInfxDriver;DBXMySQLDriver;VclSmp;inet;DataSnapCommon;vcltouch;fmxase;DBXOdbcDriver;dbrtl;FireDACDBXDriver;FireDACOracleDriver;fmxdae;TeeDB;FireDACMSAccDriver;CustomIPTransport;FireDACMSSQLDriver;DataSnapIndy10ServerTransport;DataSnapConnectors;vcldsnap;DBXInterBaseDriver;FireDACMongoDBDriver;IndySystem;FireDACTDataDriver;vcldb;vclFireDAC;bindcomp;FireDACCommon;DataSnapServerMidas;FireDACODBCDriver;emsserverresource;IndyCore;RESTBackendComponents;bindcompdbx;rtl;FireDACMySQLDriver;FireDACADSDriver;RESTComponents;DBXSqliteDriver;vcl;IndyIPServer;dsnapxml;dsnapcon;DataSnapClient;DataSnapProviderClient;adortl;DBXSybaseASEDriver;DBXDb2Driver;vclimg;DataSnapFireDAC;emsclientfiredac;FireDACPgDriver;FireDAC;FireDACDSDriver;inetdbxpress;xmlrtl;tethering;bindcompvcl;dsnap;CloudService;DBXSybaseASADriver;DBXOracleDriver;FireDACDb2Driver;DBXInformixDriver;fmxobj;bindcompvclsmp;FMXTee;DataSnapNativeClient;DatasnapConnectorsFreePascal;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage) - - - DEBUG;$(DCC_Define) - true - false - true - true - true - true - true - - - false - true - PerMonitorV2 - ..\..\..\src;$(DCC_UnitSearchPath) - true - 1033 - - - false - RELEASE;$(DCC_Define) - 0 - 0 - - - true - PerMonitorV2 - - - - MainSource - - -
frmMain
- dfm -
- - Base - - - Cfg_1 - Base - - - Cfg_2 - Base - -
- - Delphi.Personality.12 - Application - - - - VCL_SSL.dpr - - - 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 - - - - - - - 1 - - - Contents\MacOS - 1 - - - 0 - - - - - classes - 64 - - - classes - 64 - - - - - 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-xxxhdpi - 1 - - - res\drawable-xxxhdpi - 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 - - - Contents\MacOS - 1 - .framework - - - 0 - - - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - Contents\MacOS - 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 - - - Contents\MacOS - 1 - .dylib - - - 0 - .bpl - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - Contents\Resources\StartUp\ - 0 - - - Contents\Resources\StartUp\ - 0 - - - Contents\Resources\StartUp\ - 0 - - - 0 - - - - - 1 - - - 1 - - - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - - - ..\ - 1 - - - ..\ - 1 - - - ..\ - 1 - - - - - Contents - 1 - - - Contents - 1 - - - Contents - 1 - - - - - Contents\Resources - 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 - - - Contents\MacOS - 1 - - - 0 - - - - - library\lib\armeabi-v7a - 1 - - - - - 1 - - - 1 - - - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - - - ..\ - 1 - - - ..\ - 1 - - - ..\ - 1 - - - - - 1 - - - 1 - - - 1 - - - - - ..\$(PROJECTNAME).launchscreen - 64 - - - ..\$(PROJECTNAME).launchscreen - 64 - - - - - 1 - - - 1 - - - 1 - - - - - Assets - 1 - - - Assets - 1 - - - - - Assets - 1 - - - Assets - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 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\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 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\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - - - - - - - - - - - - - True - False - - - 12 - - - - -
+ + + {825DB250-2173-4BEE-8EE2-5BCC06052A46} + 19.5 + VCL + True + Debug + Win32 + 1 + Application + VCL_SSL.dpr + + + 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 + System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) + $(BDS)\bin\delphi_PROJECTICON.ico + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + VCL_SSL + + + vclwinx;DataSnapServer;fmx;emshosting;vclie;DbxCommonDriver;bindengine;IndyIPCommon;VCLRESTComponents;DBXMSSQLDriver;FireDACCommonODBC;emsclient;FireDACCommonDriver;appanalytics;IndyProtocols;vclx;IndyIPClient;dbxcds;vcledge;bindcompvclwinx;FmxTeeUI;emsedge;bindcompfmx;DBXFirebirdDriver;inetdb;FireDACSqliteDriver;DbxClientDriver;FireDACASADriver;Tee;soapmidas;vclactnband;TeeUI;fmxFireDAC;dbexpress;FireDACInfxDriver;DBXMySQLDriver;VclSmp;inet;DataSnapCommon;vcltouch;fmxase;DBXOdbcDriver;dbrtl;FireDACDBXDriver;FireDACOracleDriver;fmxdae;TeeDB;FireDACMSAccDriver;CustomIPTransport;FireDACMSSQLDriver;DataSnapIndy10ServerTransport;DataSnapConnectors;vcldsnap;DBXInterBaseDriver;FireDACMongoDBDriver;IndySystem;FireDACTDataDriver;vcldb;vclFireDAC;bindcomp;FireDACCommon;DataSnapServerMidas;FireDACODBCDriver;emsserverresource;IndyCore;RESTBackendComponents;bindcompdbx;rtl;FireDACMySQLDriver;FireDACADSDriver;RESTComponents;DBXSqliteDriver;vcl;IndyIPServer;dsnapxml;dsnapcon;DataSnapClient;DataSnapProviderClient;adortl;DBXSybaseASEDriver;DBXDb2Driver;vclimg;DataSnapFireDAC;emsclientfiredac;FireDACPgDriver;FireDAC;FireDACDSDriver;inetdbxpress;xmlrtl;tethering;bindcompvcl;dsnap;CloudService;DBXSybaseASADriver;DBXOracleDriver;FireDACDb2Driver;DBXInformixDriver;fmxobj;bindcompvclsmp;FMXTee;DataSnapNativeClient;DatasnapConnectorsFreePascal;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage) + 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 + $(BDS)\bin\default_app.manifest + true + + + vclwinx;DataSnapServer;fmx;emshosting;vclie;DbxCommonDriver;bindengine;IndyIPCommon;VCLRESTComponents;DBXMSSQLDriver;FireDACCommonODBC;emsclient;FireDACCommonDriver;appanalytics;IndyProtocols;vclx;IndyIPClient;dbxcds;vcledge;bindcompvclwinx;FmxTeeUI;emsedge;bindcompfmx;DBXFirebirdDriver;inetdb;FireDACSqliteDriver;DbxClientDriver;FireDACASADriver;Tee;soapmidas;vclactnband;TeeUI;fmxFireDAC;dbexpress;FireDACInfxDriver;DBXMySQLDriver;VclSmp;inet;DataSnapCommon;vcltouch;fmxase;DBXOdbcDriver;dbrtl;FireDACDBXDriver;FireDACOracleDriver;fmxdae;TeeDB;FireDACMSAccDriver;CustomIPTransport;FireDACMSSQLDriver;DataSnapIndy10ServerTransport;DataSnapConnectors;vcldsnap;DBXInterBaseDriver;FireDACMongoDBDriver;IndySystem;FireDACTDataDriver;vcldb;vclFireDAC;bindcomp;FireDACCommon;DataSnapServerMidas;FireDACODBCDriver;emsserverresource;IndyCore;RESTBackendComponents;bindcompdbx;rtl;FireDACMySQLDriver;FireDACADSDriver;RESTComponents;DBXSqliteDriver;vcl;IndyIPServer;dsnapxml;dsnapcon;DataSnapClient;DataSnapProviderClient;adortl;DBXSybaseASEDriver;DBXDb2Driver;vclimg;DataSnapFireDAC;emsclientfiredac;FireDACPgDriver;FireDAC;FireDACDSDriver;inetdbxpress;xmlrtl;tethering;bindcompvcl;dsnap;CloudService;DBXSybaseASADriver;DBXOracleDriver;FireDACDb2Driver;DBXInformixDriver;fmxobj;bindcompvclsmp;FMXTee;DataSnapNativeClient;DatasnapConnectorsFreePascal;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage) + + + DEBUG;$(DCC_Define) + true + false + true + true + true + true + true + + + false + true + PerMonitorV2 + ..\..\..\src;$(DCC_UnitSearchPath) + true + 1033 + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + true + PerMonitorV2 + + + + MainSource + + +
frmMain
+ dfm +
+ + Base + + + Cfg_1 + Base + + + Cfg_2 + Base + +
+ + Delphi.Personality.12 + Application + + + + VCL_SSL.dpr + + + 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 + + + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + classes + 64 + + + classes + 64 + + + + + 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-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 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 + + + Contents\MacOS + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 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 + + + Contents\MacOS + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + Contents\Resources\StartUp\ + 0 + + + Contents\Resources\StartUp\ + 0 + + + Contents\Resources\StartUp\ + 0 + + + 0 + + + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + ..\ + 1 + + + + + Contents + 1 + + + Contents + 1 + + + Contents + 1 + + + + + Contents\Resources + 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 + + + Contents\MacOS + 1 + + + 0 + + + + + library\lib\armeabi-v7a + 1 + + + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + ..\ + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).launchscreen + 64 + + + ..\$(PROJECTNAME).launchscreen + 64 + + + + + 1 + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 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\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 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\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + + + + + + + + + + + + + True + False + + + 12 + + + + +
diff --git a/samples/delphi/vcl-ssl/src/Main.Form.dfm b/samples/delphi/vcl-ssl/src/Main.Form.dfm index d3c3098..496fe50 100644 --- a/samples/delphi/vcl-ssl/src/Main.Form.dfm +++ b/samples/delphi/vcl-ssl/src/Main.Form.dfm @@ -1,104 +1,104 @@ -object frmMain: TfrmMain - Left = 0 - Top = 0 - Caption = 'Horse VCL with SSL - Sample' - ClientHeight = 298 - ClientWidth = 356 - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -12 - Font.Name = 'Segoe UI' - Font.Style = [] - OnCreate = FormCreate - TextHeight = 15 - object edtPort: TSpinEdit - Left = 8 - Top = 20 - Width = 97 - Height = 24 - MaxValue = 9999999 - MinValue = 1000 - TabOrder = 0 - Value = 9000 - end - object Button1: TButton - Left = 144 - Top = 242 - Width = 75 - Height = 25 - Caption = 'Start' - TabOrder = 1 - OnClick = Button1Click - end - object leKey: TLabeledEdit - Left = 8 - Top = 76 - Width = 313 - Height = 23 - EditLabel.Width = 58 - EditLabel.Height = 15 - EditLabel.Caption = 'Private Key' - ReadOnly = True - TabOrder = 2 - Text = '' - end - object leCrt: TLabeledEdit - Left = 8 - Top = 132 - Width = 313 - Height = 23 - EditLabel.Width = 55 - EditLabel.Height = 15 - EditLabel.Caption = 'Public Key' - ReadOnly = True - TabOrder = 3 - Text = '' - end - object Button2: TButton - Left = 320 - Top = 75 - Width = 33 - Height = 25 - Caption = '...' - TabOrder = 4 - OnClick = Button2Click - end - object Button3: TButton - Left = 320 - Top = 131 - Width = 33 - Height = 25 - Caption = '...' - TabOrder = 5 - OnClick = Button3Click - end - object lePassword: TLabeledEdit - Left = 9 - Top = 190 - Width = 144 - Height = 23 - EditLabel.Width = 50 - EditLabel.Height = 15 - EditLabel.Caption = 'Password' - PasswordChar = '*' - TabOrder = 6 - Text = '' - end - object StatusBar1: TStatusBar - Left = 0 - Top = 279 - Width = 356 - Height = 19 - Panels = < - item - Width = 50 - end> - ExplicitTop = 278 - ExplicitWidth = 352 - end - object OpenDialog1: TOpenDialog - Left = 264 - Top = 16 - end -end +object frmMain: TfrmMain + Left = 0 + Top = 0 + Caption = 'Horse VCL with SSL - Sample' + ClientHeight = 298 + ClientWidth = 356 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Segoe UI' + Font.Style = [] + OnCreate = FormCreate + TextHeight = 15 + object edtPort: TSpinEdit + Left = 8 + Top = 20 + Width = 97 + Height = 24 + MaxValue = 9999999 + MinValue = 1000 + TabOrder = 0 + Value = 9000 + end + object Button1: TButton + Left = 144 + Top = 242 + Width = 75 + Height = 25 + Caption = 'Start' + TabOrder = 1 + OnClick = Button1Click + end + object leKey: TLabeledEdit + Left = 8 + Top = 76 + Width = 313 + Height = 23 + EditLabel.Width = 58 + EditLabel.Height = 15 + EditLabel.Caption = 'Private Key' + ReadOnly = True + TabOrder = 2 + Text = '' + end + object leCrt: TLabeledEdit + Left = 8 + Top = 132 + Width = 313 + Height = 23 + EditLabel.Width = 55 + EditLabel.Height = 15 + EditLabel.Caption = 'Public Key' + ReadOnly = True + TabOrder = 3 + Text = '' + end + object Button2: TButton + Left = 320 + Top = 75 + Width = 33 + Height = 25 + Caption = '...' + TabOrder = 4 + OnClick = Button2Click + end + object Button3: TButton + Left = 320 + Top = 131 + Width = 33 + Height = 25 + Caption = '...' + TabOrder = 5 + OnClick = Button3Click + end + object lePassword: TLabeledEdit + Left = 9 + Top = 190 + Width = 144 + Height = 23 + EditLabel.Width = 50 + EditLabel.Height = 15 + EditLabel.Caption = 'Password' + PasswordChar = '*' + TabOrder = 6 + Text = '' + end + object StatusBar1: TStatusBar + Left = 0 + Top = 279 + Width = 356 + Height = 19 + Panels = < + item + Width = 50 + end> + ExplicitTop = 278 + ExplicitWidth = 352 + end + object OpenDialog1: TOpenDialog + Left = 264 + Top = 16 + end +end diff --git a/samples/delphi/vcl-ssl/src/Main.Form.pas b/samples/delphi/vcl-ssl/src/Main.Form.pas index 780ac71..ec2b8a8 100644 --- a/samples/delphi/vcl-ssl/src/Main.Form.pas +++ b/samples/delphi/vcl-ssl/src/Main.Form.pas @@ -1,105 +1,105 @@ -unit Main.Form; - -interface - -uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, - Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Horse, Vcl.StdCtrls, Vcl.Samples.Spin, Vcl.Mask, Vcl.ExtCtrls, Vcl.ComCtrls; - -type - TfrmMain = class(TForm) - edtPort: TSpinEdit; - Button1: TButton; - leKey: TLabeledEdit; - leCrt: TLabeledEdit; - Button2: TButton; - Button3: TButton; - OpenDialog1: TOpenDialog; - lePassword: TLabeledEdit; - StatusBar1: TStatusBar; - procedure Button2Click(Sender: TObject); - procedure Button3Click(Sender: TObject); - procedure Button1Click(Sender: TObject); - procedure FormCreate(Sender: TObject); - private - function GetFile(const description, extension: string): string; - procedure Start; - procedure OnGetPassword(var Password: string); - end; - -var - frmMain: TfrmMain; - -implementation - -uses IdSSLOpenSSL; - -{$R *.dfm} - -procedure TfrmMain.Button1Click(Sender: TObject); -begin - Start; -end; - -procedure TfrmMain.Button2Click(Sender: TObject); -begin - leKey.Text := GetFile('Private Key', '*key'); -end; - -procedure TfrmMain.Button3Click(Sender: TObject); -begin - leCrt.Text := GetFile('Public Key', '*crt'); -end; - -procedure TfrmMain.FormCreate(Sender: TObject); -begin - THorse.Get('/ping', - procedure(Req: THorseRequest; Res: THorseResponse) - begin - Res.Send('securite pong'); - end); -end; - -function TfrmMain.GetFile(const description, extension: string): string; -begin - Result := EmptyStr; - OpenDialog1.Filter := description + '|' + extension; - if OpenDialog1.Execute() then - begin - if OpenDialog1.FileName <> EmptyStr then - Result := OpenDialog1.FileName; - end; -end; - -procedure TfrmMain.OnGetPassword(var Password: string); -begin - Password := lePassword.Text; -end; - -procedure TfrmMain.Start; -begin -// To use ssl it is necessary to have the ssl, libeay32.dll and ssleay32.dll -// libraries in your executable folder. - -// Command to generate a self-signed certificate using openssl, on windows it is recommended to use git bash. -// openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout cert.key -out cert.crt - -// Not recommended for production, only for testing and internal use, for commercial use in production -// use a valid certificate, such as Let's Encrypt. - - THorse.IOHandleSSL - .KeyFile(leKey.Text) - .CertFile(leCrt.Text) - .OnGetPassword(Self.OnGetPassword) - .SSLVersions([sslvTLSv1_2]) - .Active(True); - - // Need to set "HORSE_VCL" compilation directive - - THorse.Listen(edtPort.Value, - procedure - begin - StatusBar1.Panels.Items[0].Text := Format('Securite Server is running on https://%s:%d', [THorse.Host, THorse.Port]); - end); -end; - -end. +unit Main.Form; + +interface + +uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, + Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Horse, Vcl.StdCtrls, Vcl.Samples.Spin, Vcl.Mask, Vcl.ExtCtrls, Vcl.ComCtrls; + +type + TfrmMain = class(TForm) + edtPort: TSpinEdit; + Button1: TButton; + leKey: TLabeledEdit; + leCrt: TLabeledEdit; + Button2: TButton; + Button3: TButton; + OpenDialog1: TOpenDialog; + lePassword: TLabeledEdit; + StatusBar1: TStatusBar; + procedure Button2Click(Sender: TObject); + procedure Button3Click(Sender: TObject); + procedure Button1Click(Sender: TObject); + procedure FormCreate(Sender: TObject); + private + function GetFile(const description, extension: string): string; + procedure Start; + procedure OnGetPassword(var Password: string); + end; + +var + frmMain: TfrmMain; + +implementation + +uses IdSSLOpenSSL; + +{$R *.dfm} + +procedure TfrmMain.Button1Click(Sender: TObject); +begin + Start; +end; + +procedure TfrmMain.Button2Click(Sender: TObject); +begin + leKey.Text := GetFile('Private Key', '*key'); +end; + +procedure TfrmMain.Button3Click(Sender: TObject); +begin + leCrt.Text := GetFile('Public Key', '*crt'); +end; + +procedure TfrmMain.FormCreate(Sender: TObject); +begin + THorse.Get('/ping', + procedure(Req: THorseRequest; Res: THorseResponse) + begin + Res.Send('securite pong'); + end); +end; + +function TfrmMain.GetFile(const description, extension: string): string; +begin + Result := EmptyStr; + OpenDialog1.Filter := description + '|' + extension; + if OpenDialog1.Execute() then + begin + if OpenDialog1.FileName <> EmptyStr then + Result := OpenDialog1.FileName; + end; +end; + +procedure TfrmMain.OnGetPassword(var Password: string); +begin + Password := lePassword.Text; +end; + +procedure TfrmMain.Start; +begin +// To use ssl it is necessary to have the ssl, libeay32.dll and ssleay32.dll +// libraries in your executable folder. + +// Command to generate a self-signed certificate using openssl, on windows it is recommended to use git bash. +// openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout cert.key -out cert.crt + +// Not recommended for production, only for testing and internal use, for commercial use in production +// use a valid certificate, such as Let's Encrypt. + + THorse.IOHandleSSL + .KeyFile(leKey.Text) + .CertFile(leCrt.Text) + .OnGetPassword(Self.OnGetPassword) + .SSLVersions([sslvTLSv1_2]) + .Active(True); + + // Need to set "HORSE_VCL" compilation directive + + THorse.Listen(edtPort.Value, + procedure + begin + StatusBar1.Panels.Items[0].Text := Format('Securite Server is running on https://%s:%d', [THorse.Host, THorse.Port]); + end); +end; + +end. diff --git a/samples/delphi/vcl/src/Main.Form.dfm b/samples/delphi/vcl/src/Main.Form.dfm index 0493e4c..e819d93 100644 --- a/samples/delphi/vcl/src/Main.Form.dfm +++ b/samples/delphi/vcl/src/Main.Form.dfm @@ -1,54 +1,54 @@ -object FrmVCL: TFrmVCL - Left = 0 - Top = 0 - BorderIcons = [biSystemMenu] - BorderStyle = bsSingle - Caption = 'VCL' - ClientHeight = 82 - ClientWidth = 201 - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'Tahoma' - Font.Style = [] - Position = poScreenCenter - OnClose = FormClose - OnCreate = FormCreate - TextHeight = 13 - object Label1: TLabel - Left = 8 - Top = 19 - Width = 24 - Height = 13 - Caption = 'Port:' - end - object btnStop: TBitBtn - Left = 104 - Top = 50 - Width = 90 - Height = 25 - Caption = 'Stop' - Enabled = False - TabOrder = 0 - OnClick = btnStopClick - end - object btnStart: TBitBtn - Left = 8 - Top = 50 - Width = 90 - Height = 25 - Caption = 'Start' - TabOrder = 1 - OnClick = btnStartClick - end - object edtPort: TEdit - Left = 38 - Top = 16 - Width = 156 - Height = 21 - NumbersOnly = True - TabOrder = 2 - Text = '9000' - end -end +object FrmVCL: TFrmVCL + Left = 0 + Top = 0 + BorderIcons = [biSystemMenu] + BorderStyle = bsSingle + Caption = 'VCL' + ClientHeight = 82 + ClientWidth = 201 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + Position = poScreenCenter + OnClose = FormClose + OnCreate = FormCreate + TextHeight = 13 + object Label1: TLabel + Left = 8 + Top = 19 + Width = 24 + Height = 13 + Caption = 'Port:' + end + object btnStop: TBitBtn + Left = 104 + Top = 50 + Width = 90 + Height = 25 + Caption = 'Stop' + Enabled = False + TabOrder = 0 + OnClick = btnStopClick + end + object btnStart: TBitBtn + Left = 8 + Top = 50 + Width = 90 + Height = 25 + Caption = 'Start' + TabOrder = 1 + OnClick = btnStartClick + end + object edtPort: TEdit + Left = 38 + Top = 16 + Width = 156 + Height = 21 + NumbersOnly = True + TabOrder = 2 + Text = '9000' + end +end diff --git a/samples/delphi/vcl/src/Main.Form.pas b/samples/delphi/vcl/src/Main.Form.pas index b6ff029..4330089 100644 --- a/samples/delphi/vcl/src/Main.Form.pas +++ b/samples/delphi/vcl/src/Main.Form.pas @@ -1,78 +1,78 @@ -unit Main.Form; - -interface - -uses Winapi.Windows, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, - Vcl.Buttons, System.SysUtils; - -type - TFrmVCL = class(TForm) - btnStop: TBitBtn; - btnStart: TBitBtn; - Label1: TLabel; - edtPort: TEdit; - procedure btnStopClick(Sender: TObject); - procedure FormClose(Sender: TObject; var Action: TCloseAction); - procedure btnStartClick(Sender: TObject); - procedure FormCreate(Sender: TObject); - private - procedure Status; - procedure Start; - procedure Stop; - end; - -var - FrmVCL: TFrmVCL; - -implementation - -uses Horse; - -{$R *.dfm} - -procedure TFrmVCL.FormClose(Sender: TObject; var Action: TCloseAction); -begin - if THorse.IsRunning then - Stop; -end; - -procedure TFrmVCL.FormCreate(Sender: TObject); -begin - THorse.Get('ping', - procedure(Req: THorseRequest; Res: THorseResponse) - begin - Res.Send('pong'); - end); -end; - -procedure TFrmVCL.Start; -begin - // Need to set "HORSE_VCL" compilation directive - THorse.Listen(StrToInt(edtPort.Text)); -end; - -procedure TFrmVCL.Status; -begin - btnStop.Enabled := THorse.IsRunning; - btnStart.Enabled := not THorse.IsRunning; - edtPort.Enabled := not THorse.IsRunning; -end; - -procedure TFrmVCL.Stop; -begin - THorse.StopListen; -end; - -procedure TFrmVCL.btnStartClick(Sender: TObject); -begin - Start; - Status; -end; - -procedure TFrmVCL.btnStopClick(Sender: TObject); -begin - Stop; - Status; -end; - -end. +unit Main.Form; + +interface + +uses Winapi.Windows, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, + Vcl.Buttons, System.SysUtils; + +type + TFrmVCL = class(TForm) + btnStop: TBitBtn; + btnStart: TBitBtn; + Label1: TLabel; + edtPort: TEdit; + procedure btnStopClick(Sender: TObject); + procedure FormClose(Sender: TObject; var Action: TCloseAction); + procedure btnStartClick(Sender: TObject); + procedure FormCreate(Sender: TObject); + private + procedure Status; + procedure Start; + procedure Stop; + end; + +var + FrmVCL: TFrmVCL; + +implementation + +uses Horse; + +{$R *.dfm} + +procedure TFrmVCL.FormClose(Sender: TObject; var Action: TCloseAction); +begin + if THorse.IsRunning then + Stop; +end; + +procedure TFrmVCL.FormCreate(Sender: TObject); +begin + THorse.Get('ping', + procedure(Req: THorseRequest; Res: THorseResponse) + begin + Res.Send('pong'); + end); +end; + +procedure TFrmVCL.Start; +begin + // Need to set "HORSE_VCL" compilation directive + THorse.Listen(StrToInt(edtPort.Text)); +end; + +procedure TFrmVCL.Status; +begin + btnStop.Enabled := THorse.IsRunning; + btnStart.Enabled := not THorse.IsRunning; + edtPort.Enabled := not THorse.IsRunning; +end; + +procedure TFrmVCL.Stop; +begin + THorse.StopListen; +end; + +procedure TFrmVCL.btnStartClick(Sender: TObject); +begin + Start; + Status; +end; + +procedure TFrmVCL.btnStopClick(Sender: TObject); +begin + Stop; + Status; +end; + +end. diff --git a/samples/delphi/winsvc/WinSvc.dpr b/samples/delphi/winsvc/WinSvc.dpr index d1b1c93..8ad5b32 100644 --- a/samples/delphi/winsvc/WinSvc.dpr +++ b/samples/delphi/winsvc/WinSvc.dpr @@ -1,28 +1,28 @@ -program WinSvc; - -uses - Vcl.SvcMgr, - Main.Service in 'src\Main.Service.pas' {MainService: TService}; - -{$R *.RES} - -begin - // Windows 2003 Server requires StartServiceCtrlDispatcher to be - // called before CoRegisterClassObject, which can be called indirectly - // by Application.Initialize. TServiceApplication.DelayInitialize allows - // Application.Initialize to be called from TService.Main (after - // StartServiceCtrlDispatcher has been called). - - // Delayed initialization of the Application object may affect - // events which then occur prior to initialization, such as - // TService.OnCreate. It is only recommended if the ServiceApplication - // registers a class object with OLE and is intended for use with - // Windows 2003 Server. - - // Application.DelayInitialize := True; - - if not Application.DelayInitialize or Application.Installing then - Application.Initialize; - Application.CreateForm(TMainService, MainService); - Application.Run; -end. +program WinSvc; + +uses + Vcl.SvcMgr, + Main.Service in 'src\Main.Service.pas' {MainService: TService}; + +{$R *.RES} + +begin + // Windows 2003 Server requires StartServiceCtrlDispatcher to be + // called before CoRegisterClassObject, which can be called indirectly + // by Application.Initialize. TServiceApplication.DelayInitialize allows + // Application.Initialize to be called from TService.Main (after + // StartServiceCtrlDispatcher has been called). + + // Delayed initialization of the Application object may affect + // events which then occur prior to initialization, such as + // TService.OnCreate. It is only recommended if the ServiceApplication + // registers a class object with OLE and is intended for use with + // Windows 2003 Server. + + // Application.DelayInitialize := True; + + if not Application.DelayInitialize or Application.Installing then + Application.Initialize; + Application.CreateForm(TMainService, MainService); + Application.Run; +end. diff --git a/samples/delphi/winsvc/WinSvc.dproj b/samples/delphi/winsvc/WinSvc.dproj index dc8a240..7b51f05 100644 --- a/samples/delphi/winsvc/WinSvc.dproj +++ b/samples/delphi/winsvc/WinSvc.dproj @@ -1,1034 +1,1034 @@ - - - {7EDDAB18-DB37-48A2-B6FA-062077E0D490} - 19.5 - VCL - WinSvc.dpr - True - Debug - Win32 - 1 - Application - - - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - 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 - System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) - $(BDS)\bin\delphi_PROJECTICON.ico - $(BDS)\bin\delphi_PROJECTICNS.icns - WinSvc - - - DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;emsclientfiredac;tethering;DataSnapFireDAC;bindcompfmx;FmxTeeUI;fmx;FireDACIBDriver;FireDACDBXDriver;dbexpress;IndyCore;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;FMXTee;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;DataSnapNativeClient;FireDACDSDriver;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;$(DCC_UsePackage) - 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 - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png - - - DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;emsclientfiredac;tethering;DataSnapFireDAC;bindcompfmx;FmxTeeUI;fmx;FireDACIBDriver;FireDACDBXDriver;dbexpress;IndyCore;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;FMXTee;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;DataSnapNativeClient;FireDACDSDriver;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;$(DCC_UsePackage) - 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 - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png - - - DBXSqliteDriver;RESTComponents;fmxase;DBXInterBaseDriver;emsclientfiredac;tethering;DataSnapFireDAC;bindcompfmx;FmxTeeUI;fmx;FireDACIBDriver;FireDACDBXDriver;dbexpress;IndyCore;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;FMXTee;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;DataSnapNativeClient;FireDACDSDriver;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;$(DCC_UsePackage) - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_1024x1024.png - - - CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers - iPhoneAndiPad - true - DBXSqliteDriver;RESTComponents;fmxase;DBXInterBaseDriver;emsclientfiredac;tethering;DataSnapFireDAC;bindcompfmx;FmxTeeUI;fmx;FireDACIBDriver;FireDACDBXDriver;dbexpress;IndyCore;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;FMXTee;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;DataSnapNativeClient;FireDACDSDriver;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;$(DCC_UsePackage);$(DCC_UsePackage) - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_1024x1024.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_120x120.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_180x180.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_2x.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_2x.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_3x.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_3x.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_80x80.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_120x120.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SettingIcon_58x58.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_SettingIcon_87x87.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_NotificationIcon_40x40.png - $(BDS)\bin\Artwork\iOS\iPhone\FM_NotificationIcon_60x60.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_152x152.png - $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_167x167.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImage_2x.png - $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageDark_2x.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_80x80.png - $(BDS)\bin\Artwork\iOS\iPad\FM_SettingIcon_58x58.png - $(BDS)\bin\Artwork\iOS\iPad\FM_NotificationIcon_40x40.png - - - DBXSqliteDriver;RESTComponents;fmxase;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;bindcompvclsmp;emsclientfiredac;tethering;svnui;DataSnapFireDAC;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;svn;DBXOracleDriver;inetdb;FmxTeeUI;emsedge;fmx;FireDACIBDriver;fmxdae;vcledge;FireDACDBXDriver;dbexpress;IndyCore;boss_ide;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;TeeDB;FireDAC;emshosting;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;Tee;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;DOSCommandDR;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;TeeUI;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;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 - 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 - $(BDS)\bin\default_app.manifest - - - DBXSqliteDriver;RESTComponents;fmxase;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;bindcompvclsmp;emsclientfiredac;tethering;DataSnapFireDAC;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;DBXOracleDriver;inetdb;FmxTeeUI;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;TeeDB;FireDAC;emshosting;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;Tee;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;DOSCommandDR;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;TeeUI;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;inetdbxpress;FireDACMongoDBDriver;DataSnapServerMidas;$(DCC_UsePackage) - - - DEBUG;$(DCC_Define) - true - false - true - true - true - - - false - true - PerMonitorV2 - ..\..\..\src;$(DCC_UnitSearchPath) - true - 1033 - - - false - RELEASE;$(DCC_Define) - 0 - 0 - - - true - PerMonitorV2 - - - - MainSource - - -
MainService
- dfm - TService -
- - Base - - - Cfg_1 - Base - - - Cfg_2 - Base - -
- - Delphi.Personality.12 - Application - - - - WinSvc.dpr - - - ExpressPivotGrid OLAP by Developer Express Inc. - Microsoft Office 2000 Sample Automation Server Wrapper Components - Microsoft Office XP Sample Automation Server Wrapper Components - - - - - - - 1 - - - Contents\MacOS - 1 - - - 0 - - - - - classes - 64 - - - classes - 64 - - - - - 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-xxxhdpi - 1 - - - res\drawable-xxxhdpi - 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 - - - Contents\MacOS - 1 - .framework - - - 0 - - - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - Contents\MacOS - 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 - - - Contents\MacOS - 1 - .dylib - - - 0 - .bpl - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - Contents\Resources\StartUp\ - 0 - - - Contents\Resources\StartUp\ - 0 - - - Contents\Resources\StartUp\ - 0 - - - 0 - - - - - 1 - - - 1 - - - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - - - ..\ - 1 - - - ..\ - 1 - - - ..\ - 1 - - - - - Contents - 1 - - - Contents - 1 - - - Contents - 1 - - - - - Contents\Resources - 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 - - - Contents\MacOS - 1 - - - 0 - - - - - library\lib\armeabi-v7a - 1 - - - - - 1 - - - 1 - - - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - - - ..\ - 1 - - - ..\ - 1 - - - ..\ - 1 - - - - - 1 - - - 1 - - - 1 - - - - - ..\$(PROJECTNAME).launchscreen - 64 - - - ..\$(PROJECTNAME).launchscreen - 64 - - - - - 1 - - - 1 - - - 1 - - - - - Assets - 1 - - - Assets - 1 - - - - - Assets - 1 - - - Assets - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 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\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 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\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - - - - - - - - - - - - - False - False - False - False - True - False - - - 12 - - - - -
+ + + {7EDDAB18-DB37-48A2-B6FA-062077E0D490} + 19.5 + VCL + WinSvc.dpr + True + Debug + Win32 + 1 + Application + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + 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 + System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) + $(BDS)\bin\delphi_PROJECTICON.ico + $(BDS)\bin\delphi_PROJECTICNS.icns + WinSvc + + + DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;emsclientfiredac;tethering;DataSnapFireDAC;bindcompfmx;FmxTeeUI;fmx;FireDACIBDriver;FireDACDBXDriver;dbexpress;IndyCore;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;FMXTee;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;DataSnapNativeClient;FireDACDSDriver;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;$(DCC_UsePackage) + 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 + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png + + + DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;emsclientfiredac;tethering;DataSnapFireDAC;bindcompfmx;FmxTeeUI;fmx;FireDACIBDriver;FireDACDBXDriver;dbexpress;IndyCore;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;FMXTee;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;DataSnapNativeClient;FireDACDSDriver;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;$(DCC_UsePackage) + 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 + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png + + + DBXSqliteDriver;RESTComponents;fmxase;DBXInterBaseDriver;emsclientfiredac;tethering;DataSnapFireDAC;bindcompfmx;FmxTeeUI;fmx;FireDACIBDriver;FireDACDBXDriver;dbexpress;IndyCore;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;FMXTee;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;DataSnapNativeClient;FireDACDSDriver;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;$(DCC_UsePackage) + $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_1024x1024.png + + + CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers + iPhoneAndiPad + true + DBXSqliteDriver;RESTComponents;fmxase;DBXInterBaseDriver;emsclientfiredac;tethering;DataSnapFireDAC;bindcompfmx;FmxTeeUI;fmx;FireDACIBDriver;FireDACDBXDriver;dbexpress;IndyCore;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;FMXTee;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;DataSnapNativeClient;FireDACDSDriver;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;$(DCC_UsePackage);$(DCC_UsePackage) + $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_1024x1024.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_120x120.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_180x180.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_2x.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_2x.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_3x.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_3x.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_80x80.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_120x120.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_SettingIcon_58x58.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_SettingIcon_87x87.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_NotificationIcon_40x40.png + $(BDS)\bin\Artwork\iOS\iPhone\FM_NotificationIcon_60x60.png + $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_152x152.png + $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_167x167.png + $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImage_2x.png + $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageDark_2x.png + $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_80x80.png + $(BDS)\bin\Artwork\iOS\iPad\FM_SettingIcon_58x58.png + $(BDS)\bin\Artwork\iOS\iPad\FM_NotificationIcon_40x40.png + + + DBXSqliteDriver;RESTComponents;fmxase;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;bindcompvclsmp;emsclientfiredac;tethering;svnui;DataSnapFireDAC;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;svn;DBXOracleDriver;inetdb;FmxTeeUI;emsedge;fmx;FireDACIBDriver;fmxdae;vcledge;FireDACDBXDriver;dbexpress;IndyCore;boss_ide;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;TeeDB;FireDAC;emshosting;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;Tee;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;DOSCommandDR;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;TeeUI;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;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 + 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 + $(BDS)\bin\default_app.manifest + + + DBXSqliteDriver;RESTComponents;fmxase;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;bindcompvclsmp;emsclientfiredac;tethering;DataSnapFireDAC;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;DBXOracleDriver;inetdb;FmxTeeUI;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;TeeDB;FireDAC;emshosting;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;Tee;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;DOSCommandDR;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;TeeUI;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;inetdbxpress;FireDACMongoDBDriver;DataSnapServerMidas;$(DCC_UsePackage) + + + DEBUG;$(DCC_Define) + true + false + true + true + true + + + false + true + PerMonitorV2 + ..\..\..\src;$(DCC_UnitSearchPath) + true + 1033 + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + true + PerMonitorV2 + + + + MainSource + + +
MainService
+ dfm + TService +
+ + Base + + + Cfg_1 + Base + + + Cfg_2 + Base + +
+ + Delphi.Personality.12 + Application + + + + WinSvc.dpr + + + ExpressPivotGrid OLAP by Developer Express Inc. + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + + + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + classes + 64 + + + classes + 64 + + + + + 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-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 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 + + + Contents\MacOS + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 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 + + + Contents\MacOS + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + Contents\Resources\StartUp\ + 0 + + + Contents\Resources\StartUp\ + 0 + + + Contents\Resources\StartUp\ + 0 + + + 0 + + + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + ..\ + 1 + + + + + Contents + 1 + + + Contents + 1 + + + Contents + 1 + + + + + Contents\Resources + 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 + + + Contents\MacOS + 1 + + + 0 + + + + + library\lib\armeabi-v7a + 1 + + + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + ..\ + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).launchscreen + 64 + + + ..\$(PROJECTNAME).launchscreen + 64 + + + + + 1 + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 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\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 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\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + + + + + + + + + + + + + False + False + False + False + True + False + + + 12 + + + + +
diff --git a/samples/delphi/winsvc/src/Main.Service.dfm b/samples/delphi/winsvc/src/Main.Service.dfm index 62691db..0a8a324 100644 --- a/samples/delphi/winsvc/src/Main.Service.dfm +++ b/samples/delphi/winsvc/src/Main.Service.dfm @@ -1,9 +1,9 @@ -object MainService: TMainService - OnCreate = ServiceCreate - DisplayName = 'MainService' - StartType = stManual - OnStart = ServiceStart - OnStop = ServiceStop - Height = 150 - Width = 215 -end +object MainService: TMainService + OnCreate = ServiceCreate + DisplayName = 'MainService' + StartType = stManual + OnStart = ServiceStart + OnStop = ServiceStop + Height = 150 + Width = 215 +end diff --git a/samples/delphi/winsvc/src/Main.Service.pas b/samples/delphi/winsvc/src/Main.Service.pas index 4b3ac94..26786e2 100644 --- a/samples/delphi/winsvc/src/Main.Service.pas +++ b/samples/delphi/winsvc/src/Main.Service.pas @@ -1,57 +1,57 @@ -unit Main.Service; - -interface - -uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Classes, Vcl.Graphics, - Vcl.Controls, Vcl.SvcMgr, Vcl.Dialogs; - -type - TMainService = class(TService) - procedure ServiceCreate(Sender: TObject); - procedure ServiceStart(Sender: TService; var Started: Boolean); - procedure ServiceStop(Sender: TService; var Stopped: Boolean); - public - function GetServiceController: TServiceController; override; - end; - -var - MainService: TMainService; - -implementation - -uses Horse; - -{$R *.dfm} - -procedure ServiceController(CtrlCode: DWord); stdcall; -begin - MainService.Controller(CtrlCode); -end; - -function TMainService.GetServiceController: TServiceController; -begin - Result := ServiceController; -end; - -procedure TMainService.ServiceCreate(Sender: TObject); -begin - THorse.Get('ping', - procedure(Req: THorseRequest; Res: THorseResponse) - begin - Res.Send('pong'); - end); -end; - -procedure TMainService.ServiceStart(Sender: TService; var Started: Boolean); -begin - THorse.Listen; - Started := True; -end; - -procedure TMainService.ServiceStop(Sender: TService; var Stopped: Boolean); -begin - THorse.StopListen; - Stopped := True; -end; - -end. +unit Main.Service; + +interface + +uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Classes, Vcl.Graphics, + Vcl.Controls, Vcl.SvcMgr, Vcl.Dialogs; + +type + TMainService = class(TService) + procedure ServiceCreate(Sender: TObject); + procedure ServiceStart(Sender: TService; var Started: Boolean); + procedure ServiceStop(Sender: TService; var Stopped: Boolean); + public + function GetServiceController: TServiceController; override; + end; + +var + MainService: TMainService; + +implementation + +uses Horse; + +{$R *.dfm} + +procedure ServiceController(CtrlCode: DWord); stdcall; +begin + MainService.Controller(CtrlCode); +end; + +function TMainService.GetServiceController: TServiceController; +begin + Result := ServiceController; +end; + +procedure TMainService.ServiceCreate(Sender: TObject); +begin + THorse.Get('ping', + procedure(Req: THorseRequest; Res: THorseResponse) + begin + Res.Send('pong'); + end); +end; + +procedure TMainService.ServiceStart(Sender: TService; var Started: Boolean); +begin + THorse.Listen; + Started := True; +end; + +procedure TMainService.ServiceStop(Sender: TService; var Stopped: Boolean); +begin + THorse.StopListen; + Stopped := True; +end; + +end. diff --git a/samples/lazarus/apache/Apache.lpi b/samples/lazarus/apache/Apache.lpi index 418491c..639606e 100644 --- a/samples/lazarus/apache/Apache.lpi +++ b/samples/lazarus/apache/Apache.lpi @@ -1,73 +1,73 @@ - - - - - - - - - - - - - - <UseAppBundle Value="False"/> - <ResourceType Value="res"/> - </General> - <BuildModes Count="1"> - <Item1 Name="Default" Default="True"/> - </BuildModes> - <PublishOptions> - <Version Value="2"/> - <UseFileFilters Value="True"/> - </PublishOptions> - <RunParams> - <FormatVersion Value="2"/> - <Modes Count="0"/> - </RunParams> - <RequiredPackages Count="1"> - <Item1> - <PackageName Value="WebLaz"/> - </Item1> - </RequiredPackages> - <Units Count="1"> - <Unit0> - <Filename Value="Apache.pas"/> - <IsPartOfProject Value="True"/> - </Unit0> - </Units> - </ProjectOptions> - <CompilerOptions> - <Version Value="11"/> - <PathDelim Value="\"/> - <SearchPaths> - <IncludeFiles Value="$(ProjOutDir)"/> - <OtherUnitFiles Value="..\..\..\src"/> - <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> - </SearchPaths> - <Linking> - <Options> - <ExecutableType Value="Library"/> - </Options> - </Linking> - <Other> - <CustomOptions Value="-dHORSE_APACHE"/> - <OtherDefines Count="1"> - <Define0 Value="HORSE_APACHE"/> - </OtherDefines> - </Other> - </CompilerOptions> - <Debugging> - <Exceptions Count="3"> - <Item1> - <Name Value="EAbort"/> - </Item1> - <Item2> - <Name Value="ECodetoolError"/> - </Item2> - <Item3> - <Name Value="EFOpenError"/> - </Item3> - </Exceptions> - </Debugging> -</CONFIG> +<?xml version="1.0" encoding="UTF-8"?> +<CONFIG> + <ProjectOptions> + <Version Value="11"/> + <PathDelim Value="\"/> + <General> + <Flags> + <MainUnitHasCreateFormStatements Value="False"/> + <Runnable Value="False"/> + </Flags> + <SessionStorage Value="InProjectDir"/> + <MainUnit Value="0"/> + <Title Value="Apache"/> + <UseAppBundle Value="False"/> + <ResourceType Value="res"/> + </General> + <BuildModes Count="1"> + <Item1 Name="Default" Default="True"/> + </BuildModes> + <PublishOptions> + <Version Value="2"/> + <UseFileFilters Value="True"/> + </PublishOptions> + <RunParams> + <FormatVersion Value="2"/> + <Modes Count="0"/> + </RunParams> + <RequiredPackages Count="1"> + <Item1> + <PackageName Value="WebLaz"/> + </Item1> + </RequiredPackages> + <Units Count="1"> + <Unit0> + <Filename Value="Apache.pas"/> + <IsPartOfProject Value="True"/> + </Unit0> + </Units> + </ProjectOptions> + <CompilerOptions> + <Version Value="11"/> + <PathDelim Value="\"/> + <SearchPaths> + <IncludeFiles Value="$(ProjOutDir)"/> + <OtherUnitFiles Value="..\..\..\src"/> + <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> + </SearchPaths> + <Linking> + <Options> + <ExecutableType Value="Library"/> + </Options> + </Linking> + <Other> + <CustomOptions Value="-dHORSE_APACHE"/> + <OtherDefines Count="1"> + <Define0 Value="HORSE_APACHE"/> + </OtherDefines> + </Other> + </CompilerOptions> + <Debugging> + <Exceptions Count="3"> + <Item1> + <Name Value="EAbort"/> + </Item1> + <Item2> + <Name Value="ECodetoolError"/> + </Item2> + <Item3> + <Name Value="EFOpenError"/> + </Item3> + </Exceptions> + </Debugging> +</CONFIG> diff --git a/samples/lazarus/apache/Apache.pas b/samples/lazarus/apache/Apache.pas index ee036a3..be59f1d 100644 --- a/samples/lazarus/apache/Apache.pas +++ b/samples/lazarus/apache/Apache.pas @@ -1,37 +1,37 @@ -Library Apache; - -{$DEFINE Apache2_4} -{$DEFINE FPCAPACHE_2_4} -{$MODE DELPHI}{$H+} - -Uses -{$ifdef unix} - cthreads, -{$endif} - Horse, httpd24, fpApache24, custapache24; - -const - ModuleName = 'apache_horse_module'; - -var - ApacheModuleData : module; {$ifdef unix} public name ModuleName;{$endif unix} - -exports ApacheModuleData name ModuleName; - -procedure GetPing(Req: THorseRequest; Res: THorseResponse); -begin - Res.Send('pong'); -end; - -begin - // Need to set "HORSE_APACHE" compilation directive - - THorse.Get('/ping', GetPing); - - THorse.DefaultModule := @ApacheModuleData; - THorse.HandlerName := 'apache_horse_module-handle'; - THorse.ModuleName := ModuleName; - - THorse.Listen; -end. - +Library Apache; + +{$DEFINE Apache2_4} +{$DEFINE FPCAPACHE_2_4} +{$MODE DELPHI}{$H+} + +Uses +{$ifdef unix} + cthreads, +{$endif} + Horse, httpd24, fpApache24, custapache24; + +const + ModuleName = 'apache_horse_module'; + +var + ApacheModuleData : module; {$ifdef unix} public name ModuleName;{$endif unix} + +exports ApacheModuleData name ModuleName; + +procedure GetPing(Req: THorseRequest; Res: THorseResponse); +begin + Res.Send('pong'); +end; + +begin + // Need to set "HORSE_APACHE" compilation directive + + THorse.Get('/ping', GetPing); + + THorse.DefaultModule := @ApacheModuleData; + THorse.HandlerName := 'apache_horse_module-handle'; + THorse.ModuleName := ModuleName; + + THorse.Listen; +end. + diff --git a/samples/lazarus/cgi/CGI.lpi b/samples/lazarus/cgi/CGI.lpi index 9311629..dd58534 100644 --- a/samples/lazarus/cgi/CGI.lpi +++ b/samples/lazarus/cgi/CGI.lpi @@ -1,67 +1,67 @@ -<?xml version="1.0" encoding="UTF-8"?> -<CONFIG> - <ProjectOptions> - <Version Value="11"/> - <PathDelim Value="\"/> - <General> - <Flags> - <MainUnitHasCreateFormStatements Value="False"/> - <MainUnitHasTitleStatement Value="False"/> - <MainUnitHasScaledStatement Value="False"/> - </Flags> - <SessionStorage Value="InProjectDir"/> - <MainUnit Value="0"/> - <Title Value="CGI"/> - <UseAppBundle Value="False"/> - <ResourceType Value="res"/> - </General> - <BuildModes Count="1"> - <Item1 Name="Default" Default="True"/> - </BuildModes> - <PublishOptions> - <Version Value="2"/> - <UseFileFilters Value="True"/> - </PublishOptions> - <RunParams> - <FormatVersion Value="2"/> - <Modes Count="0"/> - </RunParams> - <Units Count="1"> - <Unit0> - <Filename Value="CGI.lpr"/> - <IsPartOfProject Value="True"/> - </Unit0> - </Units> - </ProjectOptions> - <CompilerOptions> - <Version Value="11"/> - <PathDelim Value="\"/> - <Target> - <Filename Value="CGI"/> - </Target> - <SearchPaths> - <IncludeFiles Value="$(ProjOutDir)"/> - <OtherUnitFiles Value="..\..\..\src"/> - <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> - </SearchPaths> - <Other> - <CustomOptions Value="-dHORSE_CGI"/> - <OtherDefines Count="1"> - <Define0 Value="HORSE_CGI"/> - </OtherDefines> - </Other> - </CompilerOptions> - <Debugging> - <Exceptions Count="3"> - <Item1> - <Name Value="EAbort"/> - </Item1> - <Item2> - <Name Value="ECodetoolError"/> - </Item2> - <Item3> - <Name Value="EFOpenError"/> - </Item3> - </Exceptions> - </Debugging> -</CONFIG> +<?xml version="1.0" encoding="UTF-8"?> +<CONFIG> + <ProjectOptions> + <Version Value="11"/> + <PathDelim Value="\"/> + <General> + <Flags> + <MainUnitHasCreateFormStatements Value="False"/> + <MainUnitHasTitleStatement Value="False"/> + <MainUnitHasScaledStatement Value="False"/> + </Flags> + <SessionStorage Value="InProjectDir"/> + <MainUnit Value="0"/> + <Title Value="CGI"/> + <UseAppBundle Value="False"/> + <ResourceType Value="res"/> + </General> + <BuildModes Count="1"> + <Item1 Name="Default" Default="True"/> + </BuildModes> + <PublishOptions> + <Version Value="2"/> + <UseFileFilters Value="True"/> + </PublishOptions> + <RunParams> + <FormatVersion Value="2"/> + <Modes Count="0"/> + </RunParams> + <Units Count="1"> + <Unit0> + <Filename Value="CGI.lpr"/> + <IsPartOfProject Value="True"/> + </Unit0> + </Units> + </ProjectOptions> + <CompilerOptions> + <Version Value="11"/> + <PathDelim Value="\"/> + <Target> + <Filename Value="CGI"/> + </Target> + <SearchPaths> + <IncludeFiles Value="$(ProjOutDir)"/> + <OtherUnitFiles Value="..\..\..\src"/> + <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> + </SearchPaths> + <Other> + <CustomOptions Value="-dHORSE_CGI"/> + <OtherDefines Count="1"> + <Define0 Value="HORSE_CGI"/> + </OtherDefines> + </Other> + </CompilerOptions> + <Debugging> + <Exceptions Count="3"> + <Item1> + <Name Value="EAbort"/> + </Item1> + <Item2> + <Name Value="ECodetoolError"/> + </Item2> + <Item3> + <Name Value="EFOpenError"/> + </Item3> + </Exceptions> + </Debugging> +</CONFIG> diff --git a/samples/lazarus/cgi/CGI.lpr b/samples/lazarus/cgi/CGI.lpr index 22d006f..881cf47 100644 --- a/samples/lazarus/cgi/CGI.lpr +++ b/samples/lazarus/cgi/CGI.lpr @@ -1,16 +1,16 @@ -program CGI; - -{$MODE DELPHI}{$H+} - -uses Horse; - -procedure GetPing(Req: THorseRequest; Res: THorseResponse); -begin - Res.Send('pong'); -end; - -begin - // Need to set "HORSE_CGI" compilation directive - THorse.Get('/ping', GetPing); - THorse.Listen; -end. +program CGI; + +{$MODE DELPHI}{$H+} + +uses Horse; + +procedure GetPing(Req: THorseRequest; Res: THorseResponse); +begin + Res.Send('pong'); +end; + +begin + // Need to set "HORSE_CGI" compilation directive + THorse.Get('/ping', GetPing); + THorse.Listen; +end. diff --git a/samples/lazarus/console/Console.lpi b/samples/lazarus/console/Console.lpi index 5673f6a..dd1b98c 100644 --- a/samples/lazarus/console/Console.lpi +++ b/samples/lazarus/console/Console.lpi @@ -1,68 +1,68 @@ -<?xml version="1.0" encoding="UTF-8"?> -<CONFIG> - <ProjectOptions> - <Version Value="12"/> - <PathDelim Value="\"/> - <General> - <Flags> - <MainUnitHasCreateFormStatements Value="False"/> - <MainUnitHasTitleStatement Value="False"/> - <MainUnitHasScaledStatement Value="False"/> - <CompatibilityMode Value="True"/> - </Flags> - <SessionStorage Value="InProjectDir"/> - <Title Value="Console"/> - <UseAppBundle Value="False"/> - <ResourceType Value="res"/> - </General> - <BuildModes Count="1"> - <Item1 Name="Default" Default="True"/> - </BuildModes> - <PublishOptions> - <Version Value="2"/> - <UseFileFilters Value="True"/> - </PublishOptions> - <RunParams> - <FormatVersion Value="2"/> - </RunParams> - <Units Count="1"> - <Unit0> - <Filename Value="Console.lpr"/> - <IsPartOfProject Value="True"/> - </Unit0> - </Units> - </ProjectOptions> - <CompilerOptions> - <Version Value="11"/> - <PathDelim Value="\"/> - <Target> - <Filename Value="Console"/> - </Target> - <SearchPaths> - <IncludeFiles Value="$(ProjOutDir)"/> - <OtherUnitFiles Value="..\..\..\src"/> - <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> - </SearchPaths> - <Linking> - <Debugging> - <DebugInfoType Value="dsDwarf2Set"/> - </Debugging> - </Linking> - <Other> - <CustomOptions Value="-dUseCThreads"/> - </Other> - </CompilerOptions> - <Debugging> - <Exceptions Count="3"> - <Item1> - <Name Value="EAbort"/> - </Item1> - <Item2> - <Name Value="ECodetoolError"/> - </Item2> - <Item3> - <Name Value="EFOpenError"/> - </Item3> - </Exceptions> - </Debugging> -</CONFIG> +<?xml version="1.0" encoding="UTF-8"?> +<CONFIG> + <ProjectOptions> + <Version Value="12"/> + <PathDelim Value="\"/> + <General> + <Flags> + <MainUnitHasCreateFormStatements Value="False"/> + <MainUnitHasTitleStatement Value="False"/> + <MainUnitHasScaledStatement Value="False"/> + <CompatibilityMode Value="True"/> + </Flags> + <SessionStorage Value="InProjectDir"/> + <Title Value="Console"/> + <UseAppBundle Value="False"/> + <ResourceType Value="res"/> + </General> + <BuildModes Count="1"> + <Item1 Name="Default" Default="True"/> + </BuildModes> + <PublishOptions> + <Version Value="2"/> + <UseFileFilters Value="True"/> + </PublishOptions> + <RunParams> + <FormatVersion Value="2"/> + </RunParams> + <Units Count="1"> + <Unit0> + <Filename Value="Console.lpr"/> + <IsPartOfProject Value="True"/> + </Unit0> + </Units> + </ProjectOptions> + <CompilerOptions> + <Version Value="11"/> + <PathDelim Value="\"/> + <Target> + <Filename Value="Console"/> + </Target> + <SearchPaths> + <IncludeFiles Value="$(ProjOutDir)"/> + <OtherUnitFiles Value="..\..\..\src"/> + <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> + </SearchPaths> + <Linking> + <Debugging> + <DebugInfoType Value="dsDwarf2Set"/> + </Debugging> + </Linking> + <Other> + <CustomOptions Value="-dUseCThreads"/> + </Other> + </CompilerOptions> + <Debugging> + <Exceptions Count="3"> + <Item1> + <Name Value="EAbort"/> + </Item1> + <Item2> + <Name Value="ECodetoolError"/> + </Item2> + <Item3> + <Name Value="EFOpenError"/> + </Item3> + </Exceptions> + </Debugging> +</CONFIG> diff --git a/samples/lazarus/console/Console.lpr b/samples/lazarus/console/Console.lpr index 1ef0d89..1150e7a 100644 --- a/samples/lazarus/console/Console.lpr +++ b/samples/lazarus/console/Console.lpr @@ -1,19 +1,19 @@ -program Console; - -{$MODE DELPHI}{$H+} - -uses - {$IFDEF UNIX}{$IFDEF UseCThreads} - cthreads, - {$ENDIF}{$ENDIF} - Horse; - -procedure GetPing(Req: THorseRequest; Res: THorseResponse); -begin - Res.Send('Ping'); -end; - -begin - THorse.Get('/ping', GetPing); - THorse.Listen(9000); -end. +program Console; + +{$MODE DELPHI}{$H+} + +uses + {$IFDEF UNIX}{$IFDEF UseCThreads} + cthreads, + {$ENDIF}{$ENDIF} + Horse; + +procedure GetPing(Req: THorseRequest; Res: THorseResponse); +begin + Res.Send('Ping'); +end; + +begin + THorse.Get('/ping', GetPing); + THorse.Listen(9000); +end. diff --git a/samples/lazarus/daemon/daemon.lpi b/samples/lazarus/daemon/daemon.lpi index 3aea841..944dc3c 100644 --- a/samples/lazarus/daemon/daemon.lpi +++ b/samples/lazarus/daemon/daemon.lpi @@ -1,138 +1,138 @@ -<?xml version="1.0" encoding="UTF-8"?> -<CONFIG> - <ProjectOptions> - <Version Value="11"/> - <PathDelim Value="\"/> - <General> - <Flags> - <MainUnitHasCreateFormStatements Value="False"/> - <MainUnitHasScaledStatement Value="False"/> - </Flags> - <SessionStorage Value="InProjectDir"/> - <MainUnit Value="0"/> - <Title Value="My Application"/> - <UseAppBundle Value="False"/> - <ResourceType Value="res"/> - </General> - <BuildModes Count="3"> - <Item1 Name="Default" Default="True"/> - <Item2 Name="Debug"> - <CompilerOptions> - <Version Value="11"/> - <PathDelim Value="\"/> - <Target> - <Filename Value="daemon"/> - </Target> - <SearchPaths> - <IncludeFiles Value="$(ProjOutDir)"/> - <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> - </SearchPaths> - <Parsing> - <SyntaxOptions> - <IncludeAssertionCode Value="True"/> - </SyntaxOptions> - </Parsing> - <CodeGeneration> - <Checks> - <IOChecks Value="True"/> - <RangeChecks Value="True"/> - <OverflowChecks Value="True"/> - <StackChecks Value="True"/> - </Checks> - <VerifyObjMethodCallValidity Value="True"/> - </CodeGeneration> - <Linking> - <Debugging> - <DebugInfoType Value="dsDwarf2Set"/> - <UseHeaptrc Value="True"/> - <TrashVariables Value="True"/> - <UseExternalDbgSyms Value="True"/> - </Debugging> - </Linking> - <Other> - <CustomOptions Value="-dHORSE_DAEMON"/> - <OtherDefines Count="1"> - <Define0 Value="HORSE_DAEMON"/> - </OtherDefines> - </Other> - </CompilerOptions> - </Item2> - <Item3 Name="Release"> - <CompilerOptions> - <Version Value="11"/> - <PathDelim Value="\"/> - <Target> - <Filename Value="daemon"/> - </Target> - <SearchPaths> - <IncludeFiles Value="$(ProjOutDir)"/> - <OtherUnitFiles Value="..\..\..\src"/> - <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> - </SearchPaths> - <CodeGeneration> - <SmartLinkUnit Value="True"/> - <Optimizations> - <OptimizationLevel Value="3"/> - </Optimizations> - </CodeGeneration> - <Linking> - <Debugging> - <GenerateDebugInfo Value="False"/> - </Debugging> - <LinkSmart Value="True"/> - </Linking> - <Other> - <CustomOptions Value="-dHORSE_DAEMON"/> - <OtherDefines Count="1"> - <Define0 Value="HORSE_DAEMON"/> - </OtherDefines> - </Other> - </CompilerOptions> - </Item3> - </BuildModes> - <PublishOptions> - <Version Value="2"/> - <UseFileFilters Value="True"/> - </PublishOptions> - <RunParams> - <FormatVersion Value="2"/> - <Modes Count="0"/> - </RunParams> - <Units Count="1"> - <Unit0> - <Filename Value="daemon.lpr"/> - <IsPartOfProject Value="True"/> - </Unit0> - </Units> - </ProjectOptions> - <CompilerOptions> - <Version Value="11"/> - <PathDelim Value="\"/> - <Target> - <Filename Value="daemon"/> - </Target> - <SearchPaths> - <IncludeFiles Value="$(ProjOutDir)"/> - <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> - </SearchPaths> - <Other> - <CustomOptions Value="-dHORSE_DAEMON"/> - <OtherDefines Count="1"> - <Define0 Value="HORSE_DAEMON"/> - </OtherDefines> - </Other> - </CompilerOptions> - <Debugging> - <Exceptions Count="3"> - <Item1> - <Name Value="EAbort"/> - </Item1> - <Item2> - <Name Value="ECodetoolError"/> - </Item2> - <Item3> - <Name Value="EFOpenError"/> - </Item3> - </Exceptions> - </Debugging> -</CONFIG> +<?xml version="1.0" encoding="UTF-8"?> +<CONFIG> + <ProjectOptions> + <Version Value="11"/> + <PathDelim Value="\"/> + <General> + <Flags> + <MainUnitHasCreateFormStatements Value="False"/> + <MainUnitHasScaledStatement Value="False"/> + </Flags> + <SessionStorage Value="InProjectDir"/> + <MainUnit Value="0"/> + <Title Value="My Application"/> + <UseAppBundle Value="False"/> + <ResourceType Value="res"/> + </General> + <BuildModes Count="3"> + <Item1 Name="Default" Default="True"/> + <Item2 Name="Debug"> + <CompilerOptions> + <Version Value="11"/> + <PathDelim Value="\"/> + <Target> + <Filename Value="daemon"/> + </Target> + <SearchPaths> + <IncludeFiles Value="$(ProjOutDir)"/> + <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> + </SearchPaths> + <Parsing> + <SyntaxOptions> + <IncludeAssertionCode Value="True"/> + </SyntaxOptions> + </Parsing> + <CodeGeneration> + <Checks> + <IOChecks Value="True"/> + <RangeChecks Value="True"/> + <OverflowChecks Value="True"/> + <StackChecks Value="True"/> + </Checks> + <VerifyObjMethodCallValidity Value="True"/> + </CodeGeneration> + <Linking> + <Debugging> + <DebugInfoType Value="dsDwarf2Set"/> + <UseHeaptrc Value="True"/> + <TrashVariables Value="True"/> + <UseExternalDbgSyms Value="True"/> + </Debugging> + </Linking> + <Other> + <CustomOptions Value="-dHORSE_DAEMON"/> + <OtherDefines Count="1"> + <Define0 Value="HORSE_DAEMON"/> + </OtherDefines> + </Other> + </CompilerOptions> + </Item2> + <Item3 Name="Release"> + <CompilerOptions> + <Version Value="11"/> + <PathDelim Value="\"/> + <Target> + <Filename Value="daemon"/> + </Target> + <SearchPaths> + <IncludeFiles Value="$(ProjOutDir)"/> + <OtherUnitFiles Value="..\..\..\src"/> + <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> + </SearchPaths> + <CodeGeneration> + <SmartLinkUnit Value="True"/> + <Optimizations> + <OptimizationLevel Value="3"/> + </Optimizations> + </CodeGeneration> + <Linking> + <Debugging> + <GenerateDebugInfo Value="False"/> + </Debugging> + <LinkSmart Value="True"/> + </Linking> + <Other> + <CustomOptions Value="-dHORSE_DAEMON"/> + <OtherDefines Count="1"> + <Define0 Value="HORSE_DAEMON"/> + </OtherDefines> + </Other> + </CompilerOptions> + </Item3> + </BuildModes> + <PublishOptions> + <Version Value="2"/> + <UseFileFilters Value="True"/> + </PublishOptions> + <RunParams> + <FormatVersion Value="2"/> + <Modes Count="0"/> + </RunParams> + <Units Count="1"> + <Unit0> + <Filename Value="daemon.lpr"/> + <IsPartOfProject Value="True"/> + </Unit0> + </Units> + </ProjectOptions> + <CompilerOptions> + <Version Value="11"/> + <PathDelim Value="\"/> + <Target> + <Filename Value="daemon"/> + </Target> + <SearchPaths> + <IncludeFiles Value="$(ProjOutDir)"/> + <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> + </SearchPaths> + <Other> + <CustomOptions Value="-dHORSE_DAEMON"/> + <OtherDefines Count="1"> + <Define0 Value="HORSE_DAEMON"/> + </OtherDefines> + </Other> + </CompilerOptions> + <Debugging> + <Exceptions Count="3"> + <Item1> + <Name Value="EAbort"/> + </Item1> + <Item2> + <Name Value="ECodetoolError"/> + </Item2> + <Item3> + <Name Value="EFOpenError"/> + </Item3> + </Exceptions> + </Debugging> +</CONFIG> diff --git a/samples/lazarus/daemon/daemon.lpr b/samples/lazarus/daemon/daemon.lpr index a83a266..e8da774 100644 --- a/samples/lazarus/daemon/daemon.lpr +++ b/samples/lazarus/daemon/daemon.lpr @@ -1,41 +1,41 @@ -program daemon; - -{$mode objfpc}{$H+} - -uses - {$IFDEF UNIX}{$IFDEF UseCThreads} - cthreads, - {$ENDIF}{$ENDIF} - Classes, SysUtils, Horse; - -procedure GetPing(Req: THorseRequest; Res: THorseResponse); -begin - Res.Send('pong'); -end; - -procedure OnListen; -begin - if THorse.IsRunning then - Writeln(Format('Server is runing on %s:%d', [THorse.Host, THorse.Port])); - if not THorse.IsRunning then - Writeln('Server stopped'); -end; - -var - sCMD: string; - bTerminated: Boolean; -begin - // Need to set "HORSE_DAEMON" compilation directive - THorse.Get('/ping', @GetPing); - bTerminated := False; - WriteLn('COMMANDS: START, STOP, TERMINATE'); - while not bTerminated do - begin - ReadLn(sCMD); - case sCMD.ToUpper() of - 'START': THorse.Listen(9000, @OnListen); - 'STOP': THorse.StopListen; - 'TERMINATE' : bTerminated := True; - end; - end; -end. +program daemon; + +{$mode objfpc}{$H+} + +uses + {$IFDEF UNIX}{$IFDEF UseCThreads} + cthreads, + {$ENDIF}{$ENDIF} + Classes, SysUtils, Horse; + +procedure GetPing(Req: THorseRequest; Res: THorseResponse); +begin + Res.Send('pong'); +end; + +procedure OnListen; +begin + if THorse.IsRunning then + Writeln(Format('Server is runing on %s:%d', [THorse.Host, THorse.Port])); + if not THorse.IsRunning then + Writeln('Server stopped'); +end; + +var + sCMD: string; + bTerminated: Boolean; +begin + // Need to set "HORSE_DAEMON" compilation directive + THorse.Get('/ping', @GetPing); + bTerminated := False; + WriteLn('COMMANDS: START, STOP, TERMINATE'); + while not bTerminated do + begin + ReadLn(sCMD); + case sCMD.ToUpper() of + 'START': THorse.Listen(9000, @OnListen); + 'STOP': THorse.StopListen; + 'TERMINATE' : bTerminated := True; + end; + end; +end. diff --git a/samples/lazarus/fastcgi/FCGI.lpi b/samples/lazarus/fastcgi/FCGI.lpi index 7081982..8cfc25a 100644 --- a/samples/lazarus/fastcgi/FCGI.lpi +++ b/samples/lazarus/fastcgi/FCGI.lpi @@ -1,70 +1,70 @@ -<?xml version="1.0" encoding="UTF-8"?> -<CONFIG> - <ProjectOptions> - <Version Value="11"/> - <PathDelim Value="\"/> - <General> - <Flags> - <MainUnitHasCreateFormStatements Value="False"/> - </Flags> - <SessionStorage Value="InProjectDir"/> - <MainUnit Value="0"/> - <Title Value="FCGI"/> - <UseAppBundle Value="False"/> - <ResourceType Value="res"/> - </General> - <BuildModes Count="1"> - <Item1 Name="Default" Default="True"/> - </BuildModes> - <PublishOptions> - <Version Value="2"/> - <UseFileFilters Value="True"/> - </PublishOptions> - <RunParams> - <FormatVersion Value="2"/> - <Modes Count="0"/> - </RunParams> - <RequiredPackages Count="2"> - <Item1> - <PackageName Value="WebLaz"/> - </Item1> - <Item2> - <PackageName Value="FCL"/> - </Item2> - </RequiredPackages> - <Units Count="1"> - <Unit0> - <Filename Value="FCGI.lpr"/> - <IsPartOfProject Value="True"/> - </Unit0> - </Units> - </ProjectOptions> - <CompilerOptions> - <Version Value="11"/> - <PathDelim Value="\"/> - <SearchPaths> - <IncludeFiles Value="$(ProjOutDir)"/> - <OtherUnitFiles Value="..\..\..\src"/> - <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> - </SearchPaths> - <Other> - <CustomOptions Value="-dHORSE_FCGI"/> - <OtherDefines Count="1"> - <Define0 Value="HORSE_FCGI"/> - </OtherDefines> - </Other> - </CompilerOptions> - <Debugging> - <Exceptions Count="3"> - <Item1> - <Name Value="EAbort"/> - </Item1> - <Item2> - <Name Value="ECodetoolError"/> - </Item2> - <Item3> - <Name Value="EFOpenError"/> - </Item3> - </Exceptions> - </Debugging> -</CONFIG> +<?xml version="1.0" encoding="UTF-8"?> +<CONFIG> + <ProjectOptions> + <Version Value="11"/> + <PathDelim Value="\"/> + <General> + <Flags> + <MainUnitHasCreateFormStatements Value="False"/> + </Flags> + <SessionStorage Value="InProjectDir"/> + <MainUnit Value="0"/> + <Title Value="FCGI"/> + <UseAppBundle Value="False"/> + <ResourceType Value="res"/> + </General> + <BuildModes Count="1"> + <Item1 Name="Default" Default="True"/> + </BuildModes> + <PublishOptions> + <Version Value="2"/> + <UseFileFilters Value="True"/> + </PublishOptions> + <RunParams> + <FormatVersion Value="2"/> + <Modes Count="0"/> + </RunParams> + <RequiredPackages Count="2"> + <Item1> + <PackageName Value="WebLaz"/> + </Item1> + <Item2> + <PackageName Value="FCL"/> + </Item2> + </RequiredPackages> + <Units Count="1"> + <Unit0> + <Filename Value="FCGI.lpr"/> + <IsPartOfProject Value="True"/> + </Unit0> + </Units> + </ProjectOptions> + <CompilerOptions> + <Version Value="11"/> + <PathDelim Value="\"/> + <SearchPaths> + <IncludeFiles Value="$(ProjOutDir)"/> + <OtherUnitFiles Value="..\..\..\src"/> + <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> + </SearchPaths> + <Other> + <CustomOptions Value="-dHORSE_FCGI"/> + <OtherDefines Count="1"> + <Define0 Value="HORSE_FCGI"/> + </OtherDefines> + </Other> + </CompilerOptions> + <Debugging> + <Exceptions Count="3"> + <Item1> + <Name Value="EAbort"/> + </Item1> + <Item2> + <Name Value="ECodetoolError"/> + </Item2> + <Item3> + <Name Value="EFOpenError"/> + </Item3> + </Exceptions> + </Debugging> +</CONFIG> diff --git a/samples/lazarus/fastcgi/FCGI.lpr b/samples/lazarus/fastcgi/FCGI.lpr index 52787e4..d294a6d 100644 --- a/samples/lazarus/fastcgi/FCGI.lpr +++ b/samples/lazarus/fastcgi/FCGI.lpr @@ -1,19 +1,19 @@ -program FCGI; - -{$IF DEFINED(FPC)} -{$MODE DELPHI}{$H+} -{$ENDIF} - -uses - Horse; - -procedure GetPing(Req: THorseRequest; Res: THorseResponse); -begin - Res.Send('pong'); -end; - -begin - // Need to set "HORSE_FCGI" compilation directive - THorse.Get('/ping', GetPing); - THorse.Listen; -end. +program FCGI; + +{$IF DEFINED(FPC)} +{$MODE DELPHI}{$H+} +{$ENDIF} + +uses + Horse; + +procedure GetPing(Req: THorseRequest; Res: THorseResponse); +begin + Res.Send('pong'); +end; + +begin + // Need to set "HORSE_FCGI" compilation directive + THorse.Get('/ping', GetPing); + THorse.Listen; +end. diff --git a/samples/lazarus/lcl/Samples.lpi b/samples/lazarus/lcl/Samples.lpi index 8a0b6a8..de89b31 100644 --- a/samples/lazarus/lcl/Samples.lpi +++ b/samples/lazarus/lcl/Samples.lpi @@ -1,85 +1,85 @@ -<?xml version="1.0" encoding="UTF-8"?> -<CONFIG> - <ProjectOptions> - <Version Value="12"/> - <PathDelim Value="\"/> - <General> - <SessionStorage Value="InProjectDir"/> - <Title Value="Samples"/> - <Scaled Value="True"/> - <ResourceType Value="res"/> - <UseXPManifest Value="True"/> - <XPManifest> - <DpiAware Value="True/PM_V2"/> - </XPManifest> - <Icon Value="0"/> - </General> - <BuildModes> - <Item Name="Default" Default="True"/> - </BuildModes> - <PublishOptions> - <Version Value="2"/> - <UseFileFilters Value="True"/> - </PublishOptions> - <RunParams> - <FormatVersion Value="2"/> - </RunParams> - <RequiredPackages> - <Item> - <PackageName Value="LCL"/> - </Item> - </RequiredPackages> - <Units> - <Unit> - <Filename Value="Samples.lpr"/> - <IsPartOfProject Value="True"/> - </Unit> - <Unit> - <Filename Value="src\views.main.pas"/> - <IsPartOfProject Value="True"/> - <ComponentName Value="FrmMain"/> - <HasResources Value="True"/> - <ResourceBaseClass Value="Form"/> - <UnitName Value="Views.Main"/> - </Unit> - </Units> - </ProjectOptions> - <CompilerOptions> - <Version Value="11"/> - <PathDelim Value="\"/> - <Target> - <Filename Value="Samples"/> - </Target> - <SearchPaths> - <IncludeFiles Value="$(ProjOutDir)"/> - <OtherUnitFiles Value="src;..\..\..\src"/> - <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> - </SearchPaths> - <Linking> - <Debugging> - <DebugInfoType Value="dsDwarf2Set"/> - </Debugging> - <Options> - <Win32> - <GraphicApplication Value="True"/> - </Win32> - </Options> - </Linking> - <Other> - <CustomOptions Value="-dHORSE_LCL"/> - </Other> - </CompilerOptions> - <Debugging> - <Exceptions> - <Item> - <Name Value="EAbort"/> - </Item> - <Item> - <Name Value="ECodetoolError"/> - </Item> - <Item> - <Name Value="EFOpenError"/> - </Item> - </Exceptions> - </Debugging> -</CONFIG> +<?xml version="1.0" encoding="UTF-8"?> +<CONFIG> + <ProjectOptions> + <Version Value="12"/> + <PathDelim Value="\"/> + <General> + <SessionStorage Value="InProjectDir"/> + <Title Value="Samples"/> + <Scaled Value="True"/> + <ResourceType Value="res"/> + <UseXPManifest Value="True"/> + <XPManifest> + <DpiAware Value="True/PM_V2"/> + </XPManifest> + <Icon Value="0"/> + </General> + <BuildModes> + <Item Name="Default" Default="True"/> + </BuildModes> + <PublishOptions> + <Version Value="2"/> + <UseFileFilters Value="True"/> + </PublishOptions> + <RunParams> + <FormatVersion Value="2"/> + </RunParams> + <RequiredPackages> + <Item> + <PackageName Value="LCL"/> + </Item> + </RequiredPackages> + <Units> + <Unit> + <Filename Value="Samples.lpr"/> + <IsPartOfProject Value="True"/> + </Unit> + <Unit> + <Filename Value="src\views.main.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="FrmMain"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + <UnitName Value="Views.Main"/> + </Unit> + </Units> + </ProjectOptions> + <CompilerOptions> + <Version Value="11"/> + <PathDelim Value="\"/> + <Target> + <Filename Value="Samples"/> + </Target> + <SearchPaths> + <IncludeFiles Value="$(ProjOutDir)"/> + <OtherUnitFiles Value="src;..\..\..\src"/> + <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> + </SearchPaths> + <Linking> + <Debugging> + <DebugInfoType Value="dsDwarf2Set"/> + </Debugging> + <Options> + <Win32> + <GraphicApplication Value="True"/> + </Win32> + </Options> + </Linking> + <Other> + <CustomOptions Value="-dHORSE_LCL"/> + </Other> + </CompilerOptions> + <Debugging> + <Exceptions> + <Item> + <Name Value="EAbort"/> + </Item> + <Item> + <Name Value="ECodetoolError"/> + </Item> + <Item> + <Name Value="EFOpenError"/> + </Item> + </Exceptions> + </Debugging> +</CONFIG> diff --git a/samples/lazarus/lcl/Samples.lpr b/samples/lazarus/lcl/Samples.lpr index fb77665..62f3439 100644 --- a/samples/lazarus/lcl/Samples.lpr +++ b/samples/lazarus/lcl/Samples.lpr @@ -1,24 +1,24 @@ -program Samples; - -{$mode objfpc}{$H+} - -uses - {$IFDEF UNIX} - cthreads, - {$ENDIF} - {$IFDEF HASAMIGA} - athreads, - {$ENDIF} - Interfaces, - Forms, Views.Main; - -{$R *.res} - -begin - RequireDerivedFormResource := True; - Application.Scaled := True; - Application.Initialize; - Application.CreateForm(TFrmMain, FrmMain); - Application.Run; -end. - +program Samples; + +{$mode objfpc}{$H+} + +uses + {$IFDEF UNIX} + cthreads, + {$ENDIF} + {$IFDEF HASAMIGA} + athreads, + {$ENDIF} + Interfaces, + Forms, Views.Main; + +{$R *.res} + +begin + RequireDerivedFormResource := True; + Application.Scaled := True; + Application.Initialize; + Application.CreateForm(TFrmMain, FrmMain); + Application.Run; +end. + diff --git a/samples/lazarus/lcl/src/views.main.lfm b/samples/lazarus/lcl/src/views.main.lfm index 65d938c..7710ab1 100644 --- a/samples/lazarus/lcl/src/views.main.lfm +++ b/samples/lazarus/lcl/src/views.main.lfm @@ -1,47 +1,47 @@ -object FrmMain: TFrmMain - Left = 350 - Height = 87 - Top = 31 - Width = 209 - Caption = 'LCL Application' - ClientHeight = 87 - ClientWidth = 209 - OnCreate = FormCreate - LCLVersion = '2.2.2.0' - object Label1: TLabel - Left = 8 - Height = 15 - Top = 19 - Width = 25 - Caption = 'Port:' - ParentColor = False - end - object btnStop: TBitBtn - Left = 104 - Height = 25 - Top = 50 - Width = 90 - Caption = 'Stop' - Enabled = False - OnClick = btnStopClick - TabOrder = 0 - end - object btnStart: TBitBtn - Left = 8 - Height = 25 - Top = 50 - Width = 90 - Caption = 'Start' - OnClick = btnStartClick - TabOrder = 1 - end - object edtPort: TEdit - Left = 38 - Height = 23 - Top = 16 - Width = 156 - NumbersOnly = True - TabOrder = 2 - Text = '9000' - end -end +object FrmMain: TFrmMain + Left = 350 + Height = 87 + Top = 31 + Width = 209 + Caption = 'LCL Application' + ClientHeight = 87 + ClientWidth = 209 + OnCreate = FormCreate + LCLVersion = '2.2.2.0' + object Label1: TLabel + Left = 8 + Height = 15 + Top = 19 + Width = 25 + Caption = 'Port:' + ParentColor = False + end + object btnStop: TBitBtn + Left = 104 + Height = 25 + Top = 50 + Width = 90 + Caption = 'Stop' + Enabled = False + OnClick = btnStopClick + TabOrder = 0 + end + object btnStart: TBitBtn + Left = 8 + Height = 25 + Top = 50 + Width = 90 + Caption = 'Start' + OnClick = btnStartClick + TabOrder = 1 + end + object edtPort: TEdit + Left = 38 + Height = 23 + Top = 16 + Width = 156 + NumbersOnly = True + TabOrder = 2 + Text = '9000' + end +end diff --git a/samples/lazarus/lcl/src/views.main.pas b/samples/lazarus/lcl/src/views.main.pas index a1949c3..30645e8 100644 --- a/samples/lazarus/lcl/src/views.main.pas +++ b/samples/lazarus/lcl/src/views.main.pas @@ -1,72 +1,72 @@ -unit Views.Main; - -{$MODE DELPHI}{$H+} - -interface - -uses Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, Buttons, Horse; - -type - TFrmMain = class(TForm) - btnStart: TBitBtn; - btnStop: TBitBtn; - edtPort: TEdit; - Label1: TLabel; - procedure btnStartClick(Sender: TObject); - procedure btnStopClick(Sender: TObject); - procedure FormCreate(Sender: TObject); - private - procedure Status; - procedure Start; - procedure Stop; - end; - -var - FrmMain: TFrmMain; - -implementation - -procedure DoPing(Req: THorseRequest; Res: THorseResponse); -begin - Res.Send('pong'); -end; - -{$R *.lfm} - -procedure TFrmMain.btnStartClick(Sender: TObject); -begin - Start; - Status; -end; - -procedure TFrmMain.btnStopClick(Sender: TObject); -begin - Stop; - Status; -end; - -procedure TFrmMain.FormCreate(Sender: TObject); -begin - THorse.Get('/ping', DoPing); -end; - -procedure TFrmMain.Status; -begin - btnStop.Enabled := THorse.IsRunning; - btnStart.Enabled := not THorse.IsRunning; - edtPort.Enabled := not THorse.IsRunning; -end; - -procedure TFrmMain.Start; -begin - // Need to set "HORSE_LCL" compilation directive - THorse.Listen(StrToInt(edtPort.Text)); -end; - -procedure TFrmMain.Stop; -begin - THorse.StopListen; -end; - -end. - +unit Views.Main; + +{$MODE DELPHI}{$H+} + +interface + +uses Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, Buttons, Horse; + +type + TFrmMain = class(TForm) + btnStart: TBitBtn; + btnStop: TBitBtn; + edtPort: TEdit; + Label1: TLabel; + procedure btnStartClick(Sender: TObject); + procedure btnStopClick(Sender: TObject); + procedure FormCreate(Sender: TObject); + private + procedure Status; + procedure Start; + procedure Stop; + end; + +var + FrmMain: TFrmMain; + +implementation + +procedure DoPing(Req: THorseRequest; Res: THorseResponse); +begin + Res.Send('pong'); +end; + +{$R *.lfm} + +procedure TFrmMain.btnStartClick(Sender: TObject); +begin + Start; + Status; +end; + +procedure TFrmMain.btnStopClick(Sender: TObject); +begin + Stop; + Status; +end; + +procedure TFrmMain.FormCreate(Sender: TObject); +begin + THorse.Get('/ping', DoPing); +end; + +procedure TFrmMain.Status; +begin + btnStop.Enabled := THorse.IsRunning; + btnStart.Enabled := not THorse.IsRunning; + edtPort.Enabled := not THorse.IsRunning; +end; + +procedure TFrmMain.Start; +begin + // Need to set "HORSE_LCL" compilation directive + THorse.Listen(StrToInt(edtPort.Text)); +end; + +procedure TFrmMain.Stop; +begin + THorse.StopListen; +end; + +end. + diff --git a/samples/lazarus/winsvc/WinSvc.lpi b/samples/lazarus/winsvc/WinSvc.lpi index 4ec3607..40349bd 100644 --- a/samples/lazarus/winsvc/WinSvc.lpi +++ b/samples/lazarus/winsvc/WinSvc.lpi @@ -1,84 +1,84 @@ -<?xml version="1.0" encoding="UTF-8"?> -<CONFIG> - <ProjectOptions> - <Version Value="12"/> - <PathDelim Value="\"/> - <General> - <Flags> - <MainUnitHasCreateFormStatements Value="False"/> - <CompatibilityMode Value="True"/> - </Flags> - <SessionStorage Value="InProjectDir"/> - <Title Value="Daemon application"/> - <UseAppBundle Value="False"/> - <ResourceType Value="res"/> - </General> - <BuildModes Count="1"> - <Item1 Name="Default" Default="True"/> - </BuildModes> - <PublishOptions> - <Version Value="2"/> - <UseFileFilters Value="True"/> - </PublishOptions> - <RunParams> - <FormatVersion Value="2"/> - </RunParams> - <RequiredPackages Count="3"> - <Item1> - <PackageName Value="LazDaemon"/> - </Item1> - <Item2> - <PackageName Value="LCL"/> - </Item2> - <Item3> - <PackageName Value="FCL"/> - </Item3> - </RequiredPackages> - <Units Count="3"> - <Unit0> - <Filename Value="WinSvc.lpr"/> - <IsPartOfProject Value="True"/> - </Unit0> - <Unit1> - <Filename Value="daemonmanager.pas"/> - <IsPartOfProject Value="True"/> - <ComponentName Value="Daemon_Manager"/> - <HasResources Value="True"/> - <UnitName Value="DaemonManager"/> - </Unit1> - <Unit2> - <Filename Value="daemonmain.pas"/> - <IsPartOfProject Value="True"/> - <ComponentName Value="Daemon_Main"/> - <HasResources Value="True"/> - <ResourceBaseClass Value="DataModule"/> - <UnitName Value="DaemonMain"/> - </Unit2> - </Units> - </ProjectOptions> - <CompilerOptions> - <Version Value="11"/> - <PathDelim Value="\"/> - <Target> - <Filename Value="WinSvc"/> - </Target> - <SearchPaths> - <IncludeFiles Value="$(ProjOutDir)"/> - <OtherUnitFiles Value="..\..\..\src"/> - <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> - </SearchPaths> - </CompilerOptions> - <Debugging> - <Exceptions Count="3"> - <Item1> - <Name Value="EAbort"/> - </Item1> - <Item2> - <Name Value="ECodetoolError"/> - </Item2> - <Item3> - <Name Value="EFOpenError"/> - </Item3> - </Exceptions> - </Debugging> -</CONFIG> +<?xml version="1.0" encoding="UTF-8"?> +<CONFIG> + <ProjectOptions> + <Version Value="12"/> + <PathDelim Value="\"/> + <General> + <Flags> + <MainUnitHasCreateFormStatements Value="False"/> + <CompatibilityMode Value="True"/> + </Flags> + <SessionStorage Value="InProjectDir"/> + <Title Value="Daemon application"/> + <UseAppBundle Value="False"/> + <ResourceType Value="res"/> + </General> + <BuildModes Count="1"> + <Item1 Name="Default" Default="True"/> + </BuildModes> + <PublishOptions> + <Version Value="2"/> + <UseFileFilters Value="True"/> + </PublishOptions> + <RunParams> + <FormatVersion Value="2"/> + </RunParams> + <RequiredPackages Count="3"> + <Item1> + <PackageName Value="LazDaemon"/> + </Item1> + <Item2> + <PackageName Value="LCL"/> + </Item2> + <Item3> + <PackageName Value="FCL"/> + </Item3> + </RequiredPackages> + <Units Count="3"> + <Unit0> + <Filename Value="WinSvc.lpr"/> + <IsPartOfProject Value="True"/> + </Unit0> + <Unit1> + <Filename Value="daemonmanager.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="Daemon_Manager"/> + <HasResources Value="True"/> + <UnitName Value="DaemonManager"/> + </Unit1> + <Unit2> + <Filename Value="daemonmain.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="Daemon_Main"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="DataModule"/> + <UnitName Value="DaemonMain"/> + </Unit2> + </Units> + </ProjectOptions> + <CompilerOptions> + <Version Value="11"/> + <PathDelim Value="\"/> + <Target> + <Filename Value="WinSvc"/> + </Target> + <SearchPaths> + <IncludeFiles Value="$(ProjOutDir)"/> + <OtherUnitFiles Value="..\..\..\src"/> + <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> + </SearchPaths> + </CompilerOptions> + <Debugging> + <Exceptions Count="3"> + <Item1> + <Name Value="EAbort"/> + </Item1> + <Item2> + <Name Value="ECodetoolError"/> + </Item2> + <Item3> + <Name Value="EFOpenError"/> + </Item3> + </Exceptions> + </Debugging> +</CONFIG> diff --git a/samples/lazarus/winsvc/WinSvc.lpr b/samples/lazarus/winsvc/WinSvc.lpr index e5d5631..11ada33 100644 --- a/samples/lazarus/winsvc/WinSvc.lpr +++ b/samples/lazarus/winsvc/WinSvc.lpr @@ -1,12 +1,12 @@ -Program WinSvc; - -Uses -{$IFDEF UNIX}{$IFDEF UseCThreads} - CThreads, -{$ENDIF}{$ENDIF} - DaemonApp, lazdaemonapp, DaemonManager, DaemonMain; - -begin - Application.Initialize; - Application.Run; -end. +Program WinSvc; + +Uses +{$IFDEF UNIX}{$IFDEF UseCThreads} + CThreads, +{$ENDIF}{$ENDIF} + DaemonApp, lazdaemonapp, DaemonManager, DaemonMain; + +begin + Application.Initialize; + Application.Run; +end. diff --git a/samples/lazarus/winsvc/daemonmain.lfm b/samples/lazarus/winsvc/daemonmain.lfm index 29803af..c14c316 100644 --- a/samples/lazarus/winsvc/daemonmain.lfm +++ b/samples/lazarus/winsvc/daemonmain.lfm @@ -1,10 +1,10 @@ -object Daemon_Main: TDaemon_Main - OnCreate = DataModuleCreate - OldCreateOrder = False - OnStart = DataModuleStart - OnShutDown = DataModuleShutDown - Height = 150 - HorizontalOffset = 406 - VerticalOffset = 119 - Width = 150 -end +object Daemon_Main: TDaemon_Main + OnCreate = DataModuleCreate + OldCreateOrder = False + OnStart = DataModuleStart + OnShutDown = DataModuleShutDown + Height = 150 + HorizontalOffset = 406 + VerticalOffset = 119 + Width = 150 +end diff --git a/samples/lazarus/winsvc/daemonmain.pas b/samples/lazarus/winsvc/daemonmain.pas index 745f395..c85a2dc 100644 --- a/samples/lazarus/winsvc/daemonmain.pas +++ b/samples/lazarus/winsvc/daemonmain.pas @@ -1,61 +1,61 @@ -unit DaemonMain; - -{$mode objfpc}{$H+} - -interface - -uses - Classes, SysUtils, DaemonApp; - -type - TDaemon_Main = class(TDaemon) - procedure DataModuleCreate(Sender: TObject); - procedure DataModuleShutDown(Sender: TCustomDaemon); - procedure DataModuleStart(Sender: TCustomDaemon; var OK: Boolean); - end; - -var - Daemon_Main: TDaemon_Main; - -implementation - -uses - Horse; - -procedure RegisterDaemon; -begin - RegisterDaemonClass(TDaemon_Main) -end; - -procedure RunHorse; -begin - // Need to set "HORSE_DAEMON" compilation directive - THorse.Listen(9000); -end; - -procedure Ping(Req: THorseRequest; Res: THorseResponse); -begin - Res.Send('pong'); -end; - -{$R *.lfm} - -procedure TDaemon_Main.DataModuleCreate(Sender: TObject); -begin - THorse.Get('ping', @Ping); -end; - -procedure TDaemon_Main.DataModuleShutDown(Sender: TCustomDaemon); -begin - THorse.StopListen; -end; - -procedure TDaemon_Main.DataModuleStart(Sender: TCustomDaemon; var OK: Boolean); -begin - TThread.CreateAnonymousThread(@RunHorse).Start; -end; - -initialization - RegisterDaemon; - -end. +unit DaemonMain; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, DaemonApp; + +type + TDaemon_Main = class(TDaemon) + procedure DataModuleCreate(Sender: TObject); + procedure DataModuleShutDown(Sender: TCustomDaemon); + procedure DataModuleStart(Sender: TCustomDaemon; var OK: Boolean); + end; + +var + Daemon_Main: TDaemon_Main; + +implementation + +uses + Horse; + +procedure RegisterDaemon; +begin + RegisterDaemonClass(TDaemon_Main) +end; + +procedure RunHorse; +begin + // Need to set "HORSE_DAEMON" compilation directive + THorse.Listen(9000); +end; + +procedure Ping(Req: THorseRequest; Res: THorseResponse); +begin + Res.Send('pong'); +end; + +{$R *.lfm} + +procedure TDaemon_Main.DataModuleCreate(Sender: TObject); +begin + THorse.Get('ping', @Ping); +end; + +procedure TDaemon_Main.DataModuleShutDown(Sender: TCustomDaemon); +begin + THorse.StopListen; +end; + +procedure TDaemon_Main.DataModuleStart(Sender: TCustomDaemon; var OK: Boolean); +begin + TThread.CreateAnonymousThread(@RunHorse).Start; +end; + +initialization + RegisterDaemon; + +end. diff --git a/samples/lazarus/winsvc/daemonmanager.lfm b/samples/lazarus/winsvc/daemonmanager.lfm index 8cc730d..29a36e4 100644 --- a/samples/lazarus/winsvc/daemonmanager.lfm +++ b/samples/lazarus/winsvc/daemonmanager.lfm @@ -1,20 +1,20 @@ -object Daemon_Manager: TDaemon_Manager - DaemonDefs = < - item - DaemonClassName = 'TDaemon_Main' - Name = 'HorseService' - Description = 'Windows Service Horse' - DisplayName = 'WinSrvHorse' - Options = [doAllowStop, doAllowPause] - WinBindings.Dependencies = <> - WinBindings.StartType = stBoot - WinBindings.WaitHint = 0 - WinBindings.IDTag = 0 - WinBindings.ServiceType = stWin32 - WinBindings.ErrorSeverity = esIgnore - WinBindings.AcceptedCodes = [] - LogStatusReport = False - end> - Left = 1040 - Top = 129 -end +object Daemon_Manager: TDaemon_Manager + DaemonDefs = < + item + DaemonClassName = 'TDaemon_Main' + Name = 'HorseService' + Description = 'Windows Service Horse' + DisplayName = 'WinSrvHorse' + Options = [doAllowStop, doAllowPause] + WinBindings.Dependencies = <> + WinBindings.StartType = stBoot + WinBindings.WaitHint = 0 + WinBindings.IDTag = 0 + WinBindings.ServiceType = stWin32 + WinBindings.ErrorSeverity = esIgnore + WinBindings.AcceptedCodes = [] + LogStatusReport = False + end> + Left = 1040 + Top = 129 +end diff --git a/samples/lazarus/winsvc/daemonmanager.pas b/samples/lazarus/winsvc/daemonmanager.pas index 4e8fd65..c87b9b7 100644 --- a/samples/lazarus/winsvc/daemonmanager.pas +++ b/samples/lazarus/winsvc/daemonmanager.pas @@ -1,29 +1,29 @@ -unit DaemonManager; - -{$mode objfpc}{$H+} - -interface - -uses - Classes, SysUtils, DaemonApp; - -type - TDaemon_Manager = class(TDaemonMapper) - end; - -var - Daemon_Manager: TDaemon_Manager; - -implementation - -procedure RegisterMapper; -begin - RegisterDaemonMapper(TDaemon_Manager) -end; - -{$R *.lfm} - -initialization - RegisterMapper; - -end. +unit DaemonManager; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, DaemonApp; + +type + TDaemon_Manager = class(TDaemonMapper) + end; + +var + Daemon_Manager: TDaemon_Manager; + +implementation + +procedure RegisterMapper; +begin + RegisterDaemonMapper(TDaemon_Manager) +end; + +{$R *.lfm} + +initialization + RegisterMapper; + +end. diff --git a/src/Horse.Core.RouterTree.pas b/src/Horse.Core.RouterTree.pas index 8ec7d46..af74af5 100644 --- a/src/Horse.Core.RouterTree.pas +++ b/src/Horse.Core.RouterTree.pas @@ -1,343 +1,386 @@ -unit Horse.Core.RouterTree; - -{$IF DEFINED(FPC)} - {$MODE DELPHI}{$H+} -{$ENDIF} - -interface - -uses -{$IF DEFINED(FPC)} - Generics.Collections, - fpHTTP, - httpprotocol, - RegExpr, -{$ELSE} - Web.HTTPApp, - System.Generics.Collections, -{$ENDIF} - Horse.Request, - Horse.Response, - Horse.Callback, - Horse.Commons; - -type - PHorseRouterTree = ^THorseRouterTree; - - THorseRouterTree = class - strict private - FPrefix: string; - FIsInitialized: Boolean; - function GetQueuePath(APath: string; const AUsePrefix: Boolean = True): TQueue<string>; - function ForcePath(const APath: string): THorseRouterTree; - private - FPart: string; - FTag: string; - FIsParamsKey: Boolean; - FRouterRegex: string; - FIsRouterRegex: Boolean; - FMiddleware: TList<THorseCallback>; - FRegexedKeys: TList<string>; - FCallBack: TObjectDictionary<TMethodType, TList<THorseCallback>>; - FRoute: TObjectDictionary<string, THorseRouterTree>; - procedure RegisterInternal(const AHTTPType: TMethodType; var APath: TQueue<string>; const ACallback: THorseCallback); - procedure RegisterMiddlewareInternal(var APath: TQueue<string>; const AMiddleware: THorseCallback); - function ExecuteInternal(const APath: TQueue<string>; const AHTTPType: TMethodType; const ARequest: THorseRequest; const AResponse: THorseResponse; const AIsGroup: Boolean = False): Boolean; - function CallNextPath(var APath: TQueue<string>; const AHTTPType: TMethodType; const ARequest: THorseRequest; const AResponse: THorseResponse): Boolean; - function HasNext(const AMethod: TMethodType; const APaths: TArray<string>; AIndex: Integer = 0): Boolean; - public - function CreateRouter(const APath: string): THorseRouterTree; - function GetPrefix: string; - procedure Prefix(const APrefix: string); - procedure RegisterRoute(const AHTTPType: TMethodType; const APath: string; const ACallback: THorseCallback); - procedure RegisterMiddleware(const APath: string; const AMiddleware: THorseCallback); overload; - procedure RegisterMiddleware(const AMiddleware: THorseCallback); overload; - function Execute(const ARequest: THorseRequest; const AResponse: THorseResponse): Boolean; - constructor Create; - destructor Destroy; override; - end; - -implementation - -uses -{$IF DEFINED(FPC)} - SysUtils, -{$ELSE} - System.SysUtils, - System.RegularExpressions, -{$ENDIF} - Horse.Core.RouterTree.NextCaller; - -procedure THorseRouterTree.RegisterRoute(const AHTTPType: TMethodType; const APath: string; const ACallback: THorseCallback); -var - LPathChain: TQueue<string>; -begin - LPathChain := GetQueuePath(APath); - try - RegisterInternal(AHTTPType, LPathChain, ACallback); - finally - LPathChain.Free; - end; -end; - -function THorseRouterTree.CallNextPath(var APath: TQueue<string>; const AHTTPType: TMethodType; const ARequest: THorseRequest; - const AResponse: THorseResponse): Boolean; -var - LCurrent, LKey: string; - LAcceptable: THorseRouterTree; - LFound, LIsGroup: Boolean; - LPathOrigin: TQueue<string>; -begin - LIsGroup := False; - LPathOrigin := APath; - LCurrent := APath.Peek; - LFound := FRoute.TryGetValue(LCurrent, LAcceptable); - if (not LFound) then - begin - LFound := FRoute.TryGetValue(EmptyStr, LAcceptable); - if (LFound) then - APath := LPathOrigin; - LIsGroup := LFound; - end; - if (not LFound) and (FRegexedKeys.Count > 0) then - begin - for LKey in FRegexedKeys do - begin - FRoute.TryGetValue(LKey, LAcceptable); - if LAcceptable.HasNext(AHTTPType, APath.ToArray) then - begin - LFound := LAcceptable.ExecuteInternal(APath, AHTTPType, ARequest, AResponse); - Break; - end; - end; - end - else if LFound then - LFound := LAcceptable.ExecuteInternal(APath, AHTTPType, ARequest, AResponse, LIsGroup); - Result := LFound; -end; - -constructor THorseRouterTree.Create; -begin - FMiddleware := TList<THorseCallback>.Create; - FRoute := TObjectDictionary<string, THorseRouterTree>.Create([doOwnsValues]); - FRegexedKeys := TList<string>.Create; - FCallBack := TObjectDictionary < TMethodType, TList < THorseCallback >>.Create([doOwnsValues]); - FPrefix := ''; - FIsRouterRegex := False; -end; - -destructor THorseRouterTree.Destroy; -begin - FMiddleware.Free; - FreeAndNil(FRoute); - FRegexedKeys.Clear; - FRegexedKeys.Free; - FCallBack.Free; - inherited; -end; - -function THorseRouterTree.Execute(const ARequest: THorseRequest; const AResponse: THorseResponse): Boolean; -var - LPathInfo: string; - LQueue, LQueueNotFound: TQueue<string>; - LMethodType: TMethodType; -begin - LPathInfo := {$IF DEFINED(FPC)}ARequest.RawWebRequest.PathInfo{$ELSE}ARequest.RawWebRequest.RawPathInfo{$ENDIF}; - if LPathInfo.IsEmpty then - LPathInfo := '/'; - LQueue := GetQueuePath(LPathInfo, False); - try - LMethodType := {$IF DEFINED(FPC)} StringCommandToMethodType(ARequest.RawWebRequest.Method){$ELSE}ARequest.RawWebRequest.MethodType{$ENDIF}; - Result := ExecuteInternal(LQueue, LMethodType, ARequest, AResponse); - if not Result then - begin - LQueueNotFound := GetQueuePath('/*', False); - try - Result := ExecuteInternal(LQueueNotFound, LMethodType, ARequest, AResponse); - if Result and (AResponse.Status = THTTPStatus.MethodNotAllowed.ToInteger) then - AResponse.Send('Not Found').Status(THTTPStatus.NotFound); - finally - LQueueNotFound.Free; - end; - end; - finally - LQueue.Free; - end; -end; - -function THorseRouterTree.ExecuteInternal(const APath: TQueue<string>; const AHTTPType: TMethodType; const ARequest: THorseRequest; - const AResponse: THorseResponse; const AIsGroup: Boolean = False): Boolean; -var - LNextCaller: TNextCaller; - LFound: Boolean; -begin - LFound := False; - LNextCaller := TNextCaller.Create; - try - LNextCaller.SetCallback(FCallBack); - LNextCaller.SetPath(APath); - LNextCaller.SetHTTPType(AHTTPType); - LNextCaller.SetRequest(ARequest); - LNextCaller.SetResponse(AResponse); - LNextCaller.SetIsGroup(AIsGroup); - LNextCaller.SetMiddleware(FMiddleware); - LNextCaller.SetTag(FTag); - LNextCaller.SetIsParamsKey(FIsParamsKey); - LNextCaller.SetOnCallNextPath(CallNextPath); - LNextCaller.SetFound(LFound); - LNextCaller.Init; - LNextCaller.Next; - finally - LNextCaller.Free; - Result := LFound; - end; -end; - -function THorseRouterTree.ForcePath(const APath: string): THorseRouterTree; -begin - if not FRoute.TryGetValue(APath, Result) then - begin - Result := THorseRouterTree.Create; - FRoute.Add(APath, Result); - end; -end; - -function THorseRouterTree.CreateRouter(const APath: string): THorseRouterTree; -begin - Result := ForcePath(APath); -end; - -procedure THorseRouterTree.Prefix(const APrefix: string); -begin - FPrefix := '/' + APrefix.Trim(['/']); -end; - -function THorseRouterTree.GetPrefix: string; -begin - Result := FPrefix; -end; - -function THorseRouterTree.GetQueuePath(APath: string; const AUsePrefix: Boolean = True): TQueue<string>; -var - LPart: string; - LSplitedPath: TArray<string>; -begin - Result := TQueue<string>.Create; - if AUsePrefix then - if not APath.StartsWith('/') then - APath := (FPrefix + '/' + APath) - else - APath := (FPrefix + APath); - LSplitedPath := APath.Split(['/']); - for LPart in LSplitedPath do - begin - if (Result.Count > 0) and LPart.IsEmpty then - Continue; - Result.Enqueue(LPart); - end; -end; - -function THorseRouterTree.HasNext(const AMethod: TMethodType; const APaths: TArray<string>; AIndex: Integer = 0): Boolean; -var - LNext, LKey: string; - LNextRoute: THorseRouterTree; -begin - Result := False; - if (Length(APaths) <= AIndex) then - Exit(False); - if (Length(APaths) - 1 = AIndex) and ((APaths[AIndex] = FPart) or (FIsParamsKey)) then - Exit(FCallBack.ContainsKey(AMethod) or (AMethod = mtAny)); - -{$IFNDEF FPC} - if FIsRouterRegex then - begin - Result := TRegEx.IsMatch(APaths[AIndex], Format('^%s$', [FRouterRegex])); - Exit; - end; -{$ENDIF} - LNext := APaths[AIndex + 1]; - Inc(AIndex); - if FRoute.TryGetValue(LNext, LNextRoute) then - begin - Result := LNextRoute.HasNext(AMethod, APaths, AIndex); - end - else - begin - for LKey in FRegexedKeys do - begin - if FRoute.Items[LKey].HasNext(AMethod, APaths, AIndex) then - Exit(True); - end; - end; -end; - -procedure THorseRouterTree.RegisterInternal(const AHTTPType: TMethodType; var APath: TQueue<string>; const ACallback: THorseCallback); -var - LNextPart: string; - LCallbacks: TList<THorseCallback>; - LForceRouter: THorseRouterTree; -begin - if not FIsInitialized then - begin - FPart := APath.Dequeue; - - FIsParamsKey := FPart.StartsWith(':'); - FTag := FPart.Substring(1, Length(FPart) - 1); - - FIsRouterRegex := FPart.StartsWith('(') and FPart.EndsWith(')'); - FRouterRegex := FPart; - - FIsInitialized := True; - end - else - APath.Dequeue; - - if APath.Count = 0 then - begin - if not FCallBack.TryGetValue(AHTTPType, LCallbacks) then - begin - LCallbacks := TList<THorseCallback>.Create; - FCallBack.Add(AHTTPType, LCallbacks); - end; - LCallbacks.Add(ACallback) - end; - - if APath.Count > 0 then - begin - LNextPart := APath.Peek; - - LForceRouter := ForcePath(LNextPart); - - LForceRouter.RegisterInternal(AHTTPType, APath, ACallback); - if LForceRouter.FIsParamsKey or LForceRouter.FIsRouterRegex then - FRegexedKeys.Add(LNextPart); - end; -end; - -procedure THorseRouterTree.RegisterMiddleware(const AMiddleware: THorseCallback); -begin - FMiddleware.Add(AMiddleware); -end; - -procedure THorseRouterTree.RegisterMiddleware(const APath: string; const AMiddleware: THorseCallback); -var - LPathChain: TQueue<string>; -begin - LPathChain := GetQueuePath(APath); - try - RegisterMiddlewareInternal(LPathChain, AMiddleware); - finally - LPathChain.Free; - end; -end; - -procedure THorseRouterTree.RegisterMiddlewareInternal(var APath: TQueue<string>; const AMiddleware: THorseCallback); -begin - APath.Dequeue; - if APath.Count = 0 then - FMiddleware.Add(AMiddleware) - else - ForcePath(APath.Peek).RegisterMiddlewareInternal(APath, AMiddleware); -end; - -end. +unit Horse.Core.RouterTree; + +{$IF DEFINED(FPC)} + {$MODE DELPHI}{$H+} +{$ENDIF} + +interface + +uses +{$IF DEFINED(FPC)} + Generics.Collections, + fpHTTP, + httpprotocol, + RegExpr, +{$ELSE} + Web.HTTPApp, + System.Generics.Collections, +{$ENDIF} + Horse.Request, + Horse.Response, + Horse.Callback, + Horse.Commons; + +type + PHorseRouterTree = ^THorseRouterTree; + + THorseRouterTree = class + strict private + FPrefix: string; + FIsInitialized: Boolean; + function GetQueuePath(APath: string; const AUsePrefix: Boolean = True): TQueue<string>; + function ForcePath(const APath: string): THorseRouterTree; + private + FPart: string; + FTag: string; + FIsParamsKey: Boolean; + FRouterRegex: string; + FIsRouterRegex: Boolean; + FMiddleware: TList<THorseCallback>; + FRegexedKeys: TList<string>; + FCallBack: TObjectDictionary<TMethodType, TList<THorseCallback>>; + FRoute: TObjectDictionary<string, THorseRouterTree>; + procedure RegisterInternal(const AHTTPType: TMethodType; var APath: TQueue<string>; const ACallback: THorseCallback); + procedure RegisterMiddlewareInternal(var APath: TQueue<string>; const AMiddleware: THorseCallback); + function ExecuteInternal(const APath: TQueue<string>; const AHTTPType: TMethodType; const ARequest: THorseRequest; const AResponse: THorseResponse; const AIsGroup: Boolean = False): Boolean; + function CallNextPath(var APath: TQueue<string>; const AHTTPType: TMethodType; const ARequest: THorseRequest; const AResponse: THorseResponse): Boolean; + function HasNext(const AMethod: TMethodType; const APaths: TArray<string>; AIndex: Integer = 0): Boolean; + public + function CreateRouter(const APath: string): THorseRouterTree; + function GetPrefix: string; + procedure Prefix(const APrefix: string); + procedure RegisterRoute(const AHTTPType: TMethodType; const APath: string; const ACallback: THorseCallback); + procedure RegisterMiddleware(const APath: string; const AMiddleware: THorseCallback); overload; + procedure RegisterMiddleware(const AMiddleware: THorseCallback); overload; + function Execute(const ARequest: THorseRequest; const AResponse: THorseResponse): Boolean; + constructor Create; + destructor Destroy; override; + end; + +implementation + +uses +{$IF DEFINED(FPC)} + SysUtils, +{$ELSE} + System.SysUtils, + System.RegularExpressions, +{$ENDIF} + Horse.Core.RouterTree.NextCaller; + +procedure THorseRouterTree.RegisterRoute(const AHTTPType: TMethodType; const APath: string; const ACallback: THorseCallback); +var + LPathChain: TQueue<string>; +begin + LPathChain := GetQueuePath(APath); + try + RegisterInternal(AHTTPType, LPathChain, ACallback); + finally + LPathChain.Free; + end; +end; + +function THorseRouterTree.CallNextPath(var APath: TQueue<string>; const AHTTPType: TMethodType; const ARequest: THorseRequest; + const AResponse: THorseResponse): Boolean; +var + LCurrent, LKey: string; + LAcceptable: THorseRouterTree; + LFound, LIsGroup: Boolean; + LPathOrigin: TQueue<string>; +begin + LIsGroup := False; + LPathOrigin := APath; + LCurrent := APath.Peek; + LFound := FRoute.TryGetValue(LCurrent, LAcceptable); + if (not LFound) then + begin + LFound := FRoute.TryGetValue(EmptyStr, LAcceptable); + if (LFound) then + APath := LPathOrigin; + LIsGroup := LFound; + end; + if (not LFound) and (FRegexedKeys.Count > 0) then + begin + for LKey in FRegexedKeys do + begin + FRoute.TryGetValue(LKey, LAcceptable); + if LAcceptable.HasNext(AHTTPType, APath.ToArray) then + begin + LFound := LAcceptable.ExecuteInternal(APath, AHTTPType, ARequest, AResponse); + Break; + end; + end; + end + else if LFound then + LFound := LAcceptable.ExecuteInternal(APath, AHTTPType, ARequest, AResponse, LIsGroup); + Result := LFound; +end; + +constructor THorseRouterTree.Create; +begin + FMiddleware := TList<THorseCallback>.Create; + FRoute := TObjectDictionary<string, THorseRouterTree>.Create([doOwnsValues]); + FRegexedKeys := TList<string>.Create; + FCallBack := TObjectDictionary < TMethodType, TList < THorseCallback >>.Create([doOwnsValues]); + FPrefix := ''; + FIsRouterRegex := False; +end; + +destructor THorseRouterTree.Destroy; +begin + FMiddleware.Free; + FreeAndNil(FRoute); + FRegexedKeys.Clear; + FRegexedKeys.Free; + FCallBack.Free; + inherited; +end; + +function THorseRouterTree.Execute(const ARequest: THorseRequest; const AResponse: THorseResponse): Boolean; +var + LPathInfo: string; + LQueue, LQueueNotFound: TQueue<string>; + LMethodType: TMethodType; +{ PATCH-TREE-1: LRawWebRequest stores the result of ARequest.RawWebRequest so + we can pass it to Assigned(). Assigned() requires a variable — it cannot + accept a function-call expression (dcc32 E2036 "Variable required"). } + LRawWebRequest: {$IF DEFINED(FPC)}TRequest{$ELSE}TWebRequest{$ENDIF}; +begin +{ =========================================================================== + PATCH-TREE-1 — nil-guard for the CrossSocket path. + + The original code accessed ARequest.RawWebRequest directly: + Delphi/Indy: ARequest.RawWebRequest.RawPathInfo + ARequest.RawWebRequest.MethodType + FPC/Indy: ARequest.RawWebRequest.PathInfo + StringCommandToMethodType(ARequest.RawWebRequest.Method) + + On the CrossSocket path FWebRequest is always nil (no TWebRequest is ever + created), so those direct accesses raise an Access Violation on every request. + + Fix strategy: store RawWebRequest in a local variable, test it once, branch. + + Indy path (LRawWebRequest <> nil): + Use the EXACT original expressions for both compilers — zero behaviour + change for any existing Indy/FPC user. The upstream code is reproduced + verbatim inside the else branch, now referencing the local variable. + + CrossSocket path (LRawWebRequest = nil): + Use the nil-guarded accessors on THorseRequest: + ARequest.RawPathInfo (PATCH-REQ-5) — returns FCSPathInfo shadow field + ARequest.MethodType (PATCH-REQ-3) — returns FCSMethodType shadow field + Both fields are populated by TRequestBridge.Populate before the pipeline + is entered, so they are always valid at this point. + =========================================================================== } + LRawWebRequest := ARequest.RawWebRequest; + if not Assigned(LRawWebRequest) then + begin + // CrossSocket path: shadow fields set by TRequestBridge.Populate + LPathInfo := ARequest.RawPathInfo; + LMethodType := ARequest.MethodType; + end + else + begin + // Indy path: original upstream expressions — not changed from HashLoad/horse + LPathInfo := {$IF DEFINED(FPC)}LRawWebRequest.PathInfo + {$ELSE}LRawWebRequest.RawPathInfo{$ENDIF}; + LMethodType := {$IF DEFINED(FPC)}StringCommandToMethodType(LRawWebRequest.Method) + {$ELSE}LRawWebRequest.MethodType{$ENDIF}; + end; + if LPathInfo.IsEmpty then + LPathInfo := '/'; + LQueue := GetQueuePath(LPathInfo, False); + try + Result := ExecuteInternal(LQueue, LMethodType, ARequest, AResponse); + if not Result then + begin + LQueueNotFound := GetQueuePath('/*', False); + try + Result := ExecuteInternal(LQueueNotFound, LMethodType, ARequest, AResponse); + if Result and (AResponse.Status = THTTPStatus.MethodNotAllowed.ToInteger) then + AResponse.Send('Not Found').Status(THTTPStatus.NotFound); + finally + LQueueNotFound.Free; + end; + end; + finally + LQueue.Free; + end; +end; + +function THorseRouterTree.ExecuteInternal(const APath: TQueue<string>; const AHTTPType: TMethodType; const ARequest: THorseRequest; + const AResponse: THorseResponse; const AIsGroup: Boolean = False): Boolean; +var + LNextCaller: TNextCaller; + LFound: Boolean; +begin + LFound := False; + LNextCaller := TNextCaller.Create; + try + LNextCaller.SetCallback(FCallBack); + LNextCaller.SetPath(APath); + LNextCaller.SetHTTPType(AHTTPType); + LNextCaller.SetRequest(ARequest); + LNextCaller.SetResponse(AResponse); + LNextCaller.SetIsGroup(AIsGroup); + LNextCaller.SetMiddleware(FMiddleware); + LNextCaller.SetTag(FTag); + LNextCaller.SetIsParamsKey(FIsParamsKey); + LNextCaller.SetOnCallNextPath(CallNextPath); + LNextCaller.SetFound(LFound); + LNextCaller.Init; + LNextCaller.Next; + finally + LNextCaller.Free; + Result := LFound; + end; +end; + +function THorseRouterTree.ForcePath(const APath: string): THorseRouterTree; +begin + if not FRoute.TryGetValue(APath, Result) then + begin + Result := THorseRouterTree.Create; + FRoute.Add(APath, Result); + end; +end; + +function THorseRouterTree.CreateRouter(const APath: string): THorseRouterTree; +begin + Result := ForcePath(APath); +end; + +procedure THorseRouterTree.Prefix(const APrefix: string); +begin + FPrefix := '/' + APrefix.Trim(['/']); +end; + +function THorseRouterTree.GetPrefix: string; +begin + Result := FPrefix; +end; + +function THorseRouterTree.GetQueuePath(APath: string; const AUsePrefix: Boolean = True): TQueue<string>; +var + LPart: string; + LSplitedPath: TArray<string>; +begin + Result := TQueue<string>.Create; + if AUsePrefix then + if not APath.StartsWith('/') then + APath := (FPrefix + '/' + APath) + else + APath := (FPrefix + APath); + LSplitedPath := APath.Split(['/']); + for LPart in LSplitedPath do + begin + if (Result.Count > 0) and LPart.IsEmpty then + Continue; + Result.Enqueue(LPart); + end; +end; + +function THorseRouterTree.HasNext(const AMethod: TMethodType; const APaths: TArray<string>; AIndex: Integer = 0): Boolean; +var + LNext, LKey: string; + LNextRoute: THorseRouterTree; +begin + Result := False; + if (Length(APaths) <= AIndex) then + Exit(False); + if (Length(APaths) - 1 = AIndex) and ((APaths[AIndex] = FPart) or (FIsParamsKey)) then + Exit(FCallBack.ContainsKey(AMethod) or (AMethod = mtAny)); + +{$IFNDEF FPC} + if FIsRouterRegex then + begin + Result := TRegEx.IsMatch(APaths[AIndex], Format('^%s$', [FRouterRegex])); + Exit; + end; +{$ENDIF} + LNext := APaths[AIndex + 1]; + Inc(AIndex); + if FRoute.TryGetValue(LNext, LNextRoute) then + begin + Result := LNextRoute.HasNext(AMethod, APaths, AIndex); + end + else + begin + for LKey in FRegexedKeys do + begin + if FRoute.Items[LKey].HasNext(AMethod, APaths, AIndex) then + Exit(True); + end; + end; +end; + +procedure THorseRouterTree.RegisterInternal(const AHTTPType: TMethodType; var APath: TQueue<string>; const ACallback: THorseCallback); +var + LNextPart: string; + LCallbacks: TList<THorseCallback>; + LForceRouter: THorseRouterTree; +begin + if not FIsInitialized then + begin + FPart := APath.Dequeue; + + FIsParamsKey := FPart.StartsWith(':'); + FTag := FPart.Substring(1, Length(FPart) - 1); + + FIsRouterRegex := FPart.StartsWith('(') and FPart.EndsWith(')'); + FRouterRegex := FPart; + + FIsInitialized := True; + end + else + APath.Dequeue; + + if APath.Count = 0 then + begin + if not FCallBack.TryGetValue(AHTTPType, LCallbacks) then + begin + LCallbacks := TList<THorseCallback>.Create; + FCallBack.Add(AHTTPType, LCallbacks); + end; + LCallbacks.Add(ACallback) + end; + + if APath.Count > 0 then + begin + LNextPart := APath.Peek; + + LForceRouter := ForcePath(LNextPart); + + LForceRouter.RegisterInternal(AHTTPType, APath, ACallback); + if LForceRouter.FIsParamsKey or LForceRouter.FIsRouterRegex then + FRegexedKeys.Add(LNextPart); + end; +end; + +procedure THorseRouterTree.RegisterMiddleware(const AMiddleware: THorseCallback); +begin + FMiddleware.Add(AMiddleware); +end; + +procedure THorseRouterTree.RegisterMiddleware(const APath: string; const AMiddleware: THorseCallback); +var + LPathChain: TQueue<string>; +begin + LPathChain := GetQueuePath(APath); + try + RegisterMiddlewareInternal(LPathChain, AMiddleware); + finally + LPathChain.Free; + end; +end; + +procedure THorseRouterTree.RegisterMiddlewareInternal(var APath: TQueue<string>; const AMiddleware: THorseCallback); +begin + APath.Dequeue; + if APath.Count = 0 then + FMiddleware.Add(AMiddleware) + else + ForcePath(APath.Peek).RegisterMiddlewareInternal(APath, AMiddleware); +end; + +end. diff --git a/src/Horse.Exception.pas b/src/Horse.Exception.pas index 37260bc..d22ceb9 100644 --- a/src/Horse.Exception.pas +++ b/src/Horse.Exception.pas @@ -1,201 +1,250 @@ -unit Horse.Exception; - -{$IF DEFINED(FPC)} - {$MODE DELPHI}{$H+} -{$ENDIF} - -interface - -uses -{$IF DEFINED(FPC)} - SysUtils, - fpjson, - jsonparser, -{$ELSE} - System.SysUtils, - System.JSON, -{$ENDIF} - Horse.Commons; - -type - EHorseException = class(Exception) - strict private - FError: string; - FStatus: THTTPStatus; - FType: TMessageType; - FTitle: string; - FCode: Integer; - FHint: string; - FUnit: string; - FDetail: string; - public - constructor Create; reintroduce; - function Error(const AValue: string): EHorseException; overload; - function Error: string; overload; - function Status(const AValue: THTTPStatus): EHorseException; overload; - function Status: THTTPStatus; overload; - function &Type(const AValue: TMessageType): EHorseException; overload; - function &Type: TMessageType; overload; - function Title(const AValue: string): EHorseException; overload; - function Title: string; overload; - function Code(const AValue: Integer): EHorseException; overload; - function Code: Integer; overload; - function Hint(const AValue: string): EHorseException; overload; - function Hint: string; overload; - function &Unit(const AValue: string): EHorseException; overload; - function &Unit: string; overload; - function Detail(const AValue: string): EHorseException; overload; - function Detail: string; overload; - function ToJSON: string; virtual; - function ToJSONObject: TJSONObject; virtual; - class function New: EHorseException; - end; - -implementation - -uses -{$IF DEFINED(FPC)} - TypInfo; -{$ELSE} - System.TypInfo; -{$ENDIF} - -constructor EHorseException.Create; -begin - FError := EmptyStr; - FStatus := THTTPStatus.InternalServerError; - FCode := 0; -end; - -class function EHorseException.New: EHorseException; -begin - Result := EHorseException.Create; -end; - -function EHorseException.Code(const AValue: Integer): EHorseException; -begin - FCode := AValue; - Result := Self; -end; - -function EHorseException.&Type: TMessageType; -begin - Result := FType; -end; - -function EHorseException.&Type(const AValue: TMessageType): EHorseException; -begin - FType := AValue; - Result := Self; -end; - -function EHorseException.Code: Integer; -begin - Result := FCode; -end; - -function EHorseException.&Unit: string; -begin - Result := FUnit; -end; - -function EHorseException.&Unit(const AValue: string): EHorseException; -begin - FUnit := AValue; - Result := Self; -end; - -function EHorseException.Detail: string; -begin - Result := FDetail; -end; - -function EHorseException.Detail(const AValue: string): EHorseException; -begin - FDetail := AValue; - Result := Self; -end; - -function EHorseException.Error: string; -begin - Result := FError; -end; - -function EHorseException.Error(const AValue: string): EHorseException; -begin - FError := AValue; - Self.Message := AValue; - Result := Self; -end; - -function EHorseException.Status: THTTPStatus; -begin - Result := FStatus; -end; - -function EHorseException.Status(const AValue: THTTPStatus): EHorseException; -begin - FStatus := AValue; - Result := Self; -end; - -function EHorseException.Title(const AValue: string): EHorseException; -begin - FTitle := AValue; - Result := Self; -end; - -function EHorseException.Title: string; -begin - Result := FTitle; -end; - -function EHorseException.Hint(const AValue: string): EHorseException; -begin - FHint := AValue; - Result := Self; -end; - -function EHorseException.Hint: string; -begin - Result := FHint; -end; - -function EHorseException.ToJSON: string; -var - LJSON: TJSONObject; -begin - LJSON := ToJSONObject; - try - Result := {$IF DEFINED(FPC)}LJSON.AsJSON{$ELSE}{$IF CompilerVersion > 27.0}LJSON.ToJSON{$ELSE}LJSON.ToString{$ENDIF}{$ENDIF}; - finally - LJSON.Free; - end; -end; - -function EHorseException.ToJSONObject: TJsonObject; -begin - Result := TJSONObject.Create; - - if FType <> TMessageType.Default then - Result.{$IF DEFINED(FPC)}Add{$ELSE}AddPair{$ENDIF}('type', GetEnumName(TypeInfo(TMessageType), Integer(FType))); - - if not FTitle.Trim.IsEmpty then - Result.{$IF DEFINED(FPC)}Add{$ELSE}AddPair{$ENDIF}('title', FTitle); - - if FCode <> 0 then - Result.{$IF DEFINED(FPC)}Add{$ELSE}AddPair{$ENDIF}('code', {$IF DEFINED(FPC)}TJSONIntegerNumber{$ELSE}TJSONNumber{$ENDIF}.Create(FCode)); - - Result.{$IF DEFINED(FPC)}Add{$ELSE}AddPair{$ENDIF}('error', FError); - - if not FHint.Trim.IsEmpty then - Result.{$IF DEFINED(FPC)}Add{$ELSE}AddPair{$ENDIF}('hint', FHint); - - if not FUnit.Trim.IsEmpty then - Result.{$IF DEFINED(FPC)}Add{$ELSE}AddPair{$ENDIF}('unit', FUnit); - - if not FDetail.Trim.IsEmpty then - Result.{$IF DEFINED(FPC)}Add{$ELSE}AddPair{$ENDIF}('detail', FDetail); -end; - -end. +unit Horse.Exception; + +{$IF DEFINED(FPC)} + {$MODE DELPHI}{$H+} +{$ENDIF} + +interface + +uses +{$IF DEFINED(FPC)} + SysUtils, + fpjson, + jsonparser, + Generics.Collections, +{$ELSE} + System.SysUtils, + System.JSON, + System.Generics.Collections, +{$ENDIF} + Horse.Commons; + +type + TStringDictionary = TDictionary<String, String>; + + EHorseException = class(Exception) + strict private + FError: string; + FStatus: THTTPStatus; + FType: TMessageType; + FTitle: string; + FCode: Integer; + FHint: string; + FUnit: string; + FDetail: string; + FCustomFields: TStringDictionary; + public + constructor Create; reintroduce; + function Error(const AValue: string): EHorseException; overload; + function Error: string; overload; + function Status(const AValue: THTTPStatus): EHorseException; overload; + function Status: THTTPStatus; overload; + function &Type(const AValue: TMessageType): EHorseException; overload; + function &Type: TMessageType; overload; + function Title(const AValue: string): EHorseException; overload; + function Title: string; overload; + function Code(const AValue: Integer): EHorseException; overload; + function Code: Integer; overload; + function Hint(const AValue: string): EHorseException; overload; + function Hint: string; overload; + function &Unit(const AValue: string): EHorseException; overload; + function &Unit: string; overload; + function Detail(const AValue: string): EHorseException; overload; + function Detail: string; overload; +{$IF DEFINED(FPC)} + function Custom(const AKey: String; AValue: String): EHorseException; overload; +{$ELSE} + function Custom<V>(const AKey: String; AValue: V): EHorseException; overload; +{$ENDIF} + function ToJSON: string; virtual; + function ToJSONObject: TJSONObject; virtual; + destructor Destroy(); override; + class function New: EHorseException; + end; + +implementation + +uses +{$IF DEFINED(FPC)} + TypInfo; +{$ELSE} + System.TypInfo, + System.Rtti; +{$ENDIF} + +constructor EHorseException.Create; +begin + FError := EmptyStr; + FStatus := THTTPStatus.InternalServerError; + FCustomFields := nil; + FCode := 0; +end; + +{$IF DEFINED(FPC)} +function EHorseException.Custom(const AKey: String; AValue: String): EHorseException; +begin + if FCustomFields = nil then + FCustomFields := TDictionary<String, String>.Create(); + + FCustomFields.AddOrSetValue(AKey, AValue); + Result := Self; +end; +{$ELSE} +function EHorseException.Custom<V>(const AKey: String; AValue: V): EHorseException; +begin + if FCustomFields = nil then + FCustomFields := TDictionary<String, String>.Create(); + + FCustomFields.AddOrSetValue(AKey, TValue.From<V>(AValue).ToString()); + Result := Self; +end; +{$ENDIF} + +class function EHorseException.New: EHorseException; +begin + Result := EHorseException.Create; +end; + +function EHorseException.Code(const AValue: Integer): EHorseException; +begin + FCode := AValue; + Result := Self; +end; + +function EHorseException.&Type: TMessageType; +begin + Result := FType; +end; + +function EHorseException.&Type(const AValue: TMessageType): EHorseException; +begin + FType := AValue; + Result := Self; +end; + +function EHorseException.Code: Integer; +begin + Result := FCode; +end; + +function EHorseException.&Unit: string; +begin + Result := FUnit; +end; + +function EHorseException.&Unit(const AValue: string): EHorseException; +begin + FUnit := AValue; + Result := Self; +end; + +function EHorseException.Detail: string; +begin + Result := FDetail; +end; + +function EHorseException.Detail(const AValue: string): EHorseException; +begin + FDetail := AValue; + Result := Self; +end; + +function EHorseException.Error: string; +begin + Result := FError; +end; + +function EHorseException.Error(const AValue: string): EHorseException; +begin + FError := AValue; + Self.Message := AValue; + Result := Self; +end; + +function EHorseException.Status: THTTPStatus; +begin + Result := FStatus; +end; + +function EHorseException.Status(const AValue: THTTPStatus): EHorseException; +begin + FStatus := AValue; + Result := Self; +end; + +function EHorseException.Title(const AValue: string): EHorseException; +begin + FTitle := AValue; + Result := Self; +end; + +function EHorseException.Title: string; +begin + Result := FTitle; +end; + +function EHorseException.Hint(const AValue: string): EHorseException; +begin + FHint := AValue; + Result := Self; +end; + +function EHorseException.Hint: string; +begin + Result := FHint; +end; + +function EHorseException.ToJSON: string; +var + LJSON: TJSONObject; +begin + LJSON := ToJSONObject; + try + Result := {$IF DEFINED(FPC)}LJSON.AsJSON{$ELSE}{$IF CompilerVersion > 27.0}LJSON.ToJSON{$ELSE}LJSON.ToString{$ENDIF}{$ENDIF}; + finally + LJSON.Free; + end; +end; + +function EHorseException.ToJSONObject: TJsonObject; +var + FieldEntry: TPair<string, string>; +begin + Result := TJSONObject.Create; + + if FType <> TMessageType.Default then + Result.{$IF DEFINED(FPC)}Add{$ELSE}AddPair{$ENDIF}('type', GetEnumName(TypeInfo(TMessageType), Integer(FType))); + + if not FTitle.Trim.IsEmpty then + Result.{$IF DEFINED(FPC)}Add{$ELSE}AddPair{$ENDIF}('title', FTitle); + + if FCode <> 0 then + Result.{$IF DEFINED(FPC)}Add{$ELSE}AddPair{$ENDIF}('code', {$IF DEFINED(FPC)}TJSONIntegerNumber{$ELSE}TJSONNumber{$ENDIF}.Create(FCode)); + + Result.{$IF DEFINED(FPC)}Add{$ELSE}AddPair{$ENDIF}('error', FError); + + if not FHint.Trim.IsEmpty then + Result.{$IF DEFINED(FPC)}Add{$ELSE}AddPair{$ENDIF}('hint', FHint); + + if not FUnit.Trim.IsEmpty then + Result.{$IF DEFINED(FPC)}Add{$ELSE}AddPair{$ENDIF}('unit', FUnit); + + if not FDetail.Trim.IsEmpty then + Result.{$IF DEFINED(FPC)}Add{$ELSE}AddPair{$ENDIF}('detail', FDetail); + + if FCustomFields <> nil then + begin + for FieldEntry in FCustomFields do + Result.{$IF DEFINED(FPC)}Add{$ELSE}AddPair{$ENDIF}(FieldEntry.Key, FieldEntry.Value); + end; + +end; + +destructor EHorseException.Destroy; +begin + if FCustomFields <> nil then + FCustomFields.Free(); + inherited; +end; + +end. diff --git a/src/Horse.Provider.Abstract.pas b/src/Horse.Provider.Abstract.pas index 30f5017..f2bb076 100644 --- a/src/Horse.Provider.Abstract.pas +++ b/src/Horse.Provider.Abstract.pas @@ -1,4 +1,4 @@ -unit Horse.Provider.Abstract; +unit Horse.Provider.Abstract; {$IF DEFINED(FPC)} {$MODE DELPHI}{$H+} @@ -13,13 +13,25 @@ interface {$ELSE} System.SysUtils, {$ENDIF} - Horse.Core; + Horse.Core, +{ =========================================================================== + PATCH-ABS-1 — added unit Horse.Provider.Config + =========================================================================== } + Horse.Provider.Config, +{ =========================================================================== } + Horse.Request, + Horse.Response; type THorseProviderAbstract = class(THorseCore) private class var FOnListen: TProc; class var FOnStopListen: TProc; + // NOTE: FPort is intentionally NOT declared here. + // Each concrete provider owns its own FPort class var so there is no + // ambiguity between the Console provider's FPort and the CrossSocket + // provider's FPort. Sharing a single FPort in the abstract base caused + // silent port-not-changing bugs when both providers were compiled. class function GetOnStopListen: TProc; static; protected class function GetOnListen: TProc; static; @@ -32,6 +44,24 @@ THorseProviderAbstract = class(THorseCore) class property OnStopListen: TProc read GetOnStopListen write SetOnStopListen; class procedure Listen; virtual; abstract; class procedure StopListen; virtual; +{ =========================================================================== + PATCH-ABS-2 — added ListenWithConfig virtual class method + =========================================================================== } + class procedure ListenWithConfig(const APort: Integer; + const AConfig: THorseCrossSocketConfig); virtual; +{ =========================================================================== } +{ =========================================================================== + PATCH-ABS-3 — Execute class method + Runs the Horse middleware/route pipeline for a given request+response pair. + Providers that bypass TWebRequest (CrossSocket, raw socket, etc.) call this + after populating THorseRequest via the request bridge. + Implementation: THorseCore.Routes.Execute(Req, Res, nil) + =========================================================================== } + class procedure Execute( + const ARequest: THorseRequest; + const AResponse: THorseResponse + ); virtual; +{ =========================================================================== } end; implementation @@ -73,4 +103,35 @@ class procedure THorseProviderAbstract.StopListen; raise Exception.Create('StopListen not implemented'); end; +{ =========================================================================== + PATCH-ABS-2 — implementation of ListenWithConfig + Default fallback for providers that do not use THorseCrossSocketConfig. + Sets nothing (no shared FPort here) and delegates to the no-arg Listen. + AConfig is intentionally ignored — non-CrossSocket providers have no use + for it. CrossSocket overrides this completely. + =========================================================================== } +class procedure THorseProviderAbstract.ListenWithConfig(const APort: Integer; + const AConfig: THorseCrossSocketConfig); +begin + Listen; +end; +{ =========================================================================== } + +{ =========================================================================== + PATCH-ABS-3 — Execute: runs the Horse middleware+route pipeline. + THorseRouterTree.Execute(Req, Res, Next) walks all registered middleware and + the matching route handler. Passing nil for Next means the pipeline ends + naturally when all handlers have run (EHorseCallbackInterrupted is raised + internally by Horse when a middleware calls Next with no further handlers — + this is normal and is caught by the provider's exception handler). + =========================================================================== } +class procedure THorseProviderAbstract.Execute( + const ARequest: THorseRequest; + const AResponse: THorseResponse +); +begin + Routes.Execute(ARequest, AResponse); +end; +{ =========================================================================== } + end. diff --git a/src/Horse.Provider.Config.pas b/src/Horse.Provider.Config.pas new file mode 100644 index 0000000..66361a8 --- /dev/null +++ b/src/Horse.Provider.Config.pas @@ -0,0 +1,176 @@ +unit Horse.Provider.Config; + +// ============================================================================= +// Horse.Provider.Config — NEW FILE (Horse fork for CrossSocket provider) +// ============================================================================= +// Upstream: https://github.com/HashLoad/horse (tag 3.1.9) +// Fork: https://github.com/your-org/horse +// +// Purpose +// ------- +// Holds THorseCrossSocketConfig so it can be used by BOTH: +// • Horse.Provider.Abstract.pas (declares ListenWithConfig parameter type) +// • Horse.Provider.CrossSocket.Server.pas (implements the config) +// +// Without this unit, one of those two files would have to use the other, +// creating a circular dependency the Delphi compiler cannot resolve. +// +// This file has NO dependencies on either Horse.Provider.Abstract or +// Horse.Provider.CrossSocket — it is a pure data unit. +// +// The identical record is also declared in Horse.Provider.CrossSocket.Server +// in the provider repository, which re-exports it for backward compatibility. +// When both units are in the search path the compiler will find this canonical +// version first (provider places its src/ after horse/src/). +// ============================================================================= + +{$IF DEFINED(FPC)} + {$MODE DELPHI}{$H+} +{$ENDIF} + +interface + +const + // [SEC-1] Safe defaults + DEFAULT_MAX_HEADER_SIZE = 8192; // 8 KB — matches nginx default + DEFAULT_MAX_BODY_SIZE = 4 * 1024 * 1024; // 4 MB + DEFAULT_IO_THREADS = 0; // 0 = library picks (CPU count) + // [SEC-6] + DEFAULT_DRAIN_TIMEOUT_MS = 5000; // ms + // Compression + DEFAULT_MIN_COMPRESS_SIZE = 512; // bytes — matches CrossSocket MIN_COMPRESS_SIZE + + +type + THorseCrossSocketConfig = record + + // IO model + IoThreads: Integer; // [SEC-2] 0 = library default (recommended) + + // ── Timeouts ───────────────────────────────────────────────────────── + KeepAliveTimeout: Integer; + // seconds; 0 = disable keep-alive entirely. + // Default: 30 + // NOTE: CrossSocket does not currently expose a KeepAlive timeout + // property. This field is reserved for future use. + + ReadTimeout: Integer; + // seconds; enforced by CrossSocket at the socket layer. + // Mitigates slow-HTTP (Slowloris) attacks. + // Default: 20 — never leave at 0 (would be unlimited). + // NOTE: CrossSocket does not currently expose a ReadTimeout property. + // This field is reserved for future use. + + DrainTimeoutMs: Integer; + // milliseconds to wait for in-flight requests to complete when + // THorseCrossSocketServer.Stop is called. After this timeout the + // server proceeds with shutdown regardless. + // Default: 5000 + + // ── Request size limits ─────────────────────────────────────────────── + // Size limits [SEC-1] + MaxHeaderSize: Integer; + // Maximum size of all request headers combined, in bytes. + // Matches the nginx default. + // Default: 8192 (8 KB) + + // Size limits [SEC-1] + MaxBodySize: Int64; + // Maximum request body size in bytes. CrossSocket rejects bodies + // larger than this with 413 before the Horse pipeline is entered. + // Default: 4194304 (4 MB) + + // ── Connection ceiling ──────────────────────────────────────────────── + MaxConnections: Integer; + // Maximum number of simultaneous open connections. + // Prevents file-descriptor exhaustion under a connection-flood DoS. + // Default: 10000 + // NOTE: CrossSocket does not currently expose a MaxConnections property. + // This field is reserved for future use. + + // ── Compression ─────────────────────────────────────────────────────── + Compressible: Boolean; + // When True, CrossSocket will gzip-compress responses whose Content-Type + // is compressible and whose body exceeds MinCompressSize bytes. + // Mapped directly to TCrossHttpServer.Compressible. + // Default: False + + MinCompressSize: Int64; + // Minimum response body size (bytes) below which compression is skipped. + // Mapped directly to TCrossHttpServer.MinCompressSize. + // Default: 512 (matches CrossSocket's internal MIN_COMPRESS_SIZE) + + // ── TLS / SSL ───────────────────────────────────────────────────────── + + // SSL / TLS [SEC-3] + // SSL is enabled by passing SSLEnabled=True at construction. + // Certificates are loaded via SetCertificateFile / SetPrivateKeyFile + // on the TCrossSslSocketBase API — confirmed in Net.CrossSslSocket.Base. + SSLEnabled: Boolean; + // Set True to listen on HTTPS. Requires SSLCertFile and SSLKeyFile. + // Default: False + + SSLCertFile: string; + // Absolute or relative path to the PEM certificate file. + + SSLKeyFile: string; + // Absolute or relative path to the PEM private key file. + + SSLKeyPassword: string; + // Passphrase for an encrypted private key. Leave empty if unencrypted. + // NOTE: CrossSocket does not currently expose a key-password API. + // This field is reserved for future use. + + SSLCACertFile: string; + // Path to the CA certificate used to verify client certificates. + // Required only for mutual TLS (mTLS). Leave empty for server-only TLS. + + SSLVerifyPeer: Boolean; + // When True, CrossSocket requires the client to present a certificate + // signed by the CA in SSLCACertFile. Only meaningful when SSLEnabled + // and SSLCACertFile are both set. + // Default: False + + SSLCipherList: string; + // OpenSSL cipher-list string (TLS 1.2 format). Empty = use CrossSocket's + // built-in secure list (Node.js-derived, ECDHE/DHE + AES-GCM/ChaCha20). + // Override only when you have a specific compliance requirement. + // Applied via SSL_CTX_set_cipher_list on the OpenSSL context. + + // ── Server identity ─────────────────────────────────────────────────── + ServerBanner: string; + // Value to emit in the HTTP Server: response header. + // Empty string emits 'unknown' to prevent library/version fingerprinting. + // Default: '' (results in 'unknown') + + // ── Factory ─────────────────────────────────────────────────────────── + class function Default: THorseCrossSocketConfig; static; + end; + +implementation + +class function THorseCrossSocketConfig.Default: THorseCrossSocketConfig; +begin + Result.IoThreads := DEFAULT_IO_THREADS; + + Result.KeepAliveTimeout := 30; + Result.ReadTimeout := 20; + Result.DrainTimeoutMs := DEFAULT_DRAIN_TIMEOUT_MS; // [SEC-6] + Result.MaxHeaderSize := DEFAULT_MAX_HEADER_SIZE; // [SEC-1] + Result.MaxBodySize := DEFAULT_MAX_BODY_SIZE; // [SEC-1] + Result.MaxConnections := 10000; + + Result.Compressible := False; + Result.MinCompressSize := DEFAULT_MIN_COMPRESS_SIZE; + + Result.SSLEnabled := False; + Result.SSLCertFile := ''; + Result.SSLKeyFile := ''; + Result.SSLKeyPassword := ''; + Result.SSLCACertFile := ''; + Result.SSLVerifyPeer := False; + Result.SSLCipherList := ''; // empty = use CrossSocket built-in list + Result.ServerBanner := ''; // empty = emit 'unknown' +end; + +end. diff --git a/src/Horse.Provider.Console.pas b/src/Horse.Provider.Console.pas index b0e6d2a..a81551d 100644 --- a/src/Horse.Provider.Console.pas +++ b/src/Horse.Provider.Console.pas @@ -1,10 +1,24 @@ unit Horse.Provider.Console; +{ =========================================================================== + PATCH-CONSOLE-1 ListenWithConfig override + Without this, THorseProviderAbstract.ListenWithConfig just calls the no-arg + Listen, which enters InternalListen with FPort = 0 and falls back to + DEFAULT_PORT (9000), silently ignoring the caller-supplied APort. + Fix: override ListenWithConfig in THorseProvider (Console) so that it sets + Console's own FPort via SetPort before calling InternalListen. + AConfig is intentionally ignored Console/Indy has no use for + THorseCrossSocketConfig; only CrossSocket overrides ListenWithConfig fully. + =========================================================================== } + interface {$IF NOT DEFINED(FPC)} uses Horse.Provider.Abstract, +{ PATCH-CONSOLE-1: Horse.Provider.Config needed for THorseCrossSocketConfig } + Horse.Provider.Config, +{ =========================================================================== } Horse.Provider.IOHandleSSL.Contract, IdHTTPWebBrokerBridge, IdContext, @@ -59,6 +73,12 @@ THorseProvider = class(THorseProviderAbstract) class procedure Listen(const APort: Integer; const ACallbackListen: TProc; const ACallbackStopListen: TProc = nil); reintroduce; overload; static; class procedure Listen(const AHost: string; const ACallbackListen: TProc = nil; const ACallbackStopListen: TProc = nil); reintroduce; overload; static; class procedure Listen(const ACallbackListen: TProc; const ACallbackStopListen: TProc = nil); reintroduce; overload; static; +{ =========================================================================== + PATCH-CONSOLE-1 ListenWithConfig declaration + =========================================================================== } + class procedure ListenWithConfig(const APort: Integer; + const AConfig: THorseCrossSocketConfig); override; +{ =========================================================================== } class function IsRunning: Boolean; class destructor UnInitialize; end; @@ -286,6 +306,21 @@ class procedure THorseProvider.Listen(const APort: Integer; const ACallbackListe Listen(APort, FHost, ACallbackListen, ACallbackStopListen); end; +{ =========================================================================== + PATCH-CONSOLE-1 ListenWithConfig implementation + Sets Console's own FPort before starting, so the port is honoured even when + the caller goes through the abstract ListenWithConfig entry point. + AConfig is intentionally ignored Indy/Console has no use for CrossSocket + configuration. CrossSocket overrides ListenWithConfig completely. + =========================================================================== } +class procedure THorseProvider.ListenWithConfig(const APort: Integer; + const AConfig: THorseCrossSocketConfig); +begin + SetPort(APort); + InternalListen; +end; +{ =========================================================================== } + class procedure THorseProvider.OnAuthentication(AContext: TIdContext; const AAuthType, AAuthData: String; var VUsername, VPassword: String; var VHandled: Boolean); begin VHandled := True; diff --git a/src/Horse.Provider.Daemon.pas b/src/Horse.Provider.Daemon.pas index ba8931f..1b61259 100644 --- a/src/Horse.Provider.Daemon.pas +++ b/src/Horse.Provider.Daemon.pas @@ -1,10 +1,17 @@ unit Horse.Provider.Daemon; +{ PATCH-DAEMON-1: ListenWithConfig override same root cause as PATCH-CONSOLE-1. + THorseProviderAbstract.ListenWithConfig calls the no-arg Listen, entering + InternalListen with FPort = 0 ? DEFAULT_PORT (9000). Fix: override + ListenWithConfig here so it calls SetPort(APort) before InternalListen. + AConfig is intentionally ignored Daemon/Indy has no use for CrossSocket config. } + interface {$IF DEFINED(HORSE_DAEMON) AND NOT DEFINED(FPC)} uses Horse.Provider.Abstract, + Horse.Provider.Config, Horse.Constants, Horse.Provider.IOHandleSSL.Contract, IdHTTPWebBrokerBridge, @@ -60,6 +67,9 @@ THorseProvider = class(THorseProviderAbstract) class procedure Listen(const APort: Integer; const ACallbackListen: TProc; const ACallbackStopListen: TProc = nil); reintroduce; overload; static; class procedure Listen(const AHost: string; const ACallbackListen: TProc = nil; const ACallbackStopListen: TProc = nil); reintroduce; overload; static; class procedure Listen(const ACallbackListen: TProc; const ACallbackStopListen: TProc = nil); reintroduce; overload; static; + // PATCH-DAEMON-1 + class procedure ListenWithConfig(const APort: Integer; + const AConfig: THorseCrossSocketConfig); override; class destructor UnInitialize; end; @@ -328,6 +338,14 @@ class procedure THorseProvider.Listen(const APort: Integer; const ACallbackListe Listen(APort, FHost, ACallbackListen, ACallbackStopListen); end; +// PATCH-DAEMON-1 +class procedure THorseProvider.ListenWithConfig(const APort: Integer; + const AConfig: THorseCrossSocketConfig); +begin + SetPort(APort); + InternalListen; +end; + class procedure THorseProvider.OnAuthentication(AContext: TIdContext; const AAuthType, AAuthData: String; var VUsername, VPassword: String; var VHandled: Boolean); begin VHandled := True; diff --git a/src/Horse.Provider.FPC.Daemon.pas b/src/Horse.Provider.FPC.Daemon.pas index c0ff3cc..68cba8c 100644 --- a/src/Horse.Provider.FPC.Daemon.pas +++ b/src/Horse.Provider.FPC.Daemon.pas @@ -1,5 +1,7 @@ unit Horse.Provider.FPC.Daemon; +{ PATCH-FPCDAEMON-1: ListenWithConfig override same root cause as PATCH-CONSOLE-1. } + {$IF DEFINED(FPC)} {$MODE DELPHI}{$H+} {$ENDIF} @@ -17,6 +19,7 @@ interface Horse.Response, Horse.Core, Horse.Provider.Abstract, + Horse.Provider.Config, Horse.Constants, Horse.Proc, Horse.Commons; @@ -71,6 +74,9 @@ THorseProvider = class(THorseProviderAbstract) class procedure Listen(const APort: Integer; const ACallbackListen: TProc; const ACallbackStopListen: TProc = nil); reintroduce; overload; static; class procedure Listen(const AHost: string; const ACallbackListen: TProc = nil; const ACallbackStopListen: TProc = nil); reintroduce; overload; static; class procedure Listen(const ACallbackListen: TProc; const ACallbackStopListen: TProc = nil); reintroduce; overload; static; + // PATCH-FPCDAEMON-1 + class procedure ListenWithConfig(const APort: Integer; + const AConfig: THorseCrossSocketConfig); override; class destructor UnInitialize; class function IsRunning: Boolean; end; @@ -179,6 +185,14 @@ class procedure THorseProvider.Listen(const APort: Integer; const ACallbackListe Listen(APort, FHost, ACallbackListen, ACallbackStopListen); end; +// PATCH-FPCDAEMON-1 +class procedure THorseProvider.ListenWithConfig(const APort: Integer; + const AConfig: THorseCrossSocketConfig); +begin + SetPort(APort); + InternalListen; +end; + class procedure THorseProvider.SetHost(const AValue: string); begin FHost := AValue; diff --git a/src/Horse.Provider.FPC.FastCGI.pas b/src/Horse.Provider.FPC.FastCGI.pas index 39308c5..a8f00c8 100644 --- a/src/Horse.Provider.FPC.FastCGI.pas +++ b/src/Horse.Provider.FPC.FastCGI.pas @@ -1,5 +1,7 @@ unit Horse.Provider.FPC.FastCGI; +{ PATCH-FPCFCGI-1: ListenWithConfig override same root cause as PATCH-CONSOLE-1. } + {$IF DEFINED(FPC)} {$MODE DELPHI}{$H+} {$ENDIF} @@ -14,6 +16,7 @@ interface httpdefs, fpHTTP, Horse.Provider.Abstract, + Horse.Provider.Config, Horse.Constants, Horse.Proc; @@ -42,6 +45,9 @@ THorseProvider = class(THorseProviderAbstract) class procedure Listen(const APort: Integer; const ACallback: TProc); reintroduce; overload; static; class procedure Listen(const AHost: string; const ACallback: TProc = nil); reintroduce; overload; static; class procedure Listen(const ACallback: TProc); reintroduce; overload; static; + // PATCH-FPCFCGI-1 + class procedure ListenWithConfig(const APort: Integer; + const AConfig: THorseCrossSocketConfig); override; end; {$ENDIF} @@ -135,6 +141,14 @@ class procedure THorseProvider.Listen(const APort: Integer; const ACallback: TPr Listen(APort, FHost, ACallback); end; +// PATCH-FPCFCGI-1 +class procedure THorseProvider.ListenWithConfig(const APort: Integer; + const AConfig: THorseCrossSocketConfig); +begin + SetPort(APort); + InternalListen; +end; + class procedure THorseProvider.SetHost(const AValue: string); begin FHost := AValue; diff --git a/src/Horse.Provider.FPC.HTTPApplication.pas b/src/Horse.Provider.FPC.HTTPApplication.pas index 1a46ea9..eec774b 100644 --- a/src/Horse.Provider.FPC.HTTPApplication.pas +++ b/src/Horse.Provider.FPC.HTTPApplication.pas @@ -1,5 +1,7 @@ unit Horse.Provider.FPC.HTTPApplication; +{ PATCH-FPCHTTP-1: ListenWithConfig override same root cause as PATCH-CONSOLE-1. } + {$IF DEFINED(FPC)} {$MODE DELPHI}{$H+} {$ENDIF} @@ -14,6 +16,7 @@ interface fpHTTP, fphttpapp, Horse.Provider.Abstract, + Horse.Provider.Config, Horse.Constants, Horse.Proc; @@ -46,6 +49,9 @@ THorseProvider = class(THorseProviderAbstract) class procedure Listen(const APort: Integer; const ACallback: TProc); reintroduce; overload; static; class procedure Listen(const AHost: string; const ACallback: TProc = nil); reintroduce; overload; static; class procedure Listen(const ACallback: TProc); reintroduce; overload; static; + // PATCH-FPCHTTP-1 + class procedure ListenWithConfig(const APort: Integer; + const AConfig: THorseCrossSocketConfig); override; class function IsRunning: Boolean; end; {$ENDIF} @@ -157,6 +163,14 @@ class procedure THorseProvider.Listen(const APort: Integer; const ACallback: TPr Listen(APort, FHost, ACallback); end; +// PATCH-FPCHTTP-1 +class procedure THorseProvider.ListenWithConfig(const APort: Integer; + const AConfig: THorseCrossSocketConfig); +begin + SetPort(APort); + InternalListen; +end; + class procedure THorseProvider.SetHost(const AValue: string); begin FHost := AValue; diff --git a/src/Horse.Provider.FPC.LCL.pas b/src/Horse.Provider.FPC.LCL.pas index a563732..b2ec39f 100644 --- a/src/Horse.Provider.FPC.LCL.pas +++ b/src/Horse.Provider.FPC.LCL.pas @@ -1,5 +1,7 @@ unit Horse.Provider.FPC.LCL; +{ PATCH-FPCLCL-1: ListenWithConfig override same root cause as PATCH-CONSOLE-1. } + {$IF DEFINED(FPC)} {$MODE DELPHI}{$H+} {$ENDIF} @@ -14,6 +16,7 @@ interface fpHTTP, fphttpapp, Horse.Provider.Abstract, + Horse.Provider.Config, Horse.Constants, Horse.Request, Horse.Response, @@ -73,6 +76,9 @@ THorseProvider = class(THorseProviderAbstract) class procedure Listen(const APort: Integer; const ACallbackListen: TProc; const ACallbackStopListen: TProc = nil); reintroduce; overload; static; class procedure Listen(const AHost: string; const ACallbackListen: TProc = nil; const ACallbackStopListen: TProc = nil); reintroduce; overload; static; class procedure Listen(const ACallbackListen: TProc; const ACallbackStopListen: TProc = nil); reintroduce; overload; static; + // PATCH-FPCLCL-1 + class procedure ListenWithConfig(const APort: Integer; + const AConfig: THorseCrossSocketConfig); override; class destructor UnInitialize; class function IsRunning: Boolean; end; @@ -200,6 +206,14 @@ class procedure THorseProvider.Listen(const APort: Integer; const ACallbackListe Listen(APort, FHost, ACallbackListen, ACallbackStopListen); end; +// PATCH-FPCLCL-1 +class procedure THorseProvider.ListenWithConfig(const APort: Integer; + const AConfig: THorseCrossSocketConfig); +begin + SetPort(APort); + InternalListen; +end; + class procedure THorseProvider.SetHost(const AValue: string); begin FHost := AValue.Trim; diff --git a/src/Horse.Provider.RawAdapters.pas b/src/Horse.Provider.RawAdapters.pas new file mode 100644 index 0000000..05ff9cb --- /dev/null +++ b/src/Horse.Provider.RawAdapters.pas @@ -0,0 +1,477 @@ +unit Horse.Provider.RawAdapters; + +{ + Horse Provider Raw Adapters + =========================== + Generic TWebRequest / TWebResponse subclasses that delegate to + IHorseRawRequest / IHorseRawResponse interfaces. + + Purpose: new providers implement the lightweight interfaces (~10 methods) + from Horse.Provider.RawInterfaces and wrap them in these adapters to get + full TWebRequest / TWebResponse compatibility for free. + + Delphi branch: subclasses TWebRequest / TWebResponse (Web.HTTPApp). + FPC branch: subclasses TRequest / TResponse (HTTPDefs). + + The adapters handle: + - All abstract Get/Set variable method stubs + - Eager population of QueryFields / ContentFields / CookieFields + - GetFieldByName delegation + - ReadClient / ReadString delegation + - Write-side stubs (no-ops — responses go through THorseResponse) + + SetCustomHeader on TInterfacedWebResponse is inherited from TWebResponse + and writes to the inherited CustomHeaders TStrings. The adapter optionally + forwards to IHorseRawResponse if the provider wants real-time interception. +} + +{$IF DEFINED(FPC)} +{$MODE DELPHI}{$H+} +{$ENDIF} + +interface + +uses +{$IF DEFINED(FPC)} + SysUtils, + Classes, + fpHTTP, + HTTPDefs, +{$ELSE} + System.SysUtils, + System.Classes, + Web.HTTPApp, +{$ENDIF} + Horse.Provider.RawInterfaces; + +type +{$IF DEFINED(FPC)} + + { TInterfacedWebRequest — FPC TRequest subclass + Populates inherited fields from IHorseRawRequest in constructor. } + TInterfacedWebRequest = class(TRequest) + private + FRawReq: IHorseRawRequest; + public + constructor Create(const ARawReq: IHorseRawRequest); reintroduce; + property RawReq: IHorseRawRequest read FRawReq; + end; + + { TInterfacedWebResponse — FPC TResponse subclass } + TInterfacedWebResponse = class(TResponse) + private + FRawRes: IHorseRawResponse; + public + constructor Create(const ARawRes: IHorseRawResponse); reintroduce; + property RawRes: IHorseRawResponse read FRawRes; + end; + +{$ELSE} + + { TInterfacedWebRequest — Delphi TWebRequest subclass + Delegates all abstract methods to IHorseRawRequest. + Eagerly populates inherited QueryFields / ContentFields / CookieFields. } + TInterfacedWebRequest = class(TWebRequest) + private + FRawReq: IHorseRawRequest; + protected + function GetStringVariable(Index: Integer): string; override; + function GetDateVariable(Index: Integer): TDateTime; override; +{$IF CompilerVersion >= 32.0} // Delphi 10.2 Tokyo+ + function GetIntegerVariable(Index: Integer): Int64; override; +{$ELSE} + function GetIntegerVariable(Index: Integer): Integer; override; +{$IFEND} + function GetRawContent: TBytes; override; + public + constructor Create(const ARawReq: IHorseRawRequest); reintroduce; + destructor Destroy; override; + function GetFieldByName(const Name: string): string; override; + function ReadClient(var Buffer; Count: Integer): Integer; override; + function ReadString(Count: Integer): string; override; + function TranslateURI(const URI: string): string; override; + function WriteClient(var Buffer; Count: Integer): Integer; override; + function WriteString(const AString: string): Boolean; override; + function WriteHeaders(StatusCode: Integer; const ReasonString, + Headers: string): Boolean; override; + property RawReq: IHorseRawRequest read FRawReq; + end; + + { TInterfacedWebResponse — Delphi TWebResponse subclass + All abstract methods stubbed. SetCustomHeader is inherited and works + out of the box via the inherited CustomHeaders TStrings. } + TInterfacedWebResponse = class(TWebResponse) + private + FRawRes: IHorseRawResponse; + protected + function GetStringVariable(Index: Integer): string; override; + procedure SetStringVariable(Index: Integer; const Value: string); override; + function GetDateVariable(Index: Integer): TDateTime; override; + procedure SetDateVariable(Index: Integer; const Value: TDateTime); override; +{$IF CompilerVersion >= 32.0} // Delphi 10.2 Tokyo+ + function GetIntegerVariable(Index: Integer): Int64; override; + procedure SetIntegerVariable(Index: Integer; Value: Int64); override; +{$ELSE} + function GetIntegerVariable(Index: Integer): Integer; override; + procedure SetIntegerVariable(Index: Integer; Value: Integer); override; +{$IFEND} + function GetContent: string; override; + procedure SetContent(const Value: string); override; + procedure SetContentStream(Value: TStream); override; + function GetStatusCode: Integer; override; + procedure SetStatusCode(Value: Integer); override; + function GetLogMessage: string; override; + procedure SetLogMessage(const Value: string); override; + public + constructor Create(const ARawRes: IHorseRawResponse); reintroduce; + destructor Destroy; override; + procedure SendResponse; override; + procedure SendRedirect(const URI: string); override; + property RawRes: IHorseRawResponse read FRawRes; + end; + +{$ENDIF} + +implementation + +{ --------------------------------------------------------------------------- } +{ String variable indices — same as Web.HTTPApp TWebRequest private constants } +{ Stable across Delphi versions from XE onward. } +{ --------------------------------------------------------------------------- } +{$IF NOT DEFINED(FPC)} +const + HRV_Method = 0; + HRV_ProtocolVersion = 1; + HRV_URL = 2; + HRV_Query = 3; + HRV_PathInfo = 4; + HRV_PathTranslated = 5; + HRV_CacheControl = 6; + HRV_Date = 7; + HRV_Accept = 8; + HRV_From = 9; + HRV_Host = 10; + HRV_IfModifiedSince = 11; + HRV_Referer = 12; + HRV_UserAgent = 13; + HRV_ContentEncoding = 14; + HRV_ContentType = 15; + HRV_ContentLength = 16; + HRV_ContentVersion = 17; + HRV_DerivedFrom = 18; + HRV_Expires = 19; + HRV_Title = 20; + HRV_RemoteAddr = 21; + HRV_RemoteHost = 22; + HRV_ScriptName = 23; + HRV_ServerPort = 24; + HRV_Content = 25; + HRV_Connection = 26; + HRV_Cookie = 27; + HRV_Authorization = 28; +{$ENDIF} + +{ =========================================================================== } +{ Delphi implementation } +{ =========================================================================== } +{$IF NOT DEFINED(FPC)} + +{ --------------------------------------------------------------------------- } +{ TInterfacedWebRequest } +{ --------------------------------------------------------------------------- } + +constructor TInterfacedWebRequest.Create(const ARawReq: IHorseRawRequest); +begin + { Assign FRawReq BEFORE inherited Create — TWebRequest.Create calls + GetStringVariable internally during initialisation. } + FRawReq := ARawReq; + inherited Create; + + { Populate the inherited TStrings (backed by private fields — no virtual + getter to override). } + if Assigned(FRawReq) then + begin + FRawReq.PopulateQueryFields(QueryFields); + FRawReq.PopulateContentFields(ContentFields); + FRawReq.PopulateCookieFields(CookieFields); + end; +end; + +destructor TInterfacedWebRequest.Destroy; +begin + FRawReq := nil; + inherited; +end; + +function TInterfacedWebRequest.GetStringVariable(Index: Integer): string; +begin + if FRawReq = nil then Exit(''); + case Index of + HRV_Method: Result := FRawReq.GetMethod; + HRV_ProtocolVersion: Result := FRawReq.GetProtocolVersion; + HRV_URL: Result := FRawReq.GetURL; + HRV_Query: Result := FRawReq.GetQueryString; + HRV_PathInfo: Result := FRawReq.GetPathInfo; + HRV_PathTranslated: Result := FRawReq.GetPathInfo; + HRV_CacheControl: Result := FRawReq.GetFieldByName('Cache-Control'); + HRV_Date: Result := FRawReq.GetFieldByName('Date'); + HRV_Accept: Result := FRawReq.GetFieldByName('Accept'); + HRV_From: Result := FRawReq.GetFieldByName('From'); + HRV_Host: Result := FRawReq.GetHost; + HRV_IfModifiedSince: Result := FRawReq.GetFieldByName('If-Modified-Since'); + HRV_Referer: Result := FRawReq.GetFieldByName('Referer'); + HRV_UserAgent: Result := FRawReq.GetFieldByName('User-Agent'); + HRV_ContentEncoding: Result := FRawReq.GetFieldByName('Content-Encoding'); + HRV_ContentType: Result := FRawReq.GetContentType; + HRV_ContentLength: Result := IntToStr(FRawReq.GetContentLength); + HRV_ContentVersion: Result := FRawReq.GetFieldByName('Content-Version'); + HRV_DerivedFrom: Result := FRawReq.GetFieldByName('Derived-From'); + HRV_Expires: Result := FRawReq.GetFieldByName('Expires'); + HRV_Title: Result := FRawReq.GetFieldByName('Title'); + HRV_RemoteAddr: Result := FRawReq.GetRemoteAddr; + HRV_RemoteHost: Result := FRawReq.GetRemoteAddr; + HRV_ScriptName: Result := ''; + HRV_ServerPort: Result := IntToStr(FRawReq.GetServerPort); + HRV_Content: Result := FRawReq.GetContent; + HRV_Connection: Result := FRawReq.GetFieldByName('Connection'); + HRV_Cookie: Result := FRawReq.GetFieldByName('Cookie'); + HRV_Authorization: Result := FRawReq.GetFieldByName('Authorization'); + else + Result := ''; + end; +end; + +function TInterfacedWebRequest.GetDateVariable(Index: Integer): TDateTime; +begin + Result := 0; +end; + +{$IF CompilerVersion >= 32.0} +function TInterfacedWebRequest.GetIntegerVariable(Index: Integer): Int64; +{$ELSE} +function TInterfacedWebRequest.GetIntegerVariable(Index: Integer): Integer; +{$IFEND} +begin + if FRawReq = nil then Exit(-1); + case Index of + HRV_ContentLength: Result := FRawReq.GetContentLength; + HRV_ServerPort: Result := FRawReq.GetServerPort; + else + Result := -1; + end; +end; + +function TInterfacedWebRequest.GetRawContent: TBytes; +var + LContent: string; +begin + if Assigned(FRawReq) then + begin + LContent := FRawReq.GetContent; + if LContent <> '' then + Result := TEncoding.UTF8.GetBytes(LContent) + else + Result := nil; + end + else + Result := nil; +end; + +function TInterfacedWebRequest.GetFieldByName(const Name: string): string; +begin + if Assigned(FRawReq) then + Result := FRawReq.GetFieldByName(Name) + else + Result := ''; +end; + +function TInterfacedWebRequest.ReadClient(var Buffer; Count: Integer): Integer; +begin + if Assigned(FRawReq) then + Result := FRawReq.ReadBody(Buffer, Count) + else + Result := 0; +end; + +function TInterfacedWebRequest.ReadString(Count: Integer): string; +var + LBytes: TBytes; + LRead: Integer; +begin + if Count <= 0 then Exit(''); + SetLength(LBytes, Count); + LRead := ReadClient(LBytes[0], Count); + if LRead <= 0 then Exit(''); + SetLength(LBytes, LRead); + Result := TEncoding.UTF8.GetString(LBytes); +end; + +function TInterfacedWebRequest.TranslateURI(const URI: string): string; +begin + Result := URI; +end; + +function TInterfacedWebRequest.WriteClient(var Buffer; Count: Integer): Integer; +begin + Result := 0; +end; + +function TInterfacedWebRequest.WriteString(const AString: string): Boolean; +begin + Result := False; +end; + +function TInterfacedWebRequest.WriteHeaders(StatusCode: Integer; + const ReasonString, Headers: string): Boolean; +begin + Result := False; +end; + +{ --------------------------------------------------------------------------- } +{ TInterfacedWebResponse } +{ --------------------------------------------------------------------------- } + +constructor TInterfacedWebResponse.Create(const ARawRes: IHorseRawResponse); +begin + FRawRes := ARawRes; + inherited Create(nil); +end; + +destructor TInterfacedWebResponse.Destroy; +begin + FRawRes := nil; + inherited; +end; + +function TInterfacedWebResponse.GetStringVariable(Index: Integer): string; +begin + Result := ''; +end; + +procedure TInterfacedWebResponse.SetStringVariable(Index: Integer; const Value: string); +begin + { Stub } +end; + +function TInterfacedWebResponse.GetDateVariable(Index: Integer): TDateTime; +begin + Result := 0; +end; + +procedure TInterfacedWebResponse.SetDateVariable(Index: Integer; const Value: TDateTime); +begin + { Stub } +end; + +{$IF CompilerVersion >= 32.0} +function TInterfacedWebResponse.GetIntegerVariable(Index: Integer): Int64; +{$ELSE} +function TInterfacedWebResponse.GetIntegerVariable(Index: Integer): Integer; +{$IFEND} +begin + Result := 0; +end; + +{$IF CompilerVersion >= 32.0} +procedure TInterfacedWebResponse.SetIntegerVariable(Index: Integer; Value: Int64); +{$ELSE} +procedure TInterfacedWebResponse.SetIntegerVariable(Index: Integer; Value: Integer); +{$IFEND} +begin + { Stub } +end; + +function TInterfacedWebResponse.GetContent: string; +begin + Result := ''; +end; + +procedure TInterfacedWebResponse.SetContent(const Value: string); +begin + { Stub — use THorseResponse.Send } +end; + +procedure TInterfacedWebResponse.SetContentStream(Value: TStream); +begin + { Stub — use THorseResponse.SendFile } +end; + +function TInterfacedWebResponse.GetStatusCode: Integer; +begin + Result := 200; +end; + +procedure TInterfacedWebResponse.SetStatusCode(Value: Integer); +begin + { Stub — use THorseResponse.Status } +end; + +function TInterfacedWebResponse.GetLogMessage: string; +begin + Result := ''; +end; + +procedure TInterfacedWebResponse.SetLogMessage(const Value: string); +begin + { Stub } +end; + +procedure TInterfacedWebResponse.SendResponse; +begin + { No-op — response sending goes through TResponseBridge.Flush } +end; + +procedure TInterfacedWebResponse.SendRedirect(const URI: string); +begin + { No-op — use THorseResponse.RedirectTo } +end; + +{$ELSE} + +{ =========================================================================== } +{ FPC implementation } +{ =========================================================================== } + +{ --------------------------------------------------------------------------- } +{ TInterfacedWebRequest — FPC } +{ --------------------------------------------------------------------------- } + +constructor TInterfacedWebRequest.Create(const ARawReq: IHorseRawRequest); +begin + FRawReq := ARawReq; + inherited Create; + + if Assigned(FRawReq) then + begin + Method := FRawReq.GetMethod; + URL := FRawReq.GetURL; + URI := FRawReq.GetURL; + PathInfo := FRawReq.GetPathInfo; + Host := FRawReq.GetHost; + ContentType := FRawReq.GetContentType; + RemoteAddr := FRawReq.GetRemoteAddr; + RemoteHost := FRawReq.GetRemoteAddr; + ProtocolVersion := FRawReq.GetProtocolVersion; + ServerPort := IntToStr(FRawReq.GetServerPort); + + FRawReq.PopulateQueryFields(QueryFields); + FRawReq.PopulateContentFields(ContentFields); + FRawReq.PopulateCookieFields(CookieFields); + end; +end; + +{ --------------------------------------------------------------------------- } +{ TInterfacedWebResponse — FPC } +{ --------------------------------------------------------------------------- } + +constructor TInterfacedWebResponse.Create(const ARawRes: IHorseRawResponse); +begin + FRawRes := ARawRes; + inherited Create(nil); + Code := 200; + ContentType := ''; +end; + +{$ENDIF} + +end. diff --git a/src/Horse.Provider.RawInterfaces.pas b/src/Horse.Provider.RawInterfaces.pas new file mode 100644 index 0000000..49ddd83 --- /dev/null +++ b/src/Horse.Provider.RawInterfaces.pas @@ -0,0 +1,95 @@ +unit Horse.Provider.RawInterfaces; + +{ + Horse Provider Raw Interfaces + ============================= + Lightweight interfaces that capture the subset of TWebRequest / TWebResponse + functionality that Horse middleware actually uses. + + New providers implement these (~10 methods for request, ~1 for response) + instead of stubbing 30+ abstract methods on TWebRequest / TWebResponse. + + The generic adapter classes in Horse.Provider.RawAdapters wrap an + IHorseRawRequest / IHorseRawResponse into a real TWebRequest / TWebResponse + subclass, giving middleware full backward compatibility. + + Dual-compilation: interfaces are identical in Delphi and FPC. + + Compiler-version guard: GetContentLength returns Int64 on Delphi 10.2+ + (where TWebRequest.GetIntegerVariable changed from Integer to Int64) + and Integer on older Delphi and FPC. +} + +{$IF DEFINED(FPC)} +{$MODE DELPHI}{$H+} +{$ENDIF} + +interface + +uses +{$IF DEFINED(FPC)} + Classes; +{$ELSE} + System.Classes; +{$ENDIF} + +type + { IHorseRawRequest — the request surface that middleware actually reads. + + Covers: Method, PathInfo, QueryString, Host, RemoteAddr, ContentType, + Content (body as string), arbitrary header lookup, and the three + name=value collections (query, content fields, cookies). + + A provider implements this by wrapping its native request object + (ICrossHttpRequest, TIdHTTPRequestInfo, etc.) in ~10 one-liner methods. } + + IHorseRawRequest = interface + ['{A7E3B4C1-5D2F-4A8E-9C6B-1F0D3E2A4B5C}'] + function GetMethod: string; + function GetProtocolVersion: string; + function GetURL: string; + function GetPathInfo: string; + function GetQueryString: string; + function GetHost: string; + function GetRemoteAddr: string; + function GetServerPort: Integer; + function GetContentType: string; + function GetContent: string; +{$IF DEFINED(FPC)} + function GetContentLength: Integer; +{$ELSEIF CompilerVersion >= 32.0} // Delphi 10.2 Tokyo+ + function GetContentLength: Int64; +{$ELSE} + function GetContentLength: Integer; +{$IFEND} + function GetFieldByName(const AName: string): string; + + { Populate the inherited TStrings collections in TWebRequest. + Called once by the adapter constructor. } + procedure PopulateQueryFields(ADest: TStrings); + procedure PopulateContentFields(ADest: TStrings); + procedure PopulateCookieFields(ADest: TStrings); + + { Streaming body access — used by ReadClient / ReadString. + Returns the number of bytes actually read. } + function ReadBody(var Buffer; Count: Integer): Integer; + end; + + { IHorseRawResponse — the response surface that middleware actually writes. + + The ONLY method middleware calls on RawWebResponse is SetCustomHeader. + This interface captures that single operation. + + SetCustomHeader is inherited from TWebResponse and writes to the + inherited CustomHeaders TStrings — no override needed in the adapter. + This interface exists so providers that want to intercept header writes + (e.g. for real-time forwarding) can do so. } + + IHorseRawResponse = interface + ['{B8F4C5D2-6E3A-4B9F-0D7C-2A1E4F3B5C6D}'] + procedure SetCustomHeader(const AName, AValue: string); + end; + +implementation + +end. diff --git a/src/Horse.Provider.VCL.pas b/src/Horse.Provider.VCL.pas index 890ec00..db7194a 100644 --- a/src/Horse.Provider.VCL.pas +++ b/src/Horse.Provider.VCL.pas @@ -1,301 +1,315 @@ -unit Horse.Provider.VCL; - -interface - -{$IF DEFINED(HORSE_VCL)} -uses - Horse.Provider.Abstract, - Horse.Constants, - Horse.Provider.IOHandleSSL.Contract, - IdHTTPWebBrokerBridge, - IdSSLOpenSSL, - IdContext, - Horse.Provider.IOHandleSSL, - System.Classes, - System.SyncObjs, - System.SysUtils; - -type - THorseProvider = class(THorseProviderAbstract) - private - class var FPort: Integer; - class var FHost: string; - class var FRunning: Boolean; - class var FMaxConnections: Integer; - class var FListenQueue: Integer; - class var FKeepConnectionAlive: Boolean; - class var FIdHTTPWebBrokerBridge: TIdHTTPWebBrokerBridge; - class var FHorseProviderIOHandleSSL: IHorseProviderIOHandleSSL; - class function GetDefaultHTTPWebBroker: TIdHTTPWebBrokerBridge; - class function GetDefaultHorseProviderIOHandleSSL: IHorseProviderIOHandleSSL; - class function HTTPWebBrokerIsNil: Boolean; - class procedure OnAuthentication(AContext: TIdContext; const AAuthType, AAuthData: string; var VUsername, VPassword: string; var VHandled: Boolean); - class procedure OnQuerySSLPort(APort: Word; var VUseSSL: Boolean); - class procedure SetListenQueue(const AValue: Integer); static; - class procedure SetMaxConnections(const AValue: Integer); static; - class procedure SetPort(const AValue: Integer); static; - class procedure SetIOHandleSSL(const AValue: IHorseProviderIOHandleSSL); static; - class procedure SetHost(const AValue: string); static; - class procedure SetKeepConnectionAlive(const AValue: Boolean); static; - class function GetKeepConnectionAlive: Boolean; static; - class function GetListenQueue: Integer; static; - class function GetMaxConnections: Integer; static; - class function GetPort: Integer; static; - class function GetDefaultPort: Integer; static; - class function GetDefaultHost: string; static; - class function GetIOHandleSSL: IHorseProviderIOHandleSSL; static; - class function GetHost: string; static; - class procedure InternalListen; virtual; - class procedure InternalStopListen; virtual; - class procedure InitServerIOHandlerSSLOpenSSL(const AIdHTTPWebBrokerBridge: TIdHTTPWebBrokerBridge; const AHorseProviderIOHandleSSL: IHorseProviderIOHandleSSL); - public - class property Host: string read GetHost write SetHost; - class property Port: Integer read GetPort write SetPort; - class property MaxConnections: Integer read GetMaxConnections write SetMaxConnections; - class property ListenQueue: Integer read GetListenQueue write SetListenQueue; - class property KeepConnectionAlive: Boolean read GetKeepConnectionAlive write SetKeepConnectionAlive; - class property IOHandleSSL: IHorseProviderIOHandleSSL read GetIOHandleSSL write SetIOHandleSSL; - class procedure StopListen; override; - class procedure Listen; overload; override; - class procedure Listen(const APort: Integer; const AHost: string = '0.0.0.0'; const ACallbackListen: TProc = nil; const ACallbackStopListen: TProc = nil); reintroduce; overload; static; - class procedure Listen(const APort: Integer; const ACallbackListen: TProc; const ACallbackStopListen: TProc = nil); reintroduce; overload; static; - class procedure Listen(const AHost: string; const ACallbackListen: TProc = nil; const ACallbackStopListen: TProc = nil); reintroduce; overload; static; - class procedure Listen(const ACallbackListen: TProc; const ACallbackStopListen: TProc = nil); reintroduce; overload; static; - class function IsRunning: Boolean; - class destructor UnInitialize; - end; -{$ENDIF} - -implementation - -{$IF DEFINED(HORSE_VCL)} -uses - Web.WebReq, - Horse.WebModule, - IdCustomTCPServer; - -class function THorseProvider.IsRunning: Boolean; -begin - Result := FRunning; -end; - -class function THorseProvider.GetDefaultHTTPWebBroker: TIdHTTPWebBrokerBridge; -begin - if HTTPWebBrokerIsNil then - begin - FIdHTTPWebBrokerBridge := TIdHTTPWebBrokerBridge.Create(nil); - FIdHTTPWebBrokerBridge.OnParseAuthentication := OnAuthentication; - FIdHTTPWebBrokerBridge.OnQuerySSLPort := OnQuerySSLPort; - end; - Result := FIdHTTPWebBrokerBridge; -end; - -class function THorseProvider.GetKeepConnectionAlive: Boolean; -begin - Result := FKeepConnectionAlive; -end; - -class procedure THorseProvider.SetKeepConnectionAlive(const AValue: Boolean); -begin - FKeepConnectionAlive := AValue; -end; - -class function THorseProvider.HTTPWebBrokerIsNil: Boolean; -begin - Result := FIdHTTPWebBrokerBridge = nil; -end; - -class procedure THorseProvider.OnQuerySSLPort(APort: Word; var VUseSSL: Boolean); -begin - VUseSSL := (FHorseProviderIOHandleSSL <> nil) and (FHorseProviderIOHandleSSL.Active); -end; - -class function THorseProvider.GetDefaultHorseProviderIOHandleSSL: IHorseProviderIOHandleSSL; -begin - if FHorseProviderIOHandleSSL = nil then - FHorseProviderIOHandleSSL := THorseProviderIOHandleSSL.New; - Result := FHorseProviderIOHandleSSL; -end; - -class function THorseProvider.GetDefaultHost: string; -begin - Result := DEFAULT_HOST; -end; - -class function THorseProvider.GetDefaultPort: Integer; -begin - Result := DEFAULT_PORT; -end; - -class function THorseProvider.GetHost: string; -begin - Result := FHost; -end; - -class function THorseProvider.GetIOHandleSSL: IHorseProviderIOHandleSSL; -begin - Result := GetDefaultHorseProviderIOHandleSSL; -end; - -class function THorseProvider.GetListenQueue: Integer; -begin - Result := FListenQueue; -end; - -class function THorseProvider.GetMaxConnections: Integer; -begin - Result := FMaxConnections; -end; - -class function THorseProvider.GetPort: Integer; -begin - Result := FPort; -end; - -class procedure THorseProvider.InitServerIOHandlerSSLOpenSSL(const AIdHTTPWebBrokerBridge: TIdHTTPWebBrokerBridge; const AHorseProviderIOHandleSSL: IHorseProviderIOHandleSSL); -var - LIOHandleSSL: TIdServerIOHandlerSSLOpenSSL; -begin - LIOHandleSSL := TIdServerIOHandlerSSLOpenSSL.Create(AIdHTTPWebBrokerBridge); - LIOHandleSSL.SSLOptions.CertFile := AHorseProviderIOHandleSSL.CertFile; - LIOHandleSSL.SSLOptions.RootCertFile := AHorseProviderIOHandleSSL.RootCertFile; - LIOHandleSSL.SSLOptions.KeyFile := AHorseProviderIOHandleSSL.KeyFile; - LIOHandleSSL.SSLOptions.Method := AHorseProviderIOHandleSSL.Method; - LIOHandleSSL.SSLOptions.SSLVersions := AHorseProviderIOHandleSSL.SSLVersions; - LIOHandleSSL.OnGetPassword := AHorseProviderIOHandleSSL.OnGetPassword; - AIdHTTPWebBrokerBridge.IOHandler := LIOHandleSSL; -end; - -class procedure THorseProvider.InternalListen; -var - LIdHTTPWebBrokerBridge: TIdHTTPWebBrokerBridge; -begin - inherited; - if FPort <= 0 then - FPort := GetDefaultPort; - if FHost.IsEmpty then - FHost := GetDefaultHost; - - LIdHTTPWebBrokerBridge := GetDefaultHTTPWebBroker; - WebRequestHandler.WebModuleClass := WebModuleClass; - try - if FMaxConnections > 0 then - begin - WebRequestHandler.MaxConnections := FMaxConnections; - GetDefaultHTTPWebBroker.MaxConnections := FMaxConnections; - end; - - if FListenQueue = 0 then - FListenQueue := IdListenQueueDefault; - - if FHorseProviderIOHandleSSL <> nil then - InitServerIOHandlerSSLOpenSSL(LIdHTTPWebBrokerBridge, GetDefaultHorseProviderIOHandleSSL); - - LIdHTTPWebBrokerBridge.ListenQueue := FListenQueue; - - LIdHTTPWebBrokerBridge.Bindings.Clear; - if FHost <> GetDefaultHost then - begin - LIdHTTPWebBrokerBridge.Bindings.Add; - LIdHTTPWebBrokerBridge.Bindings.Items[0].IP := FHost; - LIdHTTPWebBrokerBridge.Bindings.Items[0].Port := FPort; - end; - - LIdHTTPWebBrokerBridge.KeepAlive := FKeepConnectionAlive; - LIdHTTPWebBrokerBridge.DefaultPort := FPort; - LIdHTTPWebBrokerBridge.Active := True; - LIdHTTPWebBrokerBridge.StartListening; - FRunning := True; - DoOnListen; - except - raise; - end; -end; - -class procedure THorseProvider.InternalStopListen; -begin - if not HTTPWebBrokerIsNil then - begin - GetDefaultHTTPWebBroker.Active := False; - FRunning := False; - DoOnStopListen; - GetDefaultHTTPWebBroker.StopListening; - end - else - raise Exception.Create('Horse not listen'); -end; - -class procedure THorseProvider.StopListen; -begin - InternalStopListen; -end; - -class procedure THorseProvider.Listen; -begin - InternalListen; -end; - -class procedure THorseProvider.Listen(const APort: Integer; const AHost: string; const ACallbackListen, ACallbackStopListen: TProc); -begin - SetPort(APort); - SetHost(AHost); - SetOnListen(ACallbackListen); - SetOnStopListen(ACallbackStopListen); - InternalListen; -end; - -class procedure THorseProvider.Listen(const AHost: string; const ACallbackListen, ACallbackStopListen: TProc); -begin - Listen(FPort, AHost, ACallbackListen, ACallbackStopListen); -end; - -class procedure THorseProvider.Listen(const ACallbackListen, ACallbackStopListen: TProc); -begin - Listen(FPort, FHost, ACallbackListen, ACallbackStopListen); -end; - -class procedure THorseProvider.Listen(const APort: Integer; const ACallbackListen, ACallbackStopListen: TProc); -begin - Listen(APort, FHost, ACallbackListen, ACallbackStopListen); -end; - -class procedure THorseProvider.OnAuthentication(AContext: TIdContext; const AAuthType, AAuthData: string; var VUsername, VPassword: string; var VHandled: Boolean); -begin - VHandled := True; -end; - -class procedure THorseProvider.SetHost(const AValue: string); -begin - FHost := AValue.Trim; -end; - -class procedure THorseProvider.SetIOHandleSSL(const AValue: IHorseProviderIOHandleSSL); -begin - FHorseProviderIOHandleSSL := AValue; -end; - -class procedure THorseProvider.SetListenQueue(const AValue: Integer); -begin - FListenQueue := AValue; -end; - -class procedure THorseProvider.SetMaxConnections(const AValue: Integer); -begin - FMaxConnections := AValue; -end; - -class procedure THorseProvider.SetPort(const AValue: Integer); -begin - FPort := AValue; -end; - -class destructor THorseProvider.UnInitialize; -begin - FreeAndNil(FIdHTTPWebBrokerBridge); -end; - -initialization - THorseProvider.SetKeepConnectionAlive(True); -{$ENDIF} - -end. +unit Horse.Provider.VCL; + +{ PATCH-VCL-1: ListenWithConfig override same root cause as PATCH-CONSOLE-1. } + +interface + +{$IF DEFINED(HORSE_VCL)} +uses + Horse.Provider.Abstract, + Horse.Provider.Config, + Horse.Constants, + Horse.Provider.IOHandleSSL.Contract, + IdHTTPWebBrokerBridge, + IdSSLOpenSSL, + IdContext, + Horse.Provider.IOHandleSSL, + System.Classes, + System.SyncObjs, + System.SysUtils; + +type + THorseProvider = class(THorseProviderAbstract) + private + class var FPort: Integer; + class var FHost: string; + class var FRunning: Boolean; + class var FMaxConnections: Integer; + class var FListenQueue: Integer; + class var FKeepConnectionAlive: Boolean; + class var FIdHTTPWebBrokerBridge: TIdHTTPWebBrokerBridge; + class var FHorseProviderIOHandleSSL: IHorseProviderIOHandleSSL; + class function GetDefaultHTTPWebBroker: TIdHTTPWebBrokerBridge; + class function GetDefaultHorseProviderIOHandleSSL: IHorseProviderIOHandleSSL; + class function HTTPWebBrokerIsNil: Boolean; + class procedure OnAuthentication(AContext: TIdContext; const AAuthType, AAuthData: string; var VUsername, VPassword: string; var VHandled: Boolean); + class procedure OnQuerySSLPort(APort: Word; var VUseSSL: Boolean); + class procedure SetListenQueue(const AValue: Integer); static; + class procedure SetMaxConnections(const AValue: Integer); static; + class procedure SetPort(const AValue: Integer); static; + class procedure SetIOHandleSSL(const AValue: IHorseProviderIOHandleSSL); static; + class procedure SetHost(const AValue: string); static; + class procedure SetKeepConnectionAlive(const AValue: Boolean); static; + class function GetKeepConnectionAlive: Boolean; static; + class function GetListenQueue: Integer; static; + class function GetMaxConnections: Integer; static; + class function GetPort: Integer; static; + class function GetDefaultPort: Integer; static; + class function GetDefaultHost: string; static; + class function GetIOHandleSSL: IHorseProviderIOHandleSSL; static; + class function GetHost: string; static; + class procedure InternalListen; virtual; + class procedure InternalStopListen; virtual; + class procedure InitServerIOHandlerSSLOpenSSL(const AIdHTTPWebBrokerBridge: TIdHTTPWebBrokerBridge; const AHorseProviderIOHandleSSL: IHorseProviderIOHandleSSL); + public + class property Host: string read GetHost write SetHost; + class property Port: Integer read GetPort write SetPort; + class property MaxConnections: Integer read GetMaxConnections write SetMaxConnections; + class property ListenQueue: Integer read GetListenQueue write SetListenQueue; + class property KeepConnectionAlive: Boolean read GetKeepConnectionAlive write SetKeepConnectionAlive; + class property IOHandleSSL: IHorseProviderIOHandleSSL read GetIOHandleSSL write SetIOHandleSSL; + class procedure StopListen; override; + class procedure Listen; overload; override; + class procedure Listen(const APort: Integer; const AHost: string = '0.0.0.0'; const ACallbackListen: TProc = nil; const ACallbackStopListen: TProc = nil); reintroduce; overload; static; + class procedure Listen(const APort: Integer; const ACallbackListen: TProc; const ACallbackStopListen: TProc = nil); reintroduce; overload; static; + class procedure Listen(const AHost: string; const ACallbackListen: TProc = nil; const ACallbackStopListen: TProc = nil); reintroduce; overload; static; + class procedure Listen(const ACallbackListen: TProc; const ACallbackStopListen: TProc = nil); reintroduce; overload; static; + // PATCH-VCL-1 + class procedure ListenWithConfig(const APort: Integer; + const AConfig: THorseCrossSocketConfig); override; + class function IsRunning: Boolean; + class destructor UnInitialize; + end; +{$ENDIF} + +implementation + +{$IF DEFINED(HORSE_VCL)} +uses + Web.WebReq, + Horse.WebModule, + IdCustomTCPServer; + +class function THorseProvider.IsRunning: Boolean; +begin + Result := FRunning; +end; + +class function THorseProvider.GetDefaultHTTPWebBroker: TIdHTTPWebBrokerBridge; +begin + if HTTPWebBrokerIsNil then + begin + FIdHTTPWebBrokerBridge := TIdHTTPWebBrokerBridge.Create(nil); + FIdHTTPWebBrokerBridge.OnParseAuthentication := OnAuthentication; + FIdHTTPWebBrokerBridge.OnQuerySSLPort := OnQuerySSLPort; + end; + Result := FIdHTTPWebBrokerBridge; +end; + +class function THorseProvider.GetKeepConnectionAlive: Boolean; +begin + Result := FKeepConnectionAlive; +end; + +class procedure THorseProvider.SetKeepConnectionAlive(const AValue: Boolean); +begin + FKeepConnectionAlive := AValue; +end; + +class function THorseProvider.HTTPWebBrokerIsNil: Boolean; +begin + Result := FIdHTTPWebBrokerBridge = nil; +end; + +class procedure THorseProvider.OnQuerySSLPort(APort: Word; var VUseSSL: Boolean); +begin + VUseSSL := (FHorseProviderIOHandleSSL <> nil) and (FHorseProviderIOHandleSSL.Active); +end; + +class function THorseProvider.GetDefaultHorseProviderIOHandleSSL: IHorseProviderIOHandleSSL; +begin + if FHorseProviderIOHandleSSL = nil then + FHorseProviderIOHandleSSL := THorseProviderIOHandleSSL.New; + Result := FHorseProviderIOHandleSSL; +end; + +class function THorseProvider.GetDefaultHost: string; +begin + Result := DEFAULT_HOST; +end; + +class function THorseProvider.GetDefaultPort: Integer; +begin + Result := DEFAULT_PORT; +end; + +class function THorseProvider.GetHost: string; +begin + Result := FHost; +end; + +class function THorseProvider.GetIOHandleSSL: IHorseProviderIOHandleSSL; +begin + Result := GetDefaultHorseProviderIOHandleSSL; +end; + +class function THorseProvider.GetListenQueue: Integer; +begin + Result := FListenQueue; +end; + +class function THorseProvider.GetMaxConnections: Integer; +begin + Result := FMaxConnections; +end; + +class function THorseProvider.GetPort: Integer; +begin + Result := FPort; +end; + +class procedure THorseProvider.InitServerIOHandlerSSLOpenSSL(const AIdHTTPWebBrokerBridge: TIdHTTPWebBrokerBridge; const AHorseProviderIOHandleSSL: IHorseProviderIOHandleSSL); +var + LIOHandleSSL: TIdServerIOHandlerSSLOpenSSL; +begin + LIOHandleSSL := TIdServerIOHandlerSSLOpenSSL.Create(AIdHTTPWebBrokerBridge); + LIOHandleSSL.SSLOptions.CertFile := AHorseProviderIOHandleSSL.CertFile; + LIOHandleSSL.SSLOptions.RootCertFile := AHorseProviderIOHandleSSL.RootCertFile; + LIOHandleSSL.SSLOptions.KeyFile := AHorseProviderIOHandleSSL.KeyFile; + LIOHandleSSL.SSLOptions.Method := AHorseProviderIOHandleSSL.Method; + LIOHandleSSL.SSLOptions.SSLVersions := AHorseProviderIOHandleSSL.SSLVersions; + LIOHandleSSL.OnGetPassword := AHorseProviderIOHandleSSL.OnGetPassword; + AIdHTTPWebBrokerBridge.IOHandler := LIOHandleSSL; +end; + +class procedure THorseProvider.InternalListen; +var + LIdHTTPWebBrokerBridge: TIdHTTPWebBrokerBridge; +begin + inherited; + if FPort <= 0 then + FPort := GetDefaultPort; + if FHost.IsEmpty then + FHost := GetDefaultHost; + + LIdHTTPWebBrokerBridge := GetDefaultHTTPWebBroker; + WebRequestHandler.WebModuleClass := WebModuleClass; + try + if FMaxConnections > 0 then + begin + WebRequestHandler.MaxConnections := FMaxConnections; + GetDefaultHTTPWebBroker.MaxConnections := FMaxConnections; + end; + + if FListenQueue = 0 then + FListenQueue := IdListenQueueDefault; + + if FHorseProviderIOHandleSSL <> nil then + InitServerIOHandlerSSLOpenSSL(LIdHTTPWebBrokerBridge, GetDefaultHorseProviderIOHandleSSL); + + LIdHTTPWebBrokerBridge.ListenQueue := FListenQueue; + + LIdHTTPWebBrokerBridge.Bindings.Clear; + if FHost <> GetDefaultHost then + begin + LIdHTTPWebBrokerBridge.Bindings.Add; + LIdHTTPWebBrokerBridge.Bindings.Items[0].IP := FHost; + LIdHTTPWebBrokerBridge.Bindings.Items[0].Port := FPort; + end; + + LIdHTTPWebBrokerBridge.KeepAlive := FKeepConnectionAlive; + LIdHTTPWebBrokerBridge.DefaultPort := FPort; + LIdHTTPWebBrokerBridge.Active := True; + LIdHTTPWebBrokerBridge.StartListening; + FRunning := True; + DoOnListen; + except + raise; + end; +end; + +class procedure THorseProvider.InternalStopListen; +begin + if not HTTPWebBrokerIsNil then + begin + GetDefaultHTTPWebBroker.Active := False; + FRunning := False; + DoOnStopListen; + GetDefaultHTTPWebBroker.StopListening; + end + else + raise Exception.Create('Horse not listen'); +end; + +class procedure THorseProvider.StopListen; +begin + InternalStopListen; +end; + +class procedure THorseProvider.Listen; +begin + InternalListen; +end; + +class procedure THorseProvider.Listen(const APort: Integer; const AHost: string; const ACallbackListen, ACallbackStopListen: TProc); +begin + SetPort(APort); + SetHost(AHost); + SetOnListen(ACallbackListen); + SetOnStopListen(ACallbackStopListen); + InternalListen; +end; + +class procedure THorseProvider.Listen(const AHost: string; const ACallbackListen, ACallbackStopListen: TProc); +begin + Listen(FPort, AHost, ACallbackListen, ACallbackStopListen); +end; + +class procedure THorseProvider.Listen(const ACallbackListen, ACallbackStopListen: TProc); +begin + Listen(FPort, FHost, ACallbackListen, ACallbackStopListen); +end; + +class procedure THorseProvider.Listen(const APort: Integer; const ACallbackListen, ACallbackStopListen: TProc); +begin + Listen(APort, FHost, ACallbackListen, ACallbackStopListen); +end; + +// PATCH-VCL-1 +class procedure THorseProvider.ListenWithConfig(const APort: Integer; + const AConfig: THorseCrossSocketConfig); +begin + SetPort(APort); + InternalListen; +end; + +class procedure THorseProvider.OnAuthentication(AContext: TIdContext; const AAuthType, AAuthData: string; var VUsername, VPassword: string; var VHandled: Boolean); +begin + VHandled := True; +end; + +class procedure THorseProvider.SetHost(const AValue: string); +begin + FHost := AValue.Trim; +end; + +class procedure THorseProvider.SetIOHandleSSL(const AValue: IHorseProviderIOHandleSSL); +begin + FHorseProviderIOHandleSSL := AValue; +end; + +class procedure THorseProvider.SetListenQueue(const AValue: Integer); +begin + FListenQueue := AValue; +end; + +class procedure THorseProvider.SetMaxConnections(const AValue: Integer); +begin + FMaxConnections := AValue; +end; + +class procedure THorseProvider.SetPort(const AValue: Integer); +begin + FPort := AValue; +end; + +class destructor THorseProvider.UnInitialize; +begin + FreeAndNil(FIdHTTPWebBrokerBridge); +end; + +initialization + THorseProvider.SetKeepConnectionAlive(True); +{$ENDIF} + +end. diff --git a/src/Horse.Request.pas b/src/Horse.Request.pas index b8e839d..37fc0e2 100644 --- a/src/Horse.Request.pas +++ b/src/Horse.Request.pas @@ -1,4 +1,4 @@ -unit Horse.Request; +unit Horse.Request; {$IF DEFINED(FPC)} {$MODE DELPHI}{$H+} @@ -34,6 +34,37 @@ THorseRequest = class FBody: TObject; FSession: TObject; FSessions: THorseSessions; +{ =========================================================================== + PATCH-REQ-3 — CrossSocket shadow fields (populated by Populate, nil by default) + =========================================================================== } + FCSMethod: string; + FCSMethodType: TMethodType; + FCSPathInfo: string; + FCSContentType: string; + FCSRemoteAddr: string; +{ =========================================================================== } +{ =========================================================================== + PATCH-REQ-8 — Owned TWebRequest / TRequest adapter for middleware + compatibility on the CrossSocket path. + + Problem solved: + Existing middleware (e.g. Horse.CORS) reads Req.RawWebRequest.Method / .Host / + .GetFieldByName(...). Before this patch, RawWebRequest returned the raw + FWebRequest, which is nil on the CrossSocket path — every such call AV'd. + + Design: + The CrossSocket provider's TRequestBridge.Populate constructs a concrete + TCrossSocketWebRequest (subclass of TWebRequest on Delphi / TRequest on FPC) + backed by ICrossHttpRequest, and hands it to SetCSRawWebRequest. THorseRequest + OWNS the adapter: Clear and Destroy free it. + + Field stays nil on the Indy path — FWebRequest remains the authoritative source + there (owned by the Indy provider, as before). + + See: Horse.Provider.CrossSocket.WebRequestAdapter.pas + =========================================================================== } + FCSRawWebRequest: {$IF DEFINED(FPC)}TRequest{$ELSE}TWebRequest{$ENDIF}; +{ =========================================================================== } procedure InitializeQuery; procedure InitializeParams; procedure InitializeContentFields; @@ -58,13 +89,94 @@ THorseRequest = class function Host: string; virtual; function PathInfo: string; virtual; function RawWebRequest: {$IF DEFINED(FPC)}TRequest{$ELSE}TWebRequest{$ENDIF}; virtual; - constructor Create(const AWebRequest: {$IF DEFINED(FPC)}TRequest{$ELSE}TWebRequest{$ENDIF}); + constructor Create(const AWebRequest: {$IF DEFINED(FPC)}TRequest{$ELSE}TWebRequest{$ENDIF}); overload; +{ =========================================================================== + PATCH-REQ-1 — added parameterless constructor overload + Reason: THorseContextPool.WarmUp pre-allocates THorseRequest instances at + application startup, before any HTTP request arrives and before any + TWebRequest exists. The pool calls this overload; the original constructor + is completely unchanged and continues to be used by the Indy provider. + =========================================================================== } + constructor Create; overload; +{ =========================================================================== } +{ =========================================================================== + PATCH-REQ-2 — added Clear procedure + Reason: THorseContext.Reset recycles pooled objects between requests + without Free/Create overhead. Rules enforced: + • FBody — set to nil, NEVER freed (non-owning CrossSocket buffer ref) + • FSession — set to nil (stale session = wrong-request auth) + • FWebRequest — set to nil (belongs to previous Indy context) + • param collections — cleared in place, objects reused + =========================================================================== } + procedure Clear; +{ =========================================================================== } +{ =========================================================================== + PATCH-REQ-3 — added Populate procedure and RemoteAddr function + Reason: The CrossSocket bridge must inject per-request values directly + into THorseRequest without a live TWebRequest. All fields below were + previously read-only delegations to FWebRequest; they now have private + shadow fields that are populated here and returned when FWebRequest is nil. + + Fields injected via Populate: + FCSMethod — method string ('GET','POST',…) + FCSMethodType — parsed TMethodType + FCSPathInfo — decoded path ('/api/users/1') + FCSContentType — Content-Type header value + FCSRemoteAddr — real peer socket address + + RemoteAddr is a new public function (no equivalent existed before). + MethodType, ContentType, PathInfo fall through to the CS fields when + FWebRequest is nil (nil-guard added to each implementation). + =========================================================================== } + procedure Populate( + const AMethod: string; + AMethodType: TMethodType; + const APath: string; + const AContentType: string; + const ARemoteAddr: string + ); + function RemoteAddr: string; virtual; +{ =========================================================================== + PATCH-REQ-5 — RawPathInfo + Returns the undecoded (percent-encoded) request path on the Delphi/Indy + path — preserving the exact value THorseRouterTree.Execute previously read + from ARequest.RawWebRequest.RawPathInfo. + + Three execution paths: + CrossSocket FWebRequest = nil → return FCSPathInfo (CrossSocket's own + URL parser supplies a decoded path; the router treats it + the same way it treated RawPathInfo on Indy). + Delphi/Indy return FWebRequest.RawPathInfo (undecoded, original behaviour). + FPC/Indy TRequest has no RawPathInfo → return FWebRequest.PathInfo + (unchanged from the pre-patch router behaviour on FPC). + + THorseRouterTree.Execute (PATCH-TREE-1) calls this instead of PathInfo so + that percent-encoded URLs continue to route correctly on the Indy path. + =========================================================================== } + function RawPathInfo: string; virtual; +{ =========================================================================== + PATCH-REQ-4 — PopulateCookiesFromHeader + Parses the raw "Cookie: name=value; name2=value2" header string into the + FCookie param collection. Called by the CrossSocket request bridge after + Populate() so that Req.Cookie works on the CrossSocket path without any + dependency on FWebRequest. + =========================================================================== } + procedure PopulateCookiesFromHeader(const ACookieHeader: string); +{ =========================================================================== } +{ =========================================================================== + PATCH-REQ-8 — setter for the owned RawWebRequest adapter. Called once per + request by the CrossSocket bridge right after Populate / header / cookie + population. Replaces any prior adapter instance (defence in depth — + Clear normally nils it first). + =========================================================================== } + procedure SetCSRawWebRequest(const ARawWebRequest: {$IF DEFINED(FPC)}TRequest{$ELSE}TWebRequest{$ENDIF}); +{ =========================================================================== } destructor Destroy; override; end; implementation -uses +uses {$IF DEFINED(FPC)} Classes, {$ELSE} @@ -72,8 +184,39 @@ implementation {$ENDIF} Horse.Core.Param.Header; +{ =========================================================================== + PATCH-REQ-5 — Body: string nil-guard + On the CrossSocket path FWebRequest is nil. FBody holds a non-owning + reference to the CrossSocket receive buffer (a TStream). Read and return + its contents as a UTF-8 string. If FBody is nil or not a stream, return + an empty string so that callers that check Body <> '' still work. + =========================================================================== } function THorseRequest.Body: string; +{$IF NOT DEFINED(FPC)} +var + LStream: TStream; + LBytes: TBytes; +{$ENDIF} begin + if not Assigned(FWebRequest) then + begin +{$IF DEFINED(FPC)} + Result := ''; +{$ELSE} + if Assigned(FBody) and (FBody is TStream) then + begin + LStream := TStream(FBody); + LStream.Position := 0; + SetLength(LBytes, LStream.Size); + if LStream.Size > 0 then + LStream.Read(LBytes[0], LStream.Size); + Result := TEncoding.UTF8.GetString(LBytes); + end + else + Result := ''; +{$ENDIF} + Exit; + end; Result := FWebRequest.Content; end; @@ -115,6 +258,75 @@ constructor THorseRequest.Create(const AWebRequest: {$IF DEFINED(FPC)}TRequest{$ FSessions := THorseSessions.Create; end; +{ =========================================================================== + PATCH-REQ-1 — parameterless constructor implementation + =========================================================================== } +constructor THorseRequest.Create; +begin + FWebRequest := nil; + FSessions := THorseSessions.Create; +end; +{ =========================================================================== } + +{ =========================================================================== + PATCH-REQ-2 — Clear implementation + THorseCoreParam owns FParams (a TDictionary<string,string>) which is + exposed via the public Dictionary property. Calling Dictionary.Clear + wipes all entries in-place without freeing the THorseCoreParam object + itself, so the next request reuses the same objects with no heap churn. + FContent is a lazy TStrings cache inside THorseCoreParam — it is freed + and nil-ed here via FreeAndNil on the param object then recreated by the + next InitializeXxx call. Because FContent is private to THorseCoreParam + the cleanest way to reset it is to FreeAndNil the whole THorseCoreParam + and let the lazy accessor rebuild it, which is what the destructor does. + We therefore use Dictionary.Clear for the hot-path wipe and rely on the + lazy InitializeXxx pattern (already used everywhere in this class) when + a full reset including FContent is required. + Strategy per field: + FHeaders — Dictionary.Clear (header map reused, no FContent used) + FQuery — FreeAndNil + lazy rebuild via InitializeQuery + FParams — Dictionary.Clear (route params repopulated by router) + FContentFields— FreeAndNil + lazy rebuild via InitializeContentFields + FCookie — FreeAndNil + lazy rebuild via InitializeCookie + FSessions — FreeAndNil + Create (no lazy init method exists) + =========================================================================== } +procedure THorseRequest.Clear; +begin + FWebRequest := nil; + // FBody: non-owning reference into CrossSocket's socket buffer. + // Must be set to nil here. NEVER call FBody.Free — doing so corrupts + // the live TCP connection. The pool Reset sets FBody := nil before + // calling Clear, but we enforce the contract here as a safety net. + FBody := nil; + FSession := nil; +{ PATCH-REQ-3 — wipe shadow fields so next request starts clean } + FCSMethod := ''; + FCSMethodType := mtAny; + FCSPathInfo := ''; + FCSContentType := ''; + FCSRemoteAddr := ''; +{ end PATCH-REQ-3 } +{ PATCH-REQ-8 — free the per-request TWebRequest adapter (owned). + Nil on the Indy path (never assigned there); owned on CrossSocket path. } + if Assigned(FCSRawWebRequest) then + FreeAndNil(FCSRawWebRequest); +{ end PATCH-REQ-8 } + if Assigned(FHeaders) then + FHeaders.Dictionary.Clear; + if Assigned(FQuery) then + FreeAndNil(FQuery); + if Assigned(FParams) then + FParams.Dictionary.Clear; + if Assigned(FContentFields) then + FreeAndNil(FContentFields); + if Assigned(FCookie) then + FreeAndNil(FCookie); + if Assigned(FSessions) then + FreeAndNil(FSessions); + FSessions := THorseSessions.Create; +end; +{ =========================================================================== } + destructor THorseRequest.Destroy; begin if Assigned(FHeaders) then @@ -131,6 +343,12 @@ destructor THorseRequest.Destroy; FBody.Free; if Assigned(FSessions) then FSessions.Free; +{ PATCH-REQ-8 — free the owned TWebRequest adapter if Clear was not called + before Destroy (e.g. pool shutdown path). Safe because FCSRawWebRequest is + only ever populated on the CrossSocket path and is owned by THorseRequest. } + if Assigned(FCSRawWebRequest) then + FCSRawWebRequest.Free; +{ end PATCH-REQ-8 } inherited; end; @@ -140,19 +358,47 @@ function THorseRequest.Headers: THorseCoreParam; begin if not Assigned(FHeaders) then begin +{ PATCH-REQ-3 — nil-guard: when FWebRequest is nil (CrossSocket path), + Populate already called InitializeHeaders which set FHeaders. + If somehow we arrive here with FWebRequest=nil and FHeaders=nil, + create an empty param rather than crashing on GetHeaders(nil). } + if not Assigned(FWebRequest) then + begin + FHeaders := THorseCoreParam.Create(THorseList.Create).Required(False); + Exit(FHeaders); + end; +{ end PATCH-REQ-3 } LParam := THorseCoreParamHeader.GetHeaders(FWebRequest); FHeaders := THorseCoreParam.Create(LParam).Required(False); end; Result := FHeaders; end; +{ =========================================================================== + PATCH-REQ-6 — Host nil-guard + On the CrossSocket path FWebRequest is nil. Return the Host header value + from the already-populated FHeaders dictionary. The request bridge + validates Host ([SEC-17]) before populating FHeaders, so it is always + present on valid CrossSocket requests. + =========================================================================== } function THorseRequest.Host: string; begin + if not Assigned(FWebRequest) then + begin + Result := ''; + if Assigned(FHeaders) then + FHeaders.Dictionary.TryGetValue('Host', Result); + Exit; + end; Result := FWebRequest.Host; end; function THorseRequest.ContentType: string; begin +{ PATCH-REQ-3 — nil-guard } + if not Assigned(FWebRequest) then + Exit(FCSContentType); +{ end PATCH-REQ-3 } Result := FWebRequest.ContentType; end; @@ -160,6 +406,10 @@ function THorseRequest.PathInfo: string; var LPrefix: string; begin +{ PATCH-REQ-3 — nil-guard } + if not Assigned(FWebRequest) then + Exit(FCSPathInfo); +{ end PATCH-REQ-3 } LPrefix := EmptyStr; if FWebRequest.PathInfo = EmptyStr then LPrefix := '/'; @@ -177,6 +427,14 @@ procedure THorseRequest.InitializeContentFields; LValue: String; begin FContentFields := THorseCoreParam.Create(THorseList.Create).Required(False); +{ PATCH-REQ-4 — nil-guard: on CrossSocket path FWebRequest is nil. + Multipart / form-url-encoded body parsing is the responsibility of + application-level middleware on the CrossSocket path (e.g. a middleware + that reads Req.Body and parses it manually). We simply return an empty + param collection here rather than crashing on nil FWebRequest. } + if not Assigned(FWebRequest) then + Exit; +{ end PATCH-REQ-4 } if (not CanLoadContentFields) then Exit; @@ -228,6 +486,13 @@ procedure THorseRequest.InitializeCookie; LItem: string; begin FCookie := THorseCoreParam.Create(THorseList.Create).Required(False); +{ PATCH-REQ-4 — nil-guard: on CrossSocket path FWebRequest is nil. + Cookie parsing from the raw header string is handled by + THorseRequest.PopulateCookiesFromHeader, called by the CrossSocket bridge + after Populate(). Nothing to do here on that path. } + if not Assigned(FWebRequest) then + Exit; +{ end PATCH-REQ-4 } for LItem in FWebRequest.CookieFields do begin LParam := LItem.Split(['=']); @@ -240,12 +505,23 @@ procedure THorseRequest.InitializeParams; FParams := THorseCoreParam.Create(THorseList.Create).Required(True); end; +{ =========================================================================== + PATCH-REQ-7 — InitializeQuery nil-guard + On the CrossSocket path FWebRequest is nil. Query parameters are + pre-populated by the CrossSocket request bridge directly via + AHorseReq.Query.Dictionary.AddOrSetValue, which triggers this method + as the lazy initialiser (FQuery is nil on first call). We create the + empty param collection and return early — the bridge then populates it. + Accessing FWebRequest.QueryFields on the CrossSocket path would crash. + =========================================================================== } procedure THorseRequest.InitializeQuery; var LItem, LKey, LValue: string; LEqualFirstPos: Integer; begin FQuery := THorseCoreParam.Create(THorseList.Create).Required(False); + if not Assigned(FWebRequest) then + Exit; // CrossSocket path: bridge populates query dict directly for LItem in FWebRequest.QueryFields do begin LEqualFirstPos := Pos('=', LItem); @@ -294,6 +570,10 @@ function THorseRequest.IsMultipartForm: Boolean; function THorseRequest.MethodType: TMethodType; begin +{ PATCH-REQ-3 — nil-guard: return shadow field when FWebRequest is nil } + if not Assigned(FWebRequest) then + Exit(FCSMethodType); +{ end PATCH-REQ-3 } Result := {$IF DEFINED(FPC)}StringCommandToMethodType(FWebRequest.Method); {$ELSE}FWebRequest.MethodType; {$ENDIF} end; @@ -313,7 +593,15 @@ function THorseRequest.Query: THorseCoreParam; function THorseRequest.RawWebRequest: {$IF DEFINED(FPC)}TRequest{$ELSE}TWebRequest{$ENDIF}; begin - Result := FWebRequest; +{ PATCH-REQ-8 — return the CrossSocket-path adapter when the Indy-path + FWebRequest is nil, so existing middleware that calls + Req.RawWebRequest.Method / .Host / .GetFieldByName(...) + works unchanged on the CrossSocket path. See + Horse.Provider.CrossSocket.WebRequestAdapter. } + if Assigned(FWebRequest) then + Exit(FWebRequest); + Result := FCSRawWebRequest; +{ end PATCH-REQ-8 } end; function THorseRequest.Session(const ASession: TObject): THorseRequest; @@ -332,4 +620,105 @@ function THorseRequest.Sessions: THorseSessions; Result := FSessions; end; +{ =========================================================================== + PATCH-REQ-3 — Populate implementation + Called once per request by the CrossSocket bridge AFTER the pool returns + a context. Sets the five shadow fields and pre-builds FHeaders so the + lazy Headers() accessor never calls GetHeaders(nil). + =========================================================================== } +procedure THorseRequest.Populate( + const AMethod: string; + AMethodType: TMethodType; + const APath: string; + const AContentType: string; + const ARemoteAddr: string +); +begin + FCSMethod := AMethod; + FCSMethodType := AMethodType; + FCSPathInfo := APath; + FCSContentType := AContentType; + FCSRemoteAddr := ARemoteAddr; + + // Pre-build FHeaders as an empty container so the lazy init in Headers() + // never reaches THorseCoreParamHeader.GetHeaders(nil). + // The bridge then populates it via FHeaders.Dictionary.AddOrSetValue. + if not Assigned(FHeaders) then + FHeaders := THorseCoreParam.Create(THorseList.Create).Required(False) + else + FHeaders.Dictionary.Clear; +end; + +function THorseRequest.RemoteAddr: string; +begin + Result := FCSRemoteAddr; +end; + +{ =========================================================================== + PATCH-REQ-5 — RawPathInfo implementation + =========================================================================== } +function THorseRequest.RawPathInfo: string; +begin + if not Assigned(FWebRequest) then + Exit(FCSPathInfo); +{$IF DEFINED(FPC)} + Result := FWebRequest.PathInfo; +{$ELSE} + Result := FWebRequest.RawPathInfo; +{$ENDIF} +end; +{ =========================================================================== } + +{ =========================================================================== + PATCH-REQ-4 — PopulateCookiesFromHeader implementation + Parses the RFC 6265 Cookie header value: + "name=value; name2=value2; ..." + Each pair is split on the first '=' so values that themselves contain '=' + (e.g. Base64) are preserved intact. + Leading/trailing whitespace around names and values is trimmed. + FCookie is pre-built by InitializeCookie (which returns early on the + CrossSocket path), so we just call AddOrSetValue here. + =========================================================================== } +procedure THorseRequest.PopulateCookiesFromHeader(const ACookieHeader: string); +var + Pairs: TArray<string>; + Pair: string; + EqPos: Integer; + CName, CValue: string; +begin + if ACookieHeader = '' then + Exit; + + // Ensure FCookie is initialised (InitializeCookie is idempotent — it will + // return immediately after creating an empty collection on CrossSocket path) + if not Assigned(FCookie) then + FCookie := THorseCoreParam.Create(THorseList.Create).Required(False); + + Pairs := ACookieHeader.Split([';']); + for Pair in Pairs do + begin + EqPos := Pos('=', Pair); + if EqPos < 2 then Continue; // skip malformed / empty-name pairs + CName := Trim(Copy(Pair, 1, EqPos - 1)); + CValue := Trim(Copy(Pair, EqPos + 1, MaxInt)); + if CName = '' then Continue; + FCookie.Dictionary.AddOrSetValue(CName, CValue); + end; +end; +{ =========================================================================== } + +{ =========================================================================== + PATCH-REQ-8 — SetCSRawWebRequest implementation + Called once per request by TRequestBridge.Populate. Replaces any existing + adapter (defensive; the normal path is Clear -> nil -> Populate -> set). + =========================================================================== } +procedure THorseRequest.SetCSRawWebRequest( + const ARawWebRequest: {$IF DEFINED(FPC)}TRequest{$ELSE}TWebRequest{$ENDIF}); +begin + if Assigned(FCSRawWebRequest) and (FCSRawWebRequest <> ARawWebRequest) then + FreeAndNil(FCSRawWebRequest); + FCSRawWebRequest := ARawWebRequest; +end; +{ =========================================================================== } + end. diff --git a/src/Horse.Response.pas b/src/Horse.Response.pas index 9b530c1..23c6e4d 100644 --- a/src/Horse.Response.pas +++ b/src/Horse.Response.pas @@ -18,6 +18,15 @@ interface Web.ReqMulti, {$ENDIF} {$ENDIF} +{ =========================================================================== + PATCH-RES-1 — added System.Generics.Collections (Delphi only) + Reason: FCustomHeaders is TList<TPair<string,string>> on Delphi. + FPC path uses TStringList (Classes) which is already imported above. + =========================================================================== } +{$IF NOT DEFINED(FPC)} + System.Generics.Collections, +{$ENDIF} +{ =========================================================================== } Horse.Commons; type @@ -25,6 +34,51 @@ THorseResponse = class private FWebResponse: {$IF DEFINED(FPC)}TResponse{$ELSE}TWebResponse{$ENDIF}; FContent: TObject; +{ =========================================================================== + PATCH-RES-1 — added FCustomHeaders field + Reason: CrossSocket has no TWebResponse. TResponseBridge.CopyHeaders + iterates this list directly to write headers to ICrossHttpResponse. + AddHeader writes to both FWebResponse.SetCustomHeader (Indy path) and + this map (CrossSocket path) so all existing middleware that calls + Res.AddHeader continues to work on both providers without any change. + + Delphi: TDictionary<string,string> — O(1) lookup; last value wins for + duplicate keys (AddOrSetValue overwrites). + FPC: TStringList — same key=value string storage used on the Lazarus path. + =========================================================================== } + FCustomHeaders: {$IF NOT DEFINED(FPC)}TDictionary<string, string>{$ELSE}TStringList{$ENDIF}; +{ =========================================================================== } +{ =========================================================================== + PATCH-RES-4 — CrossSocket shadow fields + Reason: On the CrossSocket path FWebResponse is nil (no TWebResponse exists). + Every public method that previously wrote to FWebResponse now checks for nil + and falls through to these fields instead. The bridge reads them via the + read-only properties BodyText, ContentStream, and CSContentType. + + FCSStatusCode — integer HTTP status (default 200) + FCSBody — string body set by Send(string) or Send<T> + FCSContentType — Content-Type set by ContentType(string) or SendFile + FCSContentStream — stream body set by SendFile/Download/Render + =========================================================================== } + FCSStatusCode: Integer; + FCSBody: string; + FCSContentType: string; + FCSContentStream: TStream; // non-owning — caller retains ownership +{ =========================================================================== } +{ =========================================================================== + PATCH-RES-6 — owned RawWebResponse adapter for CrossSocket path + Mirrors PATCH-REQ-8: when FWebResponse is nil (CrossSocket), middleware that + calls Res.RawWebResponse.SetCustomHeader(...) — e.g. Horse.CORS — would + crash with an AV. This field holds a TCrossSocketWebResponse adapter so + RawWebResponse returns a non-nil value. + + Owned by THorseResponse: Clear frees it; Destroy frees it. + Nil on the Indy path (FWebResponse is the authoritative source there). + + See: Horse.Provider.CrossSocket.WebResponseAdapter.pas + =========================================================================== } + FCSRawWebResponse: {$IF DEFINED(FPC)}TResponse{$ELSE}TWebResponse{$ENDIF}; +{ =========================================================================== } public function Send(const AContent: string): THorseResponse; overload; virtual; function Send<T{$IF NOT DEFINED(FPC)}: class{$ENDIF}>(AContent: T): THorseResponse; overload; @@ -46,6 +100,40 @@ THorseResponse = class function ContentType(const AContentType: string): THorseResponse; virtual; function RawWebResponse: {$IF DEFINED(FPC)}TResponse{$ELSE}TWebResponse{$ENDIF}; virtual; constructor Create(const AWebResponse: {$IF DEFINED(FPC)}TResponse{$ELSE}TWebResponse{$ENDIF}); +{ =========================================================================== + PATCH-RES-2 — added Clear procedure + Reason: THorseContext.Reset recycles pooled objects between requests. + Resets FContent and clears FCustomHeaders in place (dictionary object + reused — avoids heap churn on the request hot path). + FWebResponse is set to nil — belongs to the previous Indy context. + =========================================================================== } + procedure Clear; +{ =========================================================================== } +{ =========================================================================== + PATCH-RES-6 — setter for the owned RawWebResponse adapter. Called once per + request by the CrossSocket provider after pool acquire. Replaces any prior + adapter instance (defence in depth — Clear normally nils it first). + =========================================================================== } + procedure SetCSRawWebResponse(const ARawWebResponse: {$IF DEFINED(FPC)}TResponse{$ELSE}TWebResponse{$ENDIF}); +{ =========================================================================== } +{ =========================================================================== + PATCH-RES-3 — added CustomHeaders read-only property + Reason: TResponseBridge.CopyHeaders reads this property to iterate and + forward response headers to ICrossHttpResponse. Read-only — the bridge + iterates only; all writes go through AddHeader as before. + =========================================================================== } + property CustomHeaders: {$IF NOT DEFINED(FPC)}TDictionary<string, string>{$ELSE}TStringList{$ENDIF} read FCustomHeaders; +{ =========================================================================== } +{ =========================================================================== + PATCH-RES-4 — read-only properties for the CrossSocket bridge + TResponseBridge.Flush reads these to write the response body and + Content-Type to ICrossHttpResponse. All three are populated only when + FWebResponse is nil (CrossSocket path); on the Indy path they are empty. + =========================================================================== } + property BodyText: string read FCSBody; + property ContentStream: TStream read FCSContentStream; + property CSContentType: string read FCSContentType; +{ =========================================================================== } destructor Destroy; override; end; @@ -62,7 +150,20 @@ implementation function THorseResponse.AddHeader(const AName, AValue: string): THorseResponse; begin - FWebResponse.SetCustomHeader(AName, AValue); +{ PATCH-RES-4 — nil-guard: skip FWebResponse on CrossSocket path } + if Assigned(FWebResponse) then + FWebResponse.SetCustomHeader(AName, AValue); +{ end PATCH-RES-4 } +{ =========================================================================== + PATCH-RES-1 — also populate FCustomHeaders so CrossSocket bridge can read it. + Delphi: TDictionary.AddOrSetValue FPC: TStringList.Values[name] := value + =========================================================================== } +{$IF NOT DEFINED(FPC)} + FCustomHeaders.AddOrSetValue(AName, AValue); +{$ELSE} + FCustomHeaders.Values[AName] := AValue; +{$ENDIF} +{ =========================================================================== } Result := Self; end; @@ -79,6 +180,13 @@ function THorseResponse.Content: TObject; function THorseResponse.ContentType(const AContentType: string): THorseResponse; begin +{ PATCH-RES-4 — nil-guard } + if not Assigned(FWebResponse) then + begin + FCSContentType := AContentType; + Exit(Self); + end; +{ end PATCH-RES-4 } FWebResponse.ContentType := AContentType; Result := Self; end; @@ -86,26 +194,116 @@ function THorseResponse.ContentType(const AContentType: string): THorseResponse; constructor THorseResponse.Create(const AWebResponse: {$IF DEFINED(FPC)}TResponse{$ELSE}TWebResponse{$ENDIF}); begin FWebResponse := AWebResponse; +{ PATCH-RES-4 — initialise FCSStatusCode to 200 (HTTP OK) } + FCSStatusCode := 200; +{ end PATCH-RES-4 } + if Assigned(FWebResponse) then + begin {$IF DEFINED(FPC)}FWebResponse.Code{$ELSE}FWebResponse.StatusCode{$ENDIF} := THTTPStatus.Ok.ToInteger; {$IF DEFINED(FPC)} - FWebResponse.FreeContentStream := True; + FWebResponse.FreeContentStream := True; {$ENDIF} + end; +{ =========================================================================== + PATCH-RES-1 — initialise FCustomHeaders + Delphi: TDictionary<string,string> FPC: TStringList + =========================================================================== } +{$IF NOT DEFINED(FPC)} + FCustomHeaders := TDictionary<string, string>.Create; +{$ELSE} + FCustomHeaders := TStringList.Create; +{$ENDIF} +{ =========================================================================== } end; +{ =========================================================================== + PATCH-RES-2 — Clear implementation + =========================================================================== } +procedure THorseResponse.Clear; +begin + FWebResponse := nil; + FContent := nil; + if Assigned(FCustomHeaders) then + FCustomHeaders.Clear; +{ PATCH-RES-4 — wipe CrossSocket shadow fields } + FCSBody := ''; + FCSContentType := ''; + FCSContentStream := nil; // non-owning — never free here + FCSStatusCode := 200; +{ end PATCH-RES-4 } +{ PATCH-RES-6 — free the per-request TWebResponse adapter (owned). + Nil on the Indy path (never assigned there); owned on CrossSocket path. } + if Assigned(FCSRawWebResponse) then + FreeAndNil(FCSRawWebResponse); +{ end PATCH-RES-6 } +end; +{ =========================================================================== } + +{ =========================================================================== + PATCH-RES-6 — SetCSRawWebResponse implementation + =========================================================================== } +procedure THorseResponse.SetCSRawWebResponse( + const ARawWebResponse: {$IF DEFINED(FPC)}TResponse{$ELSE}TWebResponse{$ENDIF}); +begin + if Assigned(FCSRawWebResponse) and (FCSRawWebResponse <> ARawWebResponse) then + FreeAndNil(FCSRawWebResponse); + FCSRawWebResponse := ARawWebResponse; +end; +{ =========================================================================== } + destructor THorseResponse.Destroy; begin if Assigned(FContent) then FContent.Free; +{ =========================================================================== + PATCH-RES-1 — free FCustomHeaders + =========================================================================== } + if Assigned(FCustomHeaders) then + FCustomHeaders.Free; +{ =========================================================================== } +{ PATCH-RES-6 — free the owned TWebResponse adapter if Clear was not called + before Destroy (e.g. pool shutdown path). } + if Assigned(FCSRawWebResponse) then + FCSRawWebResponse.Free; +{ end PATCH-RES-6 } inherited; end; function THorseResponse.RawWebResponse: {$IF DEFINED(FPC)}TResponse{$ELSE}TWebResponse{$ENDIF}; begin - Result := FWebResponse; +{ PATCH-RES-6 — return the CrossSocket adapter when FWebResponse is nil, + so middleware calling Res.RawWebResponse.SetCustomHeader (e.g. Horse.CORS) + works on the CrossSocket path without an AV. } + if Assigned(FWebResponse) then + Exit(FWebResponse); + Result := FCSRawWebResponse; +{ end PATCH-RES-6 } end; function THorseResponse.Send(const AContent: string): THorseResponse; begin +{ PATCH-RES-4 — nil-guard } + if not Assigned(FWebResponse) then + begin + FCSBody := AContent; + Exit(Self); + end; +{ end PATCH-RES-4 } +{$IF NOT DEFINED(FPC)} +{ PATCH-RES-5 — Indy empty-body fix + When ContentText = '' and ContentStream = nil, TIdHTTPResponseInfo.WriteContent + substitutes a default HTML body (<HTML><BODY><B>200 OK</B></BODY></HTML>). + Assigning an empty TMemoryStream forces Indy into the stream path: it sends + 0 bytes and no HTML is generated. FreeContentStream defaults to True so Indy + owns and frees the stream. } + if AContent = '' then + begin + FWebResponse.ContentStream := TMemoryStream.Create; + FWebResponse.ContentLength := 0; + Exit(Self); + end; +{ end PATCH-RES-5 } +{$ENDIF} FWebResponse.Content := AContent; Result := Self; end; @@ -118,13 +316,25 @@ function THorseResponse.Send<T>(AContent: T): THorseResponse; function THorseResponse.RedirectTo(const ALocation: string): THorseResponse; begin - FWebResponse.SetCustomHeader('Location', ALocation); +{ PATCH-RES-4 — nil-guard: on CrossSocket path FWebResponse is nil; + AddHeader already dual-writes to FCustomHeaders so Location is captured. + Status delegates to FCSStatusCode when FWebResponse is nil. } + if Assigned(FWebResponse) then + FWebResponse.SetCustomHeader('Location', ALocation) + else + AddHeader('Location', ALocation); +{ end PATCH-RES-4 } Result := Status(THTTPStatus.SeeOther); end; function THorseResponse.RedirectTo(const ALocation: string; const AStatus: THTTPStatus): THorseResponse; begin - FWebResponse.SetCustomHeader('Location', ALocation); +{ PATCH-RES-4 — nil-guard } + if Assigned(FWebResponse) then + FWebResponse.SetCustomHeader('Location', ALocation) + else + AddHeader('Location', ALocation); +{ end PATCH-RES-4 } Result := Status(AStatus); end; @@ -132,33 +342,70 @@ function THorseResponse.RemoveHeader(const AName: string): THorseResponse; var I: Integer; begin - I := FWebResponse.CustomHeaders.IndexOfName(AName); - if I <> -1 then - FWebResponse.CustomHeaders.Delete(I); +{ PATCH-RES-4 — nil-guard: skip FWebResponse access on CrossSocket path } + if Assigned(FWebResponse) then + begin + I := FWebResponse.CustomHeaders.IndexOfName(AName); + if I <> -1 then + FWebResponse.CustomHeaders.Delete(I); + end; +{ end PATCH-RES-4 } +{ =========================================================================== + PATCH-RES-1 — also remove from FCustomHeaders + Delphi: TDictionary.Remove FPC: TStringList delete by IndexOfName + =========================================================================== } +{$IF NOT DEFINED(FPC)} + FCustomHeaders.Remove(AName); +{$ELSE} + I := FCustomHeaders.IndexOfName(AName); + if I >= 0 then + FCustomHeaders.Delete(I); +{$ENDIF} +{ =========================================================================== } Result := Self; end; function THorseResponse.Status(const AStatus: THTTPStatus): THorseResponse; begin +{ PATCH-RES-4 — nil-guard } + if not Assigned(FWebResponse) then + begin + FCSStatusCode := AStatus.ToInteger; + Exit(Self); + end; +{ end PATCH-RES-4 } {$IF DEFINED(FPC)}FWebResponse.Code{$ELSE}FWebResponse.StatusCode{$ENDIF} := AStatus.ToInteger; Result := Self; end; function THorseResponse.SendFile(const AFileStream: TStream; const AFileName: string; const AContentType: string): THorseResponse; var - LFileName: string; + LFileName: string; + LContentType: string; begin Result := Self; AFileStream.Position := 0; - LFileName := ExtractFileName(AFileName); + LFileName := ExtractFileName(AFileName); + LContentType := AContentType; + if LContentType = EmptyStr then + LContentType := Horse.Mime.THorseMimeTypes.GetFileType(LFileName); + +{ PATCH-RES-4 — nil-guard: CrossSocket path captures stream + type as shadow fields } + if not Assigned(FWebResponse) then + begin + FCSContentStream := AFileStream; // non-owning + FCSContentType := LContentType; + AddHeader('Content-Disposition', Format('inline; filename="%s"', [LFileName])); + Exit; + end; +{ end PATCH-RES-4 } FWebResponse.FreeContentStream := False; FWebResponse.ContentLength := AFileStream.Size; FWebResponse.ContentStream := AFileStream; FWebResponse.SetCustomHeader('Content-Disposition', Format('inline; filename="%s"', [LFileName])); - - FWebResponse.ContentType := AContentType; - if (AContentType = EmptyStr) then + FWebResponse.ContentType := LContentType; + if (LContentType = EmptyStr) then FWebResponse.ContentType := Horse.Mime.THorseMimeTypes.GetFileType(LFileName); {$IF DEFINED(FPC)} @@ -189,19 +436,32 @@ function THorseResponse.SendFile(const AFileName: string; const AContentType: st function THorseResponse.Download(const AFileStream: TStream; const AFileName: string; const AContentType: string): THorseResponse; var - LFileName: string; + LFileName: string; + LContentType: string; begin Result := Self; AFileStream.Position := 0; - LFileName := ExtractFileName(AFileName); + LFileName := ExtractFileName(AFileName); + LContentType := AContentType; + if LContentType = EmptyStr then + LContentType := Horse.Mime.THorseMimeTypes.GetFileType(LFileName); + +{ PATCH-RES-4 — nil-guard } + if not Assigned(FWebResponse) then + begin + FCSContentStream := AFileStream; // non-owning + FCSContentType := LContentType; + AddHeader('Content-Disposition', Format('attachment; filename="%s"', [LFileName])); + Exit; + end; +{ end PATCH-RES-4 } FWebResponse.FreeContentStream := False; FWebResponse.ContentLength := AFileStream.Size; FWebResponse.ContentStream := AFileStream; FWebResponse.SetCustomHeader('Content-Disposition', Format('attachment; filename="%s"', [LFileName])); - - FWebResponse.ContentType := AContentType; - if (AContentType = EmptyStr) then + FWebResponse.ContentType := LContentType; + if (LContentType = EmptyStr) then FWebResponse.ContentType := Horse.Mime.THorseMimeTypes.GetFileType(LFileName); {$IF DEFINED(FPC)} @@ -245,11 +505,22 @@ function THorseResponse.Render(const AFileName: string): THorseResponse; function THorseResponse.Status: Integer; begin +{ PATCH-RES-4 — nil-guard } + if not Assigned(FWebResponse) then + Exit(FCSStatusCode); +{ end PATCH-RES-4 } Result := {$IF DEFINED(FPC)}FWebResponse.Code{$ELSE}FWebResponse.StatusCode{$ENDIF}; end; function THorseResponse.Status(const AStatus: Integer): THorseResponse; begin +{ PATCH-RES-4 — nil-guard } + if not Assigned(FWebResponse) then + begin + FCSStatusCode := AStatus; + Exit(Self); + end; +{ end PATCH-RES-4 } {$IF DEFINED(FPC)}FWebResponse.Code{$ELSE}FWebResponse.StatusCode{$ENDIF} := AStatus; Result := Self; end; diff --git a/src/Horse.WebModule.dfm b/src/Horse.WebModule.dfm index fe3861f..07723cf 100644 --- a/src/Horse.WebModule.dfm +++ b/src/Horse.WebModule.dfm @@ -1,11 +1,12 @@ -object HorseWebModule: THorseWebModule - Actions = < - item - Default = True - Name = 'DefaultHandler' - PathInfo = '/' - OnAction = HandlerAction - end> - Height = 230 - Width = 415 -end +object HorseWebModule: THorseWebModule + Actions = < + item + Default = True + Name = 'DefaultHandler' + PathInfo = '/' + OnAction = HandlerAction + end> + Height = 345 + Width = 623 + PixelsPerInch = 144 +end diff --git a/src/Horse.pas b/src/Horse.pas index c2399ff..e712352 100644 --- a/src/Horse.pas +++ b/src/Horse.pas @@ -1,4 +1,4 @@ -unit Horse; +unit Horse; {$IF DEFINED(FPC)} {$MODE DELPHI}{$H+} @@ -9,6 +9,9 @@ interface uses {$IF DEFINED(FPC)} SysUtils, + {$IF DEFINED(HORSE_CROSSSOCKET)} + Horse.Provider.CrossSocket, + {$ELSE} Horse.Provider.FPC.HTTPApplication, {$IF DEFINED(HORSE_APACHE)} Horse.Provider.FPC.Apache, @@ -21,9 +24,13 @@ interface {$ELSEIF DEFINED(HORSE_LCL)} Horse.Provider.FPC.LCL, {$ENDIF} + {$ENDIF} {$ELSEIF DEFINED(HORSE_NOPROVIDER)} System.SysUtils, Horse.Provider.Abstract, +{$ELSEIF DEFINED(HORSE_CROSSSOCKET)} + System.SysUtils, + Horse.Provider.CrossSocket, {$ELSE} System.SysUtils, Horse.Provider.Console, @@ -44,7 +51,8 @@ interface Horse.Exception, Horse.Exception.Interrupted, Horse.Core.Param.Config, - Horse.Callback; + Horse.Callback, + Horse.Provider.Config; type EHorseException = Horse.Exception.EHorseException; @@ -65,6 +73,7 @@ interface PHorseModule = Horse.Core.PHorseModule; PHorseCore = Horse.Core.PHorseCore; PHorseRouterTree = Horse.Core.RouterTree.PHorseRouterTree; + THorseCrossSocketConfig = Horse.Provider.Config.THorseCrossSocketConfig; {$IF DEFINED(HORSE_ISAPI)} THorseProvider = Horse.Provider.ISAPI.THorseProvider; @@ -92,16 +101,22 @@ interface {$IF DEFINED(FPC)} Horse.Provider.FPC.Daemon.THorseProvider; {$ELSE} - Horse.Provider.Daemon.THorseProvider; + Horse.Provider.Daemon.THorseProvider; {$ENDIF} {$ELSEIF DEFINED(HORSE_LCL)} - THorseProvider = Horse.Provider.FPC.LCL.THorseProvider; + THorseProvider = Horse.Provider.FPC.LCL.THorseProvider; {$ELSEIF DEFINED(HORSE_VCL)} THorseProvider = Horse.Provider.VCL.THorseProvider; +{$ELSEIF DEFINED(HORSE_CROSSSOCKET)} + THorseProvider = Horse.Provider.CrossSocket.THorseProviderCrossSocket; {$ELSE} THorseProvider = {$IF DEFINED(FPC)} + {$IF DEFINED(HORSE_CROSSSOCKET)} + Horse.Provider.CrossSocket.THorseProviderCrossSocket; + {$ELSE} Horse.Provider.FPC.HTTPApplication.THorseProvider; + {$ENDIF} {$ELSEIF DEFINED(HORSE_NOPROVIDER)} Horse.Provider.Abstract.THorseProviderAbstract; {$ELSE} @@ -113,4 +128,4 @@ THorse = class(THorseProvider); implementation -end. +end. \ No newline at end of file diff --git a/src/Web.WebConst.pas b/src/Web.WebConst.pas index 089232d..e1f0410 100644 --- a/src/Web.WebConst.pas +++ b/src/Web.WebConst.pas @@ -7,6 +7,7 @@ interface {$IF (CompilerVersion > 36.0)} sCannotGenerateSessionId = 'Cannot generate session ID'; + sStreamingNotSupported = 'Reponse streaming is not supported'; {$ENDIF} sOnlyOneDispatcher = 'Only one WebDispatcher per form/data module'; @@ -68,3 +69,4 @@ interface implementation end. + diff --git a/tests/code-coverage/dcov_units.lst b/tests/code-coverage/dcov_units.lst index b4ce9dc..ecf016d 100644 --- a/tests/code-coverage/dcov_units.lst +++ b/tests/code-coverage/dcov_units.lst @@ -1,20 +1,20 @@ -Horse.Commons -Horse.Constants -Horse.Core.Group.Contract -Horse.Core.Group -Horse.Core -Horse.Core.Route.Contract -Horse.Core.Route -Horse.Core.RouterTree -Horse.Exception -Horse.HTTP -Horse -Horse.Provider.Abstract -Horse.Provider.Apache -Horse.Provider.CGI -Horse.Provider.Console -Horse.Provider.Daemon -Horse.Provider.VCL -Horse.Provider.ISAPI -Horse.WebModule +Horse.Commons +Horse.Constants +Horse.Core.Group.Contract +Horse.Core.Group +Horse.Core +Horse.Core.Route.Contract +Horse.Core.Route +Horse.Core.RouterTree +Horse.Exception +Horse.HTTP +Horse +Horse.Provider.Abstract +Horse.Provider.Apache +Horse.Provider.CGI +Horse.Provider.Console +Horse.Provider.Daemon +Horse.Provider.VCL +Horse.Provider.ISAPI +Horse.WebModule Horse.Proc \ No newline at end of file diff --git a/tests/src/Console.dproj b/tests/src/Console.dproj index 02e3b0a..5a10ad5 100644 --- a/tests/src/Console.dproj +++ b/tests/src/Console.dproj @@ -1,1226 +1,1226 @@ -<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> - <PropertyGroup> - <ProjectGuid>{A4A352F5-2896-4539-AE34-A7DF0D94AF4D}</ProjectGuid> - <ProjectVersion>19.4</ProjectVersion> - <FrameworkType>None</FrameworkType> - <MainSource>Console.dpr</MainSource> - <Base>True</Base> - <Config Condition="'$(Config)'==''">Debug</Config> - <Platform Condition="'$(Platform)'==''">Win32</Platform> - <TargetedPlatforms>1</TargetedPlatforms> - <AppType>Console</AppType> - </PropertyGroup> - <PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''"> - <Base>true</Base> - </PropertyGroup> - <PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Base)'=='true') or '$(Base_Win32)'!=''"> - <Base_Win32>true</Base_Win32> - <CfgParent>Base</CfgParent> - <Base>true</Base> - </PropertyGroup> - <PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Base)'=='true') or '$(Base_Win64)'!=''"> - <Base_Win64>true</Base_Win64> - <CfgParent>Base</CfgParent> - <Base>true</Base> - </PropertyGroup> - <PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_1)'!=''"> - <Cfg_1>true</Cfg_1> - <CfgParent>Base</CfgParent> - <Base>true</Base> - </PropertyGroup> - <PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_1)'=='true') or '$(Cfg_1_Win32)'!=''"> - <Cfg_1_Win32>true</Cfg_1_Win32> - <CfgParent>Cfg_1</CfgParent> - <Cfg_1>true</Cfg_1> - <Base>true</Base> - </PropertyGroup> - <PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_2)'!=''"> - <Cfg_2>true</Cfg_2> - <CfgParent>Base</CfgParent> - <Base>true</Base> - </PropertyGroup> - <PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_2)'=='true') or '$(Cfg_2_Win32)'!=''"> - <Cfg_2_Win32>true</Cfg_2_Win32> - <CfgParent>Cfg_2</CfgParent> - <Cfg_2>true</Cfg_2> - <Base>true</Base> - </PropertyGroup> - <PropertyGroup Condition="'$(Config)'=='CI' or '$(Cfg_3)'!=''"> - <Cfg_3>true</Cfg_3> - <CfgParent>Base</CfgParent> - <Base>true</Base> - </PropertyGroup> - <PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_3)'=='true') or '$(Cfg_3_Win32)'!=''"> - <Cfg_3_Win32>true</Cfg_3_Win32> - <CfgParent>Cfg_3</CfgParent> - <Cfg_3>true</Cfg_3> - <Base>true</Base> - </PropertyGroup> - <PropertyGroup Condition="'$(Base)'!=''"> - <DCC_DcuOutput>.\$(Platform)\$(Config)</DCC_DcuOutput> - <DCC_ExeOutput>..\</DCC_ExeOutput> - <DCC_E>false</DCC_E> - <DCC_N>false</DCC_N> - <DCC_S>false</DCC_S> - <DCC_F>false</DCC_F> - <DCC_K>false</DCC_K> - <DCC_Namespace>System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace)</DCC_Namespace> - <Icon_MainIcon>$(BDS)\bin\delphi_PROJECTICON.ico</Icon_MainIcon> - <Icns_MainIcns>$(BDS)\bin\delphi_PROJECTICNS.icns</Icns_MainIcns> - <DCC_UnitSearchPath>modules\.dcp;modules\.dcu;modules;modules\dataset-serialize\src\core;modules\dataset-serialize\src\helpers;modules\dataset-serialize\src\providers;modules\dataset-serialize\src\singletons;modules\dataset-serialize\src\types;modules\horse\src;modules\jhonson\src;modules\restrequest4delphi\src\core;modules\restrequest4delphi\src\interfaces;$(DCC_UnitSearchPath)</DCC_UnitSearchPath> - <SanitizedProjectName>Console</SanitizedProjectName> - <VerInfo_Locale>1046</VerInfo_Locale> - <VerInfo_Keys>CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=</VerInfo_Keys> - <DCC_Define>HORSE_CONSOLE;$(DCC_Define)</DCC_Define> - </PropertyGroup> - <PropertyGroup Condition="'$(Base_Win32)'!=''"> - <DCC_UsePackage>DBXSqliteDriver;IndyIPCommon;RESTComponents;bindcompdbx;DBXInterBaseDriver;vcl;IndyIPServer;vclactnband;RestDatawareCORE;vclFireDAC;IndySystem;tethering;svnui;dsnapcon;FireDACADSDriver;madExcept_;FireDACMSAccDriver;fmxFireDAC;vclimg;madBasic_;FireDAC;vcltouch;vcldb;bindcompfmx;svn;FireDACSqliteDriver;FireDACPgDriver;inetdb;soaprtl;DbxCommonDriver;fmx;FireDACIBDriver;fmxdae;xmlrtl;soapmidas;fmxobj;vclwinx;rtl;madDisAsm_;DbxClientDriver;CustomIPTransport;vcldsnap;dbexpress;IndyCore;RESTDWDriverFD;vclx;bindcomp;appanalytics;dsnap;FireDACCommon;IndyIPClient;bindcompvcl;RESTBackendComponents;VCLRESTComponents;soapserver;dbxcds;VclSmp;adortl;vclie;bindengine;DBXMySQLDriver;CloudService;dsnapxml;FireDACMySQLDriver;dbrtl;IndyProtocols;inetdbxpress;FireDACCommonODBC;FireDACCommonDriver;inet;fmxase;$(DCC_UsePackage)</DCC_UsePackage> - <DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace> - <BT_BuildType>Debug</BT_BuildType> - <VerInfo_Locale>1033</VerInfo_Locale> - <Manifest_File>(None)</Manifest_File> - <DCC_MapFile>3</DCC_MapFile> - </PropertyGroup> - <PropertyGroup Condition="'$(Base_Win64)'!=''"> - <DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace)</DCC_Namespace> - <BT_BuildType>Debug</BT_BuildType> - <VerInfo_Locale>1033</VerInfo_Locale> - <UWP_DelphiLogo44>$(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png</UWP_DelphiLogo44> - <UWP_DelphiLogo150>$(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png</UWP_DelphiLogo150> - </PropertyGroup> - <PropertyGroup Condition="'$(Cfg_1)'!=''"> - <DCC_Define>DEBUG;$(DCC_Define)</DCC_Define> - <DCC_DebugDCUs>true</DCC_DebugDCUs> - <DCC_Optimize>false</DCC_Optimize> - <DCC_GenerateStackFrames>true</DCC_GenerateStackFrames> - <DCC_DebugInfoInExe>true</DCC_DebugInfoInExe> - <DCC_RemoteDebug>true</DCC_RemoteDebug> - </PropertyGroup> - <PropertyGroup Condition="'$(Cfg_1_Win32)'!=''"> - <DCC_RemoteDebug>false</DCC_RemoteDebug> - <VerInfo_Locale>1033</VerInfo_Locale> - <DCC_MapFile>3</DCC_MapFile> - </PropertyGroup> - <PropertyGroup Condition="'$(Cfg_2)'!=''"> - <DCC_LocalDebugSymbols>false</DCC_LocalDebugSymbols> - <DCC_Define>RELEASE;$(DCC_Define)</DCC_Define> - <DCC_SymbolReferenceInfo>0</DCC_SymbolReferenceInfo> - <DCC_DebugInformation>0</DCC_DebugInformation> - </PropertyGroup> - <PropertyGroup Condition="'$(Cfg_2_Win32)'!=''"> - <VerInfo_Locale>1033</VerInfo_Locale> - </PropertyGroup> - <PropertyGroup Condition="'$(Cfg_3)'!=''"> - <DCC_Define>CI;$(DCC_Define)</DCC_Define> - </PropertyGroup> - <PropertyGroup Condition="'$(Cfg_3_Win32)'!=''"> - <VerInfo_Locale>1033</VerInfo_Locale> - </PropertyGroup> - <ItemGroup> - <DelphiCompile Include="$(MainSource)"> - <MainSource>MainSource</MainSource> - </DelphiCompile> - <DCCReference Include="..\..\src\Horse.Commons.pas"/> - <DCCReference Include="..\..\src\Horse.Constants.pas"/> - <DCCReference Include="..\..\src\Horse.Core.Group.Contract.pas"/> - <DCCReference Include="..\..\src\Horse.Core.Group.pas"/> - <DCCReference Include="..\..\src\Horse.Core.pas"/> - <DCCReference Include="..\..\src\Horse.Core.Route.Contract.pas"/> - <DCCReference Include="..\..\src\Horse.Core.Route.pas"/> - <DCCReference Include="..\..\src\Horse.Core.RouterTree.pas"/> - <DCCReference Include="..\..\src\Horse.Exception.pas"/> - <DCCReference Include="..\..\src\Horse.pas"/> - <DCCReference Include="..\..\src\Horse.Provider.Abstract.pas"/> - <DCCReference Include="..\..\src\Horse.Provider.Apache.pas"/> - <DCCReference Include="..\..\src\Horse.Provider.CGI.pas"/> - <DCCReference Include="..\..\src\Horse.Provider.Console.pas"/> - <DCCReference Include="..\..\src\Horse.Provider.Daemon.pas"/> - <DCCReference Include="..\..\src\ThirdParty.Posix.Syslog.pas"/> - <DCCReference Include="..\..\src\Web.WebConst.pas"/> - <DCCReference Include="..\..\src\Horse.Provider.VCL.pas"/> - <DCCReference Include="..\..\src\Horse.Provider.ISAPI.pas"/> - <DCCReference Include="..\..\src\Horse.WebModule.pas"> - <Form>HorseWebModule</Form> - <DesignClass>TWebModule</DesignClass> - </DCCReference> - <DCCReference Include="..\..\src\Horse.Proc.pas"/> - <DCCReference Include="tests\Tests.Api.Console.pas"/> - <DCCReference Include="controllers\Controllers.Api.pas"/> - <DCCReference Include="tests\Tests.Commons.pas"/> - <DCCReference Include="..\..\src\Horse.Core.Param.pas"/> - <DCCReference Include="..\..\src\Horse.Core.Param.Header.pas"/> - <DCCReference Include="..\..\src\Horse.Provider.IOHandleSSL.pas"/> - <DCCReference Include="tests\Tests.Horse.Core.Param.pas"/> - <DCCReference Include="..\..\src\Horse.Core.Param.Field.pas"/> - <DCCReference Include="..\..\src\Horse.Request.pas"/> - <DCCReference Include="..\..\src\Horse.Response.pas"/> - <DCCReference Include="..\..\src\Horse.Core.Param.Config.pas"/> - <DCCReference Include="..\..\src\Horse.Rtti.Helper.pas"/> - <DCCReference Include="..\..\src\Horse.Rtti.pas"/> - <DCCReference Include="..\..\src\Horse.Callback.pas"/> - <DCCReference Include="..\..\src\Horse.Core.RouterTree.NextCaller.pas"/> - <DCCReference Include="..\..\src\Horse.Exception.Interrupted.pas"/> - <DCCReference Include="..\..\src\Horse.Session.pas"/> - <DCCReference Include="..\..\src\Horse.Core.Param.Field.Brackets.pas"/> - <DCCReference Include="..\..\src\Horse.Core.Files.pas"/> - <DCCReference Include="tests\Tests.Horse.Core.Files.pas"/> - <BuildConfiguration Include="Base"> - <Key>Base</Key> - </BuildConfiguration> - <BuildConfiguration Include="Debug"> - <Key>Cfg_1</Key> - <CfgParent>Base</CfgParent> - </BuildConfiguration> - <BuildConfiguration Include="Release"> - <Key>Cfg_2</Key> - <CfgParent>Base</CfgParent> - </BuildConfiguration> - <BuildConfiguration Include="CI"> - <Key>Cfg_3</Key> - <CfgParent>Base</CfgParent> - </BuildConfiguration> - </ItemGroup> - <ProjectExtensions> - <Borland.Personality>Delphi.Personality.12</Borland.Personality> - <Borland.ProjectType>Console</Borland.ProjectType> - <BorlandProject> - <Delphi.Personality> - <Source> - <Source Name="MainSource">Console.dpr</Source> - </Source> - <Excluded_Packages> - <Excluded_Packages Name="$(BDSBIN)\dcloffice2k280.bpl">Microsoft Office 2000 Sample Automation Server Wrapper Components</Excluded_Packages> - <Excluded_Packages Name="$(BDSBIN)\dclofficexp280.bpl">Microsoft Office XP Sample Automation Server Wrapper Components</Excluded_Packages> - </Excluded_Packages> - </Delphi.Personality> - <Deployment Version="3"> - <DeployFile LocalName="$(BDS)\Redist\iossimulator\libcgunwind.1.0.dylib" Class="DependencyModule"> - <Platform Name="iOSSimulator"> - <Overwrite>true</Overwrite> - </Platform> - </DeployFile> - <DeployFile LocalName="$(BDS)\Redist\iossimulator\libpcre.dylib" Class="DependencyModule"> - <Platform Name="iOSSimulator"> - <Overwrite>true</Overwrite> - </Platform> - </DeployFile> - <DeployFile LocalName="$(BDS)\Redist\osx32\libcgunwind.1.0.dylib" Class="DependencyModule"> - <Platform Name="OSX32"> - <Overwrite>true</Overwrite> - </Platform> - </DeployFile> - <DeployFile LocalName="..\Console.exe" Configuration="CI" Class="ProjectOutput"> - <Platform Name="Win32"> - <RemoteName>Console.exe</RemoteName> - <Overwrite>true</Overwrite> - </Platform> - </DeployFile> - <DeployFile LocalName="..\Console.exe" Configuration="Debug" Class="ProjectOutput"> - <Platform Name="Win32"> - <RemoteName>Console.exe</RemoteName> - <Overwrite>true</Overwrite> - </Platform> - </DeployFile> - <DeployClass Name="AdditionalDebugSymbols"> - <Platform Name="OSX32"> - <Operation>1</Operation> - </Platform> - <Platform Name="Win32"> - <Operation>0</Operation> - </Platform> - </DeployClass> - <DeployClass Name="AndroidClasses"> - <Platform Name="Android"> - <RemoteDir>classes</RemoteDir> - <Operation>64</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>classes</RemoteDir> - <Operation>64</Operation> - </Platform> - </DeployClass> - <DeployClass Name="AndroidClassesDexFile"> - <Platform Name="Android"> - <RemoteDir>classes</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>classes</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="AndroidFileProvider"> - <Platform Name="Android"> - <RemoteDir>res\xml</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\xml</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="AndroidGDBServer"> - <Platform Name="Android"> - <RemoteDir>library\lib\armeabi-v7a</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="AndroidLibnativeArmeabiFile"> - <Platform Name="Android"> - <RemoteDir>library\lib\armeabi</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>library\lib\armeabi</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="AndroidLibnativeArmeabiv7aFile"> - <Platform Name="Android64"> - <RemoteDir>library\lib\armeabi-v7a</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="AndroidLibnativeMipsFile"> - <Platform Name="Android"> - <RemoteDir>library\lib\mips</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>library\lib\mips</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="AndroidServiceOutput"> - <Platform Name="Android"> - <RemoteDir>library\lib\armeabi-v7a</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>library\lib\arm64-v8a</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="AndroidServiceOutput_Android32"> - <Platform Name="Android64"> - <RemoteDir>library\lib\armeabi-v7a</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="AndroidSplashImageDef"> - <Platform Name="Android"> - <RemoteDir>res\drawable</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\drawable</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="AndroidSplashStyles"> - <Platform Name="Android"> - <RemoteDir>res\values</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\values</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="AndroidSplashStylesV21"> - <Platform Name="Android"> - <RemoteDir>res\values-v21</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\values-v21</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="Android_Colors"> - <Platform Name="Android"> - <RemoteDir>res\values</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\values</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="Android_DefaultAppIcon"> - <Platform Name="Android"> - <RemoteDir>res\drawable</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\drawable</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="Android_LauncherIcon144"> - <Platform Name="Android"> - <RemoteDir>res\drawable-xxhdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\drawable-xxhdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="Android_LauncherIcon192"> - <Platform Name="Android"> - <RemoteDir>res\drawable-xxxhdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\drawable-xxxhdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="Android_LauncherIcon36"> - <Platform Name="Android"> - <RemoteDir>res\drawable-ldpi</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\drawable-ldpi</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="Android_LauncherIcon48"> - <Platform Name="Android"> - <RemoteDir>res\drawable-mdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\drawable-mdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="Android_LauncherIcon72"> - <Platform Name="Android"> - <RemoteDir>res\drawable-hdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\drawable-hdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="Android_LauncherIcon96"> - <Platform Name="Android"> - <RemoteDir>res\drawable-xhdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\drawable-xhdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="Android_NotificationIcon24"> - <Platform Name="Android"> - <RemoteDir>res\drawable-mdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\drawable-mdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="Android_NotificationIcon36"> - <Platform Name="Android"> - <RemoteDir>res\drawable-hdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\drawable-hdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="Android_NotificationIcon48"> - <Platform Name="Android"> - <RemoteDir>res\drawable-xhdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\drawable-xhdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="Android_NotificationIcon72"> - <Platform Name="Android"> - <RemoteDir>res\drawable-xxhdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\drawable-xxhdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="Android_NotificationIcon96"> - <Platform Name="Android"> - <RemoteDir>res\drawable-xxxhdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\drawable-xxxhdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="Android_SplashImage426"> - <Platform Name="Android"> - <RemoteDir>res\drawable-small</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\drawable-small</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="Android_SplashImage470"> - <Platform Name="Android"> - <RemoteDir>res\drawable-normal</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\drawable-normal</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="Android_SplashImage640"> - <Platform Name="Android"> - <RemoteDir>res\drawable-large</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\drawable-large</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="Android_SplashImage960"> - <Platform Name="Android"> - <RemoteDir>res\drawable-xlarge</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\drawable-xlarge</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="Android_Strings"> - <Platform Name="Android"> - <RemoteDir>res\values</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\values</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="DebugSymbols"> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - </Platform> - <Platform Name="OSX32"> - <Operation>1</Operation> - </Platform> - <Platform Name="Win32"> - <Operation>0</Operation> - </Platform> - </DeployClass> - <DeployClass Name="DependencyFramework"> - <Platform Name="OSX32"> - <Operation>1</Operation> - <Extensions>.framework</Extensions> - </Platform> - <Platform Name="OSX64"> - <Operation>1</Operation> - <Extensions>.framework</Extensions> - </Platform> - <Platform Name="OSXARM64"> - <Operation>1</Operation> - <Extensions>.framework</Extensions> - </Platform> - <Platform Name="Win32"> - <Operation>0</Operation> - </Platform> - </DeployClass> - <DeployClass Name="DependencyModule"> - <Platform Name="OSX32"> - <Operation>1</Operation> - <Extensions>.dylib</Extensions> - </Platform> - <Platform Name="OSX64"> - <Operation>1</Operation> - <Extensions>.dylib</Extensions> - </Platform> - <Platform Name="OSXARM64"> - <Operation>1</Operation> - <Extensions>.dylib</Extensions> - </Platform> - <Platform Name="Win32"> - <Operation>0</Operation> - <Extensions>.dll;.bpl</Extensions> - </Platform> - </DeployClass> - <DeployClass Required="true" Name="DependencyPackage"> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - <Extensions>.dylib</Extensions> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - <Extensions>.dylib</Extensions> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - <Extensions>.dylib</Extensions> - </Platform> - <Platform Name="OSX32"> - <Operation>1</Operation> - <Extensions>.dylib</Extensions> - </Platform> - <Platform Name="OSX64"> - <Operation>1</Operation> - <Extensions>.dylib</Extensions> - </Platform> - <Platform Name="OSXARM64"> - <Operation>1</Operation> - <Extensions>.dylib</Extensions> - </Platform> - <Platform Name="Win32"> - <Operation>0</Operation> - <Extensions>.bpl</Extensions> - </Platform> - </DeployClass> - <DeployClass Name="File"> - <Platform Name="Android"> - <Operation>0</Operation> - </Platform> - <Platform Name="Android64"> - <Operation>0</Operation> - </Platform> - <Platform Name="iOSDevice32"> - <Operation>0</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>0</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>0</Operation> - </Platform> - <Platform Name="OSX32"> - <Operation>0</Operation> - </Platform> - <Platform Name="OSX64"> - <Operation>0</Operation> - </Platform> - <Platform Name="OSXARM64"> - <Operation>0</Operation> - </Platform> - <Platform Name="Win32"> - <Operation>0</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iOS_AppStore1024"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPad_AppIcon152"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPad_AppIcon167"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPad_Launch1024x768"> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPad_Launch1536x2048"> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPad_Launch1668"> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPad_Launch1668x2388"> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPad_Launch2048x1536"> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPad_Launch2048x2732"> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPad_Launch2224"> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPad_Launch2388x1668"> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPad_Launch2732x2048"> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPad_Launch2x"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPad_Launch768x1024"> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPad_LaunchDark2x"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPad_Notification40"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPad_Setting58"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPad_SpotLight80"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_AppIcon120"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_AppIcon180"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_Launch1125"> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_Launch1136x640"> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_Launch1242"> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_Launch1242x2688"> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_Launch1334"> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_Launch1792"> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_Launch2208"> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_Launch2436"> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_Launch2688x1242"> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_Launch2x"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_Launch320"> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_Launch3x"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_Launch640"> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_Launch640x1136"> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_Launch750"> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_Launch828"> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_LaunchDark2x"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_LaunchDark3x"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_Notification40"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_Notification60"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_Setting58"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_Setting87"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_Spotlight120"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_Spotlight80"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="ProjectAndroidManifest"> - <Platform Name="Android"> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="ProjectiOSDeviceDebug"> - <Platform Name="iOSDevice32"> - <RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="ProjectiOSDeviceResourceRules"/> - <DeployClass Name="ProjectiOSEntitlements"/> - <DeployClass Name="ProjectiOSInfoPList"/> - <DeployClass Name="ProjectiOSLaunchScreen"/> - <DeployClass Name="ProjectiOSResource"> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="ProjectOSXDebug"/> - <DeployClass Name="ProjectOSXEntitlements"/> - <DeployClass Name="ProjectOSXInfoPList"/> - <DeployClass Name="ProjectOSXResource"> - <Platform Name="OSX32"> - <RemoteDir>Contents\Resources</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="OSX64"> - <RemoteDir>Contents\Resources</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="OSXARM64"> - <RemoteDir>Contents\Resources</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Required="true" Name="ProjectOutput"> - <Platform Name="Android"> - <RemoteDir>library\lib\armeabi-v7a</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>library\lib\arm64-v8a</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - </Platform> - <Platform Name="Linux64"> - <Operation>1</Operation> - </Platform> - <Platform Name="OSX32"> - <Operation>1</Operation> - </Platform> - <Platform Name="OSX64"> - <Operation>1</Operation> - </Platform> - <Platform Name="OSXARM64"> - <Operation>1</Operation> - </Platform> - <Platform Name="Win32"> - <Operation>0</Operation> - </Platform> - </DeployClass> - <DeployClass Name="ProjectOutput_Android32"> - <Platform Name="Android64"> - <RemoteDir>library\lib\armeabi-v7a</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="ProjectUWPManifest"> - <Platform Name="Win32"> - <Operation>1</Operation> - </Platform> - <Platform Name="Win64"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="UWP_DelphiLogo150"> - <Platform Name="Win32"> - <RemoteDir>Assets</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Win64"> - <RemoteDir>Assets</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="UWP_DelphiLogo44"> - <Platform Name="Win32"> - <RemoteDir>Assets</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Win64"> - <RemoteDir>Assets</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <ProjectRoot Platform="Android" Name="$(PROJECTNAME)"/> - <ProjectRoot Platform="Android64" Name="$(PROJECTNAME)"/> - <ProjectRoot Platform="iOSDevice32" Name="$(PROJECTNAME).app"/> - <ProjectRoot Platform="iOSDevice64" Name="$(PROJECTNAME).app"/> - <ProjectRoot Platform="iOSSimulator" Name="$(PROJECTNAME).app"/> - <ProjectRoot Platform="Linux64" Name="$(PROJECTNAME)"/> - <ProjectRoot Platform="OSX32" Name="$(PROJECTNAME)"/> - <ProjectRoot Platform="OSX64" Name="$(PROJECTNAME)"/> - <ProjectRoot Platform="OSXARM64" Name="$(PROJECTNAME)"/> - <ProjectRoot Platform="Win32" Name="$(PROJECTNAME)"/> - <ProjectRoot Platform="Win64" Name="$(PROJECTNAME)"/> - </Deployment> - <Platforms> - <Platform value="Linux64">False</Platform> - <Platform value="Win32">True</Platform> - <Platform value="Win64">False</Platform> - </Platforms> - </BorlandProject> - <ProjectFileVersion>12</ProjectFileVersion> - </ProjectExtensions> - <Import Project="$(BDS)\Bin\CodeGear.Delphi.Targets" Condition="Exists('$(BDS)\Bin\CodeGear.Delphi.Targets')"/> - <Import Project="$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj" Condition="Exists('$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj')"/> - <Import Project="$(MSBuildProjectName).deployproj" Condition="Exists('$(MSBuildProjectName).deployproj')"/> -</Project> +<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <PropertyGroup> + <ProjectGuid>{A4A352F5-2896-4539-AE34-A7DF0D94AF4D}</ProjectGuid> + <ProjectVersion>19.4</ProjectVersion> + <FrameworkType>None</FrameworkType> + <MainSource>Console.dpr</MainSource> + <Base>True</Base> + <Config Condition="'$(Config)'==''">Debug</Config> + <Platform Condition="'$(Platform)'==''">Win32</Platform> + <TargetedPlatforms>1</TargetedPlatforms> + <AppType>Console</AppType> + </PropertyGroup> + <PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''"> + <Base>true</Base> + </PropertyGroup> + <PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Base)'=='true') or '$(Base_Win32)'!=''"> + <Base_Win32>true</Base_Win32> + <CfgParent>Base</CfgParent> + <Base>true</Base> + </PropertyGroup> + <PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Base)'=='true') or '$(Base_Win64)'!=''"> + <Base_Win64>true</Base_Win64> + <CfgParent>Base</CfgParent> + <Base>true</Base> + </PropertyGroup> + <PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_1)'!=''"> + <Cfg_1>true</Cfg_1> + <CfgParent>Base</CfgParent> + <Base>true</Base> + </PropertyGroup> + <PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_1)'=='true') or '$(Cfg_1_Win32)'!=''"> + <Cfg_1_Win32>true</Cfg_1_Win32> + <CfgParent>Cfg_1</CfgParent> + <Cfg_1>true</Cfg_1> + <Base>true</Base> + </PropertyGroup> + <PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_2)'!=''"> + <Cfg_2>true</Cfg_2> + <CfgParent>Base</CfgParent> + <Base>true</Base> + </PropertyGroup> + <PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_2)'=='true') or '$(Cfg_2_Win32)'!=''"> + <Cfg_2_Win32>true</Cfg_2_Win32> + <CfgParent>Cfg_2</CfgParent> + <Cfg_2>true</Cfg_2> + <Base>true</Base> + </PropertyGroup> + <PropertyGroup Condition="'$(Config)'=='CI' or '$(Cfg_3)'!=''"> + <Cfg_3>true</Cfg_3> + <CfgParent>Base</CfgParent> + <Base>true</Base> + </PropertyGroup> + <PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_3)'=='true') or '$(Cfg_3_Win32)'!=''"> + <Cfg_3_Win32>true</Cfg_3_Win32> + <CfgParent>Cfg_3</CfgParent> + <Cfg_3>true</Cfg_3> + <Base>true</Base> + </PropertyGroup> + <PropertyGroup Condition="'$(Base)'!=''"> + <DCC_DcuOutput>.\$(Platform)\$(Config)</DCC_DcuOutput> + <DCC_ExeOutput>..\</DCC_ExeOutput> + <DCC_E>false</DCC_E> + <DCC_N>false</DCC_N> + <DCC_S>false</DCC_S> + <DCC_F>false</DCC_F> + <DCC_K>false</DCC_K> + <DCC_Namespace>System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace)</DCC_Namespace> + <Icon_MainIcon>$(BDS)\bin\delphi_PROJECTICON.ico</Icon_MainIcon> + <Icns_MainIcns>$(BDS)\bin\delphi_PROJECTICNS.icns</Icns_MainIcns> + <DCC_UnitSearchPath>modules\.dcp;modules\.dcu;modules;modules\dataset-serialize\src\core;modules\dataset-serialize\src\helpers;modules\dataset-serialize\src\providers;modules\dataset-serialize\src\singletons;modules\dataset-serialize\src\types;modules\horse\src;modules\jhonson\src;modules\restrequest4delphi\src\core;modules\restrequest4delphi\src\interfaces;$(DCC_UnitSearchPath)</DCC_UnitSearchPath> + <SanitizedProjectName>Console</SanitizedProjectName> + <VerInfo_Locale>1046</VerInfo_Locale> + <VerInfo_Keys>CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=</VerInfo_Keys> + <DCC_Define>HORSE_CONSOLE;$(DCC_Define)</DCC_Define> + </PropertyGroup> + <PropertyGroup Condition="'$(Base_Win32)'!=''"> + <DCC_UsePackage>DBXSqliteDriver;IndyIPCommon;RESTComponents;bindcompdbx;DBXInterBaseDriver;vcl;IndyIPServer;vclactnband;RestDatawareCORE;vclFireDAC;IndySystem;tethering;svnui;dsnapcon;FireDACADSDriver;madExcept_;FireDACMSAccDriver;fmxFireDAC;vclimg;madBasic_;FireDAC;vcltouch;vcldb;bindcompfmx;svn;FireDACSqliteDriver;FireDACPgDriver;inetdb;soaprtl;DbxCommonDriver;fmx;FireDACIBDriver;fmxdae;xmlrtl;soapmidas;fmxobj;vclwinx;rtl;madDisAsm_;DbxClientDriver;CustomIPTransport;vcldsnap;dbexpress;IndyCore;RESTDWDriverFD;vclx;bindcomp;appanalytics;dsnap;FireDACCommon;IndyIPClient;bindcompvcl;RESTBackendComponents;VCLRESTComponents;soapserver;dbxcds;VclSmp;adortl;vclie;bindengine;DBXMySQLDriver;CloudService;dsnapxml;FireDACMySQLDriver;dbrtl;IndyProtocols;inetdbxpress;FireDACCommonODBC;FireDACCommonDriver;inet;fmxase;$(DCC_UsePackage)</DCC_UsePackage> + <DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace> + <BT_BuildType>Debug</BT_BuildType> + <VerInfo_Locale>1033</VerInfo_Locale> + <Manifest_File>(None)</Manifest_File> + <DCC_MapFile>3</DCC_MapFile> + </PropertyGroup> + <PropertyGroup Condition="'$(Base_Win64)'!=''"> + <DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace)</DCC_Namespace> + <BT_BuildType>Debug</BT_BuildType> + <VerInfo_Locale>1033</VerInfo_Locale> + <UWP_DelphiLogo44>$(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png</UWP_DelphiLogo44> + <UWP_DelphiLogo150>$(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png</UWP_DelphiLogo150> + </PropertyGroup> + <PropertyGroup Condition="'$(Cfg_1)'!=''"> + <DCC_Define>DEBUG;$(DCC_Define)</DCC_Define> + <DCC_DebugDCUs>true</DCC_DebugDCUs> + <DCC_Optimize>false</DCC_Optimize> + <DCC_GenerateStackFrames>true</DCC_GenerateStackFrames> + <DCC_DebugInfoInExe>true</DCC_DebugInfoInExe> + <DCC_RemoteDebug>true</DCC_RemoteDebug> + </PropertyGroup> + <PropertyGroup Condition="'$(Cfg_1_Win32)'!=''"> + <DCC_RemoteDebug>false</DCC_RemoteDebug> + <VerInfo_Locale>1033</VerInfo_Locale> + <DCC_MapFile>3</DCC_MapFile> + </PropertyGroup> + <PropertyGroup Condition="'$(Cfg_2)'!=''"> + <DCC_LocalDebugSymbols>false</DCC_LocalDebugSymbols> + <DCC_Define>RELEASE;$(DCC_Define)</DCC_Define> + <DCC_SymbolReferenceInfo>0</DCC_SymbolReferenceInfo> + <DCC_DebugInformation>0</DCC_DebugInformation> + </PropertyGroup> + <PropertyGroup Condition="'$(Cfg_2_Win32)'!=''"> + <VerInfo_Locale>1033</VerInfo_Locale> + </PropertyGroup> + <PropertyGroup Condition="'$(Cfg_3)'!=''"> + <DCC_Define>CI;$(DCC_Define)</DCC_Define> + </PropertyGroup> + <PropertyGroup Condition="'$(Cfg_3_Win32)'!=''"> + <VerInfo_Locale>1033</VerInfo_Locale> + </PropertyGroup> + <ItemGroup> + <DelphiCompile Include="$(MainSource)"> + <MainSource>MainSource</MainSource> + </DelphiCompile> + <DCCReference Include="..\..\src\Horse.Commons.pas"/> + <DCCReference Include="..\..\src\Horse.Constants.pas"/> + <DCCReference Include="..\..\src\Horse.Core.Group.Contract.pas"/> + <DCCReference Include="..\..\src\Horse.Core.Group.pas"/> + <DCCReference Include="..\..\src\Horse.Core.pas"/> + <DCCReference Include="..\..\src\Horse.Core.Route.Contract.pas"/> + <DCCReference Include="..\..\src\Horse.Core.Route.pas"/> + <DCCReference Include="..\..\src\Horse.Core.RouterTree.pas"/> + <DCCReference Include="..\..\src\Horse.Exception.pas"/> + <DCCReference Include="..\..\src\Horse.pas"/> + <DCCReference Include="..\..\src\Horse.Provider.Abstract.pas"/> + <DCCReference Include="..\..\src\Horse.Provider.Apache.pas"/> + <DCCReference Include="..\..\src\Horse.Provider.CGI.pas"/> + <DCCReference Include="..\..\src\Horse.Provider.Console.pas"/> + <DCCReference Include="..\..\src\Horse.Provider.Daemon.pas"/> + <DCCReference Include="..\..\src\ThirdParty.Posix.Syslog.pas"/> + <DCCReference Include="..\..\src\Web.WebConst.pas"/> + <DCCReference Include="..\..\src\Horse.Provider.VCL.pas"/> + <DCCReference Include="..\..\src\Horse.Provider.ISAPI.pas"/> + <DCCReference Include="..\..\src\Horse.WebModule.pas"> + <Form>HorseWebModule</Form> + <DesignClass>TWebModule</DesignClass> + </DCCReference> + <DCCReference Include="..\..\src\Horse.Proc.pas"/> + <DCCReference Include="tests\Tests.Api.Console.pas"/> + <DCCReference Include="controllers\Controllers.Api.pas"/> + <DCCReference Include="tests\Tests.Commons.pas"/> + <DCCReference Include="..\..\src\Horse.Core.Param.pas"/> + <DCCReference Include="..\..\src\Horse.Core.Param.Header.pas"/> + <DCCReference Include="..\..\src\Horse.Provider.IOHandleSSL.pas"/> + <DCCReference Include="tests\Tests.Horse.Core.Param.pas"/> + <DCCReference Include="..\..\src\Horse.Core.Param.Field.pas"/> + <DCCReference Include="..\..\src\Horse.Request.pas"/> + <DCCReference Include="..\..\src\Horse.Response.pas"/> + <DCCReference Include="..\..\src\Horse.Core.Param.Config.pas"/> + <DCCReference Include="..\..\src\Horse.Rtti.Helper.pas"/> + <DCCReference Include="..\..\src\Horse.Rtti.pas"/> + <DCCReference Include="..\..\src\Horse.Callback.pas"/> + <DCCReference Include="..\..\src\Horse.Core.RouterTree.NextCaller.pas"/> + <DCCReference Include="..\..\src\Horse.Exception.Interrupted.pas"/> + <DCCReference Include="..\..\src\Horse.Session.pas"/> + <DCCReference Include="..\..\src\Horse.Core.Param.Field.Brackets.pas"/> + <DCCReference Include="..\..\src\Horse.Core.Files.pas"/> + <DCCReference Include="tests\Tests.Horse.Core.Files.pas"/> + <BuildConfiguration Include="Base"> + <Key>Base</Key> + </BuildConfiguration> + <BuildConfiguration Include="Debug"> + <Key>Cfg_1</Key> + <CfgParent>Base</CfgParent> + </BuildConfiguration> + <BuildConfiguration Include="Release"> + <Key>Cfg_2</Key> + <CfgParent>Base</CfgParent> + </BuildConfiguration> + <BuildConfiguration Include="CI"> + <Key>Cfg_3</Key> + <CfgParent>Base</CfgParent> + </BuildConfiguration> + </ItemGroup> + <ProjectExtensions> + <Borland.Personality>Delphi.Personality.12</Borland.Personality> + <Borland.ProjectType>Console</Borland.ProjectType> + <BorlandProject> + <Delphi.Personality> + <Source> + <Source Name="MainSource">Console.dpr</Source> + </Source> + <Excluded_Packages> + <Excluded_Packages Name="$(BDSBIN)\dcloffice2k280.bpl">Microsoft Office 2000 Sample Automation Server Wrapper Components</Excluded_Packages> + <Excluded_Packages Name="$(BDSBIN)\dclofficexp280.bpl">Microsoft Office XP Sample Automation Server Wrapper Components</Excluded_Packages> + </Excluded_Packages> + </Delphi.Personality> + <Deployment Version="3"> + <DeployFile LocalName="$(BDS)\Redist\iossimulator\libcgunwind.1.0.dylib" Class="DependencyModule"> + <Platform Name="iOSSimulator"> + <Overwrite>true</Overwrite> + </Platform> + </DeployFile> + <DeployFile LocalName="$(BDS)\Redist\iossimulator\libpcre.dylib" Class="DependencyModule"> + <Platform Name="iOSSimulator"> + <Overwrite>true</Overwrite> + </Platform> + </DeployFile> + <DeployFile LocalName="$(BDS)\Redist\osx32\libcgunwind.1.0.dylib" Class="DependencyModule"> + <Platform Name="OSX32"> + <Overwrite>true</Overwrite> + </Platform> + </DeployFile> + <DeployFile LocalName="..\Console.exe" Configuration="CI" Class="ProjectOutput"> + <Platform Name="Win32"> + <RemoteName>Console.exe</RemoteName> + <Overwrite>true</Overwrite> + </Platform> + </DeployFile> + <DeployFile LocalName="..\Console.exe" Configuration="Debug" Class="ProjectOutput"> + <Platform Name="Win32"> + <RemoteName>Console.exe</RemoteName> + <Overwrite>true</Overwrite> + </Platform> + </DeployFile> + <DeployClass Name="AdditionalDebugSymbols"> + <Platform Name="OSX32"> + <Operation>1</Operation> + </Platform> + <Platform Name="Win32"> + <Operation>0</Operation> + </Platform> + </DeployClass> + <DeployClass Name="AndroidClasses"> + <Platform Name="Android"> + <RemoteDir>classes</RemoteDir> + <Operation>64</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>classes</RemoteDir> + <Operation>64</Operation> + </Platform> + </DeployClass> + <DeployClass Name="AndroidClassesDexFile"> + <Platform Name="Android"> + <RemoteDir>classes</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>classes</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="AndroidFileProvider"> + <Platform Name="Android"> + <RemoteDir>res\xml</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>res\xml</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="AndroidGDBServer"> + <Platform Name="Android"> + <RemoteDir>library\lib\armeabi-v7a</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="AndroidLibnativeArmeabiFile"> + <Platform Name="Android"> + <RemoteDir>library\lib\armeabi</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>library\lib\armeabi</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="AndroidLibnativeArmeabiv7aFile"> + <Platform Name="Android64"> + <RemoteDir>library\lib\armeabi-v7a</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="AndroidLibnativeMipsFile"> + <Platform Name="Android"> + <RemoteDir>library\lib\mips</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>library\lib\mips</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="AndroidServiceOutput"> + <Platform Name="Android"> + <RemoteDir>library\lib\armeabi-v7a</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>library\lib\arm64-v8a</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="AndroidServiceOutput_Android32"> + <Platform Name="Android64"> + <RemoteDir>library\lib\armeabi-v7a</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="AndroidSplashImageDef"> + <Platform Name="Android"> + <RemoteDir>res\drawable</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>res\drawable</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="AndroidSplashStyles"> + <Platform Name="Android"> + <RemoteDir>res\values</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>res\values</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="AndroidSplashStylesV21"> + <Platform Name="Android"> + <RemoteDir>res\values-v21</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>res\values-v21</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="Android_Colors"> + <Platform Name="Android"> + <RemoteDir>res\values</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>res\values</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="Android_DefaultAppIcon"> + <Platform Name="Android"> + <RemoteDir>res\drawable</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>res\drawable</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="Android_LauncherIcon144"> + <Platform Name="Android"> + <RemoteDir>res\drawable-xxhdpi</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>res\drawable-xxhdpi</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="Android_LauncherIcon192"> + <Platform Name="Android"> + <RemoteDir>res\drawable-xxxhdpi</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>res\drawable-xxxhdpi</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="Android_LauncherIcon36"> + <Platform Name="Android"> + <RemoteDir>res\drawable-ldpi</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>res\drawable-ldpi</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="Android_LauncherIcon48"> + <Platform Name="Android"> + <RemoteDir>res\drawable-mdpi</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>res\drawable-mdpi</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="Android_LauncherIcon72"> + <Platform Name="Android"> + <RemoteDir>res\drawable-hdpi</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>res\drawable-hdpi</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="Android_LauncherIcon96"> + <Platform Name="Android"> + <RemoteDir>res\drawable-xhdpi</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>res\drawable-xhdpi</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="Android_NotificationIcon24"> + <Platform Name="Android"> + <RemoteDir>res\drawable-mdpi</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>res\drawable-mdpi</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="Android_NotificationIcon36"> + <Platform Name="Android"> + <RemoteDir>res\drawable-hdpi</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>res\drawable-hdpi</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="Android_NotificationIcon48"> + <Platform Name="Android"> + <RemoteDir>res\drawable-xhdpi</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>res\drawable-xhdpi</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="Android_NotificationIcon72"> + <Platform Name="Android"> + <RemoteDir>res\drawable-xxhdpi</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>res\drawable-xxhdpi</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="Android_NotificationIcon96"> + <Platform Name="Android"> + <RemoteDir>res\drawable-xxxhdpi</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>res\drawable-xxxhdpi</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="Android_SplashImage426"> + <Platform Name="Android"> + <RemoteDir>res\drawable-small</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>res\drawable-small</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="Android_SplashImage470"> + <Platform Name="Android"> + <RemoteDir>res\drawable-normal</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>res\drawable-normal</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="Android_SplashImage640"> + <Platform Name="Android"> + <RemoteDir>res\drawable-large</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>res\drawable-large</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="Android_SplashImage960"> + <Platform Name="Android"> + <RemoteDir>res\drawable-xlarge</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>res\drawable-xlarge</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="Android_Strings"> + <Platform Name="Android"> + <RemoteDir>res\values</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>res\values</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="DebugSymbols"> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + </Platform> + <Platform Name="OSX32"> + <Operation>1</Operation> + </Platform> + <Platform Name="Win32"> + <Operation>0</Operation> + </Platform> + </DeployClass> + <DeployClass Name="DependencyFramework"> + <Platform Name="OSX32"> + <Operation>1</Operation> + <Extensions>.framework</Extensions> + </Platform> + <Platform Name="OSX64"> + <Operation>1</Operation> + <Extensions>.framework</Extensions> + </Platform> + <Platform Name="OSXARM64"> + <Operation>1</Operation> + <Extensions>.framework</Extensions> + </Platform> + <Platform Name="Win32"> + <Operation>0</Operation> + </Platform> + </DeployClass> + <DeployClass Name="DependencyModule"> + <Platform Name="OSX32"> + <Operation>1</Operation> + <Extensions>.dylib</Extensions> + </Platform> + <Platform Name="OSX64"> + <Operation>1</Operation> + <Extensions>.dylib</Extensions> + </Platform> + <Platform Name="OSXARM64"> + <Operation>1</Operation> + <Extensions>.dylib</Extensions> + </Platform> + <Platform Name="Win32"> + <Operation>0</Operation> + <Extensions>.dll;.bpl</Extensions> + </Platform> + </DeployClass> + <DeployClass Required="true" Name="DependencyPackage"> + <Platform Name="iOSDevice32"> + <Operation>1</Operation> + <Extensions>.dylib</Extensions> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>1</Operation> + <Extensions>.dylib</Extensions> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + <Extensions>.dylib</Extensions> + </Platform> + <Platform Name="OSX32"> + <Operation>1</Operation> + <Extensions>.dylib</Extensions> + </Platform> + <Platform Name="OSX64"> + <Operation>1</Operation> + <Extensions>.dylib</Extensions> + </Platform> + <Platform Name="OSXARM64"> + <Operation>1</Operation> + <Extensions>.dylib</Extensions> + </Platform> + <Platform Name="Win32"> + <Operation>0</Operation> + <Extensions>.bpl</Extensions> + </Platform> + </DeployClass> + <DeployClass Name="File"> + <Platform Name="Android"> + <Operation>0</Operation> + </Platform> + <Platform Name="Android64"> + <Operation>0</Operation> + </Platform> + <Platform Name="iOSDevice32"> + <Operation>0</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>0</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>0</Operation> + </Platform> + <Platform Name="OSX32"> + <Operation>0</Operation> + </Platform> + <Platform Name="OSX64"> + <Operation>0</Operation> + </Platform> + <Platform Name="OSXARM64"> + <Operation>0</Operation> + </Platform> + <Platform Name="Win32"> + <Operation>0</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iOS_AppStore1024"> + <Platform Name="iOSDevice64"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPad_AppIcon152"> + <Platform Name="iOSDevice64"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPad_AppIcon167"> + <Platform Name="iOSDevice64"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPad_Launch1024x768"> + <Platform Name="iOSDevice32"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPad_Launch1536x2048"> + <Platform Name="iOSDevice32"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPad_Launch1668"> + <Platform Name="iOSDevice32"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPad_Launch1668x2388"> + <Platform Name="iOSDevice32"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPad_Launch2048x1536"> + <Platform Name="iOSDevice32"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPad_Launch2048x2732"> + <Platform Name="iOSDevice32"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPad_Launch2224"> + <Platform Name="iOSDevice32"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPad_Launch2388x1668"> + <Platform Name="iOSDevice32"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPad_Launch2732x2048"> + <Platform Name="iOSDevice32"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPad_Launch2x"> + <Platform Name="iOSDevice64"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPad_Launch768x1024"> + <Platform Name="iOSDevice32"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPad_LaunchDark2x"> + <Platform Name="iOSDevice64"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPad_Notification40"> + <Platform Name="iOSDevice64"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPad_Setting58"> + <Platform Name="iOSDevice64"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPad_SpotLight80"> + <Platform Name="iOSDevice64"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPhone_AppIcon120"> + <Platform Name="iOSDevice64"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPhone_AppIcon180"> + <Platform Name="iOSDevice64"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPhone_Launch1125"> + <Platform Name="iOSDevice32"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPhone_Launch1136x640"> + <Platform Name="iOSDevice32"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPhone_Launch1242"> + <Platform Name="iOSDevice32"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPhone_Launch1242x2688"> + <Platform Name="iOSDevice32"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPhone_Launch1334"> + <Platform Name="iOSDevice32"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPhone_Launch1792"> + <Platform Name="iOSDevice32"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPhone_Launch2208"> + <Platform Name="iOSDevice32"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPhone_Launch2436"> + <Platform Name="iOSDevice32"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPhone_Launch2688x1242"> + <Platform Name="iOSDevice32"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPhone_Launch2x"> + <Platform Name="iOSDevice64"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPhone_Launch320"> + <Platform Name="iOSDevice32"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPhone_Launch3x"> + <Platform Name="iOSDevice64"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPhone_Launch640"> + <Platform Name="iOSDevice32"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPhone_Launch640x1136"> + <Platform Name="iOSDevice32"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPhone_Launch750"> + <Platform Name="iOSDevice32"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPhone_Launch828"> + <Platform Name="iOSDevice32"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPhone_LaunchDark2x"> + <Platform Name="iOSDevice64"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPhone_LaunchDark3x"> + <Platform Name="iOSDevice64"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPhone_Notification40"> + <Platform Name="iOSDevice64"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPhone_Notification60"> + <Platform Name="iOSDevice64"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPhone_Setting58"> + <Platform Name="iOSDevice64"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPhone_Setting87"> + <Platform Name="iOSDevice64"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPhone_Spotlight120"> + <Platform Name="iOSDevice64"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPhone_Spotlight80"> + <Platform Name="iOSDevice64"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="ProjectAndroidManifest"> + <Platform Name="Android"> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="ProjectiOSDeviceDebug"> + <Platform Name="iOSDevice32"> + <RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="ProjectiOSDeviceResourceRules"/> + <DeployClass Name="ProjectiOSEntitlements"/> + <DeployClass Name="ProjectiOSInfoPList"/> + <DeployClass Name="ProjectiOSLaunchScreen"/> + <DeployClass Name="ProjectiOSResource"> + <Platform Name="iOSDevice32"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="ProjectOSXDebug"/> + <DeployClass Name="ProjectOSXEntitlements"/> + <DeployClass Name="ProjectOSXInfoPList"/> + <DeployClass Name="ProjectOSXResource"> + <Platform Name="OSX32"> + <RemoteDir>Contents\Resources</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="OSX64"> + <RemoteDir>Contents\Resources</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="OSXARM64"> + <RemoteDir>Contents\Resources</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Required="true" Name="ProjectOutput"> + <Platform Name="Android"> + <RemoteDir>library\lib\armeabi-v7a</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>library\lib\arm64-v8a</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice32"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + </Platform> + <Platform Name="Linux64"> + <Operation>1</Operation> + </Platform> + <Platform Name="OSX32"> + <Operation>1</Operation> + </Platform> + <Platform Name="OSX64"> + <Operation>1</Operation> + </Platform> + <Platform Name="OSXARM64"> + <Operation>1</Operation> + </Platform> + <Platform Name="Win32"> + <Operation>0</Operation> + </Platform> + </DeployClass> + <DeployClass Name="ProjectOutput_Android32"> + <Platform Name="Android64"> + <RemoteDir>library\lib\armeabi-v7a</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="ProjectUWPManifest"> + <Platform Name="Win32"> + <Operation>1</Operation> + </Platform> + <Platform Name="Win64"> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="UWP_DelphiLogo150"> + <Platform Name="Win32"> + <RemoteDir>Assets</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Win64"> + <RemoteDir>Assets</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="UWP_DelphiLogo44"> + <Platform Name="Win32"> + <RemoteDir>Assets</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Win64"> + <RemoteDir>Assets</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <ProjectRoot Platform="Android" Name="$(PROJECTNAME)"/> + <ProjectRoot Platform="Android64" Name="$(PROJECTNAME)"/> + <ProjectRoot Platform="iOSDevice32" Name="$(PROJECTNAME).app"/> + <ProjectRoot Platform="iOSDevice64" Name="$(PROJECTNAME).app"/> + <ProjectRoot Platform="iOSSimulator" Name="$(PROJECTNAME).app"/> + <ProjectRoot Platform="Linux64" Name="$(PROJECTNAME)"/> + <ProjectRoot Platform="OSX32" Name="$(PROJECTNAME)"/> + <ProjectRoot Platform="OSX64" Name="$(PROJECTNAME)"/> + <ProjectRoot Platform="OSXARM64" Name="$(PROJECTNAME)"/> + <ProjectRoot Platform="Win32" Name="$(PROJECTNAME)"/> + <ProjectRoot Platform="Win64" Name="$(PROJECTNAME)"/> + </Deployment> + <Platforms> + <Platform value="Linux64">False</Platform> + <Platform value="Win32">True</Platform> + <Platform value="Win64">False</Platform> + </Platforms> + </BorlandProject> + <ProjectFileVersion>12</ProjectFileVersion> + </ProjectExtensions> + <Import Project="$(BDS)\Bin\CodeGear.Delphi.Targets" Condition="Exists('$(BDS)\Bin\CodeGear.Delphi.Targets')"/> + <Import Project="$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj" Condition="Exists('$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj')"/> + <Import Project="$(MSBuildProjectName).deployproj" Condition="Exists('$(MSBuildProjectName).deployproj')"/> +</Project> diff --git a/tests/src/VCL.dproj b/tests/src/VCL.dproj index 3176db2..ad97500 100644 --- a/tests/src/VCL.dproj +++ b/tests/src/VCL.dproj @@ -1,1222 +1,1222 @@ -<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> - <PropertyGroup> - <ProjectGuid>{090D8F0A-88C5-4ED1-BF6B-7D62B658AA0C}</ProjectGuid> - <ProjectVersion>19.4</ProjectVersion> - <FrameworkType>None</FrameworkType> - <MainSource>VCL.dpr</MainSource> - <Base>True</Base> - <Config Condition="'$(Config)'==''">Debug</Config> - <Platform Condition="'$(Platform)'==''">Win32</Platform> - <TargetedPlatforms>1</TargetedPlatforms> - <AppType>Console</AppType> - </PropertyGroup> - <PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''"> - <Base>true</Base> - </PropertyGroup> - <PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Base)'=='true') or '$(Base_Win32)'!=''"> - <Base_Win32>true</Base_Win32> - <CfgParent>Base</CfgParent> - <Base>true</Base> - </PropertyGroup> - <PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Base)'=='true') or '$(Base_Win64)'!=''"> - <Base_Win64>true</Base_Win64> - <CfgParent>Base</CfgParent> - <Base>true</Base> - </PropertyGroup> - <PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_1)'!=''"> - <Cfg_1>true</Cfg_1> - <CfgParent>Base</CfgParent> - <Base>true</Base> - </PropertyGroup> - <PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_1)'=='true') or '$(Cfg_1_Win32)'!=''"> - <Cfg_1_Win32>true</Cfg_1_Win32> - <CfgParent>Cfg_1</CfgParent> - <Cfg_1>true</Cfg_1> - <Base>true</Base> - </PropertyGroup> - <PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_2)'!=''"> - <Cfg_2>true</Cfg_2> - <CfgParent>Base</CfgParent> - <Base>true</Base> - </PropertyGroup> - <PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_2)'=='true') or '$(Cfg_2_Win32)'!=''"> - <Cfg_2_Win32>true</Cfg_2_Win32> - <CfgParent>Cfg_2</CfgParent> - <Cfg_2>true</Cfg_2> - <Base>true</Base> - </PropertyGroup> - <PropertyGroup Condition="'$(Config)'=='CI' or '$(Cfg_3)'!=''"> - <Cfg_3>true</Cfg_3> - <CfgParent>Base</CfgParent> - <Base>true</Base> - </PropertyGroup> - <PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_3)'=='true') or '$(Cfg_3_Win32)'!=''"> - <Cfg_3_Win32>true</Cfg_3_Win32> - <CfgParent>Cfg_3</CfgParent> - <Cfg_3>true</Cfg_3> - <Base>true</Base> - </PropertyGroup> - <PropertyGroup Condition="'$(Base)'!=''"> - <DCC_DcuOutput>.\$(Platform)\$(Config)</DCC_DcuOutput> - <DCC_ExeOutput>..\</DCC_ExeOutput> - <DCC_E>false</DCC_E> - <DCC_N>false</DCC_N> - <DCC_S>false</DCC_S> - <DCC_F>false</DCC_F> - <DCC_K>false</DCC_K> - <DCC_Namespace>System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace)</DCC_Namespace> - <Icon_MainIcon>$(BDS)\bin\delphi_PROJECTICON.ico</Icon_MainIcon> - <Icns_MainIcns>$(BDS)\bin\delphi_PROJECTICNS.icns</Icns_MainIcns> - <DCC_UnitSearchPath>$(DUnitX);modules\.dcp;modules\.dcu;modules;modules\dataset-serialize\src\core;modules\dataset-serialize\src\helpers;modules\dataset-serialize\src\providers;modules\dataset-serialize\src\singletons;modules\dataset-serialize\src\types;modules\horse\src;modules\jhonson\src;modules\restrequest4delphi\src\core;modules\restrequest4delphi\src\interfaces;$(DCC_UnitSearchPath)</DCC_UnitSearchPath> - <SanitizedProjectName>VCL</SanitizedProjectName> - <VerInfo_Locale>1046</VerInfo_Locale> - <VerInfo_Keys>CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=</VerInfo_Keys> - <DCC_Define>HORSE_VCL;$(DCC_Define)</DCC_Define> - </PropertyGroup> - <PropertyGroup Condition="'$(Base_Win32)'!=''"> - <DCC_UsePackage>DBXSqliteDriver;IndyIPCommon;RESTComponents;bindcompdbx;DBXInterBaseDriver;vcl;IndyIPServer;vclactnband;RestDatawareCORE;vclFireDAC;IndySystem;tethering;svnui;dsnapcon;FireDACADSDriver;madExcept_;FireDACMSAccDriver;fmxFireDAC;vclimg;madBasic_;FireDAC;vcltouch;vcldb;bindcompfmx;svn;FireDACSqliteDriver;FireDACPgDriver;inetdb;soaprtl;DbxCommonDriver;fmx;FireDACIBDriver;fmxdae;xmlrtl;soapmidas;fmxobj;vclwinx;rtl;madDisAsm_;DbxClientDriver;CustomIPTransport;vcldsnap;dbexpress;IndyCore;RESTDWDriverFD;vclx;bindcomp;appanalytics;dsnap;FireDACCommon;IndyIPClient;bindcompvcl;RESTBackendComponents;VCLRESTComponents;soapserver;dbxcds;VclSmp;adortl;vclie;bindengine;DBXMySQLDriver;CloudService;dsnapxml;FireDACMySQLDriver;dbrtl;IndyProtocols;inetdbxpress;FireDACCommonODBC;FireDACCommonDriver;inet;fmxase;$(DCC_UsePackage)</DCC_UsePackage> - <DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace> - <BT_BuildType>Debug</BT_BuildType> - <VerInfo_Locale>1033</VerInfo_Locale> - <Manifest_File>(None)</Manifest_File> - <DCC_MapFile>3</DCC_MapFile> - </PropertyGroup> - <PropertyGroup Condition="'$(Base_Win64)'!=''"> - <DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace)</DCC_Namespace> - <BT_BuildType>Debug</BT_BuildType> - <VerInfo_Locale>1033</VerInfo_Locale> - <UWP_DelphiLogo44>$(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png</UWP_DelphiLogo44> - <UWP_DelphiLogo150>$(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png</UWP_DelphiLogo150> - </PropertyGroup> - <PropertyGroup Condition="'$(Cfg_1)'!=''"> - <DCC_Define>DEBUG;$(DCC_Define)</DCC_Define> - <DCC_DebugDCUs>true</DCC_DebugDCUs> - <DCC_Optimize>false</DCC_Optimize> - <DCC_GenerateStackFrames>true</DCC_GenerateStackFrames> - <DCC_DebugInfoInExe>true</DCC_DebugInfoInExe> - <DCC_RemoteDebug>true</DCC_RemoteDebug> - </PropertyGroup> - <PropertyGroup Condition="'$(Cfg_1_Win32)'!=''"> - <DCC_RemoteDebug>false</DCC_RemoteDebug> - <VerInfo_Locale>1033</VerInfo_Locale> - </PropertyGroup> - <PropertyGroup Condition="'$(Cfg_2)'!=''"> - <DCC_LocalDebugSymbols>false</DCC_LocalDebugSymbols> - <DCC_Define>RELEASE;$(DCC_Define)</DCC_Define> - <DCC_SymbolReferenceInfo>0</DCC_SymbolReferenceInfo> - <DCC_DebugInformation>0</DCC_DebugInformation> - </PropertyGroup> - <PropertyGroup Condition="'$(Cfg_2_Win32)'!=''"> - <VerInfo_Locale>1033</VerInfo_Locale> - </PropertyGroup> - <PropertyGroup Condition="'$(Cfg_3)'!=''"> - <DCC_Define>CI;$(DCC_Define)</DCC_Define> - </PropertyGroup> - <PropertyGroup Condition="'$(Cfg_3_Win32)'!=''"> - <VerInfo_Locale>1033</VerInfo_Locale> - </PropertyGroup> - <ItemGroup> - <DelphiCompile Include="$(MainSource)"> - <MainSource>MainSource</MainSource> - </DelphiCompile> - <DCCReference Include="..\..\src\Horse.Provider.Console.pas"/> - <DCCReference Include="tests\Tests.Api.Vcl.pas"/> - <DCCReference Include="controllers\Controllers.Api.pas"/> - <DCCReference Include="tests\Tests.Commons.pas"/> - <DCCReference Include="..\..\src\Horse.Commons.pas"/> - <DCCReference Include="..\..\src\Horse.Constants.pas"/> - <DCCReference Include="..\..\src\Horse.Core.Group.Contract.pas"/> - <DCCReference Include="..\..\src\Horse.Core.Group.pas"/> - <DCCReference Include="..\..\src\Horse.Core.Param.Header.pas"/> - <DCCReference Include="..\..\src\Horse.Core.Param.pas"/> - <DCCReference Include="..\..\src\Horse.Core.pas"/> - <DCCReference Include="..\..\src\Horse.Core.Route.Contract.pas"/> - <DCCReference Include="..\..\src\Horse.Core.Route.pas"/> - <DCCReference Include="..\..\src\Horse.Core.RouterTree.pas"/> - <DCCReference Include="..\..\src\Horse.Exception.pas"/> - <DCCReference Include="..\..\src\Horse.pas"/> - <DCCReference Include="..\..\src\Horse.Proc.pas"/> - <DCCReference Include="..\..\src\Horse.Provider.Abstract.pas"/> - <DCCReference Include="..\..\src\ThirdParty.Posix.Syslog.pas"/> - <DCCReference Include="..\..\src\Web.WebConst.pas"/> - <DCCReference Include="tests\Tests.Horse.Core.Param.pas"/> - <DCCReference Include="..\..\src\Horse.Core.Param.Field.pas"/> - <DCCReference Include="..\..\src\Horse.Request.pas"/> - <DCCReference Include="..\..\src\Horse.Response.pas"/> - <DCCReference Include="..\..\src\Horse.Callback.pas"/> - <DCCReference Include="..\..\src\Horse.Core.Param.Config.pas"/> - <DCCReference Include="..\..\src\Horse.Core.RouterTree.NextCaller.pas"/> - <DCCReference Include="..\..\src\Horse.Exception.Interrupted.pas"/> - <DCCReference Include="..\..\src\Horse.Rtti.Helper.pas"/> - <DCCReference Include="..\..\src\Horse.Rtti.pas"/> - <DCCReference Include="..\..\src\Horse.Session.pas"/> - <DCCReference Include="..\..\src\Horse.Provider.Apache.pas"/> - <DCCReference Include="..\..\src\Horse.Provider.CGI.pas"/> - <DCCReference Include="..\..\src\Horse.Provider.Daemon.pas"/> - <DCCReference Include="..\..\src\Horse.Provider.IOHandleSSL.pas"/> - <DCCReference Include="..\..\src\Horse.Provider.ISAPI.pas"/> - <DCCReference Include="..\..\src\Horse.Provider.VCL.pas"/> - <DCCReference Include="..\..\src\Horse.WebModule.pas"> - <Form>HorseWebModule</Form> - <FormType>dfm</FormType> - <DesignClass>TWebModule</DesignClass> - </DCCReference> - <DCCReference Include="..\..\src\Horse.Core.Param.Field.Brackets.pas"/> - <DCCReference Include="..\..\src\Horse.Core.Files.pas"/> - <DCCReference Include="tests\Tests.Horse.Core.Files.pas"/> - <BuildConfiguration Include="Base"> - <Key>Base</Key> - </BuildConfiguration> - <BuildConfiguration Include="Debug"> - <Key>Cfg_1</Key> - <CfgParent>Base</CfgParent> - </BuildConfiguration> - <BuildConfiguration Include="Release"> - <Key>Cfg_2</Key> - <CfgParent>Base</CfgParent> - </BuildConfiguration> - <BuildConfiguration Include="CI"> - <Key>Cfg_3</Key> - <CfgParent>Base</CfgParent> - </BuildConfiguration> - </ItemGroup> - <ProjectExtensions> - <Borland.Personality>Delphi.Personality.12</Borland.Personality> - <Borland.ProjectType>Console</Borland.ProjectType> - <BorlandProject> - <Delphi.Personality> - <Source> - <Source Name="MainSource">VCL.dpr</Source> - </Source> - </Delphi.Personality> - <Deployment Version="3"> - <DeployFile LocalName="$(BDS)\Redist\iossimulator\libcgunwind.1.0.dylib" Class="DependencyModule"> - <Platform Name="iOSSimulator"> - <Overwrite>true</Overwrite> - </Platform> - </DeployFile> - <DeployFile LocalName="$(BDS)\Redist\iossimulator\libpcre.dylib" Class="DependencyModule"> - <Platform Name="iOSSimulator"> - <Overwrite>true</Overwrite> - </Platform> - </DeployFile> - <DeployFile LocalName="$(BDS)\Redist\osx32\libcgunwind.1.0.dylib" Class="DependencyModule"> - <Platform Name="OSX32"> - <Overwrite>true</Overwrite> - </Platform> - </DeployFile> - <DeployFile LocalName="..\VCL.exe" Configuration="CI" Class="ProjectOutput"> - <Platform Name="Win32"> - <RemoteName>VCL.exe</RemoteName> - <Overwrite>true</Overwrite> - </Platform> - </DeployFile> - <DeployFile LocalName="..\VCL.exe" Configuration="Debug" Class="ProjectOutput"> - <Platform Name="Win32"> - <RemoteName>VCL.exe</RemoteName> - <Overwrite>true</Overwrite> - </Platform> - </DeployFile> - <DeployClass Name="AdditionalDebugSymbols"> - <Platform Name="OSX32"> - <Operation>1</Operation> - </Platform> - <Platform Name="Win32"> - <Operation>0</Operation> - </Platform> - </DeployClass> - <DeployClass Name="AndroidClasses"> - <Platform Name="Android"> - <RemoteDir>classes</RemoteDir> - <Operation>64</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>classes</RemoteDir> - <Operation>64</Operation> - </Platform> - </DeployClass> - <DeployClass Name="AndroidClassesDexFile"> - <Platform Name="Android"> - <RemoteDir>classes</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>classes</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="AndroidFileProvider"> - <Platform Name="Android"> - <RemoteDir>res\xml</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\xml</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="AndroidGDBServer"> - <Platform Name="Android"> - <RemoteDir>library\lib\armeabi-v7a</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="AndroidLibnativeArmeabiFile"> - <Platform Name="Android"> - <RemoteDir>library\lib\armeabi</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>library\lib\armeabi</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="AndroidLibnativeArmeabiv7aFile"> - <Platform Name="Android64"> - <RemoteDir>library\lib\armeabi-v7a</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="AndroidLibnativeMipsFile"> - <Platform Name="Android"> - <RemoteDir>library\lib\mips</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>library\lib\mips</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="AndroidServiceOutput"> - <Platform Name="Android"> - <RemoteDir>library\lib\armeabi-v7a</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>library\lib\arm64-v8a</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="AndroidServiceOutput_Android32"> - <Platform Name="Android64"> - <RemoteDir>library\lib\armeabi-v7a</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="AndroidSplashImageDef"> - <Platform Name="Android"> - <RemoteDir>res\drawable</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\drawable</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="AndroidSplashStyles"> - <Platform Name="Android"> - <RemoteDir>res\values</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\values</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="AndroidSplashStylesV21"> - <Platform Name="Android"> - <RemoteDir>res\values-v21</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\values-v21</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="Android_Colors"> - <Platform Name="Android"> - <RemoteDir>res\values</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\values</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="Android_DefaultAppIcon"> - <Platform Name="Android"> - <RemoteDir>res\drawable</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\drawable</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="Android_LauncherIcon144"> - <Platform Name="Android"> - <RemoteDir>res\drawable-xxhdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\drawable-xxhdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="Android_LauncherIcon192"> - <Platform Name="Android"> - <RemoteDir>res\drawable-xxxhdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\drawable-xxxhdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="Android_LauncherIcon36"> - <Platform Name="Android"> - <RemoteDir>res\drawable-ldpi</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\drawable-ldpi</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="Android_LauncherIcon48"> - <Platform Name="Android"> - <RemoteDir>res\drawable-mdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\drawable-mdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="Android_LauncherIcon72"> - <Platform Name="Android"> - <RemoteDir>res\drawable-hdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\drawable-hdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="Android_LauncherIcon96"> - <Platform Name="Android"> - <RemoteDir>res\drawable-xhdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\drawable-xhdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="Android_NotificationIcon24"> - <Platform Name="Android"> - <RemoteDir>res\drawable-mdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\drawable-mdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="Android_NotificationIcon36"> - <Platform Name="Android"> - <RemoteDir>res\drawable-hdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\drawable-hdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="Android_NotificationIcon48"> - <Platform Name="Android"> - <RemoteDir>res\drawable-xhdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\drawable-xhdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="Android_NotificationIcon72"> - <Platform Name="Android"> - <RemoteDir>res\drawable-xxhdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\drawable-xxhdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="Android_NotificationIcon96"> - <Platform Name="Android"> - <RemoteDir>res\drawable-xxxhdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\drawable-xxxhdpi</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="Android_SplashImage426"> - <Platform Name="Android"> - <RemoteDir>res\drawable-small</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\drawable-small</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="Android_SplashImage470"> - <Platform Name="Android"> - <RemoteDir>res\drawable-normal</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\drawable-normal</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="Android_SplashImage640"> - <Platform Name="Android"> - <RemoteDir>res\drawable-large</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\drawable-large</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="Android_SplashImage960"> - <Platform Name="Android"> - <RemoteDir>res\drawable-xlarge</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\drawable-xlarge</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="Android_Strings"> - <Platform Name="Android"> - <RemoteDir>res\values</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>res\values</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="DebugSymbols"> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - </Platform> - <Platform Name="OSX32"> - <Operation>1</Operation> - </Platform> - <Platform Name="Win32"> - <Operation>0</Operation> - </Platform> - </DeployClass> - <DeployClass Name="DependencyFramework"> - <Platform Name="OSX32"> - <Operation>1</Operation> - <Extensions>.framework</Extensions> - </Platform> - <Platform Name="OSX64"> - <Operation>1</Operation> - <Extensions>.framework</Extensions> - </Platform> - <Platform Name="OSXARM64"> - <Operation>1</Operation> - <Extensions>.framework</Extensions> - </Platform> - <Platform Name="Win32"> - <Operation>0</Operation> - </Platform> - </DeployClass> - <DeployClass Name="DependencyModule"> - <Platform Name="OSX32"> - <Operation>1</Operation> - <Extensions>.dylib</Extensions> - </Platform> - <Platform Name="OSX64"> - <Operation>1</Operation> - <Extensions>.dylib</Extensions> - </Platform> - <Platform Name="OSXARM64"> - <Operation>1</Operation> - <Extensions>.dylib</Extensions> - </Platform> - <Platform Name="Win32"> - <Operation>0</Operation> - <Extensions>.dll;.bpl</Extensions> - </Platform> - </DeployClass> - <DeployClass Required="true" Name="DependencyPackage"> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - <Extensions>.dylib</Extensions> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - <Extensions>.dylib</Extensions> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - <Extensions>.dylib</Extensions> - </Platform> - <Platform Name="OSX32"> - <Operation>1</Operation> - <Extensions>.dylib</Extensions> - </Platform> - <Platform Name="OSX64"> - <Operation>1</Operation> - <Extensions>.dylib</Extensions> - </Platform> - <Platform Name="OSXARM64"> - <Operation>1</Operation> - <Extensions>.dylib</Extensions> - </Platform> - <Platform Name="Win32"> - <Operation>0</Operation> - <Extensions>.bpl</Extensions> - </Platform> - </DeployClass> - <DeployClass Name="File"> - <Platform Name="Android"> - <Operation>0</Operation> - </Platform> - <Platform Name="Android64"> - <Operation>0</Operation> - </Platform> - <Platform Name="iOSDevice32"> - <Operation>0</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>0</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>0</Operation> - </Platform> - <Platform Name="OSX32"> - <Operation>0</Operation> - </Platform> - <Platform Name="OSX64"> - <Operation>0</Operation> - </Platform> - <Platform Name="OSXARM64"> - <Operation>0</Operation> - </Platform> - <Platform Name="Win32"> - <Operation>0</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iOS_AppStore1024"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPad_AppIcon152"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPad_AppIcon167"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPad_Launch1024x768"> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPad_Launch1536x2048"> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPad_Launch1668"> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPad_Launch1668x2388"> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPad_Launch2048x1536"> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPad_Launch2048x2732"> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPad_Launch2224"> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPad_Launch2388x1668"> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPad_Launch2732x2048"> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPad_Launch2x"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPad_Launch768x1024"> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPad_LaunchDark2x"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPad_Notification40"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPad_Setting58"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPad_SpotLight80"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_AppIcon120"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_AppIcon180"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_Launch1125"> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_Launch1136x640"> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_Launch1242"> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_Launch1242x2688"> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_Launch1334"> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_Launch1792"> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_Launch2208"> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_Launch2436"> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_Launch2688x1242"> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_Launch2x"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_Launch320"> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_Launch3x"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_Launch640"> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_Launch640x1136"> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_Launch750"> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_Launch828"> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_LaunchDark2x"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_LaunchDark3x"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_Notification40"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_Notification60"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_Setting58"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_Setting87"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_Spotlight120"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="iPhone_Spotlight80"> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="ProjectAndroidManifest"> - <Platform Name="Android"> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="ProjectiOSDeviceDebug"> - <Platform Name="iOSDevice32"> - <RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="ProjectiOSDeviceResourceRules"/> - <DeployClass Name="ProjectiOSEntitlements"/> - <DeployClass Name="ProjectiOSInfoPList"/> - <DeployClass Name="ProjectiOSLaunchScreen"/> - <DeployClass Name="ProjectiOSResource"> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="ProjectOSXDebug"/> - <DeployClass Name="ProjectOSXEntitlements"/> - <DeployClass Name="ProjectOSXInfoPList"/> - <DeployClass Name="ProjectOSXResource"> - <Platform Name="OSX32"> - <RemoteDir>Contents\Resources</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="OSX64"> - <RemoteDir>Contents\Resources</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="OSXARM64"> - <RemoteDir>Contents\Resources</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Required="true" Name="ProjectOutput"> - <Platform Name="Android"> - <RemoteDir>library\lib\armeabi-v7a</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Android64"> - <RemoteDir>library\lib\arm64-v8a</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice32"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSDevice64"> - <Operation>1</Operation> - </Platform> - <Platform Name="iOSSimulator"> - <Operation>1</Operation> - </Platform> - <Platform Name="Linux64"> - <Operation>1</Operation> - </Platform> - <Platform Name="OSX32"> - <Operation>1</Operation> - </Platform> - <Platform Name="OSX64"> - <Operation>1</Operation> - </Platform> - <Platform Name="OSXARM64"> - <Operation>1</Operation> - </Platform> - <Platform Name="Win32"> - <Operation>0</Operation> - </Platform> - </DeployClass> - <DeployClass Name="ProjectOutput_Android32"> - <Platform Name="Android64"> - <RemoteDir>library\lib\armeabi-v7a</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="ProjectUWPManifest"> - <Platform Name="Win32"> - <Operation>1</Operation> - </Platform> - <Platform Name="Win64"> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="UWP_DelphiLogo150"> - <Platform Name="Win32"> - <RemoteDir>Assets</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Win64"> - <RemoteDir>Assets</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <DeployClass Name="UWP_DelphiLogo44"> - <Platform Name="Win32"> - <RemoteDir>Assets</RemoteDir> - <Operation>1</Operation> - </Platform> - <Platform Name="Win64"> - <RemoteDir>Assets</RemoteDir> - <Operation>1</Operation> - </Platform> - </DeployClass> - <ProjectRoot Platform="Android" Name="$(PROJECTNAME)"/> - <ProjectRoot Platform="Android64" Name="$(PROJECTNAME)"/> - <ProjectRoot Platform="iOSDevice32" Name="$(PROJECTNAME).app"/> - <ProjectRoot Platform="iOSDevice64" Name="$(PROJECTNAME).app"/> - <ProjectRoot Platform="iOSSimulator" Name="$(PROJECTNAME).app"/> - <ProjectRoot Platform="Linux64" Name="$(PROJECTNAME)"/> - <ProjectRoot Platform="OSX32" Name="$(PROJECTNAME)"/> - <ProjectRoot Platform="OSX64" Name="$(PROJECTNAME)"/> - <ProjectRoot Platform="OSXARM64" Name="$(PROJECTNAME)"/> - <ProjectRoot Platform="Win32" Name="$(PROJECTNAME)"/> - <ProjectRoot Platform="Win64" Name="$(PROJECTNAME)"/> - </Deployment> - <Platforms> - <Platform value="Linux64">False</Platform> - <Platform value="Win32">True</Platform> - <Platform value="Win64">False</Platform> - </Platforms> - </BorlandProject> - <ProjectFileVersion>12</ProjectFileVersion> - </ProjectExtensions> - <Import Project="$(BDS)\Bin\CodeGear.Delphi.Targets" Condition="Exists('$(BDS)\Bin\CodeGear.Delphi.Targets')"/> - <Import Project="$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj" Condition="Exists('$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj')"/> - <Import Project="$(MSBuildProjectName).deployproj" Condition="Exists('$(MSBuildProjectName).deployproj')"/> -</Project> +<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <PropertyGroup> + <ProjectGuid>{090D8F0A-88C5-4ED1-BF6B-7D62B658AA0C}</ProjectGuid> + <ProjectVersion>19.4</ProjectVersion> + <FrameworkType>None</FrameworkType> + <MainSource>VCL.dpr</MainSource> + <Base>True</Base> + <Config Condition="'$(Config)'==''">Debug</Config> + <Platform Condition="'$(Platform)'==''">Win32</Platform> + <TargetedPlatforms>1</TargetedPlatforms> + <AppType>Console</AppType> + </PropertyGroup> + <PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''"> + <Base>true</Base> + </PropertyGroup> + <PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Base)'=='true') or '$(Base_Win32)'!=''"> + <Base_Win32>true</Base_Win32> + <CfgParent>Base</CfgParent> + <Base>true</Base> + </PropertyGroup> + <PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Base)'=='true') or '$(Base_Win64)'!=''"> + <Base_Win64>true</Base_Win64> + <CfgParent>Base</CfgParent> + <Base>true</Base> + </PropertyGroup> + <PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_1)'!=''"> + <Cfg_1>true</Cfg_1> + <CfgParent>Base</CfgParent> + <Base>true</Base> + </PropertyGroup> + <PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_1)'=='true') or '$(Cfg_1_Win32)'!=''"> + <Cfg_1_Win32>true</Cfg_1_Win32> + <CfgParent>Cfg_1</CfgParent> + <Cfg_1>true</Cfg_1> + <Base>true</Base> + </PropertyGroup> + <PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_2)'!=''"> + <Cfg_2>true</Cfg_2> + <CfgParent>Base</CfgParent> + <Base>true</Base> + </PropertyGroup> + <PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_2)'=='true') or '$(Cfg_2_Win32)'!=''"> + <Cfg_2_Win32>true</Cfg_2_Win32> + <CfgParent>Cfg_2</CfgParent> + <Cfg_2>true</Cfg_2> + <Base>true</Base> + </PropertyGroup> + <PropertyGroup Condition="'$(Config)'=='CI' or '$(Cfg_3)'!=''"> + <Cfg_3>true</Cfg_3> + <CfgParent>Base</CfgParent> + <Base>true</Base> + </PropertyGroup> + <PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_3)'=='true') or '$(Cfg_3_Win32)'!=''"> + <Cfg_3_Win32>true</Cfg_3_Win32> + <CfgParent>Cfg_3</CfgParent> + <Cfg_3>true</Cfg_3> + <Base>true</Base> + </PropertyGroup> + <PropertyGroup Condition="'$(Base)'!=''"> + <DCC_DcuOutput>.\$(Platform)\$(Config)</DCC_DcuOutput> + <DCC_ExeOutput>..\</DCC_ExeOutput> + <DCC_E>false</DCC_E> + <DCC_N>false</DCC_N> + <DCC_S>false</DCC_S> + <DCC_F>false</DCC_F> + <DCC_K>false</DCC_K> + <DCC_Namespace>System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace)</DCC_Namespace> + <Icon_MainIcon>$(BDS)\bin\delphi_PROJECTICON.ico</Icon_MainIcon> + <Icns_MainIcns>$(BDS)\bin\delphi_PROJECTICNS.icns</Icns_MainIcns> + <DCC_UnitSearchPath>$(DUnitX);modules\.dcp;modules\.dcu;modules;modules\dataset-serialize\src\core;modules\dataset-serialize\src\helpers;modules\dataset-serialize\src\providers;modules\dataset-serialize\src\singletons;modules\dataset-serialize\src\types;modules\horse\src;modules\jhonson\src;modules\restrequest4delphi\src\core;modules\restrequest4delphi\src\interfaces;$(DCC_UnitSearchPath)</DCC_UnitSearchPath> + <SanitizedProjectName>VCL</SanitizedProjectName> + <VerInfo_Locale>1046</VerInfo_Locale> + <VerInfo_Keys>CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=</VerInfo_Keys> + <DCC_Define>HORSE_VCL;$(DCC_Define)</DCC_Define> + </PropertyGroup> + <PropertyGroup Condition="'$(Base_Win32)'!=''"> + <DCC_UsePackage>DBXSqliteDriver;IndyIPCommon;RESTComponents;bindcompdbx;DBXInterBaseDriver;vcl;IndyIPServer;vclactnband;RestDatawareCORE;vclFireDAC;IndySystem;tethering;svnui;dsnapcon;FireDACADSDriver;madExcept_;FireDACMSAccDriver;fmxFireDAC;vclimg;madBasic_;FireDAC;vcltouch;vcldb;bindcompfmx;svn;FireDACSqliteDriver;FireDACPgDriver;inetdb;soaprtl;DbxCommonDriver;fmx;FireDACIBDriver;fmxdae;xmlrtl;soapmidas;fmxobj;vclwinx;rtl;madDisAsm_;DbxClientDriver;CustomIPTransport;vcldsnap;dbexpress;IndyCore;RESTDWDriverFD;vclx;bindcomp;appanalytics;dsnap;FireDACCommon;IndyIPClient;bindcompvcl;RESTBackendComponents;VCLRESTComponents;soapserver;dbxcds;VclSmp;adortl;vclie;bindengine;DBXMySQLDriver;CloudService;dsnapxml;FireDACMySQLDriver;dbrtl;IndyProtocols;inetdbxpress;FireDACCommonODBC;FireDACCommonDriver;inet;fmxase;$(DCC_UsePackage)</DCC_UsePackage> + <DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace> + <BT_BuildType>Debug</BT_BuildType> + <VerInfo_Locale>1033</VerInfo_Locale> + <Manifest_File>(None)</Manifest_File> + <DCC_MapFile>3</DCC_MapFile> + </PropertyGroup> + <PropertyGroup Condition="'$(Base_Win64)'!=''"> + <DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace)</DCC_Namespace> + <BT_BuildType>Debug</BT_BuildType> + <VerInfo_Locale>1033</VerInfo_Locale> + <UWP_DelphiLogo44>$(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png</UWP_DelphiLogo44> + <UWP_DelphiLogo150>$(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png</UWP_DelphiLogo150> + </PropertyGroup> + <PropertyGroup Condition="'$(Cfg_1)'!=''"> + <DCC_Define>DEBUG;$(DCC_Define)</DCC_Define> + <DCC_DebugDCUs>true</DCC_DebugDCUs> + <DCC_Optimize>false</DCC_Optimize> + <DCC_GenerateStackFrames>true</DCC_GenerateStackFrames> + <DCC_DebugInfoInExe>true</DCC_DebugInfoInExe> + <DCC_RemoteDebug>true</DCC_RemoteDebug> + </PropertyGroup> + <PropertyGroup Condition="'$(Cfg_1_Win32)'!=''"> + <DCC_RemoteDebug>false</DCC_RemoteDebug> + <VerInfo_Locale>1033</VerInfo_Locale> + </PropertyGroup> + <PropertyGroup Condition="'$(Cfg_2)'!=''"> + <DCC_LocalDebugSymbols>false</DCC_LocalDebugSymbols> + <DCC_Define>RELEASE;$(DCC_Define)</DCC_Define> + <DCC_SymbolReferenceInfo>0</DCC_SymbolReferenceInfo> + <DCC_DebugInformation>0</DCC_DebugInformation> + </PropertyGroup> + <PropertyGroup Condition="'$(Cfg_2_Win32)'!=''"> + <VerInfo_Locale>1033</VerInfo_Locale> + </PropertyGroup> + <PropertyGroup Condition="'$(Cfg_3)'!=''"> + <DCC_Define>CI;$(DCC_Define)</DCC_Define> + </PropertyGroup> + <PropertyGroup Condition="'$(Cfg_3_Win32)'!=''"> + <VerInfo_Locale>1033</VerInfo_Locale> + </PropertyGroup> + <ItemGroup> + <DelphiCompile Include="$(MainSource)"> + <MainSource>MainSource</MainSource> + </DelphiCompile> + <DCCReference Include="..\..\src\Horse.Provider.Console.pas"/> + <DCCReference Include="tests\Tests.Api.Vcl.pas"/> + <DCCReference Include="controllers\Controllers.Api.pas"/> + <DCCReference Include="tests\Tests.Commons.pas"/> + <DCCReference Include="..\..\src\Horse.Commons.pas"/> + <DCCReference Include="..\..\src\Horse.Constants.pas"/> + <DCCReference Include="..\..\src\Horse.Core.Group.Contract.pas"/> + <DCCReference Include="..\..\src\Horse.Core.Group.pas"/> + <DCCReference Include="..\..\src\Horse.Core.Param.Header.pas"/> + <DCCReference Include="..\..\src\Horse.Core.Param.pas"/> + <DCCReference Include="..\..\src\Horse.Core.pas"/> + <DCCReference Include="..\..\src\Horse.Core.Route.Contract.pas"/> + <DCCReference Include="..\..\src\Horse.Core.Route.pas"/> + <DCCReference Include="..\..\src\Horse.Core.RouterTree.pas"/> + <DCCReference Include="..\..\src\Horse.Exception.pas"/> + <DCCReference Include="..\..\src\Horse.pas"/> + <DCCReference Include="..\..\src\Horse.Proc.pas"/> + <DCCReference Include="..\..\src\Horse.Provider.Abstract.pas"/> + <DCCReference Include="..\..\src\ThirdParty.Posix.Syslog.pas"/> + <DCCReference Include="..\..\src\Web.WebConst.pas"/> + <DCCReference Include="tests\Tests.Horse.Core.Param.pas"/> + <DCCReference Include="..\..\src\Horse.Core.Param.Field.pas"/> + <DCCReference Include="..\..\src\Horse.Request.pas"/> + <DCCReference Include="..\..\src\Horse.Response.pas"/> + <DCCReference Include="..\..\src\Horse.Callback.pas"/> + <DCCReference Include="..\..\src\Horse.Core.Param.Config.pas"/> + <DCCReference Include="..\..\src\Horse.Core.RouterTree.NextCaller.pas"/> + <DCCReference Include="..\..\src\Horse.Exception.Interrupted.pas"/> + <DCCReference Include="..\..\src\Horse.Rtti.Helper.pas"/> + <DCCReference Include="..\..\src\Horse.Rtti.pas"/> + <DCCReference Include="..\..\src\Horse.Session.pas"/> + <DCCReference Include="..\..\src\Horse.Provider.Apache.pas"/> + <DCCReference Include="..\..\src\Horse.Provider.CGI.pas"/> + <DCCReference Include="..\..\src\Horse.Provider.Daemon.pas"/> + <DCCReference Include="..\..\src\Horse.Provider.IOHandleSSL.pas"/> + <DCCReference Include="..\..\src\Horse.Provider.ISAPI.pas"/> + <DCCReference Include="..\..\src\Horse.Provider.VCL.pas"/> + <DCCReference Include="..\..\src\Horse.WebModule.pas"> + <Form>HorseWebModule</Form> + <FormType>dfm</FormType> + <DesignClass>TWebModule</DesignClass> + </DCCReference> + <DCCReference Include="..\..\src\Horse.Core.Param.Field.Brackets.pas"/> + <DCCReference Include="..\..\src\Horse.Core.Files.pas"/> + <DCCReference Include="tests\Tests.Horse.Core.Files.pas"/> + <BuildConfiguration Include="Base"> + <Key>Base</Key> + </BuildConfiguration> + <BuildConfiguration Include="Debug"> + <Key>Cfg_1</Key> + <CfgParent>Base</CfgParent> + </BuildConfiguration> + <BuildConfiguration Include="Release"> + <Key>Cfg_2</Key> + <CfgParent>Base</CfgParent> + </BuildConfiguration> + <BuildConfiguration Include="CI"> + <Key>Cfg_3</Key> + <CfgParent>Base</CfgParent> + </BuildConfiguration> + </ItemGroup> + <ProjectExtensions> + <Borland.Personality>Delphi.Personality.12</Borland.Personality> + <Borland.ProjectType>Console</Borland.ProjectType> + <BorlandProject> + <Delphi.Personality> + <Source> + <Source Name="MainSource">VCL.dpr</Source> + </Source> + </Delphi.Personality> + <Deployment Version="3"> + <DeployFile LocalName="$(BDS)\Redist\iossimulator\libcgunwind.1.0.dylib" Class="DependencyModule"> + <Platform Name="iOSSimulator"> + <Overwrite>true</Overwrite> + </Platform> + </DeployFile> + <DeployFile LocalName="$(BDS)\Redist\iossimulator\libpcre.dylib" Class="DependencyModule"> + <Platform Name="iOSSimulator"> + <Overwrite>true</Overwrite> + </Platform> + </DeployFile> + <DeployFile LocalName="$(BDS)\Redist\osx32\libcgunwind.1.0.dylib" Class="DependencyModule"> + <Platform Name="OSX32"> + <Overwrite>true</Overwrite> + </Platform> + </DeployFile> + <DeployFile LocalName="..\VCL.exe" Configuration="CI" Class="ProjectOutput"> + <Platform Name="Win32"> + <RemoteName>VCL.exe</RemoteName> + <Overwrite>true</Overwrite> + </Platform> + </DeployFile> + <DeployFile LocalName="..\VCL.exe" Configuration="Debug" Class="ProjectOutput"> + <Platform Name="Win32"> + <RemoteName>VCL.exe</RemoteName> + <Overwrite>true</Overwrite> + </Platform> + </DeployFile> + <DeployClass Name="AdditionalDebugSymbols"> + <Platform Name="OSX32"> + <Operation>1</Operation> + </Platform> + <Platform Name="Win32"> + <Operation>0</Operation> + </Platform> + </DeployClass> + <DeployClass Name="AndroidClasses"> + <Platform Name="Android"> + <RemoteDir>classes</RemoteDir> + <Operation>64</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>classes</RemoteDir> + <Operation>64</Operation> + </Platform> + </DeployClass> + <DeployClass Name="AndroidClassesDexFile"> + <Platform Name="Android"> + <RemoteDir>classes</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>classes</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="AndroidFileProvider"> + <Platform Name="Android"> + <RemoteDir>res\xml</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>res\xml</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="AndroidGDBServer"> + <Platform Name="Android"> + <RemoteDir>library\lib\armeabi-v7a</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="AndroidLibnativeArmeabiFile"> + <Platform Name="Android"> + <RemoteDir>library\lib\armeabi</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>library\lib\armeabi</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="AndroidLibnativeArmeabiv7aFile"> + <Platform Name="Android64"> + <RemoteDir>library\lib\armeabi-v7a</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="AndroidLibnativeMipsFile"> + <Platform Name="Android"> + <RemoteDir>library\lib\mips</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>library\lib\mips</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="AndroidServiceOutput"> + <Platform Name="Android"> + <RemoteDir>library\lib\armeabi-v7a</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>library\lib\arm64-v8a</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="AndroidServiceOutput_Android32"> + <Platform Name="Android64"> + <RemoteDir>library\lib\armeabi-v7a</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="AndroidSplashImageDef"> + <Platform Name="Android"> + <RemoteDir>res\drawable</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>res\drawable</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="AndroidSplashStyles"> + <Platform Name="Android"> + <RemoteDir>res\values</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>res\values</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="AndroidSplashStylesV21"> + <Platform Name="Android"> + <RemoteDir>res\values-v21</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>res\values-v21</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="Android_Colors"> + <Platform Name="Android"> + <RemoteDir>res\values</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>res\values</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="Android_DefaultAppIcon"> + <Platform Name="Android"> + <RemoteDir>res\drawable</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>res\drawable</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="Android_LauncherIcon144"> + <Platform Name="Android"> + <RemoteDir>res\drawable-xxhdpi</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>res\drawable-xxhdpi</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="Android_LauncherIcon192"> + <Platform Name="Android"> + <RemoteDir>res\drawable-xxxhdpi</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>res\drawable-xxxhdpi</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="Android_LauncherIcon36"> + <Platform Name="Android"> + <RemoteDir>res\drawable-ldpi</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>res\drawable-ldpi</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="Android_LauncherIcon48"> + <Platform Name="Android"> + <RemoteDir>res\drawable-mdpi</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>res\drawable-mdpi</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="Android_LauncherIcon72"> + <Platform Name="Android"> + <RemoteDir>res\drawable-hdpi</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>res\drawable-hdpi</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="Android_LauncherIcon96"> + <Platform Name="Android"> + <RemoteDir>res\drawable-xhdpi</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>res\drawable-xhdpi</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="Android_NotificationIcon24"> + <Platform Name="Android"> + <RemoteDir>res\drawable-mdpi</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>res\drawable-mdpi</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="Android_NotificationIcon36"> + <Platform Name="Android"> + <RemoteDir>res\drawable-hdpi</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>res\drawable-hdpi</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="Android_NotificationIcon48"> + <Platform Name="Android"> + <RemoteDir>res\drawable-xhdpi</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>res\drawable-xhdpi</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="Android_NotificationIcon72"> + <Platform Name="Android"> + <RemoteDir>res\drawable-xxhdpi</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>res\drawable-xxhdpi</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="Android_NotificationIcon96"> + <Platform Name="Android"> + <RemoteDir>res\drawable-xxxhdpi</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>res\drawable-xxxhdpi</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="Android_SplashImage426"> + <Platform Name="Android"> + <RemoteDir>res\drawable-small</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>res\drawable-small</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="Android_SplashImage470"> + <Platform Name="Android"> + <RemoteDir>res\drawable-normal</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>res\drawable-normal</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="Android_SplashImage640"> + <Platform Name="Android"> + <RemoteDir>res\drawable-large</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>res\drawable-large</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="Android_SplashImage960"> + <Platform Name="Android"> + <RemoteDir>res\drawable-xlarge</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>res\drawable-xlarge</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="Android_Strings"> + <Platform Name="Android"> + <RemoteDir>res\values</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>res\values</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="DebugSymbols"> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + </Platform> + <Platform Name="OSX32"> + <Operation>1</Operation> + </Platform> + <Platform Name="Win32"> + <Operation>0</Operation> + </Platform> + </DeployClass> + <DeployClass Name="DependencyFramework"> + <Platform Name="OSX32"> + <Operation>1</Operation> + <Extensions>.framework</Extensions> + </Platform> + <Platform Name="OSX64"> + <Operation>1</Operation> + <Extensions>.framework</Extensions> + </Platform> + <Platform Name="OSXARM64"> + <Operation>1</Operation> + <Extensions>.framework</Extensions> + </Platform> + <Platform Name="Win32"> + <Operation>0</Operation> + </Platform> + </DeployClass> + <DeployClass Name="DependencyModule"> + <Platform Name="OSX32"> + <Operation>1</Operation> + <Extensions>.dylib</Extensions> + </Platform> + <Platform Name="OSX64"> + <Operation>1</Operation> + <Extensions>.dylib</Extensions> + </Platform> + <Platform Name="OSXARM64"> + <Operation>1</Operation> + <Extensions>.dylib</Extensions> + </Platform> + <Platform Name="Win32"> + <Operation>0</Operation> + <Extensions>.dll;.bpl</Extensions> + </Platform> + </DeployClass> + <DeployClass Required="true" Name="DependencyPackage"> + <Platform Name="iOSDevice32"> + <Operation>1</Operation> + <Extensions>.dylib</Extensions> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>1</Operation> + <Extensions>.dylib</Extensions> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + <Extensions>.dylib</Extensions> + </Platform> + <Platform Name="OSX32"> + <Operation>1</Operation> + <Extensions>.dylib</Extensions> + </Platform> + <Platform Name="OSX64"> + <Operation>1</Operation> + <Extensions>.dylib</Extensions> + </Platform> + <Platform Name="OSXARM64"> + <Operation>1</Operation> + <Extensions>.dylib</Extensions> + </Platform> + <Platform Name="Win32"> + <Operation>0</Operation> + <Extensions>.bpl</Extensions> + </Platform> + </DeployClass> + <DeployClass Name="File"> + <Platform Name="Android"> + <Operation>0</Operation> + </Platform> + <Platform Name="Android64"> + <Operation>0</Operation> + </Platform> + <Platform Name="iOSDevice32"> + <Operation>0</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>0</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>0</Operation> + </Platform> + <Platform Name="OSX32"> + <Operation>0</Operation> + </Platform> + <Platform Name="OSX64"> + <Operation>0</Operation> + </Platform> + <Platform Name="OSXARM64"> + <Operation>0</Operation> + </Platform> + <Platform Name="Win32"> + <Operation>0</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iOS_AppStore1024"> + <Platform Name="iOSDevice64"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPad_AppIcon152"> + <Platform Name="iOSDevice64"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPad_AppIcon167"> + <Platform Name="iOSDevice64"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPad_Launch1024x768"> + <Platform Name="iOSDevice32"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPad_Launch1536x2048"> + <Platform Name="iOSDevice32"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPad_Launch1668"> + <Platform Name="iOSDevice32"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPad_Launch1668x2388"> + <Platform Name="iOSDevice32"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPad_Launch2048x1536"> + <Platform Name="iOSDevice32"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPad_Launch2048x2732"> + <Platform Name="iOSDevice32"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPad_Launch2224"> + <Platform Name="iOSDevice32"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPad_Launch2388x1668"> + <Platform Name="iOSDevice32"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPad_Launch2732x2048"> + <Platform Name="iOSDevice32"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPad_Launch2x"> + <Platform Name="iOSDevice64"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPad_Launch768x1024"> + <Platform Name="iOSDevice32"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPad_LaunchDark2x"> + <Platform Name="iOSDevice64"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPad_Notification40"> + <Platform Name="iOSDevice64"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPad_Setting58"> + <Platform Name="iOSDevice64"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPad_SpotLight80"> + <Platform Name="iOSDevice64"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPhone_AppIcon120"> + <Platform Name="iOSDevice64"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPhone_AppIcon180"> + <Platform Name="iOSDevice64"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPhone_Launch1125"> + <Platform Name="iOSDevice32"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPhone_Launch1136x640"> + <Platform Name="iOSDevice32"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPhone_Launch1242"> + <Platform Name="iOSDevice32"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPhone_Launch1242x2688"> + <Platform Name="iOSDevice32"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPhone_Launch1334"> + <Platform Name="iOSDevice32"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPhone_Launch1792"> + <Platform Name="iOSDevice32"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPhone_Launch2208"> + <Platform Name="iOSDevice32"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPhone_Launch2436"> + <Platform Name="iOSDevice32"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPhone_Launch2688x1242"> + <Platform Name="iOSDevice32"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPhone_Launch2x"> + <Platform Name="iOSDevice64"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPhone_Launch320"> + <Platform Name="iOSDevice32"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPhone_Launch3x"> + <Platform Name="iOSDevice64"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPhone_Launch640"> + <Platform Name="iOSDevice32"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPhone_Launch640x1136"> + <Platform Name="iOSDevice32"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPhone_Launch750"> + <Platform Name="iOSDevice32"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPhone_Launch828"> + <Platform Name="iOSDevice32"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPhone_LaunchDark2x"> + <Platform Name="iOSDevice64"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPhone_LaunchDark3x"> + <Platform Name="iOSDevice64"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPhone_Notification40"> + <Platform Name="iOSDevice64"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPhone_Notification60"> + <Platform Name="iOSDevice64"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPhone_Setting58"> + <Platform Name="iOSDevice64"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPhone_Setting87"> + <Platform Name="iOSDevice64"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPhone_Spotlight120"> + <Platform Name="iOSDevice64"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="iPhone_Spotlight80"> + <Platform Name="iOSDevice64"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="ProjectAndroidManifest"> + <Platform Name="Android"> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="ProjectiOSDeviceDebug"> + <Platform Name="iOSDevice32"> + <RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="ProjectiOSDeviceResourceRules"/> + <DeployClass Name="ProjectiOSEntitlements"/> + <DeployClass Name="ProjectiOSInfoPList"/> + <DeployClass Name="ProjectiOSLaunchScreen"/> + <DeployClass Name="ProjectiOSResource"> + <Platform Name="iOSDevice32"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="ProjectOSXDebug"/> + <DeployClass Name="ProjectOSXEntitlements"/> + <DeployClass Name="ProjectOSXInfoPList"/> + <DeployClass Name="ProjectOSXResource"> + <Platform Name="OSX32"> + <RemoteDir>Contents\Resources</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="OSX64"> + <RemoteDir>Contents\Resources</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="OSXARM64"> + <RemoteDir>Contents\Resources</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Required="true" Name="ProjectOutput"> + <Platform Name="Android"> + <RemoteDir>library\lib\armeabi-v7a</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Android64"> + <RemoteDir>library\lib\arm64-v8a</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice32"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSDevice64"> + <Operation>1</Operation> + </Platform> + <Platform Name="iOSSimulator"> + <Operation>1</Operation> + </Platform> + <Platform Name="Linux64"> + <Operation>1</Operation> + </Platform> + <Platform Name="OSX32"> + <Operation>1</Operation> + </Platform> + <Platform Name="OSX64"> + <Operation>1</Operation> + </Platform> + <Platform Name="OSXARM64"> + <Operation>1</Operation> + </Platform> + <Platform Name="Win32"> + <Operation>0</Operation> + </Platform> + </DeployClass> + <DeployClass Name="ProjectOutput_Android32"> + <Platform Name="Android64"> + <RemoteDir>library\lib\armeabi-v7a</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="ProjectUWPManifest"> + <Platform Name="Win32"> + <Operation>1</Operation> + </Platform> + <Platform Name="Win64"> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="UWP_DelphiLogo150"> + <Platform Name="Win32"> + <RemoteDir>Assets</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Win64"> + <RemoteDir>Assets</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <DeployClass Name="UWP_DelphiLogo44"> + <Platform Name="Win32"> + <RemoteDir>Assets</RemoteDir> + <Operation>1</Operation> + </Platform> + <Platform Name="Win64"> + <RemoteDir>Assets</RemoteDir> + <Operation>1</Operation> + </Platform> + </DeployClass> + <ProjectRoot Platform="Android" Name="$(PROJECTNAME)"/> + <ProjectRoot Platform="Android64" Name="$(PROJECTNAME)"/> + <ProjectRoot Platform="iOSDevice32" Name="$(PROJECTNAME).app"/> + <ProjectRoot Platform="iOSDevice64" Name="$(PROJECTNAME).app"/> + <ProjectRoot Platform="iOSSimulator" Name="$(PROJECTNAME).app"/> + <ProjectRoot Platform="Linux64" Name="$(PROJECTNAME)"/> + <ProjectRoot Platform="OSX32" Name="$(PROJECTNAME)"/> + <ProjectRoot Platform="OSX64" Name="$(PROJECTNAME)"/> + <ProjectRoot Platform="OSXARM64" Name="$(PROJECTNAME)"/> + <ProjectRoot Platform="Win32" Name="$(PROJECTNAME)"/> + <ProjectRoot Platform="Win64" Name="$(PROJECTNAME)"/> + </Deployment> + <Platforms> + <Platform value="Linux64">False</Platform> + <Platform value="Win32">True</Platform> + <Platform value="Win64">False</Platform> + </Platforms> + </BorlandProject> + <ProjectFileVersion>12</ProjectFileVersion> + </ProjectExtensions> + <Import Project="$(BDS)\Bin\CodeGear.Delphi.Targets" Condition="Exists('$(BDS)\Bin\CodeGear.Delphi.Targets')"/> + <Import Project="$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj" Condition="Exists('$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj')"/> + <Import Project="$(MSBuildProjectName).deployproj" Condition="Exists('$(MSBuildProjectName).deployproj')"/> +</Project> diff --git a/tests/src/boss-lock.json b/tests/src/boss-lock.json index 374a1ab..b61ad1f 100644 --- a/tests/src/boss-lock.json +++ b/tests/src/boss-lock.json @@ -1,38 +1,38 @@ -{ - "hash": "d41d8cd98f00b204e9800998ecf8427e", - "updated": "2020-11-06T18:22:13.4788482-03:00", - "installedModules": { - "github.com/hashload/horse": { - "name": "horse", - "version": "2.0.12", - "hash": "f84996b61e4272d67e0616dea15559a1", - "artifacts": {}, - "failed": false, - "changed": false - }, - "github.com/hashload/jhonson": { - "name": "jhonson", - "version": "1.1.1", - "hash": "5740da7df1068b882117a68df8098c9a", - "artifacts": {}, - "failed": false, - "changed": false - }, - "github.com/viniciussanchez/dataset-serialize": { - "name": "dataset-serialize", - "version": "v2.2.1", - "hash": "646b2573e09830d31dbccd05531e50ed", - "artifacts": {}, - "failed": false, - "changed": false - }, - "github.com/viniciussanchez/restrequest4delphi": { - "name": "restrequest4delphi", - "version": "v2.2.6", - "hash": "b2b28029d1ee379981222f32ff255734", - "artifacts": {}, - "failed": false, - "changed": false - } - } +{ + "hash": "d41d8cd98f00b204e9800998ecf8427e", + "updated": "2020-11-06T18:22:13.4788482-03:00", + "installedModules": { + "github.com/hashload/horse": { + "name": "horse", + "version": "2.0.12", + "hash": "f84996b61e4272d67e0616dea15559a1", + "artifacts": {}, + "failed": false, + "changed": false + }, + "github.com/hashload/jhonson": { + "name": "jhonson", + "version": "1.1.1", + "hash": "5740da7df1068b882117a68df8098c9a", + "artifacts": {}, + "failed": false, + "changed": false + }, + "github.com/viniciussanchez/dataset-serialize": { + "name": "dataset-serialize", + "version": "v2.2.1", + "hash": "646b2573e09830d31dbccd05531e50ed", + "artifacts": {}, + "failed": false, + "changed": false + }, + "github.com/viniciussanchez/restrequest4delphi": { + "name": "restrequest4delphi", + "version": "v2.2.6", + "hash": "b2b28029d1ee379981222f32ff255734", + "artifacts": {}, + "failed": false, + "changed": false + } + } } \ No newline at end of file diff --git a/tests/src/boss.json b/tests/src/boss.json index 5738f96..cebf1e0 100644 --- a/tests/src/boss.json +++ b/tests/src/boss.json @@ -1,12 +1,12 @@ -{ - "name": "src", - "description": "", - "version": "1.0.0", - "homepage": "", - "mainsrc": "./", - "projects": [], - "dependencies": { - "github.com/hashload/jhonson": "^1.1.1", - "github.com/viniciussanchez/restrequest4delphi": "^v2.2.6" - } +{ + "name": "src", + "description": "", + "version": "1.0.0", + "homepage": "", + "mainsrc": "./", + "projects": [], + "dependencies": { + "github.com/hashload/jhonson": "^1.1.1", + "github.com/viniciussanchez/restrequest4delphi": "^v2.2.6" + } } \ No newline at end of file diff --git a/tests/src/tests/Tests.Horse.Core.Files.pas b/tests/src/tests/Tests.Horse.Core.Files.pas index 8df17b9..c779fd7 100644 --- a/tests/src/tests/Tests.Horse.Core.Files.pas +++ b/tests/src/tests/Tests.Horse.Core.Files.pas @@ -1,83 +1,83 @@ -unit Tests.Horse.Core.Files; - -interface - -uses - DUnitX.TestFramework, - Horse.Core.Files, - System.Classes, - System.SysUtils; - -type - [TestFixture] - TTestHorseCoreFile = class - private - FHorseFile: THorseCoreFile; - FFileName: String; - - public - [Setup] - procedure Setup; - - [Teardown] - procedure Teardown; - - [Test] - procedure EmptyFileName; - - [Test] - procedure InvalidFileName; - - [Test] - procedure DelphiFile; - end; - -implementation - -{ TTestHorseCoreFile } - -procedure TTestHorseCoreFile.DelphiFile; -begin - FFileName := ExtractFilePath(GetModuleName(HInstance)); - FFileName := FFileName.Replace('tests\', 'src\Horse.pas'); - - FHorseFile := THorseCoreFile.Create(FFileName); - - Assert.AreEqual('text/x-pascal', FHorseFile.ContentType); - Assert.IsNotNull(FHorseFile.ContentStream); - Assert.IsTrue(FHorseFile.Size > 0); -end; - -procedure TTestHorseCoreFile.EmptyFileName; -begin - Assert.WillRaiseWithMessage( - procedure - begin - FHorseFile := THorseCoreFile.Create(EmptyStr); - end, - Exception, - 'Invalid FileName'); -end; - -procedure TTestHorseCoreFile.InvalidFileName; -begin - Assert.WillRaiseWithMessage( - procedure - begin - FHorseFile := THorseCoreFile.Create('C:\InvalidFile.txt2'); - end, - Exception, - 'File not exist'); -end; - -procedure TTestHorseCoreFile.Setup; -begin - FFileName := EmptyStr; -end; - -procedure TTestHorseCoreFile.Teardown; -begin - FreeAndNil(FHorseFile); -end; - -end. +unit Tests.Horse.Core.Files; + +interface + +uses + DUnitX.TestFramework, + Horse.Core.Files, + System.Classes, + System.SysUtils; + +type + [TestFixture] + TTestHorseCoreFile = class + private + FHorseFile: THorseCoreFile; + FFileName: String; + + public + [Setup] + procedure Setup; + + [Teardown] + procedure Teardown; + + [Test] + procedure EmptyFileName; + + [Test] + procedure InvalidFileName; + + [Test] + procedure DelphiFile; + end; + +implementation + +{ TTestHorseCoreFile } + +procedure TTestHorseCoreFile.DelphiFile; +begin + FFileName := ExtractFilePath(GetModuleName(HInstance)); + FFileName := FFileName.Replace('tests\', 'src\Horse.pas'); + + FHorseFile := THorseCoreFile.Create(FFileName); + + Assert.AreEqual('text/x-pascal', FHorseFile.ContentType); + Assert.IsNotNull(FHorseFile.ContentStream); + Assert.IsTrue(FHorseFile.Size > 0); +end; + +procedure TTestHorseCoreFile.EmptyFileName; +begin + Assert.WillRaiseWithMessage( + procedure + begin + FHorseFile := THorseCoreFile.Create(EmptyStr); + end, + Exception, + 'Invalid FileName'); +end; + +procedure TTestHorseCoreFile.InvalidFileName; +begin + Assert.WillRaiseWithMessage( + procedure + begin + FHorseFile := THorseCoreFile.Create('C:\InvalidFile.txt2'); + end, + Exception, + 'File not exist'); +end; + +procedure TTestHorseCoreFile.Setup; +begin + FFileName := EmptyStr; +end; + +procedure TTestHorseCoreFile.Teardown; +begin + FreeAndNil(FHorseFile); +end; + +end. diff --git a/tests/src/tests/Tests.Horse.Core.Param.pas b/tests/src/tests/Tests.Horse.Core.Param.pas index 62a2872..a55cd90 100644 --- a/tests/src/tests/Tests.Horse.Core.Param.pas +++ b/tests/src/tests/Tests.Horse.Core.Param.pas @@ -1,886 +1,886 @@ -unit Tests.Horse.Core.Param; - -interface - -uses - DUnitX.TestFramework, - Horse.Exception, - Horse.Core.Param, - System.Generics.Collections, - System.Classes, - System.DateUtils, - System.SysUtils; - -type - [TestFixture] - TTestHorseCoreParam = class - private - FParams: TDictionary<string, String>; - FHorseParam: THorseCoreParam; - FData: TDateTime; - FTime: TTime; - FFormatSettings: TFormatSettings; - FStream: TStream; - - function RequiredMessage(const AKey: String): string; - function ConvertErrorMessage(const AKey, AValue, AType: String): string; - - public - [Setup] - procedure Setup; - - [TearDown] - procedure TearDown; - - [Test] - procedure ContainsKey; - - [Test] - procedure NotContainsKey; - - [Test] - procedure ContainsKeyDiferentCase; - - [Test] - procedure ContainsValue; - - [Test] - procedure NotContainsValue; - - [Test] - procedure ToArray; - - [Test] - procedure TryGetValueTrue; - - [Test] - procedure TryGetValueFalse; - - [Test] - procedure TryGetValueDiferentCase; - - [Test] - procedure Content; - - [Test] - procedure Count; - - [Test] - procedure List; - - [Test] - procedure Index; - - [Test] - procedure IndexNotFound; - - [Test] - procedure IndexDiferentCase; - - [Test] - procedure AsBoolean; - - [Test] - [TestCase('TrueValue1', 'True,true,true')] - [TestCase('TrueValue2', '1,1,true')] - [TestCase('FalseValue1', 'False,true,false')] - [TestCase('FalseValue2', '5,1,false')] - procedure AsBooleanParam(AParamValue, ATrueValue: string; AResult: Boolean); - - [Test] - procedure AsBooleanNotRequired; - - [Test] - procedure AsBooleanRequired; - - [Test] - procedure AsCurrency; - - [Test] - procedure AsCurrencyDecimalSeparator; - - [Test] - procedure AsCurrencyNotRequired; - - [Test] - procedure AsCurrencyRequired; - - [Test] - procedure AsCurrencyErrorFormat; - - [Test] - procedure AsDateTime; - - [Test] - procedure AsDateTimeRequired; - - [Test] - procedure AsDateTimeNotRequired; - - [Test] - procedure AsDateTimeOnlyData; - - [Test] - procedure AsDateTimeChangeFormat; - - [Test] - procedure AsDateTimeInvalidFormat; - - [Test] - procedure AsDate; - - [Test] - procedure AsDateRequired; - - [Test] - procedure AsDateNotRequired; - - [Test] - procedure AsDateChangeFormat; - - [Test] - procedure AsDateInvalidFormat; - - [Test] - procedure AsExtended; - - [Test] - procedure AsExtendedDecimalSeparator; - - [Test] - procedure AsExtendedNotRequired; - - [Test] - procedure AsExtendedRequired; - - [Test] - procedure AsExtendedErrorFormat; - - [Test] - procedure AsFloat; - - [Test] - procedure AsFloatDecimalSeparator; - - [Test] - procedure AsFloatNotRequired; - - [Test] - procedure AsFloatRequired; - - [Test] - procedure AsFloatErrorFormat; - - [Test] - procedure AsInteger; - - [Test] - procedure AsIntegerNotRequired; - - [Test] - procedure AsIntegerRequired; - - [Test] - procedure AsIntegerErrorFormat; - - [Test] - procedure AsInt64; - - [Test] - procedure AsInt64NotRequired; - - [Test] - procedure AsInt64Required; - - [Test] - procedure AsInt64ErrorFormat; - - [Test] - procedure AsISO8601DateTime; - - [Test] - procedure AsISO8601DateTimeOnlyData; - - [Test] - procedure AsISO8601DateTimeNotRequired; - - [Test] - procedure AsISO8601DateTimeRequired; - - [Test] - procedure AsISO8601DateTimeErrorFormat; - - [Test] - procedure AsStream; - - [Test] - procedure AsStreamNotFoundNotRequired; - - [Test] - procedure AsStreamNotFoundRequired; - - [Test] - procedure AsStreamSaveToFile; - - [Test] - procedure AsStreamNotFoundSaveToFile; - - [Test] - procedure AsString; - - [Test] - procedure AsStringRequired; - - [Test] - procedure AsStringNotRequired; - - [Test] - procedure AsStringDiferentCase; - - [Test] - procedure AsTime; - - [Test] - procedure AsTimeRequired; - - [Test] - procedure AsTimeNotRequired; - - [Test] - procedure AsTimeChangeFormat; - - [Test] - procedure AsTimeInvalidFormat; - end; - -implementation - -{ TTestHorseCoreParam } - -procedure TTestHorseCoreParam.AsBoolean; -begin - FParams.AddOrSetValue('Key1', 'True'); - Assert.IsTrue(FHorseParam.Field('Key1').Required.AsBoolean); -end; - -procedure TTestHorseCoreParam.AsBooleanNotRequired; -begin - Assert.IsFalse(FHorseParam.Field('Key1').AsBoolean); -end; - -procedure TTestHorseCoreParam.AsBooleanParam(AParamValue, ATrueValue: string; AResult: Boolean); -begin - FParams.AddOrSetValue('Key1', AParamValue); - Assert.AreEqual(AResult, FHorseParam.Field('Key1').Required.TrueValue(ATrueValue).AsBoolean); -end; - -procedure TTestHorseCoreParam.AsBooleanRequired; -begin - Assert.WillRaiseWithMessage( - procedure - begin - FHorseParam.Field('Key1').Required.AsBoolean; - end, - EHorseException, - RequiredMessage('Key1')); -end; - -procedure TTestHorseCoreParam.AsCurrency; -begin - FParams.AddOrSetValue('Key1', '5.5'); - Assert.AreEqual('5,5', CurrToStr( FHorseParam.Field('Key1').AsCurrency)); -end; - -procedure TTestHorseCoreParam.AsCurrencyDecimalSeparator; -begin - FParams.AddOrSetValue('Key1', '5,5'); - Assert.AreEqual('5,5', CurrToStr( FHorseParam.Field('Key1').AsCurrency)); -end; - -procedure TTestHorseCoreParam.AsCurrencyErrorFormat; -begin - FParams.AddOrSetValue('Key1', '5a'); - Assert.WillRaiseWithMessage( - procedure - begin - FHorseParam.Field('Key1').AsCurrency; - end, - EHorseException, - ConvertErrorMessage('Key1', '5a', 'numeric')); -end; - -procedure TTestHorseCoreParam.AsCurrencyNotRequired; -begin - Assert.AreEqual('0', CurrToStr(FHorseParam.Field('Key1').AsCurrency)); -end; - -procedure TTestHorseCoreParam.AsCurrencyRequired; -begin - Assert.WillRaiseWithMessage( - procedure - begin - FHorseParam.Field('Key1').Required.AsCurrency; - end, - EHorseException, - RequiredMessage('Key1')); -end; - -procedure TTestHorseCoreParam.AsDate; -begin - FData := EncodeDate(2021, 11, 13); - FParams.Add('Key1', '2021-11-13 10:25:32'); - - Assert.AreEqual(DateToStr(FData), DateToStr(FHorseParam.Field('Key1').AsDate)); -end; - -procedure TTestHorseCoreParam.AsDateChangeFormat; -begin - FData := EncodeDate(2021, 11, 13); - FParams.Add('Key1', '13/11/2021'); - - Assert.AreEqual(DateToStr(FData), DateToStr(FHorseParam.Field('Key1').Required.DateFormat('dd/MM/yyyy').AsDate)); -end; - -procedure TTestHorseCoreParam.AsDateInvalidFormat; -begin - FParams.Add('Key1', '2021/11-13'); - - Assert.WillRaiseWithMessage( - procedure - begin - FHorseParam.Field('Key1').AsDate; - end, - EHorseException, - ConvertErrorMessage('Key1', '2021/11-13', 'date')); -end; - -procedure TTestHorseCoreParam.AsDateNotRequired; -begin - Assert.IsTrue(FHorseParam.Field('Key1').AsDate = 0); -end; - -procedure TTestHorseCoreParam.AsDateRequired; -begin - Assert.WillRaiseWithMessage( - procedure - begin - FHorseParam.Field('Key1').Required.AsDate; - end, - EHorseException, - RequiredMessage('Key1')); -end; - -procedure TTestHorseCoreParam.AsDateTime; -begin - FData := EncodeDateTime(2021, 11, 13, 10, 25, 32, 0); - FParams.Add('Key1', '2021-11-13 10:25:32'); - - Assert.AreEqual(DateToStr(FData), DateToStr(FHorseParam.Field('Key1').AsDateTime)); -end; - -procedure TTestHorseCoreParam.AsDateTimeChangeFormat; -begin - FData := EncodeDateTime(2021, 11, 13, 10, 25, 32, 0); - FParams.Add('Key1', '13/11/2021 10:25:32'); - - Assert.AreEqual(DateToStr(FData), DateToStr(FHorseParam.Field('Key1').Required.DateFormat('dd/MM/yyyy').AsDateTime)); -end; - -procedure TTestHorseCoreParam.AsDateTimeInvalidFormat; -begin - FParams.Add('Key1', '2021/11-13 10:25:32'); - - Assert.WillRaiseWithMessage( - procedure - begin - FHorseParam.Field('Key1').AsDateTime; - end, - EHorseException, - ConvertErrorMessage('Key1', '2021/11-13 10:25:32', 'datetime')); -end; - -procedure TTestHorseCoreParam.AsDateTimeNotRequired; -begin - Assert.IsTrue(FHorseParam.Field('Key1').Required(False).AsDateTime = 0); -end; - -procedure TTestHorseCoreParam.AsDateTimeOnlyData; -begin - FData := EncodeDate(2021, 11, 13); - FParams.Add('Key1', '2021-11-13'); - - Assert.AreEqual(DateToStr(FData), DateToStr(FHorseParam.Field('Key1').AsDateTime)); -end; - -procedure TTestHorseCoreParam.AsDateTimeRequired; -begin - Assert.WillRaiseWithMessage( - procedure - begin - FHorseParam.Field('Key1').Required.AsDateTime; - end, - EHorseException, - RequiredMessage('Key1')); -end; - -procedure TTestHorseCoreParam.AsExtended; -begin - FParams.AddOrSetValue('Key1', '5.5'); - Assert.AreEqual('5,5', FHorseParam.Field('Key1').AsExtended.ToString(FFormatSettings)); -end; - -procedure TTestHorseCoreParam.AsExtendedDecimalSeparator; -begin - FParams.AddOrSetValue('Key1', '5,5'); - Assert.AreEqual('5,5', FHorseParam.Field('Key1').AsExtended.ToString(FFormatSettings)); -end; - -procedure TTestHorseCoreParam.AsExtendedErrorFormat; -begin - FParams.AddOrSetValue('Key1', '5a'); - Assert.WillRaiseWithMessage( - procedure - begin - FHorseParam.Field('Key1').Required.AsExtended; - end, - EHorseException, - ConvertErrorMessage('Key1', '5a', 'numeric')); -end; - -procedure TTestHorseCoreParam.AsExtendedNotRequired; -begin - Assert.AreEqual('0', FHorseParam.Field('Key1').AsExtended.ToString); -end; - -procedure TTestHorseCoreParam.AsExtendedRequired; -begin - Assert.WillRaiseWithMessage( - procedure - begin - FHorseParam.Field('Key1').Required.AsExtended; - end, - EHorseException, - RequiredMessage('Key1')); -end; - -procedure TTestHorseCoreParam.AsFloat; -begin - FParams.AddOrSetValue('Key1', '5.5'); - Assert.AreEqual('5,5', FHorseParam.Field('Key1').AsFloat.ToString(FFormatSettings)); -end; - -procedure TTestHorseCoreParam.AsFloatDecimalSeparator; -begin - FParams.AddOrSetValue('Key1', '5,5'); - Assert.AreEqual('5,5', FHorseParam.Field('Key1').AsFloat.ToString(FFormatSettings)); -end; - -procedure TTestHorseCoreParam.AsFloatErrorFormat; -begin - FParams.AddOrSetValue('Key1', '5a'); - Assert.WillRaiseWithMessage( - procedure - begin - FHorseParam.Field('Key1').AsFloat; - end, - EHorseException, - ConvertErrorMessage('Key1', '5a', 'numeric')); -end; - -procedure TTestHorseCoreParam.AsFloatNotRequired; -begin - Assert.AreEqual('0', FHorseParam.Field('Key1').Required(False).AsFloat.ToString); -end; - -procedure TTestHorseCoreParam.AsFloatRequired; -begin - Assert.WillRaiseWithMessage( - procedure - begin - FHorseParam.Field('Key1').Required(True).AsFloat; - end, - EHorseException, - RequiredMessage('Key1')); -end; - -procedure TTestHorseCoreParam.AsInt64; -begin - FParams.AddOrSetValue('Key1', '5'); - Assert.AreEqual('5', FHorseParam.Field('Key1').AsInt64.ToString); -end; - -procedure TTestHorseCoreParam.AsInt64ErrorFormat; -begin - FParams.AddOrSetValue('Key1', 'Value'); - Assert.WillRaiseWithMessage( - procedure - begin - FHorseParam.Field('Key1').AsInt64; - end, - EHorseException, - ConvertErrorMessage('Key1', 'Value', 'int64')); -end; - -procedure TTestHorseCoreParam.AsInt64NotRequired; -begin - Assert.AreEqual('0', FHorseParam.Field('Key1').Required(False).AsInt64.ToString); -end; - -procedure TTestHorseCoreParam.AsInt64Required; -begin - Assert.WillRaiseWithMessage( - procedure - begin - FHorseParam.Field('Key1').Required(True).AsInt64; - end, - EHorseException, - RequiredMessage('Key1')); -end; - -procedure TTestHorseCoreParam.AsInteger; -begin - FParams.AddOrSetValue('Key1', '5'); - Assert.AreEqual(5, FHorseParam.Field('Key1').AsInteger); -end; - -procedure TTestHorseCoreParam.AsIntegerErrorFormat; -begin - FParams.AddOrSetValue('Key1', 'Value'); - Assert.WillRaiseWithMessage( - procedure - begin - FHorseParam.Field('Key1').AsInteger; - end, - EHorseException, - ConvertErrorMessage('Key1', 'Value', 'integer')); -end; - -procedure TTestHorseCoreParam.AsIntegerNotRequired; -begin - Assert.AreEqual(0, FHorseParam.Field('Key1').AsInteger); -end; - -procedure TTestHorseCoreParam.AsIntegerRequired; -begin - Assert.WillRaiseWithMessage( - procedure - begin - FHorseParam.Field('Key1').Required(True).AsInteger; - end, - EHorseException, - RequiredMessage('Key1')); -end; - -procedure TTestHorseCoreParam.AsISO8601DateTime; -begin - FData := EncodeDateTime(2021, 11, 13, 10, 21, 22, 0); - FParams.AddOrSetValue('Key1', '2021-11-13T10:21:22'); - - Assert.AreEqual(DateToStr(FData), DateToStr(FHorseParam.Field('Key1').AsISO8601DateTime)); -end; - -procedure TTestHorseCoreParam.AsISO8601DateTimeErrorFormat; -begin - FParams.AddOrSetValue('Key1', '2021-11-13 10:21:22'); - Assert.WillNotRaiseWithMessage( - procedure - begin - FHorseParam.Field('Key1').AsISO8601DateTime; - end, - EHorseException, - RequiredMessage('Key1')); -end; - -procedure TTestHorseCoreParam.AsISO8601DateTimeNotRequired; -begin - Assert.IsTrue(FHorseParam.Field('Key1').Required(False).AsISO8601DateTime = 0); -end; - -procedure TTestHorseCoreParam.AsISO8601DateTimeOnlyData; -begin - FData := EncodeDateTime(2021, 11, 13, 10, 21, 22, 0); - FParams.AddOrSetValue('Key1', '2021-11-13'); - - Assert.AreEqual(FormatDateTime('dd/MM/yyyy', FData), FormatDateTime('dd/MM/yyyy', FHorseParam.Field('Key1').AsISO8601DateTime)); -end; - -procedure TTestHorseCoreParam.AsISO8601DateTimeRequired; -begin - Assert.WillRaiseWithMessage( - procedure - begin - FHorseParam.Field('Key1').Required.AsISO8601DateTime; - end, - EHorseException, - RequiredMessage('Key1')); -end; - -procedure TTestHorseCoreParam.AsStream; -begin - FStream := TStringStream.Create('1234'); - FHorseParam.AddStream('Key1', FStream); - - Assert.IsNotNull(FHorseParam.Field('Key1').AsStream); - Assert.AreEqual<Int64>(0, FHorseParam.Field('Key1').AsStream.Position); -end; - -procedure TTestHorseCoreParam.AsStreamNotFoundNotRequired; -begin - Assert.IsNull(FHorseParam.Field('Key1').AsStream); -end; - -procedure TTestHorseCoreParam.AsStreamNotFoundRequired; -begin - Assert.WillRaiseWithMessage( - procedure - begin - FHorseParam.Field('Key1').Required(True).AsStream - end, - EHorseException, - RequiredMessage('Key1')); -end; - -procedure TTestHorseCoreParam.AsStreamNotFoundSaveToFile; -var - LFile: String; -begin - LFile := 'test.txt'; - Assert.IsFalse(FileExists(LFile)); - - FHorseParam.Field('Key1').SaveToFile(LFile); - Assert.IsFalse(FileExists(LFile)); -end; - -procedure TTestHorseCoreParam.AsStreamSaveToFile; -var - LFile: String; -begin - LFile := 'test.txt'; - Assert.IsFalse(FileExists(LFile)); - - FStream := TStringStream.Create('1234'); - FHorseParam.AddStream('Key1', FStream); - - FHorseParam.Field('Key1').SaveToFile(LFile); - Assert.IsTrue(FileExists(LFile)); - DeleteFile(LFile); -end; - -procedure TTestHorseCoreParam.AsString; -begin - FParams.AddOrSetValue('Key1', 'Value'); - Assert.AreEqual('Value', FHorseParam.Field('Key1').AsString); -end; - -procedure TTestHorseCoreParam.AsStringDiferentCase; -begin - FParams.AddOrSetValue('key1', 'Value'); - Assert.AreEqual('Value', FHorseParam.Field('Key1').AsString); -end; - -procedure TTestHorseCoreParam.AsStringNotRequired; -begin - Assert.IsEmpty(FHorseParam.Field('Key1').AsString); -end; - -procedure TTestHorseCoreParam.AsStringRequired; -begin - Assert.WillRaiseWithMessage( - procedure - begin - FHorseParam.Field('Key1').Required.AsString; - end, - EHorseException, - RequiredMessage('Key1')); -end; - -procedure TTestHorseCoreParam.AsTime; -begin - FTime := EncodeTime(10, 15, 54, 0); - FParams.AddOrSetValue('Key1', '10:15:54'); - - Assert.AreEqual(FTime, FHorseParam.Field('Key1').AsTime); -end; - -procedure TTestHorseCoreParam.AsTimeChangeFormat; -begin - FTime := EncodeTime(10, 15, 0, 0); - FParams.AddOrSetValue('Key1', '10:15:54'); - - Assert.AreEqual(FTime, FHorseParam.Field('Key1').TimeFormat('hh:mm').AsTime); -end; - -procedure TTestHorseCoreParam.AsTimeInvalidFormat; -begin - FParams.AddOrSetValue('Key1', '10/00'); - - Assert.WillRaiseWithMessage( - procedure - begin - Assert.AreEqual(FTime, FHorseParam.Field('Key1').AsTime); - end, - EHorseException, - ConvertErrorMessage('Key1', '10/00', 'time')); -end; - -procedure TTestHorseCoreParam.AsTimeNotRequired; -begin - Assert.IsTrue(FHorseParam.Field('Key1').AsTime = 0); -end; - -procedure TTestHorseCoreParam.AsTimeRequired; -begin - Assert.WillRaiseWithMessage( - procedure - begin - Assert.AreEqual(FTime, FHorseParam.Field('Key1').Required.AsTime); - end, - EHorseException, - RequiredMessage('Key1')); -end; - -procedure TTestHorseCoreParam.ContainsKey; -begin - FParams.AddOrSetValue('Key1', 'Value'); - Assert.IsTrue(FHorseParam.ContainsKey('Key1')); -end; - -procedure TTestHorseCoreParam.ContainsKeyDiferentCase; -begin - FParams.AddOrSetValue('key1', 'Value'); - Assert.IsTrue(FHorseParam.ContainsKey('KEY1')); -end; - -procedure TTestHorseCoreParam.ContainsValue; -begin - FParams.AddOrSetValue('Key1', 'Value'); - Assert.IsTrue(FHorseParam.ContainsValue('Value')); -end; - -procedure TTestHorseCoreParam.Content; -begin - FParams.AddOrSetValue('Key1', 'Value1'); - FParams.AddOrSetValue('Key2', 'Value2'); - - Assert.AreEqual(2, FHorseParam.Content.Count); - Assert.AreEqual('Key1', FHorseParam.Content.Names[0]); - Assert.AreEqual('Key2', FHorseParam.Content.Names[1]); - Assert.AreEqual('Value1', FHorseParam.Content.ValueFromIndex[0]); - Assert.AreEqual('Value2', FHorseParam.Content.ValueFromIndex[1]); -end; - -function TTestHorseCoreParam.ConvertErrorMessage(const AKey, AValue, AType: String): string; -begin - result := Format('The %s param ''%s'' is not valid a %s type.', [AKey, AValue, AType]); -end; - -procedure TTestHorseCoreParam.Count; -begin - FParams.AddOrSetValue('Key1', 'Value1'); - FParams.AddOrSetValue('Key2', 'Value2'); - - Assert.AreEqual(2, FHorseParam.Count); -end; - -procedure TTestHorseCoreParam.Index; -begin - FParams.AddOrSetValue('Key1', 'Value1'); - Assert.AreEqual('Value1', FHorseParam['Key1']); -end; - -procedure TTestHorseCoreParam.IndexDiferentCase; -begin - FParams.AddOrSetValue('KEY1', 'Value1'); - Assert.AreEqual('Value1', FHorseParam['key1']); -end; - -procedure TTestHorseCoreParam.IndexNotFound; -begin - FParams.AddOrSetValue('Key1', 'Value1'); - Assert.IsEmpty(FHorseParam.Items['Value1']); -end; - -procedure TTestHorseCoreParam.List; -begin - FParams.AddOrSetValue('Key1', 'Value1'); - FParams.AddOrSetValue('Key2', 'Value2'); - - Assert.AreEqual(2, FHorseParam.Count); - Assert.AreEqual(FParams, FHorseParam.Dictionary); -end; - -procedure TTestHorseCoreParam.NotContainsKey; -begin - FParams.AddOrSetValue('Key', 'Value'); - Assert.IsFalse(FHorseParam.ContainsKey('Value')); -end; - -procedure TTestHorseCoreParam.NotContainsValue; -begin - FParams.AddOrSetValue('Key', 'Value'); - Assert.IsFalse(FHorseParam.ContainsValue('Key')); -end; - -function TTestHorseCoreParam.RequiredMessage(const AKey: String): string; -begin - result := Format('The %s param is required.', [AKey]); -end; - -procedure TTestHorseCoreParam.Setup; -begin - FParams := TDictionary<String, String>.Create; - FHorseParam := THorseCoreParam.create(FParams); - FFormatSettings := TFormatSettings.Create; - FFormatSettings.DecimalSeparator := ','; - FData := 0; - FTime := 0; -end; - -procedure TTestHorseCoreParam.TearDown; -begin - FreeAndNil(FHorseParam); - FreeAndNil(FStream); -end; - -procedure TTestHorseCoreParam.ToArray; -var - LPairs: TArray<TPair<String, String>>; -begin - FParams.AddOrSetValue('Key1', 'Value1'); - FParams.AddOrSetValue('Key2', 'Value2'); - - LPairs := FHorseParam.ToArray; - - Assert.AreEqual(2, Length(LPairs)); - Assert.AreEqual('Key1', LPairs[0].Key); - Assert.AreEqual('Value1', LPairs[0].Value); - Assert.AreEqual('Key2', LPairs[1].Key); - Assert.AreEqual('Value2', LPairs[1].Value); -end; - -procedure TTestHorseCoreParam.TryGetValueDiferentCase; -var - LValue: String; -begin - FParams.AddOrSetValue('KEY1', 'Value1'); - Assert.IsTrue(FHorseParam.TryGetValue('key1', LValue)); - Assert.AreEqual('Value1', LValue); -end; - -procedure TTestHorseCoreParam.TryGetValueFalse; -var - LValue: String; -begin - Assert.IsFalse(FHorseParam.TryGetValue('Key1', LValue)); -end; - -procedure TTestHorseCoreParam.TryGetValueTrue; -var - LValue: String; -begin - FParams.AddOrSetValue('Key1', 'Value1'); - Assert.IsTrue(FHorseParam.TryGetValue('Key1', LValue)); - Assert.AreEqual('Value1', LValue); -end; - -end. +unit Tests.Horse.Core.Param; + +interface + +uses + DUnitX.TestFramework, + Horse.Exception, + Horse.Core.Param, + System.Generics.Collections, + System.Classes, + System.DateUtils, + System.SysUtils; + +type + [TestFixture] + TTestHorseCoreParam = class + private + FParams: TDictionary<string, String>; + FHorseParam: THorseCoreParam; + FData: TDateTime; + FTime: TTime; + FFormatSettings: TFormatSettings; + FStream: TStream; + + function RequiredMessage(const AKey: String): string; + function ConvertErrorMessage(const AKey, AValue, AType: String): string; + + public + [Setup] + procedure Setup; + + [TearDown] + procedure TearDown; + + [Test] + procedure ContainsKey; + + [Test] + procedure NotContainsKey; + + [Test] + procedure ContainsKeyDiferentCase; + + [Test] + procedure ContainsValue; + + [Test] + procedure NotContainsValue; + + [Test] + procedure ToArray; + + [Test] + procedure TryGetValueTrue; + + [Test] + procedure TryGetValueFalse; + + [Test] + procedure TryGetValueDiferentCase; + + [Test] + procedure Content; + + [Test] + procedure Count; + + [Test] + procedure List; + + [Test] + procedure Index; + + [Test] + procedure IndexNotFound; + + [Test] + procedure IndexDiferentCase; + + [Test] + procedure AsBoolean; + + [Test] + [TestCase('TrueValue1', 'True,true,true')] + [TestCase('TrueValue2', '1,1,true')] + [TestCase('FalseValue1', 'False,true,false')] + [TestCase('FalseValue2', '5,1,false')] + procedure AsBooleanParam(AParamValue, ATrueValue: string; AResult: Boolean); + + [Test] + procedure AsBooleanNotRequired; + + [Test] + procedure AsBooleanRequired; + + [Test] + procedure AsCurrency; + + [Test] + procedure AsCurrencyDecimalSeparator; + + [Test] + procedure AsCurrencyNotRequired; + + [Test] + procedure AsCurrencyRequired; + + [Test] + procedure AsCurrencyErrorFormat; + + [Test] + procedure AsDateTime; + + [Test] + procedure AsDateTimeRequired; + + [Test] + procedure AsDateTimeNotRequired; + + [Test] + procedure AsDateTimeOnlyData; + + [Test] + procedure AsDateTimeChangeFormat; + + [Test] + procedure AsDateTimeInvalidFormat; + + [Test] + procedure AsDate; + + [Test] + procedure AsDateRequired; + + [Test] + procedure AsDateNotRequired; + + [Test] + procedure AsDateChangeFormat; + + [Test] + procedure AsDateInvalidFormat; + + [Test] + procedure AsExtended; + + [Test] + procedure AsExtendedDecimalSeparator; + + [Test] + procedure AsExtendedNotRequired; + + [Test] + procedure AsExtendedRequired; + + [Test] + procedure AsExtendedErrorFormat; + + [Test] + procedure AsFloat; + + [Test] + procedure AsFloatDecimalSeparator; + + [Test] + procedure AsFloatNotRequired; + + [Test] + procedure AsFloatRequired; + + [Test] + procedure AsFloatErrorFormat; + + [Test] + procedure AsInteger; + + [Test] + procedure AsIntegerNotRequired; + + [Test] + procedure AsIntegerRequired; + + [Test] + procedure AsIntegerErrorFormat; + + [Test] + procedure AsInt64; + + [Test] + procedure AsInt64NotRequired; + + [Test] + procedure AsInt64Required; + + [Test] + procedure AsInt64ErrorFormat; + + [Test] + procedure AsISO8601DateTime; + + [Test] + procedure AsISO8601DateTimeOnlyData; + + [Test] + procedure AsISO8601DateTimeNotRequired; + + [Test] + procedure AsISO8601DateTimeRequired; + + [Test] + procedure AsISO8601DateTimeErrorFormat; + + [Test] + procedure AsStream; + + [Test] + procedure AsStreamNotFoundNotRequired; + + [Test] + procedure AsStreamNotFoundRequired; + + [Test] + procedure AsStreamSaveToFile; + + [Test] + procedure AsStreamNotFoundSaveToFile; + + [Test] + procedure AsString; + + [Test] + procedure AsStringRequired; + + [Test] + procedure AsStringNotRequired; + + [Test] + procedure AsStringDiferentCase; + + [Test] + procedure AsTime; + + [Test] + procedure AsTimeRequired; + + [Test] + procedure AsTimeNotRequired; + + [Test] + procedure AsTimeChangeFormat; + + [Test] + procedure AsTimeInvalidFormat; + end; + +implementation + +{ TTestHorseCoreParam } + +procedure TTestHorseCoreParam.AsBoolean; +begin + FParams.AddOrSetValue('Key1', 'True'); + Assert.IsTrue(FHorseParam.Field('Key1').Required.AsBoolean); +end; + +procedure TTestHorseCoreParam.AsBooleanNotRequired; +begin + Assert.IsFalse(FHorseParam.Field('Key1').AsBoolean); +end; + +procedure TTestHorseCoreParam.AsBooleanParam(AParamValue, ATrueValue: string; AResult: Boolean); +begin + FParams.AddOrSetValue('Key1', AParamValue); + Assert.AreEqual(AResult, FHorseParam.Field('Key1').Required.TrueValue(ATrueValue).AsBoolean); +end; + +procedure TTestHorseCoreParam.AsBooleanRequired; +begin + Assert.WillRaiseWithMessage( + procedure + begin + FHorseParam.Field('Key1').Required.AsBoolean; + end, + EHorseException, + RequiredMessage('Key1')); +end; + +procedure TTestHorseCoreParam.AsCurrency; +begin + FParams.AddOrSetValue('Key1', '5.5'); + Assert.AreEqual('5,5', CurrToStr( FHorseParam.Field('Key1').AsCurrency)); +end; + +procedure TTestHorseCoreParam.AsCurrencyDecimalSeparator; +begin + FParams.AddOrSetValue('Key1', '5,5'); + Assert.AreEqual('5,5', CurrToStr( FHorseParam.Field('Key1').AsCurrency)); +end; + +procedure TTestHorseCoreParam.AsCurrencyErrorFormat; +begin + FParams.AddOrSetValue('Key1', '5a'); + Assert.WillRaiseWithMessage( + procedure + begin + FHorseParam.Field('Key1').AsCurrency; + end, + EHorseException, + ConvertErrorMessage('Key1', '5a', 'numeric')); +end; + +procedure TTestHorseCoreParam.AsCurrencyNotRequired; +begin + Assert.AreEqual('0', CurrToStr(FHorseParam.Field('Key1').AsCurrency)); +end; + +procedure TTestHorseCoreParam.AsCurrencyRequired; +begin + Assert.WillRaiseWithMessage( + procedure + begin + FHorseParam.Field('Key1').Required.AsCurrency; + end, + EHorseException, + RequiredMessage('Key1')); +end; + +procedure TTestHorseCoreParam.AsDate; +begin + FData := EncodeDate(2021, 11, 13); + FParams.Add('Key1', '2021-11-13 10:25:32'); + + Assert.AreEqual(DateToStr(FData), DateToStr(FHorseParam.Field('Key1').AsDate)); +end; + +procedure TTestHorseCoreParam.AsDateChangeFormat; +begin + FData := EncodeDate(2021, 11, 13); + FParams.Add('Key1', '13/11/2021'); + + Assert.AreEqual(DateToStr(FData), DateToStr(FHorseParam.Field('Key1').Required.DateFormat('dd/MM/yyyy').AsDate)); +end; + +procedure TTestHorseCoreParam.AsDateInvalidFormat; +begin + FParams.Add('Key1', '2021/11-13'); + + Assert.WillRaiseWithMessage( + procedure + begin + FHorseParam.Field('Key1').AsDate; + end, + EHorseException, + ConvertErrorMessage('Key1', '2021/11-13', 'date')); +end; + +procedure TTestHorseCoreParam.AsDateNotRequired; +begin + Assert.IsTrue(FHorseParam.Field('Key1').AsDate = 0); +end; + +procedure TTestHorseCoreParam.AsDateRequired; +begin + Assert.WillRaiseWithMessage( + procedure + begin + FHorseParam.Field('Key1').Required.AsDate; + end, + EHorseException, + RequiredMessage('Key1')); +end; + +procedure TTestHorseCoreParam.AsDateTime; +begin + FData := EncodeDateTime(2021, 11, 13, 10, 25, 32, 0); + FParams.Add('Key1', '2021-11-13 10:25:32'); + + Assert.AreEqual(DateToStr(FData), DateToStr(FHorseParam.Field('Key1').AsDateTime)); +end; + +procedure TTestHorseCoreParam.AsDateTimeChangeFormat; +begin + FData := EncodeDateTime(2021, 11, 13, 10, 25, 32, 0); + FParams.Add('Key1', '13/11/2021 10:25:32'); + + Assert.AreEqual(DateToStr(FData), DateToStr(FHorseParam.Field('Key1').Required.DateFormat('dd/MM/yyyy').AsDateTime)); +end; + +procedure TTestHorseCoreParam.AsDateTimeInvalidFormat; +begin + FParams.Add('Key1', '2021/11-13 10:25:32'); + + Assert.WillRaiseWithMessage( + procedure + begin + FHorseParam.Field('Key1').AsDateTime; + end, + EHorseException, + ConvertErrorMessage('Key1', '2021/11-13 10:25:32', 'datetime')); +end; + +procedure TTestHorseCoreParam.AsDateTimeNotRequired; +begin + Assert.IsTrue(FHorseParam.Field('Key1').Required(False).AsDateTime = 0); +end; + +procedure TTestHorseCoreParam.AsDateTimeOnlyData; +begin + FData := EncodeDate(2021, 11, 13); + FParams.Add('Key1', '2021-11-13'); + + Assert.AreEqual(DateToStr(FData), DateToStr(FHorseParam.Field('Key1').AsDateTime)); +end; + +procedure TTestHorseCoreParam.AsDateTimeRequired; +begin + Assert.WillRaiseWithMessage( + procedure + begin + FHorseParam.Field('Key1').Required.AsDateTime; + end, + EHorseException, + RequiredMessage('Key1')); +end; + +procedure TTestHorseCoreParam.AsExtended; +begin + FParams.AddOrSetValue('Key1', '5.5'); + Assert.AreEqual('5,5', FHorseParam.Field('Key1').AsExtended.ToString(FFormatSettings)); +end; + +procedure TTestHorseCoreParam.AsExtendedDecimalSeparator; +begin + FParams.AddOrSetValue('Key1', '5,5'); + Assert.AreEqual('5,5', FHorseParam.Field('Key1').AsExtended.ToString(FFormatSettings)); +end; + +procedure TTestHorseCoreParam.AsExtendedErrorFormat; +begin + FParams.AddOrSetValue('Key1', '5a'); + Assert.WillRaiseWithMessage( + procedure + begin + FHorseParam.Field('Key1').Required.AsExtended; + end, + EHorseException, + ConvertErrorMessage('Key1', '5a', 'numeric')); +end; + +procedure TTestHorseCoreParam.AsExtendedNotRequired; +begin + Assert.AreEqual('0', FHorseParam.Field('Key1').AsExtended.ToString); +end; + +procedure TTestHorseCoreParam.AsExtendedRequired; +begin + Assert.WillRaiseWithMessage( + procedure + begin + FHorseParam.Field('Key1').Required.AsExtended; + end, + EHorseException, + RequiredMessage('Key1')); +end; + +procedure TTestHorseCoreParam.AsFloat; +begin + FParams.AddOrSetValue('Key1', '5.5'); + Assert.AreEqual('5,5', FHorseParam.Field('Key1').AsFloat.ToString(FFormatSettings)); +end; + +procedure TTestHorseCoreParam.AsFloatDecimalSeparator; +begin + FParams.AddOrSetValue('Key1', '5,5'); + Assert.AreEqual('5,5', FHorseParam.Field('Key1').AsFloat.ToString(FFormatSettings)); +end; + +procedure TTestHorseCoreParam.AsFloatErrorFormat; +begin + FParams.AddOrSetValue('Key1', '5a'); + Assert.WillRaiseWithMessage( + procedure + begin + FHorseParam.Field('Key1').AsFloat; + end, + EHorseException, + ConvertErrorMessage('Key1', '5a', 'numeric')); +end; + +procedure TTestHorseCoreParam.AsFloatNotRequired; +begin + Assert.AreEqual('0', FHorseParam.Field('Key1').Required(False).AsFloat.ToString); +end; + +procedure TTestHorseCoreParam.AsFloatRequired; +begin + Assert.WillRaiseWithMessage( + procedure + begin + FHorseParam.Field('Key1').Required(True).AsFloat; + end, + EHorseException, + RequiredMessage('Key1')); +end; + +procedure TTestHorseCoreParam.AsInt64; +begin + FParams.AddOrSetValue('Key1', '5'); + Assert.AreEqual('5', FHorseParam.Field('Key1').AsInt64.ToString); +end; + +procedure TTestHorseCoreParam.AsInt64ErrorFormat; +begin + FParams.AddOrSetValue('Key1', 'Value'); + Assert.WillRaiseWithMessage( + procedure + begin + FHorseParam.Field('Key1').AsInt64; + end, + EHorseException, + ConvertErrorMessage('Key1', 'Value', 'int64')); +end; + +procedure TTestHorseCoreParam.AsInt64NotRequired; +begin + Assert.AreEqual('0', FHorseParam.Field('Key1').Required(False).AsInt64.ToString); +end; + +procedure TTestHorseCoreParam.AsInt64Required; +begin + Assert.WillRaiseWithMessage( + procedure + begin + FHorseParam.Field('Key1').Required(True).AsInt64; + end, + EHorseException, + RequiredMessage('Key1')); +end; + +procedure TTestHorseCoreParam.AsInteger; +begin + FParams.AddOrSetValue('Key1', '5'); + Assert.AreEqual(5, FHorseParam.Field('Key1').AsInteger); +end; + +procedure TTestHorseCoreParam.AsIntegerErrorFormat; +begin + FParams.AddOrSetValue('Key1', 'Value'); + Assert.WillRaiseWithMessage( + procedure + begin + FHorseParam.Field('Key1').AsInteger; + end, + EHorseException, + ConvertErrorMessage('Key1', 'Value', 'integer')); +end; + +procedure TTestHorseCoreParam.AsIntegerNotRequired; +begin + Assert.AreEqual(0, FHorseParam.Field('Key1').AsInteger); +end; + +procedure TTestHorseCoreParam.AsIntegerRequired; +begin + Assert.WillRaiseWithMessage( + procedure + begin + FHorseParam.Field('Key1').Required(True).AsInteger; + end, + EHorseException, + RequiredMessage('Key1')); +end; + +procedure TTestHorseCoreParam.AsISO8601DateTime; +begin + FData := EncodeDateTime(2021, 11, 13, 10, 21, 22, 0); + FParams.AddOrSetValue('Key1', '2021-11-13T10:21:22'); + + Assert.AreEqual(DateToStr(FData), DateToStr(FHorseParam.Field('Key1').AsISO8601DateTime)); +end; + +procedure TTestHorseCoreParam.AsISO8601DateTimeErrorFormat; +begin + FParams.AddOrSetValue('Key1', '2021-11-13 10:21:22'); + Assert.WillNotRaiseWithMessage( + procedure + begin + FHorseParam.Field('Key1').AsISO8601DateTime; + end, + EHorseException, + RequiredMessage('Key1')); +end; + +procedure TTestHorseCoreParam.AsISO8601DateTimeNotRequired; +begin + Assert.IsTrue(FHorseParam.Field('Key1').Required(False).AsISO8601DateTime = 0); +end; + +procedure TTestHorseCoreParam.AsISO8601DateTimeOnlyData; +begin + FData := EncodeDateTime(2021, 11, 13, 10, 21, 22, 0); + FParams.AddOrSetValue('Key1', '2021-11-13'); + + Assert.AreEqual(FormatDateTime('dd/MM/yyyy', FData), FormatDateTime('dd/MM/yyyy', FHorseParam.Field('Key1').AsISO8601DateTime)); +end; + +procedure TTestHorseCoreParam.AsISO8601DateTimeRequired; +begin + Assert.WillRaiseWithMessage( + procedure + begin + FHorseParam.Field('Key1').Required.AsISO8601DateTime; + end, + EHorseException, + RequiredMessage('Key1')); +end; + +procedure TTestHorseCoreParam.AsStream; +begin + FStream := TStringStream.Create('1234'); + FHorseParam.AddStream('Key1', FStream); + + Assert.IsNotNull(FHorseParam.Field('Key1').AsStream); + Assert.AreEqual<Int64>(0, FHorseParam.Field('Key1').AsStream.Position); +end; + +procedure TTestHorseCoreParam.AsStreamNotFoundNotRequired; +begin + Assert.IsNull(FHorseParam.Field('Key1').AsStream); +end; + +procedure TTestHorseCoreParam.AsStreamNotFoundRequired; +begin + Assert.WillRaiseWithMessage( + procedure + begin + FHorseParam.Field('Key1').Required(True).AsStream + end, + EHorseException, + RequiredMessage('Key1')); +end; + +procedure TTestHorseCoreParam.AsStreamNotFoundSaveToFile; +var + LFile: String; +begin + LFile := 'test.txt'; + Assert.IsFalse(FileExists(LFile)); + + FHorseParam.Field('Key1').SaveToFile(LFile); + Assert.IsFalse(FileExists(LFile)); +end; + +procedure TTestHorseCoreParam.AsStreamSaveToFile; +var + LFile: String; +begin + LFile := 'test.txt'; + Assert.IsFalse(FileExists(LFile)); + + FStream := TStringStream.Create('1234'); + FHorseParam.AddStream('Key1', FStream); + + FHorseParam.Field('Key1').SaveToFile(LFile); + Assert.IsTrue(FileExists(LFile)); + DeleteFile(LFile); +end; + +procedure TTestHorseCoreParam.AsString; +begin + FParams.AddOrSetValue('Key1', 'Value'); + Assert.AreEqual('Value', FHorseParam.Field('Key1').AsString); +end; + +procedure TTestHorseCoreParam.AsStringDiferentCase; +begin + FParams.AddOrSetValue('key1', 'Value'); + Assert.AreEqual('Value', FHorseParam.Field('Key1').AsString); +end; + +procedure TTestHorseCoreParam.AsStringNotRequired; +begin + Assert.IsEmpty(FHorseParam.Field('Key1').AsString); +end; + +procedure TTestHorseCoreParam.AsStringRequired; +begin + Assert.WillRaiseWithMessage( + procedure + begin + FHorseParam.Field('Key1').Required.AsString; + end, + EHorseException, + RequiredMessage('Key1')); +end; + +procedure TTestHorseCoreParam.AsTime; +begin + FTime := EncodeTime(10, 15, 54, 0); + FParams.AddOrSetValue('Key1', '10:15:54'); + + Assert.AreEqual(FTime, FHorseParam.Field('Key1').AsTime); +end; + +procedure TTestHorseCoreParam.AsTimeChangeFormat; +begin + FTime := EncodeTime(10, 15, 0, 0); + FParams.AddOrSetValue('Key1', '10:15:54'); + + Assert.AreEqual(FTime, FHorseParam.Field('Key1').TimeFormat('hh:mm').AsTime); +end; + +procedure TTestHorseCoreParam.AsTimeInvalidFormat; +begin + FParams.AddOrSetValue('Key1', '10/00'); + + Assert.WillRaiseWithMessage( + procedure + begin + Assert.AreEqual(FTime, FHorseParam.Field('Key1').AsTime); + end, + EHorseException, + ConvertErrorMessage('Key1', '10/00', 'time')); +end; + +procedure TTestHorseCoreParam.AsTimeNotRequired; +begin + Assert.IsTrue(FHorseParam.Field('Key1').AsTime = 0); +end; + +procedure TTestHorseCoreParam.AsTimeRequired; +begin + Assert.WillRaiseWithMessage( + procedure + begin + Assert.AreEqual(FTime, FHorseParam.Field('Key1').Required.AsTime); + end, + EHorseException, + RequiredMessage('Key1')); +end; + +procedure TTestHorseCoreParam.ContainsKey; +begin + FParams.AddOrSetValue('Key1', 'Value'); + Assert.IsTrue(FHorseParam.ContainsKey('Key1')); +end; + +procedure TTestHorseCoreParam.ContainsKeyDiferentCase; +begin + FParams.AddOrSetValue('key1', 'Value'); + Assert.IsTrue(FHorseParam.ContainsKey('KEY1')); +end; + +procedure TTestHorseCoreParam.ContainsValue; +begin + FParams.AddOrSetValue('Key1', 'Value'); + Assert.IsTrue(FHorseParam.ContainsValue('Value')); +end; + +procedure TTestHorseCoreParam.Content; +begin + FParams.AddOrSetValue('Key1', 'Value1'); + FParams.AddOrSetValue('Key2', 'Value2'); + + Assert.AreEqual(2, FHorseParam.Content.Count); + Assert.AreEqual('Key1', FHorseParam.Content.Names[0]); + Assert.AreEqual('Key2', FHorseParam.Content.Names[1]); + Assert.AreEqual('Value1', FHorseParam.Content.ValueFromIndex[0]); + Assert.AreEqual('Value2', FHorseParam.Content.ValueFromIndex[1]); +end; + +function TTestHorseCoreParam.ConvertErrorMessage(const AKey, AValue, AType: String): string; +begin + result := Format('The %s param ''%s'' is not valid a %s type.', [AKey, AValue, AType]); +end; + +procedure TTestHorseCoreParam.Count; +begin + FParams.AddOrSetValue('Key1', 'Value1'); + FParams.AddOrSetValue('Key2', 'Value2'); + + Assert.AreEqual(2, FHorseParam.Count); +end; + +procedure TTestHorseCoreParam.Index; +begin + FParams.AddOrSetValue('Key1', 'Value1'); + Assert.AreEqual('Value1', FHorseParam['Key1']); +end; + +procedure TTestHorseCoreParam.IndexDiferentCase; +begin + FParams.AddOrSetValue('KEY1', 'Value1'); + Assert.AreEqual('Value1', FHorseParam['key1']); +end; + +procedure TTestHorseCoreParam.IndexNotFound; +begin + FParams.AddOrSetValue('Key1', 'Value1'); + Assert.IsEmpty(FHorseParam.Items['Value1']); +end; + +procedure TTestHorseCoreParam.List; +begin + FParams.AddOrSetValue('Key1', 'Value1'); + FParams.AddOrSetValue('Key2', 'Value2'); + + Assert.AreEqual(2, FHorseParam.Count); + Assert.AreEqual(FParams, FHorseParam.Dictionary); +end; + +procedure TTestHorseCoreParam.NotContainsKey; +begin + FParams.AddOrSetValue('Key', 'Value'); + Assert.IsFalse(FHorseParam.ContainsKey('Value')); +end; + +procedure TTestHorseCoreParam.NotContainsValue; +begin + FParams.AddOrSetValue('Key', 'Value'); + Assert.IsFalse(FHorseParam.ContainsValue('Key')); +end; + +function TTestHorseCoreParam.RequiredMessage(const AKey: String): string; +begin + result := Format('The %s param is required.', [AKey]); +end; + +procedure TTestHorseCoreParam.Setup; +begin + FParams := TDictionary<String, String>.Create; + FHorseParam := THorseCoreParam.create(FParams); + FFormatSettings := TFormatSettings.Create; + FFormatSettings.DecimalSeparator := ','; + FData := 0; + FTime := 0; +end; + +procedure TTestHorseCoreParam.TearDown; +begin + FreeAndNil(FHorseParam); + FreeAndNil(FStream); +end; + +procedure TTestHorseCoreParam.ToArray; +var + LPairs: TArray<TPair<String, String>>; +begin + FParams.AddOrSetValue('Key1', 'Value1'); + FParams.AddOrSetValue('Key2', 'Value2'); + + LPairs := FHorseParam.ToArray; + + Assert.AreEqual(2, Length(LPairs)); + Assert.AreEqual('Key1', LPairs[0].Key); + Assert.AreEqual('Value1', LPairs[0].Value); + Assert.AreEqual('Key2', LPairs[1].Key); + Assert.AreEqual('Value2', LPairs[1].Value); +end; + +procedure TTestHorseCoreParam.TryGetValueDiferentCase; +var + LValue: String; +begin + FParams.AddOrSetValue('KEY1', 'Value1'); + Assert.IsTrue(FHorseParam.TryGetValue('key1', LValue)); + Assert.AreEqual('Value1', LValue); +end; + +procedure TTestHorseCoreParam.TryGetValueFalse; +var + LValue: String; +begin + Assert.IsFalse(FHorseParam.TryGetValue('Key1', LValue)); +end; + +procedure TTestHorseCoreParam.TryGetValueTrue; +var + LValue: String; +begin + FParams.AddOrSetValue('Key1', 'Value1'); + Assert.IsTrue(FHorseParam.TryGetValue('Key1', LValue)); + Assert.AreEqual('Value1', LValue); +end; + +end.