#ifndef _vrmLPLUGIN_
#define _vrmLPLUGIN_

#include <qnp.h>
#include <piInstance.h>
#include <signal.h>
#include <stdio.h>
#include <resourceIo.h>

FILE *stderr_file_hack;
FILE *stdout_file_hack;
static void sig_handlr(int);

static resIoList defaultIoList;
resIoList *resourceIoList = &defaultIoList;


class vrmlPlugin : public QNPlugin {

public:
    vrmlPlugin()
    {
    }

    QNPInstance* newInstance()
    {
	return new piInstance;
    }

    const char* getMIMEDescription() const
    {
	return "x-world/x-vrml:wrl, wrz:qtlookat, LibVRML97 PlugIn;"
               "model/vrml:wrl, wrz:qtlookat, LibVRML97 PlugIn";

    }

    const char * getPluginNameString() const
    {
	return "LibVRML97 qtlookat Browser Plugin";
    }

    const char * getPluginDescriptionString() const
    {
	return "libVRML97 browser plug-in, qtlookat implementation";
    }
};

QNPlugin* QNPlugin::create()
{
    //signal(SIGBUS, SIG_DFL);
    signal(SIGSEGV, sig_handlr);
#ifndef WIN32
    signal(SIGBUS, sig_handlr);
#endif

    // catch the libvrml97 messages that aren't sent through theSystem
    stderr_file_hack = freopen("mystderr","a",stderr);
    stdout_file_hack = freopen("mystdout","a",stdout);

    return new vrmlPlugin;
}

static void sig_handlr( int signo)
{
    if (signo == SIGSEGV) 
        fprintf( stdout_file_hack, "caught SIGSEGV.\n");
#ifndef WIN32
    if (signo == SIGBUS) 
        fprintf( stdout_file_hack, "caught SIGBUS.\n");
#endif
    if ( fflush(0) == 0 ) fprintf( stdout_file_hack, "pissing in wind.\n");; // should flush all streams
    fclose( stdout_file_hack );
    fclose( stderr_file_hack );
    abort();
}

#endif  /* _vrmLPLUGIN_ */

