Description: update the bintreenode file.
Author: Tarek Galal <tare2.galal@gmail.com>
Reviewed-by: Joao Eriberto Mota Filho <eriberto@debian.org>
Origin: https://github.com/tgalal/yowsup/tree/legacy
Last-Update: 2014-12-02
Index: yowsup-0.0~git20140314.938cf1/src/Yowsup/ConnectionIO/bintreenode.py
===================================================================
--- yowsup-0.0~git20140314.938cf1.orig/src/Yowsup/ConnectionIO/bintreenode.py
+++ yowsup-0.0~git20140314.938cf1/src/Yowsup/ConnectionIO/bintreenode.py
@@ -22,7 +22,7 @@ OR THE USE OR OTHER DEALINGS IN THE SOFT
 from Yowsup.Common.debugger import Debugger
 from Yowsup.Common.datastructures import ByteArray
 from Yowsup.Common.constants import Constants
-
+from .tokenmap import TokenDictionary
 
 from .protocoltreenode import ProtocolTreeNode
 from .ioexceptions import InvalidReadException
@@ -35,30 +35,26 @@ class BinTreeNodeReader():
         self.inputKey = None
         
         self._d('Reader init');
-        self.tokenMap = Constants.dictionary;
         self.rawIn = inputstream;
         self.inn = ByteArray();
         self.buf = []#bytearray(1024);
         self.bufSize = 0;
         self.readSize = 1;
-        
+        self.tokenDictionary = TokenDictionary()
 
     def readStanza(self):
 
-        num = self.readInt8(self.rawIn)
-        stanzaSize = self.readInt16(self.rawIn,1);
+        firstByte = self.readInt8(self.rawIn)
+        stanzaFlag = (firstByte & 0xF0) >> 4
+        stanzaSize = self.readInt16(self.rawIn) | ((firstByte & 0x0F) << 16)
+
+        isEncrypted = ((stanzaFlag & 8) != 0)
 
-        header = (num << 16) + stanzaSize#self.readInt24(self.rawIn)
-        
-        flags = (header >> 20);
-        #stanzaSize =  ((header & 0xF0000) >> 16) | ((header & 0xFF00) >> 8) | (header & 0xFF);
-        isEncrypted = ((flags & 8) != 0)
-        
         self.fillBuffer(stanzaSize);
         
         if self.inputKey is not None and isEncrypted:
             #self.inn.buf = bytearray(self.inn.buf)
-            self.inn.buf = self.inputKey.decodeMessage(self.inn.buf, 0, 4, len(self.inn.buf)-4)[4:]
+            self.inn.buf = self.inputKey.decodeMessage(self.inn.buf, 0, 4, len(self.inn.buf)-4)
 
     def streamStart(self):
 
@@ -68,7 +64,12 @@ class BinTreeNodeReader():
         size = self.readListSize(tag);
         tag = self.inn.read();
         if tag != 1:
-            raise Exception("expecting STREAM_START in streamStart");
+            if tag == 236:
+                tag = self.inn.read + 237
+
+            token = self.tokenDictionary.getToken(tag)
+
+            raise Exception("expecting STREAM_START in streamStart, instead got token: %s" % token);
         attribCount = (size - 2 + size % 2) / 2;
         self.readAttributes(attribCount);
     
@@ -119,22 +120,15 @@ class BinTreeNodeReader():
             attribs[key]=value;
         return attribs;
     
-    def getToken(self,token):
-        if (token >= 0 and token < len(self.tokenMap)):
-            ret = self.tokenMap[token];
-        else:
-            raise Exception("invalid token/length in getToken %i "%token);
-        
-        return ret;
-        
-    
     def readString(self,token):
         
         if token == -1:
             raise Exception("-1 token in readString");
         
-        if token > 4 and token < 245:
-            return self.getToken(token);
+        if token > 2 and token < 245:
+            if token == 236:
+              token = 237 + self.inn.read()
+            return self.tokenDictionary.getToken(token)
         
         if token == 0:
             return None;
@@ -158,7 +152,7 @@ class BinTreeNodeReader():
             
         if token == 254:
             token = self.inn.read();
-            return self.getToken(245+token);
+            return self.tokenMapper.getToken(245+token);
         if token == 250:
             user = self.readString(self.inn.read());
             server = self.readString(self.inn.read());
@@ -254,36 +248,25 @@ class BinTreeNodeWriter():
     TOKEN_8 = 254;
     #socket out; #FunXMPP.WAByteArrayOutputStream
     #socket realOut;
-    tokenMap={}
     
     def __init__(self,o):
         Debugger.attach(self)
 
         self.outputKey = None
 
-        dictionary = Constants.dictionary
         self.realOut = o;
         #self.out = o;
         self.tokenMap = {}
         self.out = ByteArray();
-        #this.tokenMap = new Hashtable(dictionary.length);
-        for i in range(0,len(dictionary)):
-            if dictionary[i] is not None:
-                self.tokenMap[dictionary[i]]=i
-        
-        #Utilities.debug(self.tokenMap);
-        '''
-        for (int i = 0; i < dictionary.length; i++)
-            if (dictionary[i] != null)
-                this.tokenMap.put(dictionary[i], new Integer(i));
-        '''
+
+        self.tokenDictionary = TokenDictionary()
 
     def streamStart(self,domain,resource):
         
         self.realOut.write(87);
         self.realOut.write(65);
         self.realOut.write(1);
-        self.realOut.write(2);
+        self.realOut.write(4);
 
         streamOpenAttributes  = {"to":domain,"resource":resource};
         self.writeListStart(len(streamOpenAttributes )*2+1);
@@ -299,7 +282,7 @@ class BinTreeNodeWriter():
             self.out.write(0);
         else:
             self._d("Outgoing");
-            self._d("\n %s" % node.toString());
+            self._d("\n%s"%node.toString());
             self.writeInternal(node);
 
         self.flushBuffer(needsFlush);
@@ -309,21 +292,17 @@ class BinTreeNodeWriter():
     def processBuffer(self):
         buf = self.out.getBuffer()
 
-        prep = [0,0,0]
-        prep.extend(buf)
-
         length1 = len(self.out.buf)
-        num = 0
 
         if self.outputKey is not None:
-            num = 1
-            prep.extend([0,0,0,0])
             length1 += 4
 
             #prep = bytearray(prep)
-            res = self.outputKey.encodeMessage(prep, len(prep) - 4 , 3, len(prep)-4-3)
+            buf = self.outputKey.encodeMessage(buf, len(buf), 0, len(buf))
 
-            res[0] = ((num << 4) | (length1 & 16711680) >> 16) % 256
+            res = [0,0,0]
+            res.extend(buf)
+            res[0] = ((8 << 4) | (length1 & 16711680) >> 16) % 256
             res[1] = ((length1 & 65280) >> 8) % 256
             res[2] = (length1 & 255) % 256
 
@@ -331,7 +310,9 @@ class BinTreeNodeWriter():
 
             return
         else:
-            prep[0] = ((num << 4) | (length1 & 16711680) >> 16) % 256
+            prep = [0,0,0]
+            prep.extend(buf)
+            prep[0] = ((0 << 4) | (length1 & 16711680) >> 16) % 256
             prep[1] = ((length1 & 65280) >> 8) % 256
             prep[2] = (length1 & 255) % 256
             self.out.buf = prep
@@ -437,8 +418,12 @@ class BinTreeNodeWriter():
     
     def writeString(self,tag):
         try:
-            key = self.tokenMap[tag];
-            self.writeToken(key);
+            key = self.tokenDictionary.getIndex(tag);
+            if key > 235:
+                self.writeToken(236);
+                self.writeToken(key - 237);
+            else:
+                self.writeToken(key);
         except KeyError:
             try:
 
