X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fvalerie%2Fvalerie_remote.c;h=580b0bef600ed294a4d262dddcce7ca25fec4ae3;hb=d5d878221c3123ef1d3a335dbc2b1878b3fdb983;hp=4b5023e5f3ba2b6d9d53d3881ee388c10657290e;hpb=661165812e3410fe2f6f49d7af882b36a0efcf82;p=melted diff --git a/src/valerie/valerie_remote.c b/src/valerie/valerie_remote.c index 4b5023e..580b0be 100644 --- a/src/valerie/valerie_remote.c +++ b/src/valerie/valerie_remote.c @@ -27,6 +27,7 @@ #include /* Application header files */ +#include #include "valerie_remote.h" #include "valerie_socket.h" #include "valerie_tokeniser.h" @@ -54,6 +55,8 @@ typedef struct static valerie_response valerie_remote_connect( valerie_remote ); static valerie_response valerie_remote_execute( valerie_remote, char * ); +static valerie_response valerie_remote_receive( valerie_remote, char *, char * ); +static valerie_response valerie_remote_push( valerie_remote, char *, mlt_service ); static void valerie_remote_close( valerie_remote ); static int valerie_remote_read_response( valerie_socket, valerie_response ); @@ -62,21 +65,20 @@ static int valerie_remote_read_response( valerie_socket, valerie_response ); valerie_parser valerie_parser_init_remote( char *server, int port ) { - valerie_parser parser = malloc( sizeof( valerie_parser_t ) ); - valerie_remote remote = malloc( sizeof( valerie_remote_t ) ); + valerie_parser parser = calloc( 1, sizeof( valerie_parser_t ) ); + valerie_remote remote = calloc( 1, sizeof( valerie_remote_t ) ); if ( parser != NULL ) { - memset( parser, 0, sizeof( valerie_parser_t ) ); - parser->connect = (parser_connect)valerie_remote_connect; parser->execute = (parser_execute)valerie_remote_execute; + parser->push = (parser_push)valerie_remote_push; + parser->received = (parser_received)valerie_remote_receive; parser->close = (parser_close)valerie_remote_close; parser->real = remote; if ( remote != NULL ) { - memset( remote, 0, sizeof( valerie_remote_t ) ); remote->parser = parser; remote->server = strdup( server ); remote->port = port; @@ -194,6 +196,52 @@ static valerie_response valerie_remote_execute( valerie_remote remote, char *com return response; } +/** Push a westley document to the server. +*/ + +static valerie_response valerie_remote_receive( valerie_remote remote, char *command, char *buffer ) +{ + valerie_response response = NULL; + pthread_mutex_lock( &remote->mutex ); + if ( valerie_socket_write_data( remote->socket, command, strlen( command ) ) == strlen( command ) ) + { + char temp[ 20 ]; + int length = strlen( buffer ); + response = valerie_response_init( ); + valerie_socket_write_data( remote->socket, "\r\n", 2 ); + sprintf( temp, "%d", length ); + valerie_socket_write_data( remote->socket, temp, strlen( temp ) ); + valerie_socket_write_data( remote->socket, "\r\n", 2 ); + valerie_socket_write_data( remote->socket, buffer, length ); + valerie_socket_write_data( remote->socket, "\r\n", 2 ); + valerie_remote_read_response( remote->socket, response ); + } + pthread_mutex_unlock( &remote->mutex ); + return response; +} + +/** Push a producer to the server. +*/ + +static valerie_response valerie_remote_push( valerie_remote remote, char *command, mlt_service service ) +{ + valerie_response response = NULL; + if ( service != NULL ) + { + mlt_consumer consumer = mlt_factory_consumer( NULL, "westley", "buffer" ); + mlt_properties properties = MLT_CONSUMER_PROPERTIES( consumer ); + char *buffer = NULL; + // Temporary hack + mlt_properties_set( properties, "store", "nle_" ); + mlt_consumer_connect( consumer, service ); + mlt_consumer_start( consumer ); + buffer = mlt_properties_get( properties, "buffer" ); + response = valerie_remote_receive( remote, command, buffer ); + mlt_consumer_close( consumer ); + } + return response; +} + /** Disconnect. */ @@ -201,7 +249,8 @@ static void valerie_remote_disconnect( valerie_remote remote ) { if ( remote != NULL && remote->terminated ) { - pthread_join( remote->thread, NULL ); + if ( remote->connected ) + pthread_join( remote->thread, NULL ); valerie_socket_close( remote->status ); valerie_socket_close( remote->socket ); remote->connected = 0;