Option Public
Option Explicit
Declare Function OSPathNetConstruct Lib "nnotes.dll" (Byval portName As Integer, _
Byval serverName As String, Byval fileName As String, Byval pathName As String) As Integer
Declare Function NSFDbOpen Lib "nnotes.dll" (Byval dbName As String, rethDb As Long) As Integer
Declare Function NSFDbClose Lib "nnotes.dll" (Byval hDb As Long) As Integer
Declare Function NSFDbGetUnreadNoteTable Lib "nnotes.dll" (Byval hDB As Long, _
Byval userName As String, Byval userNameLength As Integer, _
Byval fCreateIfNotAvailable As Boolean, rethUnreadList As Long) As Integer
Declare Function NSFDbGetModifiedNoteTable Lib "nnotes" ( Byval hDB As Long, Byval noteClassMask As Integer, _
Byval startDate As Double, retEndDate As Double, rethTable As Long ) As Integer
Declare Function IDEntries Lib "nnotes" ( Byval hTable As Long ) As Long
Declare Function IDScan Lib "nnotes" ( Byval hTable As Long, Byval tFirstBool As Integer, retID As Long) As Integer
Declare Function OSMemFree Lib "nnotes" (Byval handle As Long) As Integer
Const ERR_MASK = &H3fff
Const PKG_MASK = &H3f00
Const ERRNUM_MASK = &H00ff
Declare Function OSLoadString Lib "nnotes.dll" (Byval hModule As Long, Byval stringCode As Integer, _
Byval retBuffer As String, Byval bufferLength As Integer) As Integer
Class UnreadDocList
Private lastError As String
Public Function getLastError () As String
getLastError = lastError
End Function
Public Function getUnreadInView (view As NotesView, userName As String) As Variant
On Error Goto processError
Dim returnArray() As String
Dim unreadArray As Variant
Redim returnArray(0) As String
unreadArray = getUnreadInDB(view.Parent, userName)
If (unreadArray(0) = "") Then
getUnreadInView = returnArray
Exit Function
End If
Dim viewFlag As Integer
viewFlag = view.AutoUpdate
view.AutoUpdate = False
Dim doc As NotesDocument
Dim viewDocList List As String
Dim count As Integer
Dim i As Integer
Set doc = view.GetFirstDocument
Do Until (doc Is Nothing)
viewDocList(Right("00000000" & doc.NoteID, 8)) = doc.NoteID
Set doc = view.GetNextDocument(doc)
Loop
view.AutoUpdate = viewFlag
For i = 0 To Ubound(unreadArray)
If Iselement(viewDocList(unreadArray(i))) Then
Redim Preserve returnArray(count) As String
returnArray(count) = unreadArray(i)
count = count + 1
End If
Next
getUnreadInView = returnArray
Exit Function
processError:
lastError = Error$
getUnreadInView = returnArray
Exit Function
End Function
Public Function getUnreadInDB (db As NotesDatabase, userName As String) As Variant
Dim hDb As Long
Dim hIDTable As Long
Dim notesUserName As NotesName
Dim longUserName As String
Dim pathName As String*256
Dim noteID As Long
Dim firstFlag As Integer
Dim result As Integer
Dim count As Long
Dim returnArray() As String
Redim returnArray(0) As String
lastError = ""
Call OSPathNetConstruct(0, db.Server, db.FilePath, pathName)
result = NSFDbOpen(pathName, hDb)
If result <> 0 Then
lastError = "Cannot open database " & db.FilePath & " on server " & db.Server & _
". Error was " & Cstr(result) & ": " & GetAPIError( result )
Goto endOfFunction
End If
Set notesUserName = New NotesName(userName)
longUserName = notesUserName.Canonical
result = NSFDbGetUnreadNoteTable(hDB, userName, Len(username), 0, hIDTable)
If result <> 0 Then
lastError = "Cannot open ID Table on " & db.FilePath & " on server " & db.Server & _
". Error was " & Cstr(result) & ": " & GetAPIError( result )
Goto closeDb
End If
count = IDEntries(hIDTable)
If (count = 0) Then
Goto freeIDTable
Else
If (count > 32767) Then
Redim returnArray(32767) As String
Else
Redim returnArray(count) As String
End If
count = 0
End If
firstFlag = True
Do While IDScan(hIDTable, firstFlag, noteID) > 0
returnArray(count) = ConvertNoteID(noteID)
firstFlag = False
count = count + 1
If (count > Ubound(returnArray)) Then
Exit Do
End If
Loop
freeIDTable:
Call OsMemFree(hIDTable)
closeDb:
Call NSFDbClose(hDb)
endOfFunction:
getUnreadInDB = returnArray
Exit Function
End Function
Private Function GetAPIError (errorCode As Integer) As String
Dim errorString As String*256
Dim returnErrorString As String
Dim resultStringLength As Long
Dim errorCodeTranslated As Integer
errorCodeTranslated = (errorCode And ERR_MASK)
resultStringLength = OSLoadString(0, errorCodeTranslated, errorString, Len(errorString) - 1)
If (Instr(errorString, Chr(0)) > 0) Then
returnErrorString = Left$(errorString, Instr(errorString, Chr(0)) - 1)
Else
returnErrorString = errorString
End If
GetAPIError = returnErrorString
End Function
Private Function ConvertNoteID (noteID As Long) As String
Dim noteIDString As String
noteIDString = Hex$(noteID)
noteIDString = String(8 - Len(noteIDString), "0") & noteIDString
ConvertNoteID = noteIDString
End Function
End Class
Sub Initialize
Dim session As New NotesSession
Dim db As NotesDatabase
Dim inbox As NotesView
Dim mailDb As Variant
Dim udc As New UnreadDocList
Dim unreadArray As Variant
mailDb = Evaluate("@MailDbName")
Set db = session.GetDatabase(mailDb(0), mailDb(1))
Set inbox = db.GetView("($Inbox)")
unreadArray = udc.getUnreadInView(inbox, session.EffectiveUserName)
If (Len(udc.getLastError()) > 0) Then
Print "There was an error: " & udc.getLastError()
End If
If (unreadArray(0) = "") Then
Print "There are 0 unread docs in your inbox"
Else
Print "There are " & (Ubound(unreadArray) + 1) & " unread docs in your inbox"
End If
End Sub
This LotusScript was converted to HTML using the ls2html routine,
provided by Julian Robichaux at nsftools.com.