VPP-959: Support old version of CFFI 74/9174/2
authorOle Troan <ot@cisco.com>
Wed, 1 Nov 2017 09:49:03 +0000 (10:49 +0100)
committerOle Trøan <otroan@employees.org>
Wed, 1 Nov 2017 16:43:51 +0000 (16:43 +0000)
Change-Id: I3d3e5dff5b22fca58a50da6a9d0aaf1182e736dd
Signed-off-by: Ole Troan <ot@cisco.com>
src/vpp-api/python/setup.py
src/vpp-api/python/vpp_papi.py

index 626ddde..abda43d 100644 (file)
@@ -26,7 +26,7 @@ setup (name = 'vpp_papi',
        python_requires='>=2.7, >=3.3',
        license = 'Apache-2.0',
        test_suite = 'tests',
-       install_requires=['cffi >= 1.10'],
+       install_requires=['cffi >= 1.6'],
        py_modules=['vpp_papi'],
        long_description = '''VPP Python language binding.''',
        zip_safe = True,
index 67ac22a..e7e1707 100644 (file)
@@ -25,6 +25,7 @@ import threading
 import glob
 import atexit
 from cffi import FFI
+import cffi
 
 if sys.version[0] == '2':
     import Queue as queue
@@ -54,7 +55,6 @@ void vac_set_error_handler(vac_error_callback_t);
 # Barfs on failure, no need to check success.
 vpp_api = ffi.dlopen('libvppapiclient.so')
 
-
 def vpp_atexit(self):
     """Clean up VPP connection on shutdown."""
     if self.connected:
@@ -166,6 +166,14 @@ class VPP():
         # Register error handler
         vpp_api.vac_set_error_handler(vac_error_handler)
 
+        # Support legacy CFFI
+        # from_buffer supported from 1.8.0
+        (major, minor, patch) = [int(s) for s in cffi.__version__.split('.', 3)]
+        if major >= 1 and minor >= 8:
+            self._write = self._write_new_cffi
+        else:
+            self._write = self._write_legacy_cffi
+
     class ContextId(object):
         """Thread-safe provider of unique context IDs."""
         def __init__(self):
@@ -469,12 +477,18 @@ class VPP():
                 self.logger.debug(
                     'No such message type or failed CRC checksum: %s', n)
 
-    def _write(self, buf):
+    def _write_new_cffi(self, buf):
         """Send a binary-packed message to VPP."""
         if not self.connected:
             raise IOError(1, 'Not connected')
         return vpp_api.vac_write(ffi.from_buffer(buf), len(buf))
 
+    def _write_legacy_cffi(self, buf):
+        """Send a binary-packed message to VPP."""
+        if not self.connected:
+            raise IOError(1, 'Not connected')
+        return vpp_api.vac_write(str(buf), len(buf))
+
     def _read(self):
         if not self.connected:
             raise IOError(1, 'Not connected')