(self, value)
| 651 | self._aware_datetime = aware_datetime |
| 652 | |
| 653 | def write(self, value): |
| 654 | |
| 655 | # Flattened object list: |
| 656 | self._objlist = [] |
| 657 | |
| 658 | # Mappings from object->objectid |
| 659 | # First dict has (type(object), object) as the key, |
| 660 | # second dict is used when object is not hashable and |
| 661 | # has id(object) as the key. |
| 662 | self._objtable = {} |
| 663 | self._objidtable = {} |
| 664 | |
| 665 | # Create list of all objects in the plist |
| 666 | self._flatten(value) |
| 667 | |
| 668 | # Size of object references in serialized containers |
| 669 | # depends on the number of objects in the plist. |
| 670 | num_objects = len(self._objlist) |
| 671 | self._object_offsets = [0]*num_objects |
| 672 | self._ref_size = _count_to_size(num_objects) |
| 673 | |
| 674 | self._ref_format = _BINARY_FORMAT[self._ref_size] |
| 675 | |
| 676 | # Write file header |
| 677 | self._fp.write(b'bplist00') |
| 678 | |
| 679 | # Write object list |
| 680 | for obj in self._objlist: |
| 681 | self._write_object(obj) |
| 682 | |
| 683 | # Write refnum->object offset table |
| 684 | top_object = self._getrefnum(value) |
| 685 | offset_table_offset = self._fp.tell() |
| 686 | offset_size = _count_to_size(offset_table_offset) |
| 687 | offset_format = '>' + _BINARY_FORMAT[offset_size] * num_objects |
| 688 | self._fp.write(struct.pack(offset_format, *self._object_offsets)) |
| 689 | |
| 690 | # Write trailer |
| 691 | sort_version = 0 |
| 692 | trailer = ( |
| 693 | sort_version, offset_size, self._ref_size, num_objects, |
| 694 | top_object, offset_table_offset |
| 695 | ) |
| 696 | self._fp.write(struct.pack('>5xBBBQQQ', *trailer)) |
| 697 | |
| 698 | def _flatten(self, value): |
| 699 | # First check if the object is in the object table, not used for |
nothing calls this directly
no test coverage detected