Python CFFI bindings for image format libraries
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

47 lines
1.3 KiB

#!/usr/bin/env python3
# Helper for getting buffers from file objects
from __future__ import unicode_literals, division
import mmap
class FileBuffer(object):
def __init__(self, fileobj):
self.file = fileobj
try:
self.fileno = self.file.fileno()
except OSError:
self.fileno = -1
if self.fileno != -1:# and self.fd.seekable(): # Python 2.x doesn't have seekable()
# size
self.file.seek(0, 2)
self.size = self.file.tell()
self.buffer = mmap.mmap(self.fileno, self.size, access=mmap.ACCESS_READ)
self.type = "mmap"
elif hasattr(self.file, "getbuffer"): # BytesIO
self.buffer = self.file.getbuffer()
self.size = len(self.buffer)
self.type = "buffer"
else:
self.buffer = self.file.read()
self.size = len(self.buffer)
self.type = "bytes"
def close(self):
if self.type == "mmap":
self.file.close()
elif self.type == "bytes":
del self.buffer
elif self.type == "buffer":
self.buffer = None
else:
raise RuntimeError("Unknown FileBuffer type %s" % self.type)
def __enter__(self):
return self
def __exit__(self, t, e, tb):
self.close()