20 Commits

Author SHA1 Message Date
f3145d8811 Add prerelease option 2025-09-24 18:29:32 -04:00
9e2e7aabe8 Fix hang when moving window during refresh 2024-12-08 21:51:40 -05:00
7ee84f079b Revert attempts 2024-06-25 21:36:13 -04:00
8f70003bef Try previous image? 2024-06-25 21:29:33 -04:00
38f093dc5c Increase logging 2024-06-25 21:26:44 -04:00
e5bdc80d10 Try fixing build 2024-06-25 20:46:00 -04:00
260268194a Handle a few more errors and update a few packages 2024-06-18 20:34:22 -04:00
8ecde89be0 Crash fixes 2023-07-14 17:01:52 -04:00
845e80577c Undo previous change and set status to "success" if feed read but wasn't modified 2023-07-11 17:42:29 -04:00
31a04b13e6 Exclude "not modified" from errors 2023-07-11 17:35:03 -04:00
64d893ae0f Update HTTP request headers 2023-06-22 17:08:20 -04:00
0ddd38e3f2 Add support for per-feed user agent 2023-06-15 17:28:38 -04:00
f5f78c8825 Remove extra restore now that config is fixed 2023-04-29 19:06:58 -04:00
477185341e Branch and config updates 2023-04-29 19:03:25 -04:00
1db13fbe2e Update installer to detect .NET runtime 2023-04-29 18:42:53 -04:00
c64ec21bd9 Adjust feed read exception handling 2023-04-28 14:44:01 -04:00
45009a31b9 ID doesn't work in a release build for some reason 2023-04-28 13:02:18 -04:00
2a7ef356bd Set tray icon ID 2023-04-28 12:50:49 -04:00
105b6e7d30 Update package versions 2023-04-28 12:47:40 -04:00
965f753489 Update packages 2023-04-28 08:00:17 -04:00
25 changed files with 375 additions and 206 deletions

View File

@@ -1,22 +1,31 @@
using FeedCenter.Data; using System;
using System.Linq;
using FeedCenter.Data;
using FeedCenter.Options; using FeedCenter.Options;
using Realms; using Realms;
using System;
using System.Linq;
namespace FeedCenter; namespace FeedCenter;
public class FeedCenterEntities public class FeedCenterEntities
{ {
public Realm RealmInstance { get; }
public RealmObservableCollection<Category> Categories { get; }
public RealmObservableCollection<Feed> Feeds { get; private set; }
public RealmObservableCollection<Setting> Settings { get; private set; }
public FeedCenterEntities() public FeedCenterEntities()
{ {
var realmConfiguration = new RealmConfiguration($"{Database.DatabaseFile}"); var realmConfiguration = new RealmConfiguration($"{Database.DatabaseFile}")
{
SchemaVersion = 1,
MigrationCallback = (migration, oldSchemaVersion) =>
{
var newVersionFeeds = migration.NewRealm.All<Feed>();
foreach (var newVersionFeed in newVersionFeeds)
{
if (oldSchemaVersion == 0)
{
newVersionFeed.UserAgent = null;
}
}
}
};
RealmInstance = Realm.GetInstance(realmConfiguration); RealmInstance = Realm.GetInstance(realmConfiguration);
@@ -30,6 +39,17 @@ public class FeedCenterEntities
} }
} }
public RealmObservableCollection<Category> Categories { get; }
public Category DefaultCategory
{
get { return Categories.First(c => c.IsDefault); }
}
public RealmObservableCollection<Feed> Feeds { get; private set; }
private Realm RealmInstance { get; }
public RealmObservableCollection<Setting> Settings { get; private set; }
public void Refresh() public void Refresh()
{ {
RealmInstance.Refresh(); RealmInstance.Refresh();
@@ -44,9 +64,4 @@ public class FeedCenterEntities
{ {
return RealmInstance.BeginWrite(); return RealmInstance.BeginWrite();
} }
public Category DefaultCategory
{
get { return Categories.First(c => c.IsDefault); }
}
} }

View File

@@ -24,17 +24,17 @@
<None Remove="Resources\Warning.ico" /> <None Remove="Resources\Warning.ico" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="ChrisKaczor.ApplicationUpdate" Version="1.0.2" /> <PackageReference Include="ChrisKaczor.ApplicationUpdate" Version="1.0.7" />
<PackageReference Include="ChrisKaczor.GenericSettingsProvider" Version="1.0.3" /> <PackageReference Include="ChrisKaczor.GenericSettingsProvider" Version="1.0.4" />
<PackageReference Include="ChrisKaczor.InstalledBrowsers" Version="1.0.3" /> <PackageReference Include="ChrisKaczor.InstalledBrowsers" Version="1.0.4" />
<PackageReference Include="ChrisKaczor.Wpf.Application.SingleInstance" Version="1.0.4" /> <PackageReference Include="ChrisKaczor.Wpf.Application.SingleInstance" Version="1.0.5" />
<PackageReference Include="ChrisKaczor.Wpf.Application.StartWithWindows" Version="1.0.2" /> <PackageReference Include="ChrisKaczor.Wpf.Application.StartWithWindows" Version="1.0.5" />
<PackageReference Include="ChrisKaczor.Wpf.Controls.HtmlTextBlock" Version="1.0.2" /> <PackageReference Include="ChrisKaczor.Wpf.Controls.HtmlTextBlock" Version="1.0.3" />
<PackageReference Include="ChrisKaczor.Wpf.Controls.Link" Version="1.0.3" /> <PackageReference Include="ChrisKaczor.Wpf.Controls.Link" Version="1.0.4" />
<PackageReference Include="ChrisKaczor.Wpf.Controls.Toolbar" Version="1.0.2" /> <PackageReference Include="ChrisKaczor.Wpf.Controls.Toolbar" Version="1.0.3" />
<PackageReference Include="ChrisKaczor.Wpf.Validation" Version="1.0.3" /> <PackageReference Include="ChrisKaczor.Wpf.Validation" Version="1.0.4" />
<PackageReference Include="ChrisKaczor.Wpf.Windows.ControlBox" Version="1.0.2" /> <PackageReference Include="ChrisKaczor.Wpf.Windows.ControlBox" Version="1.0.3" />
<PackageReference Include="ChrisKaczor.Wpf.Windows.SnappingWindow" Version="1.0.2" /> <PackageReference Include="ChrisKaczor.Wpf.Windows.SnappingWindow" Version="1.0.4" />
<PackageReference Include="Dapper" Version="2.0.123" /> <PackageReference Include="Dapper" Version="2.0.123" />
<PackageReference Include="DebounceThrottle" Version="2.0.0" /> <PackageReference Include="DebounceThrottle" Version="2.0.0" />
<PackageReference Include="H.NotifyIcon.Wpf" Version="2.0.108" /> <PackageReference Include="H.NotifyIcon.Wpf" Version="2.0.108" />
@@ -44,11 +44,11 @@
<PackageReference Include="Microsoft.SqlServer.Compact" Version="4.0.8876.1" GeneratePathProperty="true"> <PackageReference Include="Microsoft.SqlServer.Compact" Version="4.0.8876.1" GeneratePathProperty="true">
<NoWarn>NU1701</NoWarn> <NoWarn>NU1701</NoWarn>
</PackageReference> </PackageReference>
<PackageReference Include="Microsoft.Windows.Compatibility" Version="7.0.1" /> <PackageReference Include="Microsoft.Windows.Compatibility" Version="7.0.6" />
<PackageReference Include="NameBasedGrid" Version="0.10.1"> <PackageReference Include="NameBasedGrid" Version="0.10.1">
<NoWarn>NU1701</NoWarn> <NoWarn>NU1701</NoWarn>
</PackageReference> </PackageReference>
<PackageReference Include="Realm" Version="10.21.0" /> <PackageReference Include="Realm" Version="10.21.1" />
<PackageReference Include="Serilog" Version="2.12.0" /> <PackageReference Include="Serilog" Version="2.12.0" />
<PackageReference Include="Serilog.Enrichers.Thread" Version="3.1.0" /> <PackageReference Include="Serilog.Enrichers.Thread" Version="3.1.0" />
<PackageReference Include="Serilog.Sinks.Console" Version="4.1.0" /> <PackageReference Include="Serilog.Sinks.Console" Version="4.1.0" />

View File

@@ -1,16 +1,7 @@
using ChrisKaczor.ApplicationUpdate; using System;
using FeedCenter.Data;
using FeedCenter.FeedParsers;
using FeedCenter.Properties;
using FeedCenter.Xml;
using JetBrains.Annotations;
using Realms;
using Serilog;
using System;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel; using System.ComponentModel;
using System.Diagnostics;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Net; using System.Net;
@@ -19,6 +10,15 @@ using System.Net.Http.Headers;
using System.Net.Sockets; using System.Net.Sockets;
using System.Text; using System.Text;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using System.Threading.Tasks;
using ChrisKaczor.ApplicationUpdate;
using FeedCenter.Data;
using FeedCenter.FeedParsers;
using FeedCenter.Properties;
using FeedCenter.Xml;
using JetBrains.Annotations;
using Realms;
using Serilog;
namespace FeedCenter; namespace FeedCenter;
@@ -98,9 +98,6 @@ public partial class Feed : RealmObject, INotifyDataErrorInfo
} }
} }
[MapTo("Password")]
public string RawPassword { get; set; }
public string Password public string Password
{ {
get => RawPassword; get => RawPassword;
@@ -122,9 +119,15 @@ public partial class Feed : RealmObject, INotifyDataErrorInfo
[MapTo("Name")] [MapTo("Name")]
private string RawName { get; set; } = string.Empty; private string RawName { get; set; } = string.Empty;
[MapTo("Password")]
public string RawPassword { get; set; }
[MapTo("Source")] [MapTo("Source")]
private string RawSource { get; set; } = string.Empty; private string RawSource { get; set; } = string.Empty;
[MapTo("Username")]
public string RawUsername { get; set; }
public string Source public string Source
{ {
get => RawSource; get => RawSource;
@@ -139,8 +142,7 @@ public partial class Feed : RealmObject, INotifyDataErrorInfo
public string Title { get; set; } public string Title { get; set; }
[MapTo("Username")] public string UserAgent { get; set; }
public string RawUsername { get; set; }
public string Username public string Username
{ {
@@ -200,6 +202,9 @@ public partial class Feed : RealmObject, INotifyDataErrorInfo
case FeedReadResult.NotEnabled: case FeedReadResult.NotEnabled:
case FeedReadResult.NotModified: case FeedReadResult.NotModified:
// Reset status to success
LastReadResult = FeedReadResult.Success;
// Ignore // Ignore
break; break;
@@ -242,6 +247,17 @@ public partial class Feed : RealmObject, INotifyDataErrorInfo
return new Tuple<FeedType, string>(feedType, retrieveResult.Item2); return new Tuple<FeedType, string>(feedType, retrieveResult.Item2);
} }
private string GetUserAgent()
{
if (!string.IsNullOrWhiteSpace(UserAgent))
return UserAgent;
if (!string.IsNullOrWhiteSpace(Settings.Default.DefaultUserAgent))
return Settings.Default.DefaultUserAgent;
return "FeedCenter/" + UpdateCheck.LocalVersion;
}
private Tuple<FeedReadResult, string> RetrieveFeed() private Tuple<FeedReadResult, string> RetrieveFeed()
{ {
try try
@@ -252,25 +268,38 @@ public partial class Feed : RealmObject, INotifyDataErrorInfo
var clientHandler = new HttpClientHandler var clientHandler = new HttpClientHandler
{ {
// Set that we'll accept compressed data // Set that we'll accept compressed data
AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate, AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate | DecompressionMethods.Brotli,
AllowAutoRedirect = true AllowAutoRedirect = true
}; };
_httpClient = new HttpClient(clientHandler); _httpClient = new HttpClient(clientHandler)
{
// Set a timeout
Timeout = TimeSpan.FromSeconds(10)
};
// Set a user agent string _httpClient.DefaultRequestHeaders.Accept.ParseAdd("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
var userAgent = string.IsNullOrWhiteSpace(Settings.Default.DefaultUserAgent) ? "FeedCenter/" + UpdateCheck.LocalVersion : Settings.Default.DefaultUserAgent; _httpClient.DefaultRequestHeaders.AcceptEncoding.ParseAdd("gzip, deflate, br");
_httpClient.DefaultRequestHeaders.UserAgent.ParseAdd(userAgent); _httpClient.DefaultRequestHeaders.AcceptLanguage.ParseAdd("en-US,en;q=0.9");
_httpClient.DefaultRequestHeaders.CacheControl = CacheControlHeaderValue.Parse("max-age=0");
// Set a timeout
_httpClient.Timeout = TimeSpan.FromSeconds(10);
} }
// Set a user agent string
var userAgent = GetUserAgent();
_httpClient.DefaultRequestHeaders.UserAgent.Clear();
_httpClient.DefaultRequestHeaders.UserAgent.ParseAdd(userAgent);
// If we need to authenticate then set the credentials // If we need to authenticate then set the credentials
_httpClient.DefaultRequestHeaders.Authorization = Authenticate ? new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.UTF8.GetBytes($"{Username}:{Password}"))) : null; _httpClient.DefaultRequestHeaders.Authorization = Authenticate ? new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.UTF8.GetBytes($"{Username}:{Password}"))) : null;
_httpClient.DefaultRequestHeaders.IfModifiedSince = LastChecked;
// Attempt to get the response // Attempt to get the response
var feedStream = _httpClient.GetStreamAsync(Source).Result; var response = _httpClient.GetAsync(Source).Result;
response.EnsureSuccessStatusCode();
var feedStream = response.Content.ReadAsStream();
// Create the text reader // Create the text reader
using StreamReader textReader = new XmlSanitizingStream(feedStream, Encoding.UTF8); using StreamReader textReader = new XmlSanitizingStream(feedStream, Encoding.UTF8);
@@ -293,78 +322,28 @@ public partial class Feed : RealmObject, INotifyDataErrorInfo
return Tuple.Create(FeedReadResult.Success, feedText); return Tuple.Create(FeedReadResult.Success, feedText);
} }
catch (IOException ioException) catch (HttpRequestException httpRequestException)
{ {
Log.Logger.Error(ioException, "Exception"); if (httpRequestException.StatusCode == HttpStatusCode.NotModified)
{
return Tuple.Create(FeedReadResult.NotModified, string.Empty);
}
return Tuple.Create(FeedReadResult.ConnectionFailed, string.Empty); Log.Logger.Error(httpRequestException, "Exception");
return HandleHttpRequestException(httpRequestException);
} }
catch (AggregateException aggregateException) catch (AggregateException aggregateException)
{ {
Log.Logger.Error(aggregateException, "Exception"); Log.Logger.Error(aggregateException, "Exception");
var innerException = aggregateException.InnerException; return aggregateException.InnerException switch
if (innerException is not HttpRequestException httpRequestException)
return Tuple.Create(FeedReadResult.UnknownError, string.Empty);
switch (httpRequestException.StatusCode)
{ {
case HttpStatusCode.ServiceUnavailable: TaskCanceledException => Tuple.Create(FeedReadResult.Timeout, string.Empty),
return Tuple.Create(FeedReadResult.TemporarilyUnavailable, string.Empty); HttpRequestException httpRequestException => HandleHttpRequestException(httpRequestException),
case HttpStatusCode.InternalServerError:
return Tuple.Create(FeedReadResult.ServerError, string.Empty);
case HttpStatusCode.NotModified:
return Tuple.Create(FeedReadResult.NotModified, string.Empty);
case HttpStatusCode.NotFound:
return Tuple.Create(FeedReadResult.NotFound, string.Empty);
case HttpStatusCode.Unauthorized:
case HttpStatusCode.Forbidden:
return Tuple.Create(FeedReadResult.Unauthorized, string.Empty);
case HttpStatusCode.Moved:
return Tuple.Create(FeedReadResult.Moved, string.Empty);
}
if (httpRequestException.InnerException is not SocketException socketException)
return Tuple.Create(FeedReadResult.UnknownError, string.Empty);
return socketException.SocketErrorCode switch
{
SocketError.NoData => Tuple.Create(FeedReadResult.NoResponse, string.Empty),
SocketError.HostNotFound => Tuple.Create(FeedReadResult.NotFound, string.Empty),
_ => Tuple.Create(FeedReadResult.UnknownError, string.Empty) _ => Tuple.Create(FeedReadResult.UnknownError, string.Empty)
}; };
} }
catch (WebException webException)
{
var result = FeedReadResult.UnknownError;
switch (webException.Status)
{
case WebExceptionStatus.ConnectFailure:
case WebExceptionStatus.NameResolutionFailure:
result = FeedReadResult.ConnectionFailed;
break;
case WebExceptionStatus.Timeout:
result = FeedReadResult.Timeout;
break;
}
Log.Logger.Error(webException, "Exception");
if (result == FeedReadResult.UnknownError)
Debug.Print("Unknown error");
return Tuple.Create(result, string.Empty);
}
catch (Exception exception) catch (Exception exception)
{ {
Log.Logger.Error(exception, "Exception"); Log.Logger.Error(exception, "Exception");
@@ -373,6 +352,45 @@ public partial class Feed : RealmObject, INotifyDataErrorInfo
} }
} }
private static Tuple<FeedReadResult, string> HandleHttpRequestException(HttpRequestException httpRequestException)
{
switch (httpRequestException.StatusCode)
{
case HttpStatusCode.TooManyRequests:
return Tuple.Create(FeedReadResult.TooManyRequests, string.Empty);
case HttpStatusCode.ServiceUnavailable:
return Tuple.Create(FeedReadResult.TemporarilyUnavailable, string.Empty);
case HttpStatusCode.InternalServerError:
return Tuple.Create(FeedReadResult.ServerError, string.Empty);
case HttpStatusCode.NotModified:
return Tuple.Create(FeedReadResult.NotModified, string.Empty);
case HttpStatusCode.NotFound:
return Tuple.Create(FeedReadResult.NotFound, string.Empty);
case HttpStatusCode.Unauthorized:
case HttpStatusCode.Forbidden:
return Tuple.Create(FeedReadResult.Unauthorized, string.Empty);
case HttpStatusCode.Moved:
case HttpStatusCode.Redirect:
return Tuple.Create(FeedReadResult.Moved, string.Empty);
}
if (httpRequestException.InnerException is not SocketException socketException)
return Tuple.Create(FeedReadResult.UnknownError, string.Empty);
return socketException.SocketErrorCode switch
{
SocketError.NoData => Tuple.Create(FeedReadResult.NoResponse, string.Empty),
SocketError.HostNotFound => Tuple.Create(FeedReadResult.NotFound, string.Empty),
_ => Tuple.Create(FeedReadResult.UnknownError, string.Empty)
};
}
private FeedReadResult ReadFeed(bool forceRead) private FeedReadResult ReadFeed(bool forceRead)
{ {
try try
@@ -392,12 +410,12 @@ public partial class Feed : RealmObject, INotifyDataErrorInfo
return FeedReadResult.NotDue; return FeedReadResult.NotDue;
} }
// We're checking it now so update the time
LastChecked = DateTimeOffset.Now;
// Read the feed text // Read the feed text
var retrieveResult = RetrieveFeed(); var retrieveResult = RetrieveFeed();
// We're checking it now so update the time
LastChecked = DateTimeOffset.Now;
// Get the information out of the async result // Get the information out of the async result
var result = retrieveResult.Item1; var result = retrieveResult.Item1;
var feedText = retrieveResult.Item2; var feedText = retrieveResult.Item2;

View File

@@ -15,5 +15,6 @@ public enum FeedReadResult
ConnectionFailed, ConnectionFailed,
ServerError, ServerError,
Moved, Moved,
TemporarilyUnavailable TemporarilyUnavailable,
TooManyRequests
} }

View File

@@ -178,7 +178,7 @@ public partial class MainWindow
if (DateTime.Now - Settings.Default.LastVersionCheck >= Settings.Default.VersionCheckInterval) if (DateTime.Now - Settings.Default.LastVersionCheck >= Settings.Default.VersionCheckInterval)
{ {
// Get the update information // Get the update information
UpdateCheck.CheckForUpdate().Wait(); UpdateCheck.CheckForUpdate(Settings.Default.IncludePrerelease).Wait();
// Update the last check time // Update the last check time
Settings.Default.LastVersionCheck = DateTime.Now; Settings.Default.LastVersionCheck = DateTime.Now;

View File

@@ -90,7 +90,7 @@ public partial class MainWindow : IDisposable
// Check for update // Check for update
if (Settings.Default.CheckVersionAtStartup) if (Settings.Default.CheckVersionAtStartup)
await UpdateCheck.CheckForUpdate(); await UpdateCheck.CheckForUpdate(Settings.Default.IncludePrerelease);
// Show the link if updates are available // Show the link if updates are available
if (UpdateCheck.UpdateAvailable) if (UpdateCheck.UpdateAvailable)

View File

@@ -24,17 +24,18 @@ public partial class MainWindow
{ {
StopTimer(); StopTimer();
_mainTimer.Dispose(); _mainTimer?.Dispose();
_mainTimer = null;
} }
private void StartTimer() private void StartTimer()
{ {
_mainTimer.Start(); _mainTimer?.Start();
} }
private void StopTimer() private void StopTimer()
{ {
_mainTimer.Stop(); _mainTimer?.Stop();
} }
private void HandleMainTimerElapsed(object sender, EventArgs e) private void HandleMainTimerElapsed(object sender, EventArgs e)

View File

@@ -166,6 +166,12 @@ public partial class MainWindow
// Delete the feed // Delete the feed
_database.SaveChanges(() => _database.Feeds.Remove(feedToDelete)); _database.SaveChanges(() => _database.Feeds.Remove(feedToDelete));
// Refresh the database to current settings
ResetDatabase();
// Re-initialize the feed display
DisplayFeed();
} }
private void OpenAllFeedItemsOnSinglePage() private void OpenAllFeedItemsOnSinglePage()

View File

@@ -34,6 +34,6 @@ public partial class MainWindow
private void HandleNewVersionLinkClick(object sender, RoutedEventArgs e) private void HandleNewVersionLinkClick(object sender, RoutedEventArgs e)
{ {
UpdateCheck.DisplayUpdateInformation(true); UpdateCheck.DisplayUpdateInformation(true, Settings.Default.IncludePrerelease);
} }
} }

View File

@@ -49,14 +49,14 @@ public partial class MainWindow
{ {
// Set the last window location // Set the last window location
Settings.Default.WindowLocation = new Point(Left, Top); Settings.Default.WindowLocation = new Point(Left, Top);
Settings.Default.Save();
// Set the last window size // Set the last window size
Settings.Default.WindowSize = new Size(Width, Height); Settings.Default.WindowSize = new Size(Width, Height);
Settings.Default.Save();
// Save the dock on the navigation tray // Save the dock on the navigation tray
Settings.Default.ToolbarLocation = NameBasedGrid.NameBasedGrid.GetRow(NavigationToolbarTray) == "TopToolbarRow" ? Dock.Top : Dock.Bottom; Settings.Default.ToolbarLocation = NameBasedGrid.NameBasedGrid.GetRow(NavigationToolbarTray) == "TopToolbarRow" ? Dock.Top : Dock.Bottom;
// Save settings
Settings.Default.Save(); Settings.Default.Save();
} }

View File

@@ -94,6 +94,13 @@
<ComboBoxItem Content="{x:Static properties:Resources.openAllMultipleToolbarButton}" <ComboBoxItem Content="{x:Static properties:Resources.openAllMultipleToolbarButton}"
Tag="{x:Static feedCenter:MultipleOpenAction.IndividualPages}" /> Tag="{x:Static feedCenter:MultipleOpenAction.IndividualPages}" />
</ComboBox> </ComboBox>
<ComboBox Name="UserAgentComboBox"
mah:TextBoxHelper.UseFloatingWatermark="True"
mah:TextBoxHelper.Watermark="{x:Static properties:Resources.userAgentLabel}"
DisplayMemberPath="Caption"
ItemsSource="{Binding Source={x:Static options:UserAgentItem.UserAgents}}"
SelectedValuePath="UserAgent"
SelectedValue="{Binding Path=UserAgent, UpdateSourceTrigger=Explicit, ValidatesOnExceptions=true}" />
</StackPanel> </StackPanel>
</TabItem> </TabItem>
<TabItem Header="{x:Static properties:Resources.authenticationTab}"> <TabItem Header="{x:Static properties:Resources.authenticationTab}">

View File

@@ -12,11 +12,9 @@
d:DesignWidth="300"> d:DesignWidth="300">
<StackPanel options:Spacing.Vertical="10"> <StackPanel options:Spacing.Vertical="10">
<CheckBox Content="{x:Static properties:Resources.startWithWindowsCheckBox}" <CheckBox Content="{x:Static properties:Resources.startWithWindowsCheckBox}"
Name="StartWithWindowsCheckBox"
IsChecked="{Binding Source={x:Static properties:Settings.Default}, Path=StartWithWindows}" IsChecked="{Binding Source={x:Static properties:Settings.Default}, Path=StartWithWindows}"
Click="OnSaveSettings" /> Click="OnSaveSettings" />
<ComboBox Name="BrowserComboBox" <ComboBox mah:TextBoxHelper.UseFloatingWatermark="True"
mah:TextBoxHelper.UseFloatingWatermark="True"
mah:TextBoxHelper.Watermark="{x:Static properties:Resources.defaultBrowserLabel}" mah:TextBoxHelper.Watermark="{x:Static properties:Resources.defaultBrowserLabel}"
d:DataContext="{d:DesignInstance Type=installedBrowsers:InstalledBrowser}" d:DataContext="{d:DesignInstance Type=installedBrowsers:InstalledBrowser}"
DisplayMemberPath="Name" DisplayMemberPath="Name"
@@ -24,12 +22,11 @@
SelectedValuePath="Key" SelectedValuePath="Key"
SelectedValue="{Binding Source={x:Static properties:Settings.Default}, Path=Browser}" SelectedValue="{Binding Source={x:Static properties:Settings.Default}, Path=Browser}"
SelectionChanged="OnSaveSettings" /> SelectionChanged="OnSaveSettings" />
<ComboBox Name="UserAgentComboBox" <ComboBox mah:TextBoxHelper.UseFloatingWatermark="True"
mah:TextBoxHelper.UseFloatingWatermark="True"
mah:TextBoxHelper.Watermark="{x:Static properties:Resources.defaultUserAgentLabel}" mah:TextBoxHelper.Watermark="{x:Static properties:Resources.defaultUserAgentLabel}"
d:DataContext="{d:DesignInstance Type=options:UserAgentItem}" d:DataContext="{d:DesignInstance Type=options:UserAgentItem}"
DisplayMemberPath="Caption" DisplayMemberPath="Caption"
ItemsSource="{Binding Source={x:Static options:UserAgentItem.UserAgents}}" ItemsSource="{Binding Source={x:Static options:UserAgentItem.DefaultUserAgents}}"
SelectedValuePath="UserAgent" SelectedValuePath="UserAgent"
SelectedValue="{Binding Source={x:Static properties:Settings.Default}, Path=DefaultUserAgent}" SelectedValue="{Binding Source={x:Static properties:Settings.Default}, Path=DefaultUserAgent}"
SelectionChanged="OnSaveSettings" /> SelectionChanged="OnSaveSettings" />

View File

@@ -13,6 +13,10 @@
Name="CheckVersionOnStartupCheckBox" Name="CheckVersionOnStartupCheckBox"
IsChecked="{Binding Source={x:Static properties:Settings.Default}, Path=CheckVersionAtStartup}" IsChecked="{Binding Source={x:Static properties:Settings.Default}, Path=CheckVersionAtStartup}"
Click="OnSaveSettings" /> Click="OnSaveSettings" />
<CheckBox Content="{x:Static properties:Resources.includePrereleaseCheckBox}"
Name="IncludePrereleaseCheckBox"
IsChecked="{Binding Source={x:Static properties:Settings.Default}, Path=IncludePrerelease}"
Click="OnSaveSettings" />
<Button Content="{x:Static properties:Resources.checkVersionNowButton}" <Button Content="{x:Static properties:Resources.checkVersionNowButton}"
HorizontalAlignment="Left" HorizontalAlignment="Left"
Click="HandleCheckVersionNowButtonClick" /> Click="HandleCheckVersionNowButtonClick" />

View File

@@ -15,7 +15,7 @@ public partial class UpdateOptionsPanel
private void HandleCheckVersionNowButtonClick(object sender, RoutedEventArgs e) private void HandleCheckVersionNowButtonClick(object sender, RoutedEventArgs e)
{ {
UpdateCheck.DisplayUpdateInformation(true); UpdateCheck.DisplayUpdateInformation(true, Settings.Default.IncludePrerelease);
} }
private void OnSaveSettings(object sender, RoutedEventArgs e) private void OnSaveSettings(object sender, RoutedEventArgs e)

View File

@@ -1,17 +1,18 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using FeedCenter.Properties;
namespace FeedCenter.Options; namespace FeedCenter.Options;
public class UserAgentItem public class UserAgentItem
{ {
public string Caption { get; set; } public string Caption { get; set; }
public string UserAgent { get; set; }
public static List<UserAgentItem> UserAgents => new() public static List<UserAgentItem> DefaultUserAgents => new()
{ {
new UserAgentItem new UserAgentItem
{ {
Caption = Properties.Resources.DefaultUserAgentCaption, Caption = Properties.Resources.ApplicationUserAgentCaption,
UserAgent = string.Empty UserAgent = string.Empty
}, },
new UserAgentItem new UserAgentItem
@@ -30,4 +31,29 @@ public class UserAgentItem
UserAgent = "curl/7.47.0" UserAgent = "curl/7.47.0"
} }
}; };
public string UserAgent { get; set; }
public static List<UserAgentItem> UserAgents
{
get
{
var defaultUserAgents = DefaultUserAgents;
var applicationDefaultUserAgent = defaultUserAgents.First(dua => dua.UserAgent == Settings.Default.DefaultUserAgent);
var userAgents = new List<UserAgentItem>
{
new()
{
Caption = string.Format(Resources.DefaultUserAgentCaption, applicationDefaultUserAgent.Caption),
UserAgent = null
}
};
userAgents.AddRange(defaultUserAgents);
return userAgents;
}
}
} }

View File

@@ -133,6 +133,15 @@ namespace FeedCenter.Properties {
} }
} }
/// <summary>
/// Looks up a localized string similar to Feed Center.
/// </summary>
public static string ApplicationUserAgentCaption {
get {
return ResourceManager.GetString("ApplicationUserAgentCaption", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Password. /// Looks up a localized string similar to Password.
/// </summary> /// </summary>
@@ -517,7 +526,7 @@ namespace FeedCenter.Properties {
} }
/// <summary> /// <summary>
/// Looks up a localized string similar to Feed Center. /// Looks up a localized string similar to Default ({0}).
/// </summary> /// </summary>
public static string DefaultUserAgentCaption { public static string DefaultUserAgentCaption {
get { get {
@@ -831,6 +840,15 @@ namespace FeedCenter.Properties {
} }
} }
/// <summary>
/// Looks up a localized string similar to Temporarily unavailable.
/// </summary>
public static string FeedReadResult_TemporarilyUnavailable {
get {
return ResourceManager.GetString("FeedReadResult_TemporarilyUnavailable", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Timeout. /// Looks up a localized string similar to Timeout.
/// </summary> /// </summary>
@@ -840,6 +858,15 @@ namespace FeedCenter.Properties {
} }
} }
/// <summary>
/// Looks up a localized string similar to Too many requests.
/// </summary>
public static string FeedReadResult_TooManyRequests {
get {
return ResourceManager.GetString("FeedReadResult_TooManyRequests", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Not authorized. /// Looks up a localized string similar to Not authorized.
/// </summary> /// </summary>
@@ -930,6 +957,15 @@ namespace FeedCenter.Properties {
} }
} }
/// <summary>
/// Looks up a localized string similar to Include _prerelease.
/// </summary>
public static string includePrereleaseCheckBox {
get {
return ResourceManager.GetString("includePrereleaseCheckBox", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Last Updated. /// Looks up a localized string similar to Last Updated.
/// </summary> /// </summary>
@@ -1461,6 +1497,15 @@ namespace FeedCenter.Properties {
} }
} }
/// <summary>
/// Looks up a localized string similar to User agent.
/// </summary>
public static string userAgentLabel {
get {
return ResourceManager.GetString("userAgentLabel", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Version {0}. /// Looks up a localized string similar to Version {0}.
/// </summary> /// </summary>

View File

@@ -524,6 +524,9 @@
<value>Category: {0}</value> <value>Category: {0}</value>
</data> </data>
<data name="DefaultUserAgentCaption" xml:space="preserve"> <data name="DefaultUserAgentCaption" xml:space="preserve">
<value>Default ({0})</value>
</data>
<data name="ApplicationUserAgentCaption" xml:space="preserve">
<value>Feed Center</value> <value>Feed Center</value>
</data> </data>
<data name="defaultUserAgentLabel" xml:space="preserve"> <data name="defaultUserAgentLabel" xml:space="preserve">
@@ -549,4 +552,16 @@ All feeds currently in category "{0}" will be moved to the default category.</va
<data name="ConfirmDeleteFeeds" xml:space="preserve"> <data name="ConfirmDeleteFeeds" xml:space="preserve">
<value>Are you sure you want to delete the selected feeds?</value> <value>Are you sure you want to delete the selected feeds?</value>
</data> </data>
<data name="userAgentLabel" xml:space="preserve">
<value>User agent</value>
</data>
<data name="FeedReadResult_TemporarilyUnavailable" xml:space="preserve">
<value>Temporarily unavailable</value>
</data>
<data name="FeedReadResult_TooManyRequests" xml:space="preserve">
<value>Too many requests</value>
</data>
<data name="includePrereleaseCheckBox" xml:space="preserve">
<value>Include _prerelease</value>
</data>
</root> </root>

View File

@@ -12,7 +12,7 @@ namespace FeedCenter.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.5.0.0")] [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.14.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
@@ -302,5 +302,17 @@ namespace FeedCenter.Properties {
return ((string)(this["DatabaseFile"])); return ((string)(this["DatabaseFile"]));
} }
} }
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("False")]
public bool IncludePrerelease {
get {
return ((bool)(this["IncludePrerelease"]));
}
set {
this["IncludePrerelease"] = value;
}
}
} }
} }

View File

@@ -74,5 +74,8 @@
<Setting Name="DatabaseFile" Type="System.String" Scope="Application"> <Setting Name="DatabaseFile" Type="System.String" Scope="Application">
<Value Profile="(Default)">FeedCenter.realm</Value> <Value Profile="(Default)">FeedCenter.realm</Value>
</Setting> </Setting>
<Setting Name="IncludePrerelease" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
</Settings> </Settings>
</SettingsFile> </SettingsFile>

View File

@@ -36,6 +36,9 @@ public static class SettingsStore
// Try to get the setting from the database that matches the name and version // Try to get the setting from the database that matches the name and version
var setting = entities.Settings.FirstOrDefault(s => s.Name == name); var setting = entities.Settings.FirstOrDefault(s => s.Name == name);
if (setting?.Value == value)
return;
entities.SaveChanges(() => entities.SaveChanges(() =>
{ {
// If there was no setting we need to create it // If there was no setting we need to create it

View File

@@ -49,6 +49,9 @@
<setting name="DefaultUserAgent" serializeAs="String"> <setting name="DefaultUserAgent" serializeAs="String">
<value /> <value />
</setting> </setting>
<setting name="IncludePrerelease" serializeAs="String">
<value>False</value>
</setting>
</FeedCenter.Properties.Settings> </FeedCenter.Properties.Settings>
</userSettings> </userSettings>
<applicationSettings> <applicationSettings>

View File

@@ -37,6 +37,10 @@
<HintPath>$(WixExtDir)\WixNetFxExtension.dll</HintPath> <HintPath>$(WixExtDir)\WixNetFxExtension.dll</HintPath>
<Name>WixNetFxExtension</Name> <Name>WixNetFxExtension</Name>
</WixExtension> </WixExtension>
<WixExtension Include="WixUtilExtension">
<HintPath>$(WixExtDir)\WixUtilExtension.dll</HintPath>
<Name>WixUtilExtension</Name>
</WixExtension>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\Application\FeedCenter.csproj"> <ProjectReference Include="..\Application\FeedCenter.csproj">
@@ -66,12 +70,4 @@
<PropertyGroup> <PropertyGroup>
<PostBuildEvent /> <PostBuildEvent />
</PropertyGroup> </PropertyGroup>
<!--
To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Wix.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project> </Project>

View File

@@ -1,7 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
xmlns:bal="http://schemas.microsoft.com/wix/BalExtension"> xmlns:bal="http://schemas.microsoft.com/wix/BalExtension"
xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
<?define ProductName="$(fileVersion.ProductName($(var.FeedCenter.TargetPath)))" ?> <?define ProductName="$(fileVersion.ProductName($(var.FeedCenter.TargetPath)))" ?>
<?define CompanyName="$(fileVersion.CompanyName($(var.FeedCenter.TargetPath)))" ?> <?define CompanyName="$(fileVersion.CompanyName($(var.FeedCenter.TargetPath)))" ?>
@@ -13,6 +14,18 @@
UpgradeCode="5e5c13a5-635e-4310-a653-0f9760f46935" UpgradeCode="5e5c13a5-635e-4310-a653-0f9760f46935"
Compressed="no"> Compressed="no">
<util:DirectorySearch Id="DotnetDesktopRuntimeSearch_x86"
Path="[ProgramFilesFolder]dotnet\shared\Microsoft.WindowsDesktop.App\7.0.5"
Result="exists"
Variable="DotnetDesktopRuntimeExists_x86"
Condition="NOT VersionNT64" />
<util:DirectorySearch Id="DotnetDesktopRuntimeSearch_x64"
Path="[ProgramFiles64Folder]dotnet\shared\Microsoft.WindowsDesktop.App\7.0.5"
Result="exists"
Variable="DotnetDesktopRuntimeExists_x64"
Condition="VersionNT64" />
<BootstrapperApplicationRef Id="WixExtendedBootstrapperApplication.HyperlinkLicense"> <BootstrapperApplicationRef Id="WixExtendedBootstrapperApplication.HyperlinkLicense">
<bal:WixExtendedBootstrapperApplication LicenseUrl="" <bal:WixExtendedBootstrapperApplication LicenseUrl=""
SuppressOptionsUI="yes" SuppressOptionsUI="yes"
@@ -28,9 +41,10 @@
DisplayName=".NET 7.0 Desktop Runtime (x64)" DisplayName=".NET 7.0 Desktop Runtime (x64)"
InstallCommand="/install /quiet" InstallCommand="/install /quiet"
Permanent="yes" Permanent="yes"
Compressed="no" Compressed="no"
DownloadUrl="https://download.visualstudio.microsoft.com/download/pr/dffb1939-cef1-4db3-a579-5475a3061cdd/578b208733c914c7b7357f6baa4ecfd6/windowsdesktop-runtime-7.0.5-win-x64.exe" DownloadUrl="https://download.visualstudio.microsoft.com/download/pr/dffb1939-cef1-4db3-a579-5475a3061cdd/578b208733c914c7b7357f6baa4ecfd6/windowsdesktop-runtime-7.0.5-win-x64.exe"
Name="windowsdesktop-runtime-7.0.5-win-x64.exe" Name="windowsdesktop-runtime-7.0.5-win-x64.exe"
DetectCondition="DotnetDesktopRuntimeExists_x64 = 1"
InstallCondition='VersionNT64'> InstallCondition='VersionNT64'>
<RemotePayload ProductName="Microsoft Windows Desktop Runtime - 7.0.5 (x64)" <RemotePayload ProductName="Microsoft Windows Desktop Runtime - 7.0.5 (x64)"
Description="Microsoft Windows Desktop Runtime - 7.0.5 (x64)" Description="Microsoft Windows Desktop Runtime - 7.0.5 (x64)"
@@ -42,9 +56,10 @@
DisplayName=".NET 7.0 Desktop Runtime (x86)" DisplayName=".NET 7.0 Desktop Runtime (x86)"
InstallCommand="/install /quiet" InstallCommand="/install /quiet"
Permanent="yes" Permanent="yes"
Compressed="no" Compressed="no"
DownloadUrl="https://download.visualstudio.microsoft.com/download/pr/eb64dcd1-d277-4798-ada1-600805c9e2dc/fc73c843d66f3996e7ef22468f4902e6/windowsdesktop-runtime-7.0.5-win-x86.exe" DownloadUrl="https://download.visualstudio.microsoft.com/download/pr/eb64dcd1-d277-4798-ada1-600805c9e2dc/fc73c843d66f3996e7ef22468f4902e6/windowsdesktop-runtime-7.0.5-win-x86.exe"
Name="windowsdesktop-runtime-7.0.5-win-x86.exe" Name="windowsdesktop-runtime-7.0.5-win-x86.exe"
DetectCondition="DotnetDesktopRuntimeExists_x86 = 1"
InstallCondition='NOT VersionNT64'> InstallCondition='NOT VersionNT64'>
<RemotePayload ProductName="Microsoft Windows Desktop Runtime - 7.0.5 (x86)" <RemotePayload ProductName="Microsoft Windows Desktop Runtime - 7.0.5 (x86)"
Description="Microsoft Windows Desktop Runtime - 7.0.5 (x86)" Description="Microsoft Windows Desktop Runtime - 7.0.5 (x86)"

View File

@@ -18,32 +18,32 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution", "Solution", "{14
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug - With Setup|Any CPU = Debug - With Setup|Any CPU Debug (No Installer)|Any CPU = Debug (No Installer)|Any CPU
Debug - With Setup|Mixed Platforms = Debug - With Setup|Mixed Platforms Debug (No Installer)|Mixed Platforms = Debug (No Installer)|Mixed Platforms
Debug - With Setup|x64 = Debug - With Setup|x64 Debug (No Installer)|x64 = Debug (No Installer)|x64
Debug - With Setup|x86 = Debug - With Setup|x86 Debug (No Installer)|x86 = Debug (No Installer)|x86
Debug|Any CPU = Debug|Any CPU Debug|Any CPU = Debug|Any CPU
Debug|Mixed Platforms = Debug|Mixed Platforms Debug|Mixed Platforms = Debug|Mixed Platforms
Debug|x64 = Debug|x64 Debug|x64 = Debug|x64
Debug|x86 = Debug|x86 Debug|x86 = Debug|x86
Release - With Setup|Any CPU = Release - With Setup|Any CPU Release (No Installer)|Any CPU = Release (No Installer)|Any CPU
Release - With Setup|Mixed Platforms = Release - With Setup|Mixed Platforms Release (No Installer)|Mixed Platforms = Release (No Installer)|Mixed Platforms
Release - With Setup|x64 = Release - With Setup|x64 Release (No Installer)|x64 = Release (No Installer)|x64
Release - With Setup|x86 = Release - With Setup|x86 Release (No Installer)|x86 = Release (No Installer)|x86
Release|Any CPU = Release|Any CPU Release|Any CPU = Release|Any CPU
Release|Mixed Platforms = Release|Mixed Platforms Release|Mixed Platforms = Release|Mixed Platforms
Release|x64 = Release|x64 Release|x64 = Release|x64
Release|x86 = Release|x86 Release|x86 = Release|x86
EndGlobalSection EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution GlobalSection(ProjectConfigurationPlatforms) = postSolution
{BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Debug - With Setup|Any CPU.ActiveCfg = Debug|Any CPU {BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Debug (No Installer)|Any CPU.ActiveCfg = Debug|Any CPU
{BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Debug - With Setup|Any CPU.Build.0 = Debug|Any CPU {BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Debug (No Installer)|Any CPU.Build.0 = Debug|Any CPU
{BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Debug - With Setup|Mixed Platforms.ActiveCfg = Debug|Any CPU {BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Debug (No Installer)|Mixed Platforms.ActiveCfg = Debug|Any CPU
{BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Debug - With Setup|Mixed Platforms.Build.0 = Debug|Any CPU {BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Debug (No Installer)|Mixed Platforms.Build.0 = Debug|Any CPU
{BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Debug - With Setup|x64.ActiveCfg = Debug|x64 {BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Debug (No Installer)|x64.ActiveCfg = Debug|x64
{BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Debug - With Setup|x64.Build.0 = Debug|x64 {BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Debug (No Installer)|x64.Build.0 = Debug|x64
{BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Debug - With Setup|x86.ActiveCfg = Debug|x86 {BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Debug (No Installer)|x86.ActiveCfg = Debug|x86
{BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Debug - With Setup|x86.Build.0 = Debug|x86 {BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Debug (No Installer)|x86.Build.0 = Debug|x86
{BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Debug|Any CPU.Build.0 = Debug|Any CPU {BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU {BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
@@ -52,69 +52,69 @@ Global
{BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Debug|x64.Build.0 = Debug|x64 {BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Debug|x64.Build.0 = Debug|x64
{BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Debug|x86.ActiveCfg = Debug|x86 {BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Debug|x86.ActiveCfg = Debug|x86
{BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Debug|x86.Build.0 = Debug|x86 {BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Debug|x86.Build.0 = Debug|x86
{BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Release - With Setup|Any CPU.ActiveCfg = Release|Any CPU {BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Release (No Installer)|Any CPU.ActiveCfg = Release|Any CPU
{BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Release - With Setup|Any CPU.Build.0 = Release|Any CPU {BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Release (No Installer)|Any CPU.Build.0 = Release|Any CPU
{BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Release - With Setup|Mixed Platforms.ActiveCfg = Release|Any CPU {BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Release (No Installer)|Mixed Platforms.ActiveCfg = Release|Any CPU
{BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Release - With Setup|Mixed Platforms.Build.0 = Release|Any CPU {BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Release (No Installer)|Mixed Platforms.Build.0 = Release|Any CPU
{BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Release - With Setup|x64.ActiveCfg = Release|x86 {BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Release (No Installer)|x64.ActiveCfg = Release|x86
{BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Release - With Setup|x86.ActiveCfg = Release|Any CPU {BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Release (No Installer)|x86.ActiveCfg = Release|x86
{BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Release - With Setup|x86.Build.0 = Release|Any CPU {BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Release (No Installer)|x86.Build.0 = Release|x86
{BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Release|Any CPU.ActiveCfg = Release|Any CPU {BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Release|Any CPU.Build.0 = Release|Any CPU {BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Release|Any CPU.Build.0 = Release|Any CPU
{BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU {BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Release|Mixed Platforms.Build.0 = Release|Any CPU {BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Release|x64.ActiveCfg = Release|x86 {BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Release|x64.ActiveCfg = Release|x86
{BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Release|x86.ActiveCfg = Release|x86 {BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Release|x86.ActiveCfg = Release|Any CPU
{BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Release|x86.Build.0 = Release|x86 {BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Release|x86.Build.0 = Release|Any CPU
{DFB3FE30-18EA-4216-8D92-11DF9C8D50F1}.Debug - With Setup|Any CPU.ActiveCfg = Debug|x86 {DFB3FE30-18EA-4216-8D92-11DF9C8D50F1}.Debug (No Installer)|Any CPU.ActiveCfg = Debug|x86
{DFB3FE30-18EA-4216-8D92-11DF9C8D50F1}.Debug - With Setup|Any CPU.Build.0 = Debug|x86 {DFB3FE30-18EA-4216-8D92-11DF9C8D50F1}.Debug (No Installer)|Mixed Platforms.ActiveCfg = Debug|x86
{DFB3FE30-18EA-4216-8D92-11DF9C8D50F1}.Debug - With Setup|Mixed Platforms.ActiveCfg = Debug|x86 {DFB3FE30-18EA-4216-8D92-11DF9C8D50F1}.Debug (No Installer)|x64.ActiveCfg = Debug|x86
{DFB3FE30-18EA-4216-8D92-11DF9C8D50F1}.Debug - With Setup|Mixed Platforms.Build.0 = Debug|x86 {DFB3FE30-18EA-4216-8D92-11DF9C8D50F1}.Debug (No Installer)|x64.Build.0 = Debug|x86
{DFB3FE30-18EA-4216-8D92-11DF9C8D50F1}.Debug - With Setup|x64.ActiveCfg = Debug|x86 {DFB3FE30-18EA-4216-8D92-11DF9C8D50F1}.Debug (No Installer)|x86.ActiveCfg = Debug|x86
{DFB3FE30-18EA-4216-8D92-11DF9C8D50F1}.Debug - With Setup|x64.Build.0 = Debug|x86 {DFB3FE30-18EA-4216-8D92-11DF9C8D50F1}.Debug (No Installer)|x86.Build.0 = Debug|x86
{DFB3FE30-18EA-4216-8D92-11DF9C8D50F1}.Debug - With Setup|x86.ActiveCfg = Debug|x86
{DFB3FE30-18EA-4216-8D92-11DF9C8D50F1}.Debug - With Setup|x86.Build.0 = Debug|x86
{DFB3FE30-18EA-4216-8D92-11DF9C8D50F1}.Debug|Any CPU.ActiveCfg = Debug|x86 {DFB3FE30-18EA-4216-8D92-11DF9C8D50F1}.Debug|Any CPU.ActiveCfg = Debug|x86
{DFB3FE30-18EA-4216-8D92-11DF9C8D50F1}.Debug|Any CPU.Build.0 = Debug|x86
{DFB3FE30-18EA-4216-8D92-11DF9C8D50F1}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 {DFB3FE30-18EA-4216-8D92-11DF9C8D50F1}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
{DFB3FE30-18EA-4216-8D92-11DF9C8D50F1}.Debug|Mixed Platforms.Build.0 = Debug|x86
{DFB3FE30-18EA-4216-8D92-11DF9C8D50F1}.Debug|x64.ActiveCfg = Debug|x86 {DFB3FE30-18EA-4216-8D92-11DF9C8D50F1}.Debug|x64.ActiveCfg = Debug|x86
{DFB3FE30-18EA-4216-8D92-11DF9C8D50F1}.Debug|x64.Build.0 = Debug|x86 {DFB3FE30-18EA-4216-8D92-11DF9C8D50F1}.Debug|x64.Build.0 = Debug|x86
{DFB3FE30-18EA-4216-8D92-11DF9C8D50F1}.Debug|x86.ActiveCfg = Debug|x86 {DFB3FE30-18EA-4216-8D92-11DF9C8D50F1}.Debug|x86.ActiveCfg = Debug|x86
{DFB3FE30-18EA-4216-8D92-11DF9C8D50F1}.Debug|x86.Build.0 = Debug|x86 {DFB3FE30-18EA-4216-8D92-11DF9C8D50F1}.Debug|x86.Build.0 = Debug|x86
{DFB3FE30-18EA-4216-8D92-11DF9C8D50F1}.Release - With Setup|Any CPU.ActiveCfg = Release|x86 {DFB3FE30-18EA-4216-8D92-11DF9C8D50F1}.Release (No Installer)|Any CPU.ActiveCfg = Release|x86
{DFB3FE30-18EA-4216-8D92-11DF9C8D50F1}.Release - With Setup|Any CPU.Build.0 = Release|x86 {DFB3FE30-18EA-4216-8D92-11DF9C8D50F1}.Release (No Installer)|Mixed Platforms.ActiveCfg = Release|x86
{DFB3FE30-18EA-4216-8D92-11DF9C8D50F1}.Release - With Setup|Mixed Platforms.ActiveCfg = Release|x86 {DFB3FE30-18EA-4216-8D92-11DF9C8D50F1}.Release (No Installer)|x64.ActiveCfg = Release|x86
{DFB3FE30-18EA-4216-8D92-11DF9C8D50F1}.Release - With Setup|Mixed Platforms.Build.0 = Release|x86 {DFB3FE30-18EA-4216-8D92-11DF9C8D50F1}.Release (No Installer)|x86.ActiveCfg = Release|x86
{DFB3FE30-18EA-4216-8D92-11DF9C8D50F1}.Release - With Setup|x64.ActiveCfg = Release|x86 {DFB3FE30-18EA-4216-8D92-11DF9C8D50F1}.Release (No Installer)|x86.Build.0 = Release|x86
{DFB3FE30-18EA-4216-8D92-11DF9C8D50F1}.Release - With Setup|x86.ActiveCfg = Release|x86
{DFB3FE30-18EA-4216-8D92-11DF9C8D50F1}.Release - With Setup|x86.Build.0 = Release|x86
{DFB3FE30-18EA-4216-8D92-11DF9C8D50F1}.Release|Any CPU.ActiveCfg = Release|x86 {DFB3FE30-18EA-4216-8D92-11DF9C8D50F1}.Release|Any CPU.ActiveCfg = Release|x86
{DFB3FE30-18EA-4216-8D92-11DF9C8D50F1}.Release|Any CPU.Build.0 = Release|x86
{DFB3FE30-18EA-4216-8D92-11DF9C8D50F1}.Release|Mixed Platforms.ActiveCfg = Release|x86 {DFB3FE30-18EA-4216-8D92-11DF9C8D50F1}.Release|Mixed Platforms.ActiveCfg = Release|x86
{DFB3FE30-18EA-4216-8D92-11DF9C8D50F1}.Release|Mixed Platforms.Build.0 = Release|x86
{DFB3FE30-18EA-4216-8D92-11DF9C8D50F1}.Release|x64.ActiveCfg = Release|x86 {DFB3FE30-18EA-4216-8D92-11DF9C8D50F1}.Release|x64.ActiveCfg = Release|x86
{DFB3FE30-18EA-4216-8D92-11DF9C8D50F1}.Release|x86.ActiveCfg = Release|x86 {DFB3FE30-18EA-4216-8D92-11DF9C8D50F1}.Release|x86.ActiveCfg = Release|x86
{DFB3FE30-18EA-4216-8D92-11DF9C8D50F1}.Release|x86.Build.0 = Release|x86 {DFB3FE30-18EA-4216-8D92-11DF9C8D50F1}.Release|x86.Build.0 = Release|x86
{5E5C13A5-635E-4310-A653-0F9760F46935}.Debug - With Setup|Any CPU.ActiveCfg = Debug|x86 {5E5C13A5-635E-4310-A653-0F9760F46935}.Debug (No Installer)|Any CPU.ActiveCfg = Debug|x86
{5E5C13A5-635E-4310-A653-0F9760F46935}.Debug - With Setup|Any CPU.Build.0 = Debug|x86 {5E5C13A5-635E-4310-A653-0F9760F46935}.Debug (No Installer)|Mixed Platforms.ActiveCfg = Debug|x86
{5E5C13A5-635E-4310-A653-0F9760F46935}.Debug - With Setup|Mixed Platforms.ActiveCfg = Debug|x86 {5E5C13A5-635E-4310-A653-0F9760F46935}.Debug (No Installer)|x64.ActiveCfg = Debug|x86
{5E5C13A5-635E-4310-A653-0F9760F46935}.Debug - With Setup|Mixed Platforms.Build.0 = Debug|x86 {5E5C13A5-635E-4310-A653-0F9760F46935}.Debug (No Installer)|x64.Build.0 = Debug|x86
{5E5C13A5-635E-4310-A653-0F9760F46935}.Debug - With Setup|x64.ActiveCfg = Debug|x86 {5E5C13A5-635E-4310-A653-0F9760F46935}.Debug (No Installer)|x86.ActiveCfg = Debug|x86
{5E5C13A5-635E-4310-A653-0F9760F46935}.Debug - With Setup|x64.Build.0 = Debug|x86 {5E5C13A5-635E-4310-A653-0F9760F46935}.Debug (No Installer)|x86.Build.0 = Debug|x86
{5E5C13A5-635E-4310-A653-0F9760F46935}.Debug - With Setup|x86.ActiveCfg = Debug|x86
{5E5C13A5-635E-4310-A653-0F9760F46935}.Debug - With Setup|x86.Build.0 = Debug|x86
{5E5C13A5-635E-4310-A653-0F9760F46935}.Debug|Any CPU.ActiveCfg = Debug|x86 {5E5C13A5-635E-4310-A653-0F9760F46935}.Debug|Any CPU.ActiveCfg = Debug|x86
{5E5C13A5-635E-4310-A653-0F9760F46935}.Debug|Any CPU.Build.0 = Debug|x86
{5E5C13A5-635E-4310-A653-0F9760F46935}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 {5E5C13A5-635E-4310-A653-0F9760F46935}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
{5E5C13A5-635E-4310-A653-0F9760F46935}.Debug|Mixed Platforms.Build.0 = Debug|x86
{5E5C13A5-635E-4310-A653-0F9760F46935}.Debug|x64.ActiveCfg = Debug|x86 {5E5C13A5-635E-4310-A653-0F9760F46935}.Debug|x64.ActiveCfg = Debug|x86
{5E5C13A5-635E-4310-A653-0F9760F46935}.Debug|x64.Build.0 = Debug|x86 {5E5C13A5-635E-4310-A653-0F9760F46935}.Debug|x64.Build.0 = Debug|x86
{5E5C13A5-635E-4310-A653-0F9760F46935}.Debug|x86.ActiveCfg = Debug|x86 {5E5C13A5-635E-4310-A653-0F9760F46935}.Debug|x86.ActiveCfg = Debug|x86
{5E5C13A5-635E-4310-A653-0F9760F46935}.Debug|x86.Build.0 = Debug|x86 {5E5C13A5-635E-4310-A653-0F9760F46935}.Debug|x86.Build.0 = Debug|x86
{5E5C13A5-635E-4310-A653-0F9760F46935}.Release - With Setup|Any CPU.ActiveCfg = Release|x86 {5E5C13A5-635E-4310-A653-0F9760F46935}.Release (No Installer)|Any CPU.ActiveCfg = Release|x86
{5E5C13A5-635E-4310-A653-0F9760F46935}.Release - With Setup|Any CPU.Build.0 = Release|x86 {5E5C13A5-635E-4310-A653-0F9760F46935}.Release (No Installer)|Mixed Platforms.ActiveCfg = Release|x86
{5E5C13A5-635E-4310-A653-0F9760F46935}.Release - With Setup|Mixed Platforms.ActiveCfg = Release|x86 {5E5C13A5-635E-4310-A653-0F9760F46935}.Release (No Installer)|x64.ActiveCfg = Release|x86
{5E5C13A5-635E-4310-A653-0F9760F46935}.Release - With Setup|Mixed Platforms.Build.0 = Release|x86 {5E5C13A5-635E-4310-A653-0F9760F46935}.Release (No Installer)|x86.ActiveCfg = Release|x86
{5E5C13A5-635E-4310-A653-0F9760F46935}.Release - With Setup|x64.ActiveCfg = Release|x86 {5E5C13A5-635E-4310-A653-0F9760F46935}.Release (No Installer)|x86.Build.0 = Release|x86
{5E5C13A5-635E-4310-A653-0F9760F46935}.Release - With Setup|x86.ActiveCfg = Release|x86
{5E5C13A5-635E-4310-A653-0F9760F46935}.Release - With Setup|x86.Build.0 = Release|x86
{5E5C13A5-635E-4310-A653-0F9760F46935}.Release|Any CPU.ActiveCfg = Release|x86 {5E5C13A5-635E-4310-A653-0F9760F46935}.Release|Any CPU.ActiveCfg = Release|x86
{5E5C13A5-635E-4310-A653-0F9760F46935}.Release|Any CPU.Build.0 = Release|x86
{5E5C13A5-635E-4310-A653-0F9760F46935}.Release|Mixed Platforms.ActiveCfg = Release|x86 {5E5C13A5-635E-4310-A653-0F9760F46935}.Release|Mixed Platforms.ActiveCfg = Release|x86
{5E5C13A5-635E-4310-A653-0F9760F46935}.Release|Mixed Platforms.Build.0 = Release|x86
{5E5C13A5-635E-4310-A653-0F9760F46935}.Release|x64.ActiveCfg = Release|x86 {5E5C13A5-635E-4310-A653-0F9760F46935}.Release|x64.ActiveCfg = Release|x86
{5E5C13A5-635E-4310-A653-0F9760F46935}.Release|x86.ActiveCfg = Release|x86 {5E5C13A5-635E-4310-A653-0F9760F46935}.Release|x86.ActiveCfg = Release|x86
{5E5C13A5-635E-4310-A653-0F9760F46935}.Release|x86.Build.0 = Release|x86 {5E5C13A5-635E-4310-A653-0F9760F46935}.Release|x86.Build.0 = Release|x86

View File

@@ -1,9 +1,12 @@
version: 1.1.0.{build} version: 1.1.0.{build}
branches:
only:
- main
pull_requests: pull_requests:
do_not_increment_build_number: true do_not_increment_build_number: true
skip_tags: true skip_tags: true
image: Visual Studio 2022 image: Visual Studio 2022
configuration: Release - With Setup configuration: Release
platform: x86 platform: x86
assembly_info: assembly_info:
patch: true patch: true
@@ -20,5 +23,4 @@ deploy:
- provider: Environment - provider: Environment
name: GitHub name: GitHub
before_build: before_build:
- cmd: nuget restore - cmd: nuget restore
- cmd: nuget restore Application\FeedCenter.csproj