(self, value)
| 474 | self._skipkeys = skipkeys |
| 475 | |
| 476 | def write(self, value): |
| 477 | |
| 478 | # Flattened object list: |
| 479 | self._objlist = [] |
| 480 | |
| 481 | # Mappings from object->objectid |
| 482 | # First dict has (type(object), object) as the key, |
| 483 | # second dict is used when object is not hashable and |
| 484 | # has id(object) as the key. |
| 485 | self._objtable = {} |
| 486 | self._objidtable = {} |
| 487 | |
| 488 | # Create list of all objects in the plist |
| 489 | self._flatten(value) |
| 490 | |
| 491 | # Size of object references in serialized containers |
| 492 | # depends on the number of objects in the plist. |
| 493 | num_objects = len(self._objlist) |
| 494 | self._object_offsets = [0]*num_objects |
| 495 | self._ref_size = _count_to_size(num_objects) |
| 496 | |
| 497 | self._ref_format = _BINARY_FORMAT[self._ref_size] |
| 498 | |
| 499 | # Write file header |
| 500 | self._fp.write(b'bplist00') |
| 501 | |
| 502 | # Write object list |
| 503 | for obj in self._objlist: |
| 504 | self._write_object(obj) |
| 505 | |
| 506 | # Write refnum->object offset table |
| 507 | top_object = self._getrefnum(value) |
| 508 | offset_table_offset = self._fp.tell() |
| 509 | offset_size = _count_to_size(offset_table_offset) |
| 510 | offset_format = '>' + _BINARY_FORMAT[offset_size] * num_objects |
| 511 | self._fp.write(struct.pack(offset_format, *self._object_offsets)) |
| 512 | |
| 513 | # Write trailer |
| 514 | sort_version = 0 |
| 515 | trailer = ( |
| 516 | sort_version, offset_size, self._ref_size, num_objects, |
| 517 | top_object, offset_table_offset |
| 518 | ) |
| 519 | self._fp.write(struct.pack('>5xBBBQQQ', *trailer)) |
| 520 | |
| 521 | def _flatten(self, value): |
| 522 | # First check if the object is in the object table, not used for |
no test coverage detected