146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/*
246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    SDL - Simple DirectMedia Layer
346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002  Sam Lantinga
446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    This library is free software; you can redistribute it and/or
646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    modify it under the terms of the GNU Library General Public
746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    License as published by the Free Software Foundation; either
846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    version 2 of the License, or (at your option) any later version.
946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
1046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    This library is distributed in the hope that it will be useful,
1146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    but WITHOUT ANY WARRANTY; without even the implied warranty of
1246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
1346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    Library General Public License for more details.
1446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
1546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    You should have received a copy of the GNU Library General Public
1646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    License along with this library; if not, write to the Free
1746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
1846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
1946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    Sam Lantinga
2046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    slouken@libsdl.org
2146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/
2246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
2346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/*
2446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    SDL_main.cpp
2546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    The Epoc executable startup functions
2646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
2746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    Epoc version by Hannu Viitala (hannu.j.viitala@mbnet.fi)
2846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/
2946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
3046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include <e32std.h>
3146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include <e32def.h>
3246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include <e32svr.h>
3346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include <e32base.h>
3446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include <estlib.h>
3546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include <stdlib.h>
3646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include <stdio.h>
3746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include <w32std.h>
3846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include <apgtask.h>
3946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
4046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_error.h"
4146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
4246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifndef EXPORT_C
4346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner# ifdef __VC32__
4446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#  define IMPORT_C __declspec(dllexport)
4546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#  define EXPORT_C __declspec(dllexport)
4646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner# endif
4746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner# ifdef __GCC32__
4846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#  define IMPORT_C
4946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#  define EXPORT_C __declspec(dllexport)
5046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner# endif
5146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
5246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
5346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#if defined(__WINS__)
5446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include <estw32.h>
5546be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerIMPORT_C void RegisterWsExe(const TDesC &aName);
5646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
5746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
5846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* The prototype for the application's main() function */
5946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define main	SDL_main
6046be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerextern "C" int main (int argc, char *argv[], char *envp[]);
6146be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerextern "C" void exit (int ret);
6246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
6346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
6446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Epoc main function */
6546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
6646be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerGLDEF_C TInt E32Main()
6746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    {
6846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    /*  Get the clean-up stack */
6946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	CTrapCleanup* cleanup = CTrapCleanup::New();
7046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
7146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    #if defined(__WINS__)
7246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    /* arrange for access to Win32 stdin/stdout/stderr */
7346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   	RWin32Stream::StartServer();
7446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    #endif
7546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
7646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    /* Arrange for multi-threaded operation */
7746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	SpawnPosixServerThread();
7846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
7946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    /* Get args and environment */
8046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	int argc=0;
8146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	char** argv=0;
8246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	char** envp=0;
8346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	__crt0(argc,argv,envp);
8446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
8546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    #if defined(__WINS__)
8646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Cause the graphical Window Server to come into existence */
8746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	RSemaphore sem;
8846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	sem.CreateGlobal(_L("WsExeSem"),0);
8946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	RegisterWsExe(sem.FullName());
9046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    #endif
9146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
9246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
9346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    /* Start the application! */
9446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
9546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    /* Create stdlib */
9646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    _REENT;
9746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
9846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    /* Set process and thread priority */
9946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    RThread currentThread;
10046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
10146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    currentThread.Rename(_L("SdlProgram"));
10246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    currentThread.SetProcessPriority(EPriorityLow);
10346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    currentThread.SetPriority(EPriorityMuchLess);
10446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
10546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    /* Call stdlib main */
10646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    int ret = main(argc, argv, envp); /* !! process exits here if there is "exit()" in main! */
10746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
10846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    /* Call exit */
10946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    exit(ret); /* !! process exits here! */
11046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
11146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    /* Free resources and return */
11246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    CloseSTDLIB();
11346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   	delete cleanup;
11446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    return(KErrNone);
11546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    }
11646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
11746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Epoc dll entry point */
11846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#if defined(__WINS__)
11946be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerGLDEF_C TInt E32Dll(TDllReason)
12046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	{
12146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return(KErrNone);
12246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
12346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
12446be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerEXPORT_C TInt WinsMain(TAny *)
12546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	{
12646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    E32Main();
12746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return KErrNone;
12846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
12946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
130