}
buffer[ bytes ] = '\0';
if ( bytes > 0 && total == bytes )
- service = ( mlt_service )mlt_factory_producer( "westley-xml", buffer );
- mlt_events_fire( owner, "push-received", &response, command, service, NULL );
- if ( response == NULL )
- response = valerie_parser_push( parser, command, service );
+ {
+ if ( mlt_properties_get( owner, "push-parser-off" ) == 0 )
+ {
+ service = ( mlt_service )mlt_factory_producer( "westley-xml", buffer );
+ mlt_events_fire( owner, "push-received", &response, command, service, NULL );
+ if ( response == NULL )
+ response = valerie_parser_push( parser, command, service );
+ }
+ else
+ {
+ response = valerie_parser_received( parser, command, buffer );
+ }
+ }
error = connection_send( fd, response );
valerie_response_close( response );
mlt_service_close( service );
static valerie_response miracle_local_connect( miracle_local );
static valerie_response miracle_local_execute( miracle_local, char * );
static valerie_response miracle_local_push( miracle_local, char *, mlt_service );
+static valerie_response miracle_local_receive( miracle_local, char *, char * );
static void miracle_local_close( miracle_local );
response_codes miracle_help( command_argument arg );
response_codes miracle_run( command_argument arg );
parser->connect = (parser_connect)miracle_local_connect;
parser->execute = (parser_execute)miracle_local_execute;
parser->push = (parser_push)miracle_local_push;
+ parser->received = (parser_received)miracle_local_receive;
parser->close = (parser_close)miracle_local_close;
parser->real = local;
return cmd.response;
}
+static valerie_response miracle_local_receive( miracle_local local, char *command, char *doc )
+{
+ command_argument_t cmd;
+ cmd.parser = local->parser;
+ cmd.response = valerie_response_init( );
+ cmd.tokeniser = valerie_tokeniser_init( );
+ cmd.command = command;
+ cmd.unit = -1;
+ cmd.argument = NULL;
+ cmd.root_dir = local->root_dir;
+
+ /* Set the default error */
+ miracle_command_set_error( &cmd, RESPONSE_SUCCESS );
+
+ /* Parse the command */
+ if ( valerie_tokeniser_parse_new( cmd.tokeniser, command, " " ) > 0 )
+ {
+ int index = 0;
+ int position = 1;
+
+ /* Strip quotes from all tokens */
+ for ( index = 0; index < valerie_tokeniser_count( cmd.tokeniser ); index ++ )
+ valerie_util_strip( valerie_tokeniser_get_string( cmd.tokeniser, index ), '\"' );
+
+ cmd.unit = miracle_command_parse_unit( &cmd, position );
+ if ( cmd.unit == -1 )
+ miracle_command_set_error( &cmd, RESPONSE_MISSING_ARG );
+ position ++;
+
+ miracle_receive( &cmd, doc );
+ miracle_command_set_error( &cmd, RESPONSE_SUCCESS );
+
+ free( cmd.argument );
+ }
+
+ valerie_tokeniser_close( cmd.tokeniser );
+
+ return cmd.response;
+}
+
static valerie_response miracle_local_push( miracle_local local, char *command, mlt_service service )
{
command_argument_t cmd;
listener( owner, this, ( valerie_response ** )args[ 0 ], ( char * )args[ 1 ] );
}
+static void miracle_doc_received( mlt_listener listener, mlt_properties owner, miracle_server this, void **args )
+{
+ if ( listener != NULL )
+ listener( owner, this, ( valerie_response ** )args[ 0 ], ( char * )args[ 1 ], ( char * )args[ 2 ] );
+}
+
static void miracle_push_received( mlt_listener listener, mlt_properties owner, miracle_server this, void **args )
{
if ( listener != NULL )
server->socket = -1;
mlt_events_init( &server->parent );
mlt_events_register( &server->parent, "command-received", ( mlt_transmitter )miracle_command_received );
+ mlt_events_register( &server->parent, "doc-received", ( mlt_transmitter )miracle_doc_received );
mlt_events_register( &server->parent, "push-received", ( mlt_transmitter )miracle_push_received );
}
return server;
return RESPONSE_BAD_FILE;
}
+int miracle_receive( command_argument cmd_arg, char *doc )
+{
+ mlt_producer producer = mlt_factory_producer( "westley-xml", doc );
+ miracle_unit unit = miracle_get_unit(cmd_arg->unit);
+ if ( unit != NULL && producer != NULL )
+ {
+ if ( miracle_unit_append_service( unit, mlt_producer_service( producer ) ) == valerie_ok )
+ {
+ mlt_producer_close( producer );
+ return RESPONSE_SUCCESS;
+ }
+ }
+ mlt_producer_close( producer );
+ return RESPONSE_BAD_FILE;
+}
+
int miracle_play( command_argument cmd_arg )
{
miracle_unit unit = miracle_get_unit(cmd_arg->unit);
extern response_codes miracle_get_unit_property( command_argument );
extern response_codes miracle_transfer( command_argument );
extern response_codes miracle_push( command_argument, mlt_service );
+extern response_codes miracle_receive( command_argument, char * );
#ifdef __cplusplus
}
// If this is a reuse, then a valerie object will exist
valerie connection = mlt_properties_get_data( properties, "connection", NULL );
- if ( service != NULL )
+ // Special case - we can get a doc too...
+ char *doc = mlt_properties_get( properties, "westley" );
+
+ if ( service != NULL || doc != NULL )
{
// Initiate the connection if required
if ( connection == NULL )
// If we have connection, push the service over
if ( connection != NULL )
{
- int error;
+ if ( doc == NULL )
+ {
+ int error;
- // Set the title if provided
- if ( title != NULL )
- mlt_properties_set( mlt_service_properties( service ), "title", title );
- else if ( mlt_properties_get( mlt_service_properties( service ), "title" ) == NULL )
- mlt_properties_set( mlt_service_properties( service ), "title", "Anonymous Submission" );
+ // Set the title if provided
+ if ( title != NULL )
+ mlt_properties_set( mlt_service_properties( service ), "title", title );
+ else if ( mlt_properties_get( mlt_service_properties( service ), "title" ) == NULL )
+ mlt_properties_set( mlt_service_properties( service ), "title", "Anonymous Submission" );
- // Push the service
- error = valerie_unit_push( connection, unit, command, service );
+ // Push the service
+ error = valerie_unit_push( connection, unit, command, service );
- // Report error
- if ( error != valerie_ok )
- fprintf( stderr, "Push failed on %s:%d %s u%d (%d)\n", server, port, command, unit, error );
+ // Report error
+ if ( error != valerie_ok )
+ fprintf( stderr, "Push failed on %s:%d %s u%d (%d)\n", server, port, command, unit, error );
+ }
+ else
+ {
+ // Push the service
+ int error = valerie_unit_receive( connection, unit, command, doc );
+
+ // Report error
+ if ( error != valerie_ok )
+ fprintf( stderr, "Send failed on %s:%d %s u%d (%d)\n", server, port, command, unit, error );
+ }
}
}
if ( multitrack != NULL )
{
- // Set the track on the multitrack
-
// Set producer i/o if specified
- if ( mlt_properties_get( track_props, "in" ) != NULL &&
+ if ( mlt_properties_get( track_props, "in" ) != NULL ||
mlt_properties_get( track_props, "out" ) != NULL )
{
+ if ( mlt_properties_get( track_props, "out" ) == NULL )
+ mlt_properties_set_position( track_props, "out", mlt_properties_get_position( track_props, "length" ) - 1 );
mlt_producer cut = mlt_producer_cut( MLT_PRODUCER( producer ),
mlt_properties_get_position( track_props, "in" ),
mlt_properties_get_position( track_props, "out" ) );
if ( parent_type == mlt_tractor_type )
{
mlt_field field = mlt_tractor_field( MLT_TRACTOR( parent ) );
+ if ( mlt_properties_get_int( properties, "a_track" ) == mlt_properties_get_int( properties, "b_track" ) )
+ mlt_properties_set_int( properties, "b_track", mlt_properties_get_int( properties, "a_track" ) + 1 );
mlt_field_plant_transition( field, MLT_TRANSITION( effect ),
mlt_properties_get_int( properties, "a_track" ),
mlt_properties_get_int( properties, "b_track" ) );
/** Execute a command.
*/
+valerie_error_code valerie_receive( valerie this, char *doc, size_t size, char *format, ... )
+{
+ valerie_error_code error = valerie_server_unavailable;
+ char *command = malloc( size );
+ if ( this != NULL && command != NULL )
+ {
+ va_list list;
+ va_start( list, format );
+ if ( vsnprintf( command, size, format, list ) != 0 )
+ {
+ valerie_response response = valerie_parser_received( this->parser, command, doc );
+ valerie_set_last_response( this, response );
+ error = valerie_get_error_code( this, response );
+ }
+ else
+ {
+ error = valerie_invalid_command;
+ }
+ va_end( list );
+ }
+ else
+ {
+ error = valerie_malloc_failed;
+ }
+ free( command );
+ return error;
+}
+
+/** Execute a command.
+*/
+
valerie_error_code valerie_push( valerie this, mlt_service service, size_t size, char *format, ... )
{
valerie_error_code error = valerie_server_unavailable;
/** Push a service on to a unit.
*/
+valerie_error_code valerie_unit_receive( valerie this, int unit, char *command, char *doc )
+{
+ return valerie_receive( this, doc, 10240, "PUSH U%d %s", unit, command );
+}
+
+/** Push a service on to a unit.
+*/
+
valerie_error_code valerie_unit_push( valerie this, int unit, char *command, mlt_service service )
{
return valerie_push( this, service, 10240, "PUSH U%d %s", unit, command );
extern valerie_error_code valerie_unit_load_back( valerie, int, char * );
extern valerie_error_code valerie_unit_load_back_clipped( valerie, int, char *, int32_t, int32_t );
extern valerie_error_code valerie_unit_append( valerie, int, char *, int32_t, int32_t );
+extern valerie_error_code valerie_unit_receive( valerie, int, char *, char * );
extern valerie_error_code valerie_unit_push( valerie, int, char *, mlt_service );
extern valerie_error_code valerie_unit_clean( valerie, int );
extern valerie_error_code valerie_unit_clear( valerie, int );
/** Push a service via the parser.
*/
+valerie_response valerie_parser_received( valerie_parser parser, char *command, char *doc )
+{
+ return parser->received != NULL ? parser->received( parser->real, command, doc ) : NULL;
+}
+
+/** Push a service via the parser.
+*/
+
valerie_response valerie_parser_push( valerie_parser parser, char *command, mlt_service service )
{
return parser->push( parser->real, command, service );
typedef valerie_response (*parser_connect)( void * );
typedef valerie_response (*parser_execute)( void *, char * );
+typedef valerie_response (*parser_received)( void *, char *, char * );
typedef valerie_response (*parser_push)( void *, char *, mlt_service );
typedef void (*parser_close)( void * );
parser_connect connect;
parser_execute execute;
parser_push push;
+ parser_received received;
parser_close close;
void *real;
valerie_notifier notifier;
extern valerie_response valerie_parser_connect( valerie_parser );
extern valerie_response valerie_parser_push( valerie_parser, char *, mlt_service );
+extern valerie_response valerie_parser_received( valerie_parser, char *, char * );
extern valerie_response valerie_parser_execute( valerie_parser, char * );
extern valerie_response valerie_parser_executef( valerie_parser, char *, ... );
extern valerie_response valerie_parser_run( valerie_parser, char * );
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 );
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;
return response;
}
-/** Push a producer to the server.
+/** Push a westley document to the server.
*/
-static valerie_response valerie_remote_push( valerie_remote remote, char *command, mlt_service service )
+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 ) )
{
- mlt_consumer consumer = mlt_factory_consumer( "westley", "buffer" );
- mlt_properties properties = mlt_consumer_properties( consumer );
char temp[ 20 ];
- char *buffer = NULL;
- int length = 0;
- mlt_consumer_connect( consumer, service );
+ int length = strlen( buffer );
response = valerie_response_init( );
valerie_socket_write_data( remote->socket, "\r\n", 2 );
- mlt_consumer_start( consumer );
- buffer = mlt_properties_get_data( properties, "buffer", &length );
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 );
- mlt_consumer_close( consumer );
}
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;
+ mlt_consumer_connect( consumer, service );
+ mlt_consumer_start( consumer );
+ buffer = mlt_properties_get_data( properties, "buffer", NULL );
+ response = valerie_remote_receive( remote, command, buffer );
+ mlt_consumer_close( consumer );
+ }
+ return response;
+}
+
/** Disconnect.
*/