Ticket #355: amf3.diff
| File amf3.diff, 4.1 KB (added by dthompso, 3 months ago) |
|---|
-
amf3.py
27 27 28 28 import pyamf 29 29 from pyamf import util 30 from pyamf.flex import ArrayCollection, ObjectProxy 30 31 32 # encode/decode list,tuple/dict to 33 # ArrayCollection/ObjectProxy 34 use_proxies = True 35 31 36 try: 32 37 set() 33 38 except NameError: … … 644 649 """ 645 650 646 651 def __init__(self): 652 # Caches objects that have been 653 # modified in some way. 654 # Added by Dave Thompson 655 self.translated = {} 656 647 657 self.strings = util.IndexedCollection(use_hash=True) 648 658 self.classes = util.IndexedCollection() 649 659 self.class_defs = util.IndexedCollection() … … 657 667 """ 658 668 pyamf.BaseContext.clear(self) 659 669 670 self.translated = {} 660 671 self.strings.clear() 661 672 self.classes.clear() 662 673 self.class_defs.clear() … … 670 681 """ 671 682 pyamf.BaseContext.reset(self) 672 683 684 self.translated = {} 673 685 self.strings.clear() 674 686 self.classes.clear() 675 687 self.class_defs.clear() 676 688 self.legacy_xml.clear() 677 689 690 def getTranslatedObject(self, obj): 691 """ 692 Returns an object that has been modified. 693 694 Returns None if translated object is not cached. 695 696 Added by Dave Thompson 697 """ 698 key = id(obj) 699 if self.translated.has_key(key): 700 return self.translated[key] 701 else: 702 return None 703 704 def setTranslatedObject(self, obj, trans_obj): 705 """Sets a translated object in the cache.""" 706 self.translated[id(obj)] = trans_obj 707 678 708 def getString(self, ref): 679 709 """ 680 710 Gets a string based on a reference C{ref}. … … 1115 1145 obj = klass() 1116 1146 1117 1147 obj_attrs = pyamf.ASObject() 1118 self.context.addObject(obj)1119 1148 1120 1149 if class_def.encoding in (ObjectEncoding.EXTERNAL, ObjectEncoding.PROXY): 1121 1150 obj.__readamf__(DataInput(self)) … … 1133 1162 for k, v in obj_attrs.iteritems(): 1134 1163 setattr(obj, k, v) 1135 1164 1165 if use_proxies: 1166 # Added by Dave Thompson 1167 # to decode proxy objects 1168 if type(obj) == ArrayCollection: 1169 obj = obj.values() 1170 elif type(obj) == ObjectProxy and type(obj._amf_object) == pyamf.ASObject: 1171 obj = dict(obj._amf_object) 1172 1173 self.context.addObject(obj) 1136 1174 return obj 1137 1175 1138 1176 def _readXML(self, legacy=False): … … 1433 1471 @type use_references: C{bool} 1434 1472 @param use_references: Default is C{True}. 1435 1473 """ 1474 if use_proxies: 1475 # Added by Dave Thompson 1476 # Encode all lists,tuples into ArrayCollections 1477 if use_references: 1478 obj = self.context.getTranslatedObject(n) 1479 else: 1480 obj = None 1481 if obj is None: 1482 obj = ArrayCollection(n) 1483 if use_references: 1484 self.context.setTranslatedObject(n, obj) 1485 self.writeObject(obj, use_references) 1486 return 1487 1436 1488 self.writeType(ASTypes.ARRAY) 1437 1489 1438 1490 if use_references is True: … … 1587 1639 @type use_references: C{bool} 1588 1640 @raise EncodeError: Encoding an object in amf3 tagged as amf0 only. 1589 1641 """ 1642 if use_proxies and type(obj) == dict: 1643 # Added by Dave Thompson 1644 # encode dicts as ObjectProxys 1645 if use_references: 1646 new_obj = self.context.getTranslatedObject(obj) 1647 else: 1648 new_obj = None 1649 if new_obj is None: 1650 as_obj = pyamf.ASObject() 1651 for k, v in obj.iteritems(): 1652 as_obj[k] = v 1653 new_obj = ObjectProxy(as_obj) 1654 if use_references: 1655 self.context.setTranslatedObject(obj, new_obj) 1656 self.writeObject(new_obj, use_references) 1657 return 1658 1590 1659 self.writeType(ASTypes.OBJECT) 1591 1660 1592 1661 if use_references is True:
