template <typename Stream> bool ConnectionPacket::Serialize( Stream & stream )
    {
        ConnectionContext * context = (ConnectionContext*) stream.GetContext();

        assert( context );
        assert( context->magic == ConnectionContextMagic );
        assert( context->messageFactory );
        assert( context->connectionConfig );

        // ack system

        bool perfect_acks = Stream::IsWriting ? ( ack_bits == 0xFFFFFFFF ) : 0;

        serialize_bool( stream, perfect_acks );

        if ( !perfect_acks )
            serialize_bits( stream, ack_bits, 32 );
        else
            ack_bits = 0xFFFFFFFF;

        serialize_bits( stream, sequence, 16 );

        serialize_ack_relative( stream, sequence, ack );

        // channel entries

        const int numChannels = context->connectionConfig->numChannels;

        serialize_int( stream, numChannelEntries, 0, context->connectionConfig->numChannels );

#if YOJIMBO_VALIDATE_PACKET_BUDGET
        assert( stream.GetBitsProcessed() <= ConservativeConnectionPacketHeaderEstimate );
#endif // #if YOJIMBO_VALIDATE_PACKET_BUDGET

        if ( numChannelEntries > 0 )
        {
            if ( Stream::IsReading )
            {
                if ( !AllocateChannelData( *context->messageFactory, numChannelEntries ) )
                    return false;
            }

            for ( int i = 0; i < numChannelEntries; ++i )
            {
                if ( !channelEntry[i].SerializeInternal( stream, *m_messageFactory, context->connectionConfig->channelConfig, numChannels ) )
                    return false;
            }
        }

        return true;
    }
Пример #2
0
static int scope_serialize(Unit *u, FILE *f, FDSet *fds) {
        Scope *s = SCOPE(u);

        assert(s);
        assert(f);
        assert(fds);

        (void) serialize_item(f, "state", scope_state_to_string(s->state));
        (void) serialize_bool(f, "was-abandoned", s->was_abandoned);

        if (s->controller)
                (void) serialize_item(f, "controller", s->controller);

        return 0;
}