aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Common
diff options
context:
space:
mode:
author7illusions <z@7illusions.com>2014-05-12 16:55:07 +0200
committer7illusions <z@7illusions.com>2014-05-12 16:55:07 +0200
commitbaf5cf2544fcaad2246923f60caaf3fed4a94aaf (patch)
treea808b700095f876e437b95c432c0220e241f9fda /MediaBrowser.Common
parent8f3a6279e173dcbaaa05a56556afb410ee12dd4d (diff)
parentb9b568de13d81f9db1a8502d50940475c1d79c72 (diff)
Merge pull request #3 from MediaBrowser/master
Sync with Master
Diffstat (limited to 'MediaBrowser.Common')
-rw-r--r--MediaBrowser.Common/Events/GenericEventArgs.cs17
-rw-r--r--MediaBrowser.Common/IApplicationHost.cs15
-rw-r--r--MediaBrowser.Common/IDependencyContainer.cs15
-rw-r--r--MediaBrowser.Common/MediaBrowser.Common.csproj6
-rw-r--r--MediaBrowser.Common/Net/BasePeriodicWebSocketListener.cs98
-rw-r--r--MediaBrowser.Common/Net/HttpRequestOptions.cs17
-rw-r--r--MediaBrowser.Common/Net/IWebSocketConnection.cs12
-rw-r--r--MediaBrowser.Common/Net/WebSocketMessageInfo.cs16
-rw-r--r--MediaBrowser.Common/Plugins/BasePlugin.cs2
-rw-r--r--MediaBrowser.Common/ScheduledTasks/IConfigurableScheduledTask.cs16
-rw-r--r--MediaBrowser.Common/ScheduledTasks/IHasKey.cs7
-rw-r--r--MediaBrowser.Common/ScheduledTasks/IScheduledTask.cs19
-rw-r--r--MediaBrowser.Common/ScheduledTasks/IScheduledTaskWorker.cs10
-rw-r--r--MediaBrowser.Common/ScheduledTasks/ITaskManager.cs7
-rw-r--r--MediaBrowser.Common/ScheduledTasks/TaskCompletionEventArgs.cs2
-rw-r--r--MediaBrowser.Common/Updates/IInstallationManager.cs4
-rw-r--r--MediaBrowser.Common/Updates/InstallationEventArgs.cs6
-rw-r--r--MediaBrowser.Common/Updates/InstallationFailedEventArgs.cs9
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