Date: 2005-02-19T10:58:19
   Editor: EmmanuelLecharny
   Wiki: Apache Directory Project Wiki
   Page: TLVPageInfo
   URL: http://wiki.apache.org/directory/TLVPageInfo

   no comment

Change Log:

------------------------------------------------------------------------------
@@ -75,14 +75,29 @@
 
 What about the decoding? We can also represent the decoding as a finite state 
automaton :
 
-'''TODO''' : ''Correct transitions int the following pircture : the bit 7 is 
NOT a marker, it's a part of the length (I probably copy/past it from 
TagStateAutomaton ...:(''
-
 attachment:LengthStateAutomaton.png
 
+Note that an error occurs when ''expectedLength > 4 or expectedLength == 
0x7F'', which is quite redundant. In fact, those two conditions lead to 
different errors : 0X7F is a reserved value, while 4 is an arbitrary length 
limit. You will get two different exceptions : '''LengthOverflowException''' 
and '''ReservedExtensionException'''.
 
+There is nothing special about this automaton, it's quite an obvious one. We 
will only store an '''int''' in the '''Length''' container, as it contains 4 
bytes. Optionnaly, we could extend the automaton to accept more than 4 bytes 
length values, but its quite unlucky to be ever necessary (we aren't storing 
DVD movies in a LDAP server, are we? ;-)
 
 ==== Value ====
 
+'''Value''' is the last element to be decoded. It's the one that contains 
valuable informations. There are two kind of '''Value''' : ''Primitive Values'' 
and ''Constructed Values''.
+
+==== Primitive Value ====
+Those '''Value''' are terminal. They can't contain another TLV. In the sample, 
we have 4 primitive '''Values''' :
+ * 02 01 01 which is an ''Integer'' representing the Message ID #1
+ * 0A 01 00 which is an ''ENUMERATED'' which value is 0 (success for a 
BindResponse LDAP Message)
+ * 04 00 are OCTET STRING with no value, as the ''Length'' is 0.
+
+We can see that even if we can read a '''TLV''', the semantic is carried by 
the upper layer. '''TLV''' are just structured containers, no more.
+
+A primitive value may be quite big : even if  we have limited ourself to a 4 
bytes long length, the value part could still contain 2 ^ 32 - 1 bytes (4 294 
967 295 bytes ...), so we must take care of those big values. It can't be an 
option to keep the full value in memory, we must find a way to store them on 
disk, for instance. Of course, it's not an option either to flush to disk all 
the values.... 
+
+The last point is that a primitive value has a fixed size, given by the 
'''Lengh''' part of the '''TLV'''. It will be used for ''constructed values''.
+
+==== Constructed Value ====
 (TODO : replace the total BS below ...)
 
 What about the '''Values'''? '''Length''' was easy, it was totally 
context-free. Which kind of '''Value''' can we have? How do we know the type of 
each '''Value'''?

Reply via email to