Auto Install

The error_handling.lss file I described in a previous post needs to be available on any machine where the script using it will execute. This is due to a weird behavior of the Notes engine when processing the %Include instruction: The inclusion is done at execution time if executing on a client and at compilation time if executing on a server.

It is certainly possible to distribute a file to all the users, explaining in which folder to copy it, but it is much simpler to have the same database that use it to install it whenever needed.

The HelpAbout document is a good place for storing a file. After attaching it, a HideWhen formula will prevent it from showing up to the user. Then a simple (Install error_handling.lss) agent will extract the file to the proper folder (if the folder doesn’t already have one). And the formula @Command( [RunAgent]; "(Install error_handling.lss)" ) in the PostOpen event of the Database Script library will run the agent each time the user opens the database.

Here is the code for the agent:

'Install error_handling.lss: Option Public Option Declare Use "RegistryAccess" Sub Initialize On Error Goto HandleError Goto EnterProc HandleError: Error Err, Getthreadinfo( 1 ) & " : " & Erl & Chr$( 10 ) & Error$ EnterProc: Dim install As String install = "error_handling.lss" Dim notesFolder As String notesFolder = RegQueryValue( "HKEY_LOCAL_MACHINE", "SoftwareLotusNotes", "Path" ) Dim path As String path = notesFolder & install If Dir$( path ) <> "" Then ' exit on library already installed Exit Sub End If Dim s As New NotesSession Dim db As NotesDatabase Set db = s.CurrentDatabase Dim d As notesdocument Set d = GetHelpAboutDocument( db ) If d Is Nothing Then ' exit on library not available in the database Msgbox "The library " & install & " must be installed" & Chr( 10 ) _ & "It's not in the database" & Chr( 10 ) _ & "Contact the administrator of this database" Exit Sub End If Call ExtractAttachment( d, install, path ) If Dir( path ) = "" Then ' exit on file not created Msgbox "The library " & install & " must be installed" & Chr( 10 ) _ & "The file " & path & " couldn't be created" & Chr( 10 ) _ & "Contact the administrator of this database" Exit Sub End If Print "Installed library " & install install = "error_handling_ui.lss" path = notesFolder & install Call ExtractAttachment( d, install, path ) If Dir( path ) = "" Then ' exit on file not created Msgbox "The library " & install & " must be installed" & Chr( 10 ) _ & "The file " & path & " couldn't be created" & Chr( 10 ) _ & "Contact the administrator of this database" Exit Sub End If Print "Installed library " & install End Sub Function GetHelpAboutDocument( db As NotesDatabase ) As NotesDocument On Error Goto HandleError Goto EnterProc HandleError: Error Err, Getthreadinfo( 1 ) & " : " & Erl & Chr$( 10 ) & Error$ EnterProc: Dim nc As NotesNoteCollection Set nc = db.CreateNoteCollection( False ) nc.SelectHelpAbout = True Call nc.BuildCollection Dim nid As String nid = nc.GetFirstNoteId If nid <> "" Then Set GetHelpAboutDocument = db.GetDocumentByID( nid ) Else Set GetHelpAboutDocument = Nothing End If End Function Sub ExtractAttachment( d As NotesDocument, filename As String, path As String ) On Error Goto HandleError Goto EnterProc HandleError: Error Err, Getthreadinfo( 1 ) & " : " & Erl & Chr$( 10 ) & Error$ EnterProc: If Not d.HasEmbedded Then Exit Sub Dim embedded As NotesEmbeddedObject Set embedded = d.GetAttachment( filename ) If embedded Is Nothing Then Exit Sub Call embedded.ExtractFile( path ) End Sub