xref: /trunk/main/desktop/os2/source/applauncher/launcher.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
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