Contents of lsxsd.lss

I’m looking for either a copy of lsxsd.lss or just the class listing for the stringarray conversion class (STRINGARRAY_HOLDER).

I’m trying to use MSSOAP connecting to a service that requires I pass a string array. LS arrays are not compatible so I’m looking for a way to convert the LS array to a format that the service will accept.

I use Smartsuite and I’d like to see if that code is compatible with the LS included in SS.

TIA,

Keith Seeley

Subject: Contents of lsxsd.lss

Here is the contents of my lsxsd.lss from my notes data directory:

%INCLUDE “lserr.lss”

'--------------------------------------------------------------------

'--------------------------------------------------------------------

’ USEFUL DATA CONVERSIONS USED BY ONE OR MORE XML SCHEMA DATATYPES

'--------------------------------------------------------------------

'--------------------------------------------------------------------

CLASS XSD_DATATYPE_CONVERTER

' Convert bytes in a NotesStream into a base64 string

Function notesStreamToBase64 (ns As NotesStream) As String

	

	Const b64Chars$ = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"

	

	Dim nsLength As Long

	nsLength = ns.Bytes

	ns.Position = 0

	

	Dim numPads As Integer

	numPads = (3 - (nsLength Mod 3)) Mod 3

	

	While nsLength > 0

		

		' Output lines are limited to 76 chars, and because every

		' three input bytes produce 4 output chars we process

		' up to 57 input bytes at a time. (57 = 76 / 4 * 3)

		

		Dim inLength As Long

		inLength = nsLength

		If inLength > 57 Then inLength = 57

		nsLength = nsLength - inLength

		

		Dim outString As String

		outString = ""

		Dim idx As Integer

		idx = 0

		While idx < inLength

			

			' Collect up to 24 bits (3 bytes) of input data

			Dim outBits As Integer

			outBits = 0

			Dim bits24 As Long

			bits24 = 0

			Dim i As Integer

			For i = 0 To 2

				bits24 = bits24 * 256

				If idx + i < inLength Then

					Dim buf As Variant

					buf = ns.Read(1&)

					bits24 = bits24 + buf(0)

					outBits = outBits + 8

				End If

			Next

			idx = idx + 3

			

			Dim numChars As Integer

			numChars = 4

			If outBits <> 24 Then

				numChars = 4 - numPads

			End If

			

			For i = 1 To numChars

				Dim bits6 As Integer

				bits6 = (bits24 And &HFC0000&) / 262144

				outString = outString & Mid$(b64Chars, bits6 + 1, 1)

				bits24 = (bits24 And &H3FFFF&) * 64

			Next

			

			If numChars <> 4 Then

				For i = 1 To numPads

					outString = outString & "="

				Next

			End If

			

		Wend

		

		' Add another line of base64 output to the return string

		notesStreamToBase64 = notesStreamToBase64 & outString & Chr$(13) & Chr$(10)

		

	Wend

	

End Function



' Convert a base64 string into bytes in a NotesStream

Function base64ToNotesStream (b64String As String) As NotesStream

	

	Dim session As New NotesSession

	Dim ns As NotesStream

	Set ns = session.CreateStream

	

	' variables used to stage output to the NotesStream

	Redim buf (0 To 2) As Byte

	Dim numPads As Integer

	numPads = 0

	

	Dim b64Len As Long

	b64Len = Len(b64String)

	

	Dim idx As Long

	idx = 1

	While idx <= b64Len

		

		Dim currChar As String

		currChar = Mid$(b64String, idx, 1)

		

		' Ignore whitespace (CR, LF, SPACE, or TAB) that may lead the line		

		Dim c As Long

		c = Asc(currChar)

		If c = 13 Or c = 10 Or c = 32 Or c = 9 Then

			idx = idx + 1

			Goto Next1

		End If

		

		' Every 4 base64 characters represent 24 bits (three 8-bit bytes)

		Dim bits24 As Long

		bits24 = 0

		Dim i As Integer

		For i = 0 To 3

			Dim bits6 As Long

			c = Asc(Mid$(b64String, idx, 1))

			idx = idx + 1

			

			' Map characters "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"

			' to 6-bit binary values ranging from 0 to 63, respectively

			Select Case c

			Case Asc("A") To Asc("Z")

				bits6 = c - Asc("A")				' map A-Z to 0-25

			Case  Asc("a") To Asc("z")

				bits6 = 26 + c - Asc("a")		' map a-z to 26-51

			Case Asc("0") To Asc("9")

				bits6 = 52 + c - Asc("0")		' map 0-9 to 52-61

			Case Asc("+")

				bits6 = 62		' map "+" to 62

			Case Asc("/")

				bits6 = 63		' map "/" to 63

			Case Asc("=")			' pad char at end of base64

				bits6 = 0

				numPads = numPads + 1

			Case Else

				Error ErrOverflow

			End Select

			bits24 = (bits24 * 64) + bits6

		Next

		

		' Extract three 8-bit bytes from the 24-bit value					

		buf(0) = (bits24 And &HFF0000&) / 65536

		buf(1) = (bits24 And &H00FF00&) / 256

		buf(2) = bits24 And &H0000FF&

		

		' Write up to three 8-bit bytes to the NotesStream					

		Select Case numPads

		Case 0

			Call ns.Write (buf)

		Case 1

			Redim Preserve buf (0 To 1)

			Call ns.Write (buf)

			Goto done

		Case 2

			Redim Preserve buf (0 To 0)

			Call ns.Write (buf)

			Goto done

		End Select

next1:

	Wend

done:

	Set base64ToNotesStream = ns

	

End Function



' Convert bytes in a NotesStream into a hexBinary string

Function notesStreamToHexBinary (ns As NotesStream) As String

	

	Const hexChars$ = "0123456789ABCDEF"

	

	Dim nsLength As Long

	nsLength = ns.Bytes

	ns.Position = 0

	

	While nsLength > 0

		

		' We arbitrarily limit output lines to 76 hex chars

		' by inserting CRLF after processing a run of 38

		' bytes. (Note: whitespace is allowed in hexBinary).

		

		Dim inLength As Long

		inLength = nsLength

		If inLength > 38 Then inLength = 38

		nsLength = nsLength - inLength

		

		Dim outString As String

		outString = ""

		Dim idx As Integer

		idx = 0

		While idx < inLength

			Dim buf As Variant

			buf = ns.Read(1&)

			outString = outString &_

			Mid$(hexChars, (buf(0) And &HF0&)/16+1,1) &_

			Mid$(hexChars, (buf(0) And &HF&)+1,1)

			idx = idx + 1				

		Wend

		

		' Add another line of base64 output to the return string

		notesStreamToHexBinary = notesStreamToHexBinary & outString & Chr$(13) & Chr$(10)

		

	Wend

	

End Function



' Convert a hexBinary string into bytes in a NotesStream

Function hexBinaryToNotesStream (hexString As String) As NotesStream

	

	Dim session As New NotesSession

	Dim ns As NotesStream

	Set ns = session.CreateStream

	

	' variables used to stage output to the NotesStream

	Dim buf (0 To 0) As Byte

	

	Dim hexLen As Long

	hexLen = Len(hexString)

	

	Dim idx As Long

	idx = 1

	While idx <= hexLen

		

		' Ignore whitespace (CR, LF, SPACE, or TAB) that may lead the line		

		Dim c As Long

		c = Asc(Mid$(hexString, idx, 1))

		If c = 13 Or c = 10 Or c = 32 Or c = 9 Then

			idx = idx + 1

			Goto Next1

		End If

		

		' Every 2 hexBinary characters represent 1 8-bit byte

		buf(0) = 0

		Dim i As Integer

		For i = 0 To 1

			buf(0) = buf(0) * 16

			c = Asc(Mid$(hexString, idx+i, 1))

			Select Case c

			Case Asc("0") To Asc("9")

				buf(0) = buf(0) + c - Asc("0")

			Case Asc("A") To Asc("F")

				buf(0) = buf(0) + c - Asc("A") + 10

			End Select

		Next

		idx = idx + 2

		Call ns.Write(buf)

next1:

	Wend

done:

	Set hexBinaryToNotesStream = ns

	

End Function



' Set the date part of a NotesDateTime From "CCYY-MM-DD ..."

Sub setXSDDate (ndt As NotesDateTime, xsddate As String)

	If Not ndt.IsValidDate Then ndt.LocalTime = ""

	Dim timeonly As String

	timeonly = ndt.TimeOnly	' preserve the time part

	ndt.LocalTime = Mid$(xsddate,6,2) & "/" &_

	Mid$(xsddate,9,2) & "/" &_

	Left$(xsddate,4) & " " & timeonly

End Sub



' Return the date part of a NotesDateTime as "CCYY-MM-DD"

Function getXSDDate (ndt As NotesDateTime) As String

	If Not ndt.IsValidDate Then Error ErrTypeMismatch

	Dim vdatetime As Variant

	vdatetime = ndt.LSLocalTime

	getXSDDate = Format$(Year(vdatetime),"0000") & "-" &_

	Format$(Month(vdatetime),"00") & "-" &_

	Format$(Day(vdatetime),"00")

End Function



' Set the time part of a NotesDateTime From "HH:MM:SS ..."

Sub setXSDTime (ndt As NotesDateTime, xsdtime As String)

	If Not ndt.IsValidDate Then ndt.LocalTime = ""

	Dim dateonly As String

	dateonly = ndt.DateOnly	' preserve the date part

	ndt.LocalTime = dateonly & " " &_

	Left$(xsdtime,2) & ":" &_

	Mid$(xsdtime,4,2) & ":" &_

	Mid$(xsdtime,7,2)

End Sub



' Return the time info of a NotesDateTime as "HH:MM:SS"

' Does not compute fractional seconds or timezone info.

Function getXSDTime (ndt As NotesDateTime) As String

	If Not ndt.IsValidDate Then Error ErrTypeMismatch

	Dim vdatetime As Variant

	vdatetime = ndt.LSLocalTime

	getXSDTime = Format$(Hour(vdatetime),"00") & ":" &_

	Format$(Minute(vdatetime),"00") & ":" &_

	Format$(Second(vdatetime),"00")

End Function

END CLASS

'--------------------------------------------------------------------

'--------------------------------------------------------------------

’ ROOT HOLDER CLASS

'--------------------------------------------------------------------

'--------------------------------------------------------------------

PUBLIC CLASS INOUT_HOLDER

END CLASS

'--------------------------------------------------------------------

'--------------------------------------------------------------------

’ ROOT CLASS FOR LOTUSSCRIPT PROXY OBJECTS

'--------------------------------------------------------------------

'--------------------------------------------------------------------

PUBLIC CLASS LS_PROXY_OBJECT

PRIVATE ValueAsString As String



SUB setValueFromString (value As String)

	ValueAsString = value

END SUB



FUNCTION getValueAsString () As String

	getValueAsString = ValueAsString

END FUNCTION

END CLASS

'--------------------------------------------------------------------

'--------------------------------------------------------------------

’ ROOT CLASS AND HOLDER FOR ANY AND ALL XML TYPES

'--------------------------------------------------------------------

'--------------------------------------------------------------------

PUBLIC CLASS XSD_ANYTYPE AS LS_PROXY_OBJECT

END CLASS

PUBLIC CLASS XSD_ANYTYPE_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_ANYTYPE

END CLASS

'--------------------------------------------------------------------

'--------------------------------------------------------------------

’ ROOT FAULT CLASS

'--------------------------------------------------------------------

'--------------------------------------------------------------------

PUBLIC CLASS WS_FAULT

PRIVATE Fault As BOOLEAN

PRIVATE FaultString As STRING



SUB setFault (value As BOOLEAN)

	Fault = value

END SUB



FUNCTION getFault () As BOOLEAN

	getFault = Fault

END FUNCTION



SUB setFaultString (value As STRING)

	FaultString = value

END SUB



FUNCTION getFaultString () As STRING

	getFaultString = FaultString

END FUNCTION

END CLASS

'--------------------------------------------------------------------

'--------------------------------------------------------------------

’ BASE CLASS FOR ALL SIMPLE TYPES

'--------------------------------------------------------------------

'--------------------------------------------------------------------

PUBLIC CLASS XSD_SIMPLETYPE AS XSD_ANYTYPE

END CLASS

PUBLIC CLASS XSD_SIMPLETYPE_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_SIMPLETYPE

END CLASS

'--------------------------------------------------------------------

'--------------------------------------------------------------------

’ ROOT CLASS AND HOLDER FOR LISTS OF SIMPLE TYPES.

’

’ SUBCLASSES MUST DEFINE A 0-BASED ARRAY OF THE APPROPRIATE TYPE

’ AS WELL AS OVERRIDE METHODS THAT ACCESS AND MODIFY THAT ARRAY:

’

’ SUB setListValueFromString (idx As INTEGER, value As STRING)

’ FUNCTION getListValueAsString (idx As INTEGER) As STRING

’ FUNCTION getListLength () As INTEGER

’

'--------------------------------------------------------------------

'--------------------------------------------------------------------

PUBLIC CLASS XSD_LIST AS XSD_SIMPLETYPE

' Return a String with a space-separated concatentation

' of all the non-null items in the list



FUNCTION getValueAsString () As STRING

	IF ME.getListLength > 0 THEN

		DIM i As INTEGER

		DIM count As INTEGER

		FOR i = 0 TO ME.getListLength-1

			IF ME.getListValueAsString(i) <> "" THEN

				IF count > 0 THEN getValueAsString = getValueAsString & " "

				getValueAsString = getValueAsString & ME.getListValueAsString(i)

				count = count+1

			END IF

		NEXT i

	END IF

END FUNCTION



' SUBs and FUNCTIONs that must be overridden by each subclass



SUB setListValueFromString (idx As INTEGER, value As STRING)

	ERROR ErrIllegalOperation

END SUB



FUNCTION getListValueAsString (idx As INTEGER) As STRING

	ERROR ErrIllegalOperation

END FUNCTION



FUNCTION getListLength () As INTEGER

	ERROR ErrIllegalOperation

END FUNCTION

END CLASS

PUBLIC CLASS XSD_LIST_HOLDER AS INOUT_HOLDER

PUBLIC Value As XSD_LIST

END CLASS

'--------------------------------------------------------------------

'--------------------------------------------------------------------

’ SIMPLE TYPES AND HOLDERS

'--------------------------------------------------------------------

'--------------------------------------------------------------------

PUBLIC CLASS XSD_STRING AS XSD_SIMPLETYPE

END CLASS

PUBLIC CLASS XSD_STRING_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_STRING

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_BOOLEAN AS XSD_SIMPLETYPE

END CLASS

PUBLIC CLASS XSD_BOOLEAN_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_BOOLEAN

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_BASE64BINARY AS XSD_SIMPLETYPE

SUB setValueFromNotesStream (nsValue As NotesStream)

	Dim xdtc As New XSD_DATATYPE_CONVERTER

	CALL Me.setValueFromString (xdtc.notesStreamToBase64 (nsValue))

END SUB



FUNCTION getValueAsNotesStream () As NotesStream

	Dim xdtc As New XSD_DATATYPE_CONVERTER

	set getValueAsNotesStream = xdtc.base64ToNotesStream (Me.getValueAsString())

END FUNCTION

END CLASS

PUBLIC CLASS XSD_BASE64BINARY_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_BASE64BINARY

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_HEXBINARY AS XSD_SIMPLETYPE

SUB setValueFromNotesStream (nsValue As NotesStream)

	Dim xdtc As New XSD_DATATYPE_CONVERTER

	CALL Me.setValueFromString (xdtc.notesStreamToHexBinary (nsValue))

END SUB



FUNCTION getValueAsNotesStream () As NotesStream

	Dim xdtc As New XSD_DATATYPE_CONVERTER

	set getValueAsNotesStream = xdtc.hexBinaryToNotesStream (Me.getValueAsString())

END FUNCTION

END CLASS

PUBLIC CLASS XSD_HEXBINARY_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_HEXBINARY

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_FLOAT AS XSD_SIMPLETYPE

END CLASS

PUBLIC CLASS XSD_FLOAT_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_FLOAT

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_DECIMAL AS XSD_SIMPLETYPE

END CLASS

PUBLIC CLASS XSD_DECIMAL_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_DECIMAL

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_DOUBLE AS XSD_SIMPLETYPE

END CLASS

PUBLIC CLASS XSD_DOUBLE_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_DOUBLE

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_ANYURI AS XSD_SIMPLETYPE

END CLASS

PUBLIC CLASS XSD_ANYURI_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_ANYURI

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_QNAME AS XSD_SIMPLETYPE

END CLASS

PUBLIC CLASS XSD_QNAME_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_QNAME

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_NOTATION AS XSD_SIMPLETYPE

END CLASS

PUBLIC CLASS XSD_NOTATION_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_NOTATION

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_DURATION AS XSD_SIMPLETYPE

END CLASS

PUBLIC CLASS XSD_DURATION_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_DURATION

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_DATETIME AS XSD_SIMPLETYPE

SUB SetValueFromNotesDateTime (value As NotesDateTime)

	Dim xdtc As New XSD_DATATYPE_CONVERTER

	CALL ME.setValueFromString (xdtc.getXSDDate (value) & "T" & xdtc.getXSDTime (value))

End SUB



Function GetValueAsNotesDateTime ( ) As NotesDateTime

	Dim xdtc As New XSD_DATATYPE_CONVERTER

	Dim ndt As New NotesDateTime ("")

	Call xdtc.setXSDDate (ndt, ME.getValueAsString)

	if Mid$(ME.getValueAsString,11,1) = "T" then	' if there's a time part after the required CCYY-MM-DD

		Call xdtc.setXSDTime (ndt, Right$(ME.getValueAsString, 12))

	End If

	set GetValueAsNotesDateTime = ndt

End FUNCTION

END CLASS

PUBLIC CLASS XSD_DATETIME_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_DATETIME

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_TIME AS XSD_SIMPLETYPE

SUB SetValueFromNotesDateTime (value As NotesDateTime)

	Dim xdtc As New XSD_DATATYPE_CONVERTER

	CALL ME.setValueFromString (xdtc.getXSDTime (value))

End SUB



Function GetValueAsNotesDateTime ( ) As NotesDateTime

	Dim xdtc As New XSD_DATATYPE_CONVERTER

	Dim ndt As New NotesDateTime ("")

	Call xdtc.setXSDTime (ndt, ME.getValueAsString)

	set GetValueAsNotesDateTime = ndt

End FUNCTION

END CLASS

PUBLIC CLASS XSD_TIME_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_TIME

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_DATE AS XSD_SIMPLETYPE

SUB SetValueFromNotesDateTime (value As NotesDateTime)

	Dim xdtc As New XSD_DATATYPE_CONVERTER

	CALL ME.setValueFromString (xdtc.getXSDDate (value))

End SUB



Function GetValueAsNotesDateTime ( ) As NotesDateTime

	Dim xdtc As New XSD_DATATYPE_CONVERTER

	Dim ndt As New NotesDateTime ("")

	Call xdtc.setXSDDate (ndt, ME.getValueAsString)

	set GetValueAsNotesDateTime = ndt

End FUNCTION

END CLASS

PUBLIC CLASS XSD_DATE_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_DATE

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_GYEARMONTH AS XSD_SIMPLETYPE

END CLASS

PUBLIC CLASS XSD_GYEARMONTH_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_GYEARMONTH

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_GYEAR AS XSD_SIMPLETYPE

END CLASS

PUBLIC CLASS XSD_GYEAR_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_GYEAR

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_GMONTHDAY AS XSD_SIMPLETYPE

END CLASS

PUBLIC CLASS XSD_GMONTHDAY_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_GMONTHDAY

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_GDAY AS XSD_SIMPLETYPE

END CLASS

PUBLIC CLASS XSD_GDAY_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_GDAY

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_GMONTH AS XSD_SIMPLETYPE

END CLASS

PUBLIC CLASS XSD_GMONTH_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_GMONTH

END CLASS

'--------------------------------------------------------------------

'--------------------------------------------------------------------

’ TYPES DERIVED FROM XSD_STRING

'--------------------------------------------------------------------

'--------------------------------------------------------------------

PUBLIC CLASS XSD_NORMALIZEDSTRING AS XSD_STRING

END CLASS

PUBLIC CLASS XSD_NORMALIZEDSTRING_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_NORMALIZEDSTRING

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_TOKEN AS XSD_NORMALIZEDSTRING

END CLASS

PUBLIC CLASS XSD_TOKEN_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_TOKEN

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_LANGUAGE AS XSD_TOKEN

END CLASS

PUBLIC CLASS XSD_LANGUAGE_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_LANGUAGE

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_NAME AS XSD_TOKEN

END CLASS

PUBLIC CLASS XSD_NAME_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_NAME

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_NCNAME AS XSD_NAME

END CLASS

PUBLIC CLASS XSD_NCNAME_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_NCNAME

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_ID AS XSD_NCNAME

END CLASS

PUBLIC CLASS XSD_ID_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_ID

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_IDREF AS XSD_NCNAME

END CLASS

PUBLIC CLASS XSD_IDREF_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_IDREF

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_IDREFS AS XSD_LIST

PUBLIC theList () As XSD_IDREF

PRIVATE initialized As BOOLEAN



SUB initListItem (idx As INTEGER)

	if theList(idx) IS NOTHING THEN set theList(idx) = new XSD_IDREF

END SUB



SUB setListValueFromString (idx As INTEGER, value As STRING)

	IF idx < 0 THEN ERROR ErrArgOutOfRange

	IF NOT initialized THEN

		REDIM theList (0 TO idx)

		initialized = TRUE

	ELSE

		IF idx > UBOUND(theList) THEN REDIM PRESERVE theList (0 TO idx)

	END IF

	CALL initListItem(idx)

	CALL theList(idx).setValueFromString (value)

END SUB



FUNCTION getListValueAsString (idx As INTEGER) As STRING

	IF NOT initialized THEN ERROR ErrArgOutOfRange

	CALL initListItem(idx)

	getListValueAsString = theList(idx).getValueAsString

END FUNCTION



FUNCTION getListLength () As INTEGER

	IF NOT initialized THEN

		getListLength = 0

	ELSE

		getListLength = UBOUND(theList)+1

	END IF

END FUNCTION

END CLASS

PUBLIC CLASS XSD_IDREFS_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_IDREFS

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_ENTITY AS XSD_NCNAME

END CLASS

PUBLIC CLASS XSD_ENTITY_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_ENTITY

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_ENTITIES AS XSD_LIST

PUBLIC theList () As XSD_ENTITY

PRIVATE initialized As BOOLEAN



SUB initListItem (idx As INTEGER)

	if theList(idx) IS NOTHING THEN set theList(idx) = new XSD_ENTITY

END SUB



SUB setListValueFromString (idx As INTEGER, value As STRING)

	IF idx < 0 THEN ERROR ErrArgOutOfRange

	IF NOT initialized THEN

		REDIM theList (0 TO idx)

		initialized = TRUE

	ELSE

		IF idx > UBOUND(theList) THEN REDIM PRESERVE theList (0 TO idx)

	END IF

	CALL initListItem(idx)

	CALL theList(idx).setValueFromString (value)

END SUB



FUNCTION getListValueAsString (idx As INTEGER) As STRING

	IF NOT initialized THEN ERROR ErrArgOutOfRange

	CALL initListItem(idx)

	getListValueAsString = theList(idx).getValueAsString

END FUNCTION



FUNCTION getListLength () As INTEGER

	IF NOT initialized THEN

		getListLength = 0

	ELSE

		getListLength = UBOUND(theList)+1

	END IF

END FUNCTION

END CLASS

PUBLIC CLASS XSD_ENTITIES_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_ENTITIES

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_NMTOKEN AS XSD_TOKEN

END CLASS

PUBLIC CLASS XSD_NMTOKEN_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_NMTOKEN

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_NMTOKENS AS XSD_LIST

PUBLIC theList () As XSD_NMTOKEN

PRIVATE initialized As BOOLEAN



SUB initListItem (idx As INTEGER)

	if theList(idx) IS NOTHING THEN set theList(idx) = new XSD_NMTOKEN

END SUB



SUB setListValueFromString (idx As INTEGER, value As STRING)

	IF idx < 0 THEN ERROR ErrArgOutOfRange

	IF NOT initialized THEN

		REDIM theList (0 TO idx)

		initialized = TRUE

	ELSE

		IF idx > UBOUND(theList) THEN REDIM PRESERVE theList (0 TO idx)

	END IF

	CALL initListItem(idx)

	CALL theList(idx).setValueFromString (value)

END SUB



FUNCTION getListValueAsString (idx As INTEGER) As STRING

	IF NOT initialized THEN ERROR ErrArgOutOfRange

	CALL initListItem(idx)

	getListValueAsString = theList(idx).getValueAsString

END FUNCTION



FUNCTION getListLength () As INTEGER

	IF NOT initialized THEN

		getListLength = 0

	ELSE

		getListLength = UBOUND(theList)+1

	END IF

END FUNCTION

END CLASS

PUBLIC CLASS XSD_NMTOKENS_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_NMTOKENS

END CLASS

'--------------------------------------------------------------------

'--------------------------------------------------------------------

’ TYPES DERIVED FROM XSD_DECIMAL

'--------------------------------------------------------------------

'--------------------------------------------------------------------

PUBLIC CLASS XSD_INTEGER AS XSD_DECIMAL

END CLASS

PUBLIC CLASS XSD_INTEGER_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_INTEGER

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_NONPOSITIVEINTEGER AS XSD_INTEGER

END CLASS

PUBLIC CLASS XSD_NONPOSITIVEINTEGER_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_NONPOSITIVEINTEGER

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_NEGATIVEINTEGER AS XSD_NONPOSITIVEINTEGER

END CLASS

PUBLIC CLASS XSD_NEGATIVEINTEGER_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_NEGATIVEINTEGER

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_LONG AS XSD_INTEGER

END CLASS

PUBLIC CLASS XSD_LONG_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_LONG

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_INT AS XSD_LONG

END CLASS

PUBLIC CLASS XSD_INT_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_INT

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_SHORT AS XSD_INT

END CLASS

PUBLIC CLASS XSD_SHORT_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_SHORT

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_BYTE AS XSD_SHORT

END CLASS

PUBLIC CLASS XSD_BYTE_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_BYTE

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_NONNEGATIVEINTEGER AS XSD_INTEGER

END CLASS

PUBLIC CLASS XSD_NONNEGATIVEINTEGER_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_NONNEGATIVEINTEGER

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_UNSIGNEDLONG AS XSD_NONNEGATIVEINTEGER

END CLASS

PUBLIC CLASS XSD_UNSIGNEDLONG_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_UNSIGNEDLONG

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_UNSIGNEDINT AS XSD_UNSIGNEDLONG

END CLASS

PUBLIC CLASS XSD_UNSIGNEDINT_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_UNSIGNEDINT

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_UNSIGNEDSHORT AS XSD_UNSIGNEDINT

END CLASS

PUBLIC CLASS XSD_UNSIGNEDSHORT_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_UNSIGNEDSHORT

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_UNSIGNEDBYTE AS XSD_UNSIGNEDSHORT

END CLASS

PUBLIC CLASS XSD_UNSIGNEDBYTE_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_UNSIGNEDBYTE

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_POSITIVEINTEGER AS XSD_NONNEGATIVEINTEGER

END CLASS

PUBLIC CLASS XSD_POSITIVEINTEGER_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_POSITIVEINTEGER

END CLASS

'--------------------------------------------------------------------

'--------------------------------------------------------------------

’ HOLDER TYPES FOR LOTUSSCRIPT BUILT-IN TYPES

'--------------------------------------------------------------------

'--------------------------------------------------------------------

PUBLIC CLASS BOOLEAN_HOLDER AS INOUT_HOLDER

PUBLIC Value AS BOOLEAN

END CLASS

PUBLIC CLASS BOOLEANARRAY_HOLDER AS INOUT_HOLDER

PUBLIC Value() AS BOOLEAN

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS BYTE_HOLDER AS INOUT_HOLDER

PUBLIC Value AS BYTE

END CLASS

PUBLIC CLASS BYTEARRAY_HOLDER AS INOUT_HOLDER

PUBLIC Value() AS BYTE

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS CURRENCY_HOLDER AS INOUT_HOLDER

PUBLIC Value AS CURRENCY

END CLASS

PUBLIC CLASS CURRENCYARRAY_HOLDER AS INOUT_HOLDER

PUBLIC Value() AS CURRENCY

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS DOUBLE_HOLDER AS INOUT_HOLDER

PUBLIC Value AS DOUBLE

END CLASS

PUBLIC CLASS DOUBLEARRAY_HOLDER AS INOUT_HOLDER

PUBLIC Value() AS DOUBLE

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS INTEGER_HOLDER AS INOUT_HOLDER

PUBLIC Value AS INTEGER

END CLASS

PUBLIC CLASS INTEGERARRAY_HOLDER AS INOUT_HOLDER

PUBLIC Value() AS INTEGER

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS LONG_HOLDER AS INOUT_HOLDER

PUBLIC Value AS LONG

END CLASS

PUBLIC CLASS LONGARRAY_HOLDER AS INOUT_HOLDER

PUBLIC Value() AS LONG

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS SINGLE_HOLDER AS INOUT_HOLDER

PUBLIC Value AS SINGLE

END CLASS

PUBLIC CLASS SINGLEARRAY_HOLDER AS INOUT_HOLDER

PUBLIC Value() AS SINGLE

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS STRING_HOLDER AS INOUT_HOLDER

PUBLIC Value AS STRING

END CLASS

PUBLIC CLASS STRINGARRAY_HOLDER AS INOUT_HOLDER

PUBLIC Value() AS STRING

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS VARIANT_HOLDER AS INOUT_HOLDER

PUBLIC Value AS VARIANT

END CLASS

PUBLIC CLASS VARIANTARRAY_HOLDER AS INOUT_HOLDER

PUBLIC Value() AS VARIANT

END CLASS

Subject: Contents of lsxsd.lss

Here is the contents of my lsxsd.lss from my notes data directory:

%INCLUDE “lserr.lss”

'--------------------------------------------------------------------

'--------------------------------------------------------------------

’ USEFUL DATA CONVERSIONS USED BY ONE OR MORE XML SCHEMA DATATYPES

'--------------------------------------------------------------------

'--------------------------------------------------------------------

CLASS XSD_DATATYPE_CONVERTER

' Convert bytes in a NotesStream into a base64 string

Function notesStreamToBase64 (ns As NotesStream) As String

	

	Const b64Chars$ = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"

	

	Dim nsLength As Long

	nsLength = ns.Bytes

	ns.Position = 0

	

	Dim numPads As Integer

	numPads = (3 - (nsLength Mod 3)) Mod 3

	

	While nsLength > 0

		

		' Output lines are limited to 76 chars, and because every

		' three input bytes produce 4 output chars we process

		' up to 57 input bytes at a time. (57 = 76 / 4 * 3)

		

		Dim inLength As Long

		inLength = nsLength

		If inLength > 57 Then inLength = 57

		nsLength = nsLength - inLength

		

		Dim outString As String

		outString = ""

		Dim idx As Integer

		idx = 0

		While idx < inLength

			

			' Collect up to 24 bits (3 bytes) of input data

			Dim outBits As Integer

			outBits = 0

			Dim bits24 As Long

			bits24 = 0

			Dim i As Integer

			For i = 0 To 2

				bits24 = bits24 * 256

				If idx + i < inLength Then

					Dim buf As Variant

					buf = ns.Read(1&)

					bits24 = bits24 + buf(0)

					outBits = outBits + 8

				End If

			Next

			idx = idx + 3

			

			Dim numChars As Integer

			numChars = 4

			If outBits <> 24 Then

				numChars = 4 - numPads

			End If

			

			For i = 1 To numChars

				Dim bits6 As Integer

				bits6 = (bits24 And &HFC0000&) / 262144

				outString = outString & Mid$(b64Chars, bits6 + 1, 1)

				bits24 = (bits24 And &H3FFFF&) * 64

			Next

			

			If numChars <> 4 Then

				For i = 1 To numPads

					outString = outString & "="

				Next

			End If

			

		Wend

		

		' Add another line of base64 output to the return string

		notesStreamToBase64 = notesStreamToBase64 & outString & Chr$(13) & Chr$(10)

		

	Wend

	

End Function



' Convert a base64 string into bytes in a NotesStream

Function base64ToNotesStream (b64String As String) As NotesStream

	

	Dim session As New NotesSession

	Dim ns As NotesStream

	Set ns = session.CreateStream

	

	' variables used to stage output to the NotesStream

	Redim buf (0 To 2) As Byte

	Dim numPads As Integer

	numPads = 0

	

	Dim b64Len As Long

	b64Len = Len(b64String)

	

	Dim idx As Long

	idx = 1

	While idx <= b64Len

		

		Dim currChar As String

		currChar = Mid$(b64String, idx, 1)

		

		' Ignore whitespace (CR, LF, SPACE, or TAB) that may lead the line		

		Dim c As Long

		c = Asc(currChar)

		If c = 13 Or c = 10 Or c = 32 Or c = 9 Then

			idx = idx + 1

			Goto Next1

		End If

		

		' Every 4 base64 characters represent 24 bits (three 8-bit bytes)

		Dim bits24 As Long

		bits24 = 0

		Dim i As Integer

		For i = 0 To 3

			Dim bits6 As Long

			c = Asc(Mid$(b64String, idx, 1))

			idx = idx + 1

			

			' Map characters "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"

			' to 6-bit binary values ranging from 0 to 63, respectively

			Select Case c

			Case Asc("A") To Asc("Z")

				bits6 = c - Asc("A")				' map A-Z to 0-25

			Case  Asc("a") To Asc("z")

				bits6 = 26 + c - Asc("a")		' map a-z to 26-51

			Case Asc("0") To Asc("9")

				bits6 = 52 + c - Asc("0")		' map 0-9 to 52-61

			Case Asc("+")

				bits6 = 62		' map "+" to 62

			Case Asc("/")

				bits6 = 63		' map "/" to 63

			Case Asc("=")			' pad char at end of base64

				bits6 = 0

				numPads = numPads + 1

			Case Else

				Error ErrOverflow

			End Select

			bits24 = (bits24 * 64) + bits6

		Next

		

		' Extract three 8-bit bytes from the 24-bit value					

		buf(0) = (bits24 And &HFF0000&) / 65536

		buf(1) = (bits24 And &H00FF00&) / 256

		buf(2) = bits24 And &H0000FF&

		

		' Write up to three 8-bit bytes to the NotesStream					

		Select Case numPads

		Case 0

			Call ns.Write (buf)

		Case 1

			Redim Preserve buf (0 To 1)

			Call ns.Write (buf)

			Goto done

		Case 2

			Redim Preserve buf (0 To 0)

			Call ns.Write (buf)

			Goto done

		End Select

next1:

	Wend

done:

	Set base64ToNotesStream = ns

	

End Function



' Convert bytes in a NotesStream into a hexBinary string

Function notesStreamToHexBinary (ns As NotesStream) As String

	

	Const hexChars$ = "0123456789ABCDEF"

	

	Dim nsLength As Long

	nsLength = ns.Bytes

	ns.Position = 0

	

	While nsLength > 0

		

		' We arbitrarily limit output lines to 76 hex chars

		' by inserting CRLF after processing a run of 38

		' bytes. (Note: whitespace is allowed in hexBinary).

		

		Dim inLength As Long

		inLength = nsLength

		If inLength > 38 Then inLength = 38

		nsLength = nsLength - inLength

		

		Dim outString As String

		outString = ""

		Dim idx As Integer

		idx = 0

		While idx < inLength

			Dim buf As Variant

			buf = ns.Read(1&)

			outString = outString &_

			Mid$(hexChars, (buf(0) And &HF0&)/16+1,1) &_

			Mid$(hexChars, (buf(0) And &HF&)+1,1)

			idx = idx + 1				

		Wend

		

		' Add another line of base64 output to the return string

		notesStreamToHexBinary = notesStreamToHexBinary & outString & Chr$(13) & Chr$(10)

		

	Wend

	

End Function



' Convert a hexBinary string into bytes in a NotesStream

Function hexBinaryToNotesStream (hexString As String) As NotesStream

	

	Dim session As New NotesSession

	Dim ns As NotesStream

	Set ns = session.CreateStream

	

	' variables used to stage output to the NotesStream

	Dim buf (0 To 0) As Byte

	

	Dim hexLen As Long

	hexLen = Len(hexString)

	

	Dim idx As Long

	idx = 1

	While idx <= hexLen

		

		' Ignore whitespace (CR, LF, SPACE, or TAB) that may lead the line		

		Dim c As Long

		c = Asc(Mid$(hexString, idx, 1))

		If c = 13 Or c = 10 Or c = 32 Or c = 9 Then

			idx = idx + 1

			Goto Next1

		End If

		

		' Every 2 hexBinary characters represent 1 8-bit byte

		buf(0) = 0

		Dim i As Integer

		For i = 0 To 1

			buf(0) = buf(0) * 16

			c = Asc(Mid$(hexString, idx+i, 1))

			Select Case c

			Case Asc("0") To Asc("9")

				buf(0) = buf(0) + c - Asc("0")

			Case Asc("A") To Asc("F")

				buf(0) = buf(0) + c - Asc("A") + 10

			End Select

		Next

		idx = idx + 2

		Call ns.Write(buf)

next1:

	Wend

done:

	Set hexBinaryToNotesStream = ns

	

End Function



' Set the date part of a NotesDateTime From "CCYY-MM-DD ..."

Sub setXSDDate (ndt As NotesDateTime, xsddate As String)

	If Not ndt.IsValidDate Then ndt.LocalTime = ""

	Dim timeonly As String

	timeonly = ndt.TimeOnly	' preserve the time part

	ndt.LocalTime = Mid$(xsddate,6,2) & "/" &_

	Mid$(xsddate,9,2) & "/" &_

	Left$(xsddate,4) & " " & timeonly

End Sub



' Return the date part of a NotesDateTime as "CCYY-MM-DD"

Function getXSDDate (ndt As NotesDateTime) As String

	If Not ndt.IsValidDate Then Error ErrTypeMismatch

	Dim vdatetime As Variant

	vdatetime = ndt.LSLocalTime

	getXSDDate = Format$(Year(vdatetime),"0000") & "-" &_

	Format$(Month(vdatetime),"00") & "-" &_

	Format$(Day(vdatetime),"00")

End Function



' Set the time part of a NotesDateTime From "HH:MM:SS ..."

Sub setXSDTime (ndt As NotesDateTime, xsdtime As String)

	If Not ndt.IsValidDate Then ndt.LocalTime = ""

	Dim dateonly As String

	dateonly = ndt.DateOnly	' preserve the date part

	ndt.LocalTime = dateonly & " " &_

	Left$(xsdtime,2) & ":" &_

	Mid$(xsdtime,4,2) & ":" &_

	Mid$(xsdtime,7,2)

End Sub



' Return the time info of a NotesDateTime as "HH:MM:SS"

' Does not compute fractional seconds or timezone info.

Function getXSDTime (ndt As NotesDateTime) As String

	If Not ndt.IsValidDate Then Error ErrTypeMismatch

	Dim vdatetime As Variant

	vdatetime = ndt.LSLocalTime

	getXSDTime = Format$(Hour(vdatetime),"00") & ":" &_

	Format$(Minute(vdatetime),"00") & ":" &_

	Format$(Second(vdatetime),"00")

End Function

END CLASS

'--------------------------------------------------------------------

'--------------------------------------------------------------------

’ ROOT HOLDER CLASS

'--------------------------------------------------------------------

'--------------------------------------------------------------------

PUBLIC CLASS INOUT_HOLDER

END CLASS

'--------------------------------------------------------------------

'--------------------------------------------------------------------

’ ROOT CLASS FOR LOTUSSCRIPT PROXY OBJECTS

'--------------------------------------------------------------------

'--------------------------------------------------------------------

PUBLIC CLASS LS_PROXY_OBJECT

PRIVATE ValueAsString As String



SUB setValueFromString (value As String)

	ValueAsString = value

END SUB



FUNCTION getValueAsString () As String

	getValueAsString = ValueAsString

END FUNCTION

END CLASS

'--------------------------------------------------------------------

'--------------------------------------------------------------------

’ ROOT CLASS AND HOLDER FOR ANY AND ALL XML TYPES

'--------------------------------------------------------------------

'--------------------------------------------------------------------

PUBLIC CLASS XSD_ANYTYPE AS LS_PROXY_OBJECT

END CLASS

PUBLIC CLASS XSD_ANYTYPE_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_ANYTYPE

END CLASS

'--------------------------------------------------------------------

'--------------------------------------------------------------------

’ ROOT FAULT CLASS

'--------------------------------------------------------------------

'--------------------------------------------------------------------

PUBLIC CLASS WS_FAULT

PRIVATE Fault As BOOLEAN

PRIVATE FaultString As STRING



SUB setFault (value As BOOLEAN)

	Fault = value

END SUB



FUNCTION getFault () As BOOLEAN

	getFault = Fault

END FUNCTION



SUB setFaultString (value As STRING)

	FaultString = value

END SUB



FUNCTION getFaultString () As STRING

	getFaultString = FaultString

END FUNCTION

END CLASS

'--------------------------------------------------------------------

'--------------------------------------------------------------------

’ BASE CLASS FOR ALL SIMPLE TYPES

'--------------------------------------------------------------------

'--------------------------------------------------------------------

PUBLIC CLASS XSD_SIMPLETYPE AS XSD_ANYTYPE

END CLASS

PUBLIC CLASS XSD_SIMPLETYPE_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_SIMPLETYPE

END CLASS

'--------------------------------------------------------------------

'--------------------------------------------------------------------

’ ROOT CLASS AND HOLDER FOR LISTS OF SIMPLE TYPES.

’

’ SUBCLASSES MUST DEFINE A 0-BASED ARRAY OF THE APPROPRIATE TYPE

’ AS WELL AS OVERRIDE METHODS THAT ACCESS AND MODIFY THAT ARRAY:

’

’ SUB setListValueFromString (idx As INTEGER, value As STRING)

’ FUNCTION getListValueAsString (idx As INTEGER) As STRING

’ FUNCTION getListLength () As INTEGER

’

'--------------------------------------------------------------------

'--------------------------------------------------------------------

PUBLIC CLASS XSD_LIST AS XSD_SIMPLETYPE

' Return a String with a space-separated concatentation

' of all the non-null items in the list



FUNCTION getValueAsString () As STRING

	IF ME.getListLength > 0 THEN

		DIM i As INTEGER

		DIM count As INTEGER

		FOR i = 0 TO ME.getListLength-1

			IF ME.getListValueAsString(i) <> "" THEN

				IF count > 0 THEN getValueAsString = getValueAsString & " "

				getValueAsString = getValueAsString & ME.getListValueAsString(i)

				count = count+1

			END IF

		NEXT i

	END IF

END FUNCTION



' SUBs and FUNCTIONs that must be overridden by each subclass



SUB setListValueFromString (idx As INTEGER, value As STRING)

	ERROR ErrIllegalOperation

END SUB



FUNCTION getListValueAsString (idx As INTEGER) As STRING

	ERROR ErrIllegalOperation

END FUNCTION



FUNCTION getListLength () As INTEGER

	ERROR ErrIllegalOperation

END FUNCTION

END CLASS

PUBLIC CLASS XSD_LIST_HOLDER AS INOUT_HOLDER

PUBLIC Value As XSD_LIST

END CLASS

'--------------------------------------------------------------------

'--------------------------------------------------------------------

’ SIMPLE TYPES AND HOLDERS

'--------------------------------------------------------------------

'--------------------------------------------------------------------

PUBLIC CLASS XSD_STRING AS XSD_SIMPLETYPE

END CLASS

PUBLIC CLASS XSD_STRING_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_STRING

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_BOOLEAN AS XSD_SIMPLETYPE

END CLASS

PUBLIC CLASS XSD_BOOLEAN_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_BOOLEAN

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_BASE64BINARY AS XSD_SIMPLETYPE

SUB setValueFromNotesStream (nsValue As NotesStream)

	Dim xdtc As New XSD_DATATYPE_CONVERTER

	CALL Me.setValueFromString (xdtc.notesStreamToBase64 (nsValue))

END SUB



FUNCTION getValueAsNotesStream () As NotesStream

	Dim xdtc As New XSD_DATATYPE_CONVERTER

	set getValueAsNotesStream = xdtc.base64ToNotesStream (Me.getValueAsString())

END FUNCTION

END CLASS

PUBLIC CLASS XSD_BASE64BINARY_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_BASE64BINARY

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_HEXBINARY AS XSD_SIMPLETYPE

SUB setValueFromNotesStream (nsValue As NotesStream)

	Dim xdtc As New XSD_DATATYPE_CONVERTER

	CALL Me.setValueFromString (xdtc.notesStreamToHexBinary (nsValue))

END SUB



FUNCTION getValueAsNotesStream () As NotesStream

	Dim xdtc As New XSD_DATATYPE_CONVERTER

	set getValueAsNotesStream = xdtc.hexBinaryToNotesStream (Me.getValueAsString())

END FUNCTION

END CLASS

PUBLIC CLASS XSD_HEXBINARY_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_HEXBINARY

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_FLOAT AS XSD_SIMPLETYPE

END CLASS

PUBLIC CLASS XSD_FLOAT_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_FLOAT

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_DECIMAL AS XSD_SIMPLETYPE

END CLASS

PUBLIC CLASS XSD_DECIMAL_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_DECIMAL

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_DOUBLE AS XSD_SIMPLETYPE

END CLASS

PUBLIC CLASS XSD_DOUBLE_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_DOUBLE

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_ANYURI AS XSD_SIMPLETYPE

END CLASS

PUBLIC CLASS XSD_ANYURI_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_ANYURI

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_QNAME AS XSD_SIMPLETYPE

END CLASS

PUBLIC CLASS XSD_QNAME_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_QNAME

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_NOTATION AS XSD_SIMPLETYPE

END CLASS

PUBLIC CLASS XSD_NOTATION_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_NOTATION

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_DURATION AS XSD_SIMPLETYPE

END CLASS

PUBLIC CLASS XSD_DURATION_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_DURATION

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_DATETIME AS XSD_SIMPLETYPE

SUB SetValueFromNotesDateTime (value As NotesDateTime)

	Dim xdtc As New XSD_DATATYPE_CONVERTER

	CALL ME.setValueFromString (xdtc.getXSDDate (value) & "T" & xdtc.getXSDTime (value))

End SUB



Function GetValueAsNotesDateTime ( ) As NotesDateTime

	Dim xdtc As New XSD_DATATYPE_CONVERTER

	Dim ndt As New NotesDateTime ("")

	Call xdtc.setXSDDate (ndt, ME.getValueAsString)

	if Mid$(ME.getValueAsString,11,1) = "T" then	' if there's a time part after the required CCYY-MM-DD

		Call xdtc.setXSDTime (ndt, Right$(ME.getValueAsString, 12))

	End If

	set GetValueAsNotesDateTime = ndt

End FUNCTION

END CLASS

PUBLIC CLASS XSD_DATETIME_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_DATETIME

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_TIME AS XSD_SIMPLETYPE

SUB SetValueFromNotesDateTime (value As NotesDateTime)

	Dim xdtc As New XSD_DATATYPE_CONVERTER

	CALL ME.setValueFromString (xdtc.getXSDTime (value))

End SUB



Function GetValueAsNotesDateTime ( ) As NotesDateTime

	Dim xdtc As New XSD_DATATYPE_CONVERTER

	Dim ndt As New NotesDateTime ("")

	Call xdtc.setXSDTime (ndt, ME.getValueAsString)

	set GetValueAsNotesDateTime = ndt

End FUNCTION

END CLASS

PUBLIC CLASS XSD_TIME_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_TIME

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_DATE AS XSD_SIMPLETYPE

SUB SetValueFromNotesDateTime (value As NotesDateTime)

	Dim xdtc As New XSD_DATATYPE_CONVERTER

	CALL ME.setValueFromString (xdtc.getXSDDate (value))

End SUB



Function GetValueAsNotesDateTime ( ) As NotesDateTime

	Dim xdtc As New XSD_DATATYPE_CONVERTER

	Dim ndt As New NotesDateTime ("")

	Call xdtc.setXSDDate (ndt, ME.getValueAsString)

	set GetValueAsNotesDateTime = ndt

End FUNCTION

END CLASS

PUBLIC CLASS XSD_DATE_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_DATE

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_GYEARMONTH AS XSD_SIMPLETYPE

END CLASS

PUBLIC CLASS XSD_GYEARMONTH_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_GYEARMONTH

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_GYEAR AS XSD_SIMPLETYPE

END CLASS

PUBLIC CLASS XSD_GYEAR_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_GYEAR

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_GMONTHDAY AS XSD_SIMPLETYPE

END CLASS

PUBLIC CLASS XSD_GMONTHDAY_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_GMONTHDAY

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_GDAY AS XSD_SIMPLETYPE

END CLASS

PUBLIC CLASS XSD_GDAY_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_GDAY

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_GMONTH AS XSD_SIMPLETYPE

END CLASS

PUBLIC CLASS XSD_GMONTH_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_GMONTH

END CLASS

'--------------------------------------------------------------------

'--------------------------------------------------------------------

’ TYPES DERIVED FROM XSD_STRING

'--------------------------------------------------------------------

'--------------------------------------------------------------------

PUBLIC CLASS XSD_NORMALIZEDSTRING AS XSD_STRING

END CLASS

PUBLIC CLASS XSD_NORMALIZEDSTRING_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_NORMALIZEDSTRING

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_TOKEN AS XSD_NORMALIZEDSTRING

END CLASS

PUBLIC CLASS XSD_TOKEN_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_TOKEN

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_LANGUAGE AS XSD_TOKEN

END CLASS

PUBLIC CLASS XSD_LANGUAGE_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_LANGUAGE

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_NAME AS XSD_TOKEN

END CLASS

PUBLIC CLASS XSD_NAME_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_NAME

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_NCNAME AS XSD_NAME

END CLASS

PUBLIC CLASS XSD_NCNAME_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_NCNAME

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_ID AS XSD_NCNAME

END CLASS

PUBLIC CLASS XSD_ID_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_ID

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_IDREF AS XSD_NCNAME

END CLASS

PUBLIC CLASS XSD_IDREF_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_IDREF

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_IDREFS AS XSD_LIST

PUBLIC theList () As XSD_IDREF

PRIVATE initialized As BOOLEAN



SUB initListItem (idx As INTEGER)

	if theList(idx) IS NOTHING THEN set theList(idx) = new XSD_IDREF

END SUB



SUB setListValueFromString (idx As INTEGER, value As STRING)

	IF idx < 0 THEN ERROR ErrArgOutOfRange

	IF NOT initialized THEN

		REDIM theList (0 TO idx)

		initialized = TRUE

	ELSE

		IF idx > UBOUND(theList) THEN REDIM PRESERVE theList (0 TO idx)

	END IF

	CALL initListItem(idx)

	CALL theList(idx).setValueFromString (value)

END SUB



FUNCTION getListValueAsString (idx As INTEGER) As STRING

	IF NOT initialized THEN ERROR ErrArgOutOfRange

	CALL initListItem(idx)

	getListValueAsString = theList(idx).getValueAsString

END FUNCTION



FUNCTION getListLength () As INTEGER

	IF NOT initialized THEN

		getListLength = 0

	ELSE

		getListLength = UBOUND(theList)+1

	END IF

END FUNCTION

END CLASS

PUBLIC CLASS XSD_IDREFS_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_IDREFS

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_ENTITY AS XSD_NCNAME

END CLASS

PUBLIC CLASS XSD_ENTITY_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_ENTITY

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_ENTITIES AS XSD_LIST

PUBLIC theList () As XSD_ENTITY

PRIVATE initialized As BOOLEAN



SUB initListItem (idx As INTEGER)

	if theList(idx) IS NOTHING THEN set theList(idx) = new XSD_ENTITY

END SUB



SUB setListValueFromString (idx As INTEGER, value As STRING)

	IF idx < 0 THEN ERROR ErrArgOutOfRange

	IF NOT initialized THEN

		REDIM theList (0 TO idx)

		initialized = TRUE

	ELSE

		IF idx > UBOUND(theList) THEN REDIM PRESERVE theList (0 TO idx)

	END IF

	CALL initListItem(idx)

	CALL theList(idx).setValueFromString (value)

END SUB



FUNCTION getListValueAsString (idx As INTEGER) As STRING

	IF NOT initialized THEN ERROR ErrArgOutOfRange

	CALL initListItem(idx)

	getListValueAsString = theList(idx).getValueAsString

END FUNCTION



FUNCTION getListLength () As INTEGER

	IF NOT initialized THEN

		getListLength = 0

	ELSE

		getListLength = UBOUND(theList)+1

	END IF

END FUNCTION

END CLASS

PUBLIC CLASS XSD_ENTITIES_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_ENTITIES

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_NMTOKEN AS XSD_TOKEN

END CLASS

PUBLIC CLASS XSD_NMTOKEN_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_NMTOKEN

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_NMTOKENS AS XSD_LIST

PUBLIC theList () As XSD_NMTOKEN

PRIVATE initialized As BOOLEAN



SUB initListItem (idx As INTEGER)

	if theList(idx) IS NOTHING THEN set theList(idx) = new XSD_NMTOKEN

END SUB



SUB setListValueFromString (idx As INTEGER, value As STRING)

	IF idx < 0 THEN ERROR ErrArgOutOfRange

	IF NOT initialized THEN

		REDIM theList (0 TO idx)

		initialized = TRUE

	ELSE

		IF idx > UBOUND(theList) THEN REDIM PRESERVE theList (0 TO idx)

	END IF

	CALL initListItem(idx)

	CALL theList(idx).setValueFromString (value)

END SUB



FUNCTION getListValueAsString (idx As INTEGER) As STRING

	IF NOT initialized THEN ERROR ErrArgOutOfRange

	CALL initListItem(idx)

	getListValueAsString = theList(idx).getValueAsString

END FUNCTION



FUNCTION getListLength () As INTEGER

	IF NOT initialized THEN

		getListLength = 0

	ELSE

		getListLength = UBOUND(theList)+1

	END IF

END FUNCTION

END CLASS

PUBLIC CLASS XSD_NMTOKENS_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_NMTOKENS

END CLASS

'--------------------------------------------------------------------

'--------------------------------------------------------------------

’ TYPES DERIVED FROM XSD_DECIMAL

'--------------------------------------------------------------------

'--------------------------------------------------------------------

PUBLIC CLASS XSD_INTEGER AS XSD_DECIMAL

END CLASS

PUBLIC CLASS XSD_INTEGER_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_INTEGER

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_NONPOSITIVEINTEGER AS XSD_INTEGER

END CLASS

PUBLIC CLASS XSD_NONPOSITIVEINTEGER_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_NONPOSITIVEINTEGER

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_NEGATIVEINTEGER AS XSD_NONPOSITIVEINTEGER

END CLASS

PUBLIC CLASS XSD_NEGATIVEINTEGER_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_NEGATIVEINTEGER

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_LONG AS XSD_INTEGER

END CLASS

PUBLIC CLASS XSD_LONG_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_LONG

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_INT AS XSD_LONG

END CLASS

PUBLIC CLASS XSD_INT_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_INT

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_SHORT AS XSD_INT

END CLASS

PUBLIC CLASS XSD_SHORT_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_SHORT

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_BYTE AS XSD_SHORT

END CLASS

PUBLIC CLASS XSD_BYTE_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_BYTE

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_NONNEGATIVEINTEGER AS XSD_INTEGER

END CLASS

PUBLIC CLASS XSD_NONNEGATIVEINTEGER_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_NONNEGATIVEINTEGER

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_UNSIGNEDLONG AS XSD_NONNEGATIVEINTEGER

END CLASS

PUBLIC CLASS XSD_UNSIGNEDLONG_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_UNSIGNEDLONG

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_UNSIGNEDINT AS XSD_UNSIGNEDLONG

END CLASS

PUBLIC CLASS XSD_UNSIGNEDINT_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_UNSIGNEDINT

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_UNSIGNEDSHORT AS XSD_UNSIGNEDINT

END CLASS

PUBLIC CLASS XSD_UNSIGNEDSHORT_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_UNSIGNEDSHORT

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_UNSIGNEDBYTE AS XSD_UNSIGNEDSHORT

END CLASS

PUBLIC CLASS XSD_UNSIGNEDBYTE_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_UNSIGNEDBYTE

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS XSD_POSITIVEINTEGER AS XSD_NONNEGATIVEINTEGER

END CLASS

PUBLIC CLASS XSD_POSITIVEINTEGER_HOLDER AS INOUT_HOLDER

PUBLIC Value AS XSD_POSITIVEINTEGER

END CLASS

'--------------------------------------------------------------------

'--------------------------------------------------------------------

’ HOLDER TYPES FOR LOTUSSCRIPT BUILT-IN TYPES

'--------------------------------------------------------------------

'--------------------------------------------------------------------

PUBLIC CLASS BOOLEAN_HOLDER AS INOUT_HOLDER

PUBLIC Value AS BOOLEAN

END CLASS

PUBLIC CLASS BOOLEANARRAY_HOLDER AS INOUT_HOLDER

PUBLIC Value() AS BOOLEAN

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS BYTE_HOLDER AS INOUT_HOLDER

PUBLIC Value AS BYTE

END CLASS

PUBLIC CLASS BYTEARRAY_HOLDER AS INOUT_HOLDER

PUBLIC Value() AS BYTE

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS CURRENCY_HOLDER AS INOUT_HOLDER

PUBLIC Value AS CURRENCY

END CLASS

PUBLIC CLASS CURRENCYARRAY_HOLDER AS INOUT_HOLDER

PUBLIC Value() AS CURRENCY

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS DOUBLE_HOLDER AS INOUT_HOLDER

PUBLIC Value AS DOUBLE

END CLASS

PUBLIC CLASS DOUBLEARRAY_HOLDER AS INOUT_HOLDER

PUBLIC Value() AS DOUBLE

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS INTEGER_HOLDER AS INOUT_HOLDER

PUBLIC Value AS INTEGER

END CLASS

PUBLIC CLASS INTEGERARRAY_HOLDER AS INOUT_HOLDER

PUBLIC Value() AS INTEGER

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS LONG_HOLDER AS INOUT_HOLDER

PUBLIC Value AS LONG

END CLASS

PUBLIC CLASS LONGARRAY_HOLDER AS INOUT_HOLDER

PUBLIC Value() AS LONG

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS SINGLE_HOLDER AS INOUT_HOLDER

PUBLIC Value AS SINGLE

END CLASS

PUBLIC CLASS SINGLEARRAY_HOLDER AS INOUT_HOLDER

PUBLIC Value() AS SINGLE

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS STRING_HOLDER AS INOUT_HOLDER

PUBLIC Value AS STRING

END CLASS

PUBLIC CLASS STRINGARRAY_HOLDER AS INOUT_HOLDER

PUBLIC Value() AS STRING

END CLASS

'--------------------------------------------------------------------

PUBLIC CLASS VARIANT_HOLDER AS INOUT_HOLDER

PUBLIC Value AS VARIANT

END CLASS

PUBLIC CLASS VARIANTARRAY_HOLDER AS INOUT_HOLDER

PUBLIC Value() AS VARIANT

END CLASS

Subject: RE: Contents of lsxsd.lss

Thanks Tom,

I’ll try this and see if I can adapt it for my needs.

Regards,

Keith Seeley