]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
python: Make files python2/python3 compatible.
authorE.Smith <31170571+azlm8t@users.noreply.github.com>
Tue, 25 Sep 2018 00:08:34 +0000 (01:08 +0100)
committerperexg <perex@perex.cz>
Wed, 26 Sep 2018 15:31:44 +0000 (17:31 +0200)
Ensure files are compatible with python2 and python3.
Main differences:
- print requires brackets
- string is bytes in python2 and unicode in python3
- need to use struct to pack/unpack binary data
- need to convert socket data to bytearray to allow data extraction

lib/py/tvh/htsmsg.py
lib/py/tvh/htsp.py

index a0001519d0183ab0d34404f6075a32af836b2770..a5ea8ca36f6d8eac60ed561dee324ab51abbd799 100644 (file)
@@ -19,21 +19,17 @@ Support for processing HTSMSG binary format
 """
 
 import sys
-
+import struct
 
 # ###########################################################################
 # Utilities
 # ###########################################################################
 
 def int2bin(i):
-    return chr(i >> 24 & 0xFF) + chr(i >> 16 & 0xFF) \
-           + chr(i >> 8 & 0xFF) + chr(i & 0xFF)
-
+    return struct.pack(">i", i)
 
 def bin2int(d):
-    return (ord(d[0]) << 24) + (ord(d[1]) << 16) \
-           + (ord(d[2]) << 8) + ord(d[3])
-
+    return struct.unpack(">i", d)[0]
 
 def uuid2int(uuid):
     if sys.byteorder == 'little':
@@ -78,20 +74,20 @@ class HMFBin(str):
 # Convert python to HTSMSG type
 def hmf_type(f):
     if type(f) == list:
-        return HMF_LIST
+        ret = HMF_LIST
     elif type(f) == dict:
-        return HMF_MAP
+        ret = HMF_MAP
     elif type(f) == str:
-        return HMF_STR
+        ret = HMF_STR
     elif type(f) == int:
-        return HMF_S64
+        ret = HMF_S64
     elif type(f) == HMFBin:
-        return HMF_BIN
+        ret = HMF_BIN
     elif type(f) == bool:
-        return HMF_BOOL
+        ret = HMF_BOOL
     else:
         raise Exception('invalid type')
-
+    return struct.pack("B", ret)
 
 # Size for field
 def _binary_count(f):
@@ -124,26 +120,26 @@ def binary_count(msg):
 
 # Write out field in binary form
 def binary_write(msg):
-    ret = ''
+    ret = b''
     lst = type(msg) == list
     for f in msg:
         na = ''
         if not lst:
             na = f
             f = msg[f]
-        ret = ret + chr(hmf_type(f))
-        ret = ret + chr(len(na) & 0xFF)
+        ret = ret + hmf_type(f)
+        ret = ret + struct.pack("B", (len(na) & 0xFF))
         l = _binary_count(f)
         ret = ret + int2bin(l)
-        ret = ret + na
+        ret = ret + na.encode('utf-8')
 
         if type(f) in [list, dict]:
             ret = ret + binary_write(f)
         elif type(f) in [str, HMFBin]:
-            ret = ret + f
+            ret = ret + f.encode()
         elif type(f) == int:
             while f:
-                ret = ret + chr(f & 0xFF)
+                ret = ret + struct.pack("B", (f & 0xFF))
                 f = f >> 8
         else:
             raise Exception('invalid type')
@@ -164,8 +160,8 @@ def deserialize0(data, typ=HMF_MAP):
         islist = True
         msg = []
     while len(data) > 5:
-        typ = ord(data[0])
-        nlen = ord(data[1])
+        typ = data[0]
+        nlen = data[1]
         dlen = bin2int(data[2:6])
         data = data[6:]
 
@@ -190,7 +186,7 @@ def deserialize0(data, typ=HMF_MAP):
             item = 0
             i = dlen - 1
             while i >= 0:
-                item = (item << 8) | ord(data[i])
+                item = (item << 8) | data[i]
                 i = i - 1
         elif typ in [HMF_LIST, HMF_MAP]:
             item = deserialize0(data[:dlen], typ)
@@ -205,7 +201,7 @@ def deserialize0(data, typ=HMF_MAP):
         if islist:
             msg.append(item)
         else:
-            msg[name] = item
+            msg[name.decode()] = item
         data = data[dlen:]
     return msg
 
@@ -218,7 +214,7 @@ def deserialize(fp, rec=False):
             self._rec = rec
 
         def __iter__(self):
-            print '__iter__()'
+            print ('__iter__()')
             return self
 
         def _read(self, num):
@@ -241,13 +237,17 @@ def deserialize(fp, rec=False):
                 self._fp = None
                 raise StopIteration()
             num = bin2int(tmp)
-            data = ''
+            data = b''
             while len(data) < num:
                 tmp = self._read(num - len(data))
                 if not tmp:
                     raise Exception('failed to read from fp')
                 data = data + tmp
             if not self._rec: self._fp = None
+            # Python2 compatibility: data is a str in python2,
+            # and bytes in python3, so ensure we have consistency
+            # here.
+            data = bytearray(data)
             return deserialize0(data)
 
     ret = _Deserialize(fp, rec)
index 49669ad1672e3eef613ee2e4e3103c224c13b2ec..b7f89982b0ae78d4979f211f2f947795ea9190a5 100644 (file)
@@ -22,8 +22,8 @@ Much of the code is pretty rough, but might help people get started
 with communicating with HTSP server
 """
 
-import log
-import htsmsg
+import tvh.log as log
+import tvh.htsmsg as htsmsg
 
 # ###########################################################################
 # HTSP Client