1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir #include "launcher.hxx"
29*cdf0e10cSrcweir 
30*cdf0e10cSrcweir #include <stdio.h>
31*cdf0e10cSrcweir #include <stdlib.h>
32*cdf0e10cSrcweir #include <string.h>
33*cdf0e10cSrcweir #include <malloc.h>
34*cdf0e10cSrcweir #include <process.h>
35*cdf0e10cSrcweir 
36*cdf0e10cSrcweir int main( int argc, char* argv[])
37*cdf0e10cSrcweir {
38*cdf0e10cSrcweir 	PPIB	pib;
39*cdf0e10cSrcweir 	APIRET   rc;
40*cdf0e10cSrcweir 	RESULTCODES result = {0};
41*cdf0e10cSrcweir 	char     szFail[ _MAX_PATH];
42*cdf0e10cSrcweir 
43*cdf0e10cSrcweir 	HAB hab = WinInitialize( 0);
44*cdf0e10cSrcweir 	HMQ hmq = WinCreateMsgQueue( hab, 0);
45*cdf0e10cSrcweir 	ERRORID    erridErrorCode = 0;
46*cdf0e10cSrcweir 	erridErrorCode = WinGetLastError(hab);
47*cdf0e10cSrcweir 
48*cdf0e10cSrcweir 	// Calculate application name
49*cdf0e10cSrcweir 	CHAR	szLibpath[_MAX_PATH*2];
50*cdf0e10cSrcweir 	CHAR	szApplicationName[_MAX_PATH];
51*cdf0e10cSrcweir 	CHAR	szDrive[_MAX_PATH];
52*cdf0e10cSrcweir 	CHAR	szDir[_MAX_PATH];
53*cdf0e10cSrcweir 	CHAR	szFileName[_MAX_PATH];
54*cdf0e10cSrcweir 	CHAR	szExt[_MAX_PATH];
55*cdf0e10cSrcweir 
56*cdf0e10cSrcweir 	// get executable fullpath
57*cdf0e10cSrcweir 	DosGetInfoBlocks(NULL, &pib);
58*cdf0e10cSrcweir 	DosQueryModuleName(pib->pib_hmte, sizeof(szApplicationName), szApplicationName);
59*cdf0e10cSrcweir 
60*cdf0e10cSrcweir 	// adjust libpath
61*cdf0e10cSrcweir 	_splitpath( szApplicationName, szDrive, szDir, szFileName, szExt );
62*cdf0e10cSrcweir 	char* basedir = strstr( szDir, "\\PROGRAM\\");
63*cdf0e10cSrcweir 	if (basedir) *basedir = 0;
64*cdf0e10cSrcweir  	sprintf( szLibpath, "\"%s%s\\URE\\BIN\";\"%s%s\\BASIS\\PROGRAM\";%BeginLIBPATH%",
65*cdf0e10cSrcweir   		szDrive, szDir, szDrive, szDir);
66*cdf0e10cSrcweir 	DosSetExtLIBPATH( (PCSZ)szLibpath, BEGIN_LIBPATH);
67*cdf0e10cSrcweir 	// make sure we load DLL from our path only, so multiple instances/versions
68*cdf0e10cSrcweir 	// can be loaded.
69*cdf0e10cSrcweir #if 0
70*cdf0e10cSrcweir 	// YD this feature is not compatible with innowin b20,
71*cdf0e10cSrcweir 	// java cannot load with this flag enabled
72*cdf0e10cSrcweir 	DosSetExtLIBPATH( (PCSZ)"T", LIBPATHSTRICT);
73*cdf0e10cSrcweir #endif
74*cdf0e10cSrcweir 
75*cdf0e10cSrcweir 	// adjust exe name
76*cdf0e10cSrcweir 	_splitpath( szApplicationName, szDrive, szDir, szFileName, szExt );
77*cdf0e10cSrcweir 	_makepath( szApplicationName, szDrive, szDir, OFFICE_IMAGE_NAME, (".bin") );
78*cdf0e10cSrcweir 
79*cdf0e10cSrcweir 	// copy command line parameters
80*cdf0e10cSrcweir 	int i, len;
81*cdf0e10cSrcweir 	len = strlen(szApplicationName) + 1 + strlen( APPLICATION_SWITCH) + 1 + 1;
82*cdf0e10cSrcweir 	for( i=1; i<argc; i++)
83*cdf0e10cSrcweir 		len += strlen( argv[i]) + 1;
84*cdf0e10cSrcweir 
85*cdf0e10cSrcweir 	char* pszCommandLine, *pszArgs;
86*cdf0e10cSrcweir 	pszCommandLine = (char*) calloc( 1, len);
87*cdf0e10cSrcweir 	strcpy( pszCommandLine, szApplicationName);
88*cdf0e10cSrcweir 	pszArgs = pszCommandLine + strlen(szApplicationName) + 1;
89*cdf0e10cSrcweir 	strcat( pszArgs, APPLICATION_SWITCH);
90*cdf0e10cSrcweir 	strcat( pszArgs, " ");
91*cdf0e10cSrcweir 	for( i=1; i<argc; i++) {
92*cdf0e10cSrcweir 		// add quotes if argument has spaces!
93*cdf0e10cSrcweir 		if (strchr( argv[i], ' '))
94*cdf0e10cSrcweir 			strcat( pszArgs, "\"");
95*cdf0e10cSrcweir 		strcat( pszArgs, argv[i]);
96*cdf0e10cSrcweir 		if (strchr( argv[i], ' '))
97*cdf0e10cSrcweir 			strcat( pszArgs, "\"");
98*cdf0e10cSrcweir 		strcat( pszArgs, " ");
99*cdf0e10cSrcweir 	}
100*cdf0e10cSrcweir 	pszArgs[ strlen( pszArgs) + 0] = 0;
101*cdf0e10cSrcweir 
102*cdf0e10cSrcweir 	// execute
103*cdf0e10cSrcweir 	rc = DosExecPgm(szFail, sizeof(szFail),
104*cdf0e10cSrcweir                    EXEC_SYNC, (PCSZ)pszCommandLine, (PCSZ)NULL, &result,
105*cdf0e10cSrcweir                    (PCSZ)szApplicationName);
106*cdf0e10cSrcweir 	if (rc) {
107*cdf0e10cSrcweir 		char     szMessage[ _MAX_PATH*2];
108*cdf0e10cSrcweir 		sprintf( szMessage, "Execution failed! Contact technical support.\n\nReturn code: %d\nFailing module:%s\n", rc, szFail);
109*cdf0e10cSrcweir 		rc = WinMessageBox( HWND_DESKTOP, HWND_DESKTOP,
110*cdf0e10cSrcweir 							(PSZ)szMessage,
111*cdf0e10cSrcweir 							(PSZ)"Unable to start OpenOffice.org!",
112*cdf0e10cSrcweir 							0, MB_ERROR | MB_OK);
113*cdf0e10cSrcweir 		WinDestroyMsgQueue( hmq);
114*cdf0e10cSrcweir 		WinTerminate( hab);
115*cdf0e10cSrcweir 		exit(1);
116*cdf0e10cSrcweir 	}
117*cdf0e10cSrcweir 
118*cdf0e10cSrcweir 	WinDestroyMsgQueue( hmq);
119*cdf0e10cSrcweir 	WinTerminate( hab);
120*cdf0e10cSrcweir 
121*cdf0e10cSrcweir 	exit( result.codeResult);
122*cdf0e10cSrcweir }
123