2.2.4.1 Lexical structure
The lexical structure of the FastTransfer stream is essential to let its producers and consumers agree on rules that govern splitting of the stream into sequential buffers retrieved by using the RopFastTransferSourceGetBuffer ROP (section 2.2.3.1.1.5) or supplied through the RopFastTransferDestinationPutBuffer ROP (section 2.2.3.1.2.2). It is also beneficial for an explanation of the protocol, as it separates matters of data serialization and deserialization (lexical analysis) from data and data organization (syntactical analysis), and from its mapping to mailbox concepts (semantics).
The lexical structure of a FastTransfer stream is as follows:
-
stream = 1*element element = marker / propValue marker = PtypInteger32 <from the table in 2.2.4.1.4> propValue = fixedPropType propInfo fixedSizeValue propValue =/ varPropType propInfo length varSizeValue propValue =/ mvPropType propInfo length *( fixedSizeValue / length varSizeValue ) propInfo = taggedPropId / ( namedPropId namedPropInfo ) fixedSizeValue = PtypInteger16 / PtypInteger32 / PtypFloating32 / PtypFloating64 / PtypCurrency / PtypFloatingTime / PtypBoolean / PtypInteger64 / PtypTime / PtypGuid varSizeValue = PtypString / PtypString8 / PtypServerId / PtypBinary / PtypObject namedPropInfo = propertySet ((%x00 dispid) / (%x01 name)) propertySet = PtypGuid dispid = PtypInteger32 name = PtypString namedPropId = propertyId <Greater or equal to 0x8000> propertyId = PtypInteger16 taggedPropId = propertyId <less than 0x8000> length = PtypInteger32 <MUST be greater than 0> propType = fixedPropType / varPropType / mvPropType fixedPropType = PtypInteger16 varPropType = PtypInteger16 mvPropType = PtypInteger16
For more details about the fixedPropType, varPropType, and mvPropType property types, see section 2.2.4.1.1.
The lexical structure of the FastTransfer adheres to the following guidelines:
Camel-cased names are nonterminal syntactic elements, as specified in [RFC5234] section 2.3.
Pascal-cased names with a Ptyp prefix are any value of that type serialized as specified in section 2.2.4.1.3.
A FastTransfer stream can be larger than a single buffer. The server MUST split the stream when it cannot fit into a single buffer. If a split is required, the stream MUST be split either between two atoms or at any point inside a varSizeValue lexeme. A stream MUST NOT be split within a single atom. The lexical structure of an atom is as follows:
-
atom = marker / propDef / fixedSizeValue / length propDef = ( propType propInfo )