class BinTreeNodeReader: def __init__(self, inputstream, dictionary): self.tokenMap = dictionary self.rawIn = inputstream self.inn = ByteArray() self.buf = bytearray(1024) self.bufSize = 0 self.readSize = 1 def streamStart(self): stanzaSize = self.readInt16(self.rawIn, 1) self.fillBuffer(stanzaSize) tag = self.inn.read() size = self.readListSize(tag) tag = self.inn.read() if tag != 1: raise Exception('expecting STREAM_START in streamStart') attribCount = (size - 2 + size % 2) / 2 attributes = self.readAttributes(attribCount) def readInt8(self, i): return i.read() def readInt16(self, i, socketOnly=0): intTop = i.read(socketOnly) intBot = i.read(socketOnly) value = (intTop << 8) + intBot return value def readInt24(self, i): int1 = i.read() int2 = i.read() int3 = i.read() value = (int1 << 16) + (int2 << 8) + (int3 << 0) return value def readListSize(self, token): size = 0 if token == 0: size = 0 else: if token == 248: size = self.readInt8(self.inn) else: if token == 249: size = self.readInt16(self.inn) else: # size = self.readInt8(self.inn) raise Exception('invalid list size in readListSize: token ' + str(token)) return size def readAttributes(self, attribCount): attribs = {} for i in range(0, attribCount): key = self.readString(self.inn.read()) value = self.readString(self.inn.read()) 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 == 0: return None if token == 252: size8 = self.readInt8(self.inn) buf8 = bytearray(size8) self.fillArray(buf8, len(buf8), self.inn) return str(buf8) if token == 253: size24 = self.readInt24(self.inn) buf24 = bytearray(size24) self.fillArray(buf24, len(buf24), self.inn) return str(buf24) if token == 254: token = self.inn.read() return self.getToken(245 + token) if token == 250: user = self.readString(self.inn.read()) server = self.readString(self.inn.read()) if user is not None and server is not None: return user + '@' + server if server is not none: return server raise Exception("readString couldn't reconstruct jid") raise Exception("readString couldn't match token") def nextTree(self): stanzaSize = self.readInt16(self.rawIn, 1) self.inn.buf = [] self.fillBuffer(stanzaSize) return self.nextTreeInternal() def fillBuffer(self, stanzaSize): if len(self.buf) < stanzaSize: newsize = max(len(self.buf) * 3 / 2, stanzaSize) self.buf = bytearray(newsize) self.bufSize = stanzaSize self.fillArray(self.buf, stanzaSize, self.rawIn) self.inn = ByteArray() self.inn.write(self.buf) def fillArray( self, buf, length, inputstream, ): count = 0 while count < length: count += inputstream.read2(buf, count, length - count) def nextTreeInternal(self): b = self.inn.read() size = self.readListSize(b) b = self.inn.read() if b == 2: return None tag = self.readString(b) if size == 0 or tag is None: raise ConnectionClosedException('nextTree sees 0 list or null tag' ) attribCount = (size - 2 + size % 2) / 2 attribs = self.readAttributes(attribCount) if size % 2 == 1: return ProtocolTreeNode(tag, attribs) b = self.inn.read() if self.isListTag(b): return ProtocolTreeNode(tag, attribs, self.readList(b)) return ProtocolTreeNode(tag, attribs, None, self.readString(b)) def readList(self, token): size = self.readListSize(token) listx = [] for i in range(0, size): listx.append(self.nextTreeInternal()) return listx def isListTag(self, b): return b == 248 or b == 0 or b == 249
class BinTreeNodeReader(): def __init__(self,inputstream,dictionary): d = ConnDebug() self._d = d.d; self._d('Reader init'); self.tokenMap = dictionary; self.rawIn = inputstream; self.inn = ByteArray(); self.buf = bytearray(1024); self.bufSize = 0; self.readSize = 1; def streamStart(self): stanzaSize = self.readInt16(self.rawIn,1); self.fillBuffer(stanzaSize); tag = self.inn.read(); size = self.readListSize(tag); tag = self.inn.read(); if tag != 1: raise Exception("expecting STREAM_START in streamStart"); attribCount = (size - 2 + size % 2) / 2; attributes = self.readAttributes(attribCount); def readInt8(self,i): return i.read(); def readInt16(self,i,socketOnly=0): intTop = i.read(socketOnly); intBot = i.read(socketOnly); #Utilities.debug(str(intTop)+"------------"+str(intBot)); value = (intTop << 8) + intBot; if value is not None: return value; else: return ""; def readInt24(self,i): int1 = i.read(); int2 = i.read(); int3 = i.read(); value = (int1 << 16) + (int2 << 8) + (int3 << 0); return value; def readListSize(self,token): size = 0; if token == 0: size = 0; else: if token == 248: size = self.readInt8(self.inn); else: if token == 249: size = self.readInt16(self.inn); else: #size = self.readInt8(self.inn); raise Exception("invalid list size in readListSize: token " + str(token)); return size; def readAttributes(self,attribCount): attribs = {}; for i in range(0,attribCount): key = self.readString(self.inn.read()); value = self.readString(self.inn.read()); 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 == 0: return None; if token == 252: size8 = self.readInt8(self.inn); buf8 = bytearray(size8); self.fillArray(buf8,len(buf8),self.inn); #print self.inn.buf; return str(buf8); #return size8; if token == 253: size24 = self.readInt24(self.inn); buf24 = bytearray(size24); self.fillArray(buf24,len(buf24),self.inn); return str(buf24); if token == 254: token = self.inn.read(); return self.getToken(245+token); if token == 250: user = self.readString(self.inn.read()); server = self.readString(self.inn.read()); if user is not None and server is not None: return user + "@" + server; if server is not none: return server; raise Exception("readString couldn't reconstruct jid"); raise Exception("readString couldn't match token"); def nextTree(self): stanzaSize = self.readInt16(self.rawIn,1); self.inn.buf = []; self.fillBuffer(stanzaSize); ret = self.nextTreeInternal(); self._d("Incoming") if ret is not None: if 'picture type="' in ret.toString(): self._d("<Picture!!!>"); else: self._d("\n%s"%ret.toString()); return ret; def fillBuffer(self,stanzaSize): if len(self.buf) < stanzaSize: newsize = max(len(self.buf)*3/2,stanzaSize); self.buf = bytearray(newsize); self.bufSize = stanzaSize; self.fillArray(self.buf, stanzaSize, self.rawIn); self.inn = ByteArray(); self.inn.write(self.buf); #this.in = new ByteArrayInputStream(this.buf, 0, stanzaSize); #self.inn.setReadSize(stanzaSize); #Utilities.debug(str(len(self.buf))+":::"+str(stanzaSize)); def fillArray(self, buf,length,inputstream): count = 0; while count < length: count+=inputstream.read2(buf,count,length-count); def nextTreeInternal(self): b = self.inn.read(); size = self.readListSize(b); b = self.inn.read(); if b == 2: return None; tag = self.readString(b); if size == 0 or tag is None: raise ConnectionClosedException("nextTree sees 0 list or null tag"); attribCount = (size - 2 + size%2)/2; attribs = self.readAttributes(attribCount); if size % 2 ==1: return ProtocolTreeNode(tag,attribs); b = self.inn.read(); if self.isListTag(b): return ProtocolTreeNode(tag,attribs,self.readList(b)); return ProtocolTreeNode(tag,attribs,None,self.readString(b)); def readList(self,token): size = self.readListSize(token); listx = [] for i in range(0,size): listx.append(self.nextTreeInternal()); return listx; def isListTag(self,b): return (b == 248) or (b == 0) or (b == 249);