// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
using System.ComponentModel;
using System.Reflection;
namespace System.Reactive.PlatformServices
{
///
/// (Infrastructure) Interface for enlightenment providers.
///
///
/// This type is used by the Rx infrastructure and not meant for public consumption or implementation.
/// No guarantees are made about forward compatibility of the type's functionality and its usage.
///
[EditorBrowsable(EditorBrowsableState.Never)]
public interface IPlatformEnlightenmentProvider
{
///
/// (Infastructure) Tries to gets the specified service.
///
/// Service type.
/// Optional set of arguments.
/// Service instance or null if not found.
T GetService(params object[] args) where T : class;
}
///
/// (Infrastructure) Provider for platform-specific framework enlightenments.
///
///
/// This type is used by the Rx infrastructure and not meant for public consumption or implementation.
///
[EditorBrowsable(EditorBrowsableState.Never)]
public static class PlatformEnlightenmentProvider
{
private static readonly object s_gate = new object();
private static IPlatformEnlightenmentProvider s_current;
///
/// (Infrastructure) Gets the current enlightenment provider. If none is loaded yet, accessing this property triggers provider resolution.
///
///
/// This member is used by the Rx infrastructure and not meant for public consumption or implementation.
///
public static IPlatformEnlightenmentProvider Current
{
get
{
if (s_current == null)
{
lock (s_gate)
{
if (s_current == null)
{
//
// TODO: Investigate whether we can simplify this logic to just use "System.Reactive.PlatformServices.PlatformEnlightenmentProvider, System.Reactive.PlatformServices".
// It turns out this doesn't quite work on Silverlight. On the other hand, in .NET Compact Framework 3.5, we mysteriously have to use that path.
//
#if NETCF35
var name = "System.Reactive.PlatformServices.CurrentPlatformEnlightenmentProvider, System.Reactive.PlatformServices";
#else
#if CRIPPLED_REFLECTION && HAS_WINRT
var ifType = typeof(IPlatformEnlightenmentProvider).GetTypeInfo();
#else
var ifType = typeof(IPlatformEnlightenmentProvider);
#endif
var asm = new AssemblyName(ifType.Assembly.FullName);
asm.Name = "System.Reactive.PlatformServices";
var name = "System.Reactive.PlatformServices.CurrentPlatformEnlightenmentProvider, " + asm.FullName;
#endif
var t = Type.GetType(name, false);
if (t != null)
s_current = (IPlatformEnlightenmentProvider)Activator.CreateInstance(t);
else
s_current = new DefaultPlatformEnlightenmentProvider();
}
}
}
return s_current;
}
set
{
lock (s_gate)
{
s_current = value;
}
}
}
}
class DefaultPlatformEnlightenmentProvider : IPlatformEnlightenmentProvider
{
public T GetService(object[] args) where T : class
{
return null;
}
}
}