X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fmiracle%2Fmiracle_connection.c;h=0e83c197f828dca795b8a441e75ed14dd6fcb851;hb=d5fa53ca96e2cf875f7de0890292d9db2abbda80;hp=563a769a0a5be6e26876113514b9ff1f40f0c85a;hpb=9390e8b584f3f717f0a326893c0e37cf187a0a51;p=melted diff --git a/src/miracle/miracle_connection.c b/src/miracle/miracle_connection.c index 563a769..0e83c19 100644 --- a/src/miracle/miracle_connection.c +++ b/src/miracle/miracle_connection.c @@ -133,7 +133,7 @@ static int connection_send( int fd, valerie_response response ) } else { - char *message = "500 Empty Response\r\n\r\n"; + const char *message = "500 Empty Response\r\n\r\n"; write( fd, message, strlen( message ) ); } @@ -147,7 +147,7 @@ static int connection_read( int fd, char *command, int length ) char *cr = strchr( command, '\r'); if ( cr != NULL ) cr[0] = '\0'; - if ( eof_chk || strncmp( command, "BYE", 3 ) == 0 ) + if ( eof_chk || strncasecmp( command, "BYE", 3 ) == 0 ) nchars = 0; return nchars; } @@ -201,6 +201,7 @@ void *parser_thread( void *arg ) { struct hostent *he; connection_t *connection = arg; + mlt_properties owner = connection->owner; char address[ 512 ]; char command[ 1024 ]; int fd = connection->fd; @@ -223,9 +224,52 @@ void *parser_thread( void *arg ) while( !error && connection_read( fd, command, 1024 ) ) { - if ( strncmp( command, "STATUS", 6 ) ) + response = NULL; + + if ( !strncmp( command, "PUSH ", 5 ) ) + { + char temp[ 20 ]; + int bytes; + char *buffer = NULL; + int total = 0; + mlt_service service = NULL; + + connection_read( fd, temp, 20 ); + bytes = atoi( temp ); + buffer = malloc( bytes + 1 ); + while ( total < bytes ) + { + int count = read( fd, buffer + total, bytes - total ); + if ( count >= 0 ) + total += count; + else + break; + } + buffer[ bytes ] = '\0'; + if ( bytes > 0 && total == bytes ) + { + if ( mlt_properties_get( owner, "push-parser-off" ) == 0 ) + { + service = ( mlt_service )mlt_factory_producer( NULL, "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 ); + free( buffer ); + } + else if ( strncmp( command, "STATUS", 6 ) ) { - response = valerie_parser_execute( parser, command ); + mlt_events_fire( owner, "command-received", &response, command, NULL ); + if ( response == NULL ) + response = valerie_parser_execute( parser, command ); miracle_log( LOG_INFO, "%s \"%s\" %d", address, command, valerie_response_get_error_code( response ) ); error = connection_send( fd, response ); valerie_response_close( response );