/**************************************************************
 * 
 * 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.
 * 
 *************************************************************/

#ifndef __ACCACT_HXX
#define __ACCACT_HXX

#include <windows.h>
#include <tchar.h>


static bool IsXPOrLater()
{
	OSVERSIONINFO osvi;

	ZeroMemory(&osvi, sizeof(OSVERSIONINFO));

	osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);

	GetVersionEx(&osvi);
	return ((osvi.dwMajorVersion > 5) ||
		((osvi.dwMajorVersion == 5) && (osvi.dwMinorVersion >= 1)));
}

static HANDLE pActCtx = INVALID_HANDLE_VALUE;
static ULONG_PTR lpCookie;

static bool ActivateActContext()
{
	if(!IsXPOrLater())
		return false;

	ACTCTX actctx; 

	ZeroMemory(&actctx, sizeof(actctx)); 

	actctx.cbSize = sizeof(actctx); 

	TCHAR szDllDirPath[1024];
	::GetCurrentDirectory(1024,szDllDirPath);
	LPTSTR szDllPath = szDllDirPath;
	lstrcat(szDllPath, _T("\\UAccCOM.dll"));

	actctx.lpSource = szDllPath;
	actctx.lpResourceName = MAKEINTRESOURCE(97);
	actctx.dwFlags = ACTCTX_FLAG_RESOURCE_NAME_VALID;

	HANDLE pActCtx = CreateActCtx(&actctx); 

	if(pActCtx != INVALID_HANDLE_VALUE) 
	{
		if(ActivateActCtx(pActCtx, &lpCookie))
		{
			return true;
		}		
	}
	pActCtx = INVALID_HANDLE_VALUE;
	lpCookie = 0;
	return false;
}

static void DeactivateActContext()
{
	if(!IsXPOrLater())
		return;

	if(lpCookie)
		DeactivateActCtx(0, lpCookie); 

	if(pActCtx!=INVALID_HANDLE_VALUE)
		ReleaseActCtx(pActCtx);
}
#endif