diff options
Diffstat (limited to 'setup_native/source/win32/customactions/javafilter/jfregca.cxx')
-rw-r--r-- | setup_native/source/win32/customactions/javafilter/jfregca.cxx | 330 |
1 files changed, 330 insertions, 0 deletions
diff --git a/setup_native/source/win32/customactions/javafilter/jfregca.cxx b/setup_native/source/win32/customactions/javafilter/jfregca.cxx new file mode 100644 index 000000000000..80a8937cbe3a --- /dev/null +++ b/setup_native/source/win32/customactions/javafilter/jfregca.cxx @@ -0,0 +1,330 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +//#include <stdio.h> + +#ifdef _MSC_VER +#pragma warning(push, 1) /* disable warnings within system headers */ +#endif +#include <windows.h> +#include <msi.h> +#include <msiquery.h> +#ifdef _MSC_VER +#pragma warning(pop) +#endif + +#if defined UNICODE +#define _UNICODE +#endif +#include <tchar.h> + +//Simple function prototypes +bool update_activesync_regvalues(bool, bool, char** ); +void createKeys(HKEY hKey, char **); +void deleteKeys(HKEY hKey, char **); +bool isMulti(MSIHANDLE); + +//Simple data arrays for registry values +TCHAR *pxlData[8]= { + "{C6AB3E74-9F4F-4370-8120-A8A6FABB7A7C}", //CLSID 1 - key name at InstalledFilters Key + "{43887C67-4D5D-4127-BAAC-87A288494C7C}", //CLSID 2 - key value for Default Export + ".pxl", //Registry key for device type - already there if ActiveSync installerd + ".sxc", //New registry key for SO docs + "InstalledFilters", //Sub-key of device/so doc key + "DefaultImport", //Key name added at device/so level key + "DefaultExport", //Key name added at device/so level key + "Binary Copy", //Key value for DefaultImport +}; + +TCHAR *pswData[8] = { + "{BDD611C3-7BAB-460F-8711-5B9AC9EF6020}", //CLSID 1 - key name at InstalledFilters Key + "{CB43F086-838D-4FA4-B5F6-3406B9A57439}", //CLSID 2 - key value for Default Export + ".psw", //Registry key for device type - already there if ActiveSync installe + ".sxw", //New registry key for SO docs + "InstalledFilters", //Sub-key of device/so doc key + "DefaultImport", //Key name added at device/so level key + "DefaultExport", //Key name added at device/so level key + "Binary Copy", //Key value for DefaultImport +}; + + +//index into registry value arrays +#define CLSID1 0 +#define CLSID2 1 +#define DEVICE_PATH 2 +#define SO_PATH 3 +#define IF_PATH 4 +#define DEFIMPORT_KEY 5 +#define DEFEXPORT_KEY 6 +#define BC_VALUE 7 + +//Constants for Registry buffers +const int MAX_KEY_LENGTH=255; +const int MAX_VALUE_NAME=16383; + +BOOL APIENTRY DllMain( HANDLE, + DWORD ul_reason, + LPVOID + ) +{ + switch (ul_reason) + { + case DLL_PROCESS_ATTACH: + case DLL_THREAD_ATTACH: + case DLL_THREAD_DETACH: + case DLL_PROCESS_DETACH: + break; + } + return TRUE; +} + +extern "C" UINT install_jf ( MSIHANDLE hModule ) { + bool bMulti = isMulti(hModule); +#ifdef _JRGREG_DEBUG + MessageBox(NULL, bMulti ? "Multi" : "Single", "Install", MB_OK); +#endif + update_activesync_regvalues(bMulti, true, pxlData); + update_activesync_regvalues(bMulti, true, pswData); + + return ERROR_SUCCESS; +} + +extern "C" UINT uninstall_jf ( MSIHANDLE hModule ) { + bool bMulti = isMulti(hModule); +#ifdef _JRGREG_DEBUG + MessageBox(NULL, bMulti ? "Multi" : "Single", "Uninstall", MB_OK); +#endif + update_activesync_regvalues(false, bMulti, pxlData); + update_activesync_regvalues(false, bMulti, pswData); + + return ERROR_SUCCESS; +} + +/** + Determines if this is being installed on a per user or a machine wide basis + @param hModule + [in] a valid msi handle. + + + @returns + <TRUE/>if this is a multi-user install. +*/ +bool isMulti( MSIHANDLE hModule ) { + TCHAR* szValueBuf = NULL; + DWORD cchValueBuf = 0; + bool bRet = false; + UINT uiStat = MsiGetProperty(hModule, TEXT("ALLUSERS"), TEXT(""), &cchValueBuf); + if (ERROR_MORE_DATA == uiStat) + { + ++cchValueBuf; // on output does not include terminating null, so add 1 + szValueBuf = new TCHAR[cchValueBuf]; + if (szValueBuf) + { + uiStat = MsiGetProperty(hModule, TEXT("ALLUSERS"), szValueBuf, &cchValueBuf); + } + } + if (ERROR_SUCCESS != uiStat) + { + return false; + } + bRet = _tcscmp(szValueBuf, TEXT("1")) == 0; + delete [] szValueBuf; + + return bRet; +} + +/** + Add or remove ActiveSync integration entries from the registry + @param bMultiUser + [in] <TRUE/>if this is a multiuser install (<FALSE/> for single user install) + + @param bInstall + [in] <TRUE/>if installing + + @param data + [in] an array of string containing names of registry keys and values + + + @returns + <TRUE/>if this is a multi-user install. +*/ + +bool update_activesync_regvalues(bool bMultiUser, bool bInstall, char **data) { + bool bReturn = false; + CHAR SUKey[] = "Software\\Microsoft\\Windows CE Services\\Partners"; + CHAR MUKey[] = "Software\\Microsoft\\Windows CE Services\\Filters"; + HKEY hKey; + + if (bMultiUser) { + if (ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE, (LPCSTR)MUKey, 0, KEY_ALL_ACCESS, &hKey)) { + return false; + } + if (bInstall) { + createKeys(hKey, data); + } else { + deleteKeys(hKey, data); + } + bReturn = true; + } else { + if (ERROR_SUCCESS != RegOpenKeyEx(HKEY_CURRENT_USER, (LPCSTR)SUKey, 0, KEY_ALL_ACCESS, &hKey)) { + return false; + } + + CHAR achKey[MAX_KEY_LENGTH]; // buffer for subkey name + DWORD cbName; // size of name string + CHAR achClass[MAX_PATH] = ""; // buffer for class name + DWORD cchClassName = MAX_PATH; // size of class string + DWORD cSubKeys=0; // number of subkeys + DWORD cbMaxSubKey; // longest subkey size + DWORD cchMaxClass; // longest class string + DWORD cValues; // number of values for key + DWORD cchMaxValue; // longest value name + DWORD cbMaxValueData; // longest value data + DWORD cbSecurityDescriptor; // size of security descriptor + FILETIME ftLastWriteTime; // last write time + + // Get the class name and the value count. + if (ERROR_SUCCESS == RegQueryInfoKey( + hKey, // key handle + achClass, // buffer for class name + &cchClassName, // size of class string + NULL, // reserved + &cSubKeys, // number of subkeys + &cbMaxSubKey, // longest subkey size + &cchMaxClass, // longest class string + &cValues, // number of values for this key + &cchMaxValue, // longest value name + &cbMaxValueData, // longest value data + &cbSecurityDescriptor, // security descriptor + &ftLastWriteTime)) { // last write time + + if (cSubKeys) { + for (DWORD i=0; i<cSubKeys; i++) { + cbName = 1024; + if (ERROR_SUCCESS == RegEnumKeyEx(hKey,i,achKey,&cbName,NULL,NULL,NULL,&ftLastWriteTime)) { + HKEY subKey; + if (ERROR_SUCCESS == RegOpenKeyEx(hKey, achKey, 0, KEY_ALL_ACCESS, &subKey)) { + if (ERROR_SUCCESS == RegOpenKeyEx(subKey, "Filters", 0, KEY_ALL_ACCESS, &subKey)) { + if (bInstall) { + createKeys(subKey, data); + } else { + deleteKeys(subKey, data); + } + RegCloseKey(subKey); + } + } + } + } + } + + bReturn = true; + } + } + if (hKey != NULL) { + RegCloseKey(hKey); + } + + return bReturn; +} + +/** + Create Registry Keys + + @param hKey + [in] Handle to the parent registry key + + @param data + [in] an array of string containing names of registry keys and values +*/ + +void createKeys(HKEY hKey, char **data) { + + LPCSTR clsid1 = data[CLSID1]; + LPCSTR clsid2 = data[CLSID2]; + LPCSTR devicePath = data[DEVICE_PATH]; + LPCSTR soPath = data[SO_PATH]; + LPCSTR defImport = data[DEFIMPORT_KEY]; + LPCSTR defExport = data[DEFEXPORT_KEY]; + LPCSTR binaryCopy = data[BC_VALUE]; + LPCSTR IFPath = data[IF_PATH]; + + HKEY deviceKey, deviceIFKey, soKey, soIFKey; + + if (ERROR_SUCCESS == RegOpenKeyEx(hKey,devicePath,0,KEY_ALL_ACCESS, &deviceKey)) { + if (ERROR_SUCCESS == RegOpenKeyEx(deviceKey,IFPath,0,KEY_ALL_ACCESS, &deviceIFKey)) { + RegSetValueEx(deviceIFKey, clsid1, 0, REG_SZ, NULL, NULL); + } + } + + if (ERROR_SUCCESS == RegCreateKeyEx(hKey, soPath, 0, NULL, + REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &soKey, NULL)) { + RegSetValueEx(soKey, defExport, 0, REG_SZ, (LPBYTE)binaryCopy, strlen(binaryCopy)); + RegSetValueEx(soKey, defImport, 0, REG_SZ, (LPBYTE)clsid2, strlen(clsid2)); + + + if (ERROR_SUCCESS == RegCreateKeyEx(soKey, IFPath, 0, NULL, + REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &soIFKey, NULL)) { + RegSetValueEx(soIFKey, clsid2, 0, REG_SZ, NULL, NULL); + } + } +} + +/** + Delete registry keys + + @param hKey + [in] Handle to the parent registry key +*/ +void deleteKeys(HKEY hKey, TCHAR **data) { + LPCSTR clsid1 = data[CLSID1]; + LPCSTR clsid2 = data[CLSID2]; + LPCSTR devicePath = data[DEVICE_PATH]; + LPCSTR soPath = data[SO_PATH]; + LPCSTR defImport = data[DEFIMPORT_KEY]; + LPCSTR defExport = data[DEFEXPORT_KEY]; + LPCSTR IFPath = data[IF_PATH]; + + HKEY deviceKey, deviceIFKey, soKey, soIFKey; + + if (ERROR_SUCCESS == RegOpenKeyEx(hKey,devicePath,0,KEY_ALL_ACCESS, &deviceKey)) { + if (ERROR_SUCCESS == RegOpenKeyEx(deviceKey,IFPath,0,KEY_ALL_ACCESS, &deviceIFKey)) { + RegDeleteValue(deviceIFKey, clsid1); + } + } + + if (ERROR_SUCCESS == RegOpenKeyEx(hKey, soPath, 0, KEY_ALL_ACCESS, &soKey)) { + RegDeleteValue(soKey, defExport); + RegDeleteValue(soKey, defImport); + + if (ERROR_SUCCESS == RegOpenKeyEx(soKey, IFPath, 0, KEY_ALL_ACCESS, &soIFKey)) { + RegDeleteValue(soIFKey, clsid2); + RegCloseKey(soIFKey); + RegDeleteKey(soKey, IFPath); + } + RegCloseKey(soKey); + RegDeleteKey(hKey, soPath); + } +} |