diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml
new file mode 100644
index 0000000..f077444
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug_report.yml
@@ -0,0 +1,83 @@
+name: 🐞 Bug
+title: '[BUG]
'
+description: File a bug report
+labels: ["bug", "to verify"]
+assignees: []
+body:
+ - type: markdown
+ attributes:
+ value: |
+ Thanks for taking the time to fill out this bug report! Please make sure to add as much detail as you can.
+ - type: textarea
+ id: description
+ attributes:
+ label: Description
+ description: Please give a detailed description of the issue that you're seeing. You can add screenshots and videos as well.
+ placeholder: Tell us what you see!
+ validations:
+ required: true
+ - type: textarea
+ id: repro-steps
+ attributes:
+ label: Steps to Reproduce
+ description: Describe all the steps we need to take to show the behavior that you have observed. Also, include what you expected to happen and what did actually happen.
+ placeholder: |
+ 1. Create a File > New App
+ 2. Add a `Button` like so: ``
+ 3. Click the added button and observe the bug 🐞
+
+ Expected outcome: a bug was added
+ Actual outcome: a ladybug appeared
+ validations:
+ required: true
+ - type: dropdown
+ id: platform-with-bug
+ attributes:
+ label: Platform with bug
+ description: What Platform is this bug affecting?
+ options:
+ - Core
+ - Android
+ - iOS
+ - MacCatalyst
+ - Windows
+ - Skia
+ - WebAssembly
+ - Other
+ validations:
+ required: true
+
+ - type: dropdown
+ id: platforms-affected
+ attributes:
+ label: Affected platforms
+ description: Select all or any platform that you see this issue on. This helps us determine if it's something platform-specific or in the core. If you were only able to test on 1 platform, please check the last option to inform us about that.
+ multiple: true
+ options:
+ - Android
+ - iOS
+ - MacOS
+ - MacCatalyst
+ - Windows
+ - GTK
+ - Linux Framebuffer
+ - WPF
+ - Skia Desktop
+ - WebAssembly
+ - Other
+ - I was *not* able test on other platforms
+ validations:
+ required: true
+
+ - type: textarea
+ id: workaround
+ attributes:
+ label: Did you find any workaround?
+ description: Did you find any workaround for this issue? This can unblock other people while waiting for this issue to be resolved or even give us a hint on how to fix this.
+
+ - type: textarea
+ id: logs
+ attributes:
+ label: Relevant log output
+ description: Please copy and paste any relevant log output. This will be auomatically formatted into code, so no need for back ticks.
+ render: shell
diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml
new file mode 100644
index 0000000..3ba13e0
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/config.yml
@@ -0,0 +1 @@
+blank_issues_enabled: false
diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml
new file mode 100644
index 0000000..47b3fe7
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature_request.yml
@@ -0,0 +1,39 @@
+name: Feature Request
+description: Suggest an idea for this project
+labels: ["enhancement"]
+assignees: []
+body:
+ - type: markdown
+ attributes:
+ value: |
+ Fill in this template with some detail. A detailed description, perhaps supported with some screenshots, mockups, and a (public) API design in pseudo-code.
+ - type: textarea
+ id: description
+ attributes:
+ label: Description
+ description: Please give us a detailed description of the feature that you envision. Focus on _what_ this feature does, over the _why_ you want this feature. What would be the end-result when implemented? Feel free to add any diagrams, (mocked up) screenshots, or other materials that support your story.
+ placeholder: I would love to have a button that I can make shiny. This is something that is supported on all the underlaying platforms.
+ validations:
+ required: true
+ - type: textarea
+ id: api-changes
+ attributes:
+ label: API Changes
+ description: Include a list of all API changes, additions, subtractions as would be required by your proposal. These APIs should be considered placeholders, so the naming is not as important as getting the concepts correct. If possible you should include some example (pseudo-)code of usage of your new API.
+ placeholder: |
+ ```csharp
+ var button = new Button ();
+ button.MakeShiny = true; // new API
+ ```
+
+ The MakeShiny API works even if the button is already visible.
+ validations:
+ required: true
+ - type: textarea
+ id: use-case
+ attributes:
+ label: Intended Use-Case
+ description: Provide a detailed example of where your proposal would be used and for what purpose. Focus on _why_ you want this feature instead of _what_ the feature does.
+ placeholder: I have a situation where I would really want a shiny button to make it stand out from the rest of the plain and boring buttons.
+ validations:
+ required: true
\ No newline at end of file
diff --git a/.github/ISSUE_TEMPLATE/spec.yml b/.github/ISSUE_TEMPLATE/spec.yml
new file mode 100644
index 0000000..6abc394
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/spec.yml
@@ -0,0 +1,80 @@
+name: Spec
+description: An official specification for enhancements.
+labels: ["enhancement"]
+assignees: []
+body:
+ - type: markdown
+ attributes:
+ value: |
+ Thank you for taking the time to provide us with a detailed specification of your idea.
+
+ In a spec you will give a detailed and complete representation of the (public) APIs that are implemented as part of this change. Additionally please think about backwards compatibility, breaking changes, supported platforms and the difficulty.
+ - type: textarea
+ id: description
+ attributes:
+ label: Description
+ description: Provide a concise description of the feature and the motivation for adding it. This can be a modified version from the feature request prior to this.
+ validations:
+ required: true
+ - type: textarea
+ id: api-changes
+ attributes:
+ label: (Public) API Changes
+ description: Include a complete list of all API changes, additions, subtractions as would be required by your proposal.
+ value: |
+ # [ class ]
+
+ ## Properties
+
+ | API | Description |
+ | ------------- | ------------- |
+ | [name] | Gets or sets [description]. |
+
+ ## Events
+
+ | API | Description |
+ | ------------- | ------------- |
+ | [name] | [API documentation/description] |
+ validations:
+ required: true
+ - type: textarea
+ id: usage-scenarios
+ attributes:
+ label: Usage Scenarios
+ description: Give us a couple of scenarios that demonstrate how developers would consume the above APIs.
+ placeholder: |
+ # C# Example
+ ```csharp
+ var thing = new MyNewControl();
+ thing.BeAwesome = true;
+ thing.Color = Colors.Cornsilk;
+ ```
+
+ # XAML Example
+ ```xaml
+
+ ```
+ validations:
+ required: true
+ - type: textarea
+ id: backwards-compatibility
+ attributes:
+ label: Backward Compatibility
+ description: Please describe here anything in terms of backwards compatibility. Will there be breaking changes? Do we need to update dependencies to support this? What are the minimum supported API/OS levels? And lastly, are there any platforms that can't support this and why?
+ placeholder: |
+ Minimum API levels?
+ Breaking changes?
+ Unsupported platforms?
+ validations:
+ required: true
+ - type: dropdown
+ id: difficulty
+ attributes:
+ label: Difficulty
+ description: What do you feel will be the difficulty of this change all things considering? No exact science, just your gut feeling.
+ options:
+ - Low
+ - Medium
+ - High
+ validations:
+ required: true
\ No newline at end of file
diff --git a/.github/Install-WindowsSdkISO.ps1 b/.github/Install-WindowsSdkISO.ps1
new file mode 100644
index 0000000..f4964d2
--- /dev/null
+++ b/.github/Install-WindowsSdkISO.ps1
@@ -0,0 +1,314 @@
+[CmdletBinding()]
+param([Parameter(Mandatory=$true)]
+ [string]$buildNumber)
+
+# Ensure the error action preference is set to the default for PowerShell3, 'Stop'
+$ErrorActionPreference = 'Stop'
+
+# Constants
+$WindowsSDKOptions = @("OptionId.UWPCpp")
+$WindowsSDKRegPath = "HKLM:\Software\Microsoft\Windows Kits\Installed Roots"
+$WindowsSDKRegRootKey = "KitsRoot10"
+$WindowsSDKVersion = "10.0.$buildNumber.0"
+$WindowsSDKInstalledRegPath = "$WindowsSDKRegPath\$WindowsSDKVersion\Installed Options"
+$StrongNameRegPath = "HKLM:\SOFTWARE\Microsoft\StrongName\Verification"
+$PublicKeyTokens = @("31bf3856ad364e35")
+
+function Download-File
+{
+ param ([string] $outDir,
+ [string] $downloadUrl,
+ [string] $downloadName)
+
+ $downloadPath = Join-Path $outDir "$downloadName.download"
+ $downloadDest = Join-Path $outDir $downloadName
+ $downloadDestTemp = Join-Path $outDir "$downloadName.tmp"
+
+ Write-Host -NoNewline "Downloading $downloadName..."
+
+ try
+ {
+ $webclient = new-object System.Net.WebClient
+ $webclient.DownloadFile($downloadUrl, $downloadPath)
+ }
+ catch [System.Net.WebException]
+ {
+ Write-Host
+ Write-Warning "Failed to fetch updated file from $downloadUrl"
+ if (!(Test-Path $downloadDest))
+ {
+ throw "$downloadName was not found at $downloadDest"
+ }
+ else
+ {
+ Write-Warning "$downloadName may be out of date"
+ }
+ }
+
+ Unblock-File $downloadPath
+
+ $downloadDestTemp = $downloadPath;
+
+ # Delete and rename to final dest
+ if (Test-Path -PathType Container $downloadDest)
+ {
+ [System.IO.Directory]::Delete($downloadDest, $true)
+ }
+
+ Move-Item -Force $downloadDestTemp $downloadDest
+ Write-Host "Done"
+
+ return $downloadDest
+}
+
+function Get-ISODriveLetter
+{
+ param ([string] $isoPath)
+
+ $diskImage = Get-DiskImage -ImagePath $isoPath
+ if ($diskImage)
+ {
+ $volume = Get-Volume -DiskImage $diskImage
+
+ if ($volume)
+ {
+ $driveLetter = $volume.DriveLetter
+ if ($driveLetter)
+ {
+ $driveLetter += ":"
+ return $driveLetter
+ }
+ }
+ }
+
+ return $null
+}
+
+function Mount-ISO
+{
+ param ([string] $isoPath)
+
+ # Check if image is already mounted
+ $isoDrive = Get-ISODriveLetter $isoPath
+
+ if (!$isoDrive)
+ {
+ Mount-DiskImage -ImagePath $isoPath -StorageType ISO | Out-Null
+ }
+
+ $isoDrive = Get-ISODriveLetter $isoPath
+ Write-Verbose "$isoPath mounted to ${isoDrive}:"
+}
+
+function Dismount-ISO
+{
+ param ([string] $isoPath)
+
+ $isoDrive = (Get-DiskImage -ImagePath $isoPath | Get-Volume).DriveLetter
+
+ if ($isoDrive)
+ {
+ Write-Verbose "$isoPath dismounted"
+ Dismount-DiskImage -ImagePath $isoPath | Out-Null
+ }
+}
+
+function Disable-StrongName
+{
+ param ([string] $publicKeyToken = "*")
+
+ reg ADD "HKLM\SOFTWARE\Microsoft\StrongName\Verification\*,$publicKeyToken" /f | Out-Null
+ if ($env:PROCESSOR_ARCHITECTURE -eq "AMD64")
+ {
+ reg ADD "HKLM\SOFTWARE\Wow6432Node\Microsoft\StrongName\Verification\*,$publicKeyToken" /f | Out-Null
+ }
+}
+
+function Test-Admin
+{
+ $identity = [Security.Principal.WindowsIdentity]::GetCurrent()
+ $principal = New-Object Security.Principal.WindowsPrincipal $identity
+ $principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
+}
+
+function Test-RegistryPathAndValue
+{
+ param (
+ [parameter(Mandatory=$true)]
+ [ValidateNotNullOrEmpty()]
+ [string] $path,
+ [parameter(Mandatory=$true)]
+ [ValidateNotNullOrEmpty()]
+ [string] $value)
+
+ try
+ {
+ if (Test-Path $path)
+ {
+ Get-ItemProperty -Path $path | Select-Object -ExpandProperty $value -ErrorAction Stop | Out-Null
+ return $true
+ }
+ }
+ catch
+ {
+ }
+
+ return $false
+}
+
+function Test-InstallWindowsSDK
+{
+ $retval = $true
+
+ if (Test-RegistryPathAndValue -Path $WindowsSDKRegPath -Value $WindowsSDKRegRootKey)
+ {
+ # A Windows SDK is installed
+ # Is an SDK of our version installed with the options we need?
+ if (Test-RegistryPathAndValue -Path $WindowsSDKInstalledRegPath -Value "$WindowsSDKOptions")
+ {
+ # It appears we have what we need. Double check the disk
+ $sdkRoot = Get-ItemProperty -Path $WindowsSDKRegPath | Select-Object -ExpandProperty $WindowsSDKRegRootKey
+ if ($sdkRoot)
+ {
+ if (Test-Path $sdkRoot)
+ {
+ $refPath = Join-Path $sdkRoot "References\$WindowsSDKVersion"
+ if (Test-Path $refPath)
+ {
+ $umdPath = Join-Path $sdkRoot "UnionMetadata\$WindowsSDKVersion"
+ if (Test-Path $umdPath)
+ {
+ # Pretty sure we have what we need
+ $retval = $false
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return $retval
+}
+
+function Test-InstallStrongNameHijack
+{
+ foreach($publicKeyToken in $PublicKeyTokens)
+ {
+ $key = "$StrongNameRegPath\*,$publicKeyToken"
+ if (!(Test-Path $key))
+ {
+ return $true
+ }
+ }
+
+ return $false
+}
+
+Write-Host -NoNewline "Checking for installed Windows SDK $WindowsSDKVersion..."
+$InstallWindowsSDK = Test-InstallWindowsSDK
+if ($InstallWindowsSDK)
+{
+ Write-Host "Installation required"
+}
+else
+{
+ Write-Host "INSTALLED"
+}
+
+$StrongNameHijack = Test-InstallStrongNameHijack
+Write-Host -NoNewline "Checking if StrongName bypass required..."
+
+if ($StrongNameHijack)
+{
+ Write-Host "REQUIRED"
+}
+else
+{
+ Write-Host "Done"
+}
+
+if ($StrongNameHijack -or $InstallWindowsSDK)
+{
+ if (!(Test-Admin))
+ {
+ Write-Host
+ throw "ERROR: Elevation required"
+ }
+}
+
+if ($InstallWindowsSDK)
+{
+ # Static(ish) link for Windows SDK
+ # Note: there is a delay from Windows SDK announcements to availability via the static link
+ $uri = "https://go.microsoft.com/fwlink/?prd=11966&pver=1.0&plcid=0x409&clcid=0x409&ar=Flight&sar=Sdsurl&o1=$buildNumber"
+
+ if($buildNumber -eq 18362)
+ {
+ # Workaround for removed SDK
+ $uri = "https://go.microsoft.com/fwlink/?linkid=2083448";
+ }
+
+ if($buildNumber -eq 19041)
+ {
+ # Workaround for missing SDK
+ $uri = "https://software-download.microsoft.com/download/pr/19041.1.191206-1406.vb_release_WindowsSDK.iso";
+ }
+
+ if ($env:TEMP -eq $null)
+ {
+ $env:TEMP = Join-Path $env:SystemDrive 'temp'
+ }
+
+ $winsdkTempDir = Join-Path $env:TEMP "WindowsSDK"
+
+ if (![System.IO.Directory]::Exists($winsdkTempDir))
+ {
+ [void][System.IO.Directory]::CreateDirectory($winsdkTempDir)
+ }
+
+ $file = "winsdk_$buildNumber.iso"
+
+ Write-Verbose "Getting WinSDK from $uri"
+ $downloadFile = Download-File $winsdkTempDir $uri $file
+
+ # TODO Check if zip, exe, iso, etc.
+ try
+ {
+ Write-Host -NoNewline "Mounting ISO $file..."
+ Mount-ISO $downloadFile
+ Write-Host "Done"
+
+ $isoDrive = Get-ISODriveLetter $downloadFile
+
+ if (Test-Path $isoDrive)
+ {
+ Write-Host -NoNewLine "Installing WinSDK..."
+
+ $setupPath = Join-Path "$isoDrive" "WinSDKSetup.exe"
+ Start-Process -Wait $setupPath "/features $WindowsSDKOptions /q"
+ Write-Host "Done"
+ }
+ else
+ {
+ throw "Could not find mounted ISO at ${isoDrive}"
+ }
+ }
+ finally
+ {
+ Write-Host -NoNewline "Dismounting ISO $file..."
+ #Dismount-ISO $downloadFile
+ Write-Host "Done"
+ }
+}
+
+if ($StrongNameHijack)
+{
+ Write-Host -NoNewline "Disabling StrongName for Windows SDK..."
+
+ foreach($key in $PublicKeyTokens)
+ {
+ Disable-StrongName $key
+ }
+
+ Write-Host "Done"
+}
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 0000000..1147b3a
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,11 @@
+version: 2
+updates:
+- package-ecosystem: nuget
+ directory: "/"
+ schedule:
+ interval: weekly
+ time: "10:00"
+ open-pull-requests-limit: 10
+ labels:
+ - kind/dependency
+ - do-not-merge/work-in-progress
diff --git a/.github/steps/install_dependencies/action.yml b/.github/steps/install_dependencies/action.yml
new file mode 100644
index 0000000..f8cd87b
--- /dev/null
+++ b/.github/steps/install_dependencies/action.yml
@@ -0,0 +1,45 @@
+name: Install Dependencies
+description: ""
+
+inputs:
+ target-platform:
+ description: 'The platform to install dependencies for. #See available values at https://platform.uno/docs/articles/external/uno.check/doc/using-uno-check.html'
+ required: false
+ default: 'all'
+ dotnet-version:
+ description: 'Installs and sets the .NET SDK Version'
+ required: false
+ default: '8.0.x'
+ sdkVersion:
+ description: 'The version of the Windows Sdk'
+ required: false
+ default: '19041'
+
+runs:
+ using: "composite"
+ steps:
+ # Install .NET
+ - name: Setup .NET ${{ inputs.dotnet-version }}
+ uses: actions/setup-dotnet@v3
+ with:
+ dotnet-version: '${{ inputs.dotnet-version }}'
+
+ # Install Windows SDK
+ - name: Install Windows SDK ${{ inputs.sdkVersion }}
+ shell: pwsh
+ if: ${{ runner.os == 'Windows' }}
+ run: .\.github\Install-WindowsSdkISO.ps1 ${{ inputs.sdkVersion }}
+
+ # Run Uno.Check
+ - name: Install ${{ inputs.target-platform }} Workloads
+ shell: pwsh
+ run: |
+ dotnet tool install -g uno.check
+ ("${{ inputs.target-platform }} ".Split(' ') | ForEach-Object {
+ $target = $_.Replace("_win", "").Replace("_macos", "")
+ if (![string]::IsNullOrEmpty($target)) {
+ echo "target: $target"
+ uno-check -v --ci --non-interactive --fix --target $target --skip vswin --skip vsmac --skip xcode --skip vswinworkloads --skip androidemulator --skip dotnetnewunotemplates
+ echo "uno-check finished for target: $target "
+ }
+ })
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 0000000..ce41923
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,36 @@
+name: CI
+
+on:
+ push:
+ branches:
+ - main
+ - release/**
+
+ pull_request:
+ types: [opened, synchronize, reopened]
+ branches:
+ - main
+ - release/**
+env:
+ STEP_TIMEOUT_MINUTES: 60
+
+jobs:
+ smoke_test:
+ name: Smoke Test (Debug Build of Firehose)
+ runs-on: windows-latest
+ steps:
+ - uses: actions/checkout@v3
+ with:
+ fetch-depth: 0
+
+ - name: Install Dependencies
+ timeout-minutes: ${{ fromJSON(env.STEP_TIMEOUT_MINUTES) }}
+ uses: "./.github/steps/install_dependencies"
+
+ # Add MSBuild to the PATH: https://github.com/microsoft/setup-msbuild
+ - name: Setup MSBuild
+ uses: microsoft/setup-msbuild@v1.3.1
+
+ - name: Build Firehose (Debug)
+ shell: pwsh
+ run: msbuild ./Firehose/Firehose.csproj /r
diff --git a/.gitignore b/.gitignore
index c9ee378..ef88c20 100644
--- a/.gitignore
+++ b/.gitignore
@@ -399,8 +399,5 @@ FodyWeavers.xsd
# Single Target Config
solution-config.props
-# Windows Publish Profiles
-!**/*.Windows/Properties/PublishProfiles/*.pubxml
-FirehoseServer/Logs.txt
-TheOnceAndFinalKing/FirehoseServer/Logs.txt
-TheOnceAndFinalKing/FirehoseServer/Logs.txt
+# Publish Profiles
+!**/Properties/PublishProfiles/*.pubxml
\ No newline at end of file
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
new file mode 100644
index 0000000..a63ad40
--- /dev/null
+++ b/.vscode/extensions.json
@@ -0,0 +1,5 @@
+{
+ "recommendations": [
+ "unoplatform.vscode"
+ ],
+}
diff --git a/.vscode/launch.json b/.vscode/launch.json
new file mode 100644
index 0000000..1663467
--- /dev/null
+++ b/.vscode/launch.json
@@ -0,0 +1,56 @@
+{
+ // Use IntelliSense to find out which attributes exist for C# debugging
+ // Use hover for the description of the existing attributes
+ // For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "name": "Uno Platform Mobile",
+ "type": "Uno",
+ "request": "launch",
+ // any Uno* task will do, this is simply to satisfy vscode requirement when a launch.json is present
+ "preLaunchTask": "Uno: android | Debug | android-x64"
+ },
+ {
+ // Use IntelliSense to find out which attributes exist for C# debugging
+ // Use hover for the description of the existing attributes
+ // For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md
+ "name": "Debug (Chrome, WebAssembly)",
+ "type": "chrome",
+ "request": "launch",
+ "url": "http://localhost:5000",
+ "webRoot": "${workspaceFolder}/Firehose",
+ "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
+ "timeout": 30000,
+ "preLaunchTask": "build-wasm",
+ "server": {
+ "runtimeExecutable": "dotnet",
+ "program": "run",
+ "args": ["--no-build","-f","net8.0-browserwasm","--launch-profile", "Firehose (WebAssembly)"],
+ "outputCapture": "std",
+ "timeout": 30000,
+ "cwd": "${workspaceFolder}/Firehose"
+ }
+ },
+ {
+ // Use IntelliSense to find out which attributes exist for C# debugging
+ // Use hover for the description of the existing attributes
+ // For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md
+ "name": "Uno Platform Desktop (Debug)",
+ "type": "coreclr",
+ "request": "launch",
+ "preLaunchTask": "build-desktop",
+ // If you have changed target frameworks, make sure to update the program path.
+ "program": "${workspaceFolder}/Firehose/bin/Debug/net8.0-desktop/Firehose.dll",
+ "args": [],
+ "launchSettingsProfile": "Firehose (Desktop)",
+ "env": {
+ "DOTNET_MODIFIABLE_ASSEMBLIES": "debug"
+ },
+ "cwd": "${workspaceFolder}/Firehose",
+ // For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console
+ "console": "internalConsole",
+ "stopAtEntry": false
+ },
+ ]
+}
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..23133fc
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,7 @@
+{
+ "explorer.fileNesting.enabled": true,
+ "explorer.fileNesting.expand": false,
+ "explorer.fileNesting.patterns": {
+ "*.xaml": "$(capture).xaml.cs"
+ }
+}
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
new file mode 100644
index 0000000..8c75fdc
--- /dev/null
+++ b/.vscode/tasks.json
@@ -0,0 +1,57 @@
+{
+ "version": "2.0.0",
+ "tasks": [
+ {
+ "label": "build-wasm",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "build",
+ "${workspaceFolder}/Firehose/Firehose.csproj",
+ "/property:GenerateFullPaths=true",
+ "/property:TargetFramework=net8.0-browserwasm",
+ "/consoleloggerparameters:NoSummary"
+ ],
+ "problemMatcher": "$msCompile"
+ },
+ {
+ "label": "publish-wasm",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "publish",
+ "${workspaceFolder}/Firehose/Firehose.csproj",
+ "/property:GenerateFullPaths=true",
+ "/property:TargetFramework=net8.0-browserwasm",
+ "/consoleloggerparameters:NoSummary"
+ ],
+ "problemMatcher": "$msCompile"
+ },
+ {
+ "label": "build-desktop",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "build",
+ "${workspaceFolder}/Firehose/Firehose.csproj",
+ "/property:GenerateFullPaths=true",
+ "/property:TargetFramework=net8.0-desktop",
+ "/consoleloggerparameters:NoSummary"
+ ],
+ "problemMatcher": "$msCompile"
+ },
+ {
+ "label": "publish-desktop",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "publish",
+ "${workspaceFolder}/Firehose/Firehose.csproj",
+ "/property:GenerateFullPaths=true",
+ "/property:TargetFramework=net8.0-desktop",
+ "/consoleloggerparameters:NoSummary"
+ ],
+ "problemMatcher": "$msCompile"
+ }
+ ]
+}
diff --git a/.vsconfig b/.vsconfig
index 072b0c8..7c56eec 100644
--- a/.vsconfig
+++ b/.vsconfig
@@ -28,7 +28,6 @@
"Microsoft.VisualStudio.Component.Merq",
"Component.Xamarin.RemotedSimulator",
"Microsoft.VisualStudio.Component.MonoDebugger",
- "Component.Xamarin",
"Microsoft.VisualStudio.ComponentGroup.Maui.All",
"Component.Android.SDK34",
"Component.Android.SDK33",
diff --git a/Directory.Build.props b/Directory.Build.props
index 1187851..c23d736 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -1,9 +1,7 @@
- net8.0
enable
enable
-
true
$(NoWarn);NU1507;NETSDK1201;PRI257
+
-
- false
+
+
+ 4.1.23
+ 6.0.24
+ 5.0.13
+ 5.2.14
diff --git a/Directory.Packages.props b/Directory.Packages.props
index 0a0c85a..ab1dd0f 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -1,4 +1,11 @@
+
+
+
@@ -38,4 +45,4 @@
-
\ No newline at end of file
+
diff --git a/Firehose.sln b/Firehose.sln
index 3448ef3..7c53ced 100644
--- a/Firehose.sln
+++ b/Firehose.sln
@@ -1,202 +1,48 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
-VisualStudioVersion = 17.9.34607.119
+VisualStudioVersion = 17.9.34728.123
MinimumVisualStudioVersion = 10.0.40219.1
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Source", "Source", "{57B07323-0D93-42C5-9B5E-8CCDBF86CCA7}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Firehose", "Firehose\Firehose.csproj", "{C3DB8258-3C80-4194-B1FD-70CE8D72C2EB}"
EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Platforms", "Platforms", "{909C5D26-83DB-46F2-AD71-1923A29A5F08}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FirehoseNews", "FirehoseNews\FirehoseNews.csproj", "{7BA81B68-5F64-40F4-B16A-21A3CE67DDB9}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FirehoseNews.Shared", "FirehoseNews.Shared\FirehoseNews.Shared.csproj", "{777A60B5-F64C-42FD-BDB9-25E4D1F726E1}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FirehoseNews.Mobile", "FirehoseNews.Mobile\FirehoseNews.Mobile.csproj", "{681F6553-2B64-4DA2-8BF4-782EC5B081C8}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FirehoseNews.Windows", "FirehoseNews.Windows\FirehoseNews.Windows.csproj", "{E422EAA0-A0B0-4902-86C5-C50BB6A4BBC3}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FirehoseNews.Wasm", "FirehoseNews.Wasm\FirehoseNews.Wasm.csproj", "{229E558D-FD5C-4258-AB01-67CFC4564DD1}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FirehoseNews.Skia.Gtk", "FirehoseNews.Skia.Gtk\FirehoseNews.Skia.Gtk.csproj", "{89F60EC2-62E2-478E-90BE-6F9CB931D537}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{B582E53A-4D0B-4A6C-9D45-1AE8634BB3F6}"
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{CBD5EA04-4313-4078-BD82-883BB7C7A80B}"
ProjectSection(SolutionItems) = preProject
.gitignore = .gitignore
Directory.Build.props = Directory.Build.props
Directory.Build.targets = Directory.Build.targets
Directory.Packages.props = Directory.Packages.props
- HYDRANT\global.json = HYDRANT\global.json
- solution-config.props.sample = solution-config.props.sample
+ global.json = global.json
EndProjectSection
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HYDRANT", "HYDRANT\HYDRANT.csproj", "{5CD1A253-0975-4190-915D-83FA893E2FDD}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HYDRANT", "Hydrant\HYDRANT.csproj", "{2DC2D12B-75CA-4DA3-91B9-309404863A43}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FirehoseServer", "FirehoseServer\FirehoseServer.csproj", "{167318B6-C5ED-49E1-9527-FA4A3916BD8F}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FirehoseServer", "FirehoseServer\FirehoseServer.csproj", "{8BD90A1D-9721-4B71-B7FC-95AA209B167A}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
- Debug|arm64 = Debug|arm64
- Debug|x64 = Debug|x64
- Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
- Release|arm64 = Release|arm64
- Release|x64 = Release|x64
- Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {7BA81B68-5F64-40F4-B16A-21A3CE67DDB9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {7BA81B68-5F64-40F4-B16A-21A3CE67DDB9}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {7BA81B68-5F64-40F4-B16A-21A3CE67DDB9}.Debug|arm64.ActiveCfg = Debug|Any CPU
- {7BA81B68-5F64-40F4-B16A-21A3CE67DDB9}.Debug|arm64.Build.0 = Debug|Any CPU
- {7BA81B68-5F64-40F4-B16A-21A3CE67DDB9}.Debug|x64.ActiveCfg = Debug|Any CPU
- {7BA81B68-5F64-40F4-B16A-21A3CE67DDB9}.Debug|x64.Build.0 = Debug|Any CPU
- {7BA81B68-5F64-40F4-B16A-21A3CE67DDB9}.Debug|x86.ActiveCfg = Debug|Any CPU
- {7BA81B68-5F64-40F4-B16A-21A3CE67DDB9}.Debug|x86.Build.0 = Debug|Any CPU
- {7BA81B68-5F64-40F4-B16A-21A3CE67DDB9}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {7BA81B68-5F64-40F4-B16A-21A3CE67DDB9}.Release|Any CPU.Build.0 = Release|Any CPU
- {7BA81B68-5F64-40F4-B16A-21A3CE67DDB9}.Release|arm64.ActiveCfg = Release|Any CPU
- {7BA81B68-5F64-40F4-B16A-21A3CE67DDB9}.Release|arm64.Build.0 = Release|Any CPU
- {7BA81B68-5F64-40F4-B16A-21A3CE67DDB9}.Release|x64.ActiveCfg = Release|Any CPU
- {7BA81B68-5F64-40F4-B16A-21A3CE67DDB9}.Release|x64.Build.0 = Release|Any CPU
- {7BA81B68-5F64-40F4-B16A-21A3CE67DDB9}.Release|x86.ActiveCfg = Release|Any CPU
- {7BA81B68-5F64-40F4-B16A-21A3CE67DDB9}.Release|x86.Build.0 = Release|Any CPU
- {777A60B5-F64C-42FD-BDB9-25E4D1F726E1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {777A60B5-F64C-42FD-BDB9-25E4D1F726E1}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {777A60B5-F64C-42FD-BDB9-25E4D1F726E1}.Debug|arm64.ActiveCfg = Debug|Any CPU
- {777A60B5-F64C-42FD-BDB9-25E4D1F726E1}.Debug|arm64.Build.0 = Debug|Any CPU
- {777A60B5-F64C-42FD-BDB9-25E4D1F726E1}.Debug|x64.ActiveCfg = Debug|Any CPU
- {777A60B5-F64C-42FD-BDB9-25E4D1F726E1}.Debug|x64.Build.0 = Debug|Any CPU
- {777A60B5-F64C-42FD-BDB9-25E4D1F726E1}.Debug|x86.ActiveCfg = Debug|Any CPU
- {777A60B5-F64C-42FD-BDB9-25E4D1F726E1}.Debug|x86.Build.0 = Debug|Any CPU
- {777A60B5-F64C-42FD-BDB9-25E4D1F726E1}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {777A60B5-F64C-42FD-BDB9-25E4D1F726E1}.Release|Any CPU.Build.0 = Release|Any CPU
- {777A60B5-F64C-42FD-BDB9-25E4D1F726E1}.Release|arm64.ActiveCfg = Release|Any CPU
- {777A60B5-F64C-42FD-BDB9-25E4D1F726E1}.Release|arm64.Build.0 = Release|Any CPU
- {777A60B5-F64C-42FD-BDB9-25E4D1F726E1}.Release|x64.ActiveCfg = Release|Any CPU
- {777A60B5-F64C-42FD-BDB9-25E4D1F726E1}.Release|x64.Build.0 = Release|Any CPU
- {777A60B5-F64C-42FD-BDB9-25E4D1F726E1}.Release|x86.ActiveCfg = Release|Any CPU
- {777A60B5-F64C-42FD-BDB9-25E4D1F726E1}.Release|x86.Build.0 = Release|Any CPU
- {681F6553-2B64-4DA2-8BF4-782EC5B081C8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {681F6553-2B64-4DA2-8BF4-782EC5B081C8}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {681F6553-2B64-4DA2-8BF4-782EC5B081C8}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
- {681F6553-2B64-4DA2-8BF4-782EC5B081C8}.Debug|arm64.ActiveCfg = Debug|Any CPU
- {681F6553-2B64-4DA2-8BF4-782EC5B081C8}.Debug|arm64.Build.0 = Debug|Any CPU
- {681F6553-2B64-4DA2-8BF4-782EC5B081C8}.Debug|x64.ActiveCfg = Debug|Any CPU
- {681F6553-2B64-4DA2-8BF4-782EC5B081C8}.Debug|x64.Build.0 = Debug|Any CPU
- {681F6553-2B64-4DA2-8BF4-782EC5B081C8}.Debug|x64.Deploy.0 = Debug|Any CPU
- {681F6553-2B64-4DA2-8BF4-782EC5B081C8}.Debug|x86.ActiveCfg = Debug|Any CPU
- {681F6553-2B64-4DA2-8BF4-782EC5B081C8}.Debug|x86.Build.0 = Debug|Any CPU
- {681F6553-2B64-4DA2-8BF4-782EC5B081C8}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {681F6553-2B64-4DA2-8BF4-782EC5B081C8}.Release|Any CPU.Build.0 = Release|Any CPU
- {681F6553-2B64-4DA2-8BF4-782EC5B081C8}.Release|Any CPU.Deploy.0 = Release|Any CPU
- {681F6553-2B64-4DA2-8BF4-782EC5B081C8}.Release|arm64.ActiveCfg = Release|Any CPU
- {681F6553-2B64-4DA2-8BF4-782EC5B081C8}.Release|arm64.Build.0 = Release|Any CPU
- {681F6553-2B64-4DA2-8BF4-782EC5B081C8}.Release|x64.ActiveCfg = Release|Any CPU
- {681F6553-2B64-4DA2-8BF4-782EC5B081C8}.Release|x64.Build.0 = Release|Any CPU
- {681F6553-2B64-4DA2-8BF4-782EC5B081C8}.Release|x86.ActiveCfg = Release|Any CPU
- {681F6553-2B64-4DA2-8BF4-782EC5B081C8}.Release|x86.Build.0 = Release|Any CPU
- {E422EAA0-A0B0-4902-86C5-C50BB6A4BBC3}.Debug|Any CPU.ActiveCfg = Debug|x64
- {E422EAA0-A0B0-4902-86C5-C50BB6A4BBC3}.Debug|Any CPU.Build.0 = Debug|x64
- {E422EAA0-A0B0-4902-86C5-C50BB6A4BBC3}.Debug|Any CPU.Deploy.0 = Debug|x64
- {E422EAA0-A0B0-4902-86C5-C50BB6A4BBC3}.Debug|arm64.ActiveCfg = Debug|arm64
- {E422EAA0-A0B0-4902-86C5-C50BB6A4BBC3}.Debug|arm64.Build.0 = Debug|arm64
- {E422EAA0-A0B0-4902-86C5-C50BB6A4BBC3}.Debug|arm64.Deploy.0 = Debug|arm64
- {E422EAA0-A0B0-4902-86C5-C50BB6A4BBC3}.Debug|x64.ActiveCfg = Debug|x64
- {E422EAA0-A0B0-4902-86C5-C50BB6A4BBC3}.Debug|x64.Build.0 = Debug|x64
- {E422EAA0-A0B0-4902-86C5-C50BB6A4BBC3}.Debug|x64.Deploy.0 = Debug|x64
- {E422EAA0-A0B0-4902-86C5-C50BB6A4BBC3}.Debug|x86.ActiveCfg = Debug|x86
- {E422EAA0-A0B0-4902-86C5-C50BB6A4BBC3}.Debug|x86.Build.0 = Debug|x86
- {E422EAA0-A0B0-4902-86C5-C50BB6A4BBC3}.Debug|x86.Deploy.0 = Debug|x86
- {E422EAA0-A0B0-4902-86C5-C50BB6A4BBC3}.Release|Any CPU.ActiveCfg = Release|x64
- {E422EAA0-A0B0-4902-86C5-C50BB6A4BBC3}.Release|Any CPU.Build.0 = Release|x64
- {E422EAA0-A0B0-4902-86C5-C50BB6A4BBC3}.Release|Any CPU.Deploy.0 = Release|x64
- {E422EAA0-A0B0-4902-86C5-C50BB6A4BBC3}.Release|arm64.ActiveCfg = Release|arm64
- {E422EAA0-A0B0-4902-86C5-C50BB6A4BBC3}.Release|arm64.Build.0 = Release|arm64
- {E422EAA0-A0B0-4902-86C5-C50BB6A4BBC3}.Release|arm64.Deploy.0 = Release|arm64
- {E422EAA0-A0B0-4902-86C5-C50BB6A4BBC3}.Release|x64.ActiveCfg = Release|x64
- {E422EAA0-A0B0-4902-86C5-C50BB6A4BBC3}.Release|x64.Build.0 = Release|x64
- {E422EAA0-A0B0-4902-86C5-C50BB6A4BBC3}.Release|x64.Deploy.0 = Release|x64
- {E422EAA0-A0B0-4902-86C5-C50BB6A4BBC3}.Release|x86.ActiveCfg = Release|x86
- {E422EAA0-A0B0-4902-86C5-C50BB6A4BBC3}.Release|x86.Build.0 = Release|x86
- {E422EAA0-A0B0-4902-86C5-C50BB6A4BBC3}.Release|x86.Deploy.0 = Release|x86
- {229E558D-FD5C-4258-AB01-67CFC4564DD1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {229E558D-FD5C-4258-AB01-67CFC4564DD1}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {229E558D-FD5C-4258-AB01-67CFC4564DD1}.Debug|arm64.ActiveCfg = Debug|Any CPU
- {229E558D-FD5C-4258-AB01-67CFC4564DD1}.Debug|arm64.Build.0 = Debug|Any CPU
- {229E558D-FD5C-4258-AB01-67CFC4564DD1}.Debug|x64.ActiveCfg = Debug|Any CPU
- {229E558D-FD5C-4258-AB01-67CFC4564DD1}.Debug|x64.Build.0 = Debug|Any CPU
- {229E558D-FD5C-4258-AB01-67CFC4564DD1}.Debug|x86.ActiveCfg = Debug|Any CPU
- {229E558D-FD5C-4258-AB01-67CFC4564DD1}.Debug|x86.Build.0 = Debug|Any CPU
- {229E558D-FD5C-4258-AB01-67CFC4564DD1}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {229E558D-FD5C-4258-AB01-67CFC4564DD1}.Release|Any CPU.Build.0 = Release|Any CPU
- {229E558D-FD5C-4258-AB01-67CFC4564DD1}.Release|arm64.ActiveCfg = Release|Any CPU
- {229E558D-FD5C-4258-AB01-67CFC4564DD1}.Release|arm64.Build.0 = Release|Any CPU
- {229E558D-FD5C-4258-AB01-67CFC4564DD1}.Release|x64.ActiveCfg = Release|Any CPU
- {229E558D-FD5C-4258-AB01-67CFC4564DD1}.Release|x64.Build.0 = Release|Any CPU
- {229E558D-FD5C-4258-AB01-67CFC4564DD1}.Release|x86.ActiveCfg = Release|Any CPU
- {229E558D-FD5C-4258-AB01-67CFC4564DD1}.Release|x86.Build.0 = Release|Any CPU
- {89F60EC2-62E2-478E-90BE-6F9CB931D537}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {89F60EC2-62E2-478E-90BE-6F9CB931D537}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {89F60EC2-62E2-478E-90BE-6F9CB931D537}.Debug|arm64.ActiveCfg = Debug|Any CPU
- {89F60EC2-62E2-478E-90BE-6F9CB931D537}.Debug|arm64.Build.0 = Debug|Any CPU
- {89F60EC2-62E2-478E-90BE-6F9CB931D537}.Debug|x64.ActiveCfg = Debug|Any CPU
- {89F60EC2-62E2-478E-90BE-6F9CB931D537}.Debug|x64.Build.0 = Debug|Any CPU
- {89F60EC2-62E2-478E-90BE-6F9CB931D537}.Debug|x86.ActiveCfg = Debug|Any CPU
- {89F60EC2-62E2-478E-90BE-6F9CB931D537}.Debug|x86.Build.0 = Debug|Any CPU
- {89F60EC2-62E2-478E-90BE-6F9CB931D537}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {89F60EC2-62E2-478E-90BE-6F9CB931D537}.Release|Any CPU.Build.0 = Release|Any CPU
- {89F60EC2-62E2-478E-90BE-6F9CB931D537}.Release|arm64.ActiveCfg = Release|Any CPU
- {89F60EC2-62E2-478E-90BE-6F9CB931D537}.Release|arm64.Build.0 = Release|Any CPU
- {89F60EC2-62E2-478E-90BE-6F9CB931D537}.Release|x64.ActiveCfg = Release|Any CPU
- {89F60EC2-62E2-478E-90BE-6F9CB931D537}.Release|x64.Build.0 = Release|Any CPU
- {89F60EC2-62E2-478E-90BE-6F9CB931D537}.Release|x86.ActiveCfg = Release|Any CPU
- {89F60EC2-62E2-478E-90BE-6F9CB931D537}.Release|x86.Build.0 = Release|Any CPU
- {5CD1A253-0975-4190-915D-83FA893E2FDD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {5CD1A253-0975-4190-915D-83FA893E2FDD}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {5CD1A253-0975-4190-915D-83FA893E2FDD}.Debug|arm64.ActiveCfg = Debug|Any CPU
- {5CD1A253-0975-4190-915D-83FA893E2FDD}.Debug|arm64.Build.0 = Debug|Any CPU
- {5CD1A253-0975-4190-915D-83FA893E2FDD}.Debug|x64.ActiveCfg = Debug|Any CPU
- {5CD1A253-0975-4190-915D-83FA893E2FDD}.Debug|x64.Build.0 = Debug|Any CPU
- {5CD1A253-0975-4190-915D-83FA893E2FDD}.Debug|x86.ActiveCfg = Debug|Any CPU
- {5CD1A253-0975-4190-915D-83FA893E2FDD}.Debug|x86.Build.0 = Debug|Any CPU
- {5CD1A253-0975-4190-915D-83FA893E2FDD}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {5CD1A253-0975-4190-915D-83FA893E2FDD}.Release|Any CPU.Build.0 = Release|Any CPU
- {5CD1A253-0975-4190-915D-83FA893E2FDD}.Release|arm64.ActiveCfg = Release|Any CPU
- {5CD1A253-0975-4190-915D-83FA893E2FDD}.Release|arm64.Build.0 = Release|Any CPU
- {5CD1A253-0975-4190-915D-83FA893E2FDD}.Release|x64.ActiveCfg = Release|Any CPU
- {5CD1A253-0975-4190-915D-83FA893E2FDD}.Release|x64.Build.0 = Release|Any CPU
- {5CD1A253-0975-4190-915D-83FA893E2FDD}.Release|x86.ActiveCfg = Release|Any CPU
- {5CD1A253-0975-4190-915D-83FA893E2FDD}.Release|x86.Build.0 = Release|Any CPU
- {167318B6-C5ED-49E1-9527-FA4A3916BD8F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {167318B6-C5ED-49E1-9527-FA4A3916BD8F}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {167318B6-C5ED-49E1-9527-FA4A3916BD8F}.Debug|arm64.ActiveCfg = Debug|Any CPU
- {167318B6-C5ED-49E1-9527-FA4A3916BD8F}.Debug|arm64.Build.0 = Debug|Any CPU
- {167318B6-C5ED-49E1-9527-FA4A3916BD8F}.Debug|x64.ActiveCfg = Debug|Any CPU
- {167318B6-C5ED-49E1-9527-FA4A3916BD8F}.Debug|x64.Build.0 = Debug|Any CPU
- {167318B6-C5ED-49E1-9527-FA4A3916BD8F}.Debug|x86.ActiveCfg = Debug|Any CPU
- {167318B6-C5ED-49E1-9527-FA4A3916BD8F}.Debug|x86.Build.0 = Debug|Any CPU
- {167318B6-C5ED-49E1-9527-FA4A3916BD8F}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {167318B6-C5ED-49E1-9527-FA4A3916BD8F}.Release|Any CPU.Build.0 = Release|Any CPU
- {167318B6-C5ED-49E1-9527-FA4A3916BD8F}.Release|arm64.ActiveCfg = Release|Any CPU
- {167318B6-C5ED-49E1-9527-FA4A3916BD8F}.Release|arm64.Build.0 = Release|Any CPU
- {167318B6-C5ED-49E1-9527-FA4A3916BD8F}.Release|x64.ActiveCfg = Release|Any CPU
- {167318B6-C5ED-49E1-9527-FA4A3916BD8F}.Release|x64.Build.0 = Release|Any CPU
- {167318B6-C5ED-49E1-9527-FA4A3916BD8F}.Release|x86.ActiveCfg = Release|Any CPU
- {167318B6-C5ED-49E1-9527-FA4A3916BD8F}.Release|x86.Build.0 = Release|Any CPU
+ {C3DB8258-3C80-4194-B1FD-70CE8D72C2EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {C3DB8258-3C80-4194-B1FD-70CE8D72C2EB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C3DB8258-3C80-4194-B1FD-70CE8D72C2EB}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
+ {C3DB8258-3C80-4194-B1FD-70CE8D72C2EB}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {C3DB8258-3C80-4194-B1FD-70CE8D72C2EB}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C3DB8258-3C80-4194-B1FD-70CE8D72C2EB}.Release|Any CPU.Deploy.0 = Release|Any CPU
+ {2DC2D12B-75CA-4DA3-91B9-309404863A43}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {2DC2D12B-75CA-4DA3-91B9-309404863A43}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {2DC2D12B-75CA-4DA3-91B9-309404863A43}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {2DC2D12B-75CA-4DA3-91B9-309404863A43}.Release|Any CPU.Build.0 = Release|Any CPU
+ {8BD90A1D-9721-4B71-B7FC-95AA209B167A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {8BD90A1D-9721-4B71-B7FC-95AA209B167A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8BD90A1D-9721-4B71-B7FC-95AA209B167A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {8BD90A1D-9721-4B71-B7FC-95AA209B167A}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
- GlobalSection(NestedProjects) = preSolution
- {909C5D26-83DB-46F2-AD71-1923A29A5F08} = {57B07323-0D93-42C5-9B5E-8CCDBF86CCA7}
- {777A60B5-F64C-42FD-BDB9-25E4D1F726E1} = {909C5D26-83DB-46F2-AD71-1923A29A5F08}
- {681F6553-2B64-4DA2-8BF4-782EC5B081C8} = {909C5D26-83DB-46F2-AD71-1923A29A5F08}
- {E422EAA0-A0B0-4902-86C5-C50BB6A4BBC3} = {909C5D26-83DB-46F2-AD71-1923A29A5F08}
- {229E558D-FD5C-4258-AB01-67CFC4564DD1} = {909C5D26-83DB-46F2-AD71-1923A29A5F08}
- {89F60EC2-62E2-478E-90BE-6F9CB931D537} = {909C5D26-83DB-46F2-AD71-1923A29A5F08}
- EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
- SolutionGuid = {77D43B65-F103-4887-AB0F-423BC3BF9641}
+ SolutionGuid = {6B74377C-CBAF-4749-BBFD-8B2B03B845B5}
EndGlobalSection
EndGlobal
diff --git a/FirehoseNews.Shared/AppHead.xaml b/Firehose/App.xaml
similarity index 51%
rename from FirehoseNews.Shared/AppHead.xaml
rename to Firehose/App.xaml
index a126877..43c7774 100644
--- a/FirehoseNews.Shared/AppHead.xaml
+++ b/Firehose/App.xaml
@@ -1,17 +1,22 @@
-
-
+
-
+
+
+
+
-
+
-
+
+
+
diff --git a/FirehoseNews.Shared/AppHead.xaml.cs b/Firehose/App.xaml.cs
similarity index 54%
rename from FirehoseNews.Shared/AppHead.xaml.cs
rename to Firehose/App.xaml.cs
index e70dd4b..d840033 100644
--- a/FirehoseNews.Shared/AppHead.xaml.cs
+++ b/Firehose/App.xaml.cs
@@ -1,39 +1,88 @@
using System;
-using Microsoft.Extensions.Logging;
-using Microsoft.UI.Xaml;
-using Uno.Resizetizer;
-
-namespace FirehoseNews;
-public sealed partial class AppHead : App
+using CommunityToolkit.Mvvm.DependencyInjection;
+using Firehose.Preferences;
+using Firehose.UI;
+using Firehose.Viewmodels;
+using HYDRANT;
+
+namespace Firehose;
+public partial class App : Application
{
- static AppHead() =>
- InitializeLogging();
-
///
/// Initializes the singleton application object. This is the first line of authored code
/// executed, and as such is the logical equivalent of main() or WinMain().
///
- public AppHead()
+ public App()
{
this.InitializeComponent();
}
+ public static Window MainWindow { get; private set; }
+
+ protected override async void OnLaunched(LaunchActivatedEventArgs args)
+ {
+ MainWindow = new Window();
+#if DEBUG
+ MainWindow.EnableHotReload();
+#endif
+ PreferencesModel.Load();
+
+ configureIOC();
+ App.Current.UnhandledException += Current_UnhandledException;
+
+ if (MainWindow.Content is not ArticleList)
+ {
+ // Place the frame in the current Window
+ Glob.Frame.NavigationFailed += OnNavigationFailed;
+ }
+
+ Glob.Publications = await new API().GetPublications();
+
+ if (Glob.Frame.Content == null)
+ {
+ // When the navigation stack isn't restored navigate to the first page,
+ // configuring the new page by passing required information as a navigation
+ // parameter
+
+
+ //Glob.Frame.Navigate(typeof(ArticleList));
+ Glob.DoNavi(new ArticleList());
+ }
+
+
+ // Ensure the current window is active
+ MainWindow.Activate();
+ }
+
+ void configureIOC()
+ {
+ var Services = new ServiceCollection()
+ .AddSingleton()
+ .AddSingleton()
+ .BuildServiceProvider();
+
+ Ioc.Default.ConfigureServices(Services);
+ }
+
+ private void Current_UnhandledException(object sender, Microsoft.UI.Xaml.UnhandledExceptionEventArgs e)
+ {
+ Console.WriteLine(e.Message);
+ }
+
///
- /// Invoked when the application is launched normally by the end user. Other entry points
- /// will be used such as when the application is launched to open a specific file.
+ /// Invoked when Navigation to a page fails
///
- /// Details about the launch request and process.
- protected override void OnLaunched(LaunchActivatedEventArgs args)
+ /// The Frame which failed navigation
+ /// Details about the navigation failure
+ void OnNavigationFailed(object sender, NavigationFailedEventArgs e)
{
- base.OnLaunched(args);
-
- MainWindow.SetWindowIcon();
+ throw new InvalidOperationException($"Failed to load {e.SourcePageType.FullName}: {e.Exception}");
}
///
/// Configures global Uno Platform logging
///
- private static void InitializeLogging()
+ public static void InitializeLogging()
{
#if DEBUG
// Logging is disabled by default for release builds, as it incurs a significant
@@ -54,12 +103,12 @@ private static void InitializeLogging()
#endif
// Exclude logs below this level
- builder.SetMinimumLevel(LogLevel.Information);
+ //builder.SetMinimumLevel(Glob.LogLevel.Information);
- // Default filters for Uno Platform namespaces
- builder.AddFilter("Uno", LogLevel.Warning);
- builder.AddFilter("Windows", LogLevel.Warning);
- builder.AddFilter("Microsoft", LogLevel.Warning);
+ //// Default filters for Uno Platform namespaces
+ //builder.AddFilter("Uno", Glob.LogLevel.Warning);
+ //builder.AddFilter("Windows", Glob.LogLevel.Warning);
+ //builder.AddFilter("Microsoft", Glob.LogLevel.Warning);
// Generic Xaml events
// builder.AddFilter("Microsoft.UI.Xaml", LogLevel.Debug );
diff --git a/FirehoseNews.Shared/Icons/icon.svg b/Firehose/Assets/Icons/icon.svg
similarity index 100%
rename from FirehoseNews.Shared/Icons/icon.svg
rename to Firehose/Assets/Icons/icon.svg
diff --git a/FirehoseNews.Shared/Icons/icon_foreground.svg b/Firehose/Assets/Icons/icon_foreground.svg
similarity index 100%
rename from FirehoseNews.Shared/Icons/icon_foreground.svg
rename to Firehose/Assets/Icons/icon_foreground.svg
diff --git a/Firehose/Assets/SharedAssets.md b/Firehose/Assets/SharedAssets.md
new file mode 100644
index 0000000..1b84a74
--- /dev/null
+++ b/Firehose/Assets/SharedAssets.md
@@ -0,0 +1,32 @@
+# Shared Assets
+
+See documentation about assets here: https://github.com/unoplatform/uno/blob/master/doc/articles/features/working-with-assets.md
+
+## Here is a cheat sheet
+
+1. Add the image file to the `Assets` directory of a shared project.
+2. Set the build action to `Content`.
+3. (Recommended) Provide an asset for various scales/dpi
+
+### Examples
+
+```text
+\Assets\Images\logo.scale-100.png
+\Assets\Images\logo.scale-200.png
+\Assets\Images\logo.scale-400.png
+
+\Assets\Images\scale-100\logo.png
+\Assets\Images\scale-200\logo.png
+\Assets\Images\scale-400\logo.png
+```
+
+### Table of scales
+
+| Scale | WinUI | iOS/MacCatalyst | Android |
+|-------|:-----------:|:---------------:|:-------:|
+| `100` | scale-100 | @1x | mdpi |
+| `125` | scale-125 | N/A | N/A |
+| `150` | scale-150 | N/A | hdpi |
+| `200` | scale-200 | @2x | xhdpi |
+| `300` | scale-300 | @3x | xxhdpi |
+| `400` | scale-400 | N/A | xxxhdpi |
diff --git a/FirehoseNews.Shared/Splash/splash_screen.svg b/Firehose/Assets/splash.svg
similarity index 100%
rename from FirehoseNews.Shared/Splash/splash_screen.svg
rename to Firehose/Assets/splash.svg
diff --git a/Firehose/Firehose.csproj b/Firehose/Firehose.csproj
new file mode 100644
index 0000000..77c11b1
--- /dev/null
+++ b/Firehose/Firehose.csproj
@@ -0,0 +1,114 @@
+
+
+
+ net8.0-android;
+ net8.0-ios;
+ net8.0-maccatalyst;
+ net8.0-windows10.0.19041;
+ net8.0-desktop;
+
+
+ Exe
+ true
+
+
+ Firehose
+
+ net.rarisma.REMNANT
+
+ 1.0
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ MSBuild:Compile
+
+
+ MSBuild:Compile
+
+
+ MSBuild:Compile
+
+
+ MSBuild:Compile
+
+
+ MSBuild:Compile
+
+
+ MSBuild:Compile
+
+
+ MSBuild:Compile
+
+
+ MSBuild:Compile
+
+
+ MSBuild:Compile
+
+
+ MSBuild:Compile
+
+
+
+
+ MSBuild:Compile
+
+
+
+
+ MSBuild:Compile
+
+
+
diff --git a/FirehoseNews/Glob.cs b/Firehose/Glob.cs
similarity index 58%
rename from FirehoseNews/Glob.cs
rename to Firehose/Glob.cs
index 5fb06c6..d8110a4 100644
--- a/FirehoseNews/Glob.cs
+++ b/Firehose/Glob.cs
@@ -1,8 +1,9 @@
using Windows.UI.Core;
-using FirehoseNews.Preferences;
+using Firehose.Preferences;
using HYDRANT.Definitions;
+
//I'VE GOT A RECKLESS TONGUE
-namespace FirehoseNews;
+namespace Firehose;
public static class Glob
{
public static Stack