@ -22,7 +22,10 @@
# include <stdarg.h>
# include <arpa/inet.h>
# include <sys/types.h>
# include <stdint.h>
# include <string.h>
# include "trbase.h"
# include "trio.h"
@ -49,21 +52,69 @@ protocolRawCreateMessage(void * _this, TR_Socket remote)
static
TR_RemoteData
protocolRawParse ( void * _this , TR_ProtoMessage _message , TR_RemoteData data )
protocolRawParse ( void * _this , TR_ProtoMessage _message , TR_RemoteData _ data)
{
TR_ProtoMessageRaw message = ( TR_ProtoMessageRaw ) _message ;
TR_ProtoMessageRaw message = ( TR_ProtoMessageRaw ) _message ;
size_t size = ( ( TR_SizedData ) _data ) - > size ;
char * data = ( ( TR_SizedData ) _data ) - > data ;
TR_RemoteData retval = NULL ;
if ( ! message - > data ) {
if ( message - > size = = 0 ) {
if ( size = = 1 ) {
message - > size = * ( char * ) data < < 8 ;
TR_delete ( _data ) ;
return NULL ;
} else {
message - > size = * ( uint16_t * ) data ;
size - = 2 ;
data + = 2 ;
}
} else {
message - > size & = * ( char * ) data ;
size - - ;
data + + ;
}
message - > size = ntohs ( message - > size ) ;
message - > data = TR_malloc ( message - > size ) ;
}
if ( size > = message - > size - message - > size_done ) {
memcpy ( message - > data , data , message - > size - message - > size_done ) ;
size - = message - > size - message - > size_done ;
data + = message - > size - message - > size_done ;
message - > size_done = message - > size ;
_message - > ready = 1 ;
message - > data = data ;
_message - > ready = 1 ;
if ( size ) {
retval = TR_new ( TR_RemoteData , data , size , _data - > remote ) ;
}
} else {
memcpy ( message - > data , data , size ) ;
message - > size_done = size ;
}
return NULL ;
TR_delete ( _data ) ;
return retval ;
}
static
TR_RemoteData
protocolRawCompose ( void * _this , TR_ProtoMessage _message )
{
return ( ( TR_ProtoMessageRaw ) _message ) - > data ;
TR_ProtoMessageRaw message = ( TR_ProtoMessageRaw ) _message ;
TR_SizedData data ;
data = ( TR_SizedData ) TR_new ( TR_RemoteData , NULL , 0 , _message - > remote ) ;
data - > size = message - > size + 2 ;
data - > data = TR_malloc ( data - > size ) ;
* ( uint16_t * ) data - > data = htons ( message - > size ) ;
memcpy ( data - > data + 2 , message - > data , message - > size ) ;
return ( TR_RemoteData ) data ;
}
TR_INIT_IFACE ( TR_Class , protocolRawCtor , protocolRawDtor , NULL ) ;