Ticket #355: amf3.diff

File amf3.diff, 4.1 KB (added by dthompso, 3 months ago)

hacks to amf3.py

  • amf3.py

     
    2727 
    2828import pyamf 
    2929from pyamf import util 
     30from pyamf.flex import ArrayCollection, ObjectProxy 
    3031 
     32# encode/decode list,tuple/dict to 
     33# ArrayCollection/ObjectProxy 
     34use_proxies = True 
     35 
    3136try: 
    3237    set() 
    3338except NameError: 
     
    644649    """ 
    645650 
    646651    def __init__(self): 
     652        # Caches objects that have been  
     653        # modified in some way. 
     654        # Added by Dave Thompson 
     655        self.translated = {} 
     656 
    647657        self.strings = util.IndexedCollection(use_hash=True) 
    648658        self.classes = util.IndexedCollection() 
    649659        self.class_defs = util.IndexedCollection() 
     
    657667        """ 
    658668        pyamf.BaseContext.clear(self) 
    659669 
     670        self.translated = {} 
    660671        self.strings.clear() 
    661672        self.classes.clear() 
    662673        self.class_defs.clear() 
     
    670681        """ 
    671682        pyamf.BaseContext.reset(self) 
    672683 
     684        self.translated = {} 
    673685        self.strings.clear() 
    674686        self.classes.clear() 
    675687        self.class_defs.clear() 
    676688        self.legacy_xml.clear() 
    677689 
     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 
    678708    def getString(self, ref): 
    679709        """ 
    680710        Gets a string based on a reference C{ref}. 
     
    11151145            obj = klass() 
    11161146 
    11171147        obj_attrs = pyamf.ASObject() 
    1118         self.context.addObject(obj) 
    11191148 
    11201149        if class_def.encoding in (ObjectEncoding.EXTERNAL, ObjectEncoding.PROXY): 
    11211150            obj.__readamf__(DataInput(self)) 
     
    11331162            for k, v in obj_attrs.iteritems(): 
    11341163                setattr(obj, k, v) 
    11351164 
     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) 
    11361174        return obj 
    11371175 
    11381176    def _readXML(self, legacy=False): 
     
    14331471        @type use_references: C{bool} 
    14341472        @param use_references: Default is C{True}. 
    14351473        """ 
     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 
    14361488        self.writeType(ASTypes.ARRAY) 
    14371489 
    14381490        if use_references is True: 
     
    15871639        @type use_references: C{bool} 
    15881640        @raise EncodeError: Encoding an object in amf3 tagged as amf0 only. 
    15891641        """ 
     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 
    15901659        self.writeType(ASTypes.OBJECT) 
    15911660 
    15921661        if use_references is True: