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 Log.d(TAG,"New response");
044 err_call=false;
045 myrid=rid;
046 // Check for N response
047 try {
048 if(ioTransport.peek()=='N')
049 {
050 // ERR_CALL
051 ioTransport.read(); // the 'N'
052 int c=ioTransport.read();
053 while(c==']')
054 {
055 c=ioTransport.read();
056 }
057 if(c!='z')
058 {
059 Log.e(TAG,"Invalid response 'N' with unknown extra byte=0x"+ Integer.toHexString(c) +".");
060 invalid=true;
061 return;
062 }
063 else
064 {
065 err_call=true;
066 invalid=true;
067 return;
068 }
069 }
070 } catch (IOException e) {
071 Log.e(TAG,"IOException while checking response (rid="+myrid+") validity.");
072 invalid=true;
073 return;
074 }
075 // Decode parms
076 try {
077 while(DecodeNextParm()==true) {};
078 } catch (IOException e) {
079 Log.e(TAG,"IOException while decoding response (rid="+myrid+") validity.");
080 invalid=true;
081 }
082 Log.d(TAG,"Response rid="+myrid+" decoded. Validity="+(!invalid)+", err_call="+err_call);
083 }
084
085 public int GetRid()
086 {
087 return myrid;
088 }
089
090 public boolean isErrCall()
091 {
092 return err_call;
093 }
094
095 private boolean DecodeNextParm() throws IOException
096 {
097 int kind=ioTransport.read();
098 while(kind==']')
099 {
100 kind=ioTransport.read();
101 }
102 if(kind=='z')
103 {
104 return false;
105 }
106 int tag=ioTransport.read();
107 addParm(tag, decodeOneOfKind(kind));
108 Log.d(TAG,"Decoded one parm of rid="+myrid+", tag="+tag+", kind='"+(char)(kind&0xff)+"'.");
109 return true;
110 }
111
112 }