/*
- * miracle_server.c -- DV Server
+ * miracle_server.c
* Copyright (C) 2002-2003 Ushodaya Enterprises Limited
* Author: Charles Yates <charles.yates@pandora.be>
*
#include "miracle_connection.h"
#include "miracle_local.h"
#include "miracle_log.h"
+#include "miracle_commands.h"
#include <valerie/valerie_remote.h>
#include <valerie/valerie_tokeniser.h>
#define VERSION "0.0.1"
+static void miracle_command_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 ] );
+}
+
+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 )
+ listener( owner, this, ( valerie_response ** )args[ 0 ], ( char * )args[ 1 ], ( mlt_service )args[ 2 ] );
+}
+
/** Initialise a server structure.
*/
{
miracle_server server = malloc( sizeof( miracle_server_t ) );
if ( server != NULL )
- {
memset( server, 0, sizeof( miracle_server_t ) );
+ if ( server != NULL && mlt_properties_init( &server->parent, server ) == 0 )
+ {
server->id = id;
server->port = DEFAULT_TCP_PORT;
server->socket = -1;
+ server->shutdown = 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;
}
+const char *miracle_server_id( miracle_server server )
+{
+ return server != NULL && server->id != NULL ? server->id : "miracle";
+}
+
void miracle_server_set_config( miracle_server server, char *config )
{
if ( server != NULL )
pthread_t cmd_parse_info;
connection_t *tmp = NULL;
pthread_attr_t thread_attributes;
- int socksize;
+ socklen_t socksize;
socksize = sizeof( struct sockaddr );
their resources get freed automatically. (CY: ... hmmph...) */
pthread_attr_init( &thread_attributes );
pthread_attr_setdetachstate( &thread_attributes, PTHREAD_CREATE_DETACHED );
- pthread_attr_init( &thread_attributes );
- pthread_attr_setinheritsched( &thread_attributes, PTHREAD_INHERIT_SCHED );
- /* pthread_attr_setschedpolicy( &thread_attributes, SCHED_RR ); */
while ( !server->shutdown )
{
our server thread. The thread should free this when it terminates. */
tmp = (connection_t*) malloc( sizeof(connection_t) );
+ tmp->owner = &server->parent;
tmp->parser = server->parser;
tmp->fd = accept( server->socket, (struct sockaddr*) &(tmp->sin), &socksize );
struct sockaddr_in ServerAddr;
int flag = 1;
+ server->shutdown = 0;
+
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_port = htons( server->port );
ServerAddr.sin_addr.s_addr = INADDR_ANY;
if ( response != NULL )
{
- pthread_attr_t attr;
int result;
- pthread_attr_init( &attr );
- pthread_attr_setdetachstate( &attr, PTHREAD_CREATE_JOINABLE );
- pthread_attr_setinheritsched( &attr, PTHREAD_EXPLICIT_SCHED );
- pthread_attr_setschedpolicy( &attr, SCHED_FIFO );
- pthread_attr_setscope( &attr, PTHREAD_SCOPE_SYSTEM );
valerie_response_close( response );
- result = pthread_create( &server->thread, &attr, miracle_server_run, server );
+ result = pthread_create( &server->thread, NULL, miracle_server_run, server );
if ( result )
{
- miracle_log( LOG_WARNING, "Failed to schedule realtime (%s)", strerror(errno) );
- pthread_attr_setschedpolicy( &attr, SCHED_OTHER );
- result = pthread_create( &server->thread, &attr, miracle_server_run, server );
- if ( result )
- {
- miracle_log( LOG_CRIT, "Failed to launch TCP listener thread" );
- error = -1;
- }
+ miracle_log( LOG_CRIT, "Failed to launch TCP listener thread" );
+ error = -1;
}
}
}
return error;
}
+/** Fetch a units properties
+*/
+
+mlt_properties miracle_server_fetch_unit( miracle_server server, int index )
+{
+ miracle_unit unit = miracle_get_unit( index );
+ return unit != NULL ? unit->properties : NULL;
+}
+
/** Shutdown the server.
*/
{
server->shutdown = 1;
pthread_join( server->thread, NULL );
- valerie_parser_close( server->parser );
miracle_server_set_config( server, NULL );
+ valerie_parser_close( server->parser );
+ server->parser = NULL;
close( server->socket );
}
}
+
+/** Close the server.
+*/
+
+void miracle_server_close( miracle_server server )
+{
+ if ( server != NULL && mlt_properties_dec_ref( &server->parent ) <= 0 )
+ {
+ mlt_properties_close( &server->parent );
+ miracle_server_shutdown( server );
+ free( server );
+ }
+}