diff options
| author | 7illusions <z@7illusions.com> | 2014-05-12 16:55:07 +0200 |
|---|---|---|
| committer | 7illusions <z@7illusions.com> | 2014-05-12 16:55:07 +0200 |
| commit | baf5cf2544fcaad2246923f60caaf3fed4a94aaf (patch) | |
| tree | a808b700095f876e437b95c432c0220e241f9fda /MediaBrowser.Common | |
| parent | 8f3a6279e173dcbaaa05a56556afb410ee12dd4d (diff) | |
| parent | b9b568de13d81f9db1a8502d50940475c1d79c72 (diff) | |
Merge pull request #3 from MediaBrowser/master
Sync with Master
Diffstat (limited to 'MediaBrowser.Common')
18 files changed, 175 insertions, 103 deletions
diff --git a/MediaBrowser.Common/Events/GenericEventArgs.cs b/MediaBrowser.Common/Events/GenericEventArgs.cs deleted file mode 100644 index e7cf524d45..0000000000 --- a/MediaBrowser.Common/Events/GenericEventArgs.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; - -namespace MediaBrowser.Common.Events -{ - /// <summary> - /// Provides a generic EventArgs subclass that can hold any kind of object - /// </summary> - /// <typeparam name="T"></typeparam> - public class GenericEventArgs<T> : EventArgs - { - /// <summary> - /// Gets or sets the argument. - /// </summary> - /// <value>The argument.</value> - public T Argument { get; set; } - } -} diff --git a/MediaBrowser.Common/IApplicationHost.cs b/MediaBrowser.Common/IApplicationHost.cs index ecd099711f..709a8e9277 100644 --- a/MediaBrowser.Common/IApplicationHost.cs +++ b/MediaBrowser.Common/IApplicationHost.cs @@ -1,5 +1,5 @@ -using MediaBrowser.Common.Events; -using MediaBrowser.Common.Plugins; +using MediaBrowser.Common.Plugins; +using MediaBrowser.Model.Events; using MediaBrowser.Model.Updates; using System; using System.Collections.Generic; @@ -152,15 +152,4 @@ namespace MediaBrowser.Common /// <returns>System.Object.</returns> object CreateInstance(Type type); } - - public interface IDependencyContainer - { - void RegisterSingleInstance<T>(T obj, bool manageLifetime = true) - where T : class; - - void RegisterSingleInstance<T>(Func<T> func) - where T : class; - - void Register(Type typeInterface, Type typeImplementation); - } } diff --git a/MediaBrowser.Common/IDependencyContainer.cs b/MediaBrowser.Common/IDependencyContainer.cs new file mode 100644 index 0000000000..423c1740a3 --- /dev/null +++ b/MediaBrowser.Common/IDependencyContainer.cs @@ -0,0 +1,15 @@ +using System; + +namespace MediaBrowser.Common +{ + public interface IDependencyContainer + { + void RegisterSingleInstance<T>(T obj, bool manageLifetime = true) + where T : class; + + void RegisterSingleInstance<T>(Func<T> func) + where T : class; + + void Register(Type typeInterface, Type typeImplementation); + } +}
\ No newline at end of file diff --git a/MediaBrowser.Common/MediaBrowser.Common.csproj b/MediaBrowser.Common/MediaBrowser.Common.csproj index 5e0d3aa245..2e7db5c351 100644 --- a/MediaBrowser.Common/MediaBrowser.Common.csproj +++ b/MediaBrowser.Common/MediaBrowser.Common.csproj @@ -59,8 +59,8 @@ <Compile Include="Constants\Constants.cs" /> <Compile Include="Events\EventHelper.cs" /> <Compile Include="Extensions\BaseExtensions.cs" /> - <Compile Include="Events\GenericEventArgs.cs" /> <Compile Include="Extensions\ResourceNotFoundException.cs" /> + <Compile Include="IDependencyContainer.cs" /> <Compile Include="IO\FileSystemRepository.cs" /> <Compile Include="IO\IFileSystem.cs" /> <Compile Include="IO\ProgressStream.cs" /> @@ -79,9 +79,12 @@ <Compile Include="Net\IWebSocketServer.cs" /> <Compile Include="Net\MimeTypes.cs" /> <Compile Include="Net\WebSocketConnectEventArgs.cs" /> + <Compile Include="Net\WebSocketMessageInfo.cs" /> <Compile Include="Plugins\IDependencyModule.cs" /> <Compile Include="Plugins\IPlugin.cs" /> <Compile Include="Progress\ActionableProgress.cs" /> + <Compile Include="ScheduledTasks\IConfigurableScheduledTask.cs" /> + <Compile Include="ScheduledTasks\IHasKey.cs" /> <Compile Include="ScheduledTasks\IScheduledTask.cs" /> <Compile Include="ScheduledTasks\IScheduledTaskWorker.cs" /> <Compile Include="ScheduledTasks\ITaskManager.cs" /> @@ -99,6 +102,7 @@ <Compile Include="Security\ISecurityManager.cs" /> <Compile Include="Updates\IInstallationManager.cs" /> <Compile Include="Updates\InstallationEventArgs.cs" /> + <Compile Include="Updates\InstallationFailedEventArgs.cs" /> </ItemGroup> <ItemGroup> <None Include="app.config" /> diff --git a/MediaBrowser.Common/Net/BasePeriodicWebSocketListener.cs b/MediaBrowser.Common/Net/BasePeriodicWebSocketListener.cs index 33d3f368b6..a2af3707be 100644 --- a/MediaBrowser.Common/Net/BasePeriodicWebSocketListener.cs +++ b/MediaBrowser.Common/Net/BasePeriodicWebSocketListener.cs @@ -15,7 +15,7 @@ namespace MediaBrowser.Common.Net /// <typeparam name="TReturnDataType">The type of the T return data type.</typeparam> /// <typeparam name="TStateType">The type of the T state type.</typeparam> public abstract class BasePeriodicWebSocketListener<TReturnDataType, TStateType> : IWebSocketListener, IDisposable - where TStateType : class, new() + where TStateType : WebSocketListenerState, new() where TReturnDataType : class { /// <summary> @@ -83,7 +83,15 @@ namespace MediaBrowser.Common.Net } protected readonly CultureInfo UsCulture = new CultureInfo("en-US"); - + + protected virtual bool SendOnTimer + { + get + { + return true; + } + } + /// <summary> /// Starts sending messages over a web socket /// </summary> @@ -99,9 +107,15 @@ namespace MediaBrowser.Common.Net Logger.Info("{1} Begin transmitting over websocket to {0}", message.Connection.RemoteEndPoint, GetType().Name); - var timer = new Timer(TimerCallback, message.Connection, Timeout.Infinite, Timeout.Infinite); + var timer = SendOnTimer ? + new Timer(TimerCallback, message.Connection, Timeout.Infinite, Timeout.Infinite) : + null; - var state = new TStateType(); + var state = new TStateType + { + IntervalMs = periodMs, + InitialDelayMs = dueTimeMs + }; var semaphore = new SemaphoreSlim(1, 1); @@ -110,14 +124,17 @@ namespace MediaBrowser.Common.Net ActiveConnections.Add(new Tuple<IWebSocketConnection, CancellationTokenSource, Timer, TStateType, SemaphoreSlim>(message.Connection, cancellationTokenSource, timer, state, semaphore)); } - timer.Change(TimeSpan.FromMilliseconds(dueTimeMs), TimeSpan.FromMilliseconds(periodMs)); + if (timer != null) + { + timer.Change(TimeSpan.FromMilliseconds(dueTimeMs), TimeSpan.FromMilliseconds(periodMs)); + } } /// <summary> /// Timers the callback. /// </summary> /// <param name="state">The state.</param> - private async void TimerCallback(object state) + private void TimerCallback(object state) { var connection = (IWebSocketConnection)state; @@ -139,11 +156,50 @@ namespace MediaBrowser.Common.Net return; } + SendData(tuple); + } + + protected void SendData(bool force) + { + List<Tuple<IWebSocketConnection, CancellationTokenSource, Timer, TStateType, SemaphoreSlim>> tuples; + + lock (ActiveConnections) + { + tuples = ActiveConnections + .Where(c => + { + if (c.Item1.State == WebSocketState.Open && !c.Item2.IsCancellationRequested) + { + var state = c.Item4; + + if (force || (DateTime.UtcNow - state.DateLastSendUtc).TotalMilliseconds >= state.IntervalMs) + { + return true; + } + } + + return false; + }) + .ToList(); + } + + foreach (var tuple in tuples) + { + SendData(tuple); + } + } + + private async void SendData(Tuple<IWebSocketConnection, CancellationTokenSource, Timer, TStateType, SemaphoreSlim> tuple) + { + var connection = tuple.Item1; + try { await tuple.Item5.WaitAsync(tuple.Item2.Token).ConfigureAwait(false); - var data = await GetDataToSend(tuple.Item4).ConfigureAwait(false); + var state = tuple.Item4; + + var data = await GetDataToSend(state).ConfigureAwait(false); if (data != null) { @@ -153,6 +209,8 @@ namespace MediaBrowser.Common.Net Data = data }, tuple.Item2.Token).ConfigureAwait(false); + + state.DateLastSendUtc = DateTime.UtcNow; } tuple.Item5.Release(); @@ -196,13 +254,18 @@ namespace MediaBrowser.Common.Net { Logger.Info("{1} stop transmitting over websocket to {0}", connection.Item1.RemoteEndPoint, GetType().Name); - try - { - connection.Item3.Dispose(); - } - catch (ObjectDisposedException) + var timer = connection.Item3; + + if (timer != null) { + try + { + timer.Dispose(); + } + catch (ObjectDisposedException) + { + } } try @@ -212,7 +275,7 @@ namespace MediaBrowser.Common.Net } catch (ObjectDisposedException) { - + } try @@ -223,7 +286,7 @@ namespace MediaBrowser.Common.Net { } - + ActiveConnections.Remove(connection); } @@ -253,4 +316,11 @@ namespace MediaBrowser.Common.Net Dispose(true); } } + + public class WebSocketListenerState + { + public DateTime DateLastSendUtc { get; set; } + public long InitialDelayMs { get; set; } + public long IntervalMs { get; set; } + } } diff --git a/MediaBrowser.Common/Net/HttpRequestOptions.cs b/MediaBrowser.Common/Net/HttpRequestOptions.cs index c7277eba86..192264eed1 100644 --- a/MediaBrowser.Common/Net/HttpRequestOptions.cs +++ b/MediaBrowser.Common/Net/HttpRequestOptions.cs @@ -53,6 +53,12 @@ namespace MediaBrowser.Common.Net } /// <summary> + /// Gets or sets the host. + /// </summary> + /// <value>The host.</value> + public string Host { get; set; } + + /// <summary> /// Gets or sets the progress. /// </summary> /// <value>The progress.</value> @@ -69,14 +75,13 @@ namespace MediaBrowser.Common.Net public string RequestContentType { get; set; } public string RequestContent { get; set; } + public byte[] RequestContentBytes { get; set; } public bool BufferContent { get; set; } public bool LogRequest { get; set; } public bool LogErrorResponseBody { get; set; } - - public HttpRequestCachePolicy CachePolicy { get; set; } private string GetHeaderValue(string name) { @@ -95,17 +100,9 @@ namespace MediaBrowser.Common.Net EnableHttpCompression = true; BufferContent = true; - CachePolicy = HttpRequestCachePolicy.None; - RequestHeaders = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); LogRequest = true; } } - - public enum HttpRequestCachePolicy - { - None = 1, - Validate = 2 - } } diff --git a/MediaBrowser.Common/Net/IWebSocketConnection.cs b/MediaBrowser.Common/Net/IWebSocketConnection.cs index 482da131ee..514a52d960 100644 --- a/MediaBrowser.Common/Net/IWebSocketConnection.cs +++ b/MediaBrowser.Common/Net/IWebSocketConnection.cs @@ -65,16 +65,4 @@ namespace MediaBrowser.Common.Net /// <exception cref="System.ArgumentNullException">buffer</exception> Task SendAsync(byte[] buffer, WebSocketMessageType type, CancellationToken cancellationToken); } - - /// <summary> - /// Class WebSocketMessageInfo - /// </summary> - public class WebSocketMessageInfo : WebSocketMessage<string> - { - /// <summary> - /// Gets or sets the connection. - /// </summary> - /// <value>The connection.</value> - public IWebSocketConnection Connection { get; set; } - } }
\ No newline at end of file diff --git a/MediaBrowser.Common/Net/WebSocketMessageInfo.cs b/MediaBrowser.Common/Net/WebSocketMessageInfo.cs new file mode 100644 index 0000000000..c1f935a7b4 --- /dev/null +++ b/MediaBrowser.Common/Net/WebSocketMessageInfo.cs @@ -0,0 +1,16 @@ +using MediaBrowser.Model.Net; + +namespace MediaBrowser.Common.Net +{ + /// <summary> + /// Class WebSocketMessageInfo + /// </summary> + public class WebSocketMessageInfo : WebSocketMessage<string> + { + /// <summary> + /// Gets or sets the connection. + /// </summary> + /// <value>The connection.</value> + public IWebSocketConnection Connection { get; set; } + } +}
\ No newline at end of file diff --git a/MediaBrowser.Common/Plugins/BasePlugin.cs b/MediaBrowser.Common/Plugins/BasePlugin.cs index aa1369c4e2..6bbd69f04b 100644 --- a/MediaBrowser.Common/Plugins/BasePlugin.cs +++ b/MediaBrowser.Common/Plugins/BasePlugin.cs @@ -305,8 +305,6 @@ namespace MediaBrowser.Common.Plugins ConfigurationDateLastModified = ConfigurationDateLastModified, Description = Description, Id = Id.ToString("N"), - EnableAutoUpdate = Configuration.EnableAutoUpdate, - UpdateClass = Configuration.UpdateClass, ConfigurationFileName = ConfigurationFileName }; diff --git a/MediaBrowser.Common/ScheduledTasks/IConfigurableScheduledTask.cs b/MediaBrowser.Common/ScheduledTasks/IConfigurableScheduledTask.cs new file mode 100644 index 0000000000..fc69630709 --- /dev/null +++ b/MediaBrowser.Common/ScheduledTasks/IConfigurableScheduledTask.cs @@ -0,0 +1,16 @@ +namespace MediaBrowser.Common.ScheduledTasks +{ + public interface IConfigurableScheduledTask + { + /// <summary> + /// Gets a value indicating whether this instance is hidden. + /// </summary> + /// <value><c>true</c> if this instance is hidden; otherwise, <c>false</c>.</value> + bool IsHidden { get; } + /// <summary> + /// Gets a value indicating whether this instance is enabled. + /// </summary> + /// <value><c>true</c> if this instance is enabled; otherwise, <c>false</c>.</value> + bool IsEnabled { get; } + } +}
\ No newline at end of file diff --git a/MediaBrowser.Common/ScheduledTasks/IHasKey.cs b/MediaBrowser.Common/ScheduledTasks/IHasKey.cs new file mode 100644 index 0000000000..5736cb6162 --- /dev/null +++ b/MediaBrowser.Common/ScheduledTasks/IHasKey.cs @@ -0,0 +1,7 @@ +namespace MediaBrowser.Common.ScheduledTasks +{ + public interface IHasKey + { + string Key { get; } + } +}
\ No newline at end of file diff --git a/MediaBrowser.Common/ScheduledTasks/IScheduledTask.cs b/MediaBrowser.Common/ScheduledTasks/IScheduledTask.cs index e150f7f4e3..351e96c7d5 100644 --- a/MediaBrowser.Common/ScheduledTasks/IScheduledTask.cs +++ b/MediaBrowser.Common/ScheduledTasks/IScheduledTask.cs @@ -42,23 +42,4 @@ namespace MediaBrowser.Common.ScheduledTasks /// <returns>IEnumerable{BaseTaskTrigger}.</returns> IEnumerable<ITaskTrigger> GetDefaultTriggers(); } - - public interface IConfigurableScheduledTask - { - /// <summary> - /// Gets a value indicating whether this instance is hidden. - /// </summary> - /// <value><c>true</c> if this instance is hidden; otherwise, <c>false</c>.</value> - bool IsHidden { get; } - /// <summary> - /// Gets a value indicating whether this instance is enabled. - /// </summary> - /// <value><c>true</c> if this instance is enabled; otherwise, <c>false</c>.</value> - bool IsEnabled { get; } - } - - public interface IHasKey - { - string Key { get; } - } } diff --git a/MediaBrowser.Common/ScheduledTasks/IScheduledTaskWorker.cs b/MediaBrowser.Common/ScheduledTasks/IScheduledTaskWorker.cs index 2fa76472d8..f50bd9e76e 100644 --- a/MediaBrowser.Common/ScheduledTasks/IScheduledTaskWorker.cs +++ b/MediaBrowser.Common/ScheduledTasks/IScheduledTaskWorker.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Model.Tasks; +using MediaBrowser.Model.Events; +using MediaBrowser.Model.Tasks; using System; using System.Collections.Generic; @@ -10,6 +11,11 @@ namespace MediaBrowser.Common.ScheduledTasks public interface IScheduledTaskWorker : IDisposable { /// <summary> + /// Occurs when [task progress]. + /// </summary> + event EventHandler<GenericEventArgs<double>> TaskProgress; + + /// <summary> /// Gets or sets the scheduled task. /// </summary> /// <value>The scheduled task.</value> @@ -62,6 +68,6 @@ namespace MediaBrowser.Common.ScheduledTasks /// Gets the unique id. /// </summary> /// <value>The unique id.</value> - Guid Id { get; } + string Id { get; } } }
\ No newline at end of file diff --git a/MediaBrowser.Common/ScheduledTasks/ITaskManager.cs b/MediaBrowser.Common/ScheduledTasks/ITaskManager.cs index 3948727837..01dc355c33 100644 --- a/MediaBrowser.Common/ScheduledTasks/ITaskManager.cs +++ b/MediaBrowser.Common/ScheduledTasks/ITaskManager.cs @@ -1,5 +1,4 @@ -using MediaBrowser.Common.Events; -using MediaBrowser.Model.Tasks; +using MediaBrowser.Model.Events; using System; using System.Collections.Generic; using System.Threading.Tasks; @@ -50,7 +49,7 @@ namespace MediaBrowser.Common.ScheduledTasks void Cancel(IScheduledTaskWorker task); Task Execute(IScheduledTaskWorker task); - event EventHandler<EventArgs> TaskExecuting; - event EventHandler<GenericEventArgs<TaskResult>> TaskCompleted; + event EventHandler<GenericEventArgs<IScheduledTaskWorker>> TaskExecuting; + event EventHandler<TaskCompletionEventArgs> TaskCompleted; } }
\ No newline at end of file diff --git a/MediaBrowser.Common/ScheduledTasks/TaskCompletionEventArgs.cs b/MediaBrowser.Common/ScheduledTasks/TaskCompletionEventArgs.cs index 8aab6b50d4..2974806d02 100644 --- a/MediaBrowser.Common/ScheduledTasks/TaskCompletionEventArgs.cs +++ b/MediaBrowser.Common/ScheduledTasks/TaskCompletionEventArgs.cs @@ -5,7 +5,7 @@ namespace MediaBrowser.Common.ScheduledTasks { public class TaskCompletionEventArgs : EventArgs { - public IScheduledTask Task { get; set; } + public IScheduledTaskWorker Task { get; set; } public TaskResult Result { get; set; } } diff --git a/MediaBrowser.Common/Updates/IInstallationManager.cs b/MediaBrowser.Common/Updates/IInstallationManager.cs index f162f8dc8c..592613c54c 100644 --- a/MediaBrowser.Common/Updates/IInstallationManager.cs +++ b/MediaBrowser.Common/Updates/IInstallationManager.cs @@ -1,5 +1,5 @@ -using MediaBrowser.Common.Events; -using MediaBrowser.Common.Plugins; +using MediaBrowser.Common.Plugins; +using MediaBrowser.Model.Events; using MediaBrowser.Model.Updates; using System; using System.Collections.Concurrent; diff --git a/MediaBrowser.Common/Updates/InstallationEventArgs.cs b/MediaBrowser.Common/Updates/InstallationEventArgs.cs index 2c3a805de1..9dc8ead835 100644 --- a/MediaBrowser.Common/Updates/InstallationEventArgs.cs +++ b/MediaBrowser.Common/Updates/InstallationEventArgs.cs @@ -1,5 +1,4 @@ using MediaBrowser.Model.Updates; -using System; namespace MediaBrowser.Common.Updates { @@ -9,9 +8,4 @@ namespace MediaBrowser.Common.Updates public PackageVersionInfo PackageVersionInfo { get; set; } } - - public class InstallationFailedEventArgs : InstallationEventArgs - { - public Exception Exception { get; set; } - } } diff --git a/MediaBrowser.Common/Updates/InstallationFailedEventArgs.cs b/MediaBrowser.Common/Updates/InstallationFailedEventArgs.cs new file mode 100644 index 0000000000..69dc1ee982 --- /dev/null +++ b/MediaBrowser.Common/Updates/InstallationFailedEventArgs.cs @@ -0,0 +1,9 @@ +using System; + +namespace MediaBrowser.Common.Updates +{ + public class InstallationFailedEventArgs : InstallationEventArgs + { + public Exception Exception { get; set; } + } +}
\ No newline at end of file |
