image.py 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. # greaseweazle/image/image.py
  2. #
  3. # Written & released by Keir Fraser <keir.xen@gmail.com>
  4. #
  5. # This is free and unencumbered software released into the public domain.
  6. # See the file COPYING for more details, or visit <http://unlicense.org>.
  7. import os
  8. from greaseweazle import error
  9. class Image:
  10. read_only = False
  11. ## Context manager for image objects created using .to_file()
  12. def __enter__(self):
  13. self.file = open(self.filename, "wb")
  14. return self
  15. def __exit__(self, type, value, tb):
  16. try:
  17. if type is None:
  18. # No error: Normal writeout.
  19. self.file.write(self.get_image())
  20. finally:
  21. # Always close the file.
  22. self.file.close()
  23. if type is not None:
  24. # An error occurred: We remove the target file.
  25. os.remove(self.filename)
  26. ## Default .to_file() constructor
  27. @classmethod
  28. def to_file(cls, name, fmt=None):
  29. error.check(not cls.read_only,
  30. "%s: Cannot create %s image files" % (name, cls.__name__))
  31. obj = cls()
  32. obj.filename = name
  33. obj.fmt = fmt
  34. return obj
  35. ## Above methods and class variables can be overridden by subclasses.
  36. ## Additionally, subclasses must provide following public interfaces:
  37. ## Read support:
  38. # def from_file(cls, name)
  39. # def get_track(self, cyl, side)
  40. ## Write support (if not cls.read_only):
  41. # def emit_track(self, cyl, side, track)
  42. ## Plus either:
  43. # def get_image(self)
  44. ## Or:
  45. # __enter__ / __exit__
  46. # Local variables:
  47. # python-indent: 4
  48. # End: