Vehicle routing problem solver
LicenseInitializer.vb
' Copyright 2012 ESRI
' 
' All rights reserved under the copyright laws of the United States
' and applicable international laws, treaties, and conventions.
' 
' You may freely redistribute and use this sample code, with or
' without modification, provided you include the original copyright
' notice and use restrictions.
' 
' See the use restrictions.
' 

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