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; } }
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); } }