[C#]
LicenseInitializer.cs
using System;
using System.Collections.Generic;
using System.Text;
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 ClosestFacility_GISServerAPI
{
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
Option Explicit On
Imports ESRI.ArcGIS.esriSystem
Imports System
Imports System.Collections.Generic
Imports System.Diagnostics
'FILE AUTOMATICALLY GENERATED BY ESRI LICENSE INITIALIZATION ADDIN
'YOU SHOULD NOT NORMALLY EDIT OR REMOVE THIS FILE FROM THE PROJECT
Friend 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 Dictionary(Of esriLicenseProductCode, esriLicenseStatus) = New Dictionary(Of esriLicenseProductCode, esriLicenseStatus)()
Private m_extensionStatus As Dictionary(Of esriLicenseExtensionCode, esriLicenseStatus) = 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 = CInt(code)
If Not m_requestedProducts.Contains(requestCodeNum) Then
m_requestedProducts.Add(requestCodeNum)
End If
Next
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
Dim licenseInfo As ILicenseInformation = CType(m_AoInit, ILicenseInformation)
If m_productStatus Is Nothing OrElse m_productStatus.Count = 0 Then
prodStatus = MessageNoLicensesRequested + Environment.NewLine
ElseIf (m_productStatus.ContainsValue(esriLicenseStatus.esriLicenseAlreadyInitialized) _
Or m_productStatus.ContainsValue(esriLicenseStatus.esriLicenseCheckedOut)) Then
prodStatus = ReportInformation(licenseInfo, _
m_AoInit.InitializedProduct(), esriLicenseStatus.esriLicenseCheckedOut) _
+ Environment.NewLine
Else
'Failed...
For Each item As KeyValuePair(Of esriLicenseProductCode, esriLicenseStatus) In m_productStatus
prodStatus += ReportInformation(licenseInfo, item.Key, item.Value) + Environment.NewLine
Next
End If
Dim extStatus As String = String.Empty
For Each item As KeyValuePair(Of esriLicenseExtensionCode, esriLicenseStatus) In m_extensionStatus
Dim info As String = ReportInformation(licenseInfo, item.Key, item.Value)
If Not String.IsNullOrEmpty(info) Then
extStatus += info + Environment.NewLine
End If
Next
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
'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
m_requestedProducts.Clear()
m_requestedExtensions.Clear()
m_extensionStatus.Clear()
m_productStatus.Clear()
m_AoInit.Shutdown()
m_hasShutDown = True
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
If m_hasInitializeProduct Then
Return CheckOutLicenses(Me.InitializedProduct)
Else
Return False
End If
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
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
m_hasInitializeProduct = True
Return False
End If
Dim currentProduct As esriLicenseProductCode = 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 Or _
status = esriLicenseStatus.esriLicenseCheckedOut) Then
productInitialized = True
currentProduct = m_AoInit.InitializedProduct()
End If
End If
m_productStatus.Add(prod, status)
If productInitialized Then Exit For
Next
m_hasInitializeProduct = productInitialized
m_requestedProducts.Clear()
'No product is initialized after trying all requested licenses, quit
If Not productInitialized Then Return False
'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 And licenseStatus = esriLicenseStatus.esriLicenseCheckedOut)
If (m_extensionStatus.ContainsKey(ext)) Then
m_extensionStatus(ext) = licenseStatus
Else
m_extensionStatus.Add(ext, licenseStatus)
End If
Next
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
Exit Select
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