/**************************************************************
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 *************************************************************/



#include "launcher.hxx"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <process.h>

int main( int argc, char* argv[])
{
	PPIB	pib;
	APIRET   rc;
	RESULTCODES result = {0};
	char     szFail[ _MAX_PATH];

	HAB hab = WinInitialize( 0);
	HMQ hmq = WinCreateMsgQueue( hab, 0);
	ERRORID    erridErrorCode = 0;
	erridErrorCode = WinGetLastError(hab);

	// Calculate application name
	CHAR	szApplicationName[_MAX_PATH];

	// get executable fullpath
	DosGetInfoBlocks(NULL, &pib);
	DosQueryModuleName(pib->pib_hmte, sizeof(szApplicationName), szApplicationName);

	// adjust libpath
#if OSL_DEBUG_LEVEL > 0
	CHAR	szLibpath[_MAX_PATH*2];
	rc = DosQueryExtLIBPATH( (PSZ)szLibpath, BEGIN_LIBPATH);
	fprintf( stderr, "1 BeginLibPath: %s\n", szLibpath);
#endif
	char* basedir = strrchr( szApplicationName, '\\');
	if (basedir) *basedir = 0;
	DosSetExtLIBPATH( (PCSZ)szApplicationName, BEGIN_LIBPATH);

	// make sure we load DLL from our path only, so multiple instances/versions
	// can be loaded.
	DosSetExtLIBPATH( (PCSZ)"T", LIBPATHSTRICT);

#if OSL_DEBUG_LEVEL > 0
	rc = DosQueryExtLIBPATH( (PSZ)szLibpath, BEGIN_LIBPATH);
	fprintf( stderr, "2 BeginLibPath: %s\n", szLibpath);
#endif

	// adjust exe name
	strcat( szApplicationName, "\\" OFFICE_IMAGE_NAME ".bin");

	// copy command line parameters
	int i, len;
	len = strlen(szApplicationName) + 1 + strlen( APPLICATION_SWITCH) + 1 + 1;
	for( i=1; i<argc; i++)
		len += strlen( argv[i]) + 1;

	char* pszCommandLine, *pszArgs;
	pszCommandLine = (char*) calloc( 1, len);
	strcpy( pszCommandLine, szApplicationName);
	pszArgs = pszCommandLine + strlen(szApplicationName) + 1;
	strcat( pszArgs, APPLICATION_SWITCH);
	strcat( pszArgs, " ");
	for( i=1; i<argc; i++) {
		// add quotes if argument has spaces!
		if (strchr( argv[i], ' '))
			strcat( pszArgs, "\"");
		strcat( pszArgs, argv[i]);
		if (strchr( argv[i], ' '))
			strcat( pszArgs, "\"");
		strcat( pszArgs, " ");
	}
	pszArgs[ strlen( pszArgs) + 0] = 0;

	// execute
	rc = DosExecPgm(szFail, sizeof(szFail),
                   EXEC_SYNC, (PCSZ)pszCommandLine, (PCSZ)NULL, &result,
                   (PCSZ)szApplicationName);
	if (rc) {
		char     szMessage[ _MAX_PATH*2];
		sprintf( szMessage, "Execution failed! Contact technical support.\n\nReturn code: %d\nFailing module:%s\n", rc, szFail);
		rc = WinMessageBox( HWND_DESKTOP, HWND_DESKTOP,
							(PSZ)szMessage,
							(PSZ)"Unable to start Apache OpenOffice!",
							0, MB_ERROR | MB_OK);
		WinDestroyMsgQueue( hmq);
		WinTerminate( hab);
		exit(1);
	}

	WinDestroyMsgQueue( hmq);
	WinTerminate( hab);

	exit( result.codeResult);
}
