FudgeStatus FudgeCodec_decodeMsg ( FudgeMsgEnvelope * envelope, const fudge_byte * bytes, fudge_i32 numbytes ) { FudgeStatus status; FudgeMsgHeader header; FudgeMsg message; if ( ! envelope ) return FUDGE_NULL_POINTER; /* Get the message header and use it to create the envelope and the message */ if ( ( status = FudgeHeader_decodeMsgHeader ( &header, bytes, numbytes ) ) != FUDGE_OK ) return status; if ( numbytes < header.numbytes ) return FUDGE_OUT_OF_BYTES; if ( ( status = FudgeMsg_create ( &message ) ) != FUDGE_OK ) return status; if ( ( status = FudgeMsgEnvelope_create ( envelope, header.directives, header.schemaversion, header.taxonomy, message ) ) != FUDGE_OK ) goto release_message_and_fail; /* Envelope now has a message reference */ FudgeMsg_release ( message ); /* Advance to the end of the header */ bytes += sizeof ( FudgeMsgHeader ); numbytes -= sizeof ( FudgeMsgHeader ); /* Consume fields */ if ( ( status = FudgeCodec_decodeMsgFields ( message, bytes, numbytes ) ) != FUDGE_OK ) goto release_envelope_and_fail; return status; release_envelope_and_fail: FudgeMsgEnvelope_release ( *envelope ); release_message_and_fail: FudgeMsg_release ( message ); return status; }
// This must only be called from the thread that creates and connects the pipes. This then // doesn't need to acquire the pipe semaphore as the object won't be modified concurrently. // Another thread might be sending, but that's it. FudgeMsgEnvelope CClientService::Recv (unsigned long lTimeout) { FudgeStatus status; FudgeMsgHeader header; fudge_byte *ptr = (fudge_byte*)m_poPipes->PeekInput (8, lTimeout); // Fudge headers are 8-bytes long if (!ptr) { int ec = GetLastError (); if (ec == ETIMEDOUT) { LOGDEBUG (TEXT ("Timeout reading envelope header")); } else { LOGWARN (TEXT ("Couldn't read Fudge envelope header, error ") << ec); } SetLastError (ec); return NULL; } if ((status = FudgeHeader_decodeMsgHeader (&header, ptr, 8)) != FUDGE_OK) { LOGERROR (TEXT ("Couldn't decode Fudge envelope header, status ") << status); SetLastError (EIO_READ); return NULL; } ptr = (fudge_byte*)m_poPipes->PeekInput (header.numbytes, lTimeout); if (!ptr) { int ec = GetLastError (); LOGWARN (TEXT ("Couldn't read full Fudge message (") << header.numbytes << TEXT (" bytes, error ") << ec); SetLastError (ec); return NULL; } FudgeMsgEnvelope env; status = FudgeCodec_decodeMsg (&env, ptr, header.numbytes); m_poPipes->DiscardInput (header.numbytes); if (status == FUDGE_OK) { return env; } else { LOGERROR (TEXT ("Couldn't decode Fudge message, status ") << status); SetLastError (EIO_READ); return NULL; } }