Option Public Option Declare ' Global variables Dim Session As NotesSession Dim InStream As NotesStream Dim OutStream As NotesStream Dim BlockCounter As Integer Dim ByteOffset As Long Dim IsBigEndian As Boolean Dim IsWindowsPlatform As Boolean Dim PlatformSpecific As String Dim Platform As String Dim RTCDRecordList List As Variant Dim SegmentCounter As Integer ' Bitmap settings Dim Graphic_Version As Integer Dim Bitmap_Width As Long Dim Bitmap_Height As Long Dim Bitmap_BitsPerPixel As Integer Dim Bitmap_SamplesPerPixel As Integer Dim Bitmap_BitsPerSample As Integer Dim Bitmap_SegmentCount As Integer Dim Bitmap_ColorCount As Integer Dim Bitmap_PatternCount As Integer Dim Bitmap_RequiresPallette As Boolean Const CASE_INSENSITIVE = 5 Const DEBUG_OUTFILE = True ' Paragraph Attribute Block Definition Record Const MAXTABS= 20 ' Maximum number of stops in tables Type LSIG Signature As Integer Length As Long End Type Type WSIG Signature As Integer Length As Integer End Type Type BSIG Signature As Byte Length As Byte End Type Type CDBITMAPHEADER Header As LSIG DestWidth As Integer DestHeight As Integer CropWidth As Integer CropHeight As Integer Flags As Integer wReserved As Integer lReserved As Long Width As Integer Height As Integer BitsPerPixel As Integer SamplesPerPixel As Integer BitsPerSample As Integer SegCount As Integer ColorCount As Integer PatternCount As Integer End Type Type CDBITMAPSEGMENT Header As LSIG Reserved(1) As Long ScanlineCount As Integer DataSize As Integer Data As Variant End Type Type CDCOLORTABLE Header As LSIG RGBEntries As Variant End Type Type CDGRAPHIC Header As LSIG DestWidth As Integer DestHeight As Integer CropWidth As Integer CropHeight As Integer CropLeft As Integer CropTop As Integer CropRight As Integer CropBottom As Integer Resized As Integer Version As Byte Flags As Byte wReserved As Integer End Type Type CDIMAGEHEADER Header As LSIG ImageType As Integer Width As Integer Height As Integer ImageDataSize As Long SegCount As Long Flags As Long ' (currently unused) Reserved As Long ' Reserved for future use End Type Type CDIMAGESEGMENT Header As LSIG ' Actual size of image bits in bytes, ignoring any filler DataSize As Integer ' Size of segment. Is equal to or larger than DataSize if filler byte added to ' maintain word boundary SegmentSize As Integer End Type Type CDPATTERNTABLE Header As LSIG PatternEntries As Variant End Type Type CDTRANSPARENTTABLE Header As LSIG Reserved As Integer TransparentCount As Integer TransparentEntries As Variant End Type Type BLOCKID Pool As Long Block As Integer End Type Type ITEMINFO ' Item Information 'pBuffer As Long pBufferZeroOffset As Long ItemBlockID As BLOCKID ItemDataType As Integer ValueBlockID As BLOCKID ValueLength As Long End Type Dim pItemInfo As ITEMINFO Const LEN_BYTE = 1 Const LEN_WORD = 2 Const LEN_DWORD = 4 ' CD Signatures Const LONGRECORDLENGTH = &h0000 Const WORDRECORDLENGTH = &hff00 Const BYTERECORDLENGTH = 1 ' This actually is a value in the range of 1 - 254 Const SIG_INVALID = 0 Const SIG_CD_EMBEDDEDCONTACTLIST = 88 ' | WORDRECORDLENGTH Const SIG_CD_IGNORE = 89 ' | BYTERECORDLENGTH Const SIG_CD_TABLECELL_HREF2 = 90 ' | WORDRECORDLENGTH Const SIG_CD_HREFBORDER = 91 ' | WORDRECORDLENGTH Const SIG_CD_TABLEDATAEXTENSION = 92 ' | WORDRECORDLENGTH Const SIG_CD_EMBEDDEDCALCTL = 93 ' | WORDRECORDLENGTH Const SIG_CD_ACTIONEXT = 94 ' | WORDRECORDLENGTH Const SIG_CD_EVENT_LANGUAGE_ENTRY = 95 ' | WORDRECORDLENGTH Const SIG_CD_FILESEGMENT = 96 ' | LONGRECORDLENGTH Const SIG_CD_FILEHEADER = 97 ' | LONGRECORDLENGTH Const SIG_CD_DATAFLAGS = 98 ' | BYTERECORDLENGTH Const SIG_CD_BACKGROUNDPROPERTIES = 99 ' | BYTERECORDLENGTH Const SIG_CD_EMBEDEXTRA_INFO = 100 ' | WORDRECORDLENGTH Const SIG_CD_CLIENT_BLOBPART = 101 ' | WORDRECORDLENGTH Const SIG_CD_CLIENT_EVENT = 102 ' | WORDRECORDLENGTH Const SIG_CD_BORDERINFO_HS = 103 ' | WORDRECORDLENGTH Const SIG_CD_LARGE_PARAGRAPH = 104 ' | WORDRECORDLENGTH Const SIG_CD_EXT_EMBEDDEDSCHED = 105 ' | WORDRECORDLENGTH Const SIG_CD_BOXSIZE = 106 ' | BYTERECORDLENGTH Const SIG_CD_POSITIONING = 107 ' | BYTERECORDLENGTH Const SIG_CD_LAYER = 108 ' | BYTERECORDLENGTH Const SIG_CD_DECSFIELD = 109 ' | WORDRECORDLENGTH Const SIG_CD_SPAN_END = 110 ' | BYTERECORDLENGTH Const SIG_CD_SPAN_BEGIN = 111 ' | BYTERECORDLENGTH Const SIG_CD_TEXTPROPERTIESTABLE = 112 ' | WORDRECORDLENGTH Const SIG_CD_HREF2 = 113 ' | WORDRECORDLENGTH Const SIG_CD_BACKGROUNDCOLOR = 114 ' | BYTERECORDLENGTH Const SIG_CD_INLINE = 115 ' | WORDRECORDLENGTH Const SIG_CD_V6HOTSPOTBEGIN_CONTINUATION = 116 ' | WORDRECORDLENGTH Const SIG_CD_TARGET_DBLCLK = 117 ' | WORDRECORDLENGTH Const SIG_CD_CAPTION = 118 ' | WORDRECORDLENGTH Const SIG_CD_LINKCOLORS = 119 ' | WORDRECORDLENGTH Const SIG_CD_TABLECELL_HREF = 120 ' | WORDRECORDLENGTH Const SIG_CD_ACTIONBAREXT = 121 ' | WORDRECORDLENGTH Const SIG_CD_IDNAME = 122 ' | WORDRECORDLENGTH Const SIG_CD_TABLECELL_IDNAME = 123 ' | WORDRECORDLENGTH Const SIG_CD_IMAGESEGMENT = 124 ' | LONGRECORDLENGTH Const SIG_CD_IMAGEHEADER = 125 ' | LONGRECORDLENGTH Const SIG_CD_V5HOTSPOTBEGIN = 126 ' | WORDRECORDLENGTH Const SIG_CD_V5HOTSPOTEND = 127 ' | BYTERECORDLENGTH Const SIG_CD_TEXTPROPERTY = 128 ' | WORDRECORDLENGTH Const SIG_CD_PARAGRAPH = 129 ' | BYTERECORDLENGTH Const SIG_CD_PABDEFINITION = 130 ' | WORDRECORDLENGTH Const SIG_CD_PABREFERENCE = 131 ' | BYTERECORDLENGTH Const SIG_CD_TEXT = 133 ' | WORDRECORDLENGTH Const SIG_CD_FONTTABLE = 139 ' | WORDRECORDLENGTH Const SIG_CD_LINK = 140 ' | BYTERECORDLENGTH Const SIG_CD_LINKEXPORT = 141 ' | BYTERECORDLENGTH Const SIG_CD_HEADER = 142 ' | WORDRECORDLENGTH Const SIG_CD_KEYWORD = 143 ' | WORDRECORDLENGTH Const SIG_CD_LINK2 = 145 ' | WORDRECORDLENGTH Const SIG_CD_LINKEXPORT2 = 146 ' | BYTERECORDLENGTH Const SIG_CD_BITMAPHEADER = 149 ' | LONGRECORDLENGTH Const SIG_CD_BITMAPSEGMENT = 150 ' | LONGRECORDLENGTH Const SIG_CD_COLORTABLE = 151 ' | LONGRECORDLENGTH Const SIG_CD_PATTERNTABLE = 152 ' | LONGRECORDLENGTH Const SIG_CD_GRAPHIC = 153 ' | LONGRECORDLENGTH Const SIG_CD_PMMETASEG = 154 ' | LONGRECORDLENGTH Const SIG_CD_WINMETASEG = 155 ' | LONGRECORDLENGTH Const SIG_CD_MACMETASEG = 156 ' | LONGRECORDLENGTH Const SIG_CD_CGMMETA = 157 ' | LONGRECORDLENGTH Const SIG_CD_PMMETAHEADER = 158 ' | LONGRECORDLENGTH Const SIG_CD_WINMETAHEADER = 159 ' | LONGRECORDLENGTH Const SIG_CD_MACMETAHEADER = 160 ' | LONGRECORDLENGTH Const SIG_CD_TABLEBEGIN = 163 ' | BYTERECORDLENGTH Const SIG_CD_TABLECELL = 164 ' | BYTERECORDLENGTH Const SIG_CD_TABLEEND = 165 ' | BYTERECORDLENGTH Const SIG_CD_STYLENAME = 166 ' | BYTERECORDLENGTH Const SIG_CD_HOTSPOTBEGIN = 169 ' | WORDRECORDLENGTH Const SIG_CD_HOTSPOTEND = 170 ' | BYTERECORDLENGTH Const SIG_CD_BUTTON = 171 ' | WORDRECORDLENGTH Const SIG_CD_BAR = 172 ' | WORDRECORDLENGTH Const SIG_CD_V4HOTSPOTBEGIN = 173 ' | WORDRECORDLENGTH Const SIG_CD_V4HOTSPOTEND = 174 ' | BYTERECORDLENGTH Const SIG_CD_EXT_FIELD = 176 ' | WORDRECORDLENGTH Const SIG_CD_LSOBJECT = 177 ' | WORDRECORDLENGTH Const SIG_CD_HTMLHEADER = 178 ' | WORDRECORDLENGTH Const SIG_CD_HTMLSEGMENT = 179 ' | WORDRECORDLENGTH Const SIG_CD_LAYOUT = 183 ' | BYTERECORDLENGTH Const SIG_CD_LAYOUTTEXT = 184 ' | BYTERECORDLENGTH Const SIG_CD_LAYOUTEND = 185 ' | BYTERECORDLENGTH Const SIG_CD_LAYOUTFIELD = 186 ' | BYTERECORDLENGTH Const SIG_CD_PABHIDE = 187 ' | WORDRECORDLENGTH Const SIG_CD_PABFORMREF = 188 ' | BYTERECORDLENGTH Const SIG_CD_ACTIONBAR = 189 ' | BYTERECORDLENGTH Const SIG_CD_ACTION = 190 ' | WORDRECORDLENGTH Const SIG_CD_DOCAUTOLAUNCH = 191 ' | WORDRECORDLENGTH Const SIG_CD_LAYOUTGRAPHIC = 192 ' | BYTERECORDLENGTH Const SIG_CD_OLEOBJINFO = 193 ' | WORDRECORDLENGTH Const SIG_CD_LAYOUTBUTTON = 194 ' | BYTERECORDLENGTH Const SIG_CD_TEXTEFFECT = 195 ' | WORDRECORDLENGTH Const SIG_CD_STORAGELINK = 196 ' | WORDRECORDLENGTH Const SIG_CD_TRANSPARENTTABLE = 197 ' | LONGRECORDLENGTH Const SIG_CD_HORIZONTALRULE = 201 ' | WORDRECORDLENGTH Const SIG_CD_ALTTEXT = 202 ' | WORDRECORDLENGTH Const SIG_CD_ANCHOR = 203 ' | WORDRECORDLENGTH Const SIG_CD_HTMLBEGIN = 204 ' | WORDRECORDLENGTH Const SIG_CD_HTMLEND = 205 ' | WORDRECORDLENGTH Const SIG_CD_HTMLFORMULA = 206 ' | WORDRECORDLENGTH Const SIG_CD_NESTEDTABLEBEGIN = 207 ' | BYTERECORDLENGTH Const SIG_CD_NESTEDTABLECELL = 208 ' | BYTERECORDLENGTH Const SIG_CD_NESTEDTABLEEND = 209 ' | BYTERECORDLENGTH Const SIG_CD_COLOR = 210 ' | BYTERECORDLENGTH Const SIG_CD_TABLECELL_COLOR = 211 ' | BYTERECORDLENGTH Const SIG_CD_BEGIN = 221 ' | BYTERECORDLENGTH Const SIG_CD_END = 222 ' | BYTERECORDLENGTH Const SIG_CD_VERTICALALIGN = 223 ' | BYTERECORDLENGTH Const SIG_CD_FLOATPOSITION= 224 ' | BYTERECORDLENGTH Const SIG_CD_TIMERINFO = 225 ' | BYTERECORDLENGTH Const SIG_CD_TABLEROWHEIGHT = 226 ' | BYTERECORDLENGTH Const SIG_CD_TABLELABEL = 227 ' | WORDRECORDLENGTH Const SIG_CD_BIDI_TEXT = 228 ' | WORDRECORDLENGTH Const SIG_CD_BIDI_TEXTEFFECT= 229 ' | WORDRECORDLENGTH Const SIG_CD_REGIONBEGIN = 230 ' | WORDRECORDLENGTH Const SIG_CD_REGIONEND = 231 ' | WORDRECORDLENGTH Const SIG_CD_TRANSITION = 232 ' | WORDRECORDLENGTH Const SIG_CD_FIELDHINT = 233 ' | WORDRECORDLENGTH Const SIG_CD_PLACEHOLDER = 234 ' | WORDRECORDLENGTH Const SIG_CD_EMBEDDEDOUTLINE = 236 ' | WORDRECORDLENGTH Const SIG_CD_EMBEDDEDVIEW = 237 ' | WORDRECORDLENGTH Const SIG_CD_CELLBACKGROUNDDATA = 238 ' | WORDRECORDLENGTH Const SIG_CD_FRAMESETHEADER = 239 ' | WORDRECORDLENGTH Const SIG_CD_FRAMESET = 240 ' | WORDRECORDLENGTH Const SIG_CD_FRAME = 241 ' | WORDRECORDLENGTH Const SIG_CD_TARGET = 242 ' | WORDRECORDLENGTH Const SIG_CD_MAPELEMENT = 244 ' | WORDRECORDLENGTH Const SIG_CD_AREAELEMENT = 245 ' | WORDRECORDLENGTH Const SIG_CD_HREF = 246 ' | WORDRECORDLENGTH Const SIG_CD_EMBEDDEDCTL = 247 ' | WORDRECORDLENGTH Const SIG_CD_HTML_ALTTEXT = 248 ' | WORDRECORDLENGTH Const SIG_CD_EVENT = 249 ' | WORDRECORDLENGTH Const SIG_CD_PRETABLEBEGIN = 251 ' | WORDRECORDLENGTH Const SIG_CD_BORDERINFO = 252 ' | WORDRECORDLENGTH Const SIG_CD_EMBEDDEDSCHEDCTL = 253 ' | WORDRECORDLENGTH Const SIG_CD_EXT2_FIELD = 254 ' | WORDRECORDLENGTH Const SIG_CD_EMBEDDEDEDITCTL = 255 ' | WORDRECORDLENGTH Class CDRecord ' CD Record class Public ByteOffset As Long Public BytesRead As Long Public HeaderOffset As Long Public HeaderType As String Public ItemRecordNumber As Long Public RecordType As Integer Public RecordTypeDescr As String Public RecordLength As Long Public RecordData As Variant ' Constructor Sub New Me.ByteOffset = 0 Me.BytesRead = 0 Me.HeaderOffset = 0 Me.HeaderType = "" Me.ItemRecordNumber = 0 Me.RecordType = 0 Me.RecordTypeDescr = "" Me.RecordLength = 0 End Sub Function DataItemGet(ItemName As String, DefaultValue As Variant) As Variant ' Get the value for the specified item in the RecordData component ' Error Handler On Error GoTo Error_Handler If Not IsList(Me.RecordData) Then ' RecordData doesn't contain data DataItemGet = DefaultValue Exit Function End If If Not IsElement(Me.RecordData(ItemName)) Then ' RecordData doesn't contain the item DataItemGet = DefaultValue Exit Function End If DataItemGet = Me.RecordData(ItemName) Exit Function Error_Handler: Call CDRecordError("DataItemGet", Erl) DataItemGet = DefaultValue Exit Function End Function Sub DataItemSet(ItemName As String, ItemValue As Variant) ' Set the value for specified item name in the RecordData component ' Error Handler On Error GoTo Error_Handler Me.RecordData(ItemName) = ItemValue Exit Sub Error_Handler: Call CDRecordError("DataItemSet", Erl) Exit Sub End Sub Sub SetSignature(Sig As Integer) ' Set the signature on the record to the specified signature ' Error Handler On Error GoTo Error_Handler Me.RecordType = Sig Exit Sub Error_Handler: Call CDRecordError("SetSignature", Erl) Exit Sub End Sub ' Destructor Sub Delete End Sub ' Error Output Routine Sub CDRecordError(FunctionName As String, ErrorLine As Integer) Call Output_Error("Parse Bitmap CD File - CDRecord (" & FunctionName & ")", Erl, True, False) Exit Sub End Sub End Class Sub Initialize Dim ws As New NotesUIWorkspace Dim RTCDRecord As CDRecord Dim BlockLengths() As Long Dim Buffer As Variant Dim BytesRead As Long Dim BytesToRead As Long Dim ChunkLength As Long Dim DebugFileName As String Dim FileDlgDirectory As String Dim FileFilter As String Dim HeaderLength As Integer Dim i As Long Dim InputFileName As String Dim NumberOfBlocks As Long Dim SelectedFile As Variant Dim TempString As String Dim TempVar As Variant ' Error Handler On Error GoTo Error_Handler ' Initialize common objects Call Initialize_Common() ' Select the file to parse FileDlgDirectory = Session.GetEnvironmentString("FileDlgDirectory", True) FileFilter = "All Files (*.*)|*.*" SelectedFile = ws.OpenFileDialog(False , "Select Bitmap File", FileFilter , FileDlgDirectory) If Not IsArray(SelectedFile) Then Exit Sub End If If Trim(SelectedFile(0)) = "" Then Exit Sub End If InputFileName = SelectedFile(0) If StrLeftBack(InputFileName, "\") <> "" Then Call Session.SetEnvironmentVar("FileDlgDirectory", StrLeftBack(InputFileName, "\"), True) End If Set InStream = Session.Createstream() Call InStream.Open(InputFileName, "Binary") If DEBUG_OUTFILE Then DebugFileName = InputFileName If InStr(1, DebugFileName, ".") > 0 Then DebugFileName = StrLeftBack(DebugFileName, ".") End If DebugFileName = DebugFileName & "-debug.txt" Set OutStream = Session.Createstream() Call OutStream.Open(DebugFileName) OutStream.Truncate End If ' Get the number of blocks Buffer = InStream.Read(LEN_WORD) NumberOfBlocks = ConvertWordByteArray(Buffer) ByteOffset = ByteOffset + LEN_WORD If DEBUG_OUTFILE Then Call OutStream.WriteText("Number of blocks: " & Trim(CStr(NumberOfBlocks)), EOL_PLATFORM) End If ReDim BlockLengths(NumberOfBlocks-1) For i = 1 To NumberOfBlocks ' Get the length of each block Buffer = InStream.Read(LEN_WORD) BlockLengths(i-1) = ConvertWordByteArray(Buffer) ByteOffset = ByteOffset + LEN_WORD If DEBUG_OUTFILE Then Call OutStream.WriteText("Length of block " & Trim(CStr(i)) & ": " & Trim(CStr(BlockLengths(i-1))), EOL_PLATFORM) End If Next ' Skip over the TYPE_COMPOSITE bytes Buffer = InStream.Read(LEN_WORD) If DEBUG_OUTFILE Then TempString = Hex(ByteOffset) If Len(TempString) < 2 Then TempString = "0" & TempString End If Call OutStream.WriteText("TYPE_COMPOSITE flag found at byte offset: " & Trim(CStr(ByteOffset+1)) & " (" & TempString & ")", EOL_PLATFORM) End If ByteOffset = ByteOffset + LEN_WORD If DEBUG_OUTFILE Then Call OutStream.WriteText(" ", EOL_PLATFORM) End If BlockCounter = BlockCounter + 1 SegmentCounter = 0 ' Scan the CD Records in the Rich Text Item Set RTCDRecord = GetFirstCDRecord() While Not RTCDRecord Is Nothing ' Add the CD Record to our list object which contains all the found cd records Set RTCDRecordList(CDbl(Trim(CStr(RTCDRecord.ItemRecordNumber)))) = RTCDRecord If RTCDRecord.RecordTypeDescr = "TYPE_COMPOSITE Flag" Then ' No need to process this cd record any further RTCDRecord.ByteOffset = ByteOffset RTCDRecord.RecordLength = LEN_WORD ByteOffset = ByteOffset + RTCDRecord.RecordLength Else ' Read the bytes for this record - less If RTCDRecord.HeaderType = "WSIG" Then HeaderLength = LEN_WORD * 2 ElseIf RTCDRecord.HeaderType = "BSIG" Then HeaderLength = LEN_BYTE * 2 Else HeaderLength = LEN_WORD + LEN_DWORD End If RTCDRecord.ByteOffset = ByteOffset ByteOffset = ByteOffset + RTCDRecord.RecordLength If InStr(1, "13579", Right(CStr(RTCDRecord.RecordLength), 1)) > 0 Then ByteOffset = ByteOffset + 1 End If Call GetCDRecordData(RTCDRecord) End If If DEBUG_OUTFILE Then TempString = Hex(RTCDRecord.ByteOffset) If Len(TempString) < 2 Then TempString = "0" & TempString End If Call OutStream.WriteText(RTCDRecord.RecordTypeDescr & " (ByteOffset: " & Trim(CStr(RTCDRecord.ByteOffset+1)) & " (" & TempString & "), Length: " & Trim(CStr(RTCDRecord.RecordLength)) & ")", EOL_PLATFORM) If IsList(RTCDRecord.RecordData) Then ForAll v_Data In RTCDRecord.RecordData If ListTag(v_Data) = "RGBColorEntries" Then Call OutStream.WriteText("RGBColorEntries:", EOL_PLATFORM) TempVar = Split(v_Data, ";") For i = 0 To UBound(TempVar) Call OutStream.WriteText(Trim(CStr(i)) & ": " & TempVar(i), EOL_PLATFORM) Next ElseIf ListTag(v_Data) = "PatternEntries" Then Call OutStream.WriteText("PatternEntries:", EOL_PLATFORM) TempVar = Split(v_Data, "~") For i = 0 To UBound(TempVar) Call OutStream.WriteText(Trim(CStr(i)) & ": " & TempVar(i), EOL_PLATFORM) Next ElseIf ListTag(v_Data) = "TransparentEntries" Then Call OutStream.WriteText("TransparentEntries:", EOL_PLATFORM) TempVar = Split(v_Data, ";") For i = 0 To UBound(TempVar) Call OutStream.WriteText(Trim(CStr(i)) & ": " & TempVar(i), EOL_PLATFORM) Next ElseIf ListTag(v_Data) = "BitmapSegmentData" Then Call OutStream.WriteText("Data:", EOL_PLATFORM) Call OutStream.WriteText(v_Data, EOL_PLATFORM) Else Call OutStream.WriteText(ListTag(v_Data) & ": " & v_Data, EOL_PLATFORM) End If End ForAll End If Call OutStream.WriteText(" ", EOL_PLATFORM) End If ' Read in any remaining bytes for the current record BytesToRead = RTCDRecord.RecordLength - RTCDRecord.BytesRead If BytesToRead > 0 Then If BytesToRead > 32000 Then ' Read the bytes in chunks of 32k Do If (BytesToRead - BytesRead) > 32000 Then ChunkLength = 32000 Else ChunkLength = BytesToRead - BytesRead End If Buffer = InStream.Read(ChunkLength) If ChunkLength < 32000 Then Exit Do End If BytesRead = BytesRead + ChunkLength Loop Else Buffer = InStream.Read(BytesToRead) End If End If ' Each cd record must finish on an even byte If InStr(1, "13579", Right(CStr(RTCDRecord.RecordLength), 1)) > 0 Then Buffer = InStream.Read(LEN_BYTE) End If Set RTCDRecord = GetNextCDRecord(RTCDRecord) Wend Call InStream.Close If DEBUG_OUTFILE Then Call OutStream.Close End If Exit Sub Error_Handler: Call Output_Error("Parse Bitmap CD File - Initialize", Erl, True, False) Exit Sub End Sub Public Function HiByte(ByVal wParam As Integer) ' Get the high order byte HiByte = wParam \ &H100 And &HFF& End Function Sub Output_Error(FunctionName As String, ErrorLine As Integer, ErrorFlag1 As Boolean, ErrorFlag2 As Boolean) Print FunctionName & " error on line " & Trim(CStr(ErrorLine)) & ": " & Error$ & " (" & Trim(CStr(Err)) & ")" End Sub Function CDParseImageSegment(RTCDRecord As CDRecord) As Boolean ' Read / parse Image Segment Dim ImageSegment As CDIMAGESEGMENT Dim Buffer As Variant Dim CDRecordData List As String ' Error Handler On Error GoTo Error_Handler ' Datasize Buffer = ReadWord(RTCDRecord) ImageSegment.DataSize = ConvertWordByteArray(Buffer) ' Segment size Buffer = ReadWord(RTCDRecord) ImageSegment.SegmentSize = ConvertWordByteArray(Buffer) ' Set the data in the returned CDImage object CDRecordData("DataSize") = CStr(ImageSegment.DataSize) CDRecordData("SegmentSize") = CStr(ImageSegment.SegmentSize) ' Add the data to the CD Record RTCDRecord.RecordData = CDRecordData CDParseImageSegment = True Exit Function Error_Handler: Call Output_Error("RichText Functions Script Library - CDParseImageSegment", Erl, True, False) Exit Function End Function Public Function LoByte(ByVal wParam As Integer) ' Get the low order byte LoByte = wParam And &HFF& End Function Function CDParseTransparentTable(RTCDRecord As CDRecord) As Boolean Dim TransparentTable As CDTRANSPARENTTABLE Dim Buffer As Variant Dim BytesRead As Long Dim CDRecordData List As String Dim ColorBlue As Integer Dim ColorGreen As Integer Dim ColorRed As Integer Dim ChunkLength As Long Dim i As Integer Dim TempString As String ' Error Handler On Error GoTo Error_Handler ' Reserved Buffer = ReadWord(RTCDRecord) TransparentTable.Reserved = ConvertWordByteArray(Buffer) ' Transparent Count Buffer = ReadWord(RTCDRecord) TransparentTable.TransparentCount = ConvertWordByteArray(Buffer) If TransparentTable.TransparentCount <= 0 Then CDParseTransparentTable = True Exit Function End If ReDim TransparentTable.TransparentEntries(TransparentTable.TransparentCount-1) ' Each byte is a color value in the range 0 to 255. For i = 1 To TransparentTable.TransparentCount Buffer = ReadBytes(3, RTCDRecord) ' Red (byte 0) ColorRed = CInt(Buffer(0)) ' Green (byte 1) ColorGreen = CInt(Buffer(1)) ' Blue (byte 2) ColorBlue = CInt(Buffer(2)) If TempString <> "" Then TempString = TempString & ";" End If TempString = TempString & "[" & Trim(CStr(ColorRed)) & "," & Trim(CStr(ColorGreen)) & "," & Trim(CStr(ColorBlue)) & "]" TransparentTable.TransparentEntries(i-1) = Trim(CStr(ColorRed)) & "," & Trim(CStr(ColorGreen)) & "," & Trim(CStr(ColorBlue)) Next ' Set the data in the returned CDRecord object CDRecordData("TransparentEntries") = TempString ' Add the data to the CD Record RTCDRecord.RecordData = CDRecordData CDParseTransparentTable = True Exit Function Error_Handler: Call Output_Error("RichText Functions Script Library - CDParseTransparentTable", Erl, True, False) Exit Function End Function Function CDParseBitmapHeader(RTCDRecord As CDRecord) As Boolean ' Read / Parse the CDBitmapHeader record Dim BitmapHeader As CDBITMAPHEADER Dim Buffer As Variant Dim CDRecordData List As String ' Error Handler On Error GoTo Error_Handler ' Destination Bitmap Width in PELS Buffer = ReadWord(RTCDRecord) BitmapHeader.DestWidth = ConvertWordByteArray(Buffer) ' Destination Bitmap Height in PELS Buffer = ReadWord(RTCDRecord) BitmapHeader.DestHeight = ConvertWordByteArray(Buffer) ' Crop Width (unused) Buffer = ReadWord(RTCDRecord) BitmapHeader.CropWidth = ConvertWordByteArray(Buffer) ' Crop Height (unused) Buffer = ReadWord(RTCDRecord) BitmapHeader.CropHeight = ConvertWordByteArray(Buffer) ' Flags - CDBITMAP_FLAGS (version 2 and later). If CDBITMAP_FLAG_REQUIRES_PALETTE is set, the color table is required Buffer = ReadWord(RTCDRecord) BitmapHeader.Flags = ConvertWordByteArray(Buffer) ' wReserved Buffer = ReadWord(RTCDRecord) BitmapHeader.wReserved = ConvertWordByteArray(Buffer) ' wReserved Buffer = ReadDWord(RTCDRecord) BitmapHeader.lReserved = ConvertDWordByteArray(Buffer) ' Width of bitmap in PELS Buffer = ReadWord(RTCDRecord) BitmapHeader.Width = ConvertWordByteArray(Buffer) ' Height Buffer = ReadWord(RTCDRecord) BitmapHeader.Height = ConvertWordByteArray(Buffer) ' Bits per Pixel - Bits per PEL, must be 1,8 or 16 ' Notes displays 3 types of bitmaps: monochrome, color And grey scale. ' All monochome bitmaps are one bit per pixel. Color bitmaps can be either 8 bits per Pel (color ' mapped) Or 16 bits per pel "quasi true" color. Grey scale bitmaps ' are simply treated As "color" bitmaps, using the 8 bits per Pel Format ' With a color table whose RGB tuples range From [0,0,0] through ' [255,255,255]. Buffer = ReadWord(RTCDRecord) BitmapHeader.BitsPerPixel = ConvertWordByteArray(Buffer) ' Samples per Pixel - For 1 or 8 BPP, set to 1. For 16 BBP, set to 3 Buffer = ReadWord(RTCDRecord) BitmapHeader.SamplesPerPixel = ConvertWordByteArray(Buffer) ' Bits per Sample - For 1 BPP, set to 1. For 8 BPP set to 8. For 16 BPP, set to 5 Buffer = ReadWord(RTCDRecord) BitmapHeader.BitsPerSample = ConvertWordByteArray(Buffer) ' SegCount - Number of CDBITMAPSEGMENTS Buffer = ReadWord(RTCDRecord) BitmapHeader.SegCount = ConvertWordByteArray(Buffer) ' Color Count - Number of entries in CDCOLORTABLE (0-256) Buffer = ReadWord(RTCDRecord) BitmapHeader.ColorCount = ConvertWordByteArray(Buffer) ' Pattern Count - Number of entries in CDPATTERNTABLE (0-64). Set to 0 if using C API Buffer = ReadWord(RTCDRecord) BitmapHeader.PatternCount = ConvertWordByteArray(Buffer) ' Set the data in the returned CDRecord object CDRecordData("DestWidth") = CStr(BitmapHeader.DestWidth) CDRecordData("DestHeight") = CStr(BitmapHeader.DestHeight) CDRecordData("CropWidth") = CStr(BitmapHeader.CropWidth) CDRecordData("CropHeight") = CStr(BitmapHeader.CropHeight) CDRecordData("Flags") = CStr(BitmapHeader.Flags) CDRecordData("Width") = CStr(BitmapHeader.Width) CDRecordData("Height") = CStr(BitmapHeader.Height) CDRecordData("BitsPerPixel") = CStr(BitmapHeader.BitsPerPixel) CDRecordData("SamplesPerPixel") = CStr(BitmapHeader.SamplesPerPixel) CDRecordData("BitsPerSample") = CStr(BitmapHeader.BitsPerSample) CDRecordData("SegCount") = CStr(BitmapHeader.SegCount) CDRecordData("ColorCount") = CStr(BitmapHeader.ColorCount) CDRecordData("PatternCount") = CStr(BitmapHeader.PatternCount) Bitmap_Width = CLng(BitmapHeader.Width) Bitmap_Height = CLng(BitmapHeader.Height) Bitmap_BitsPerPixel = CInt(BitmapHeader.BitsPerPixel) Bitmap_SamplesPerPixel = CInt(BitmapHeader.SamplesPerPixel) Bitmap_BitsPerSample = CInt(BitmapHeader.BitsPerSample) Bitmap_SegmentCount = CInt(BitmapHeader.SegCount) Bitmap_ColorCount = CInt(BitmapHeader.ColorCount) Bitmap_PatternCount = CInt(BitmapHeader.PatternCount) If CInt(BitmapHeader.Flags) = 1 Then ' Color table is required Bitmap_RequiresPallette = True End If ' Add the data to the CD Record RTCDRecord.RecordData = CDRecordData CDParseBitmapHeader = True Exit Function Error_Handler: Call Output_Error("RichText Functions Script Library - CDParseBitmapHeader", Erl, True, False) Exit Function End Function Function CDParsePatternTable(RTCDRecord As CDRecord) As Boolean Dim PatternTable As CDPATTERNTABLE Dim Buffer As Variant Dim BytesRead As Long Dim CDRecordData List As String Dim ColorBlue As Integer Dim ColorGreen As Integer Dim ColorRed As Integer Dim ChunkLength As Long Dim i As Integer Dim j As Integer Dim TempString As String ' Error Handler On Error GoTo Error_Handler If Bitmap_PatternCount <= 0 Then CDParsePatternTable = True Exit Function End If ReDim PatternTable.PatternEntries(Bitmap_PatternCount-1) ' Each entry in the pattern table occupies 24 bytes For i = 1 To Bitmap_PatternCount Buffer = ReadBytes(24, RTCDRecord) TempString = "" If Bitmap_BitsPerPixel = 16 Then ' All 24 bits are used For j = 0 To 7 ' Red (byte 0) ColorRed = CInt(Buffer(0 + (3*j))) ' Green (byte 1) ColorGreen = CInt(Buffer(1 + (3*j))) ' Blue (byte 2) ColorBlue = CInt(Buffer(2 + (3*j))) If TempString <> "" Then TempString = TempString & ";" End If TempString = TempString & "[" & Trim(CStr(CInt(ColorRed))) & "," & Trim(CStr(CInt(ColorGreen))) & "," & Trim(CStr(CInt(ColorBlue))) & "]" Next Else ' Only the first 8 bits are used ' Each element represents a single byte containing an index into the color table. For j = 0 To 7 If TempString <> "" Then TempString = TempString & "," End If TempString = TempString & Trim(CStr(CInt(Buffer(j)))) Next End If PatternTable.PatternEntries(i-1) = TempString Next ' Set the data in the returned CDRecord object CDRecordData("PatternEntries") = Join(PatternTable.PatternEntries, "~") ' Add the data to the CD Record RTCDRecord.RecordData = CDRecordData CDParsePatternTable = True Exit Function Error_Handler: Call Output_Error("RichText Functions Script Library - CDParsePatternTable", Erl, True, False) Exit Function End Function Function GetCDRecordData(RTCDRecord As CDRecord) As Boolean ' Retrieve the data for the passed CDRecord ' Error Handler On Error GoTo Error_Handler If RTCDRecord.RecordType = SIG_CD_BITMAPHEADER Then ' Bitmap Header Call CDParseBitmapHeader(RTCDRecord) ElseIf RTCDRecord.RecordType = SIG_CD_BITMAPSEGMENT Then ' Bitmap Segment Call CDParseBitmapSegment(RTCDRecord) ElseIf RTCDRecord.RecordType = SIG_CD_COLORTABLE Then ' Color Table Call CDParseColorTable(RTCDRecord) ElseIf RTCDRecord.RecordType = SIG_CD_GRAPHIC Then ' Graphic Call CDParseGraphic(RTCDRecord) ElseIf RTCDRecord.RecordType = SIG_CD_IMAGEHEADER Then ' Image Header Call CDParseImageHeader(RTCDRecord) ElseIf RTCDRecord.RecordType = SIG_CD_IMAGESEGMENT Then ' Image Segment Call CDParseImageSegment(RTCDRecord) ElseIf RTCDRecord.RecordType = SIG_CD_PATTERNTABLE Then ' Pattern Table Call CDParsePatternTable(RTCDRecord) ElseIf RTCDRecord.RecordType = SIG_CD_TRANSPARENTTABLE Then ' Transperent Table Call CDParseTransparentTable(RTCDRecord) End If GetCDRecordData = True Exit Function Error_Handler: Call Output_Error("Parse Bitmap CD File - GetCDRecordData", Erl, True, False) Exit Function End Function Function CDParseBitmapSegment(RTCDRecord As CDRecord) As Boolean ' Read / Parse the CDBitmapSegment record Dim BitmapSegment As CDBITMAPSEGMENT Dim BinaryValue As String Dim Buffer As Variant Dim BytesRead As Long Dim CDRecordData List As String Dim ChunkLength As Long Dim TempString As String ' Error Handler On Error GoTo Error_Handler SegmentCounter = SegmentCounter + 1 ' Reserved Buffer = ReadDWord(RTCDRecord) BitmapSegment.Reserved(0) = ConvertDWordByteArray(Buffer) Buffer = ReadDWord(RTCDRecord) BitmapSegment.Reserved(1) = ConvertDWordByteArray(Buffer) ' Scanline Count Buffer = ReadWord(RTCDRecord) BitmapSegment.ScanlineCount = ConvertWordByteArray(Buffer) ' Data size Buffer = ReadWord(RTCDRecord) BitmapSegment.DataSize = ConvertWordByteArray(Buffer) ' Data If BitmapSegment.DataSize > 0 Then ' Get the flag Buffer = ReadBytes(1, RTCDRecord) TempString = "&H" & CStr(Buffer(0)) BinaryValue = Bin(TempString) BytesRead = 1 ' To be completed If BinaryValue = "00" Then ' 6-bit count of raw (uncompressed) pixels ElseIf BinaryValue = "01" Then ' 14-bit count of pattern entries To repeat (see CDPATTERNTABLE) ElseIf BinaryValue = "10" Then ' 14-bit count of compressed pixels To repeat ElseIf BinaryValue = "11" Then ' 6-bit repeat count of compressed pixels End If ' Read the remaining data Do If BitmapSegment.DataSize - BytesRead > 32000 Then ' Read the bytes in chunks of 32k Do If (BitmapSegment.DataSize - BytesRead) > 32000 Then ChunkLength = 32000 Else ChunkLength = BitmapSegment.DataSize - BytesRead End If Buffer = ReadBytes(ChunkLength, RTCDRecord) BitmapSegment.Data = BitmapSegment.Data & ConvertByteArrayToString(Buffer) If ChunkLength < 32000 Then Exit Do End If BytesRead = BytesRead + ChunkLength Loop Else Buffer = ReadBytes(CLng(BitmapSegment.DataSize - BytesRead), RTCDRecord) BitmapSegment.Data = BitmapSegment.Data & ConvertByteArrayToString(Buffer) BytesRead = BitmapSegment.DataSize End If If BytesRead >= BitmapSegment.DataSize Then Exit Do End If Loop End If ' Set the data in the returned CDRecord object CDRecordData("ScanlineCount") = CStr(BitmapSegment.ScanlineCount) CDRecordData("DataSize") = CStr(BitmapSegment.DataSize) If BinaryValue <> "" Then CDRecordData("BitmapSegmentData") = BinaryValue & ": " & BitmapSegment.Data Else CDRecordData("BitmapSegmentData") = BitmapSegment.Data End If ' Add the data to the CD Record RTCDRecord.RecordData = CDRecordData CDParseBitmapSegment = True Exit Function Error_Handler: Call Output_Error("RichText Functions Script Library - CDParseBitmapSegment", Erl, True, False) Exit Function End Function Function ReadBytes(NumBytes As Long, RTCDRecord As CDRecord) As Variant ' Read the specified number of bytes Dim Buffer As Variant ' Error Handler On Error GoTo Error_Handler Buffer = InStream.Read(NumBytes) RTCDRecord.BytesRead = RTCDRecord.BytesRead + NumBytes ReadBytes = Buffer Exit Function Error_Handler: Call Output_Error("Parse Bitmap CD File - ReadBytes", Erl, True, False) Exit Function End Function Function CDParseImageHeader(RTCDRecord As CDRecord) As Boolean ' Read / Parse the CDImageHeader record Dim ImageHeader As CDIMAGEHEADER Dim Buffer As Variant Dim CDRecordData List As String ' Error Handler On Error GoTo Error_Handler ' Image Type Buffer = ReadWord(RTCDRecord) ImageHeader.ImageType = ConvertWordByteArray(Buffer) ' Width Buffer = ReadWord(RTCDRecord) ImageHeader.Width = ConvertWordByteArray(Buffer) ' Height Buffer = ReadWord(RTCDRecord) ImageHeader.Height = ConvertWordByteArray(Buffer) 'ImageDataSize Buffer = ReadDWord(RTCDRecord) ImageHeader.ImageDataSize = ConvertDWordByteArray(Buffer) ' SegCount Buffer = ReadDWord(RTCDRecord) ImageHeader.SegCount = ConvertDWordByteArray(Buffer) ' Flags Buffer = ReadDWord(RTCDRecord) ImageHeader.Flags = ConvertDWordByteArray(Buffer) ' Reserved Buffer = ReadDWord(RTCDRecord) ImageHeader.Reserved = ConvertDWordByteArray(Buffer) ' Set the data in the return CDRecord object CDRecordData("ImageType") = CStr(ImageHeader.ImageType) CDRecordData("Width") = CStr(ImageHeader.Width) CDRecordData("Height") = CStr(ImageHeader.Height) CDRecordData("ImageDataSize") = CStr(ImageHeader.ImageDataSize) CDRecordData("SegCount") = CStr(ImageHeader.SegCount) CDRecordData("Flags") = CStr(ImageHeader.Flags) ' Add the data to the CD Record RTCDRecord.RecordData = CDRecordData CDParseImageHeader = True Exit Function Error_Handler: Call Output_Error("Parse Bitmap CD File - CDParseImageHeader", Erl, True, False) Exit Function End Function Function Check_IntValue(IntValue As Variant) As Variant ' Checked the passed value to ensure it's a valid integer value. Perform any necessary ' conversion if required ' Error Handler On Error GoTo Error_Handler If IntValue >= -32768 And IntValue <= 32767 Then ' Passed value is within allowed limits Check_IntValue = CInt(IntValue) Exit Function End If ' Perform conversion on the value Check_IntValue = Val("&h" & Hex(IntValue)) Exit Function Error_Handler: Call Output_Error("Parse Bitmap CD File - Check_IntValue", Erl, True, False) Exit Function End Function Function GetNextCDRecord(CurrentCDRecord As CDRecord) As CDRecord Dim ReturnCDRecord As CDRecord Dim Buffer As Variant Dim ItemOffset As Integer Dim ODSOffset As Long Dim ItemRecordNumber As Long Dim OverallRecordNumber As Long ' Error Handler On Error GoTo Error_Handler If CurrentCDRecord Is Nothing Then ' Current record wasn't passed Exit Function End If If InStream.IsEOS Then ' End of file has been reached Exit Function End If ItemRecordNumber = CurrentCDRecord.ItemRecordNumber ' Get starting offset of next record. Each record finishes on an even number of bytes 'ODSOffset = CurrentCDRecord.ItemODSOffset + (CurrentCDRecord.RecordLength + (CurrentCDRecord.RecordLength And 1)) ' Item Data Type Buffer = InStream.Read(LEN_WORD) If Not IsArray(Buffer) Then ' End of file reached Exit Function End If If Buffer(0) = 1 And Buffer(1) = 0 Then ' Type Composite Flag Set ReturnCDRecord = New CDRecord ReturnCDRecord.BytesRead = LEN_WORD ReturnCDRecord.RecordTypeDescr = "TYPE_COMPOSITE Flag" Else pItemInfo.ItemDataType = ConvertWordByteArray(Buffer) Set ReturnCDRecord = ReadCDRecordHeader(Buffer, ItemOffset, ODSOffset) End If ' Advance ODS offset to the next record If Not ReturnCDRecord Is Nothing Then ReturnCDRecord.ItemRecordNumber = ItemRecordNumber+1 End If Set GetNextCDRecord = ReturnCDRecord Exit Function Error_Handler: Call Output_Error("Parse Bitmap CD File - GetNextCDRecord", Erl, True, False) Exit Function End Function Function CDParseColorTable(RTCDRecord As CDRecord) As Boolean Dim ColorTable As CDCOLORTABLE Dim Buffer As Variant Dim BytesRead As Long Dim CDRecordData List As String Dim ColorBlue As Integer Dim ColorGreen As Integer Dim ColorRed As Integer Dim ChunkLength As Long Dim i As Integer Dim TempString As String ' Error Handler On Error GoTo Error_Handler If Bitmap_ColorCount <= 0 Then CDParseColorTable = True Exit Function End If ReDim ColorTable.RGBEntries(Bitmap_ColorCount-1) ' Each byte is a color value in the range 0 to 255. For i = 1 To Bitmap_ColorCount Buffer = ReadBytes(3, RTCDRecord) ' Red (byte 0) ColorRed = CInt(Buffer(0)) ' Green (byte 1) ColorGreen = CInt(Buffer(1)) ' Blue (byte 2) ColorBlue = CInt(Buffer(2)) If TempString <> "" Then TempString = TempString & ";" End If TempString = TempString & "[" & Trim(CStr(ColorRed)) & "," & Trim(CStr(ColorGreen)) & "," & Trim(CStr(ColorBlue)) & "]" ColorTable.RGBEntries(i-1) = Trim(CStr(ColorRed)) & "," & Trim(CStr(ColorGreen)) & "," & Trim(CStr(ColorBlue)) Next ' Set the data in the returned CDRecord object CDRecordData("RGBColorEntries") = TempString ' Add the data to the CD Record RTCDRecord.RecordData = CDRecordData CDParseColorTable = True Exit Function Error_Handler: Call Output_Error("RichText Functions Script Library - CDParseColorTable", Erl, True, False) Exit Function End Function Function Check_LongValue(LongValue As Variant) As Variant ' Checked the passed value to ensure it's a valid long value. Perform any necessary ' conversion if required ' Error Handler On Error GoTo Error_Handler If LongValue >= -2147483648 And LongValue <= 2147483647 Then ' Passed value is within allowed limits Check_LongValue = CLng(LongValue) Exit Function End If ' Perform conversion on the value Check_LongValue = Val("&h" & Hex(LongValue) & "&") Exit Function Error_Handler: Call Output_Error("Parse Bitmap CD File - Check_LongValue", Erl, True, False) Exit Function End Function Function GetODSTypeDescr(LType As Byte) As String Dim ReturnValue As String ' Error Handler On Error GoTo Error_Handler If LType = SIG_CD_EMBEDDEDCONTACTLIST Then ReturnValue = "Embedded Contact List" ElseIf LType = SIG_CD_IGNORE Then ReturnValue = "Ignore" ElseIf LType = SIG_CD_TABLECELL_HREF2 Then ReturnValue = "Tablecell Href" ElseIf LType = SIG_CD_HREFBORDER Then ReturnValue = "Href Border" ElseIf LType = SIG_CD_TABLEDATAEXTENSION Then ReturnValue = "Extended Table Properties" ElseIf LType = SIG_CD_EMBEDDEDCALCTL Then ReturnValue = "Embedded Calendar Control" ElseIf LType = SIG_CD_ACTIONEXT Then ReturnValue = "Extended CDAction Attributes" ElseIf LType = SIG_CD_EVENT_LANGUAGE_ENTRY Then ReturnValue = "CD Event Language" ElseIf LType = SIG_CD_FILESEGMENT Then ReturnValue = "CSS Segment" ElseIf LType = SIG_CD_FILEHEADER Then ReturnValue = "CSS Header" ElseIf LType = SIG_CD_DATAFLAGS Then ReturnValue = "CD Data Flags" ElseIf LType = SIG_CD_BACKGROUNDPROPERTIES Then ReturnValue = "Box Background Data" ElseIf LType = SIG_CD_EMBEDEXTRA_INFO Then ReturnValue = "Extra Embedded Elements Info" ElseIf LType = SIG_CD_CLIENT_BLOBPART Then ReturnValue = "Binary Large Object" ElseIf LType = SIG_CD_CLIENT_EVENT Then ReturnValue = "Client Event" ElseIf LType = SIG_CD_BORDERINFO_HS Then ReturnValue = "Table Border Information" ElseIf LType = SIG_CD_LARGE_PARAGRAPH Then ReturnValue = "Large Paragraph Information" ElseIf LType = SIG_CD_EXT_EMBEDDEDSCHED Then ReturnValue = "Embedded Scheduling Control" ElseIf LType = SIG_CD_BOXSIZE Then ReturnValue = "Layer Box Size Information" ElseIf LType = SIG_CD_POSITIONING Then ReturnValue = "Layer Box Positioning Information" ElseIf LType = SIG_CD_LAYER Then ReturnValue = "Layer Start Record" ElseIf LType = SIG_CD_DECSFIELD Then ReturnValue = "Data Connection Resource Information" ElseIf LType = SIG_CD_SPAN_END Then ReturnValue = "End of Language Information Span" ElseIf LType = SIG_CD_SPAN_BEGIN Then ReturnValue = "Start of Language Information Span" ElseIf LType = SIG_CD_TEXTPROPERTIESTABLE Then ReturnValue = "Text Properties Table" ElseIf LType = SIG_CD_HREF2 Then ReturnValue = "Href2" ElseIf LType = SIG_CD_BACKGROUNDCOLOR Then ReturnValue = "Background Color" ElseIf LType = SIG_CD_INLINE Then ReturnValue = "Shared Resource / Shared Code" ElseIf LType = SIG_CD_V6HOTSPOTBEGIN_CONTINUATION Then ReturnValue = "Hotspot Begin (V6)" ElseIf LType = SIG_CD_TARGET_DBLCLK Then ReturnValue = "Doubleclick Target" ElseIf LType = SIG_CD_CAPTION Then ReturnValue = "Object Caption" ElseIf LType = SIG_CD_LINKCOLORS Then ReturnValue = "HTML Link Colors" ElseIf LType = SIG_CD_TABLECELL_HREF Then ReturnValue = "Tablecell Href" ElseIf LType = SIG_CD_ACTIONBAREXT Then ReturnValue = "Action Bar Attributes" ElseIf LType = SIG_CD_IDNAME Then ReturnValue = "HTML ID" ElseIf LType = SIG_CD_TABLECELL_IDNAME Then ReturnValue = "Tablecell ID Name" ElseIf LType = SIG_CD_IMAGESEGMENT Then ReturnValue = "Image Segment" ElseIf LType = SIG_CD_IMAGEHEADER Then ReturnValue = "Image Header" ElseIf LType = SIG_CD_V5HOTSPOTBEGIN Then ReturnValue = "Hotspot Begin (V5)" ElseIf LType = SIG_CD_V5HOTSPOTEND Then ReturnValue = "Hotspot End (V5)" ElseIf LType = SIG_CD_TEXTPROPERTY Then ReturnValue = "Language Information" ElseIf LType = SIG_CD_PARAGRAPH Then ReturnValue = "Paragraph" ElseIf LType = SIG_CD_PABDEFINITION Then ReturnValue = "Paragraph Definition" ElseIf LType = SIG_CD_PABREFERENCE Then ReturnValue = "Paragraph Definition Reference" ElseIf LType = SIG_CD_TEXT Then ReturnValue = "Text" ElseIf LType = SIG_CD_FONTTABLE Then ReturnValue = "Font Table" ElseIf LType = SIG_CD_LINK Then ReturnValue = "Document Link" ElseIf LType = SIG_CD_LINKEXPORT Then ReturnValue = "Document Link Reference" ElseIf LType = SIG_CD_KEYWORD Then ReturnValue = "Keyword Values" ElseIf LType = SIG_CD_HEADER Then ReturnValue = "Header / Footer" ElseIf LType = SIG_CD_LINK2 Then ReturnValue = "Document Link (2)" ElseIf LType = SIG_CD_LINKEXPORT2 Then ReturnValue = "Document Link Reference (2)" ElseIf LType = SIG_CD_BITMAPHEADER Then ReturnValue = "Bitmap Header" ElseIf LType = SIG_CD_BITMAPSEGMENT Then ReturnValue = "Bitmap Segment" ElseIf LType = SIG_CD_COLORTABLE Then ReturnValue = "Bitmap Color Table" ElseIf LType = SIG_CD_GRAPHIC Then ReturnValue = "Graphic" ElseIf LType = SIG_CD_PMMETASEG Then ReturnValue = "Presentation Manager GPI Metafile Data Segment" ElseIf LType = SIG_CD_WINMETASEG Then ReturnValue = "Windows GDI Metafile Data Segment" ElseIf LType = SIG_CD_MACMETASEG Then ReturnValue = "Macintosh Metafile Data Segment" ElseIf LType = SIG_CD_CGMMETA Then ReturnValue = "CGM Metafile Record" ElseIf LType = SIG_CD_PMMETAHEADER Then ReturnValue = "Presentation Manager GPI Metafile Record Header" ElseIf LType = SIG_CD_WINMETAHEADER Then ReturnValue = "Windows GDI Metafile Record Header" ElseIf LType = SIG_CD_MACMETAHEADER Then ReturnValue = "Macintosh Metafile Data Record Header" ElseIf LType = SIG_CD_TABLEBEGIN Then ReturnValue = "Table Begin" ElseIf LType = SIG_CD_TABLECELL Then ReturnValue = "Tablecell" ElseIf LType = SIG_CD_TABLEEND Then ReturnValue = "Table End" ElseIf LType = SIG_CD_STYLENAME Then ReturnValue = "Paragraph Attributes Block Style" ElseIf LType = SIG_CD_STORAGELINK Then ReturnValue = "Externally Stored Object" ElseIf LType = SIG_CD_TRANSPARENTTABLE Then ReturnValue = "Bitmap Transparency Table" ElseIf LType = SIG_CD_HORIZONTALRULE Then ReturnValue = "Horizontal Rule" ElseIf LType = SIG_CD_ALTTEXT Then ReturnValue = "HTML Alternate Text" ElseIf LType = SIG_CD_ANCHOR Then ReturnValue = "Anchor Hotlink Target" ElseIf LType = SIG_CD_HTMLBEGIN Then ReturnValue = "Passthru HTML Start" ElseIf LType = SIG_CD_HTMLEND Then ReturnValue = "Passthru HTML End" ElseIf LType = SIG_CD_HTMLFORMULA Then ReturnValue = "Formula for attributes or alternate HTML text" ElseIf LType = SIG_CD_NESTEDTABLEBEGIN Then ReturnValue = "Nested Table Begin" ElseIf LType = SIG_CD_NESTEDTABLECELL Then ReturnValue = "Nested Tablecell" ElseIf LType = SIG_CD_NESTEDTABLEEND Then ReturnValue = "Nested Table End" ElseIf LType = SIG_CD_COLOR Then ReturnValue = "Paper Color" ElseIf LType = SIG_CD_TABLECELL_COLOR Then ReturnValue = "Tablecell Background Color" ElseIf LType = SIG_CD_BEGIN Then ReturnValue = "CD Record Begin" ElseIf LType = SIG_CD_END Then ReturnValue = "CD Record End" ElseIf LType = SIG_CD_HREF Then ReturnValue = "Href" ElseIf LType = SIG_CD_VERTICALALIGN Then ReturnValue = "Vertical Alignment Structure" ElseIf LType = SIG_CD_FLOATPOSITION Then ReturnValue = "Float Position" ElseIf LType = SIG_CD_TIMERINFO Then ReturnValue = "Time Interval Information" ElseIf LType = SIG_CD_TABLEROWHEIGHT Then ReturnValue = "Table Row / Height Information" ElseIf LType = SIG_CD_TABLELABEL Then ReturnValue = "Table Label" ElseIf LType = SIG_CD_BIDI_TEXT Then ReturnValue = "Text Reading Order" ElseIf LType = SIG_CD_BIDI_TEXTEFFECT Then ReturnValue = "Special Effect Font Reading Order" ElseIf LType = SIG_CD_REGIONBEGIN Then ReturnValue = "Region Begin" ElseIf LType = SIG_CD_REGIONEND Then ReturnValue = "Region End" ElseIf LType = SIG_CD_TRANSITION Then ReturnValue = "Tablecell TransitionStructure" ElseIf LType = SIG_CD_FIELDHINT Then ReturnValue = "Text Hint" ElseIf LType = SIG_CD_PLACEHOLDER Then ReturnValue = "Embedded Element Additional Information" ElseIf LType = SIG_CD_EMBEDDEDOUTLINE Then ReturnValue = "Embedded Outline" ElseIf LType = SIG_CD_EMBEDDEDVIEW Then ReturnValue = "Embedded View" ElseIf LType = SIG_CD_CELLBACKGROUNDDATA Then ReturnValue = "Table Background Data" ElseIf LType = SIG_CD_FRAMESETHEADER Then ReturnValue = "Preliminary Header Information to CDFRAMESET and CDFRAME Records" ElseIf LType = SIG_CD_FRAMESET Then ReturnValue = "HTML Frameset" ElseIf LType = SIG_CD_FRAME Then ReturnValue = "HTML Frame" ElseIf LType = SIG_CD_TARGET Then ReturnValue = "Target Area for Hotspot Link" ElseIf LType = SIG_CD_MAPELEMENT Then ReturnValue = "Map Element" ElseIf LType = SIG_CD_AREAELEMENT Then ReturnValue = "HTML Area Element" ElseIf LType = SIG_CD_EMBEDDEDCTL Then ReturnValue = "Embedded Control Window" ElseIf LType = SIG_CD_HTML_ALTTEXT Then ReturnValue = "HTML Alternate Tex" ElseIf LType = SIG_CD_EVENT Then ReturnValue = "Simple Action, Formula or LotusScript for an Image Map" ElseIf LType = SIG_CD_PRETABLEBEGIN Then ReturnValue = "Pre Table Begin" ElseIf LType = SIG_CD_BORDERINFO Then ReturnValue = "Table Border Information" ElseIf LType = SIG_CD_EMBEDDEDSCHEDCTL Then ReturnValue = "Embedded Scheduling Control" ElseIf LType = SIG_CD_EXT2_FIELD Then ReturnValue = "Currency & Numerical Symbol Information" ElseIf LType = SIG_CD_EMBEDDEDEDITCTL Then ReturnValue = "Embedded Edit Control" ElseIf LType = SIG_CD_V4HOTSPOTBEGIN Then ReturnValue = "Hotspot Begin (V4)" ElseIf LType = SIG_CD_V4HOTSPOTEND Then ReturnValue = "Hotspot End (V4)" ElseIf LType = SIG_CD_PATTERNTABLE Then ReturnValue = "Bitmap Pattern Table" ElseIf LType = SIG_CD_HOTSPOTBEGIN Then ReturnValue = "Hotspot Begin" ElseIf LType = SIG_CD_HOTSPOTEND Then ReturnValue = "Hotspot End" ElseIf LType = SIG_CD_BUTTON Then ReturnValue = "Button Settings" ElseIf LType = SIG_CD_BAR Then ReturnValue = "Collapsible Section Settings" ElseIf LType = SIG_CD_EXT_FIELD Then ReturnValue = "Extended Field Attributes" ElseIf LType = SIG_CD_LSOBJECT Then ReturnValue = "LotusScript Object Code" ElseIf LType = SIG_CD_HTMLHEADER Then ReturnValue = "HTML Header" ElseIf LType = SIG_CD_HTMLSEGMENT Then ReturnValue = "HTML Segment" ElseIf LType = SIG_CD_LAYOUT Then ReturnValue = "Layout Region Begin" ElseIf LType = SIG_CD_LAYOUTTEXT Then ReturnValue = "Layout Region Text Element" ElseIf LType = SIG_CD_LAYOUTEND Then ReturnValue = "Layout Region End" ElseIf LType = SIG_CD_LAYOUTFIELD Then ReturnValue = "Layout Region Field Definition" ElseIf LType = SIG_CD_PABHIDE Then ReturnValue = "Hide-When Formula" ElseIf LType = SIG_CD_PABFORMREF Then ReturnValue = "Identification for Hide-When Formula and Paragraph Definition Record" ElseIf LType = SIG_CD_ACTIONBAR Then ReturnValue = "Action Bar Attributes" ElseIf LType = SIG_CD_ACTION Then ReturnValue = "Custom Menu Action" ElseIf LType = SIG_CD_DOCAUTOLAUNCH Then ReturnValue = "On-Disk Auto Launch" ElseIf LType = SIG_CD_LAYOUTGRAPHIC Then ReturnValue = "Layuot Region Graphic" ElseIf LType = SIG_CD_OLEOBJINFO Then ReturnValue = "OLE Object" ElseIf LType = SIG_CD_LAYOUTBUTTON Then ReturnValue = "Layout Region Button" ElseIf LType = SIG_CD_TEXTEFFECT Then ReturnValue = "Special Font Effects" Else ReturnValue = "Unknown Type (" & Trim(CStr(LType)) & ")" End If GetODSTypeDescr = ReturnValue Exit Function Error_Handler: Call Output_Error("Parse Bitmap CD File - GetODSTypeDescr", Erl, True, False) Exit Function End Function Function ReadWord(RTCDRecord As CDRecord) As Variant ' Read bytes up the LEN_WORD length Dim Buffer As Variant ' Error Handler On Error GoTo Error_Handler Buffer = InStream.Read(LEN_WORD) RTCDRecord.BytesRead = RTCDRecord.BytesRead + LEN_WORD ReadWord = Buffer Exit Function Error_Handler: Call Output_Error("Parse Bitmap CD File - ReadWord", Erl, True, False) Exit Function End Function Function ConvertByteArrayToString(Buffer As Variant) As String ' Convert the byte array buffer to a string Dim ReturnValue As String ' Error Handler On Error GoTo Error_Handler ForAll v_Byte In Buffer ReturnValue = ReturnValue & CStr(v_Byte) End ForAll ConvertByteArrayToString = ReturnValue Exit Function Error_Handler: Call Output_Error("Parse Bitmap CD File - ConvertByteArrayToString", Erl, True, False) Exit Function End Function Function GetFirstCDRecord() As CDRecord Dim RTCDRecord As CDRecord Dim Buffer As Variant ' Error Handler On Error GoTo Error_Handler ' Read the header for the record Buffer = InStream.Read(LEN_WORD) pItemInfo.ItemDataType = ConvertWordByteArray(Buffer) Set RTCDRecord = ReadCDRecordHeader(Buffer, 1, LEN_WORD) If Not RTCDRecord Is Nothing Then RTCDRecord.ItemRecordNumber = 1 End If Set GetFirstCDRecord = RTCDRecord Exit Function Error_Handler: Call Output_Error("Parse Bitmap CD File - GetFirstCDRecord", Erl, True, False) Exit Function End Function Function ConvertWordByteArray(Buffer As Variant) As Integer Dim ReturnValue As Long ' Error Handler On Error GoTo Error_Handler ReturnValue = Buffer(0) + 256*Buffer(1) ConvertWordByteArray = Check_IntValue(ReturnValue) Exit Function Error_Handler: Call Output_Error("Parse Bitmap CD File - ConvertWordByteArray", Erl, True, False) Exit Function End Function Function ReadCDRecordHeader(InBuffer As Variant, ItemOffset As Integer, ODSOffset As Long) As CDRecord ' Read the header of the CD Record Dim ReturnCDRecord As CDRecord Dim HeaderLSIG As LSIG Dim HeaderWSIG As WSIG Dim HeaderBSIG As BSIG Dim Buffer As Variant Dim IsWSIG As Boolean Dim ODSLength As Long Dim ODSTypeDescr As String Dim RecordOffset As Long Dim SignatureLowByte As Byte Dim SignatureHighByte As Byte ' Error Handler On Error GoTo Error_Handler ' Get the high / low bytes for the CD Record Type ' Signature value (SIG_CD_xxxx) SignatureLowByte = InBuffer(0) ' Header structure SignatureHighByte = InBuffer(1) ' SignatureHighByte of some records was not correctly indicating the length was a WORD (Integer) so need to perform a specific check If SignatureLowByte = SIG_CD_EVENT Then ' Event IsWSIG = True ElseIf SignatureLowByte = SIG_CD_HREF Then ' HREF IsWSIG = True ElseIf SignatureLowByte = SIG_CD_HREFBORDER Then ' HREF IsWSIG = True ElseIf SignatureLowByte = SIG_CD_HREF2 Then ' HREF IsWSIG = True ElseIf SignatureLowByte = SIG_CD_PABDEFINITION Then ' PAB Definition IsWSIG = True ElseIf SignatureLowByte = SIG_CD_TABLECELL_HREF Then ' HREF IsWSIG = True ElseIf SignatureLowByte = SIG_CD_TABLECELL_HREF2 Then ' HREF IsWSIG = True ElseIf SignatureLowByte = SIG_CD_TEXT Then ' Text IsWSIG = True ElseIf SignatureLowByte = SIG_CD_HOTSPOTBEGIN Or SignatureLowByte = SIG_CD_V4HOTSPOTBEGIN Or SignatureLowByte = SIG_CD_V5HOTSPOTBEGIN Then ' Hotspot Begin IsWSIG = True Else IsWSIG = False End If ' Build the CD Record summary object Set ReturnCDRecord = New CDRecord ReturnCDRecord.BytesRead = LEN_WORD ' The header If SignatureHighByte = WORDRECORDLENGTH Or IsWSIG Then ' WSIG ReturnCDRecord.HeaderType = "WSIG" ' Length of Header 2 x Word (Integer) RecordOffset = RecordOffset + (LEN_WORD * 2) Buffer = ReadWord(ReturnCDRecord) HeaderWSIG.Length = ConvertWordByteArray(Buffer) ODSLength = HeaderWSIG.Length ElseIf SignatureHighByte <> LONGRECORDLENGTH Then ' BSIG ReturnCDRecord.HeaderType = "BSIG" ' Length of Header 2 x Byte RecordOffset = RecordOffset + (LEN_BYTE * 2) 'Buffer = Stream.Read(LEN_BYTE * 2) ODSLength = SignatureHighByte Else ' LSIG ReturnCDRecord.HeaderType = "LSIG" ' Length of Header 1 x Word (Integer), 1 x DWord (Long) RecordOffset = RecordOffset + (LEN_WORD + LEN_DWORD) Buffer = ReadDWord(ReturnCDRecord) HeaderLSIG.Length = ConvertDWordByteArray(Buffer) ODSLength = HeaderLSIG.Length End If ' Data in the CD Record starts after the Header Offset ReturnCDRecord.HeaderOffset = RecordOffset ' Length of the CD Record (includes header) ReturnCDRecord.RecordLength = ODSLength ' CD Record type (SIG_CD_xxx) ReturnCDRecord.RecordType = SignatureLowByte ' Description of the CD Record Type ReturnCDRecord.RecordTypeDescr = GetODSTypeDescr(SignatureLowByte) Set ReadCDRecordHeader = ReturnCDRecord Exit Function Error_Handler: Call Output_Error("Parse Bitmap CD File - ReadCDRecordHeader", Erl, True, False) Exit Function End Function Function ConvertDWordByteArray(Buffer As Variant) As Long ' Error Handler On Error GoTo Error_Handler ConvertDWordByteArray = (((Buffer(3) * 256& + Buffer(2)) * 256&) + Buffer(1)) * 256& + Buffer(0) Exit Function Error_Handler: Call Output_Error("Parse Bitmap CD File - ConvertDWordByteArray", Erl, True, False) Exit Function End Function Function CDParseGraphic(RTCDRecord As CDRecord) As Boolean ' Read / Parse the CDGraphic record Dim Graphic As CDGRAPHIC Dim Buffer As Variant Dim CDRecordData List As String ' Error Handler On Error GoTo Error_Handler ' Destination Bitmap Width Buffer = ReadWord(RTCDRecord) Graphic.DestWidth = ConvertWordByteArray(Buffer) ' Destination Bitmap Height Buffer = ReadWord(RTCDRecord) Graphic.DestHeight = ConvertWordByteArray(Buffer) ' Crop Width Buffer = ReadWord(RTCDRecord) Graphic.CropWidth = ConvertWordByteArray(Buffer) ' Crop Height Buffer = ReadWord(RTCDRecord) Graphic.CropHeight = ConvertWordByteArray(Buffer) ' Crop Left Buffer = ReadWord(RTCDRecord) Graphic.CropLeft = ConvertWordByteArray(Buffer) ' Crop Top Buffer = ReadWord(RTCDRecord) Graphic.CropTop = ConvertWordByteArray(Buffer) ' Crop Right Buffer = ReadWord(RTCDRecord) Graphic.CropRight = ConvertWordByteArray(Buffer) ' Crop Bottom Buffer = ReadWord(RTCDRecord) Graphic.CropBottom = ConvertWordByteArray(Buffer) ' Resized Buffer = ReadWord(RTCDRecord) Graphic.Resized = ConvertWordByteArray(Buffer) ' Version Buffer = ReadBytes(1, RTCDRecord) Graphic.Version = Buffer(0) ' Flags Buffer = ReadBytes(1, RTCDRecord) Graphic.Flags = Buffer(0) ' wReserved Buffer = ReadWord(RTCDRecord) Graphic.wReserved = ConvertWordByteArray(Buffer) ' Set the data in the returned CDRecord object CDRecordData("DestWidth") = CStr(Graphic.DestWidth) CDRecordData("DestHeight") = CStr(Graphic.DestHeight) CDRecordData("CropWidth") = CStr(Graphic.CropWidth) CDRecordData("CropHeight") = CStr(Graphic.CropHeight) CDRecordData("CropLeft") = CStr(Graphic.CropLeft) CDRecordData("CropTop") = CStr(Graphic.CropTop) CDRecordData("CropRight") = CStr(Graphic.CropRight) CDRecordData("CropBottom") = CStr(Graphic.CropBottom) CDRecordData("Resized") = CStr(Graphic.Resized) CDRecordData("Version") = CStr(Graphic.Version) CDRecordData("Flags") = CStr(Graphic.Flags) Graphic_Version = CInt(Graphic.Version) ' Add the data to the CD Record RTCDRecord.RecordData = CDRecordData CDParseGraphic = True Exit Function Error_Handler: Call Output_Error("RichText Functions Script Library - CDParseGraphic", Erl, True, False) Exit Function End Function Function ReadDWord(RTCDRecord As CDRecord) As Variant ' Read bytes up the LEN_DWORD length Dim Buffer As Variant ' Error Handler On Error GoTo Error_Handler Buffer = InStream.Read(LEN_DWORD) RTCDRecord.BytesRead = RTCDRecord.BytesRead + LEN_DWORD ReadDWord = Buffer Exit Function Error_Handler: Call Output_Error("Parse Bitmap CD File - ReadDWord", Erl, True, False) Exit Function End Function Sub Initialize_Common Dim ServerProfilesView As NotesView Dim DocCollection As NotesDocumentCollection Dim ServerProfileDoc As NotesDocument Dim ThisDoc As NotesDocument Dim TempVar As Variant Dim TempString As String ' Error Handler On Error GoTo Error_Handler Set Session = New NotesSession ' Get the platform the agent is running on - this is used later if we need to use the DbDesign ' class to get a handle to an agent via its backend document TempVar = Evaluate(|@Platform([SPECIFIC])|) If IsArray(TempVar) Then PlatformSpecific = TempVar(0) End If ' Get the platform name If Session.Platform = "AIX/64" Then Platform = "AIX/64" ElseIf InStr(1, PlatformSpecific, "AIX") > 0 Then Platform = "AIX/64" ElseIf Session.Platform = "Macintosh" Or InStr(1, PlatformSpecific, "Macintosh") > 0 Then Platform = "Macintosh" ElseIf Session.Platform = "Linux/64" Then Platform = "Linux/64" ElseIf InStr(1, PlatformSpecific, "Linux") > 0 Then Platform = "Linux" ElseIf InStr(1, PlatformSpecific, "OS/2", CASE_INSENSITIVE) > 0 Then Platform = "OS/2" ElseIf Session.Platform = "OS/390" Or InStr(1, PlatformSpecific, "OS/390") > 0 Then Platform = "OS/390" ElseIf Session.Platform = "OS/400" Or InStr(1, PlatformSpecific, "OS/400") > 0 Then Platform = "OS/400" ElseIf InStr(1, PlatformSpecific, "Solaris", CASE_INSENSITIVE) > 0 Then Platform = "Solaris/64" ElseIf Session.Platform = "UNIX" Or InStr(1, PlatformSpecific, "Unix", CASE_INSENSITIVE) > 0 Then Platform = "UNIX" ElseIf Session.Platform = "Windows/64" Then Platform = "Windows/64" ElseIf Session.Platform = "Windows/32" Or InStr(1, PlatformSpecific, "Windows", CASE_INSENSITIVE) > 0 Then Platform = "Windows/32" ElseIf PlatformSpecific <> "" Then Platform = PlatformSpecific Else Platform = Session.Platform End If If InStr(1, Platform, "Windows", CASE_INSENSITIVE) > 0 Then IsWindowsPlatform = True Else IsWindowsPlatform = False End If ' Check the platform to determine the handle length and endian-ess If Platform = "AIX" Then ' Handles on AIX platform are 16-bit only IsBigEndian = True ElseIf Platform = "AIX/64" Then ' Handles on AIX/64 platform are 32-bit IsBigEndian = True ElseIf StrComp(PlatformSpecific, "Macintosh/Intel", CASE_INSENSITIVE) = 0 Then ' Macintosh running on Intel processor IsBigEndian = False ElseIf Platform = "Macintosh" Then ' Handles on MAC platform are 16-bit only IsBigEndian = True ElseIf Platform = "Solaris/64" Then IsBigEndian = True ElseIf Platform = "Windows/64" Then IsBigEndian = False Else ' For all other platforms Handles are 32-bit IsBigEndian = False End If Exit Sub Error_Handler: ' An error has occurred Call Output_Error("Parse Bitmap CD File - Initialize_Common", Erl, True, False) Exit Sub End Sub