]> git.sesse.net Git - mlt/blob - src/valerie/valerie_parser.c
1a74c50fb059b048b78c5ee34d60c21e36aab7f8
[mlt] / src / valerie / valerie_parser.c
1 /*
2  * valerie_parser.c -- Valerie Parser for Miracle
3  * Copyright (C) 2002-2003 Ushodaya Enterprises Limited
4  * Author: Charles Yates <charles.yates@pandora.be>
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  */
20
21 /* System header files */
22 #include <stdio.h>
23 #include <stdarg.h>
24 #include <stdlib.h>
25 #include <string.h>
26
27 /* Application header files */
28 #include "valerie_parser.h"
29 #include "valerie_util.h"
30
31 /** Connect to the parser.
32 */
33
34 valerie_response valerie_parser_connect( valerie_parser parser )
35 {
36         return parser->connect( parser->real );
37 }
38
39 /** Execute a command via the parser.
40 */
41
42 valerie_response valerie_parser_execute( valerie_parser parser, char *command )
43 {
44         return parser->execute( parser->real, command );
45 }
46
47 /** Push a service via the parser.
48 */
49
50 valerie_response valerie_parser_received( valerie_parser parser, char *command, char *doc )
51 {
52         return parser->received != NULL ? parser->received( parser->real, command, doc ) : NULL;
53 }
54
55 /** Push a service via the parser.
56 */
57
58 valerie_response valerie_parser_push( valerie_parser parser, char *command, mlt_service service )
59 {
60         return parser->push( parser->real, command, service );
61 }
62
63 /** Execute a formatted command via the parser.
64 */
65
66 valerie_response valerie_parser_executef( valerie_parser parser, const char *format, ... )
67 {
68         char *command = malloc( 10240 );
69         valerie_response response = NULL;
70         if ( command != NULL )
71         {
72                 va_list list;
73                 va_start( list, format );
74                 if ( vsnprintf( command, 10240, format, list ) != 0 )
75                         response = valerie_parser_execute( parser, command );
76                 va_end( list );
77                 free( command );
78         }
79         return response;
80 }
81
82 /** Execute the contents of a file. Note the special case valerie_response returned.
83 */
84
85 valerie_response valerie_parser_run( valerie_parser parser, char *filename )
86 {
87         valerie_response response = valerie_response_init( );
88         if ( response != NULL )
89         {
90                 FILE *file = fopen( filename, "r" );
91                 if ( file != NULL )
92                 {
93                         char command[ 1024 ];
94                         valerie_response_set_error( response, 201, "OK" );
95                         while ( valerie_response_get_error_code( response ) == 201 && fgets( command, 1024, file ) )
96                         {
97                                 valerie_util_trim( valerie_util_chomp( command ) );
98                                 if ( strcmp( command, "" ) && command[ 0 ] != '#' )
99                                 {
100                                         valerie_response temp = NULL;
101                                         valerie_response_printf( response, 1024, "%s\n", command );
102                                         temp = valerie_parser_execute( parser, command );
103                                         if ( temp != NULL )
104                                         {
105                                                 int index = 0;
106                                                 for ( index = 0; index < valerie_response_count( temp ); index ++ )
107                                                         valerie_response_printf( response, 10240, "%s\n", valerie_response_get_line( temp, index ) );
108                                                 valerie_response_close( temp );
109                                         }
110                                         else
111                                         {
112                                                 valerie_response_set_error( response, 500, "Batch execution failed" );
113                                         }
114                                 }
115                         }
116                         fclose( file );
117                 }
118                 else
119                 {
120                         valerie_response_set_error( response, 404, "File not found." );
121                 }
122         }
123         return response;
124 }
125
126 /** Get the notifier associated to the parser.
127 */
128
129 valerie_notifier valerie_parser_get_notifier( valerie_parser parser )
130 {
131         if ( parser->notifier == NULL )
132                 parser->notifier = valerie_notifier_init( );
133         return parser->notifier;
134 }
135
136 /** Close the parser.
137 */
138
139 void valerie_parser_close( valerie_parser parser )
140 {
141         if ( parser != NULL )
142         {
143                 parser->close( parser->real );
144                 valerie_notifier_close( parser->notifier );
145                 free( parser );
146         }
147 }