    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 PropertyChange extends AbstractDecoder
    029    {
    030        private static final String TAG = "PropertyChange";
    031        public int                  moid;
    032        public int                  oid;
    033        public int                  propid;
    034        public int                  kind;
    035        private Object              val;
    036        private boolean             invalid;
    037
    038        PropertyChange(Transport in) throws IOException
    039        {
    040            super(in);
    041            // <modid><oid><typetag or N><propid><propvalueaccordingtotype or
    042            // nothing if N>]]]z
    043            invalid = false;
    044            val = null;
    045            moid = decodeVaruint();
    046            oid = decodeVaruint();
    047            kind = ioTransport.read();
    048            propid = decodeVaruint();
    049
    050            if (kind != 'N') {
    051                val = decodeOneOfKind(kind);
    052            }
    053
    054            // check for known future protocol change
    055            if (ioTransport.peek() == ',') {
    056                invalid = true;
    057                throw new IOException("Multiple property changes in single message are not supported (yet)!");
    058            }
    059
    060            if (ioTransport.read() != ']' ||
    061                    ioTransport.read() != ']' ||
    062                    ioTransport.read() != ']' ||
    063                    ioTransport.read() != 'z')
    064            {
    065                Log.e(TAG, "Propertychange with unregognized extra bytes.");
    066                invalid = true;
    067            }
    068            else {
    069                return;
    070            }
    071        }
    072
    073        private void CheckValidity() throws IOException
    074        {
    075            if (invalid) {
    076                throw new IOException("Attempt to access malformed PropertyChange.");
    077            }
    078
    079            if (val == null) {
    080                Log.e(TAG, "Attempt to read PropertyChange which has no value. Please add check for hasValue().");
    081            }
    082        }
    083
    084        public boolean hasValue()
    085        {
    086            return (!invalid && val != null);
    087        }
    088
    089        public boolean isValid()
    090        {
    091            return (!invalid);
    092        }
    093
    094        public int GetKind()
    095        {
    096            return kind;
    097        }
    098
    099        public int GetOid()
    100        {
    101            return oid;
    102        }
    103
    104        public int GetPropid()
    105        {
    106            return propid;
    107        }
    108
    109        public int GetAsInt() throws IOException
    110        {
    111            CheckValidity();
    112            return ((Number) val).intValue();
    113        }
    114
    115        public boolean GetAsBoolean() throws IOException
    116        {
    117            CheckValidity();
    118            return (((Number) val).intValue() != 0);
    119        }
    120
    121        public String GetAsString() throws IOException
    122        {
    123            CheckValidity();
    124            return (String) val;
    125        }
    126
    127        public byte[] GetAsBinary(int tag) throws IOException
    128        {
    129            CheckValidity();
    130            return (byte[]) val;
    131        }
    132
    133    }