]> git.sesse.net Git - mlt/blobdiff - src/valerie/valerie_remote.c
Feed rework and fixes to westley and composite
[mlt] / src / valerie / valerie_remote.c
index 4b5023e5f3ba2b6d9d53d3881ee388c10657290e..04ad67aaa2ae1e6ca50bb724ffc37da622665460 100644 (file)
@@ -27,6 +27,7 @@
 #include <pthread.h>
 
 /* Application header files */
+#include <framework/mlt.h>
 #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( "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;