/**************************************************************
 *
 * 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.
 *
 *************************************************************/



/*
 * Description: Put MSO in a state where it can be closed using
 *              automation or kill it completely
 */

#include "stdafx.h"
#include <stdio.h>


void KillOffice();
BOOL KillAppFromWindow(HWND hWnd, char *appName);
BOOL CloseActiveDialogs();
void printUsage();

//Callbacks used in closing
BOOL CALLBACK CloseOfficeDlgProc(HWND hwndChild, LPARAM lParam);
BOOL CALLBACK CountOfficeDlgProc(HWND hwndChild, LPARAM lParam);

//Global counters for number of windows found
int gWDDlgCount = 0;
int gXLDlgCount = 0;
int gPPDlgCount = 0;

//Dialog window class names for excel, powerpoint and word
//These are "Best guess" dialog names
const char *pWordDlg2k  = "bosa_sdm_Microsoft Word 9.0";
const char *pWordDlg2k3 = "bosa_sdm_Microsoft Office Word";
const char *pXLDlg2k    = "bosa_sdm_XL9";
const char *pPPDlg2k    = "#32770";
const char *pXLDlg2k3   = "bosa_sdm_XL9";
const char *pPPDlg2k3   = "#32770";
const char *pGenMSODlg  = "bosa_sdm_Mso96";
//consider adding - bosa_sdm_Mso96

//Command Line Argument constants
const char *ARG_HELP  = "--help";
const char *ARG_KILL  = "--kill";
const char *ARG_CLOSE = "--close";

//Window class names for MSO apps - if we need to look at other office instances
//then this list would need to be expanded
#define NUM_WINDOWCLASSNAMES 4
char *wndClassName[NUM_WINDOWCLASSNAMES] = {"OpusApp", "XLMAIN", "PP9FrameClass", "PP10FrameClass"};

int main(int argc, char* argv[])
{
	if (argc < 2) {
		printUsage();
		return 0;
	}

	if (strcmpi(argv[1], ARG_HELP) == 0) {
		printUsage();
		return 0;
	}

	if (strcmpi(argv[1], ARG_KILL) == 0) {
		KillOffice();
		return 0;
	}

	if (strcmpi(argv[1], ARG_CLOSE) == 0) {
		CloseActiveDialogs();
		return 0;
	}

	return 0;
}

/*--------------------------------------------------------------
  Find the MSO window if it is available and explicitly kill it
  MSO apps in this case are Excel, Word and PP
  Use FindWindow Win32 API to detect if they are available

  -------------------------------------------------------------*/
void KillOffice() {
	HWND hWnd;

	for (int i=0;i<NUM_WINDOWCLASSNAMES;i++) {
		int j = 0;
		while (((hWnd = FindWindow(wndClassName[i], NULL )) != NULL) && (j < 10)) {
			KillAppFromWindow(hWnd, wndClassName[i]);
			j++;
		}
	}
}

/*--------------------------------------------------------------
  Using window handle, get process handle and try to kill the
  app. This may not be successful if you do not have enough
  privileges to kill the app.

  --------------------------------------------------------------*/
BOOL KillAppFromWindow(
    HWND hWnd,
    char *
#ifdef _DEBUG
    appName
#endif
)
{
	BOOL bRet = TRUE;

	if(hWnd == NULL) {
		//The app doesn't appear to be running
#ifdef _DEBUG
		printf("App %s: window not found.\n,", appName);
#endif
		bRet = FALSE;
	} else {
		DWORD pid;  // Variable to hold the process ID.
		DWORD dThread;  // Variable to hold (unused) thread ID.
		dThread = GetWindowThreadProcessId(hWnd, &pid);
		HANDLE hProcess; // Handle to existing process

		hProcess = OpenProcess(SYNCHRONIZE | PROCESS_ALL_ACCESS, TRUE, pid);
		if (hProcess == NULL) {
#ifdef _DEBUG
			printf("App %s : Failed to get process handle",appName);
#endif
			bRet = FALSE;
		} else {
			if (!TerminateProcess(hProcess, 0)) {
				LPTSTR lpMsgBuf;
				FormatMessage(
					FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
					NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
					(LPTSTR) &lpMsgBuf, 0, NULL );
				printf("%s\n", lpMsgBuf);
				LocalFree( lpMsgBuf );
				bRet = FALSE;
			}
#ifdef _DEBUG
			else {
				printf("Kill %s appears to be successful.\n", appName);
			}
#endif
		}
	}
	return bRet;
}

/*--------------------------------------------------------------
  Close the dialogs if possible based on their window class
  Use the EnumChildWindows win32 api for this
  --------------------------------------------------------------*/
BOOL CloseActiveDialogs() {
	char buff[1024];

	gWDDlgCount = 0;
	gXLDlgCount = 0;
	gPPDlgCount = 0;

	EnumChildWindows(GetDesktopWindow(), CloseOfficeDlgProc, (LPARAM) 0);
	sprintf(buff, "Word: %d\tExcel: %d\tPP: %d", gWDDlgCount, gXLDlgCount, gPPDlgCount);
	return TRUE;
}

/*--------------------------------------------------------------
  Callback for EnumChildWindows that sends close message to
  any dialogs that match window class of MSO dialogs

  --------------------------------------------------------------*/
BOOL CALLBACK CloseOfficeDlgProc(HWND hwndChild, LPARAM)
{
	//bosa_sdm_Microsoft Word 9.0
	//bosa_sdm_XL9
	//#32770 (Dialog)

 	char szBuff[4096];
	if (GetClassName(hwndChild, szBuff, 4096) == 0) {

	} else {
		if ((strcmpi(szBuff, pWordDlg2k) == 0) || (strcmpi(szBuff, pWordDlg2k3) == 0)) {
			gWDDlgCount++;
			SendMessage(hwndChild, WM_CLOSE, 0, 0);
		}
		if (strcmpi(szBuff, pXLDlg2k) == 0) {
			gXLDlgCount++;
			SendMessage(hwndChild, WM_CLOSE, 0, 0);
		}
		if (strcmpi(szBuff, pPPDlg2k) == 0) {
			gPPDlgCount++;
			SendMessage(hwndChild, WM_CLOSE, 0, 0);
		}
		if (strcmpi(szBuff, pGenMSODlg) == 0) {
			SendMessage(hwndChild, WM_CLOSE, 0, 0);
		}
	}

    return TRUE;
}


/*--------------------------------------------------------------
  Callback for EnumChildWindows that counts numnnber of
  dialogs that match window class of MSO dialogs

  --------------------------------------------------------------*/
BOOL CALLBACK CountOfficeDlgProc(HWND hwndChild, LPARAM)
{
 	char szBuff[4096];
	if (GetClassName(hwndChild, szBuff, 4096) == 0) {

	} else {
		if ((strcmpi(szBuff, pWordDlg2k) == 0) || (strcmpi(szBuff, pWordDlg2k3) == 0)) {
			gWDDlgCount++;
		}
		if (strcmpi(szBuff, pXLDlg2k) == 0) {
			gXLDlgCount++;
		}
		if (strcmpi(szBuff, pPPDlg2k) == 0) {
			gPPDlgCount++;
		}
	}

	return TRUE;
}

/*--------------------------------------------------------------
  Simple usage message...

  -------------------------------------------------------------*/
void printUsage() {
	printf("Recovery Assistant Utility - try and put MSO apps in a recoverable state\n");
	printf("Copyright Sun Microsystems 2008\n");
	printf("Options:\n");
	printf("   --help : This message\n");
	printf("   --close: Attempt to close any open dialogs owned by \n");
	printf("            MSO apps so Application.Quit() can succeed\n");
	printf("   --kill : Kill any open MSO apps. Use with caution and only as a last resort\n\n");
}
