Ejemplo n.º 1
0
IO_stat MCDispatch::startup(void)
{
	IO_stat stat;
	MCStack *sptr;

	// set up image cache before the first stack is opened
	MCCachedImageRep::init();
	
	startdir = MCS_getcurdir();
	enginedir = strclone(MCcmd);

	char *eptr;
	eptr = strrchr(enginedir, PATH_SEPARATOR);
	if (eptr != NULL)
		*eptr = '\0';
	else
		*enginedir = '\0';

	MCExecPoint ep;
	ep . setstaticbytes(MCstartupstack, MCstartupstack_length);
	MCDecompress::do_decompress(ep, 0, 0);

	IO_handle stream = MCS_fakeopen(ep . getsvalue());
	if ((stat = MCdispatcher -> readfile(NULL, NULL, stream, sptr)) != IO_NORMAL)
	{
		MCS_close(stream);
		return stat;
	}

	MCS_close(stream);

	memset((void *)ep . getsvalue() . getstring(), 0, ep . getsvalue() . getlength());
	ep . clear();
	
	// Temporary fix to make sure environment stack doesn't get lost behind everything.
#if defined(_MACOSX)
	ProcessSerialNumber t_psn = { 0, kCurrentProcess };
	SetFrontProcess(&t_psn);
#elif defined(_WINDOWS)
	SetForegroundWindow(((MCScreenDC *)MCscreen) -> getinvisiblewindow());
#endif
	
	MCenvironmentactive = True;
	sptr -> setfilename(strclone(MCcmd));
	MCdefaultstackptr = MCstaticdefaultstackptr = stacks;

	{
		MCdefaultstackptr -> setextendedstate(true, ECS_DURING_STARTUP);
		MCdefaultstackptr -> message(MCM_start_up, nil, False, True);
		MCdefaultstackptr -> setextendedstate(false, ECS_DURING_STARTUP);
	}
	
	if (!MCquit)
	{
		MCresult -> fetch(ep);
		ep . appendchar('\0');
		if (ep . getsvalue() . getlength() == 1)
		{
			sptr -> open();
			MCImage::init();
			
			X_main_loop();

			MCresult -> fetch(ep);
			ep . appendchar('\0');
			if (ep . getsvalue() . getlength() == 1)
				return IO_NORMAL;
		}

		if (sptr -> getscript() != NULL)
			memset(sptr -> getscript(), 0, strlen(sptr -> getscript()));

		destroystack(sptr, True);
		MCtopstackptr = NULL;
		MCquit = False;
		MCenvironmentactive = False;

		send_relaunch();

		sptr = findstackname(ep . getsvalue() . getstring());

		if (sptr == NULL && (stat = loadfile(ep . getsvalue() . getstring(), sptr)) != IO_NORMAL)
			return stat;
	}

	if (!MCquit)
	{
		// OK-2007-11-13 : Bug 5525, after opening the IDE engine, the allowInterrupts should always default to false,
		// regardless of what the environment stack may have set it to.
		MCallowinterrupts = true;
		sptr -> setparent(this);
		MCdefaultstackptr = MCstaticdefaultstackptr = stacks;
		send_startup_message(false);
		if (!MCquit)
			sptr -> open();
	}

	return IO_NORMAL;
}
Ejemplo n.º 2
0
int platform_main(int argc, char *argv[], char *envp[])
{
	// On Linux, the argv and envp could be in pretty much any format. The
	// safest thing to do is let the C library's iconv convert to a known
	// format. To do this, the system locale needs to be retrieved.
	setlocale(LC_ALL, "");
	MCsysencoding = strclone(nl_langinfo(CODESET));
		
	if (!MCInitialize())
	{
		fprintf(stderr, "Fatal: initialization failed\n");
		exit(-1);
	}
	
	if (!MCSInitialize())
	{
		fprintf(stderr, "Fatal: platform initialization failed\n");
		exit(-1);
	}
	
	if (!MCScriptInitialize())
	{
		fprintf(stderr, "Fatal: script initialization failed\n");
		exit(-1);
	}
	
	// Linux needs the platform layer to be initialised early so that it can
	// use it to load the weakly-linked dynamic libraries that the engine
	// depends on.
	MCS_preinit();
		
	// Core initialisation complete; 
	// This depends on libFoundation and MCsystem being initialised first
	initialise_required_weak_link_glib();
	
	// Convert the argv array to StringRefs
    MCAutoStringRefArray t_argv;
    /* UNCHECKED */ t_argv.New(argc);
	for (int i = 0; i < argc; i++)
	{
        /* UNCHECKED */ MCStringCreateWithSysString(argv[i], t_argv[i]);
	}
	
	// Convert the envp array to StringRefs
    int envc = 0;
    while (envp[envc] != nullptr)
        ++envc;
    MCAutoStringRefArray t_envp;
    /* UNCHECKED */ t_envp.New(envc + 1);
    for (int i = 0; envp[i] != nullptr; ++i)
    {
        /* UNCHECKED */ MCStringCreateWithSysString(envp[i], t_envp[i]);
    }

	// Terminate the envp array
	t_envp[envc] = nil;
	
	extern int MCSystemElevatedMain(int, char* argv[]);
	if (argc == 3&& strcmp(argv[1], "-elevated-slave") == 0)
		return MCSystemElevatedMain(argc, argv);
	
    struct X_init_options t_options;
    t_options.argc = argc;
    t_options.argv = *t_argv;
    t_options.envp = *t_envp;
    t_options.app_code_path = nullptr;
	if (!X_init(t_options))
    {
		// Try to print an informative error message or, failing that, just
		// report that an error occurred.
		if (MCresult != nil)
        {
            MCExecContext ctxt(nil, nil, nil);
            MCAutoValueRef t_result;
            MCAutoStringRef t_string;
            MCresult -> eval(ctxt, &t_result);
            ctxt . ConvertToString(*t_result, &t_string);
            MCAutoStringRefAsSysString t_autostring;
            /* UNCHECKED */ t_autostring . Lock(*t_string);
            fprintf(stderr, "Startup error - %s\n", *t_autostring);
		}
		else
		{
			fprintf(stderr, "Fatal: unknown startup error\n");
		}
		
		exit(-1);
	}
	
	X_main_loop();
	
	int t_exit_code = X_close();

	MCScriptFinalize();
	MCFinalize();

	exit(t_exit_code);
}