public PyPacket()
 {
     type = Macho.MachoNetMsg_Type.__Fake_Invalid_Type;
     type_string = "none";
     userID = 0;
     payload = null;
     named_payload = null;
     source = new PyAddress();
     dest = new PyAddress();
 }
        public bool Decode( PyObject data )
        {
            PyObject packet = data;

            if (packet.Type == PyObjectType.ChecksumedStream)
            {
                packet = packet.As<PyChecksumedStream>().Data;
            }

            if (packet.Type == PyObjectType.SubStream)
            {
                packet = packet.As<PySubStream>().Data;
            }

            if (packet.Type != PyObjectType.ObjectData)
            {
                return false;
            }

            PyObjectData packeto = packet.As<PyObjectData>();

            type_string = packeto.Name;

            if (packeto.Arguments.Type != PyObjectType.Tuple)
            {
                return false;
            }

            PyTuple tuple = packeto.Arguments.As<PyTuple>();

            if (tuple.Items.Count != 6)
            {
                return false;
            }

            if ((tuple.Items[0].Type != PyObjectType.IntegerVar) && ( tuple.Items[0].Type != PyObjectType.Long ) )
            {
                return false;
            }

            PyInt typer = tuple.Items[0].As<PyInt>();

            type = (Macho.MachoNetMsg_Type)typer.Value;

            if (!source.Decode(tuple.Items[1]))
            {
                return false;
            }

            if (!dest.Decode(tuple.Items[2]))
            {
                return false;
            }

            if ((tuple.Items[3].Type == PyObjectType.IntegerVar) || (tuple.Items[3].Type == PyObjectType.Long) )
            {
                userID = (uint)tuple.Items[3].As<PyInt>().Value;
            }
            else if (tuple.Items[3].Type == PyObjectType.None)
            {
                userID = 0;
            }
            else
            {
                return false;
            }

            // Payload( or call arguments )
            if ((tuple.Items[4].Type != PyObjectType.Buffer) && (tuple.Items[4].Type != PyObjectType.Tuple))
            {
                return false;
            }

            payload = tuple.Items[4].As<PyTuple>();

            if (tuple.Items[5].Type == PyObjectType.None)
            {
                named_payload = new PyDict();
            }
            else if (tuple.Items[5].Type == PyObjectType.Dict)
            {
                named_payload = tuple.Items[5].As<PyDict>();
            }
            else
            {
                return false;
            }

            return true;
        }