/* ====================================================================
 * The Vovida Software License, Version 1.0 
 * 
 * Copyright (c) 2000 Vovida Networks, Inc.  All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 * 
 * 3. The names "VOCAL", "Vovida Open Communication Application Library",
 *    and "Vovida Open Communication Application Library (VOCAL)" must
 *    not be used to endorse or promote products derived from this
 *    software without prior written permission. For written
 *    permission, please contact vocal@vovida.org.
 *
 * 4. Products derived from this software may not be called "VOCAL", nor
 *    may "VOCAL" appear in their name, without prior written
 *    permission of Vovida Networks, Inc.
 * 
 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND
 * NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL VOVIDA
 * NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES
 * IN EXCESS OF $1,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
 * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
 * DAMAGE.
 * 
 * ====================================================================
 * 
 * This software consists of voluntary contributions made by Vovida
 * Networks, Inc. and many individuals on behalf of Vovida Networks,
 * Inc.  For more information on Vovida Networks, Inc., please see
 * <http://www.vovida.org/>.
 *
 */


static const char* const Application_cxx_Version = 
    "$Id: Application.cxx,v 1.8 2002/05/15 10:14:14 icahoon Exp $";


#include "global.h"
#include "Application.hxx"
#include "VException.hxx"
#include <iostream>
#include <assert.h>

using Vocal::Application;
using Vocal::ApplicationCreator;
using Vocal::Runnable;
using Vocal::ReturnCode;


ApplicationCreator  *   Application::myCreator = 0;
Application  	    *   Application::myApplication = 0;


void
Application::creator(ApplicationCreator * creator_)
{
    myCreator = creator_;
}

Application &	    
Application::instance()
{
    if ( !myApplication )
    {
        if ( myCreator != 0 )
        {
    	    myApplication = myCreator->create();
        }
        else
        {
            throw "No ApplicationCreator";
        }
    }
    return ( *myApplication );
}

ReturnCode  	    
Application::main(int argc, char ** argv, char ** arge)
{
    // Create the application.
    //
    Application &   app = Application::instance();

    //
    // Could install new handler here.
    //
    
    // Initialize the application
    //
    ReturnCode	rc = SUCCESS;
    try
    {
        rc = app.init(argc, argv, arge);
    }
    catch ( VException & )
    {
    	cerr << "Unhandled VException from Application::init(). Exiting." << endl;
    	return ( 1 );
    }
    catch ( ... )
    {
    	cerr << "Unhandled exception from Application::init(). Exiting." << endl;
    	return ( 2 );
    }
    
    if ( rc != SUCCESS )
    {
    	return ( rc );
    }
    
    try
    {
    	rc = app.run();
    }
    catch ( VException & )
    {
    	cerr << "Unhandled VException from Application::run(). Exiting." << endl;
	return ( 1 );
    }
    catch ( ... )
    {
    	cerr << "Unhandled exception from Application::run(). Exiting." << endl;
    	return ( 2 );
    }

    // Cleanup the application
    //
    try
    {
    	app.uninit();
    }
    catch ( VException & )
    {
    	cerr << "Unhandled VException from Application::uninit(). Exiting." << endl;
	return ( 1 );
    }
    catch ( ... )
    {
    	cerr << "Unhandled exception from Application::uninit(). Exiting." << endl;
    	return ( 2 );
    }    

    // Delete the application
    //
    delete myApplication;
    myApplication = 0;
    
    return ( rc );    
}

	
Application::Application()
{
}


Application::~Application()
{
}


ReturnCode
Application::init(int argc, char ** argv, char ** arge)
{
    return ( SUCCESS );
}


void
Application::uninit()
{
}


syntax highlighted by Code2HTML, v. 0.9.1