pxd119 / as3-rpclib

Automatically exported from code.google.com/p/as3-rpclib
BSD 3-Clause "New" or "Revised" License
0 stars 0 forks source link

Deserializing error when object.toString is "" FIX included #20

Open GoogleCodeExporter opened 8 years ago

GoogleCodeExporter commented 8 years ago
What steps will reproduce the problem?
This happens for some responses

Stack trace:
TypeError: Error #1086: The name method only works on lists containing one item.
    at XMLList/http://adobe.com/AS3/2006/builtin::name()
    at com.ak33m.rpc.xmlrpc::XMLRPCSerializer$/decodeObject()[/media/HUGE/WORK/InfusionSoft_AIR/as3-rpc-src/as3-rpclib-read-only/src/com/ak33m/rpc/xmlrpc/XMLRPCSerializer.as:198]
    at com.ak33m.rpc.xmlrpc::XMLRPCSerializer$/decodeObject()[/media/HUGE/WORK/InfusionSoft_AIR/as3-rpc-src/as3-rpclib-read-only/src/com/ak33m/rpc/xmlrpc/XMLRPCSerializer.as:258]
    at com.ak33m.rpc.xmlrpc::XMLRPCSerializer$/decodeObject()[/media/HUGE/WORK/InfusionSoft_AIR/as3-rpc-src/as3-rpclib-read-only/src/com/ak33m/rpc/xmlrpc/XMLRPCSerializer.as:249]
    at com.ak33m.rpc.xmlrpc::XMLRPCSerializer$/deserialize()[/media/HUGE/WORK/InfusionSoft_AIR/as3-rpc-src/as3-rpclib-read-only/src/com/ak33m/rpc/xmlrpc/XMLRPCSerializer.as:180]
    at mx.rpc.http::AbstractOperation/http://www.adobe.com/2006/flex/mx/internal::processResult()[E:\dev\4.5.1\frameworks\projects\rpc\src\mx\rpc\http\AbstractOperation.as:998]
    at mx.rpc::AbstractInvoker/http://www.adobe.com/2006/flex/mx/internal::resultHandler()[E:\dev\4.5.1\frameworks\projects\rpc\src\mx\rpc\AbstractInvoker.as:313]
    at mx.rpc::Responder/result()[E:\dev\4.5.1\frameworks\projects\rpc\src\mx\rpc\Responder.as:56]
    at mx.rpc::AsyncRequest/acknowledge()[E:\dev\4.5.1\frameworks\projects\rpc\src\mx\rpc\AsyncRequest.as:84]
    at DirectHTTPMessageResponder/completeHandler()[E:\dev\4.5.1\frameworks\projects\rpc\src\mx\messaging\channels\DirectHTTPChannel.as:451]
    at flash.events::EventDispatcher/dispatchEventFunction()
    at flash.events::EventDispatcher/dispatchEvent()
    at flash.net::URLLoader/onComplete()

I added the check with "" in the begining, this check is also placed in other 
parts of other methods but somehow this happened to me(get this kind of empty 
object)

Also I refactored to use a switch

this is in file XMLRPCSerializer.as

protected static function decodeObject (robject:*):*
    {
        if(robject.toString()=="")
            return "";
        var name:String;
        name = new String(robject.children().name() );

        switch(name){
            case TYPE_STRING:
            {
                return String(robject.string);
            }
            case TYPE_INT:
            {
                return new int(robject.int);
            }
            case TYPE_I4:
            {
                return new int (robject.i4);
            }
            case  TYPE_BOOLEAN:
            {
                if (isNaN(robject.boolean))
                {
                    if (String(robject.boolean).toLowerCase() == "true")
                        return true;
                    else if (String(robject.boolean).toLowerCase() == "false")
                        return false;
                    else
                        return null;
                }
                else
                {
                    return Boolean(Number(robject.boolean));
                }
            }
            case TYPE_DATE:
            {
                var tdatestring:String = robject.children();
                var datepattern:RegExp = /^(-?\d\d\d\d)-?(\d\d)-?(\d\d)T(\d\d):(\d\d):(\d\d)/;
                var d:Array = tdatestring.match(datepattern);
                var tdate:Date =  new Date(d[1],d[2]-1,d[3],d[4],d[5],d[6]);
                return tdate;
            }
            case  TYPE_BASE64:
            {
                var base64decoder:Base64Decoder = new Base64Decoder();
                base64decoder.decode(robject.base64);
                return base64decoder.flush();

            }
            case TYPE_ARRAY:
            {
                var tarray:Array = new Array();
                for each (var value:* in robject.array.data.value)
                {
                    tarray.push(decodeObject(value));
                }
                return tarray;
            }
            case  TYPE_STRUCT:
            {
                var tvalue:Object = new Object();
                for each (var member:* in robject.struct.member)
                {
                    tvalue[member.name] = decodeObject(member.value);
                }
                return tvalue;
            }
            case TYPE_DOUBLE:
            {
                return Number(robject.double);
            }
            default:
            {
                return String(robject);
            }
        }
    }

Original issue reported on code.google.com by simion...@gmail.com on 7 Feb 2012 at 2:06