| 18 | |
| 19 | |
| 20 | class MwmPython(mi.Mwm): |
| 21 | def __init__(self, filename: str, parse: bool = False): |
| 22 | super().__init__(filename) |
| 23 | |
| 24 | self.f = open(filename, "rb") |
| 25 | self.file = mmap.mmap(self.f.fileno(), 0, access=mmap.ACCESS_READ) |
| 26 | |
| 27 | self.tags = self._read_sections_info() |
| 28 | |
| 29 | self.seek_tag("header") |
| 30 | coord_bits = read_varuint(self.file) |
| 31 | self.coord_size = (1 << coord_bits) - 1 |
| 32 | self.base_point = mwm_bitwise_split(read_varuint(self.file)) |
| 33 | self.bounds_ = read_bounds(self.file, self.coord_size) |
| 34 | self.scales = read_uint_array(self.file) |
| 35 | self.langs = [mi.LANGS[code] for code in read_uint_array(self.file)] |
| 36 | self.map_type = mi.MapType(read_varint(self.file)) |
| 37 | |
| 38 | self.version_ = self._read_version() |
| 39 | self.metadata_offsets = self._read_metadata_offsets() |
| 40 | |
| 41 | def version(self) -> mi.MwmVersion: |
| 42 | return self.version_ |
| 43 | |
| 44 | def type(self) -> mi.MapType: |
| 45 | return self.map_type |
| 46 | |
| 47 | def bounds(self) -> mi.Rect: |
| 48 | return self.bounds_ |
| 49 | |
| 50 | def sections_info(self) -> Dict[str, mi.SectionInfo]: |
| 51 | return self.tags |
| 52 | |
| 53 | def __len__(self) -> int: |
| 54 | old_pos = self.file.tell() |
| 55 | pos, end = self._get_features_offset_and_size() |
| 56 | size = 0 |
| 57 | while pos < end: |
| 58 | self.file.seek(pos) |
| 59 | feature_size = read_varuint(self.file) |
| 60 | pos = self.file.tell() + feature_size |
| 61 | size += 1 |
| 62 | self.file.seek(old_pos) |
| 63 | return size |
| 64 | |
| 65 | def __iter__(self) -> Iterable: |
| 66 | return MwmPythonIter(self) |
| 67 | |
| 68 | def get_tag(self, name: str) -> mi.SectionInfo: |
| 69 | return self.tags[name] |
| 70 | |
| 71 | def seek_tag(self, name: str): |
| 72 | self.file.seek(self.tags[name].offset) |
| 73 | |
| 74 | def has_tag(self, name: str) -> bool: |
| 75 | return name in self.tags and self.tags[name].size > 0 |
| 76 | |
| 77 | def _read_sections_info(self) -> Dict[str, mi.SectionInfo]: |