ArcObjects Library Reference  

LicenseInitializer

About the Closest facility solver Sample

[C#]

LicenseInitializer.cs

using System;
using System.Collections.Generic;
using ESRI.ArcGIS.esriSystem;

//FILE AUTOMATICALLY GENERATED BY ESRI LICENSE INITIALIZATION ADDIN
//YOU SHOULD NOT NORMALLY EDIT OR REMOVE THIS FILE FROM THE PROJECT

namespace ClosestFacilitySolver
{
	internal sealed class LicenseInitializer
	{
		private IAoInitialize m_AoInit = new AoInitializeClass();

		#region Private members
		private const string MessageNoLicensesRequested = "Product: No licenses were requested";
		private const string MessageProductAvailable = "Product: {0}: Available";
		private const string MessageProductNotLicensed = "Product: {0}: Not Licensed";
		private const string MessageExtensionAvailable = " Extension: {0}: Available";
		private const string MessageExtensionNotLicensed = " Extension: {0}: Not Licensed";
		private const string MessageExtensionFailed = " Extension: {0}: Failed";
		private const string MessageExtensionUnavailable = " Extension: {0}: Unavailable";

		private bool m_hasShutDown = false;
		private bool m_hasInitializeProduct = false;

		private List<int> m_requestedProducts;
		private List<esriLicenseExtensionCode> m_requestedExtensions;
		private Dictionary<esriLicenseProductCode, esriLicenseStatus> m_productStatus = new Dictionary<esriLicenseProductCode, esriLicenseStatus>();
		private Dictionary<esriLicenseExtensionCode, esriLicenseStatus> m_extensionStatus = new Dictionary<esriLicenseExtensionCode, esriLicenseStatus>();

		private bool m_productCheckOrdering = true; //default from low to high
		#endregion

		public bool InitializeApplication(esriLicenseProductCode[] productCodes, esriLicenseExtensionCode[] extensionLics)
		{
			//Cache product codes by enum int so can be sorted without custom sorter
			m_requestedProducts = new List<int>();
			foreach (esriLicenseProductCode code in productCodes)
			{
				int requestCodeNum = Convert.ToInt32(code);
				if (!m_requestedProducts.Contains(requestCodeNum))
				{
					m_requestedProducts.Add(requestCodeNum);
				}
			}

			AddExtensions(extensionLics);
			return Initialize();
		}

		/// <summary>
		/// A summary of the status of product and extensions initialization.
		/// </summary>
		public string LicenseMessage()
		{
			string prodStatus = string.Empty;
			if (m_productStatus == null || m_productStatus.Count == 0)
			{
				prodStatus = MessageNoLicensesRequested + Environment.NewLine;
			}
			else if (m_productStatus.ContainsValue(esriLicenseStatus.esriLicenseAlreadyInitialized)
				|| m_productStatus.ContainsValue(esriLicenseStatus.esriLicenseCheckedOut))
			{
				prodStatus = ReportInformation(m_AoInit as ILicenseInformation,
					m_AoInit.InitializedProduct(),
					esriLicenseStatus.esriLicenseCheckedOut) + Environment.NewLine;
			}
			else
			{
				//Failed...
				foreach (KeyValuePair<esriLicenseProductCode, esriLicenseStatus> item in m_productStatus)
				{
					prodStatus += ReportInformation(m_AoInit as ILicenseInformation,
						item.Key, item.Value) + Environment.NewLine;
				}
			}

			string extStatus = string.Empty;
			foreach (KeyValuePair<esriLicenseExtensionCode, esriLicenseStatus> item in m_extensionStatus)
			{
				string info = ReportInformation(m_AoInit as ILicenseInformation, item.Key, item.Value);
				if (!string.IsNullOrEmpty(info))
					extStatus += info + Environment.NewLine;
			}

			string status = prodStatus + extStatus;
			return status.Trim();
		}

		/// <summary>
		/// Shuts down AoInitialize object and check back in extensions to ensure
		/// any ESRI libraries that have been used are unloaded in the correct order.
		/// </summary>
		/// <remarks>Once Shutdown has been called, you cannot re-initialize the product license
		/// and should not make any ArcObjects call.</remarks>
		public void ShutdownApplication()
		{
			if (m_hasShutDown)
				return;

			//Check back in extensions
			foreach (KeyValuePair<esriLicenseExtensionCode, esriLicenseStatus> item in m_extensionStatus)
			{
				if (item.Value == esriLicenseStatus.esriLicenseCheckedOut)
					m_AoInit.CheckInExtension(item.Key);
			}

			m_requestedProducts.Clear();
			m_requestedExtensions.Clear();
			m_extensionStatus.Clear();
			m_productStatus.Clear();
			m_AoInit.Shutdown();
			m_hasShutDown = true;
			//m_hasInitializeProduct = false;
		}

		/// <summary>
		/// Indicates if the extension is currently checked out.
		/// </summary>
		public bool IsExtensionCheckedOut(esriLicenseExtensionCode code)
		{
			return m_AoInit.IsExtensionCheckedOut(code);
		}

		/// <summary>
		/// Set the extension(s) to be checked out for your ArcObjects code. 
		/// </summary>
		public bool AddExtensions(params esriLicenseExtensionCode[] requestCodes)
		{
			if (m_requestedExtensions == null)
				m_requestedExtensions = new List<esriLicenseExtensionCode>();
			foreach (esriLicenseExtensionCode code in requestCodes)
			{
				if (!m_requestedExtensions.Contains(code))
					m_requestedExtensions.Add(code);
			}

			if (m_hasInitializeProduct)
				return CheckOutLicenses(this.InitializedProduct);

			return false;
		}

		/// <summary>
		/// Check in extension(s) when it is no longer needed.
		/// </summary>
		public void RemoveExtensions(params esriLicenseExtensionCode[] requestCodes)
		{
			if (m_extensionStatus == null || m_extensionStatus.Count == 0)
				return;

			foreach (esriLicenseExtensionCode code in requestCodes)
			{
				if (m_extensionStatus.ContainsKey(code))
				{
					if (m_AoInit.CheckInExtension(code) == esriLicenseStatus.esriLicenseCheckedIn)
					{
						m_extensionStatus[code] = esriLicenseStatus.esriLicenseCheckedIn;
					}
				}
			}
		}

		/// <summary>
		/// Get/Set the ordering of product code checking. If true, check from lowest to 
		/// highest license. True by default.
		/// </summary>
		public bool InitializeLowerProductFirst
		{
			get
			{
				return m_productCheckOrdering;
			}
			set
			{
				m_productCheckOrdering = value;
			}
		}

		/// <summary>
		/// Retrieves the product code initialized in the ArcObjects application
		/// </summary>
		public esriLicenseProductCode InitializedProduct
		{
			get
			{
				try
				{
					return m_AoInit.InitializedProduct();
				}
				catch
				{
					return 0;
				}
			}
		}

		#region Helper methods
		private bool Initialize()
		{
			if (m_requestedProducts == null || m_requestedProducts.Count == 0)
				return false;

			esriLicenseProductCode currentProduct = new esriLicenseProductCode();
			bool productInitialized = false;

			//Try to initialize a product
			ILicenseInformation licInfo = (ILicenseInformation)m_AoInit;

			m_requestedProducts.Sort();
			if (!InitializeLowerProductFirst) //Request license from highest to lowest
				m_requestedProducts.Reverse();

			foreach (int prodNumber in m_requestedProducts)
			{
				esriLicenseProductCode prod = (esriLicenseProductCode)Enum.ToObject(typeof(esriLicenseProductCode), prodNumber);
				esriLicenseStatus status = m_AoInit.IsProductCodeAvailable(prod);
				if (status == esriLicenseStatus.esriLicenseAvailable)
				{
					status = m_AoInit.Initialize(prod);
					if (status == esriLicenseStatus.esriLicenseAlreadyInitialized ||
						status == esriLicenseStatus.esriLicenseCheckedOut)
					{
						productInitialized = true;
						currentProduct = m_AoInit.InitializedProduct();
					}
				}

				m_productStatus.Add(prod, status);

				if (productInitialized)
					break;
			}

			m_hasInitializeProduct = productInitialized;
			m_requestedProducts.Clear();

			//No product is initialized after trying all requested licenses, quit
			if (!productInitialized)
			{
				return false;
			}

			//Check out extension licenses
			return CheckOutLicenses(currentProduct);
		}

		private bool CheckOutLicenses(esriLicenseProductCode currentProduct)
		{
			bool allSuccessful = true;
			//Request extensions
			if (m_requestedExtensions != null && currentProduct != 0)
			{
				foreach (esriLicenseExtensionCode ext in m_requestedExtensions)
				{
					esriLicenseStatus licenseStatus = m_AoInit.IsExtensionCodeAvailable(currentProduct, ext);
					if (licenseStatus == esriLicenseStatus.esriLicenseAvailable)//skip unavailable extensions
					{
						licenseStatus = m_AoInit.CheckOutExtension(ext);
					}
					allSuccessful = (allSuccessful && licenseStatus == esriLicenseStatus.esriLicenseCheckedOut);
					if (m_extensionStatus.ContainsKey(ext))
						m_extensionStatus[ext] = licenseStatus;
					else
						m_extensionStatus.Add(ext, licenseStatus);
				}

				m_requestedExtensions.Clear();
			}

			return allSuccessful;
		}


		private string ReportInformation(ILicenseInformation licInfo,
		   esriLicenseProductCode code, esriLicenseStatus status)
		{
			string prodName = string.Empty;
			try
			{
				prodName = licInfo.GetLicenseProductName(code);
			}
			catch
			{
				prodName = code.ToString();
			}

			string statusInfo = string.Empty;

			switch (status)
			{
				case esriLicenseStatus.esriLicenseAlreadyInitialized:
				case esriLicenseStatus.esriLicenseCheckedOut:
					statusInfo = string.Format(MessageProductAvailable, prodName);
					break;
				default:
					statusInfo = string.Format(MessageProductNotLicensed, prodName);
					break;
			}

			return statusInfo;
		}
		private string ReportInformation(ILicenseInformation licInfo,
			esriLicenseExtensionCode code, esriLicenseStatus status)
		{
			string extensionName = string.Empty;
			try
			{
				extensionName = licInfo.GetLicenseExtensionName(code);
			}
			catch
			{
				extensionName = code.ToString();
			}

			string statusInfo = string.Empty;

			switch (status)
			{
				case esriLicenseStatus.esriLicenseAlreadyInitialized:
				case esriLicenseStatus.esriLicenseCheckedOut:
					statusInfo = string.Format(MessageExtensionAvailable, extensionName);
					break;
				case esriLicenseStatus.esriLicenseCheckedIn:
					break;
				case esriLicenseStatus.esriLicenseUnavailable:
					statusInfo = string.Format(MessageExtensionUnavailable, extensionName);
					break;
				case esriLicenseStatus.esriLicenseFailure:
					statusInfo = string.Format(MessageExtensionFailed, extensionName);
					break;
				default:
					statusInfo = string.Format(MessageExtensionNotLicensed, extensionName);
					break;
			}

			return statusInfo;
		}
		#endregion

	}
}
[Visual Basic .NET]

LicenseInitializer.vb

Imports Microsoft.VisualBasic
Imports System
Imports System.Collections.Generic
Imports System.Text
Imports ESRI.ArcGIS.esriSystem

'FILE AUTOMATICALLY GENERATED BY ESRI LICENSE INITIALIZATION ADDIN
'YOU SHOULD NOT NORMALLY EDIT OR REMOVE THIS FILE FROM THE PROJECT


Public NotInheritable Class LicenseInitializer
	Private m_AoInit As IAoInitialize = New AoInitializeClass()

#Region "Private members"
	Private Const MessageNoLicensesRequested As String = "Product: No licenses were requested"
	Private Const MessageProductAvailable As String = "Product: {0}: Available"
	Private Const MessageProductNotLicensed As String = "Product: {0}: Not Licensed"
	Private Const MessageExtensionAvailable As String = " Extension: {0}: Available"
	Private Const MessageExtensionNotLicensed As String = " Extension: {0}: Not Licensed"
	Private Const MessageExtensionFailed As String = " Extension: {0}: Failed"
	Private Const MessageExtensionUnavailable As String = " Extension: {0}: Unavailable"

	Private m_hasShutDown As Boolean = False
	Private m_hasInitializeProduct As Boolean = False

	Private m_requestedProducts As List(Of Integer)
	Private m_requestedExtensions As List(Of esriLicenseExtensionCode)
	Private m_productStatus As New Dictionary(Of esriLicenseProductCode, esriLicenseStatus)()
	Private m_extensionStatus As New Dictionary(Of esriLicenseExtensionCode, esriLicenseStatus)()

	Private m_productCheckOrdering As Boolean = True 'default from low to high
#End Region

	Public Function InitializeApplication(ByVal productCodes() As esriLicenseProductCode, ByVal extensionLics() As esriLicenseExtensionCode) As Boolean
		'Cache product codes by enum int so can be sorted without custom sorter
		m_requestedProducts = New List(Of Integer)()
		For Each code As esriLicenseProductCode In productCodes
			Dim requestCodeNum As Integer = Convert.ToInt32(code)
			If (Not m_requestedProducts.Contains(requestCodeNum)) Then
				m_requestedProducts.Add(requestCodeNum)
			End If
		Next code

		AddExtensions(extensionLics)
		Return Initialize()
	End Function

	''' <summary>
	''' A summary of the status of product and extensions initialization.
	''' </summary>
	Public Function LicenseMessage() As String
		Dim prodStatus As String = String.Empty
		If m_productStatus Is Nothing OrElse m_productStatus.Count = 0 Then
			prodStatus = MessageNoLicensesRequested & Environment.NewLine
		ElseIf m_productStatus.ContainsValue(esriLicenseStatus.esriLicenseAlreadyInitialized) OrElse m_productStatus.ContainsValue(esriLicenseStatus.esriLicenseCheckedOut) Then
			prodStatus = ReportInformation(TryCast(m_AoInit, ILicenseInformation), m_AoInit.InitializedProduct(), esriLicenseStatus.esriLicenseCheckedOut) & Environment.NewLine
		Else
			'Failed...
			For Each item As KeyValuePair(Of esriLicenseProductCode, esriLicenseStatus) In m_productStatus
				prodStatus &= ReportInformation(TryCast(m_AoInit, ILicenseInformation), item.Key, item.Value) & Environment.NewLine
			Next item
		End If

		Dim extStatus As String = String.Empty
		For Each item As KeyValuePair(Of esriLicenseExtensionCode, esriLicenseStatus) In m_extensionStatus
			Dim info As String = ReportInformation(TryCast(m_AoInit, ILicenseInformation), item.Key, item.Value)
			If (Not String.IsNullOrEmpty(info)) Then
				extStatus &= info & Environment.NewLine
			End If
		Next item

		Dim status As String = prodStatus & extStatus
		Return status.Trim()
	End Function

	''' <summary>
	''' Shuts down AoInitialize object and check back in extensions to ensure
	''' any ESRI libraries that have been used are unloaded in the correct order.
	''' </summary>
	''' <remarks>Once Shutdown has been called, you cannot re-initialize the product license
	''' and should not make any ArcObjects call.</remarks>
	Public Sub ShutdownApplication()
		If m_hasShutDown Then
			Return
		End If

		'Check back in extensions
		For Each item As KeyValuePair(Of esriLicenseExtensionCode, esriLicenseStatus) In m_extensionStatus
			If item.Value = esriLicenseStatus.esriLicenseCheckedOut Then
				m_AoInit.CheckInExtension(item.Key)
			End If
		Next item

		m_requestedProducts.Clear()
		m_requestedExtensions.Clear()
		m_extensionStatus.Clear()
		m_productStatus.Clear()
		m_AoInit.Shutdown()
		m_hasShutDown = True
		'm_hasInitializeProduct = false;
	End Sub

	''' <summary>
	''' Indicates if the extension is currently checked out.
	''' </summary>
	Public Function IsExtensionCheckedOut(ByVal code As esriLicenseExtensionCode) As Boolean
		Return m_AoInit.IsExtensionCheckedOut(code)
	End Function

	''' <summary>
	''' Set the extension(s) to be checked out for your ArcObjects code. 
	''' </summary>
	Public Function AddExtensions(ByVal ParamArray requestCodes() As esriLicenseExtensionCode) As Boolean
		If m_requestedExtensions Is Nothing Then
			m_requestedExtensions = New List(Of esriLicenseExtensionCode)()
		End If
		For Each code As esriLicenseExtensionCode In requestCodes
			If (Not m_requestedExtensions.Contains(code)) Then
				m_requestedExtensions.Add(code)
			End If
		Next code

		If m_hasInitializeProduct Then
			Return CheckOutLicenses(Me.InitializedProduct)
		End If

		Return False
	End Function

	''' <summary>
	''' Check in extension(s) when it is no longer needed.
	''' </summary>
	Public Sub RemoveExtensions(ByVal ParamArray requestCodes() As esriLicenseExtensionCode)
		If m_extensionStatus Is Nothing OrElse m_extensionStatus.Count = 0 Then
			Return
		End If

		For Each code As esriLicenseExtensionCode In requestCodes
			If m_extensionStatus.ContainsKey(code) Then
				If m_AoInit.CheckInExtension(code) = esriLicenseStatus.esriLicenseCheckedIn Then
					m_extensionStatus(code) = esriLicenseStatus.esriLicenseCheckedIn
				End If
			End If
		Next code
	End Sub

	''' <summary>
	''' Get/Set the ordering of product code checking. If true, check from lowest to 
	''' highest license. True by default.
	''' </summary>
	Public Property InitializeLowerProductFirst() As Boolean
		Get
			Return m_productCheckOrdering
		End Get
		Set(ByVal value As Boolean)
			m_productCheckOrdering = value
		End Set
	End Property

	''' <summary>
	''' Retrieves the product code initialized in the ArcObjects application
	''' </summary>
	Public ReadOnly Property InitializedProduct() As esriLicenseProductCode
		Get
			Try
				Return m_AoInit.InitializedProduct()
			Catch
				Return 0
			End Try
		End Get
	End Property

#Region "Helper methods"
	Private Function Initialize() As Boolean
		If m_requestedProducts Is Nothing OrElse m_requestedProducts.Count = 0 Then
			Return False
		End If

		Dim currentProduct As New esriLicenseProductCode()
		Dim productInitialized As Boolean = False

		'Try to initialize a product
		Dim licInfo As ILicenseInformation = CType(m_AoInit, ILicenseInformation)

		m_requestedProducts.Sort()
		If (Not InitializeLowerProductFirst) Then 'Request license from highest to lowest
			m_requestedProducts.Reverse()
		End If

		For Each prodNumber As Integer In m_requestedProducts
			Dim prod As esriLicenseProductCode = CType(System.Enum.ToObject(GetType(esriLicenseProductCode), prodNumber), esriLicenseProductCode)
			Dim status As esriLicenseStatus = m_AoInit.IsProductCodeAvailable(prod)
			If status = esriLicenseStatus.esriLicenseAvailable Then
				status = m_AoInit.Initialize(prod)
				If status = esriLicenseStatus.esriLicenseAlreadyInitialized OrElse status = esriLicenseStatus.esriLicenseCheckedOut Then
					productInitialized = True
					currentProduct = m_AoInit.InitializedProduct()
				End If
			End If

			m_productStatus.Add(prod, status)

			If productInitialized Then
				Exit For
			End If
		Next prodNumber

		m_hasInitializeProduct = productInitialized
		m_requestedProducts.Clear()

		'No product is initialized after trying all requested licenses, quit
		If (Not productInitialized) Then
			Return False
		End If

		'Check out extension licenses
		Return CheckOutLicenses(currentProduct)
	End Function

	Private Function CheckOutLicenses(ByVal currentProduct As esriLicenseProductCode) As Boolean
		Dim allSuccessful As Boolean = True
		'Request extensions
		If m_requestedExtensions IsNot Nothing AndAlso currentProduct <> 0 Then
			For Each ext As esriLicenseExtensionCode In m_requestedExtensions
				Dim licenseStatus As esriLicenseStatus = m_AoInit.IsExtensionCodeAvailable(currentProduct, ext)
				If licenseStatus = esriLicenseStatus.esriLicenseAvailable Then 'skip unavailable extensions
					licenseStatus = m_AoInit.CheckOutExtension(ext)
				End If
				allSuccessful = (allSuccessful AndAlso licenseStatus = esriLicenseStatus.esriLicenseCheckedOut)
				If m_extensionStatus.ContainsKey(ext) Then
					m_extensionStatus(ext) = licenseStatus
				Else
					m_extensionStatus.Add(ext, licenseStatus)
				End If
			Next ext

			m_requestedExtensions.Clear()
		End If

		Return allSuccessful
	End Function


	Private Function ReportInformation(ByVal licInfo As ILicenseInformation, ByVal code As esriLicenseProductCode, ByVal status As esriLicenseStatus) As String
		Dim prodName As String = String.Empty
		Try
			prodName = licInfo.GetLicenseProductName(code)
		Catch
			prodName = code.ToString()
		End Try

		Dim statusInfo As String = String.Empty

		Select Case status
			Case esriLicenseStatus.esriLicenseAlreadyInitialized, esriLicenseStatus.esriLicenseCheckedOut
				statusInfo = String.Format(MessageProductAvailable, prodName)
			Case Else
				statusInfo = String.Format(MessageProductNotLicensed, prodName)
		End Select

		Return statusInfo
	End Function
	Private Function ReportInformation(ByVal licInfo As ILicenseInformation, ByVal code As esriLicenseExtensionCode, ByVal status As esriLicenseStatus) As String
		Dim extensionName As String = String.Empty
		Try
			extensionName = licInfo.GetLicenseExtensionName(code)
		Catch
			extensionName = code.ToString()
		End Try

		Dim statusInfo As String = String.Empty

		Select Case status
			Case esriLicenseStatus.esriLicenseAlreadyInitialized, esriLicenseStatus.esriLicenseCheckedOut
				statusInfo = String.Format(MessageExtensionAvailable, extensionName)
			Case esriLicenseStatus.esriLicenseCheckedIn
			Case esriLicenseStatus.esriLicenseUnavailable
				statusInfo = String.Format(MessageExtensionUnavailable, extensionName)
			Case esriLicenseStatus.esriLicenseFailure
				statusInfo = String.Format(MessageExtensionFailed, extensionName)
			Case Else
				statusInfo = String.Format(MessageExtensionNotLicensed, extensionName)
		End Select

		Return statusInfo
	End Function
#End Region

End Class