(self, value)
| 635 | self._skipkeys = skipkeys |
| 636 | |
| 637 | def write(self, value): |
| 638 | |
| 639 | # Flattened object list: |
| 640 | self._objlist = [] |
| 641 | |
| 642 | # Mappings from object->objectid |
| 643 | # First dict has (type(object), object) as the key, |
| 644 | # second dict is used when object is not hashable and |
| 645 | # has id(object) as the key. |
| 646 | self._objtable = {} |
| 647 | self._objidtable = {} |
| 648 | |
| 649 | # Create list of all objects in the plist |
| 650 | self._flatten(value) |
| 651 | |
| 652 | # Size of object references in serialized containers |
| 653 | # depends on the number of objects in the plist. |
| 654 | num_objects = len(self._objlist) |
| 655 | self._object_offsets = [0]*num_objects |
| 656 | self._ref_size = _count_to_size(num_objects) |
| 657 | |
| 658 | self._ref_format = _BINARY_FORMAT[self._ref_size] |
| 659 | |
| 660 | # Write file header |
| 661 | self._fp.write(b'bplist00') |
| 662 | |
| 663 | # Write object list |
| 664 | for obj in self._objlist: |
| 665 | self._write_object(obj) |
| 666 | |
| 667 | # Write refnum->object offset table |
| 668 | top_object = self._getrefnum(value) |
| 669 | offset_table_offset = self._fp.tell() |
| 670 | offset_size = _count_to_size(offset_table_offset) |
| 671 | offset_format = '>' + _BINARY_FORMAT[offset_size] * num_objects |
| 672 | self._fp.write(struct.pack(offset_format, *self._object_offsets)) |
| 673 | |
| 674 | # Write trailer |
| 675 | sort_version = 0 |
| 676 | trailer = ( |
| 677 | sort_version, offset_size, self._ref_size, num_objects, |
| 678 | top_object, offset_table_offset |
| 679 | ) |
| 680 | self._fp.write(struct.pack('>5xBBBQQQ', *trailer)) |
| 681 | |
| 682 | def _flatten(self, value): |
| 683 | # First check if the object is in the object table, not used for |
nothing calls this directly
no test coverage detected