From fc735e918723f5bfdd64979afa4995a6fec80e7c Mon Sep 17 00:00:00 2001 From: LukePulverenti Luke Pulverenti luke pulverenti Date: Mon, 3 Sep 2012 17:56:30 -0400 Subject: [PATCH] Tweaked plugin downloading a bit --- .../PluginConfigurationHandler.cs | 4 +- .../HttpHandlers/PluginsHandler.cs | 3 +- MediaBrowser.ApiInteraction/ApiClient.cs | 39 +++++++++++++++++-- .../IDataSerializer.cs | 7 +++- MediaBrowser.Common/Kernel/BaseKernel.cs | 1 + MediaBrowser.Common/Plugins/BasePlugin.cs | 22 ++++++----- .../Serialization/JsonSerializer.cs | 7 ++++ .../Serialization/JsvSerializer.cs | 12 ++++-- .../Serialization/ProtobufSerializer.cs | 8 +++- .../Serialization/XmlSerializer.cs | 8 ++++ .../Plugins/BasePluginConfiguration.cs | 3 -- 11 files changed, 91 insertions(+), 23 deletions(-) diff --git a/MediaBrowser.Api/HttpHandlers/PluginConfigurationHandler.cs b/MediaBrowser.Api/HttpHandlers/PluginConfigurationHandler.cs index 6abfb9b2d8..38c039275c 100644 --- a/MediaBrowser.Api/HttpHandlers/PluginConfigurationHandler.cs +++ b/MediaBrowser.Api/HttpHandlers/PluginConfigurationHandler.cs @@ -11,9 +11,9 @@ namespace MediaBrowser.Api.HttpHandlers { protected override Task GetObjectToSerialize() { - string pluginName = QueryString["name"]; + string name = QueryString["assemblyfilename"]; - BasePluginConfiguration config = Kernel.Instance.Plugins.First(p => p.Name.Equals(pluginName, StringComparison.OrdinalIgnoreCase)).Configuration; + BasePluginConfiguration config = Kernel.Instance.Plugins.First(p => p.AssemblyFileName.Equals(name, StringComparison.OrdinalIgnoreCase)).Configuration; return Task.FromResult(config); } diff --git a/MediaBrowser.Api/HttpHandlers/PluginsHandler.cs b/MediaBrowser.Api/HttpHandlers/PluginsHandler.cs index b05642e70f..d0be59cef8 100644 --- a/MediaBrowser.Api/HttpHandlers/PluginsHandler.cs +++ b/MediaBrowser.Api/HttpHandlers/PluginsHandler.cs @@ -22,7 +22,8 @@ namespace MediaBrowser.Api.HttpHandlers Enabled = p.Enabled, DownloadToUI = p.DownloadToUI, Version = p.Version.ToString(), - AssemblyFileName = p.AssemblyFileName + AssemblyFileName = p.AssemblyFileName, + ConfigurationDateLastModified = p.ConfigurationDateLastModified }; }); diff --git a/MediaBrowser.ApiInteraction/ApiClient.cs b/MediaBrowser.ApiInteraction/ApiClient.cs index 6384f3df99..18d6ddc210 100644 --- a/MediaBrowser.ApiInteraction/ApiClient.cs +++ b/MediaBrowser.ApiInteraction/ApiClient.cs @@ -590,15 +590,34 @@ namespace MediaBrowser.ApiInteraction } /// - /// Gets weather information for the default location as set in configuration + /// Gets the current server configuration /// public async Task GetServerConfigurationAsync() { string url = ApiUrl + "/ServerConfiguration"; - using (Stream stream = await GetSerializedStreamAsync(url, ApiInteraction.SerializationFormat.Json).ConfigureAwait(false)) + // At the moment this can't be retrieved in protobuf format + SerializationFormat format = DataSerializer.CanDeserializeJsv ? SerializationFormat.Jsv : ApiInteraction.SerializationFormat.Json; + + using (Stream stream = await GetSerializedStreamAsync(url, format).ConfigureAwait(false)) { - return DeserializeFromStream(stream, ApiInteraction.SerializationFormat.Json); + return DeserializeFromStream(stream, format); + } + } + + /// + /// Gets weather information for the default location as set in configuration + /// + public async Task GetPluginConfigurationAsync(PluginInfo plugin, Type configurationType) + { + string url = ApiUrl + "/PluginConfiguration?assemblyfilename=" + plugin.AssemblyFileName; + + // At the moment this can't be retrieved in protobuf format + SerializationFormat format = DataSerializer.CanDeserializeJsv ? SerializationFormat.Jsv : ApiInteraction.SerializationFormat.Json; + + using (Stream stream = await GetSerializedStreamAsync(url, format).ConfigureAwait(false)) + { + return DeserializeFromStream(stream, format, configurationType); } } @@ -685,6 +704,20 @@ namespace MediaBrowser.ApiInteraction return DataSerializer.DeserializeJsonFromStream(stream); } + private object DeserializeFromStream(Stream stream, SerializationFormat format, Type type) + { + if (format == ApiInteraction.SerializationFormat.Protobuf) + { + return DataSerializer.DeserializeProtobufFromStream(stream, type); + } + if (format == ApiInteraction.SerializationFormat.Jsv) + { + return DataSerializer.DeserializeJsvFromStream(stream, type); + } + + return DataSerializer.DeserializeJsonFromStream(stream, type); + } + /// /// This is just a helper around HttpClient /// diff --git a/MediaBrowser.ApiInteraction/IDataSerializer.cs b/MediaBrowser.ApiInteraction/IDataSerializer.cs index 999045ddac..33bac96df8 100644 --- a/MediaBrowser.ApiInteraction/IDataSerializer.cs +++ b/MediaBrowser.ApiInteraction/IDataSerializer.cs @@ -1,4 +1,5 @@ -using System.IO; +using System; +using System.IO; namespace MediaBrowser.ApiInteraction { @@ -11,6 +12,10 @@ namespace MediaBrowser.ApiInteraction T DeserializeJsvFromStream(Stream stream); T DeserializeProtobufFromStream(Stream stream); + object DeserializeJsonFromStream(Stream stream, Type type); + object DeserializeJsvFromStream(Stream stream, Type type); + object DeserializeProtobufFromStream(Stream stream, Type type); + bool CanDeserializeJsv { get; } bool CanDeserializeProtobuf { get; } } diff --git a/MediaBrowser.Common/Kernel/BaseKernel.cs b/MediaBrowser.Common/Kernel/BaseKernel.cs index 3704dbce02..8b865201ba 100644 --- a/MediaBrowser.Common/Kernel/BaseKernel.cs +++ b/MediaBrowser.Common/Kernel/BaseKernel.cs @@ -168,6 +168,7 @@ namespace MediaBrowser.Common.Kernel if (!File.Exists(ApplicationPaths.SystemConfigurationFilePath)) { Configuration = new TConfigurationType(); + XmlSerializer.SerializeToFile(Configuration, ApplicationPaths.SystemConfigurationFilePath); } else { diff --git a/MediaBrowser.Common/Plugins/BasePlugin.cs b/MediaBrowser.Common/Plugins/BasePlugin.cs index e36a31c682..d2e186e125 100644 --- a/MediaBrowser.Common/Plugins/BasePlugin.cs +++ b/MediaBrowser.Common/Plugins/BasePlugin.cs @@ -24,7 +24,7 @@ namespace MediaBrowser.Common.Plugins } } - protected override Type ConfigurationType + public override Type ConfigurationType { get { return typeof(TConfigurationType); } } @@ -35,12 +35,12 @@ namespace MediaBrowser.Common.Plugins /// public abstract class BasePlugin : IDisposable { - private IKernel Kernel { get; set; } + public IKernel IKernel { get; set; } /// /// Gets or sets the plugin's current context /// - protected KernelContext Context { get { return Kernel.KernelContext; } } + protected KernelContext Context { get { return IKernel.KernelContext; } } /// /// Gets the name of the plugin @@ -50,7 +50,7 @@ namespace MediaBrowser.Common.Plugins /// /// Gets the type of configuration this plugin uses /// - protected abstract Type ConfigurationType { get; } + public abstract Type ConfigurationType { get; } /// /// Gets the plugin version @@ -74,6 +74,8 @@ namespace MediaBrowser.Common.Plugins } } + public DateTime ConfigurationDateLastModified { get; private set; } + /// /// Gets the path to the assembly file /// @@ -81,7 +83,7 @@ namespace MediaBrowser.Common.Plugins { get { - return Path.Combine(Kernel.ApplicationPaths.PluginsPath, AssemblyFileName); + return Path.Combine(IKernel.ApplicationPaths.PluginsPath, AssemblyFileName); } } @@ -102,7 +104,7 @@ namespace MediaBrowser.Common.Plugins { get { - return Path.Combine(Kernel.ApplicationPaths.PluginConfigurationsPath, ConfigurationFileName); + return Path.Combine(IKernel.ApplicationPaths.PluginConfigurationsPath, ConfigurationFileName); } } @@ -118,7 +120,7 @@ namespace MediaBrowser.Common.Plugins { // Give the folder name the same name as the config file name // We can always make this configurable if/when needed - _DataFolderPath = Path.Combine(Kernel.ApplicationPaths.PluginsPath, Path.GetFileNameWithoutExtension(ConfigurationFileName)); + _DataFolderPath = Path.Combine(IKernel.ApplicationPaths.PluginsPath, Path.GetFileNameWithoutExtension(ConfigurationFileName)); if (!Directory.Exists(_DataFolderPath)) { @@ -154,7 +156,7 @@ namespace MediaBrowser.Common.Plugins /// public void Initialize(IKernel kernel) { - Kernel = kernel; + IKernel = kernel; ReloadConfiguration(); @@ -183,12 +185,14 @@ namespace MediaBrowser.Common.Plugins if (!File.Exists(ConfigurationFilePath)) { Configuration = Activator.CreateInstance(ConfigurationType) as BasePluginConfiguration; + XmlSerializer.SerializeToFile(Configuration, ConfigurationFilePath); } else { Configuration = XmlSerializer.DeserializeFromFile(ConfigurationType, ConfigurationFilePath) as BasePluginConfiguration; - Configuration.DateLastModified = File.GetLastWriteTime(ConfigurationFilePath); } + + ConfigurationDateLastModified = File.GetLastWriteTime(ConfigurationFilePath); } } } diff --git a/MediaBrowser.Common/Serialization/JsonSerializer.cs b/MediaBrowser.Common/Serialization/JsonSerializer.cs index e73048f176..b1c0726e52 100644 --- a/MediaBrowser.Common/Serialization/JsonSerializer.cs +++ b/MediaBrowser.Common/Serialization/JsonSerializer.cs @@ -52,6 +52,13 @@ namespace MediaBrowser.Common.Serialization return ServiceStack.Text.JsonSerializer.DeserializeFromStream(stream); } + public static object DeserializeFromStream(Stream stream, Type type) + { + Configure(); + + return ServiceStack.Text.JsonSerializer.DeserializeFromStream(type, stream); + } + private static bool IsConfigured = false; private static void Configure() { diff --git a/MediaBrowser.Common/Serialization/JsvSerializer.cs b/MediaBrowser.Common/Serialization/JsvSerializer.cs index 24c4b074eb..d482348af4 100644 --- a/MediaBrowser.Common/Serialization/JsvSerializer.cs +++ b/MediaBrowser.Common/Serialization/JsvSerializer.cs @@ -1,4 +1,5 @@ -using System.IO; +using System; +using System.IO; namespace MediaBrowser.Common.Serialization { @@ -19,11 +20,16 @@ namespace MediaBrowser.Common.Serialization return ServiceStack.Text.TypeSerializer.DeserializeFromStream(stream); } + public static object DeserializeFromStream(Stream stream, Type type) + { + return ServiceStack.Text.TypeSerializer.DeserializeFromStream(type, stream); + } + public static void SerializeToFile(T obj, string file) { using (Stream stream = File.Open(file, FileMode.Create)) { - ServiceStack.Text.TypeSerializer.SerializeToStream(obj, stream); + SerializeToStream(obj, stream); } } @@ -31,7 +37,7 @@ namespace MediaBrowser.Common.Serialization { using (Stream stream = File.OpenRead(file)) { - return ServiceStack.Text.TypeSerializer.DeserializeFromStream(stream); + return DeserializeFromStream(stream); } } } diff --git a/MediaBrowser.Common/Serialization/ProtobufSerializer.cs b/MediaBrowser.Common/Serialization/ProtobufSerializer.cs index 701ef70298..6151e83413 100644 --- a/MediaBrowser.Common/Serialization/ProtobufSerializer.cs +++ b/MediaBrowser.Common/Serialization/ProtobufSerializer.cs @@ -1,4 +1,5 @@ -using System.IO; +using System; +using System.IO; namespace MediaBrowser.Common.Serialization { @@ -18,6 +19,11 @@ namespace MediaBrowser.Common.Serialization return ProtoBuf.Serializer.Deserialize(stream); } + public static object DeserializeFromStream(Stream stream, Type type) + { + throw new NotImplementedException(); + } + public static void SerializeToFile(T obj, string file) { using (Stream stream = File.Open(file, FileMode.Create)) diff --git a/MediaBrowser.Common/Serialization/XmlSerializer.cs b/MediaBrowser.Common/Serialization/XmlSerializer.cs index 90361e2b9c..b881591dd8 100644 --- a/MediaBrowser.Common/Serialization/XmlSerializer.cs +++ b/MediaBrowser.Common/Serialization/XmlSerializer.cs @@ -39,6 +39,14 @@ namespace MediaBrowser.Common.Serialization } } + public static void SerializeToFile(object obj, string file) + { + using (FileStream stream = new FileStream(file, FileMode.Create)) + { + ServiceStack.Text.XmlSerializer.SerializeToStream(obj, stream); + } + } + public static object DeserializeFromFile(Type type, string file) { using (Stream stream = File.OpenRead(file)) diff --git a/MediaBrowser.Model/Plugins/BasePluginConfiguration.cs b/MediaBrowser.Model/Plugins/BasePluginConfiguration.cs index 7881de598b..55c5133a8e 100644 --- a/MediaBrowser.Model/Plugins/BasePluginConfiguration.cs +++ b/MediaBrowser.Model/Plugins/BasePluginConfiguration.cs @@ -7,9 +7,6 @@ namespace MediaBrowser.Model.Plugins { public bool Enabled { get; set; } - [IgnoreDataMember] - public DateTime DateLastModified { get; set; } - public BasePluginConfiguration() { Enabled = true;