/*******************************************************************************
 * Copyright (c) 2007 IBM Corporation and Others
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Hisashi MIYASHITA - initial API and implementation
 *******************************************************************************/
#include <atlbase.h>
#include <atlconv.h>
#include <shlguid.h>
#include <tchar.h>
#include <windows.h>
#include "org_eclipse_actf_ai_screenreader_jaws_JawsWindowUtil.h"

WNDPROC original_winproc;

static const TCHAR IE_window_class_name[] = _T("Internet Explorer_Server");
static UINT wm_html_getobject_msgid;

static HWND
getBrowserHWND(IWebBrowser2* iwebUnk)
{
    IOleWindow* iOleWindow;
    HWND hwnd;
    HRESULT hr = iwebUnk->get_HWND((LONG_PTR*) &hwnd);
    if (SUCCEEDED(hr)) return hwnd;
    hr = iwebUnk->QueryInterface(IID_IOleWindow, (void **)&iOleWindow);
    if (FAILED(hr)) return NULL;
    hr = iOleWindow->GetWindow(&hwnd);
    iOleWindow->Release();
    if (FAILED(hr)) return NULL;
    return hwnd;
}

static void walkThroughWindow(HWND top);
static void overrideWindowProc(HWND hwnd);
static LRESULT CALLBACK dummy_winproc(HWND hWnd, UINT cmd, WPARAM wParam, LPARAM lParam);

static void checkIEWindow(HWND hwnd)
{
    TCHAR className[sizeof(IE_window_class_name) + 1 + 1];
    if (GetClassName(hwnd, className, sizeof(className))) {
#if 0
	fprintf(stderr, "HWND:%x, %s\n", hwnd, className);
	fflush(stderr);
#endif
	if (_tcscmp(IE_window_class_name, className) == 0) {
	    overrideWindowProc(hwnd);
	}
    }
    walkThroughWindow(hwnd);
}

static void overrideWindowProc(HWND ie_hWnd)
{
    if (!ie_hWnd) return;
  
    LONG_PTR ptr = GetWindowLongPtr(ie_hWnd, GWLP_WNDPROC);
#if 0
    printf("BEFORE : %x\n", ptr);
#endif
  
    if (ptr != (LONG_PTR) dummy_winproc) {
	if ((LONG_PTR) original_winproc != ptr) {
	    original_winproc = (WNDPROC) ptr;
	    WNDCLASS wc;
	    wc.lpfnWndProc = dummy_winproc;
	    wc.lpszClassName = _T("Eclipse ACTF Accessibility Internet Explorer_Server");
	    RegisterClass(&wc);
	}
	SetWindowLongPtr(ie_hWnd, GWLP_WNDPROC, (LONG_PTR) dummy_winproc);
    }
  
    ptr = GetWindowLongPtr(ie_hWnd, GWLP_WNDPROC);
#if 0
    printf("AFTER : %x\n", ptr);
    fflush(stdout);
#endif
}

static void
walkThroughWindow(HWND top)
{
    HWND nextChild = GetWindow(top, GW_CHILD);
    while (nextChild) {
	checkIEWindow(nextChild);
	nextChild = GetWindow(nextChild, GW_HWNDNEXT);
    }
}


static LRESULT CALLBACK 
dummy_winproc(HWND hWnd, UINT cmd, WPARAM wParam, LPARAM lParam)
{
    if (cmd == wm_html_getobject_msgid) {
	// fprintf(stderr, "JAWS tries to bite!!\n");
	// fflush(stderr);
	return 0;
    } else if (cmd == WM_GETOBJECT) {
	return 0;
    } else if (original_winproc) {
	return CallWindowProc(original_winproc,
			      hWnd, cmd, wParam,
			      lParam);
    }
    return 0;
}

/*
 * Class:     org_eclipse_actf_ai_screenreader_jaws_JawsAPI
 * Method:    _TakeBackControl
 * Signature: (J)Z
 */
jboolean JNICALL
Java_org_eclipse_actf_ai_screenreader_jaws_JawsWindowUtil__1TakeBackControl
(JNIEnv *env, jclass clazz, jlong browser)
{
    wm_html_getobject_msgid = RegisterWindowMessage(_T("WM_HTML_GETOBJECT"));
#if 0
    HWND ie_hWnd = getBrowserHWND((IWebBrowser2 *) browser);
    overrideWindowProc(HWND ie_hWnd);
#else
    walkThroughWindow((HWND) browser);
#endif
    return JNI_TRUE;
}

