a575963da9
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
212 lines
6.4 KiB
C#
212 lines
6.4 KiB
C#
//
|
|
// System.ComponentModel.LicenseManager.cs
|
|
//
|
|
// Authors:
|
|
// Ivan Hamilton (ivan@chimerical.com.au)
|
|
// Martin Willemoes Hansen (mwh@sysrq.dk)
|
|
// Andreas Nahr (ClassDevelopment@A-SoftTech.com)
|
|
//
|
|
// (C) 2004 Ivan Hamilton
|
|
// (C) 2003 Martin Willemoes Hansen
|
|
// (C) 2003 Andreas Nahr
|
|
//
|
|
|
|
//
|
|
// Permission is hereby granted, free of charge, to any person obtaining
|
|
// a copy of this software and associated documentation files (the
|
|
// "Software"), to deal in the Software without restriction, including
|
|
// without limitation the rights to use, copy, modify, merge, publish,
|
|
// distribute, sublicense, and/or sell copies of the Software, and to
|
|
// permit persons to whom the Software is furnished to do so, subject to
|
|
// the following conditions:
|
|
//
|
|
// The above copyright notice and this permission notice shall be
|
|
// included in all copies or substantial portions of the Software.
|
|
//
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
//
|
|
|
|
namespace System.ComponentModel
|
|
{
|
|
public sealed class LicenseManager
|
|
{
|
|
static LicenseContext mycontext;
|
|
static object contextLockUser;
|
|
|
|
static object lockObject = new object ();
|
|
|
|
private LicenseManager ()
|
|
{
|
|
}
|
|
|
|
public static LicenseContext CurrentContext {
|
|
get {
|
|
lock (lockObject) {
|
|
//Tests indicate a System.ComponentModel.Design.RuntimeLicenseContext should be returned.
|
|
if (mycontext==null)
|
|
mycontext = new Design.RuntimeLicenseContext();
|
|
return mycontext;
|
|
}
|
|
}
|
|
set {
|
|
lock (lockObject) {
|
|
if (contextLockUser==null) {
|
|
mycontext = value;
|
|
} else {
|
|
throw new InvalidOperationException("The CurrentContext property of the LicenseManager is currently locked and cannot be changed.");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public static LicenseUsageMode UsageMode {
|
|
get {
|
|
return CurrentContext.UsageMode;
|
|
}
|
|
}
|
|
|
|
public static object CreateWithContext (Type type,
|
|
LicenseContext creationContext)
|
|
{
|
|
return CreateWithContext (type, creationContext, new object [0]);
|
|
}
|
|
|
|
public static object CreateWithContext (Type type,
|
|
LicenseContext creationContext,
|
|
object[] args)
|
|
{
|
|
object newObject = null;
|
|
lock (lockObject) {
|
|
object contextUser = new object ();
|
|
LicenseContext oldContext = CurrentContext;
|
|
CurrentContext = creationContext;
|
|
LockContext (contextUser);
|
|
try {
|
|
newObject = Activator.CreateInstance (type, args);
|
|
} catch (Reflection.TargetInvocationException exception) {
|
|
throw exception.InnerException;
|
|
} finally {
|
|
UnlockContext (contextUser);
|
|
CurrentContext = oldContext;
|
|
}
|
|
}
|
|
return newObject;
|
|
}
|
|
|
|
public static bool IsLicensed (Type type)
|
|
{
|
|
License license = null;
|
|
if (!privateGetLicense (type, null, false, out license)) {
|
|
return false;
|
|
} else {
|
|
if (license != null)
|
|
license.Dispose ();
|
|
return true;
|
|
}
|
|
}
|
|
|
|
public static bool IsValid (Type type)
|
|
//This method does not throw a LicenseException when it cannot grant a valid License
|
|
{
|
|
License license=null;
|
|
if (!privateGetLicense (type, null, false, out license)) {
|
|
return false;
|
|
} else {
|
|
if (license != null)
|
|
license.Dispose ();
|
|
return true;
|
|
}
|
|
}
|
|
|
|
public static bool IsValid (Type type, object instance,
|
|
out License license)
|
|
//This method does not throw a LicenseException when it cannot grant a valid License
|
|
{
|
|
return privateGetLicense (type, null, false, out license);
|
|
}
|
|
|
|
public static void LockContext (object contextUser)
|
|
{
|
|
lock (lockObject) {
|
|
contextLockUser = contextUser;
|
|
}
|
|
}
|
|
|
|
public static void UnlockContext (object contextUser)
|
|
{
|
|
lock (lockObject) {
|
|
//Ignore if we're not locked
|
|
if (contextLockUser == null)
|
|
return;
|
|
//Don't unlock if not locking user
|
|
if (contextLockUser != contextUser)
|
|
throw new ArgumentException ("The CurrentContext property of the LicenseManager can only be unlocked with the same contextUser.");
|
|
//Remove lock
|
|
contextLockUser = null;
|
|
}
|
|
}
|
|
|
|
public static void Validate (Type type)
|
|
// Throws a LicenseException if the type is licensed, but a License could not be granted.
|
|
{
|
|
License license = null;
|
|
if (!privateGetLicense (type, null, true, out license))
|
|
throw new LicenseException (type, null);
|
|
if (license != null)
|
|
license.Dispose ();
|
|
}
|
|
|
|
public static License Validate (Type type, object instance)
|
|
// Throws a LicenseException if the type is licensed, but a License could not be granted.
|
|
{
|
|
License license=null;
|
|
if (!privateGetLicense(type, instance, true, out license))
|
|
throw new LicenseException(type, instance);
|
|
return license;
|
|
}
|
|
|
|
private static bool privateGetLicense (Type type, object instance, bool allowExceptions, out License license)
|
|
//Returns if a component is licensed, and the license if provided
|
|
{
|
|
bool isLicensed = false;
|
|
License foundLicense = null;
|
|
//Get the LicProc Attrib for our type
|
|
LicenseProviderAttribute licenseproviderattribute = (LicenseProviderAttribute) Attribute.GetCustomAttribute(type, typeof (LicenseProviderAttribute), true);
|
|
//Check it's got an attrib
|
|
if (licenseproviderattribute != null) {
|
|
Type licenseprovidertype = licenseproviderattribute.LicenseProvider;
|
|
//Check the attrib has a type
|
|
if (licenseprovidertype != null) {
|
|
//Create the provider
|
|
LicenseProvider licenseprovider = (LicenseProvider) Activator.CreateInstance(licenseprovidertype);
|
|
//Check we've got the provider
|
|
if (licenseprovider != null) {
|
|
//Call provider, throw an LicenseException if error.
|
|
foundLicense = licenseprovider.GetLicense(CurrentContext, type, instance, allowExceptions);
|
|
if (foundLicense != null)
|
|
isLicensed = true;
|
|
//licenseprovider.Dispose();
|
|
} else {
|
|
//There is was some problem creating the provider
|
|
}
|
|
//licenseprovidertype.Dispose();
|
|
} else {
|
|
//licenseprovidertype is null
|
|
}
|
|
//licenseproviderattribute.Dispose ();
|
|
} else {
|
|
//Didn't have a LicenseProviderAttribute, so it's licensed
|
|
isLicensed = true;
|
|
}
|
|
license = foundLicense;
|
|
return isLicensed;
|
|
}
|
|
}
|
|
}
|