001    /**
002     * Copyright (C) 2010, Skype Limited
003     *
004     * All intellectual property rights, including but not limited to copyrights,
005     * trademarks and patents, as well as know how and trade secrets contained in,
006     * relating to, or arising from the internet telephony software of
007     * Skype Limited (including its affiliates, "Skype"), including without
008     * limitation this source code, Skype API and related material of such
009     * software proprietary to Skype and/or its licensors ("IP Rights") are and
010     * shall remain the exclusive property of Skype and/or its licensors.
011     * The recipient hereby acknowledges and agrees that any unauthorized use of
012     * the IP Rights is a violation of intellectual property laws.
013     *
014     * Skype reserves all rights and may take legal action against infringers of
015     * IP Rights.
016     *
017     * The recipient agrees not to remove, obscure, make illegible or alter any
018     * notices or indications of the IP Rights and/or Skype's rights and
019     * ownership thereof.
020     */
021    
022    package com.skype.ipc;
023    
024    import java.io.IOException;
025    
026    import com.skype.util.Log;
027    
028    public class Response extends AbstractTaggedInputMessage
029    {
030            private static final String TAG="Response";
031            private int myrid;
032            private boolean err_call;
033            
034        // null response object, used for returning an error condition, like when there is no runtime conneciton
035            Response() {
036                super(null);
037                err_call = true;
038            }
039            
040            public Response(Transport in,int rid) throws IOException
041            {
042                    super(in);
043                    err_call=false;
044                    myrid=rid;
045                    // Check for N response
046                    try {
047                            if(ioTransport.peek()=='N')
048                            {
049                                    // ERR_CALL
050                                    ioTransport.read(); // the 'N'
051                                    int c=ioTransport.read();
052                                    while(c==']')
053                                    {
054                                            c=ioTransport.read();
055                                    }
056                                    if(c!='z')
057                                    {
058                                            Log.e(TAG,"Invalid response 'N' with unknown extra byte=0x"+ Integer.toHexString(c) +".");
059                                            invalid=true;
060                                            return;
061                                    }
062                                    else
063                                    {
064                                            err_call=true;
065                                            invalid=true;
066                                            return;
067                                    }
068                            }
069                    } catch (IOException e) {
070                            Log.e(TAG,"IOException while checking response (rid="+myrid+") validity.");
071                            invalid=true;
072                            return;
073                    }
074                    // Decode parms
075                    try {
076                            while(DecodeNextParm()==true) {};
077                    } catch (IOException e) {
078                            Log.e(TAG,"IOException while decoding response (rid="+myrid+") validity.");
079                            invalid=true;
080                    }
081            }
082    
083            public int GetRid()
084            {
085                    return myrid;
086            }
087            
088            public boolean isErrCall()
089            {
090                    return err_call;
091            }
092            
093            private boolean DecodeNextParm() throws IOException
094            {
095                    int kind=ioTransport.read();
096                    while(kind==']')
097                    {
098                            kind=ioTransport.read();
099                    }
100                    if(kind=='z')
101                    {
102                            return false;
103                    }
104                    int tag=ioTransport.read();
105                    addParm(tag, decodeOneOfKind(kind));
106                    return true;            
107            }
108            
109    }