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



#define _WIN32_WINDOWS 0x0410
#ifdef _MSC_VER
#pragma warning(push, 1) /* disable warnings within system headers */
#endif
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <msiquery.h>
#ifdef _MSC_VER
#pragma warning(pop)
#endif

#include <malloc.h>

#ifdef UNICODE
#define _UNICODE
#define _tstring	wstring
#else
#define _tstring	string
#endif
#include <tchar.h>
#include <string>

using namespace std;

namespace 
{
	std::_tstring GetMsiProperty( MSIHANDLE handle, const std::_tstring& sProperty )
	{
		std::_tstring	result;
		TCHAR	szDummy[1] = TEXT("");
		DWORD	nChars = 0;

		if ( MsiGetProperty( handle, sProperty.c_str(), szDummy, &nChars ) == ERROR_MORE_DATA )
		{
			DWORD nBytes = ++nChars * sizeof(TCHAR);
			LPTSTR buffer = reinterpret_cast<LPTSTR>(_alloca(nBytes));
			ZeroMemory( buffer, nBytes );
			MsiGetProperty(handle, sProperty.c_str(), buffer, &nChars);
			result = buffer;
		}

		return	result;
	}
} // namespace

extern "C" UINT __stdcall MigrateInstallPath( MSIHANDLE handle )
{
	TCHAR	szValue[8192];
	DWORD	nValueSize = sizeof(szValue);
	HKEY	hKey;
	std::_tstring	sInstDir;

	std::_tstring	sManufacturer = GetMsiProperty( handle, TEXT("Manufacturer") );
	std::_tstring	sDefinedName = GetMsiProperty( handle, TEXT("DEFINEDPRODUCT") );
	std::_tstring	sUpdateVersion = GetMsiProperty( handle, TEXT("DEFINEDVERSION") );
	std::_tstring	sUpgradeCode = GetMsiProperty( handle, TEXT("UpgradeCode") );

	std::_tstring	sProductKey = "Software\\" + sManufacturer + "\\" + sDefinedName +
										"\\" + sUpdateVersion + "\\" + sUpgradeCode;

	std::_tstring	mystr;
	mystr = "ProductKey: " + sProductKey;
	// MessageBox( NULL, mystr.c_str(), "ProductKey", MB_OK );

	if ( ERROR_SUCCESS == RegOpenKey( HKEY_CURRENT_USER,  sProductKey.c_str(), &hKey ) )
	{
		if ( ERROR_SUCCESS == RegQueryValueEx( hKey, TEXT("INSTALLLOCATION"), NULL, NULL, (LPBYTE)szValue, &nValueSize ) )
		{
			sInstDir = szValue;
			MsiSetProperty(handle, TEXT("INSTALLLOCATION"), sInstDir.c_str());                        
			// MessageBox( NULL, sInstDir.c_str(), "Found in HKEY_CURRENT_USER", MB_OK );
		}
		
		RegCloseKey( hKey );
	}
	else if ( ERROR_SUCCESS == RegOpenKey( HKEY_LOCAL_MACHINE,  sProductKey.c_str(), &hKey ) )
	{
		if ( ERROR_SUCCESS == RegQueryValueEx( hKey, TEXT("INSTALLLOCATION"), NULL, NULL, (LPBYTE)szValue, &nValueSize ) )
		{
			sInstDir = szValue;
			MsiSetProperty(handle, TEXT("INSTALLLOCATION"), sInstDir.c_str());                        
			// MessageBox( NULL, sInstDir.c_str(), "Found in HKEY_LOCAL_MACHINE", MB_OK );
		}

		RegCloseKey( hKey );
	}

	return ERROR_SUCCESS;

}
