From 60d6f9354357c4d6c22f6c89604f6dfa5bf7b6a9 Mon Sep 17 00:00:00 2001 From: Chris Kaczor Date: Wed, 30 Apr 2014 17:47:28 -0400 Subject: [PATCH] Initial commit --- .gitattributes | 63 + .gitignore | 156 ++ App.xaml | 12 + App.xaml.cs | 228 +++ BrowserCommon.cs | 65 + Data/Database.cs | 228 +++ Data/Extensions.cs | 155 ++ Entities.cs | 127 ++ FeedCenter.csproj | 471 +++++ FeedCenter.csproj.DotSettings | 2 + FeedCenter.sln | 91 + FeedCenterEntities.datasource | 10 + FeedCenterEntities1.datasource | 10 + FeedCenterEntities2.datasource | 10 + FeedCenter_1_TemporaryKey.pfx | Bin 0 -> 1684 bytes FeedCenter_TemporaryKey.pfx | Bin 0 -> 1684 bytes FeedErrorWindow.xaml | 112 ++ FeedErrorWindow.xaml.cs | 122 ++ FeedParsers/AtomParser.cs | 138 ++ FeedParsers/FeedParserBase.cs | 159 ++ FeedParsers/RdfParser.cs | 115 ++ FeedParsers/RssParser.cs | 122 ++ Feeds/Category.cs | 26 + Feeds/Feed.cs | 342 ++++ Feeds/FeedAction.cs | 25 + Feeds/FeedItem.cs | 74 + Libraries/System.Data.SqlServerCe.Entity.dll | Bin 0 -> 239968 bytes Libraries/System.Data.SqlServerCe.dll | Bin 0 -> 465248 bytes .../Microsoft.VC90.CRT.manifest | 6 + .../amd64/Microsoft.VC90.CRT/msvcr90.dll | Bin 0 -> 624448 bytes Libraries/amd64/sqlceca40.dll | Bin 0 -> 462688 bytes Libraries/amd64/sqlcecompact40.dll | Bin 0 -> 104288 bytes Libraries/amd64/sqlceer40EN.dll | Bin 0 -> 154464 bytes Libraries/amd64/sqlceme40.dll | Bin 0 -> 80736 bytes Libraries/amd64/sqlceqp40.dll | Bin 0 -> 908128 bytes Libraries/amd64/sqlcese40.dll | Bin 0 -> 543072 bytes .../Microsoft.VC90.CRT.manifest | 6 + Libraries/x86/Microsoft.VC90.CRT/msvcr90.dll | Bin 0 -> 653120 bytes Libraries/x86/sqlceca40.dll | Bin 0 -> 349536 bytes Libraries/x86/sqlcecompact40.dll | Bin 0 -> 88416 bytes Libraries/x86/sqlceer40EN.dll | Bin 0 -> 153952 bytes Libraries/x86/sqlceme40.dll | Bin 0 -> 66912 bytes Libraries/x86/sqlceqp40.dll | Bin 0 -> 642400 bytes Libraries/x86/sqlcese40.dll | Bin 0 -> 387424 bytes MainWindow.xaml | 286 +++ MainWindow.xaml.cs | 1378 +++++++++++++++ Model.Designer.cs | 1535 +++++++++++++++++ Model.edmx | 378 ++++ NotificationIcon.cs | 82 + Options/AboutOptionsPanel.xaml | 24 + Options/AboutOptionsPanel.xaml.cs | 39 + Options/BulkFeedWindow.xaml | 127 ++ Options/BulkFeedWindow.xaml.cs | 102 ++ Options/CategoryWindow.xaml | 45 + Options/CategoryWindow.xaml.cs | 69 + Options/DisplayOptionsPanel.xaml | 64 + Options/DisplayOptionsPanel.xaml.cs | 52 + Options/FeedWindow.xaml | 195 +++ Options/FeedWindow.xaml.cs | 88 + Options/FeedsOptionsPanel.xaml | 161 ++ Options/FeedsOptionsPanel.xaml.cs | 433 +++++ Options/GeneralOptionsPanel.xaml | 21 + Options/GeneralOptionsPanel.xaml.cs | 44 + Options/Options.cs | 33 + Options/OptionsPanelBase.cs | 30 + Options/OptionsWindow.xaml | 38 + Options/OptionsWindow.xaml.cs | 127 ++ Options/ReadingOptionsPanel.xaml | 34 + Options/ReadingOptionsPanel.xaml.cs | 66 + Options/UpdateOptionsPanel.xaml | 20 + Options/UpdateOptionsPanel.xaml.cs | 38 + Properties/AssemblyInfo.cs | 53 + .../DataSources/FeedCenterEntities.datasource | 10 + Properties/Resources.Designer.cs | 1403 +++++++++++++++ Properties/Resources.resx | 530 ++++++ Properties/Settings.Designer.cs | 276 +++ Properties/Settings.settings | 69 + Properties/app.manifest | 47 + Resources/Application.ico | Bin 0 -> 4150 bytes Resources/Comments-edit.ico | Bin 0 -> 1150 bytes Resources/Compile.ico | Bin 0 -> 1150 bytes Resources/Left.ico | Bin 0 -> 1150 bytes Resources/News.ico | Bin 0 -> 1150 bytes Resources/Right.ico | Bin 0 -> 1150 bytes Resources/Rss-Download.ico | Bin 0 -> 1150 bytes Resources/Warning.ico | Bin 0 -> 1150 bytes Scripts/CreateDatabase.sqlce | 85 + Scripts/DatabaseUpdate_1.sqlce | 18 + Scripts/DatabaseUpdate_2.sqlce | 30 + Scripts/DatabaseUpdate_3.sqlce | 9 + Scripts/DatabaseUpdate_4.sqlce | 8 + Scripts/DatabaseUpdate_5.sqlce | 18 + Scripts/DatabaseUpdate_6.sqlce | 14 + SettingsStore.cs | 89 + SplashWindow.xaml | 53 + SplashWindow.xaml.cs | 286 +++ SqlSettingsProvider.cs | 116 ++ Style.xaml | 12 + VersionCheck.cs | 133 ++ app.config | 94 + packages.config | 5 + packages/repositories.config | 5 + 102 files changed, 11747 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 App.xaml create mode 100644 App.xaml.cs create mode 100644 BrowserCommon.cs create mode 100644 Data/Database.cs create mode 100644 Data/Extensions.cs create mode 100644 Entities.cs create mode 100644 FeedCenter.csproj create mode 100644 FeedCenter.csproj.DotSettings create mode 100644 FeedCenter.sln create mode 100644 FeedCenterEntities.datasource create mode 100644 FeedCenterEntities1.datasource create mode 100644 FeedCenterEntities2.datasource create mode 100644 FeedCenter_1_TemporaryKey.pfx create mode 100644 FeedCenter_TemporaryKey.pfx create mode 100644 FeedErrorWindow.xaml create mode 100644 FeedErrorWindow.xaml.cs create mode 100644 FeedParsers/AtomParser.cs create mode 100644 FeedParsers/FeedParserBase.cs create mode 100644 FeedParsers/RdfParser.cs create mode 100644 FeedParsers/RssParser.cs create mode 100644 Feeds/Category.cs create mode 100644 Feeds/Feed.cs create mode 100644 Feeds/FeedAction.cs create mode 100644 Feeds/FeedItem.cs create mode 100644 Libraries/System.Data.SqlServerCe.Entity.dll create mode 100644 Libraries/System.Data.SqlServerCe.dll create mode 100644 Libraries/amd64/Microsoft.VC90.CRT/Microsoft.VC90.CRT.manifest create mode 100644 Libraries/amd64/Microsoft.VC90.CRT/msvcr90.dll create mode 100644 Libraries/amd64/sqlceca40.dll create mode 100644 Libraries/amd64/sqlcecompact40.dll create mode 100644 Libraries/amd64/sqlceer40EN.dll create mode 100644 Libraries/amd64/sqlceme40.dll create mode 100644 Libraries/amd64/sqlceqp40.dll create mode 100644 Libraries/amd64/sqlcese40.dll create mode 100644 Libraries/x86/Microsoft.VC90.CRT/Microsoft.VC90.CRT.manifest create mode 100644 Libraries/x86/Microsoft.VC90.CRT/msvcr90.dll create mode 100644 Libraries/x86/sqlceca40.dll create mode 100644 Libraries/x86/sqlcecompact40.dll create mode 100644 Libraries/x86/sqlceer40EN.dll create mode 100644 Libraries/x86/sqlceme40.dll create mode 100644 Libraries/x86/sqlceqp40.dll create mode 100644 Libraries/x86/sqlcese40.dll create mode 100644 MainWindow.xaml create mode 100644 MainWindow.xaml.cs create mode 100644 Model.Designer.cs create mode 100644 Model.edmx create mode 100644 NotificationIcon.cs create mode 100644 Options/AboutOptionsPanel.xaml create mode 100644 Options/AboutOptionsPanel.xaml.cs create mode 100644 Options/BulkFeedWindow.xaml create mode 100644 Options/BulkFeedWindow.xaml.cs create mode 100644 Options/CategoryWindow.xaml create mode 100644 Options/CategoryWindow.xaml.cs create mode 100644 Options/DisplayOptionsPanel.xaml create mode 100644 Options/DisplayOptionsPanel.xaml.cs create mode 100644 Options/FeedWindow.xaml create mode 100644 Options/FeedWindow.xaml.cs create mode 100644 Options/FeedsOptionsPanel.xaml create mode 100644 Options/FeedsOptionsPanel.xaml.cs create mode 100644 Options/GeneralOptionsPanel.xaml create mode 100644 Options/GeneralOptionsPanel.xaml.cs create mode 100644 Options/Options.cs create mode 100644 Options/OptionsPanelBase.cs create mode 100644 Options/OptionsWindow.xaml create mode 100644 Options/OptionsWindow.xaml.cs create mode 100644 Options/ReadingOptionsPanel.xaml create mode 100644 Options/ReadingOptionsPanel.xaml.cs create mode 100644 Options/UpdateOptionsPanel.xaml create mode 100644 Options/UpdateOptionsPanel.xaml.cs create mode 100644 Properties/AssemblyInfo.cs create mode 100644 Properties/DataSources/FeedCenterEntities.datasource create mode 100644 Properties/Resources.Designer.cs create mode 100644 Properties/Resources.resx create mode 100644 Properties/Settings.Designer.cs create mode 100644 Properties/Settings.settings create mode 100644 Properties/app.manifest create mode 100644 Resources/Application.ico create mode 100644 Resources/Comments-edit.ico create mode 100644 Resources/Compile.ico create mode 100644 Resources/Left.ico create mode 100644 Resources/News.ico create mode 100644 Resources/Right.ico create mode 100644 Resources/Rss-Download.ico create mode 100644 Resources/Warning.ico create mode 100644 Scripts/CreateDatabase.sqlce create mode 100644 Scripts/DatabaseUpdate_1.sqlce create mode 100644 Scripts/DatabaseUpdate_2.sqlce create mode 100644 Scripts/DatabaseUpdate_3.sqlce create mode 100644 Scripts/DatabaseUpdate_4.sqlce create mode 100644 Scripts/DatabaseUpdate_5.sqlce create mode 100644 Scripts/DatabaseUpdate_6.sqlce create mode 100644 SettingsStore.cs create mode 100644 SplashWindow.xaml create mode 100644 SplashWindow.xaml.cs create mode 100644 SqlSettingsProvider.cs create mode 100644 Style.xaml create mode 100644 VersionCheck.cs create mode 100644 app.config create mode 100644 packages.config create mode 100644 packages/repositories.config diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..1ff0c42 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,63 @@ +############################################################################### +# Set default behavior to automatically normalize line endings. +############################################################################### +* text=auto + +############################################################################### +# Set default behavior for command prompt diff. +# +# This is need for earlier builds of msysgit that does not have it on by +# default for csharp files. +# Note: This is only used by command line +############################################################################### +#*.cs diff=csharp + +############################################################################### +# Set the merge driver for project and solution files +# +# Merging from the command prompt will add diff markers to the files if there +# are conflicts (Merging from VS is not affected by the settings below, in VS +# the diff markers are never inserted). Diff markers may cause the following +# file extensions to fail to load in VS. An alternative would be to treat +# these files as binary and thus will always conflict and require user +# intervention with every merge. To do so, just uncomment the entries below +############################################################################### +#*.sln merge=binary +#*.csproj merge=binary +#*.vbproj merge=binary +#*.vcxproj merge=binary +#*.vcproj merge=binary +#*.dbproj merge=binary +#*.fsproj merge=binary +#*.lsproj merge=binary +#*.wixproj merge=binary +#*.modelproj merge=binary +#*.sqlproj merge=binary +#*.wwaproj merge=binary + +############################################################################### +# behavior for image files +# +# image files are treated as binary by default. +############################################################################### +#*.jpg binary +#*.png binary +#*.gif binary + +############################################################################### +# diff behavior for common document formats +# +# Convert binary document formats to text before diffing them. This feature +# is only available from the command line. Turn it on by uncommenting the +# entries below. +############################################################################### +#*.doc diff=astextplain +#*.DOC diff=astextplain +#*.docx diff=astextplain +#*.DOCX diff=astextplain +#*.dot diff=astextplain +#*.DOT diff=astextplain +#*.pdf diff=astextplain +#*.PDF diff=astextplain +#*.rtf diff=astextplain +#*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1bc915c --- /dev/null +++ b/.gitignore @@ -0,0 +1,156 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.sln.docstates + +# Build results + +[Dd]ebug/ +[Rr]elease/ +x64/ +build/ +[Bb]in/ +[Oo]bj/ + +# Enable "build/" folder in the NuGet Packages folder since NuGet packages use it for MSBuild targets +!packages/*/build/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +*_i.c +*_p.c +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.log +*.scc + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opensdf +*.sdf +*.cachefile + +# Visual Studio profiler +*.psess +*.vsp +*.vspx + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +*.ncrunch* +.*crunch*.local.xml + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.Publish.xml + +# NuGet Packages Directory +## TODO: If you have NuGet Package Restore enabled, uncomment the next line +#packages/ + +# Windows Azure Build Output +csx +*.build.csdef + +# Windows Store app package directory +AppPackages/ + +# Others +sql/ +*.Cache +ClientBin/ +[Ss]tyle[Cc]op.* +~$* +*~ +*.dbmdl +*.[Pp]ublish.xml +*.pfx +*.publishsettings + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file to a newer +# Visual Studio version. Backup files are not needed, because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +App_Data/*.mdf +App_Data/*.ldf + + +#LightSwitch generated files +GeneratedArtifacts/ +_Pvt_Extensions/ +ModelManifest.xml + +# ========================= +# Windows detritus +# ========================= + +# Windows image file caches +Thumbs.db +ehthumbs.db + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Mac desktop service store files +.DS_Store diff --git a/App.xaml b/App.xaml new file mode 100644 index 0000000..d1ce5b2 --- /dev/null +++ b/App.xaml @@ -0,0 +1,12 @@ + + + + + + + + + + diff --git a/App.xaml.cs b/App.xaml.cs new file mode 100644 index 0000000..862387b --- /dev/null +++ b/App.xaml.cs @@ -0,0 +1,228 @@ +using System; +using System.Diagnostics; +using System.Globalization; +using System.IO; +using System.Reflection; +using System.Threading; +using Microsoft.Win32; + +using Common.Debug; +using Common.Helpers; +using Common.IO; +using Common.Wpf.Extensions; +using Common.Settings; + +using FeedCenter.Properties; + +namespace FeedCenter +{ + public partial class App + { + #region Debug properties + + public static bool UseDebugPath; + + #endregion + + #region Properties + + public bool Restart; + + #endregion + + #region Main function + + [STAThread] + public static void Main() + { + // Create and initialize the app object + App app = new App(); + app.InitializeComponent(); + + // Create an isolation handle to see if we are already running + IDisposable isolationHandle = ApplicationIsolation.GetIsolationHandle(FeedCenter.Properties.Resources.ApplicationName); + + // If there is another copy then pass it the command line and exit + if (isolationHandle == null) + { + InterprocessMessageSender.SendMessage(FeedCenter.Properties.Resources.ApplicationName, Environment.CommandLine); + return; + } + + // Use the handle over the lifetime of the application + using (isolationHandle) + { + // Set the data directory based on debug or not + AppDomain.CurrentDomain.SetData("DataDirectory", + UseDebugPath + ? Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + : UserSettingsPath); + + // Get the generic provider + var genericProvider = (GenericSettingsProvider) Settings.Default.Providers[typeof(GenericSettingsProvider).Name]; + + if (genericProvider == null) + return; + + // Set the callbacks into the provider + genericProvider.OpenDataStore = SettingsStore.OpenDataStore; + genericProvider.CloseDataStore = SettingsStore.CloseDataStore; + genericProvider.GetSettingValue = SettingsStore.GetSettingValue; + genericProvider.SetSettingValue = SettingsStore.SetSettingValue; + genericProvider.DeleteSettingsForVersion = SettingsStore.DeleteSettingsForVersion; + genericProvider.GetVersionList = SettingsStore.GetVersionList; + + // Initialize the tracer with the current process ID + Tracer.Initialize(UserSettingsPath, FeedCenter.Properties.Resources.ApplicationName, Process.GetCurrentProcess().Id.ToString(CultureInfo.InvariantCulture), false); + + Current.DispatcherUnhandledException += HandleCurrentDispatcherUnhandledException; + AppDomain.CurrentDomain.UnhandledException += HandleCurrentDomainUnhandledException; + + // Check if we need to upgrade settings from a previous version + if (Settings.Default.FirstRun) + { + Settings.Default.Upgrade(); + Settings.Default.FirstRun = false; + Settings.Default.Save(); + } + + // Create the main window before the splash otherwise WPF gets messed up + MainWindow mainWindow = new MainWindow(); + + // Show the splash window + SplashWindow splashWindow = new SplashWindow(); + splashWindow.ShowDialog(); + + // If we don't need to restart then fire up the main window + if (!app.Restart) + { + // Update the registry settings + SetStartWithWindows(Settings.Default.StartWithWindows); + SetDefaultFeedReader(Settings.Default.RegisterAsDefaultFeedReader); + + // Initialize the window + mainWindow.Initialize(); + + // Run the app + app.Run(mainWindow); + } + + // If we need to restart + if (app.Restart) + { + // Wait a bit to make sure any previous upgrade has settled + Thread.Sleep(2000); + + // Restart the application + Current.Restart(); + } + + // Terminate the tracer + Tracer.Dispose(); + } + } + + private static void HandleCurrentDomainUnhandledException(object sender, UnhandledExceptionEventArgs e) + { + Tracer.WriteException((Exception) e.ExceptionObject); + Tracer.Flush(); + } + + private static void HandleCurrentDispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e) + { + Tracer.WriteException(e.Exception); + Tracer.Flush(); + } + + #endregion + + #region Helpers + + public static string UserSettingsPath + { + get + { + // If we're running in debug mode then use a local path for the database and logs + if (UseDebugPath) + return Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); + + // Get the path to the local application data directory + string path = Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), + FeedCenter.Properties.Resources.ApplicationName); + + // Make sure it exists - create it if needed + if (!Directory.Exists(path)) + Directory.CreateDirectory(path); + + return path; + } + } + + public static void SetStartWithWindows(bool value) + { + // Get the application name + string applicationName = FeedCenter.Properties.Resources.ApplicationDisplayName; + + // Get application details + string publisherName = applicationName; + string productName = applicationName; + string allProgramsPath = Environment.GetFolderPath(Environment.SpecialFolder.Programs); + string shortcutPath = Path.Combine(allProgramsPath, publisherName); + + // Build the auto start path + shortcutPath = "\"" + Path.Combine(shortcutPath, productName) + ".appref-ms\""; + + // Set auto start + Current.SetStartWithWindows(applicationName, shortcutPath, value); + } + + public static void SetDefaultFeedReader(bool value) + { + // Get the location of the assembly + string assemblyLocation = Assembly.GetExecutingAssembly().Location; + + // Open the registry key (creating if needed) + using (RegistryKey registryKey = Registry.CurrentUser.CreateSubKey("Software\\Classes\\feed", RegistryKeyPermissionCheck.ReadWriteSubTree)) + { + if (registryKey == null) + return; + + // Write the handler settings + registryKey.SetValue(string.Empty, "URL:Feed Handler"); + registryKey.SetValue("URL Protocol", string.Empty); + + // Open the icon subkey (creating if needed) + using (RegistryKey subKey = registryKey.CreateSubKey("DefaultIcon", RegistryKeyPermissionCheck.ReadWriteSubTree)) + { + if (subKey != null) + { + // Write the assembly location + subKey.SetValue(string.Empty, assemblyLocation); + + // Close the subkey + subKey.Close(); + } + } + + // Open the subkey for the command (creating if needed) + using (RegistryKey subKey = registryKey.CreateSubKey("shell\\open\\command", RegistryKeyPermissionCheck.ReadWriteSubTree)) + { + if (subKey != null) + { + // Write the assembly location and parameter + subKey.SetValue(string.Empty, string.Format("\"{0}\" %1", assemblyLocation)); + + // Close the subkey + subKey.Close(); + } + } + + // Close the registry key + registryKey.Close(); + } + } + + #endregion + } +} diff --git a/BrowserCommon.cs b/BrowserCommon.cs new file mode 100644 index 0000000..d7739b8 --- /dev/null +++ b/BrowserCommon.cs @@ -0,0 +1,65 @@ +using System; +using System.Diagnostics; +using Common.Debug; +using Common.Internet; +using FeedCenter.Properties; + +namespace FeedCenter +{ + public static class BrowserCommon + { + public static Browser FindBrowser(string browserKey) + { + Browser browser = null; + + // Get the list of installed browsers + var browsers = Browser.DetectInstalledBrowsers(); + + // Make sure the desired browser exists + if (browsers.ContainsKey(browserKey)) + { + // Get the browser + browser = browsers[browserKey]; + } + + return browser; + } + + public static bool OpenLink(string url) + { + // Get the browser + Browser browser = FindBrowser(Settings.Default.Browser); + + // Start the browser + return OpenLink(browser, url); + } + + public static bool OpenLink(Browser browser, string url) + { + try + { + // Don't bother with empty links + if (String.IsNullOrEmpty(url)) + return true; + + // Add quotes around the URL for safety + url = string.Format("\"{0}\"", url); + + // Start the browser + if (browser == null) + Process.Start(url); + else + Process.Start(browser.Command, url); + + return true; + } + catch (Exception exception) + { + // Just log the exception + Tracer.WriteException(exception); + + return false; + } + } + } +} diff --git a/Data/Database.cs b/Data/Database.cs new file mode 100644 index 0000000..91cec9f --- /dev/null +++ b/Data/Database.cs @@ -0,0 +1,228 @@ +using System; +using System.Data.SqlServerCe; +using System.IO; +using System.Collections.Generic; +using System.Linq; + +using Common.Debug; + +using FeedCenter.Properties; + +namespace FeedCenter.Data +{ + public static class Database + { + #region Static database settings + + public static string DatabasePath; + + #endregion + + #region File version + + private enum SqlServerCeFileVersion + { + Unknown, + Version20, + Version30, + Version35, + Version40, + } + + private static SqlServerCeFileVersion GetFileVersion(string databasePath) + { + // Create a mapping of version numbers to the version enumeration + var versionMapping = new Dictionary + { + { 0x73616261, SqlServerCeFileVersion.Version20 }, + { 0x002dd714, SqlServerCeFileVersion.Version30 }, + { 0x00357b9d, SqlServerCeFileVersion.Version35 }, + { 0x003d0900, SqlServerCeFileVersion.Version40 } + }; + + int signature; + + try + { + // Open the database file + using (FileStream stream = new FileStream(databasePath, FileMode.Open, FileAccess.Read)) + { + // Read the file using the binary reader + BinaryReader reader = new BinaryReader(stream); + + // Seek to the version signature + stream.Seek(16, SeekOrigin.Begin); + + // Read the version signature + signature = reader.ReadInt32(); + + } + } + catch (Exception exception) + { + Tracer.WriteException(exception); + + throw; + } + + // If we know about the version number then return the right enumeration - otherwise unknown + return versionMapping.ContainsKey(signature) ? versionMapping[signature] : SqlServerCeFileVersion.Unknown; + } + + #endregion + + public static bool DatabaseExists + { + get { return File.Exists(DatabasePath); } + } + + public static void CreateDatabase() + { + Tracer.WriteLine("Creating database engine"); + + // Create the database engine + using (SqlCeEngine engine = new SqlCeEngine(string.Format("Data Source={0}", DatabasePath))) + { + Tracer.WriteLine("Creating database"); + + // Create the database itself + engine.CreateDatabase(); + + Tracer.WriteLine("Running database script"); + + // Run the creation script + ExecuteScript(Resources.CreateDatabase); + } + } + + private static int getVersion(SqlCeConnection connection) + { + string versionString = string.Empty; + + try + { + // Check the database version table + using (SqlCeCommand command = new SqlCeCommand("SELECT Value FROM DatabaseVersion", connection)) + versionString = command.ExecuteScalar().ToString(); + } + catch (SqlCeException) + { + // Check the setting table for the version + using (SqlCeCommand command = new SqlCeCommand("SELECT Value FROM Setting WHERE Name = 'DatabaseVersion'", connection)) + versionString = command.ExecuteScalar().ToString(); + } + + if (string.IsNullOrEmpty(versionString)) + versionString = "0"; + + Tracer.WriteLine("Database version: {0}", versionString); + + return int.Parse(versionString); + } + + public static void UpdateDatabase() + { + Tracer.WriteLine("Getting database file version"); + + // Get the database file version + SqlServerCeFileVersion fileVersion = GetFileVersion(DatabasePath); + + Tracer.WriteLine("Database file version: {0}", fileVersion); + + // See if we need to upgrade the database file version + if (fileVersion != SqlServerCeFileVersion.Version40) + { + Tracer.WriteLine("Creating database engine"); + + // Create the database engine + using (SqlCeEngine engine = new SqlCeEngine(string.Format("Data Source={0}", DatabasePath))) + { + Tracer.WriteLine("Upgrading database"); + + // Upgrade the database (if needed) + engine.Upgrade(); + } + } + + Tracer.WriteLine("Getting database version"); + + // Create a database connection + using (SqlCeConnection connection = new SqlCeConnection(string.Format("Data Source={0}", DatabasePath))) + { + // Open the connection + connection.Open(); + + // Get the database version + int databaseVersion = getVersion(connection); + + // Create a dictionary of database upgrade scripts and their version numbers + var scriptList = new Dictionary(); + + // Loop over the properties of the resource object looking for update scripts + foreach (var property in typeof(Resources).GetProperties().Where(property => property.Name.StartsWith("DatabaseUpdate"))) + { + // Get the name of the property + string propertyName = property.Name; + + // Extract the version from the name + int version = int.Parse(propertyName.Substring(propertyName.IndexOf("_", StringComparison.Ordinal) + 1)); + + // Add to the script list + scriptList[version] = propertyName; + } + + // Loop over the scripts ordered by version + foreach (var pair in scriptList.OrderBy(pair => pair.Key)) + { + // If the database version is less than or equal to the script version the script needs to run + if (databaseVersion <= pair.Key) + { + // Get the script text + string scriptText = Resources.ResourceManager.GetString(pair.Value); + + // Run the script + ExecuteScript(scriptText); + } + } + } + } + + public static void MaintainDatabase() + { + Tracer.WriteLine("Creating database engine"); + + // Create the database engine + using (SqlCeEngine engine = new SqlCeEngine(string.Format("Data Source={0}", DatabasePath))) + { + Tracer.WriteLine("Shrinking database"); + + // Compact the database + engine.Shrink(); + } + } + + private static void ExecuteScript(string scriptText) + { + // Create a database connection + using (SqlCeConnection connection = new SqlCeConnection(string.Format("Data Source={0}", DatabasePath))) + { + // Open the connection + connection.Open(); + + // Setup the delimiters + string[] delimiters = new[] { "\r\nGO\r\n" }; + + // Split the script at the delimiters + string[] statements = scriptText.Split(delimiters, StringSplitOptions.RemoveEmptyEntries); + + // Loop over each statement in the script + foreach (string statement in statements) + { + // Execute the statement + using (SqlCeCommand command = new SqlCeCommand(statement, connection)) + command.ExecuteNonQuery(); + } + } + } + } +} diff --git a/Data/Extensions.cs b/Data/Extensions.cs new file mode 100644 index 0000000..450d561 --- /dev/null +++ b/Data/Extensions.cs @@ -0,0 +1,155 @@ +using System; +using System.Data; +using System.Data.SqlServerCe; +using System.Data.SqlTypes; + +namespace FeedCenter.Data +{ + public static class Extensions + { + #region SqlDateTime + + public static SqlDateTime SqlDateTimeZero = new SqlDateTime(0, 0); + + #endregion + + #region DataSet + + public static DataRow GetFirstDataRow(this DataSet dataSet) + { + // If we get no data set then return nothing + if (dataSet == null) + return null; + + // If there were no tables returns then return nothing + if (dataSet.Tables.Count == 0) + return null; + + // Get the first table + DataTable firstTable = dataSet.Tables[0]; + + // If the table has no rows then return nothing + if (firstTable.Rows.Count == 0) + return null; + + // Return the first row + return firstTable.Rows[0]; + } + + #endregion + + #region SqlCeCommand + + public static void SetStatement(this SqlCeCommand command, string statement, params object[] parameters) + { + // Create a new array to hold the updated parameters + object[] formattedParameters = new object[parameters.Length]; + + // Initialize our position + int position = 0; + + // Loop over each parameter + foreach (object parameter in parameters) + { + // If the parameter is a DateTime then we need to reformat + if (parameter == null) + { + // Use a explicit null value + formattedParameters[position++] = "NULL"; + } + else if (parameter is DateTime) + { + // Cast the parameter back to a DateTime + DateTime dateTime = (DateTime) parameter; + + // Convert the DateTime to sortable format + string formatted = dateTime.ToString("s"); + + // Set into the formatted array + formattedParameters[position++] = formatted; + } + else if (parameter is bool) + { + // Convert the boolean to a number + formattedParameters[position++] = Convert.ToInt32(parameter); + } + else if (parameter.GetType().IsEnum) + { + // Convert the enum to a number + formattedParameters[position++] = Convert.ToInt32(parameter); + } + else if (parameter is string) + { + // Escape single quotes + formattedParameters[position++] = (parameter as string).Replace("'", "''"); + } + else + { + // Just put the original value in + formattedParameters[position++] = parameter; + } + } + + // Build the full statement + command.CommandText = string.Format(statement, formattedParameters); + } + + #endregion + + #region SqlCeConnection + + public static void ExecuteNonQuery(this SqlCeConnection connection, string query, params object[] parameters) + { + // Create the command object + SqlCeCommand command = connection.CreateCommand(); + + // Set the statement based on the query and parameters + command.SetStatement(query, parameters); + + //Tracer.WriteLine("Executing SQL statement: {0}", command.CommandText); + + // Execute the command + command.ExecuteNonQuery(); + } + + public static DataSet ExecuteDataSet(this SqlCeConnection connection, string query, params object[] parameters) + { + // Create the command object + SqlCeCommand command = connection.CreateCommand(); + + // Set the statement based on the query and parameters + command.SetStatement(query, parameters); + + // Create a new data adapter + using (SqlCeDataAdapter adapter = new SqlCeDataAdapter(command)) + { + // Create the new data set + using (DataSet dataSet = new DataSet()) + { + //Tracer.WriteLine("Executing SQL query: {0}", command.CommandText); + + // Fill the data set + adapter.Fill(dataSet); + + return dataSet; + } + } + } + + public static object ExecuteScalar(this SqlCeConnection connection, string query, params object[] parameters) + { + // Create the command object + SqlCeCommand command = connection.CreateCommand(); + + // Set the statement based on the query and parameters + command.SetStatement(query, parameters); + + //Tracer.WriteLine("Executing SQL statement: {0}", command.CommandText); + + // Execute the command + return command.ExecuteScalar(); + } + + #endregion + } +} diff --git a/Entities.cs b/Entities.cs new file mode 100644 index 0000000..44960a6 --- /dev/null +++ b/Entities.cs @@ -0,0 +1,127 @@ +using System.Collections.ObjectModel; +using System.ComponentModel; + +namespace FeedCenter +{ + public partial class FeedCenterEntities + { + #region Dispose + + protected override void Dispose(bool disposing) + { + if (disposing) + { + ObjectStateManager.ObjectStateManagerChanged -= HandleObjectStateManagerObjectStateManagerChanged; + _hookedStateManager = false; + } + + base.Dispose(disposing); + } + + #endregion + + private bool _hookedStateManager; + + #region All categories + + private ObservableCollection _allCategories; + + public ObservableCollection AllCategories + { + get + { + if (_allCategories == null) + { + _allCategories = new ObservableCollection(Categories); + + if (!_hookedStateManager) + { + ObjectStateManager.ObjectStateManagerChanged += HandleObjectStateManagerObjectStateManagerChanged; + _hookedStateManager = true; + } + } + + return _allCategories; + } + } + + #endregion + + #region All feeds + + private ObservableCollection _allFeeds; + + public ObservableCollection AllFeeds + { + get + { + if (_allFeeds == null) + { + _allFeeds = new ObservableCollection(Feeds); + + if (!_hookedStateManager) + { + ObjectStateManager.ObjectStateManagerChanged += HandleObjectStateManagerObjectStateManagerChanged; + _hookedStateManager = true; + } + } + + return _allFeeds; + } + } + + #endregion + + #region Object state manager + + void HandleObjectStateManagerObjectStateManagerChanged(object sender, CollectionChangeEventArgs e) + { + if (e.Element is Category) + { + if (_allCategories == null) + return; + + Category category = e.Element as Category; + + switch (e.Action) + { + case CollectionChangeAction.Add: + _allCategories.Add(category); + break; + case CollectionChangeAction.Remove: + _allCategories.Remove(category); + break; + case CollectionChangeAction.Refresh: + _allCategories.Clear(); + foreach (Category loopCategory in Categories) + _allCategories.Add(loopCategory); + break; + } + } + else if (e.Element is Feed) + { + if (_allFeeds == null) + return; + + Feed feed = e.Element as Feed; + + switch (e.Action) + { + case CollectionChangeAction.Add: + _allFeeds.Add(feed); + break; + case CollectionChangeAction.Remove: + _allFeeds.Remove(feed); + break; + case CollectionChangeAction.Refresh: + _allFeeds.Clear(); + foreach (Feed loopfeed in Feeds) + _allFeeds.Add(loopfeed); + break; + } + } + } + + #endregion + } +} diff --git a/FeedCenter.csproj b/FeedCenter.csproj new file mode 100644 index 0000000..b9742e4 --- /dev/null +++ b/FeedCenter.csproj @@ -0,0 +1,471 @@ + + + + Debug + x86 + 8.0.30703 + 2.0 + {BD3D12F2-DE23-4466-83B1-1EB617A877A4} + WinExe + Properties + FeedCenter + FeedCenter + v4.5 + + + 512 + {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + 4 + false + SAK + SAK + SAK + SAK + \\server\d\FeedCenter\ + true + Unc + false + Foreground + 7 + Days + false + false + true + Feed Center + Feed Center + true + Publish.html + false + 208 + 0.1.0.%2a + false + true + true + + + x86 + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + + + + + true + + + FeedCenter_TemporaryKey.pfx + + + Resources\Application.ico + + + LocalIntranet + + + true + + + Properties\app.manifest + + + true + + + BC151B601A9608463CB7A5371944A97EDEE60B1A + + + FeedCenter_1_TemporaryKey.pfx + + + true + bin\Debug\ + DEBUG;TRACE + full + AnyCPU + bin\Debug\FeedCenter.exe.CodeAnalysisLog.xml + true + GlobalSuppressions.cs + prompt + MinimumRecommendedRules.ruleset + ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets + false + ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules + false + false + true + false + + + bin\Release\ + TRACE + true + pdbonly + AnyCPU + bin\Release\FeedCenter.exe.CodeAnalysisLog.xml + true + GlobalSuppressions.cs + prompt + MinimumRecommendedRules.ruleset + ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets + ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules + false + + + + ..\Common.Wpf.MarkupExtensions\bin\Release\Common.Wpf.MarkupExtensions.dll + + + + + + + False + bin\Debug\System.Data.SqlServerCe.dll + + + False + bin\Debug\System.Data.SqlServerCe.Entity.dll + + + + + + + + + + + + + + 4.0 + + + + + + + + MSBuild:Compile + Designer + + + + + + FeedErrorWindow.xaml + + + + True + True + Model.edmx + + + + AboutOptionsPanel.xaml + + + BulkFeedWindow.xaml + + + CategoryWindow.xaml + + + DisplayOptionsPanel.xaml + + + FeedsOptionsPanel.xaml + + + FeedWindow.xaml + + + GeneralOptionsPanel.xaml + + + + + OptionsWindow.xaml + + + ReadingOptionsPanel.xaml + + + UpdateOptionsPanel.xaml + + + + SplashWindow.xaml + + + + Designer + MSBuild:Compile + + + MSBuild:Compile + Designer + + + App.xaml + Code + + + + + + + + + + + MainWindow.xaml + Code + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + MSBuild:Compile + Designer + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + MSBuild:Compile + Designer + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + + + Code + + + True + True + Resources.resx + + + True + Settings.settings + True + + + PublicResXFileCodeGenerator + Resources.Designer.cs + Designer + + + Designer + + + amd64\Microsoft.VC90.CRT\Microsoft.VC90.CRT.manifest + Always + + + x86\Microsoft.VC90.CRT\Microsoft.VC90.CRT.manifest + Always + + + EntityModelCodeGenerator + Model.Designer.cs + + + + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + + + + + + + + + + + + + + + + False + Microsoft .NET Framework 4.5 %28x86 and x64%29 + true + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 3.5 SP1 + false + + + False + Windows Installer 4.5 + true + + + + + {ED1C07A1-54F5-4796-8B06-2A0BB1960D84} + Common.Native + + + {0074C983-550E-4094-9E8C-F566FB669297} + Common.Wpf + + + {17864D82-457D-4A0A-BC10-1D07F2B3A5D6} + Common + + + + + amd64\Microsoft.VC90.CRT\msvcr90.dll + Always + + + amd64\sqlceca40.dll + Always + + + amd64\sqlcecompact40.dll + Always + + + amd64\sqlceer40EN.dll + Always + + + amd64\sqlceme40.dll + Always + + + amd64\sqlceqp40.dll + Always + + + amd64\sqlcese40.dll + Always + + + + + + + + + + Libraries\System.Data.SqlServerCe.dll + Always + + + Libraries\System.Data.SqlServerCe.Entity.dll + Always + + + x86\Microsoft.VC90.CRT\msvcr90.dll + Always + + + x86\sqlceca40.dll + Always + + + x86\sqlcecompact40.dll + Always + + + x86\sqlceer40EN.dll + Always + + + x86\sqlceme40.dll + Always + + + x86\sqlceqp40.dll + Always + + + x86\sqlcese40.dll + Always + + + + + + + + + + \ No newline at end of file diff --git a/FeedCenter.csproj.DotSettings b/FeedCenter.csproj.DotSettings new file mode 100644 index 0000000..2a8adce --- /dev/null +++ b/FeedCenter.csproj.DotSettings @@ -0,0 +1,2 @@ + + True \ No newline at end of file diff --git a/FeedCenter.sln b/FeedCenter.sln new file mode 100644 index 0000000..bab9c72 --- /dev/null +++ b/FeedCenter.sln @@ -0,0 +1,91 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.21005.1 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FeedCenter", "FeedCenter.csproj", "{BD3D12F2-DE23-4466-83B1-1EB617A877A4}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Common", "..\Common\Common.csproj", "{17864D82-457D-4A0A-BC10-1D07F2B3A5D6}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Common.Wpf", "..\Common.Wpf\Common.Wpf.csproj", "{0074C983-550E-4094-9E8C-F566FB669297}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Common.Native", "..\Common.Native\Common.Native.csproj", "{ED1C07A1-54F5-4796-8B06-2A0BB1960D84}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|Mixed Platforms = Debug|Mixed Platforms + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|Mixed Platforms = Release|Mixed Platforms + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {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|Mixed Platforms.ActiveCfg = Debug|x86 + {BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Debug|x64.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}.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|Mixed Platforms.ActiveCfg = Release|x86 + {BD3D12F2-DE23-4466-83B1-1EB617A877A4}.Release|Mixed Platforms.Build.0 = 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.Build.0 = Release|x86 + {17864D82-457D-4A0A-BC10-1D07F2B3A5D6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {17864D82-457D-4A0A-BC10-1D07F2B3A5D6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {17864D82-457D-4A0A-BC10-1D07F2B3A5D6}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {17864D82-457D-4A0A-BC10-1D07F2B3A5D6}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {17864D82-457D-4A0A-BC10-1D07F2B3A5D6}.Debug|x64.ActiveCfg = Debug|x64 + {17864D82-457D-4A0A-BC10-1D07F2B3A5D6}.Debug|x64.Build.0 = Debug|x64 + {17864D82-457D-4A0A-BC10-1D07F2B3A5D6}.Debug|x86.ActiveCfg = Debug|x86 + {17864D82-457D-4A0A-BC10-1D07F2B3A5D6}.Debug|x86.Build.0 = Debug|x86 + {17864D82-457D-4A0A-BC10-1D07F2B3A5D6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {17864D82-457D-4A0A-BC10-1D07F2B3A5D6}.Release|Any CPU.Build.0 = Release|Any CPU + {17864D82-457D-4A0A-BC10-1D07F2B3A5D6}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {17864D82-457D-4A0A-BC10-1D07F2B3A5D6}.Release|Mixed Platforms.Build.0 = Release|x86 + {17864D82-457D-4A0A-BC10-1D07F2B3A5D6}.Release|x64.ActiveCfg = Release|x64 + {17864D82-457D-4A0A-BC10-1D07F2B3A5D6}.Release|x64.Build.0 = Release|x64 + {17864D82-457D-4A0A-BC10-1D07F2B3A5D6}.Release|x86.ActiveCfg = Release|x86 + {17864D82-457D-4A0A-BC10-1D07F2B3A5D6}.Release|x86.Build.0 = Release|x86 + {0074C983-550E-4094-9E8C-F566FB669297}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0074C983-550E-4094-9E8C-F566FB669297}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0074C983-550E-4094-9E8C-F566FB669297}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {0074C983-550E-4094-9E8C-F566FB669297}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {0074C983-550E-4094-9E8C-F566FB669297}.Debug|x64.ActiveCfg = Debug|x64 + {0074C983-550E-4094-9E8C-F566FB669297}.Debug|x64.Build.0 = Debug|x64 + {0074C983-550E-4094-9E8C-F566FB669297}.Debug|x86.ActiveCfg = Debug|x86 + {0074C983-550E-4094-9E8C-F566FB669297}.Debug|x86.Build.0 = Debug|x86 + {0074C983-550E-4094-9E8C-F566FB669297}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0074C983-550E-4094-9E8C-F566FB669297}.Release|Any CPU.Build.0 = Release|Any CPU + {0074C983-550E-4094-9E8C-F566FB669297}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {0074C983-550E-4094-9E8C-F566FB669297}.Release|Mixed Platforms.Build.0 = Release|x86 + {0074C983-550E-4094-9E8C-F566FB669297}.Release|x64.ActiveCfg = Release|x64 + {0074C983-550E-4094-9E8C-F566FB669297}.Release|x64.Build.0 = Release|x64 + {0074C983-550E-4094-9E8C-F566FB669297}.Release|x86.ActiveCfg = Release|x86 + {0074C983-550E-4094-9E8C-F566FB669297}.Release|x86.Build.0 = Release|x86 + {ED1C07A1-54F5-4796-8B06-2A0BB1960D84}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {ED1C07A1-54F5-4796-8B06-2A0BB1960D84}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ED1C07A1-54F5-4796-8B06-2A0BB1960D84}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {ED1C07A1-54F5-4796-8B06-2A0BB1960D84}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {ED1C07A1-54F5-4796-8B06-2A0BB1960D84}.Debug|x64.ActiveCfg = Debug|x64 + {ED1C07A1-54F5-4796-8B06-2A0BB1960D84}.Debug|x64.Build.0 = Debug|x64 + {ED1C07A1-54F5-4796-8B06-2A0BB1960D84}.Debug|x86.ActiveCfg = Debug|x86 + {ED1C07A1-54F5-4796-8B06-2A0BB1960D84}.Debug|x86.Build.0 = Debug|x86 + {ED1C07A1-54F5-4796-8B06-2A0BB1960D84}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ED1C07A1-54F5-4796-8B06-2A0BB1960D84}.Release|Any CPU.Build.0 = Release|Any CPU + {ED1C07A1-54F5-4796-8B06-2A0BB1960D84}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {ED1C07A1-54F5-4796-8B06-2A0BB1960D84}.Release|Mixed Platforms.Build.0 = Release|x86 + {ED1C07A1-54F5-4796-8B06-2A0BB1960D84}.Release|x64.ActiveCfg = Release|x64 + {ED1C07A1-54F5-4796-8B06-2A0BB1960D84}.Release|x64.Build.0 = Release|x64 + {ED1C07A1-54F5-4796-8B06-2A0BB1960D84}.Release|x86.ActiveCfg = Release|x86 + {ED1C07A1-54F5-4796-8B06-2A0BB1960D84}.Release|x86.Build.0 = Release|x86 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/FeedCenterEntities.datasource b/FeedCenterEntities.datasource new file mode 100644 index 0000000..c919ef6 --- /dev/null +++ b/FeedCenterEntities.datasource @@ -0,0 +1,10 @@ + + + + FeedCenter.FeedCenterEntities, Model.Designer.cs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + \ No newline at end of file diff --git a/FeedCenterEntities1.datasource b/FeedCenterEntities1.datasource new file mode 100644 index 0000000..c919ef6 --- /dev/null +++ b/FeedCenterEntities1.datasource @@ -0,0 +1,10 @@ + + + + FeedCenter.FeedCenterEntities, Model.Designer.cs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + \ No newline at end of file diff --git a/FeedCenterEntities2.datasource b/FeedCenterEntities2.datasource new file mode 100644 index 0000000..c919ef6 --- /dev/null +++ b/FeedCenterEntities2.datasource @@ -0,0 +1,10 @@ + + + + FeedCenter.FeedCenterEntities, Model.Designer.cs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + \ No newline at end of file diff --git a/FeedCenter_1_TemporaryKey.pfx b/FeedCenter_1_TemporaryKey.pfx new file mode 100644 index 0000000000000000000000000000000000000000..cf479752390f64804f595c08b5a1785570302c16 GIT binary patch literal 1684 zcmY*Ydpz6c9)5qnM1m46B8RrLWvI*iLL$V@l%Qy|M&fQRZCz$=Ey`ThWT99cm#*qI zS`ntDX^Hp@Gt)!WkWmM<(`dDB%}(6eTGjp9&pADxecsRaeV^xf-{*bbKfVvb#TCI2 z2I1nEI3<%D*PLxt2oGK7;{J~1;%rfwif}RFzieR|uv`oum21$d#O?X7OGO!iuXABB z!i8Iq132aX$>`+-tfJi)tr6V^40d1`{|lB27hMdGYFapL{#sVi-jIMXiQjd*aMLK; zbt9)Y)i(J*;;tYoK~U9E*B6UlUa~ncku$x(N|m%~O=HE6r&;Y?I~;d~O`f8ipKm8; ztr<-u$nmj7$4$(Q}f1GzhO4n?SqZgd1*5dPnaxXvSPQOAZfDv zsgRbXzGXbkDfyDu*A!%@MScO^4sQ8M-1Q`vcN4=>7i-1IW7 zF^jCex2($a#q5LqBvE*cVW6U$n%#NrYL_z-c#}w8V z5hrBOi)xVi^Vu7rWV;9Ub@FGEmCpx?Q@$9u9hW|^6eQ9QZs!|+J-X}!>n%dBRywP= zTJ*7}9n1a4{WGQ(-qco7IpxUutAmaCrBdgsN9_BHG~3CES{?Os3KseKiih3Ga$^|o zrsw5Z(f)Q6R^M#xbslfz-dzoApGPeeUieJ{#i6szkNSvje&;B^u2ooRsjr~c@Jt%l z!ynQe87wf%HO%Xd+;g~>uxGZ%=fuAhW0B;TjL)x0Z!u1OfA#);8~u-U2opllOR7V8Wv6R-Za1-H;u}@vfzRkOSAXp(m40N+Vkp)&Y7600%me!s?jEnr|EK3r z8Ld?3gq57}a`iTuGm2=uZ*wIg8HdF}001QL|Dq=Oq%ISr154llY|-HY98u%~%z+KC z0ti~>fbveGqR0`@fHTU?fi-YKF%`uK>a|2U1@$pNCK8NOGQ~kyh)dfCkv(-!0uK-k zPJ?qG9-K!j0wjS$z#E<4DsdnZWegOjfdo{GNBKDrhT^Dqu0z1{-MJK$odIXTIW&nE z-v1ttL&F(`N@rjQpbPr+`?&uluDG{xJqXO2JnLiq-^TSK7e)k#S%kK0ig%$AeW;95 zHNtOOXAduoK$-)YKEK3Et)-I5yuEwV=!ZD4;SIgt+CE`U&`DP$)&Uh>R&gIk94LAb z;-zQP=|N2w?g@Q(pQ!j|UgZiUxWfZTN><%vB@mQxO$|5AXPn3o+ z)=$^$tC5A+h8vLm)*lMBFIQl$_jc5=^Y1VZzaot*`GoLGy%~4Qmj*26uI*ntF){t` zEl+{PtTJgYg(M@a8V*~-sY@~CKK-KX$LUojJ4GK*UWTrI#vMSm9wzL*iMBibwJt%= zwVq)KnXPCUZ~X3;wtdiQWLT}SV>wGM$sCL(gs^lEi*~|p24$+7n9p6weBEeBCl4FD zmn;iN$1*-$NEapfK1|aJU+bTo_v89UML-Rsqm7-->JxowG4n%%E;_>7;=c6eq&jDb z@d{x;Gxhvd!Mx`mDk*(|e{2bRbtU5@K~3RvUk zp=CD@Qi?|@YZ+E{8!3rAMPYe_g#}O{8ij!ckSjzq z%wgm#kx_V*NC4Sj1rQy<=CALxTA-;Wib3q#dgm4BrrYkM(GD%$yp4PulfGe)Y~uM(uuAHuM% z(XaZ(lMvN)6uTOn^8JH}siKO354b&Vx&C7zLelw`>H9Wj6S^y|vam#Ftq$8IEo@(? zvZQYLeV`O3X{5L$`)Xe$O%S%cJVR+*i5^!_9DFNx?c}vD>zvMWekw~4ay<5IwX-#8 z9E&OsW?YXjQn3n7@-p;&SZ#cv2Db;BaKHPYOP|{fc0eH6q41?n!cu@;YV<0+$@|{^ z{cuaOlBFTvcC&@(eTcWNSmak|vt)>u3Ik1qi_=xi(!Ajzc4ghMkDU|(#!iyeZv~xy z#x{D^_nP%l59qd_>?yO^V&Kj?yGjDR@u|7m7DLpPc8{E);f!Oxc;Lo%8aL5%G(6X( zzPCB5N5xm9Hgje#+?V%jJzFY9&}Ho|F)QvXiJd#`-6{H!L? zz#!@O7?E*yCZjTWto8(P=A8IxTA4&H84@ST+_leC5^B2WKbJ8Y9b+HOCKxY@PhDCq z3Ox8?sMW%%hM$T`S2+>En~aF79{q6od7V7QM)SKcvV!BNv%l2h<3;tZko0VLmyCnw zE&ia8%HXn>vYd|{x&eV4wO$9|CgaW|w$(fwWL2xb;A8t;=GUpjwwr729;=hyYgExi zpZw!nd48q^Srj$$C*F3G_pec*n(FV9b^Xstl$z~ABxM9IWeKah{IzU@n?N)9m5^0a zPR=9P7MyvQ!I^uv>2c{I?%gD>-48c>@?{{;4@bYcM5_trbCo7v5N40@Qtwk8{T)k6 zB*hA$5=R%i=bn+S7@A%ou)Dh#BJYHjbBnQ=`CFLP4QjQ&5RVo-qsI!B4ZX`u`M<#` zpT9X#%@o37Q2+p#`yW&_WofvA6kra_kYNcdfIV;kG++$qz!6dV5M_o?I-=K^9a6aq zQKpDCLoyhtw?}46WYB;UNP~|+L?Z}=MG0uiC{s5L7GQ!f5D20{6o^401jGU=@IdBu z5(z?)Y#*YNz;T2{A$c_LM>Oy6E-G;QyDlEdf?|!xjH90C9TG++ci^whRF@Md$Wa4T#eK!zFpzUp0n%6I~3p7a<;5pX(NL{ z)s)VW1&Pyi<+h^+S2(H}?tSQ)>8SdfiTA4MyAPxcPP(58+wLX5Mq0BVP8p?>hyz!K zwAlHE+YYFIdaR<&G2Ls!Mena1%uefSF?lokV_a-vDfwaI;FNTpcjIm3Z9j9Z?Rh?P zngfc1%CZe3)tRR!BKSuaa95>YMJBG;uC+1UtQSM9;^nxEZNDh8)ZR+dv4f}91}F6J z^QSYt%uOpkB-r~oB>(!T$8J2Jt0e03$z|fTrsbV_v9$#vfl}RMM@9kdd7h}GCG&7& z_~10>mcrW4o1M|dd*a^^{i>sYD-QZ%a_*+;6~SP5zCm<(Yo1=X!||DNV`?W_CMsDDW zdsDiDZLc1YBMr)<`?iHroJ%ciK@Wk8!ztSEK5;dzZ+#InC`Hg9B|AE&xZ`qHr({o?%H%_Q1x`tgSRg5Cwm zA8~&UAFl6w?b(Zgcf*=69>N(>FzBsV)m+p`8otiSoPT0`bR=fp>(7l + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +