'
' Copyright 1999-2004 The Apache Software Foundation
'
' Licensed under the Apache License, Version 2.0 (the "License");
' you may not use this file except in compliance with the License.
' You may obtain a copy of the License at
'
'    http://www.apache.org/licenses/LICENSE-2.0
'
' Unless required by applicable law or agreed to in writing, software
' distributed under the License is distributed on an "AS IS" BASIS,
' WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
' See the License for the specific language governing permissions and
' limitations under the License.
'

' =========================================================================
' Description: Install script for Tomcat ISAPI redirector                              
' Author:      Mladen Turk <mturk@apache.org>                           
' Version:     $Revision$                                           
' =========================================================================

'
' Get a handle to the filters for the server - we process all errors
'
On Error Resume Next

filterName = "jakarta"
filterLib = "bin\isapi_redirect.dll"
  
Function IISInstallFilter(filterDir, filterObject)

    Dim filters
    Set filters = GetObject(filterObject)
    If err Then err.clear
    info "Got Filters " + filters.FilterLoadOrder
    
    '
    ' Create the filter - if it fails then delete it and try again
    '
    name = filterName
    info "Creating Filter  - " + filterName
    Dim filter
    Set filter = filters.Create( "IISFilter", filterName )
    If err Then
    	err.clear
    	info "Filter exists - deleting"
    	filters.delete "IISFilter", filterName
    	If err Then
    	    info "Error Deleting Filter"
    	    IISInstallFilter = 0
    	    Exit Function
    	End If
    	Set filter = filters.Create( "IISFilter", filterName )
    	If Err Then
    	    info "Error Creating Filter"
    	    IISInstallFilter = 0
    	    Exit Function
    	End If
    End If
    
    '
    ' Set the filter info and save it
    '
    filter.FilterPath = filterDir + filterLib
'    filter.FilterEnabled = true
    filter.FilterDescription = "Jakarta Isapi Redirector"
    filter.NotifyOrderHigh = true
    filter.SetInfo
    info "Created Filter " + filterDir + filterLib
    
    '
    ' Set the load order - only if it's not in the list already
    '
    On Error goto 0
    loadOrders = filters.FilterLoadOrder
    list = Split( loadOrders, "," )
    found = false
    For each item in list
    	If Trim( item ) = filterName Then found = true
    Next
    
    If found = false Then 
    	info "Filter is not in load order - adding now."
    	If Len(loadOrders) <> 0  Then loadOrders = loadOrders + ","
    	filters.FilterLoadOrder = loadOrders + filterName
    	filters.SetInfo
    	info "Added Filter " + filterName 
    Else
    	info "Filter already exists in load order - no update required."
    End If
    IISInstallFilter = 1
End Function

' 
' Helper function for snafus
'
Function fail(message)
'	MsgBox " " + message
	WScript.Quit(1)
End function

'
' Helper function for info
'
Function info(message)
'	MsgBox " " + message
End Function 

info "Installing IIS Filter " + Session.Property("INSTALLDIR")
Dim rv
rv = 0
rv = IISInstallFilter(Session.Property("INSTALLDIR"), "IIS://LocalHost/W3SVC/1/Filters")
If rv = 0 Then    
    rv = IISInstallFilter(Session.Property("INSTALLDIR"), "/LM/W3SVC/Filters")
End If
If rv = 0 Then
    rv = IISInstallFilter(Session.Property("INSTALLDIR"), "/LM/W3SVC/1/Filters")
End If
