bool DataChannel::Receive(interop::InteropMemory& msg, int32_t timeout) { assert(msg.Capacity() > 4); if (socket.get() == 0) throw IgniteError(IgniteError::IGNITE_ERR_ILLEGAL_STATE, "DataChannel is not established"); // Message size msg.Length(4); OperationResult::T res = ReceiveAll(msg.Data(), static_cast<size_t>(msg.Length()), timeout); if (res == OperationResult::TIMEOUT) return false; if (res == OperationResult::FAIL) throw IgniteError(IgniteError::IGNITE_ERR_GENERIC, "Can not receive message header"); interop::InteropInputStream inStream(&msg); int32_t msgLen = inStream.ReadInt32(); if (msgLen < 0) { Close(); throw IgniteError(IgniteError::IGNITE_ERR_GENERIC, "Protocol error: Message length is negative"); } if (msgLen == 0) return true; if (msg.Capacity() < msgLen + 4) msg.Reallocate(msgLen + 4); msg.Length(4 + msgLen); res = ReceiveAll(msg.Data() + 4, msgLen, timeout); if (res == OperationResult::TIMEOUT) return false; if (res == OperationResult::FAIL) throw IgniteError(IgniteError::IGNITE_ERR_GENERIC, "Connection failure: Can not receive message body"); return true; }
BinaryObjectImpl BinaryObjectImpl::FromMemory(interop::InteropMemory& mem, int32_t offset, BinaryTypeManager* metaMgr) { BinaryObjectHeader header = BinaryObjectHeader::FromMemory(mem, offset); int32_t adjustedStart = static_cast<int32_t>(header.GetMem() - mem.Data()); assert(adjustedStart >= 0); return BinaryObjectImpl(mem, adjustedStart, 0, metaMgr); }