1#
2# The Python Imaging Library
3# $Id$
4#
5# BUFR stub adapter
6#
7# Copyright (c) 1996-2003 by Fredrik Lundh
8#
9# See the README file for information on usage and redistribution.
10#
11from __future__ import annotations
12
13from typing import IO
14
15from . import Image, ImageFile
16
17_handler = None
18
19
20def register_handler(handler: ImageFile.StubHandler | None) -> None:
21 """
22 Install application-specific BUFR image handler.
23
24 :param handler: Handler object.
25 """
26 global _handler
27 _handler = handler
28
29
30# --------------------------------------------------------------------
31# Image adapter
32
33
34def _accept(prefix: bytes) -> bool:
35 return prefix[:4] == b"BUFR" or prefix[:4] == b"ZCZC"
36
37
38class BufrStubImageFile(ImageFile.StubImageFile):
39 format = "BUFR"
40 format_description = "BUFR"
41
42 def _open(self) -> None:
43 offset = self.fp.tell()
44
45 if not _accept(self.fp.read(4)):
46 msg = "Not a BUFR file"
47 raise SyntaxError(msg)
48
49 self.fp.seek(offset)
50
51 # make something up
52 self._mode = "F"
53 self._size = 1, 1
54
55 loader = self._load()
56 if loader:
57 loader.open(self)
58
59 def _load(self) -> ImageFile.StubHandler | None:
60 return _handler
61
62
63def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None:
64 if _handler is None or not hasattr(_handler, "save"):
65 msg = "BUFR save handler not installed"
66 raise OSError(msg)
67 _handler.save(im, fp, filename)
68
69
70# --------------------------------------------------------------------
71# Registry
72
73Image.register_open(BufrStubImageFile.format, BufrStubImageFile, _accept)
74Image.register_save(BufrStubImageFile.format, _save)
75
76Image.register_extension(BufrStubImageFile.format, ".bufr")