Пример #1
0
        internal Exchange(XPU xpu, MemoryFragment f, bool isCopy = false)
        {
            XPU = xpu;

            int tid = 0;
            int pos = 0;

            pos     = f.Read(ref tid, pos);
            IsValid = tid == EXCHANGE_TYPE_ID;

            if (IsValid)
            {
                Fragment = f;

                pos        = f.Read(ref ID, pos);
                pos        = f.Read(ref RefID, pos);
                pos        = f.Read(ref Flags, pos);
                pos        = f.Read(ref Created, pos);
                pos        = f.Read(ref ErrorCode, pos);
                pos        = f.Read(ref ResIDLen, pos);
                ResID      = Encoding.UTF8.GetString(f.Span().Slice(pos, ResIDLen));
                DataOffset = pos + ResIDLen;
                state      = isCopy ? (int)XState.Created : (int)XState.Received;
            }
        }
Пример #2
0
        internal Exchange(
            XPU xpu,
            int refID,
            int xflags,
            int errorCode,
            string resID,
            Span <byte> data,
            IMemoryHighway hw)
        {
            XPU = xpu;

            var resBytes = Encoding.UTF8.GetBytes(resID);

            ResIDLen = (ushort)resBytes.Length;
            var fl = data.Length + ResIDLen + HEADER_LEN;

            Fragment = hw.AllocFragment(fl);

            if (Fragment == null)
            {
                throw new ArgumentNullException("Fragment");
            }

            var pos = 0;

            this.ID        = xpu.nextExchangeID();
            this.RefID     = refID;
            this.Flags     = xflags;
            this.Created   = DateTime.Now.Ticks;
            this.ErrorCode = errorCode;
            this.state     = (int)XState.Created;
            this.ResID     = resID;

            pos = Fragment.Write(EXCHANGE_TYPE_ID, pos);
            pos = Fragment.Write(ID, pos);
            pos = Fragment.Write(refID, pos);
            pos = Fragment.Write((int)xflags, pos);
            pos = Fragment.Write(Created, pos);
            pos = Fragment.Write(errorCode, pos);
            pos = Fragment.Write(ResIDLen, pos);

            if (resBytes.Length > 0)
            {
                pos = Fragment.Write(resBytes, pos);
            }

            DataOffset = pos;

            if (data.Length > 0)
            {
                Fragment.Write(data, pos);
            }
        }