示例#1
0
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;
}
示例#2
0
// 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;
	}
}