// Coming from an udp class1 device, with a previous ForwardOpen action
        public void On_ItemMessageReceived(object sender, byte[] packet, SequencedAddressItem ItemPacket, int offset, int msg_length, IPEndPoint remote_address)
        {
            if (ItemPacket.ConnectionId != T2O_ConnectionId)
            {
                return;
            }

            if ((msg_length - offset) == 0)
            {
                return;
            }

            RawData = new byte[msg_length - offset];
            Array.Copy(packet, offset, RawData, 0, RawData.Length);

            if (DecodedMembers != null)
            {
                int Idx = 0;
                try
                {
                    DecodedMembers.DecodeAttr(Id, ref Idx, RawData);
                }
                catch { }
            }


            if (T2OEvent != null)
            {
                T2OEvent(this);
            }
        }
        public override EnIPNetworkStatus ReadDataFromNetwork()
        {
            byte[]            DataPath = EnIPPath.GetPath(myInstance.myClass.Id, myInstance.Id, Id);
            EnIPNetworkStatus ret      = ReadDataFromNetwork(DataPath, CIPServiceCodes.GetAttributeSingle);

            if (ret == EnIPNetworkStatus.OnLine)
            {
                CIPObjectLibrary classid = (CIPObjectLibrary)myInstance.myClass.Id;
                try
                {
                    if (DecodedMembers == null) // No decoder
                    {
                        if (myInstance.DecodedMembers == null)
                        {
                            myInstance.AttachDecoderClass();
                        }

                        DecodedMembers = myInstance.DecodedMembers; // get the same object as the associated Instance
                    }
                    int Idx = 0;
                    DecodedMembers.DecodeAttr(Id, ref Idx, RawData);
                }
                catch { }
            }
            return(ret);
        }
        public override EnIPNetworkStatus ReadDataFromNetwork()
        {
            byte[]            DataPath = EnIPPath.GetPath(myClass.Id, Id, null);
            EnIPNetworkStatus ret      = ReadDataFromNetwork(DataPath, CIPServiceCodes.GetAttributesAll);

            if (ret == EnIPNetworkStatus.OnLine)
            {
                if (DecodedMembers == null)
                {
                    AttachDecoderClass();
                }

                try
                {
                    DecodedMembers.SetRawBytes(RawData);
                }
                catch { }
            }
            return(ret);
        }
        public override bool EncodeFromDecodedMembers()
        {
            byte[] NewRaw = new byte[RawData.Length];

            try
            {
                int Idx = 0;
                if (DecodedMembers.EncodeAttr(Id, ref Idx, NewRaw) == true)
                {
                    RawData = NewRaw;
                    return(true);
                }
                else
                {
                    return(false);
                }
            }
            catch
            {
                return(false);
            }
        }
        public override EnIPNetworkStatus ReadDataFromNetwork()
        {
            // Read all class static attributes
            byte[]            ClassDataPath = EnIPPath.GetPath(Id, 0, null);
            EnIPNetworkStatus ret           = ReadDataFromNetwork(ClassDataPath, CIPServiceCodes.GetAttributesAll);

            // If rejected try to read all attributes one by one
            if (ret == EnIPNetworkStatus.OnLineReadRejected)
            {
                MemoryStream rawbuffer = new MemoryStream();

                ushort AttId = 1; // first static attribut number

                do
                {
                    ClassDataPath = EnIPPath.GetPath(Id, 0, AttId);
                    ret           = ReadDataFromNetwork(ClassDataPath, CIPServiceCodes.GetAttributeSingle);

                    // push the buffer into the data stream
                    if (ret == EnIPNetworkStatus.OnLine)
                    {
                        rawbuffer.Write(RawData, 0, RawData.Length);
                    }
                    AttId++;
                }while (ret == EnIPNetworkStatus.OnLine);

                // yes OK like this, pull the data out of the stream into the RawData
                if (rawbuffer.Length != 0)
                {
                    Status  = ret = EnIPNetworkStatus.OnLine; // all is OK even if the last request is (always) rejected
                    RawData = rawbuffer.ToArray();
                }
            }

            if (ret == EnIPNetworkStatus.OnLine)
            {
                CIPObjectLibrary classid = (CIPObjectLibrary)Id;
                try
                {
                    if (DecodedMembers == null)
                    {
                        try
                        {
                            if (DecoderClass == null)
                            {
                                // try to create the associated class object
                                var o = Activator.CreateInstance(Assembly.GetExecutingAssembly().FullName, "System.Net.EnIPStack.ObjectsLibrary.CIP_" + classid.ToString() + "_class");
                                DecodedMembers = (CIPObject)o.Unwrap();
                            }
                            else
                            {
                                var o = Activator.CreateInstance(DecoderClass);
                                DecodedMembers = (CIPObject)o;
                            }
                        }
                        catch
                        {
                            // echec, get the base class as described in Volume 1, §4-4.1 Class Attributes
                            DecodedMembers = new CIPObjectBaseClass(classid.ToString());
                        }
                    }
                    DecodedMembers.SetRawBytes(RawData);
                }
                catch { }
            }
            return(ret);
        }