remove reg4msdoc files, they are not compiled
Change-Id: I0b12dd16c6de05b14d2196771a81441ac0c73201
This commit is contained in:
@@ -1,42 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
/*************************************************************************
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
************************************************************************/
|
||||
|
||||
#ifndef _CONSTANTS_HXX_
|
||||
#define _CONSTANTS_HXX_
|
||||
|
||||
extern const int MSWORD;
|
||||
extern const int MSEXCEL;
|
||||
extern const int MSPOWERPOINT;
|
||||
extern const int DEFAULT_HTML_EDITOR_FOR_IE;
|
||||
extern const int HTML_EDITOR;
|
||||
extern const int DEFAULT_SHELL_HTML_EDITOR;
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|
@@ -1,3 +0,0 @@
|
||||
InstallUiSequenceEntry
|
||||
InstallExecSequenceEntry
|
||||
DeinstallExecSequenceEntry
|
@@ -1,89 +0,0 @@
|
||||
#*************************************************************************
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
#*************************************************************************
|
||||
|
||||
PRJ=..$/..$/..$/..
|
||||
PRJNAME=setup_native
|
||||
TARGET=reg4msdocmsi
|
||||
|
||||
# --- Settings -----------------------------------------------------
|
||||
|
||||
ENABLE_EXCEPTIONS=TRUE
|
||||
NO_DEFAULT_STL=TRUE
|
||||
DYNAMIC_CRT=
|
||||
USE_DEFFILE=TRUE
|
||||
MINGW_NODLL=YES
|
||||
|
||||
.INCLUDE : settings.mk
|
||||
|
||||
CFLAGS+=-DUNICODE -D_UNICODE
|
||||
|
||||
# --- Files --------------------------------------------------------
|
||||
|
||||
.IF "$(GUI)"=="WNT"
|
||||
|
||||
UWINAPILIB=
|
||||
|
||||
SLOFILES = $(SLO)$/msihelper.obj\
|
||||
$(SLO)$/windowsregistry.obj\
|
||||
$(SLO)$/userregistrar.obj\
|
||||
$(SLO)$/stringconverter.obj\
|
||||
$(SLO)$/registrywnt.obj\
|
||||
$(SLO)$/registryw9x.obj\
|
||||
$(SLO)$/registryvalueimpl.obj\
|
||||
$(SLO)$/registryexception.obj\
|
||||
$(SLO)$/registry.obj\
|
||||
$(SLO)$/registrationcontextinformation.obj\
|
||||
$(SLO)$/registrar.obj\
|
||||
$(SLO)$/register.obj\
|
||||
$(SLO)$/reg4msdocmsi.obj
|
||||
|
||||
SHL1STDLIBS= $(KERNEL32LIB)\
|
||||
$(USER32LIB)\
|
||||
$(ADVAPI32LIB)\
|
||||
$(SHELL32LIB)\
|
||||
$(MSILIB)\
|
||||
$(SHLWAPILIB)
|
||||
|
||||
SHL1LIBS = $(SLB)$/$(TARGET).lib
|
||||
|
||||
SHL1TARGET = $(TARGET)
|
||||
SHL1IMPLIB = i$(TARGET)
|
||||
|
||||
SHL1DEF = $(MISC)$/$(SHL1TARGET).def
|
||||
SHL1DEPN = $(SLB)$/$(TARGET).lib
|
||||
SHL1BASE = 0x1c000000
|
||||
DEF1NAME=$(SHL1TARGET)
|
||||
DEF1EXPORTFILE=exports.dxp
|
||||
|
||||
.ENDIF
|
||||
|
||||
# --- Targets --------------------------------------------------------------
|
||||
|
||||
.INCLUDE : target.mk
|
||||
|
||||
# -------------------------------------------------------------------------
|
||||
|
@@ -1,105 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
#include "msihelper.hxx"
|
||||
|
||||
#include <malloc.h>
|
||||
#include <assert.h>
|
||||
|
||||
bool GetMsiProp(MSIHANDLE handle, LPCTSTR name, /*out*/std::wstring& value)
|
||||
{
|
||||
DWORD sz = 0;
|
||||
LPTSTR dummy = TEXT("");
|
||||
if (MsiGetProperty(handle, name, dummy, &sz) == ERROR_MORE_DATA)
|
||||
{
|
||||
sz++;
|
||||
DWORD nbytes = sz * sizeof(TCHAR);
|
||||
LPTSTR buff = reinterpret_cast<LPTSTR>(_alloca(nbytes));
|
||||
ZeroMemory(buff, nbytes);
|
||||
MsiGetProperty(handle, name, buff, &sz);
|
||||
value = buff;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void SetMsiProp(MSIHANDLE handle, LPCTSTR name)
|
||||
{
|
||||
MsiSetProperty(handle, name, TEXT("1"));
|
||||
}
|
||||
|
||||
void UnsetMsiProp(MSIHANDLE handle, LPCTSTR name)
|
||||
{
|
||||
MsiSetProperty(handle, name, TEXT(""));
|
||||
}
|
||||
|
||||
bool IsSetMsiProp(MSIHANDLE handle, LPCTSTR name)
|
||||
{
|
||||
std::wstring val;
|
||||
GetMsiProp(handle, name, val);
|
||||
return (val == TEXT("1"));
|
||||
}
|
||||
|
||||
bool IsMsiPropNotEmpty(MSIHANDLE handle, LPCTSTR name)
|
||||
{
|
||||
std::wstring val;
|
||||
GetMsiProp(handle, name, val);
|
||||
return (val != TEXT(""));
|
||||
}
|
||||
|
||||
bool IsAllUserInstallation(MSIHANDLE handle)
|
||||
{
|
||||
return IsSetMsiProp(handle, TEXT("ALLUSERS"));
|
||||
}
|
||||
|
||||
std::wstring GetOfficeInstallationPath(MSIHANDLE handle)
|
||||
{
|
||||
std::wstring progpath;
|
||||
GetMsiProp(handle, TEXT("INSTALLLOCATION"), progpath);
|
||||
return progpath;
|
||||
}
|
||||
|
||||
std::wstring GetOfficeExecutablePath(MSIHANDLE handle)
|
||||
{
|
||||
std::wstring exepath = GetOfficeInstallationPath(handle);
|
||||
exepath += TEXT("program\\soffice.exe");
|
||||
return exepath;
|
||||
}
|
||||
|
||||
std::wstring GetProductName(MSIHANDLE handle)
|
||||
{
|
||||
std::wstring prodname;
|
||||
GetMsiProp(handle, TEXT("ProductName"), prodname);
|
||||
return prodname;
|
||||
}
|
||||
|
||||
bool IsModuleInstalled(MSIHANDLE handle, LPCTSTR name)
|
||||
{
|
||||
INSTALLSTATE current_state;
|
||||
INSTALLSTATE future_state;
|
||||
MsiGetFeatureState(handle, name, ¤t_state, &future_state);
|
||||
return (current_state == INSTALLSTATE_LOCAL);
|
||||
}
|
||||
|
||||
bool IsModuleSelectedForInstallation(MSIHANDLE handle, LPCTSTR name)
|
||||
{
|
||||
INSTALLSTATE current_state;
|
||||
INSTALLSTATE future_state;
|
||||
MsiGetFeatureState(handle, name, ¤t_state, &future_state);
|
||||
return (future_state == INSTALLSTATE_LOCAL);
|
||||
}
|
||||
|
||||
bool IsModuleSelectedForDeinstallation(MSIHANDLE handle, LPCTSTR name)
|
||||
{
|
||||
INSTALLSTATE current_state;
|
||||
INSTALLSTATE future_state;
|
||||
MsiGetFeatureState(handle, name, ¤t_state, &future_state);
|
||||
return ((current_state == INSTALLSTATE_LOCAL) && (future_state == INSTALLSTATE_ABSENT));
|
||||
}
|
||||
|
||||
bool IsCompleteDeinstallation(MSIHANDLE handle)
|
||||
{
|
||||
std::wstring rm;
|
||||
GetMsiProp(handle, TEXT("REMOVE"), rm);
|
||||
return (rm == TEXT("ALL"));
|
||||
}
|
||||
|
||||
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|
@@ -1,187 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
#ifndef INCLUDED_MSIHELPER_HXX
|
||||
#define INCLUDED_MSIHELPER_HXX
|
||||
|
||||
#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 <string>
|
||||
|
||||
/**
|
||||
Get the value of the named property
|
||||
|
||||
@param handle
|
||||
[in] a valid msi handle.
|
||||
|
||||
@param name
|
||||
[in] the name of the property.
|
||||
|
||||
@param value
|
||||
[out] receives thes value of the property.
|
||||
|
||||
@returns
|
||||
<TRUE/>if the property was found.
|
||||
*/
|
||||
bool GetMsiProp(MSIHANDLE handle, LPCTSTR name, /*out*/std::wstring& value);
|
||||
|
||||
/**
|
||||
Set the value of a binary property which can only
|
||||
have the values "0" or "1" to "1".
|
||||
|
||||
@param handle
|
||||
[in] a valid msi handle.
|
||||
|
||||
@param name
|
||||
[in] the name of the property.
|
||||
*/
|
||||
void SetMsiProp(MSIHANDLE handle, LPCTSTR name);
|
||||
|
||||
/**
|
||||
Set the value of a binary property which can only
|
||||
have the values "0" or "1" to "0".
|
||||
|
||||
@param handle
|
||||
[in] a valid msi handle.
|
||||
|
||||
@param name
|
||||
[in] the name of the property.
|
||||
*/
|
||||
void UnsetMsiProp(MSIHANDLE handle, LPCTSTR name);
|
||||
|
||||
/**
|
||||
Returns whether a certain property is set meaning
|
||||
its value is "1". This method should be used for
|
||||
binary properties whose value can be "0" or "1".
|
||||
|
||||
@returns
|
||||
<TRUE/>if the value of the specified property is
|
||||
"1" else if the property is not defined or its
|
||||
value is other than "1" <FALSE/> will be returned.
|
||||
*/
|
||||
bool IsSetMsiProp(MSIHANDLE handle, LPCTSTR name);
|
||||
|
||||
/**
|
||||
Returns whether a certain property is set meaning
|
||||
its value is not empty. This method should be used for
|
||||
properties, that can have different values.
|
||||
|
||||
@returns
|
||||
<TRUE/>if the value of the specified property is
|
||||
not empty. If it is empty <FALSE/> will be returned.
|
||||
*/
|
||||
bool IsMsiPropNotEmpty(MSIHANDLE handle, LPCTSTR name);
|
||||
|
||||
/**
|
||||
Query if this is an installation for all user or not.
|
||||
|
||||
@param handle
|
||||
[in] a valid msi handle.
|
||||
|
||||
@returns
|
||||
<TRUE/>if this is an all user installation
|
||||
*/
|
||||
bool IsAllUserInstallation(MSIHANDLE handle);
|
||||
|
||||
/**
|
||||
Returns the destination folder of the office installation
|
||||
as system path. The returned path contains a final '\'.
|
||||
|
||||
@param handle
|
||||
[in] a valid msi handle.
|
||||
|
||||
@returns
|
||||
the destination path of the office installation finalized
|
||||
with a '\'.
|
||||
*/
|
||||
std::wstring GetOfficeInstallationPath(MSIHANDLE handle);
|
||||
|
||||
/**
|
||||
Returns the absolute path of the office executable that
|
||||
will be installed as system path.
|
||||
|
||||
@param handle
|
||||
[in] a valid msi handle.
|
||||
|
||||
@returns
|
||||
the absolute system path of the office executable (e.g.
|
||||
(C:\Program Files\StarOffice 8\program\soffice.exe").
|
||||
*/
|
||||
std::wstring GetOfficeExecutablePath(MSIHANDLE handle);
|
||||
|
||||
/**
|
||||
Get the name of the office that will be installed
|
||||
(e.g. StarOffice 8, StarSuite 8, ...).
|
||||
|
||||
@param handle
|
||||
[in] a valid msi handle.
|
||||
|
||||
@returns
|
||||
the name of the office product that will be installed.
|
||||
*/
|
||||
std::wstring GetProductName(MSIHANDLE handle);
|
||||
|
||||
/**
|
||||
Determine if the specified module is installed locally.
|
||||
|
||||
@param handle
|
||||
[in] a valid msi handle.
|
||||
|
||||
@param name
|
||||
[in] the name of the module.
|
||||
|
||||
@returns
|
||||
<TRUE/>if the specified module is installed locally.
|
||||
*/
|
||||
bool IsModuleInstalled(MSIHANDLE handle, LPCTSTR name);
|
||||
|
||||
/**
|
||||
Determine if the specified module is selected to be installed
|
||||
locally.
|
||||
|
||||
@param handle
|
||||
[in] a valid msi handle.
|
||||
|
||||
@param name
|
||||
[in] the name of the module.
|
||||
|
||||
@returns
|
||||
<TRUE/>if the specified module is about to be installed locally.
|
||||
*/
|
||||
bool IsModuleSelectedForInstallation(MSIHANDLE handle, LPCTSTR name);
|
||||
|
||||
/**
|
||||
Determine if the specified module which is locally installed is
|
||||
selected for deinstallation.
|
||||
|
||||
@param handle
|
||||
[in] a valid msi handle.
|
||||
|
||||
@param name
|
||||
[in] the name of the module.
|
||||
|
||||
@returns
|
||||
<TRUE/>if the specified module is about to be deinstalled.
|
||||
*/
|
||||
bool IsModuleSelectedForDeinstallation(MSIHANDLE handle, LPCTSTR name);
|
||||
|
||||
/**
|
||||
Determine whether this is a complete uninstallation or not.
|
||||
|
||||
@param handle
|
||||
[in] a valid msi handle.
|
||||
|
||||
@returns
|
||||
<TRUE/>if this is a complete deinstallation.
|
||||
*/
|
||||
bool IsCompleteDeinstallation(MSIHANDLE handle);
|
||||
|
||||
#endif
|
||||
|
||||
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|
@@ -1,190 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
/*************************************************************************
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
************************************************************************/
|
||||
|
||||
#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 <tchar.h>
|
||||
#include "register.hxx"
|
||||
#include "msihelper.hxx"
|
||||
|
||||
#include <memory>
|
||||
#include <string>
|
||||
|
||||
void DetermineWordPreselectionState(MSIHANDLE handle)
|
||||
{
|
||||
if (query_preselect_registration_for_ms_application(handle, MSWORD))
|
||||
SetMsiProp(handle, TEXT("SELECT_WORD"));
|
||||
}
|
||||
|
||||
void DetermineExcelPreselectionState(MSIHANDLE handle)
|
||||
{
|
||||
if (query_preselect_registration_for_ms_application(handle, MSEXCEL))
|
||||
SetMsiProp(handle, TEXT("SELECT_EXCEL"));
|
||||
}
|
||||
|
||||
void DeterminePowerPointPreselectionState(MSIHANDLE handle)
|
||||
{
|
||||
if (query_preselect_registration_for_ms_application(handle, MSPOWERPOINT))
|
||||
SetMsiProp(handle, TEXT("SELECT_POWERPOINT"));
|
||||
}
|
||||
|
||||
extern "C" UINT __stdcall InstallUiSequenceEntry(MSIHANDLE handle)
|
||||
{
|
||||
//MessageBox(NULL, TEXT("InstallUiSequenceEntry"), TEXT("Information"), MB_OK | MB_ICONINFORMATION);
|
||||
|
||||
if (IsModuleSelectedForInstallation(handle, TEXT("gm_p_Wrt_Bin")))
|
||||
{
|
||||
DetermineWordPreselectionState(handle);
|
||||
}
|
||||
else if (IsModuleInstalled(handle, TEXT("gm_p_Wrt_Bin")) &&
|
||||
!IsModuleSelectedForDeinstallation(handle, TEXT("gm_p_Wrt_Bin")) &&
|
||||
IsRegisteredFor(handle, MSWORD))
|
||||
{
|
||||
SetMsiProp(handle, TEXT("SELECT_WORD"));
|
||||
}
|
||||
else
|
||||
{
|
||||
UnsetMsiProp(handle, TEXT("SELECT_WORD"));
|
||||
}
|
||||
|
||||
if (IsModuleSelectedForInstallation(handle, TEXT("gm_p_Calc_Bin")))
|
||||
{
|
||||
DetermineExcelPreselectionState(handle);
|
||||
}
|
||||
else if (IsModuleInstalled(handle, TEXT("gm_p_Calc_Bin")) &&
|
||||
!IsModuleSelectedForDeinstallation(handle, TEXT("gm_p_Calc_Bin")) &&
|
||||
IsRegisteredFor(handle, MSEXCEL))
|
||||
{
|
||||
SetMsiProp(handle, TEXT("SELECT_EXCEL"));
|
||||
}
|
||||
else
|
||||
{
|
||||
UnsetMsiProp(handle, TEXT("SELECT_EXCEL"));
|
||||
}
|
||||
|
||||
if (IsModuleSelectedForInstallation(handle, TEXT("gm_p_Impress_Bin")))
|
||||
{
|
||||
DeterminePowerPointPreselectionState(handle);
|
||||
}
|
||||
else if (IsModuleInstalled(handle, TEXT("gm_p_Impress_Bin")) &&
|
||||
!IsModuleSelectedForDeinstallation(handle, TEXT("gm_p_Impress_Bin")) &&
|
||||
IsRegisteredFor(handle, MSPOWERPOINT))
|
||||
{
|
||||
SetMsiProp(handle, TEXT("SELECT_POWERPOINT"));
|
||||
}
|
||||
else
|
||||
{
|
||||
UnsetMsiProp(handle, TEXT("SELECT_POWERPOINT"));
|
||||
}
|
||||
|
||||
SetMsiProp(handle, TEXT("UI_SEQUENCE_EXECUTED"));
|
||||
|
||||
return ERROR_SUCCESS;
|
||||
}
|
||||
|
||||
extern "C" UINT __stdcall InstallExecSequenceEntry(MSIHANDLE handle)
|
||||
{
|
||||
//MessageBox(NULL, TEXT("InstallExecSequenceEntry"), TEXT("Information"), MB_OK | MB_ICONINFORMATION);
|
||||
|
||||
// Do nothing in repair mode.
|
||||
// Then UI_SEQUENCE_EXECUTED is not set and Installed is set!
|
||||
// In silent installation UI_SEQUENCE_EXECUTED is also not set, but Installed is not set.
|
||||
if ((!IsSetMsiProp(handle, TEXT("UI_SEQUENCE_EXECUTED"))) && (IsMsiPropNotEmpty(handle, TEXT("Installed")))) { return ERROR_SUCCESS; }
|
||||
|
||||
int reg4 = 0;
|
||||
int unreg4 = 0;
|
||||
|
||||
// we always register as html editor for Internet Explorer
|
||||
// if writer is installed because there's no harm if we do so
|
||||
if (IsModuleSelectedForInstallation(handle, TEXT("gm_p_Wrt_Bin")))
|
||||
reg4 |= HTML_EDITOR;
|
||||
|
||||
if (IsSetMsiProp(handle, TEXT("SELECT_WORD")) && !IsRegisteredFor(handle, MSWORD))
|
||||
reg4 |= MSWORD;
|
||||
else if (!IsSetMsiProp(handle, TEXT("SELECT_WORD")) && IsRegisteredFor(handle, MSWORD))
|
||||
unreg4 |= MSWORD;
|
||||
|
||||
if (IsSetMsiProp(handle, TEXT("SELECT_EXCEL")) && !IsRegisteredFor(handle, MSEXCEL))
|
||||
reg4 |= MSEXCEL;
|
||||
else if (!IsSetMsiProp(handle, TEXT("SELECT_EXCEL")) && IsRegisteredFor(handle, MSEXCEL))
|
||||
unreg4 |= MSEXCEL;
|
||||
|
||||
if (IsSetMsiProp(handle, TEXT("SELECT_POWERPOINT")) && !IsRegisteredFor(handle, MSPOWERPOINT))
|
||||
reg4 |= MSPOWERPOINT;
|
||||
else if (!IsSetMsiProp(handle, TEXT("SELECT_POWERPOINT")) && IsRegisteredFor(handle, MSPOWERPOINT))
|
||||
unreg4 |= MSPOWERPOINT;
|
||||
|
||||
if (reg4)
|
||||
{
|
||||
Register4MsDoc(handle, reg4);
|
||||
}
|
||||
|
||||
if (unreg4)
|
||||
{
|
||||
Unregister4MsDoc(handle, unreg4);
|
||||
}
|
||||
return ERROR_SUCCESS;
|
||||
}
|
||||
|
||||
extern "C" UINT __stdcall DeinstallExecSequenceEntry(MSIHANDLE handle)
|
||||
{
|
||||
//MessageBox(NULL, TEXT("DeinstallExecSequenceEntry"), TEXT("Information"), MB_OK | MB_ICONINFORMATION);
|
||||
|
||||
if (IsCompleteDeinstallation(handle))
|
||||
{
|
||||
Unregister4MsDocAll(handle);
|
||||
return ERROR_SUCCESS;
|
||||
}
|
||||
|
||||
if (IsModuleSelectedForDeinstallation(handle, TEXT("gm_p_Wrt_Bin")))
|
||||
{
|
||||
Unregister4MsDoc(handle, MSWORD | HTML_EDITOR);
|
||||
}
|
||||
|
||||
if (IsModuleSelectedForDeinstallation(handle, TEXT("gm_p_Calc_Bin")))
|
||||
{
|
||||
Unregister4MsDoc(handle, MSEXCEL);
|
||||
}
|
||||
|
||||
if (IsModuleSelectedForDeinstallation(handle, TEXT("gm_p_Impress_Bin")))
|
||||
{
|
||||
Unregister4MsDoc(handle, MSPOWERPOINT);
|
||||
}
|
||||
|
||||
return ERROR_SUCCESS;
|
||||
}
|
||||
|
||||
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|
@@ -1,342 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
/*************************************************************************
|
||||
*
|
||||
* 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 "register.hxx"
|
||||
#include "registryexception.hxx"
|
||||
#include "registrationcontextinformation.hxx"
|
||||
#include "userregistrar.hxx"
|
||||
#include "windowsregistry.hxx"
|
||||
#include "stringconverter.hxx"
|
||||
#include "msihelper.hxx"
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(push, 1) /* disable warnings within system headers */
|
||||
#pragma warning(disable: 4917)
|
||||
#endif
|
||||
#include <shlobj.h>
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(pop)
|
||||
#endif
|
||||
|
||||
|
||||
#include <assert.h>
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(disable: 4350)
|
||||
#endif
|
||||
|
||||
typedef std::auto_ptr<Registrar> RegistrarPtr;
|
||||
|
||||
namespace /* private */
|
||||
{
|
||||
RegistrarPtr CreateRegistrar(bool InstallForAllUser, const RegistrationContextInformation& RegCtx)
|
||||
{
|
||||
RegistrarPtr RegPtr;
|
||||
|
||||
if (InstallForAllUser)
|
||||
RegPtr = RegistrarPtr(new Registrar(RegCtx));
|
||||
else
|
||||
RegPtr = RegistrarPtr(new UserRegistrar(RegCtx));
|
||||
|
||||
return RegPtr;
|
||||
}
|
||||
} // namespace private
|
||||
|
||||
bool query_preselect_registration_for_ms_application(MSIHANDLE handle, int Register)
|
||||
{
|
||||
bool preselect = false;
|
||||
|
||||
try
|
||||
{
|
||||
RegistrationContextInformation RegContext(handle, GetOfficeExecutablePath(handle));
|
||||
RegistrarPtr CurrentRegistrar = CreateRegistrar(IsAllUserInstallation(handle), RegContext);
|
||||
|
||||
if (Register & MSWORD)
|
||||
preselect = CurrentRegistrar->QueryPreselectMsWordRegistration();
|
||||
else if (Register & MSEXCEL)
|
||||
preselect = CurrentRegistrar->QueryPreselectMsExcelRegistration();
|
||||
else if (Register & MSPOWERPOINT)
|
||||
preselect = CurrentRegistrar->QueryPreselectMsPowerPointRegistration();
|
||||
}
|
||||
catch(RegistryException&)
|
||||
{
|
||||
assert(false);
|
||||
}
|
||||
return preselect;
|
||||
}
|
||||
|
||||
//-----------------------------------------
|
||||
// registers StarOffice for MS document
|
||||
// types and as default HTML editor if
|
||||
// specified
|
||||
//-----------------------------------------
|
||||
|
||||
void Register4MsDoc(MSIHANDLE handle, int Register)
|
||||
{
|
||||
try
|
||||
{
|
||||
RegistrationContextInformation RegContext(handle, GetOfficeExecutablePath(handle));
|
||||
RegistrarPtr CurrentRegistrar = CreateRegistrar(IsAllUserInstallation(handle), RegContext);
|
||||
|
||||
if ((Register & MSWORD))
|
||||
CurrentRegistrar->RegisterForMsWord();
|
||||
|
||||
if ((Register & MSEXCEL))
|
||||
CurrentRegistrar->RegisterForMsExcel();
|
||||
|
||||
if ((Register & MSPOWERPOINT))
|
||||
CurrentRegistrar->RegisterForMsPowerPoint();
|
||||
|
||||
if ((Register & HTML_EDITOR))
|
||||
CurrentRegistrar->RegisterAsHtmlEditorForInternetExplorer();
|
||||
|
||||
if ((Register & DEFAULT_SHELL_HTML_EDITOR))
|
||||
{
|
||||
CurrentRegistrar->RegisterAsDefaultHtmlEditorForInternetExplorer();
|
||||
CurrentRegistrar->RegisterAsDefaultShellHtmlEditor();
|
||||
}
|
||||
}
|
||||
catch(RegistryException&)
|
||||
{
|
||||
assert(false);
|
||||
}
|
||||
|
||||
if (Register)
|
||||
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, 0, 0);
|
||||
}
|
||||
|
||||
void Unregister4MsDoc(MSIHANDLE handle, int Unregister)
|
||||
{
|
||||
try
|
||||
{
|
||||
RegistrationContextInformation RegContext(handle, GetOfficeExecutablePath(handle));
|
||||
RegistrarPtr CurrentRegistrar = CreateRegistrar(IsAllUserInstallation(handle), RegContext);
|
||||
|
||||
if ((Unregister & MSWORD) && CurrentRegistrar->IsRegisteredFor(MSWORD))
|
||||
CurrentRegistrar->UnregisterForMsWord();
|
||||
|
||||
if ((Unregister & HTML_EDITOR) && CurrentRegistrar->IsRegisteredFor(HTML_EDITOR))
|
||||
CurrentRegistrar->UnregisterAsHtmlEditorForInternetExplorer();
|
||||
|
||||
if ((Unregister & MSEXCEL) && CurrentRegistrar->IsRegisteredFor(MSEXCEL))
|
||||
CurrentRegistrar->UnregisterForMsExcel();
|
||||
|
||||
if ((Unregister & MSPOWERPOINT) && CurrentRegistrar->IsRegisteredFor(MSPOWERPOINT))
|
||||
CurrentRegistrar->UnregisterForMsPowerPoint();
|
||||
|
||||
if ((Unregister & DEFAULT_HTML_EDITOR_FOR_IE) && CurrentRegistrar->IsRegisteredFor(DEFAULT_HTML_EDITOR_FOR_IE))
|
||||
CurrentRegistrar->UnregisterAsDefaultHtmlEditorForInternetExplorer();
|
||||
|
||||
if ((Unregister & DEFAULT_SHELL_HTML_EDITOR) && CurrentRegistrar->IsRegisteredFor(DEFAULT_SHELL_HTML_EDITOR))
|
||||
CurrentRegistrar->UnregisterAsDefaultShellHtmlEditor();
|
||||
}
|
||||
catch(RegistryException&)
|
||||
{
|
||||
assert(false);
|
||||
}
|
||||
|
||||
if (Unregister)
|
||||
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, 0, 0);
|
||||
}
|
||||
|
||||
//-----------------------------------------
|
||||
// restores the entries for the selected
|
||||
// registry entries
|
||||
// Algorithm:
|
||||
//
|
||||
// 1.
|
||||
// Target key exist (e.g. '.doc')
|
||||
// Default value == soffice.?
|
||||
// Backup key != empty
|
||||
// Action: Replace Default value with backup
|
||||
// key
|
||||
//
|
||||
// 2.
|
||||
// Target key exist
|
||||
// Default value == soffice.?
|
||||
// Backup key == empty
|
||||
// Action: delete default value
|
||||
//
|
||||
// 3.
|
||||
// Target key exist
|
||||
// Default value != soffice.?
|
||||
// Action: nop
|
||||
//
|
||||
// 4.
|
||||
// Target key does not exist
|
||||
// Action: nop
|
||||
//-----------------------------------------
|
||||
|
||||
void Unregister4MsDocAll(MSIHANDLE handle)
|
||||
{
|
||||
try
|
||||
{
|
||||
RegistrationContextInformation RegContext(handle, GetOfficeExecutablePath(handle));
|
||||
RegistrarPtr CurrentRegistrar = CreateRegistrar(IsAllUserInstallation(handle), RegContext);
|
||||
|
||||
CurrentRegistrar->UnregisterAllAndCleanUpRegistry();
|
||||
}
|
||||
catch(RegistryException&)
|
||||
{
|
||||
assert(false);
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------
|
||||
// restores lost settings formerly made
|
||||
// with Register4MsDoc
|
||||
//-----------------------------------------
|
||||
|
||||
void RepairRegister4MsDocSettings(MSIHANDLE handle)
|
||||
{
|
||||
try
|
||||
{
|
||||
RegistrationContextInformation RegContext(handle, GetOfficeExecutablePath(handle));
|
||||
RegistrarPtr CurrentRegistrar = CreateRegistrar(IsAllUserInstallation(handle), RegContext);
|
||||
|
||||
CurrentRegistrar->RepairRegistrationState();
|
||||
}
|
||||
catch(RegistryException&)
|
||||
{
|
||||
assert(false);
|
||||
}
|
||||
}
|
||||
|
||||
bool IsRegisteredFor(MSIHANDLE handle, int State)
|
||||
{
|
||||
bool Registered = false;
|
||||
|
||||
try
|
||||
{
|
||||
RegistrationContextInformation RegContext(handle, GetOfficeExecutablePath(handle));
|
||||
RegistrarPtr CurrentRegistrar = CreateRegistrar(IsAllUserInstallation(handle), RegContext);
|
||||
|
||||
Registered = CurrentRegistrar->IsRegisteredFor(State);
|
||||
}
|
||||
catch(RegistryException&)
|
||||
{
|
||||
assert(false);
|
||||
}
|
||||
return Registered;
|
||||
}
|
||||
|
||||
#define SO60_UNINSTALL_KEY L"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\StarOffice 6.0"
|
||||
#define SO_BACKUP_KEY L"soffice6.bak"
|
||||
#define REGMSDOCSTATE L"Reg4MsDocState"
|
||||
#define SOFTWARE_CLASSES L"Software\\Classes"
|
||||
|
||||
int FixReturnRegistrationState(MSIHANDLE handle)
|
||||
{
|
||||
int registration_state = 0;
|
||||
|
||||
try
|
||||
{
|
||||
WindowsRegistry registry;
|
||||
|
||||
RegistryValue rv_regmsdocstate = RegistryValue(
|
||||
new RegistryValueImpl(REGMSDOCSTATE, 0));
|
||||
|
||||
RegistryKey so_bak_key;
|
||||
|
||||
if (IsAllUserInstallation(handle))
|
||||
{
|
||||
RegistryKey hkcr_key = registry.GetClassesRootKey();
|
||||
|
||||
if (hkcr_key->HasSubKey(SO_BACKUP_KEY))
|
||||
so_bak_key = hkcr_key->OpenSubKey(SO_BACKUP_KEY);
|
||||
else
|
||||
so_bak_key = hkcr_key->CreateSubKey(SO_BACKUP_KEY);
|
||||
|
||||
if (!so_bak_key->HasValue(REGMSDOCSTATE))
|
||||
{
|
||||
// set a defined value
|
||||
so_bak_key->SetValue(rv_regmsdocstate);
|
||||
|
||||
RegistryKey hklm_key = registry.GetLocalMachineKey();
|
||||
|
||||
if (hklm_key->HasSubKey(SO60_UNINSTALL_KEY))
|
||||
{
|
||||
RegistryKey so_uninst_key =
|
||||
hklm_key->OpenSubKey(SO60_UNINSTALL_KEY);
|
||||
|
||||
if (so_uninst_key->HasValue(REGMSDOCSTATE))
|
||||
so_bak_key->CopyValue(so_uninst_key, REGMSDOCSTATE);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
RegistryKey hkcu_classes_key =
|
||||
registry.GetCurrentUserKey()->OpenSubKey(SOFTWARE_CLASSES);
|
||||
|
||||
so_bak_key = hkcu_classes_key->CreateSubKey(SO_BACKUP_KEY);
|
||||
|
||||
if (!so_bak_key->HasValue(REGMSDOCSTATE))
|
||||
{
|
||||
// set a defined value
|
||||
so_bak_key->SetValue(rv_regmsdocstate);
|
||||
|
||||
RegistryKey hklm_sftw_classes =
|
||||
registry.GetLocalMachineKey()->OpenSubKey(SOFTWARE_CLASSES, false);
|
||||
|
||||
RegistryKey so_bak_key_old;
|
||||
|
||||
if (hklm_sftw_classes->HasSubKey(SO_BACKUP_KEY))
|
||||
{
|
||||
so_bak_key_old = hklm_sftw_classes->OpenSubKey(SO_BACKUP_KEY, false);
|
||||
|
||||
if (so_bak_key_old->HasValue(REGMSDOCSTATE))
|
||||
so_bak_key->CopyValue(so_bak_key_old, REGMSDOCSTATE);
|
||||
}
|
||||
else // try the uninstall key
|
||||
{
|
||||
RegistryKey hklm_key = registry.GetLocalMachineKey();
|
||||
|
||||
if (hklm_key->HasSubKey(SO60_UNINSTALL_KEY))
|
||||
{
|
||||
RegistryKey so_uninst_key =
|
||||
hklm_key->OpenSubKey(SO60_UNINSTALL_KEY);
|
||||
|
||||
if (so_uninst_key->HasValue(REGMSDOCSTATE))
|
||||
so_bak_key->CopyValue(so_uninst_key, REGMSDOCSTATE);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
rv_regmsdocstate = so_bak_key->GetValue(REGMSDOCSTATE);
|
||||
registration_state = rv_regmsdocstate->GetDataAsInt();
|
||||
}
|
||||
catch(RegistryException&)
|
||||
{
|
||||
registration_state = 0;
|
||||
}
|
||||
|
||||
return registration_state;
|
||||
}
|
||||
|
||||
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|
@@ -1,85 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
/*************************************************************************
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
************************************************************************/
|
||||
|
||||
#ifndef _REGISTER_HXX_
|
||||
#define _REGISTER_HXX_
|
||||
|
||||
#include "constants.hxx"
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(push, 1) /* disable warnings within system headers */
|
||||
#endif
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <windows.h>
|
||||
#include <msi.h>
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(pop)
|
||||
#endif
|
||||
|
||||
#include <string>
|
||||
|
||||
const int MOD_WRITER = 0x1;
|
||||
const int MOD_CALC = 0x2;
|
||||
const int MOD_IMPRESS = 0x4;
|
||||
const int MOD_ACTIVEX = 0x40;
|
||||
|
||||
/* registers StarOffice for MS document
|
||||
types and as default HTML editor if
|
||||
specified */
|
||||
void Register4MsDoc(MSIHANDLE handle, int Register);
|
||||
|
||||
void Unregister4MsDoc(MSIHANDLE handle, int Unregister);
|
||||
|
||||
/* restores the entries for the selected
|
||||
registry entries */
|
||||
void Unregister4MsDocAll(MSIHANDLE handle);
|
||||
|
||||
/* restores lost settings formerly made
|
||||
with Register4MsDoc */
|
||||
void RepairRegister4MsDocSettings(MSIHANDLE handle);
|
||||
|
||||
/** Returns whether we are registered for */
|
||||
bool IsRegisteredFor(MSIHANDLE handle, int State);
|
||||
|
||||
/** Returns whether we should preselect the
|
||||
registration checkbox for a certain
|
||||
application type or not */
|
||||
bool query_preselect_registration_for_ms_application(
|
||||
MSIHANDLE handle, int Register);
|
||||
|
||||
// StarOffice 6.0 saved the registration
|
||||
// state in HKEY_LOCAL_MACHINE\Software\
|
||||
// Microsoft\Windows\CurrentVersion\Uninstall\
|
||||
// StarOffice 6.0\Reg4MsdocState we move this
|
||||
// value if available to the new registry
|
||||
// location
|
||||
int FixReturnRegistrationState(MSIHANDLE handle);
|
||||
|
||||
#endif
|
||||
|
||||
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|
@@ -1,808 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
// Registrar.cpp: Implementierung der Klasse Registrar.
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "registrar.hxx"
|
||||
|
||||
#include "RegistryValueImpl.hxx"
|
||||
#include "windowsregistry.hxx"
|
||||
#include "registryexception.hxx"
|
||||
|
||||
#include <assert.h>
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(disable: 4350 4482)
|
||||
#include "strsafe.h"
|
||||
#endif
|
||||
|
||||
//----------------------------------------------------------
|
||||
#ifdef DEBUG
|
||||
inline void OutputDebugStringFormat( LPCTSTR pFormat, ... )
|
||||
{
|
||||
TCHAR buffer[1024];
|
||||
va_list args;
|
||||
|
||||
va_start( args, pFormat );
|
||||
StringCchVPrintf( buffer, sizeof(buffer), pFormat, args );
|
||||
OutputDebugString( buffer );
|
||||
}
|
||||
#else
|
||||
static inline void OutputDebugStringFormat( LPCTSTR, ... )
|
||||
{
|
||||
}
|
||||
#endif
|
||||
//----------------------------------------------------------
|
||||
|
||||
const int MSWORD = 0x1;
|
||||
const int MSEXCEL = 0x2;
|
||||
const int MSPOWERPOINT = 0x4;
|
||||
const int DEFAULT_HTML_EDITOR_FOR_IE = 0x8;
|
||||
const int HTML_EDITOR = 0x10;
|
||||
const int DEFAULT_SHELL_HTML_EDITOR = 0x20;
|
||||
|
||||
namespace /* private */
|
||||
{
|
||||
const std::wstring HTM_OPENWITHLIST = L".htm\\OpenWithList";
|
||||
const std::wstring APPLICATIONS = L"Applications";
|
||||
const std::wstring SHELL_EDIT_COMMAND = L"shell\\edit\\command";
|
||||
const std::wstring HTML_EDIT = L"HTML Edit";
|
||||
const std::wstring HTML_EDIT_DISPLAY_NAME = L"Edit Display Name";
|
||||
const std::wstring SHELL_EDIT_COMMAND_BACKUP = L"Shell Edit Cmd";
|
||||
const std::wstring DEFAULT_HTML_EDITOR = L"Default HTML Editor";
|
||||
const std::wstring MS_IE_DEF_HTML_EDITOR = L"Software\\Microsoft\\Internet Explorer\\Default HTML Editor";
|
||||
const std::wstring MS_IE_DEF_HTML_EDITOR_SHL_EDIT_CMD = L"Software\\Microsoft\\Internet Explorer\\Default HTML Editor\\shell\\edit\\command";
|
||||
}
|
||||
|
||||
Registrar::Registrar(const RegistrationContextInformation& RegContext) :
|
||||
m_ContextInformation(RegContext),
|
||||
FORWARD_KEY_PREFIX(L"LibreOffice"),
|
||||
DEFAULT_VALUE_NAME(L""),
|
||||
BACKUP_VALUE_NAME(L"Backup"),
|
||||
PRIVATE_BACKUP_KEY_NAME(L"LibreOffice.reg4msdocmsi"),
|
||||
REGISTRATION_STATE(L"Reg4MsDocState")
|
||||
{
|
||||
m_RootKey = WindowsRegistry().GetClassesRootKey();
|
||||
}
|
||||
|
||||
Registrar::~Registrar()
|
||||
{
|
||||
}
|
||||
|
||||
void Registrar::RegisterForMsWord() const
|
||||
{
|
||||
assert(m_RootKey.get());
|
||||
|
||||
RegisterForMsOfficeApplication(
|
||||
m_ContextInformation.GetWordDocumentFileExtension(),
|
||||
m_ContextInformation.GetWordDocumentDisplayName(),
|
||||
m_ContextInformation.GetWordDocumentDefaultIconEntry(),
|
||||
m_ContextInformation.GetWordDocumentDefaultShellCommand(),
|
||||
m_ContextInformation.ShellNewCommandDisplayName(),
|
||||
RegistrationContextInformation::Writer);
|
||||
|
||||
RegisterForMsOfficeApplication(
|
||||
m_ContextInformation.GetMOOXWordDocumentFileExtension(),
|
||||
m_ContextInformation.GetMOOXWordDocumentDisplayName(),
|
||||
m_ContextInformation.GetWordDocumentDefaultIconEntry(),
|
||||
m_ContextInformation.GetWordDocumentDefaultShellCommand(),
|
||||
m_ContextInformation.ShellNewCommandDisplayName(),
|
||||
RegistrationContextInformation::Writer);
|
||||
|
||||
RegisterForMsOfficeApplication(
|
||||
m_ContextInformation.GetWordTemplateFileExtension(),
|
||||
m_ContextInformation.GetWordTemplateDisplayName(),
|
||||
m_ContextInformation.GetWordTemplateDefaultIconEntry(),
|
||||
m_ContextInformation.GetWordTemplateDefaultShellCommand(),
|
||||
m_ContextInformation.ShellNewCommandDisplayName(),
|
||||
RegistrationContextInformation::Writer);
|
||||
|
||||
RegisterForMsOfficeApplication(
|
||||
m_ContextInformation.GetRtfDocumentFileExtension(),
|
||||
m_ContextInformation.GetRtfDocumentDisplayName(),
|
||||
m_ContextInformation.GetRtfDocumentDefaultIconEntry(),
|
||||
m_ContextInformation.GetRtfDocumentDefaultShellCommand(),
|
||||
m_ContextInformation.ShellNewCommandDisplayName(),
|
||||
RegistrationContextInformation::Writer);
|
||||
|
||||
SaveRegisteredFor(MSWORD);
|
||||
}
|
||||
|
||||
void Registrar::UnregisterForMsWord() const
|
||||
{
|
||||
assert(m_RootKey.get());
|
||||
|
||||
try
|
||||
{
|
||||
UnregisterForMsOfficeApplication(
|
||||
m_ContextInformation.GetWordDocumentFileExtension());
|
||||
}
|
||||
catch(RegistryKeyNotFoundException&)
|
||||
{}
|
||||
|
||||
try
|
||||
{
|
||||
UnregisterForMsOfficeApplication(
|
||||
m_ContextInformation.GetMOOXWordDocumentFileExtension());
|
||||
}
|
||||
catch(RegistryKeyNotFoundException&)
|
||||
{}
|
||||
|
||||
try
|
||||
{
|
||||
UnregisterForMsOfficeApplication(
|
||||
m_ContextInformation.GetWordTemplateFileExtension());
|
||||
}
|
||||
catch(RegistryKeyNotFoundException&)
|
||||
{}
|
||||
|
||||
try
|
||||
{
|
||||
UnregisterForMsOfficeApplication(
|
||||
m_ContextInformation.GetRtfDocumentFileExtension());
|
||||
}
|
||||
catch(RegistryKeyNotFoundException&)
|
||||
{}
|
||||
|
||||
SaveNotRegisteredFor(MSWORD);
|
||||
}
|
||||
|
||||
bool Registrar::QueryPreselectForMsApplication(const std::wstring& file_extension) const
|
||||
{
|
||||
bool preselect = false;
|
||||
|
||||
// We use HKCR else we would not see that a registration for
|
||||
// MS Office applications already exist if we are about to
|
||||
// register in HKCU\Software\Classes
|
||||
RegistryKey root_key = WindowsRegistry().GetClassesRootKey();
|
||||
|
||||
if (!root_key->HasSubKey(file_extension))
|
||||
{
|
||||
preselect = true;
|
||||
OutputDebugStringFormat( TEXT("QueryPreselect: No SubKey found for (%s), preselected!\n"), file_extension.c_str() );
|
||||
}
|
||||
else
|
||||
{
|
||||
RegistryKey RegKey = root_key->OpenSubKey(file_extension, false);
|
||||
|
||||
if (RegKey->HasValue(DEFAULT_VALUE_NAME))
|
||||
{
|
||||
RegistryValue RegVal = RegKey->GetValue(DEFAULT_VALUE_NAME);
|
||||
|
||||
if (REG_SZ == RegVal->GetType() &&
|
||||
IsOpenOfficeRegisteredForMsApplication(RegVal->GetDataAsUniString()))
|
||||
{
|
||||
preselect = true;
|
||||
OutputDebugStringFormat( TEXT("QueryPreselect: (%s) registered to Office, preselected!\n"), file_extension.c_str() );
|
||||
}
|
||||
else if ( (REG_SZ == RegVal->GetType()) && ! root_key->HasSubKey( RegVal->GetDataAsUniString() ) )
|
||||
{
|
||||
preselect = true;
|
||||
OutputDebugStringFormat( TEXT("QueryPreselect: (%s) registered but destination is empty, preselected!\n"), file_extension.c_str() );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
preselect = true;
|
||||
OutputDebugStringFormat( TEXT("QueryPreselect: No default found for SubKey (%s), preselected!\n"), file_extension.c_str() );
|
||||
}
|
||||
}
|
||||
return preselect;
|
||||
}
|
||||
|
||||
bool Registrar::QueryPreselectMsWordRegistration() const
|
||||
{
|
||||
return QueryPreselectForMsApplication(
|
||||
m_ContextInformation.GetWordDocumentFileExtension());
|
||||
}
|
||||
|
||||
void Registrar::RegisterForMsExcel() const
|
||||
{
|
||||
assert(m_RootKey.get());
|
||||
|
||||
RegisterForMsOfficeApplication(
|
||||
m_ContextInformation.GetExcelSheetFileExtension(),
|
||||
m_ContextInformation.GetExcelSheetDisplayName(),
|
||||
m_ContextInformation.GetExcelSheetDefaultIconEntry(),
|
||||
m_ContextInformation.GetExcelSheetDefaultShellCommand(),
|
||||
m_ContextInformation.ShellNewCommandDisplayName(),
|
||||
RegistrationContextInformation::Calc);
|
||||
|
||||
RegisterForMsOfficeApplication(
|
||||
m_ContextInformation.GetMOOXExcelSheetFileExtension(),
|
||||
m_ContextInformation.GetMOOXExcelSheetDisplayName(),
|
||||
m_ContextInformation.GetExcelSheetDefaultIconEntry(),
|
||||
m_ContextInformation.GetExcelSheetDefaultShellCommand(),
|
||||
m_ContextInformation.ShellNewCommandDisplayName(),
|
||||
RegistrationContextInformation::Calc);
|
||||
|
||||
RegisterForMsOfficeApplication(
|
||||
m_ContextInformation.GetExcelTemplateFileExtension(),
|
||||
m_ContextInformation.GetExcelTemplateDisplayName(),
|
||||
m_ContextInformation.GetExcelTemplateDefaultIconEntry(),
|
||||
m_ContextInformation.GetExcelTemplateDefaultShellCommand(),
|
||||
m_ContextInformation.ShellNewCommandDisplayName(),
|
||||
RegistrationContextInformation::Calc);
|
||||
|
||||
SaveRegisteredFor(MSEXCEL);
|
||||
}
|
||||
|
||||
void Registrar::UnregisterForMsExcel() const
|
||||
{
|
||||
assert(m_RootKey.get());
|
||||
|
||||
try
|
||||
{
|
||||
UnregisterForMsOfficeApplication(
|
||||
m_ContextInformation.GetExcelSheetFileExtension());
|
||||
}
|
||||
catch(RegistryKeyNotFoundException&)
|
||||
{}
|
||||
|
||||
try
|
||||
{
|
||||
UnregisterForMsOfficeApplication(
|
||||
m_ContextInformation.GetMOOXExcelSheetFileExtension());
|
||||
}
|
||||
catch(RegistryKeyNotFoundException&)
|
||||
{}
|
||||
|
||||
try
|
||||
{
|
||||
UnregisterForMsOfficeApplication(
|
||||
m_ContextInformation.GetMOOXPowerPointDocumentFileExtension());
|
||||
}
|
||||
catch(RegistryKeyNotFoundException&)
|
||||
{}
|
||||
|
||||
try
|
||||
{
|
||||
UnregisterForMsOfficeApplication(
|
||||
m_ContextInformation.GetExcelTemplateFileExtension());
|
||||
}
|
||||
catch(RegistryKeyNotFoundException&)
|
||||
{}
|
||||
|
||||
SaveNotRegisteredFor(MSEXCEL);
|
||||
}
|
||||
|
||||
bool Registrar::QueryPreselectMsExcelRegistration() const
|
||||
{
|
||||
return QueryPreselectForMsApplication(
|
||||
m_ContextInformation.GetExcelSheetFileExtension());
|
||||
}
|
||||
|
||||
void Registrar::RegisterForMsPowerPoint() const
|
||||
{
|
||||
assert(m_RootKey.get());
|
||||
|
||||
RegisterForMsOfficeApplication(
|
||||
m_ContextInformation.GetPowerPointDocumentFileExtension(),
|
||||
m_ContextInformation.GetPowerPointDocumentDisplayName(),
|
||||
m_ContextInformation.GetPowerPointDocumentDefaultIconEntry(),
|
||||
m_ContextInformation.GetPowerPointDocumentDefaultShellCommand(),
|
||||
m_ContextInformation.ShellNewCommandDisplayName(),
|
||||
RegistrationContextInformation::Impress);
|
||||
|
||||
RegisterForMsOfficeApplication(
|
||||
m_ContextInformation.GetMOOXPowerPointDocumentFileExtension(),
|
||||
m_ContextInformation.GetMOOXPowerPointDocumentDisplayName(),
|
||||
m_ContextInformation.GetPowerPointDocumentDefaultIconEntry(),
|
||||
m_ContextInformation.GetPowerPointDocumentDefaultShellCommand(),
|
||||
m_ContextInformation.ShellNewCommandDisplayName(),
|
||||
RegistrationContextInformation::Impress);
|
||||
|
||||
RegisterForMsOfficeApplication(
|
||||
m_ContextInformation.GetPowerPointShowFileExtension(),
|
||||
m_ContextInformation.GetPowerPointShowDisplayName(),
|
||||
m_ContextInformation.GetPowerPointShowDefaultIconEntry(),
|
||||
m_ContextInformation.GetPowerPointShowDefaultShellCommand(),
|
||||
m_ContextInformation.ShellNewCommandDisplayName(),
|
||||
RegistrationContextInformation::Impress);
|
||||
|
||||
RegisterForMsOfficeApplication(
|
||||
m_ContextInformation.GetPowerPointTemplateFileExtension(),
|
||||
m_ContextInformation.GetPowerPointTemplateDisplayName(),
|
||||
m_ContextInformation.GetPowerPointTemplateDefaultIconEntry(),
|
||||
m_ContextInformation.GetPowerPointTemplateDefaultShellCommand(),
|
||||
m_ContextInformation.ShellNewCommandDisplayName(),
|
||||
RegistrationContextInformation::Impress);
|
||||
|
||||
SaveRegisteredFor(MSPOWERPOINT);
|
||||
}
|
||||
|
||||
void Registrar::UnregisterForMsPowerPoint() const
|
||||
{
|
||||
assert(m_RootKey.get());
|
||||
|
||||
try
|
||||
{
|
||||
UnregisterForMsOfficeApplication(
|
||||
m_ContextInformation.GetPowerPointDocumentFileExtension());
|
||||
}
|
||||
catch(RegistryKeyNotFoundException&)
|
||||
{}
|
||||
|
||||
try
|
||||
{
|
||||
UnregisterForMsOfficeApplication(
|
||||
m_ContextInformation.GetPowerPointShowFileExtension());
|
||||
}
|
||||
catch(RegistryKeyNotFoundException&)
|
||||
{}
|
||||
|
||||
try
|
||||
{
|
||||
UnregisterForMsOfficeApplication(
|
||||
m_ContextInformation.GetPowerPointTemplateFileExtension());
|
||||
}
|
||||
catch(RegistryKeyNotFoundException&)
|
||||
{}
|
||||
|
||||
SaveNotRegisteredFor(MSPOWERPOINT);
|
||||
}
|
||||
|
||||
//-----------------------------------------
|
||||
/*
|
||||
*/
|
||||
bool Registrar::QueryPreselectMsPowerPointRegistration() const
|
||||
{
|
||||
return QueryPreselectForMsApplication( m_ContextInformation.GetPowerPointDocumentFileExtension()) &&
|
||||
QueryPreselectForMsApplication( m_ContextInformation.GetPowerPointShowFileExtension());
|
||||
}
|
||||
|
||||
//-----------------------------------------
|
||||
/** The documentation says we have to
|
||||
make the following entries to register
|
||||
a html editor for the Internet Explorer
|
||||
HKCR\.htm\OpenWithList\App Friendly Name\shell\edit\command
|
||||
But the reality shows that this works only
|
||||
with Internet Explorer 5.x
|
||||
Internet Explorer 6.0 wants the follwoing
|
||||
entries:
|
||||
HKCR\.htm\OpenWithList\App.exe
|
||||
HKCR\Applications\App.ex\shell\edit\command
|
||||
*/
|
||||
void Registrar::RegisterAsHtmlEditorForInternetExplorer() const
|
||||
{
|
||||
assert(m_RootKey.get());
|
||||
|
||||
std::wstring OOFriendlyAppName = m_ContextInformation.GetOpenOfficeFriendlyAppName();
|
||||
|
||||
std::wstring RegKeyName = HTM_OPENWITHLIST + std::wstring(L"\\") + OOFriendlyAppName;
|
||||
RegistryKey RegKey = m_RootKey->CreateSubKey(RegKeyName);
|
||||
|
||||
RegKey = RegKey->CreateSubKey(SHELL_EDIT_COMMAND);
|
||||
|
||||
RegistryValue RegVal(
|
||||
new RegistryValueImpl(
|
||||
DEFAULT_VALUE_NAME,
|
||||
m_ContextInformation.GetOpenOfficeCommandline(RegistrationContextInformation::Open,
|
||||
RegistrationContextInformation::Writer)));
|
||||
|
||||
RegKey->SetValue(RegVal);
|
||||
|
||||
RegKeyName = APPLICATIONS + std::wstring(L"\\") + OOFriendlyAppName;
|
||||
RegKey = m_RootKey->CreateSubKey(RegKeyName);
|
||||
|
||||
RegVal->SetName(L"FriendlyAppName");
|
||||
RegVal->SetValue(OOFriendlyAppName);
|
||||
RegKey->SetValue(RegVal);
|
||||
|
||||
RegKey = RegKey->CreateSubKey(SHELL_EDIT_COMMAND);
|
||||
RegVal->SetName(DEFAULT_VALUE_NAME);
|
||||
RegVal->SetValue(
|
||||
m_ContextInformation.GetOpenOfficeCommandline(RegistrationContextInformation::Open,
|
||||
RegistrationContextInformation::Writer));
|
||||
RegKey->SetValue(RegVal);
|
||||
|
||||
SaveRegisteredFor(HTML_EDITOR);
|
||||
}
|
||||
|
||||
void Registrar::UnregisterAsHtmlEditorForInternetExplorer() const
|
||||
{
|
||||
assert(m_RootKey.get());
|
||||
|
||||
try
|
||||
{
|
||||
std::wstring OOFriendlyAppName = m_ContextInformation.GetOpenOfficeFriendlyAppName();
|
||||
|
||||
RegistryKey aRegKey = m_RootKey->OpenSubKey( APPLICATIONS );
|
||||
if ( aRegKey->HasSubKey( OOFriendlyAppName ) )
|
||||
aRegKey->DeleteSubKeyTree( OOFriendlyAppName );
|
||||
|
||||
aRegKey = m_RootKey->OpenSubKey( HTM_OPENWITHLIST );
|
||||
if ( aRegKey->HasSubKey( OOFriendlyAppName ) )
|
||||
aRegKey->DeleteSubKeyTree( OOFriendlyAppName );
|
||||
}
|
||||
catch(RegistryKeyNotFoundException&)
|
||||
{}
|
||||
|
||||
SaveNotRegisteredFor(HTML_EDITOR);
|
||||
}
|
||||
|
||||
void Registrar::RegisterAsDefaultHtmlEditorForInternetExplorer() const
|
||||
{
|
||||
assert(m_RootKey.get());
|
||||
|
||||
RegistryKey RegistrationRootKey = GetRootKeyForDefHtmlEditorForIERegistration();
|
||||
|
||||
RegistryKey RegKey = RegistrationRootKey->CreateSubKey(MS_IE_DEF_HTML_EDITOR_SHL_EDIT_CMD);
|
||||
|
||||
RegistryValue RegVal = RegistryValue(new RegistryValueImpl(DEFAULT_VALUE_NAME, L""));
|
||||
|
||||
if (RegKey->HasValue(DEFAULT_VALUE_NAME))
|
||||
{
|
||||
RegVal = RegKey->GetValue(DEFAULT_VALUE_NAME);
|
||||
|
||||
std::wstring CmdLine = RegVal->GetDataAsUniString();
|
||||
|
||||
if (std::wstring::npos == CmdLine.find(m_ContextInformation.GetOpenOfficeExecutableName()))
|
||||
{
|
||||
RegistryKey BackupRegKey = m_RootKey->CreateSubKey(PRIVATE_BACKUP_KEY_NAME + L"\\" + DEFAULT_HTML_EDITOR);
|
||||
|
||||
if (RegKey->HasValue(DEFAULT_VALUE_NAME))
|
||||
BackupRegKey->CopyValue(RegKey, DEFAULT_VALUE_NAME);
|
||||
|
||||
RegKey = RegistrationRootKey->OpenSubKey(MS_IE_DEF_HTML_EDITOR);
|
||||
if (RegKey->HasValue(L"Description"))
|
||||
BackupRegKey->CopyValue(RegKey, L"Description");
|
||||
}
|
||||
}
|
||||
|
||||
RegVal->SetValue(
|
||||
m_ContextInformation.GetOpenOfficeCommandline(RegistrationContextInformation::Open,
|
||||
RegistrationContextInformation::Writer));
|
||||
RegKey = RegistrationRootKey->OpenSubKey(MS_IE_DEF_HTML_EDITOR_SHL_EDIT_CMD);
|
||||
RegKey->SetValue(RegVal);
|
||||
|
||||
RegVal->SetName(L"Description");
|
||||
RegVal->SetValue(m_ContextInformation.GetOpenOfficeFriendlyAppName());
|
||||
RegKey = RegistrationRootKey->OpenSubKey(MS_IE_DEF_HTML_EDITOR);
|
||||
RegKey->SetValue(RegVal);
|
||||
|
||||
SaveRegisteredFor(DEFAULT_HTML_EDITOR_FOR_IE);
|
||||
}
|
||||
|
||||
void Registrar::UnregisterAsDefaultHtmlEditorForInternetExplorer() const
|
||||
{
|
||||
assert(m_RootKey.get());
|
||||
|
||||
RegistryKey RegistrationRootKey = GetRootKeyForDefHtmlEditorForIERegistration();
|
||||
|
||||
RegistryKey RegKey = RegistrationRootKey->OpenSubKey(MS_IE_DEF_HTML_EDITOR_SHL_EDIT_CMD);
|
||||
|
||||
if (RegKey->HasValue(DEFAULT_VALUE_NAME))
|
||||
{
|
||||
RegistryValue RegVal = RegKey->GetValue(DEFAULT_VALUE_NAME);
|
||||
|
||||
std::wstring CmdLine = RegVal->GetDataAsUniString();
|
||||
|
||||
if (std::wstring::npos != CmdLine.find(m_ContextInformation.GetOpenOfficeExecutableName()))
|
||||
{
|
||||
RegistryKey BackupRegKey = m_RootKey->OpenSubKey(PRIVATE_BACKUP_KEY_NAME);
|
||||
|
||||
if (BackupRegKey->HasSubKey(DEFAULT_HTML_EDITOR))
|
||||
{
|
||||
BackupRegKey = BackupRegKey->OpenSubKey(DEFAULT_HTML_EDITOR);
|
||||
|
||||
if (BackupRegKey->HasValue(DEFAULT_VALUE_NAME))
|
||||
RegKey->CopyValue(BackupRegKey, DEFAULT_VALUE_NAME);
|
||||
else
|
||||
RegKey->DeleteValue(DEFAULT_VALUE_NAME);
|
||||
|
||||
RegKey = RegistrationRootKey->OpenSubKey(MS_IE_DEF_HTML_EDITOR);
|
||||
|
||||
if (BackupRegKey->HasValue(L"Description"))
|
||||
RegKey->CopyValue(BackupRegKey, L"Description");
|
||||
else
|
||||
RegKey->DeleteValue(L"Description");
|
||||
}
|
||||
else
|
||||
{
|
||||
RegKey->DeleteValue(DEFAULT_VALUE_NAME);
|
||||
RegKey = RegistrationRootKey->OpenSubKey(MS_IE_DEF_HTML_EDITOR);
|
||||
RegKey->DeleteValue(L"Description");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SaveNotRegisteredFor(DEFAULT_HTML_EDITOR_FOR_IE);
|
||||
}
|
||||
|
||||
void Registrar::RegisterAsDefaultShellHtmlEditor() const
|
||||
{
|
||||
assert(m_RootKey.get());
|
||||
|
||||
RegistryKey RegKey = m_RootKey->CreateSubKey(L".htm");
|
||||
|
||||
RegistryValue RegVal = RegistryValue(
|
||||
new RegistryValueImpl(DEFAULT_VALUE_NAME, L""));
|
||||
|
||||
if (RegKey->HasValue(DEFAULT_VALUE_NAME))
|
||||
RegVal = RegKey->GetValue(DEFAULT_VALUE_NAME);
|
||||
|
||||
std::wstring HtmFwdKey = RegVal->GetDataAsUniString();
|
||||
if (0 == HtmFwdKey.length() || !m_RootKey->HasSubKey(HtmFwdKey))
|
||||
HtmFwdKey = L".htm";
|
||||
|
||||
RegKey = m_RootKey->CreateSubKey(HtmFwdKey + L"\\" + SHELL_EDIT_COMMAND);
|
||||
|
||||
if (RegKey->HasValue(DEFAULT_VALUE_NAME))
|
||||
{
|
||||
RegVal = RegKey->GetValue(DEFAULT_VALUE_NAME);
|
||||
|
||||
std::wstring CmdLine = RegVal->GetDataAsUniString();
|
||||
|
||||
// backup old values if we are not in place
|
||||
if (std::wstring::npos == CmdLine.find(m_ContextInformation.GetOpenOfficeExecutableName()))
|
||||
{
|
||||
RegistryKey BackupRegKey = m_RootKey->CreateSubKey(PRIVATE_BACKUP_KEY_NAME + L"\\" + HTML_EDIT);
|
||||
BackupRegKey->CopyValue(RegKey, DEFAULT_VALUE_NAME, SHELL_EDIT_COMMAND_BACKUP);
|
||||
}
|
||||
}
|
||||
|
||||
RegVal->SetValue(
|
||||
m_ContextInformation.GetOpenOfficeCommandline(RegistrationContextInformation::Open,
|
||||
RegistrationContextInformation::Writer));
|
||||
|
||||
RegKey->SetValue(RegVal);
|
||||
|
||||
SaveRegisteredFor(DEFAULT_SHELL_HTML_EDITOR);
|
||||
}
|
||||
|
||||
void Registrar::UnregisterAsDefaultShellHtmlEditor() const
|
||||
{
|
||||
assert(m_RootKey.get());
|
||||
|
||||
try
|
||||
{
|
||||
RegistryKey RegKey = m_RootKey->OpenSubKey(L".htm");
|
||||
|
||||
RegistryValue RegVal = RegistryValue(
|
||||
new RegistryValueImpl(DEFAULT_VALUE_NAME, L""));
|
||||
|
||||
if (RegKey->HasValue(DEFAULT_VALUE_NAME))
|
||||
RegVal = RegKey->GetValue(DEFAULT_VALUE_NAME);
|
||||
|
||||
std::wstring HtmFwdKey = RegVal->GetDataAsUniString();
|
||||
|
||||
if (0 == HtmFwdKey.length() || !m_RootKey->HasSubKey(HtmFwdKey))
|
||||
HtmFwdKey = L".htm";
|
||||
|
||||
RegKey = m_RootKey->OpenSubKey(HtmFwdKey + L"\\" + SHELL_EDIT_COMMAND);
|
||||
|
||||
RegVal = RegKey->GetValue(DEFAULT_VALUE_NAME);
|
||||
|
||||
std::wstring CmdLine = RegVal->GetDataAsUniString();
|
||||
|
||||
if (std::wstring::npos != CmdLine.find(m_ContextInformation.GetOpenOfficeExecutableName()))
|
||||
{
|
||||
RegistryKey BackupRegKey = m_RootKey->CreateSubKey(PRIVATE_BACKUP_KEY_NAME + L"\\" + HTML_EDIT);
|
||||
|
||||
if (BackupRegKey->HasValue(SHELL_EDIT_COMMAND_BACKUP))
|
||||
RegKey->CopyValue(BackupRegKey, SHELL_EDIT_COMMAND_BACKUP, DEFAULT_VALUE_NAME);
|
||||
else
|
||||
RegKey->DeleteValue(DEFAULT_VALUE_NAME);
|
||||
}
|
||||
}
|
||||
catch(RegistryKeyNotFoundException&)
|
||||
{
|
||||
}
|
||||
|
||||
SaveNotRegisteredFor(DEFAULT_SHELL_HTML_EDITOR);
|
||||
}
|
||||
|
||||
void Registrar::SaveRegisteredFor(int State) const
|
||||
{
|
||||
assert(m_RootKey.get());
|
||||
|
||||
int NewState = GetRegisterState();
|
||||
NewState |= State;
|
||||
SetRegisterState(NewState);
|
||||
}
|
||||
|
||||
void Registrar::SaveNotRegisteredFor(int State) const
|
||||
{
|
||||
assert(m_RootKey.get());
|
||||
|
||||
int NewState = GetRegisterState();
|
||||
NewState &= ~State;
|
||||
SetRegisterState(NewState);
|
||||
}
|
||||
|
||||
int Registrar::GetRegisterState() const
|
||||
{
|
||||
int State = 0;
|
||||
|
||||
RegistryKey RegKey = m_RootKey->CreateSubKey(PRIVATE_BACKUP_KEY_NAME);
|
||||
|
||||
if (RegKey->HasValue(REGISTRATION_STATE))
|
||||
{
|
||||
RegistryValue RegVal = RegKey->GetValue(REGISTRATION_STATE);
|
||||
if (REG_DWORD == RegVal->GetType())
|
||||
State = RegVal->GetDataAsInt();
|
||||
}
|
||||
|
||||
return State;
|
||||
}
|
||||
|
||||
void Registrar::SetRegisterState(int NewState) const
|
||||
{
|
||||
RegistryKey RegKey = m_RootKey->CreateSubKey(PRIVATE_BACKUP_KEY_NAME);
|
||||
RegistryValue RegVal = RegistryValue(new RegistryValueImpl(REGISTRATION_STATE, NewState));
|
||||
RegKey->SetValue(RegVal);
|
||||
}
|
||||
|
||||
bool Registrar::IsRegisteredFor(int State) const
|
||||
{
|
||||
assert(m_RootKey.get());
|
||||
|
||||
RegistryKey RegKey = m_RootKey->CreateSubKey(PRIVATE_BACKUP_KEY_NAME);
|
||||
|
||||
int SavedState = 0;
|
||||
|
||||
if (RegKey->HasValue(REGISTRATION_STATE))
|
||||
{
|
||||
RegistryValue RegVal = RegKey->GetValue(REGISTRATION_STATE);
|
||||
if (REG_DWORD == RegVal->GetType())
|
||||
SavedState = RegVal->GetDataAsInt();
|
||||
}
|
||||
|
||||
return ((SavedState & State) == State);
|
||||
}
|
||||
|
||||
//--------------------------------------
|
||||
/** Restore the last registration state (necessary for
|
||||
Setup repair) */
|
||||
void Registrar::RepairRegistrationState() const
|
||||
{
|
||||
assert(m_RootKey.get());
|
||||
|
||||
if (IsRegisteredFor(MSWORD))
|
||||
RegisterForMsWord();
|
||||
|
||||
if (IsRegisteredFor(MSEXCEL))
|
||||
RegisterForMsExcel();
|
||||
|
||||
if (IsRegisteredFor(MSPOWERPOINT))
|
||||
RegisterForMsPowerPoint();
|
||||
|
||||
if (IsRegisteredFor(DEFAULT_HTML_EDITOR_FOR_IE))
|
||||
RegisterAsDefaultHtmlEditorForInternetExplorer();
|
||||
|
||||
if (IsRegisteredFor(HTML_EDITOR))
|
||||
RegisterAsHtmlEditorForInternetExplorer();
|
||||
|
||||
if (IsRegisteredFor(DEFAULT_SHELL_HTML_EDITOR))
|
||||
RegisterAsDefaultShellHtmlEditor();
|
||||
}
|
||||
|
||||
/** Unregisters all and delete all Registry keys we have written */
|
||||
void Registrar::UnregisterAllAndCleanUpRegistry() const
|
||||
{
|
||||
assert(m_RootKey.get());
|
||||
|
||||
if (IsRegisteredFor(MSWORD))
|
||||
UnregisterForMsWord();
|
||||
|
||||
if (IsRegisteredFor(MSEXCEL))
|
||||
UnregisterForMsExcel();
|
||||
|
||||
if (IsRegisteredFor(MSPOWERPOINT))
|
||||
UnregisterForMsPowerPoint();
|
||||
|
||||
if (IsRegisteredFor(DEFAULT_HTML_EDITOR_FOR_IE))
|
||||
UnregisterAsDefaultHtmlEditorForInternetExplorer();
|
||||
|
||||
if (IsRegisteredFor(HTML_EDITOR))
|
||||
UnregisterAsHtmlEditorForInternetExplorer();
|
||||
|
||||
if (IsRegisteredFor(DEFAULT_SHELL_HTML_EDITOR))
|
||||
UnregisterAsDefaultShellHtmlEditor();
|
||||
|
||||
if (m_RootKey->HasSubKey(PRIVATE_BACKUP_KEY_NAME))
|
||||
m_RootKey->DeleteSubKeyTree(PRIVATE_BACKUP_KEY_NAME);
|
||||
}
|
||||
|
||||
void Registrar::RegisterForMsOfficeApplication(
|
||||
const std::wstring& FileExtension,
|
||||
const std::wstring& DocumentDisplayName,
|
||||
const std::wstring& DefaultIconEntry,
|
||||
const std::wstring& DefaultShellCommand,
|
||||
const std::wstring& ShellNewCommandDisplayName,
|
||||
const RegistrationContextInformation::OFFICE_APPLICATION eOfficeApp) const
|
||||
{
|
||||
assert(m_RootKey.get());
|
||||
|
||||
std::wstring ForwardKeyName = FORWARD_KEY_PREFIX + FileExtension;
|
||||
|
||||
RegistryKey ForwardKey = m_RootKey->CreateSubKey(ForwardKeyName);
|
||||
RegistryValue RegVal(new RegistryValueImpl(std::wstring(DEFAULT_VALUE_NAME), DocumentDisplayName));
|
||||
ForwardKey->SetValue(RegVal);
|
||||
|
||||
RegistryKey RegKey = ForwardKey->CreateSubKey(L"DefaultIcon");
|
||||
RegVal->SetValue(DefaultIconEntry);
|
||||
RegKey->SetValue(RegVal);
|
||||
|
||||
RegistryKey RegKeyShell = ForwardKey->CreateSubKey(L"shell");
|
||||
RegVal->SetValue(DefaultShellCommand);
|
||||
RegKeyShell->SetValue(RegVal);
|
||||
|
||||
RegKey = RegKeyShell->CreateSubKey(L"new");
|
||||
RegVal->SetValue(ShellNewCommandDisplayName);
|
||||
RegKey->SetValue(RegVal);
|
||||
|
||||
RegKey = RegKey->CreateSubKey(L"command");
|
||||
RegVal->SetValue(m_ContextInformation.GetOpenOfficeCommandline(RegistrationContextInformation::New, eOfficeApp));
|
||||
RegKey->SetValue(RegVal);
|
||||
|
||||
RegKey = RegKeyShell->CreateSubKey(L"open\\command");
|
||||
RegVal->SetValue(m_ContextInformation.GetOpenOfficeCommandline(RegistrationContextInformation::Open, eOfficeApp));
|
||||
RegKey->SetValue(RegVal);
|
||||
|
||||
RegKey = RegKeyShell->CreateSubKey(L"print\\command");
|
||||
RegVal->SetValue(m_ContextInformation.GetOpenOfficeCommandline(RegistrationContextInformation::Print, eOfficeApp));
|
||||
RegKey->SetValue(RegVal);
|
||||
|
||||
RegKey = RegKeyShell->CreateSubKey(L"printto\\command");
|
||||
RegVal->SetValue(m_ContextInformation.GetOpenOfficeCommandline(RegistrationContextInformation::Printto, eOfficeApp));
|
||||
RegKey->SetValue(RegVal);
|
||||
|
||||
// set the new forward key under the appropriate extension
|
||||
RegKey = m_RootKey->CreateSubKey(FileExtension);
|
||||
|
||||
if (RegKey->HasValue(DEFAULT_VALUE_NAME))
|
||||
{
|
||||
RegVal = RegKey->GetValue(DEFAULT_VALUE_NAME);
|
||||
|
||||
if (REG_SZ == RegVal->GetType())
|
||||
{
|
||||
std::wstring str = RegVal->GetDataAsUniString();
|
||||
if (!IsOpenOfficeRegisteredForMsApplication(str))
|
||||
ForwardKey->CopyValue(RegKey, DEFAULT_VALUE_NAME, BACKUP_VALUE_NAME);
|
||||
}
|
||||
}
|
||||
|
||||
RegVal->SetValue(ForwardKeyName);
|
||||
RegKey->SetValue(RegVal);
|
||||
}
|
||||
|
||||
void Registrar::UnregisterForMsOfficeApplication(const std::wstring& FileExtension) const
|
||||
{
|
||||
std::wstring FwdRegKeyName = FORWARD_KEY_PREFIX + FileExtension;
|
||||
|
||||
if (m_RootKey->HasSubKey(FileExtension))
|
||||
{
|
||||
RegistryKey RegKey = m_RootKey->OpenSubKey(FileExtension);
|
||||
|
||||
if (RegKey->HasValue(DEFAULT_VALUE_NAME))
|
||||
{
|
||||
RegistryValue RegVal = RegKey->GetValue(DEFAULT_VALUE_NAME);
|
||||
if (REG_SZ == RegVal->GetType() &&
|
||||
IsOpenOfficeRegisteredForMsApplication(RegVal->GetDataAsUniString()))
|
||||
{
|
||||
RegistryKey FwdRegKey = m_RootKey->CreateSubKey(FwdRegKeyName);
|
||||
|
||||
if (FwdRegKey->HasValue(BACKUP_VALUE_NAME))
|
||||
RegKey->CopyValue(FwdRegKey, BACKUP_VALUE_NAME, DEFAULT_VALUE_NAME);
|
||||
else
|
||||
RegKey->DeleteValue(DEFAULT_VALUE_NAME);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (m_RootKey->HasSubKey(FwdRegKeyName))
|
||||
m_RootKey->DeleteSubKeyTree(FwdRegKeyName);
|
||||
}
|
||||
|
||||
RegistryKey Registrar::GetRootKeyForDefHtmlEditorForIERegistration() const
|
||||
{
|
||||
return WindowsRegistry().GetLocalMachineKey();
|
||||
}
|
||||
|
||||
bool Registrar::IsOpenOfficeRegisteredForMsApplication(const std::wstring& DocumentExtensionDefValue) const
|
||||
{
|
||||
return (std::wstring::npos != DocumentExtensionDefValue.find(FORWARD_KEY_PREFIX));
|
||||
}
|
||||
|
||||
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|
@@ -1,104 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
// Registrar.h: Schnittstelle f<>r die Klasse Registrar.
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef _REGISTRAR_HXX_
|
||||
#define _REGISTRAR_HXX_
|
||||
|
||||
#include "registry.hxx"
|
||||
#include "registrationcontextinformation.hxx"
|
||||
|
||||
#include "constants.hxx"
|
||||
|
||||
class Registrar
|
||||
{
|
||||
public:
|
||||
|
||||
Registrar(const RegistrationContextInformation& RegContext);
|
||||
|
||||
virtual ~Registrar();
|
||||
|
||||
bool IsRegisteredFor(int State) const;
|
||||
|
||||
virtual void RegisterForMsWord() const;
|
||||
virtual void UnregisterForMsWord() const;
|
||||
virtual bool QueryPreselectMsWordRegistration() const;
|
||||
|
||||
virtual void RegisterForMsExcel() const;
|
||||
virtual void UnregisterForMsExcel() const;
|
||||
virtual bool QueryPreselectMsExcelRegistration() const;
|
||||
|
||||
virtual void RegisterForMsPowerPoint() const;
|
||||
virtual void UnregisterForMsPowerPoint() const;
|
||||
virtual bool QueryPreselectMsPowerPointRegistration() const;
|
||||
|
||||
virtual void RegisterAsHtmlEditorForInternetExplorer() const;
|
||||
virtual void UnregisterAsHtmlEditorForInternetExplorer() const;
|
||||
|
||||
virtual void RegisterAsDefaultHtmlEditorForInternetExplorer() const;
|
||||
virtual void UnregisterAsDefaultHtmlEditorForInternetExplorer() const;
|
||||
|
||||
virtual void RegisterAsDefaultShellHtmlEditor() const;
|
||||
virtual void UnregisterAsDefaultShellHtmlEditor() const;
|
||||
|
||||
/** Restore the last registration state (necessary for
|
||||
Setup repair)
|
||||
*/
|
||||
virtual void RepairRegistrationState() const;
|
||||
|
||||
/** Unregisters all and delete all Registry keys we have written
|
||||
*/
|
||||
virtual void UnregisterAllAndCleanUpRegistry() const;
|
||||
|
||||
protected:
|
||||
|
||||
virtual void RegisterForMsOfficeApplication(
|
||||
const std::wstring& FileExtension,
|
||||
const std::wstring& DocumentDisplayName,
|
||||
const std::wstring& DefaultIconEntry,
|
||||
const std::wstring& DefaultShellCommand,
|
||||
const std::wstring& ShellNewCommandDisplayName,
|
||||
const RegistrationContextInformation::OFFICE_APPLICATION eOfficeApp) const;
|
||||
|
||||
virtual void UnregisterForMsOfficeApplication(
|
||||
const std::wstring& FileExtension) const;
|
||||
|
||||
virtual RegistryKey GetRootKeyForDefHtmlEditorForIERegistration() const;
|
||||
|
||||
void SaveRegisteredFor(int State) const;
|
||||
void SaveNotRegisteredFor(int State) const;
|
||||
|
||||
int GetRegisterState() const;
|
||||
void SetRegisterState(int NewState) const;
|
||||
|
||||
virtual bool QueryPreselectForMsApplication(const std::wstring& file_extension) const;
|
||||
|
||||
/** A helper function (for readability) returns true if OpenOffice is already
|
||||
registered for a MS application
|
||||
|
||||
@param DocumentExtensionDefValue
|
||||
The default value of the appropriate document extension Registry key
|
||||
*/
|
||||
bool IsOpenOfficeRegisteredForMsApplication(const std::wstring& DocumentExtensionDefValue) const;
|
||||
|
||||
protected:
|
||||
const RegistrationContextInformation& m_ContextInformation;
|
||||
|
||||
const std::wstring FORWARD_KEY_PREFIX;
|
||||
const std::wstring DEFAULT_VALUE_NAME;
|
||||
const std::wstring BACKUP_VALUE_NAME;
|
||||
const std::wstring PRIVATE_BACKUP_KEY_NAME;
|
||||
const std::wstring REGISTRATION_STATE;
|
||||
|
||||
RegistryKey m_RootKey;
|
||||
|
||||
// prevent copy/assignment
|
||||
private:
|
||||
Registrar(const Registrar&);
|
||||
Registrar& operator=(const Registrar&);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|
@@ -1,340 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
//Implementierung der Klasse RegistrationContextInformation.
|
||||
|
||||
#include "registrationcontextinformation.hxx"
|
||||
#include "msihelper.hxx"
|
||||
|
||||
#define WINDOWS_LEAN_AND_MEAN
|
||||
#include <windows.h>
|
||||
#include <assert.h>
|
||||
#include <algorithm>
|
||||
|
||||
namespace /* private */
|
||||
{
|
||||
const int MAX_REGKEY_LENGTH_WIN9X = 16300;
|
||||
}
|
||||
|
||||
RegistrationContextInformation::RegistrationContextInformation(MSIHANDLE hMsi, const std::wstring& OpenOfficeExecutablePath) :
|
||||
msihandle_(hMsi),
|
||||
m_OOExecPath(OpenOfficeExecutablePath)
|
||||
{
|
||||
assert(m_OOExecPath.length());
|
||||
ExtractOpenOfficeExecNameFromPath();
|
||||
m_OOIconPath = m_OOExecPath.replace(m_OOExecPath.find(m_OOExecName), m_OOExecName.size(), std::wstring(TEXT("soffice.bin")));
|
||||
}
|
||||
|
||||
std::wstring RegistrationContextInformation::GetWordDocumentDisplayName() const
|
||||
{
|
||||
std::wstring str;
|
||||
GetMsiProp(msihandle_, TEXT("STR_MS_WORD_DOCUMENT"), str);
|
||||
return str;
|
||||
}
|
||||
|
||||
std::wstring RegistrationContextInformation::GetWordDocumentFileExtension() const
|
||||
{
|
||||
return std::wstring(TEXT(".doc"));
|
||||
}
|
||||
|
||||
std::wstring RegistrationContextInformation::GetWordDocumentDefaultIconEntry() const
|
||||
{
|
||||
return m_OOIconPath + std::wstring(TEXT(",1"));
|
||||
}
|
||||
|
||||
std::wstring RegistrationContextInformation::GetWordDocumentDefaultShellCommand() const
|
||||
{
|
||||
return std::wstring(TEXT("open"));
|
||||
}
|
||||
|
||||
std::wstring RegistrationContextInformation::GetMOOXWordDocumentDisplayName() const
|
||||
{
|
||||
std::wstring str;
|
||||
str = TEXT("Microsoft Word 2007 Document");
|
||||
return str;
|
||||
}
|
||||
|
||||
std::wstring RegistrationContextInformation::GetMOOXWordDocumentFileExtension() const
|
||||
{
|
||||
return std::wstring(TEXT(".docx"));
|
||||
}
|
||||
|
||||
std::wstring RegistrationContextInformation::GetWordTemplateDisplayName() const
|
||||
{
|
||||
std::wstring str;
|
||||
GetMsiProp(msihandle_, TEXT("STR_MS_WORD_TEMPLATE"), str);
|
||||
return str;
|
||||
}
|
||||
|
||||
std::wstring RegistrationContextInformation::GetWordTemplateFileExtension() const
|
||||
{
|
||||
return std::wstring(TEXT(".dot"));
|
||||
}
|
||||
|
||||
std::wstring RegistrationContextInformation::GetWordTemplateDefaultIconEntry() const
|
||||
{
|
||||
return m_OOIconPath + std::wstring(TEXT(",2"));
|
||||
}
|
||||
|
||||
std::wstring RegistrationContextInformation::GetWordTemplateDefaultShellCommand() const
|
||||
{
|
||||
return std::wstring(TEXT("new"));
|
||||
}
|
||||
|
||||
std::wstring RegistrationContextInformation::GetRtfDocumentDisplayName() const
|
||||
{
|
||||
std::wstring str;
|
||||
GetMsiProp(msihandle_, TEXT("STR_RTF_DOCUMENT"), str);
|
||||
return str;
|
||||
}
|
||||
|
||||
std::wstring RegistrationContextInformation::GetRtfDocumentFileExtension() const
|
||||
{
|
||||
return std::wstring(TEXT(".rtf"));
|
||||
}
|
||||
|
||||
std::wstring RegistrationContextInformation::GetRtfDocumentDefaultIconEntry() const
|
||||
{
|
||||
return m_OOIconPath + std::wstring(TEXT(",1"));
|
||||
}
|
||||
|
||||
std::wstring RegistrationContextInformation::GetRtfDocumentDefaultShellCommand() const
|
||||
{
|
||||
return std::wstring(TEXT("open"));
|
||||
}
|
||||
|
||||
std::wstring RegistrationContextInformation::GetExcelSheetDisplayName() const
|
||||
{
|
||||
std::wstring str;
|
||||
GetMsiProp(msihandle_, TEXT("STR_MS_EXCEL_WORKSHEET"), str);
|
||||
return str;
|
||||
}
|
||||
|
||||
std::wstring RegistrationContextInformation::GetExcelSheetFileExtension() const
|
||||
{
|
||||
return std::wstring(TEXT(".xls"));
|
||||
}
|
||||
|
||||
std::wstring RegistrationContextInformation::GetExcelSheetDefaultIconEntry() const
|
||||
{
|
||||
return m_OOIconPath + std::wstring(TEXT(",3"));
|
||||
}
|
||||
|
||||
std::wstring RegistrationContextInformation::GetExcelSheetDefaultShellCommand() const
|
||||
{
|
||||
return std::wstring(TEXT("open"));
|
||||
}
|
||||
|
||||
std::wstring RegistrationContextInformation::GetMOOXExcelSheetDisplayName() const
|
||||
{
|
||||
std::wstring str;
|
||||
str = TEXT("Microsoft Excel 2007 Spreadsheet");
|
||||
return str;
|
||||
}
|
||||
|
||||
std::wstring RegistrationContextInformation::GetMOOXExcelSheetFileExtension() const
|
||||
{
|
||||
return std::wstring(TEXT(".xlsx"));
|
||||
}
|
||||
|
||||
std::wstring RegistrationContextInformation::GetExcelTemplateDisplayName() const
|
||||
{
|
||||
std::wstring str;
|
||||
GetMsiProp(msihandle_, TEXT("STR_MS_EXCEL_TEMPLATE"), str);
|
||||
return str;
|
||||
}
|
||||
|
||||
std::wstring RegistrationContextInformation::GetExcelTemplateFileExtension() const
|
||||
{
|
||||
return std::wstring(TEXT(".xlt"));
|
||||
}
|
||||
|
||||
std::wstring RegistrationContextInformation::GetExcelTemplateDefaultIconEntry() const
|
||||
{
|
||||
return m_OOIconPath + std::wstring(TEXT(",4"));
|
||||
}
|
||||
|
||||
std::wstring RegistrationContextInformation::GetExcelTemplateDefaultShellCommand() const
|
||||
{
|
||||
return std::wstring(TEXT("new"));
|
||||
}
|
||||
|
||||
std::wstring RegistrationContextInformation::GetPowerPointDocumentDisplayName() const
|
||||
{
|
||||
std::wstring str;
|
||||
GetMsiProp(msihandle_, TEXT("STR_MS_POWERPOINT_PRESENTATION"), str);
|
||||
return str;
|
||||
}
|
||||
|
||||
std::wstring RegistrationContextInformation::GetPowerPointDocumentFileExtension() const
|
||||
{
|
||||
return std::wstring(TEXT(".ppt"));
|
||||
}
|
||||
|
||||
std::wstring RegistrationContextInformation::GetPowerPointDocumentDefaultIconEntry() const
|
||||
{
|
||||
return m_OOIconPath + std::wstring(TEXT(",7"));
|
||||
}
|
||||
|
||||
std::wstring RegistrationContextInformation::GetPowerPointDocumentDefaultShellCommand() const
|
||||
{
|
||||
return std::wstring(TEXT("open"));
|
||||
}
|
||||
|
||||
std::wstring RegistrationContextInformation::GetMOOXPowerPointDocumentDisplayName() const
|
||||
{
|
||||
std::wstring str;
|
||||
str = TEXT("Microsoft PowerPoint 2007 Presentation");
|
||||
return str;
|
||||
}
|
||||
|
||||
std::wstring RegistrationContextInformation::GetMOOXPowerPointDocumentFileExtension() const
|
||||
{
|
||||
return std::wstring(TEXT(".pptx"));
|
||||
}
|
||||
|
||||
std::wstring RegistrationContextInformation::GetPowerPointTemplateDisplayName() const
|
||||
{
|
||||
std::wstring str;
|
||||
GetMsiProp(msihandle_, TEXT("STR_MS_POWERPOINT_TEMPLATE"), str);
|
||||
return str;
|
||||
}
|
||||
|
||||
std::wstring RegistrationContextInformation::GetPowerPointTemplateFileExtension() const
|
||||
{
|
||||
return std::wstring(TEXT(".pot"));
|
||||
}
|
||||
|
||||
std::wstring RegistrationContextInformation::GetPowerPointTemplateDefaultIconEntry() const
|
||||
{
|
||||
return m_OOIconPath + std::wstring(TEXT(",8"));
|
||||
}
|
||||
|
||||
std::wstring RegistrationContextInformation::GetPowerPointTemplateDefaultShellCommand() const
|
||||
{
|
||||
return std::wstring(TEXT("new"));
|
||||
}
|
||||
|
||||
std::wstring RegistrationContextInformation::GetPowerPointShowDisplayName() const
|
||||
{
|
||||
std::wstring str;
|
||||
GetMsiProp(msihandle_, TEXT("STR_MS_POWERPOINT_SHOW"), str);
|
||||
return str;
|
||||
}
|
||||
|
||||
std::wstring RegistrationContextInformation::GetPowerPointShowFileExtension() const
|
||||
{
|
||||
return std::wstring(TEXT(".pps"));
|
||||
}
|
||||
|
||||
std::wstring RegistrationContextInformation::GetPowerPointShowDefaultIconEntry() const
|
||||
{
|
||||
return m_OOIconPath + std::wstring(TEXT(",7"));
|
||||
}
|
||||
|
||||
std::wstring RegistrationContextInformation::GetPowerPointShowDefaultShellCommand() const
|
||||
{
|
||||
return std::wstring(TEXT("open"));
|
||||
}
|
||||
|
||||
//----------------------------------------------
|
||||
/** The string for the "New" command that should appear
|
||||
in the Explorer context menu when someone right
|
||||
clicks a Microsoft document
|
||||
*/
|
||||
std::wstring RegistrationContextInformation::ShellNewCommandDisplayName() const
|
||||
{
|
||||
std::wstring str;
|
||||
GetMsiProp(msihandle_, TEXT("STR_NEW_DISPLAY_NAME"), str);
|
||||
std::wstring::size_type idx = str.find(TEXT("~"));
|
||||
|
||||
if(std::wstring::npos != idx)
|
||||
str.replace(idx, 1, TEXT("&"));
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
/** The string for the "Edit" command that should
|
||||
appear in the Explorer context menu when someone
|
||||
right clicks a document
|
||||
*/
|
||||
std::wstring RegistrationContextInformation::ShellEditCommandDisplayName() const
|
||||
{
|
||||
std::wstring str;
|
||||
GetMsiProp(msihandle_, TEXT("STR_EDIT"), str);
|
||||
std::wstring::size_type idx = str.find(TEXT("~"));
|
||||
|
||||
if(std::wstring::npos != idx)
|
||||
str.replace(idx, 1, TEXT("&"));
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
std::wstring RegistrationContextInformation::GetOpenOfficeFriendlyAppName() const
|
||||
{
|
||||
std::wstring str;
|
||||
GetMsiProp(msihandle_, TEXT("ProductName"), str);
|
||||
return str;
|
||||
}
|
||||
|
||||
std::wstring RegistrationContextInformation::GetOpenOfficeExecutablePath() const
|
||||
{
|
||||
return m_OOExecPath;
|
||||
}
|
||||
|
||||
//----------------------------------------------
|
||||
/** The name of the executable (currently "soffice.exe"
|
||||
but may change in the future, who knows) */
|
||||
std::wstring RegistrationContextInformation::GetOpenOfficeExecutableName() const
|
||||
{
|
||||
return m_OOExecName;
|
||||
}
|
||||
|
||||
/** A command line for the specified shell command */
|
||||
std::wstring RegistrationContextInformation::GetOpenOfficeCommandline(SHELL_COMMAND ShellCommand,
|
||||
OFFICE_APPLICATION OfficeApp) const
|
||||
{
|
||||
// quote the path to OpenOffice, this is important
|
||||
// for Windows 9x
|
||||
std::wstring cmd_line = std::wstring(TEXT("\"")) + m_OOExecPath + std::wstring(TEXT("\""));
|
||||
|
||||
switch( OfficeApp )
|
||||
{
|
||||
case Writer:
|
||||
cmd_line += std::wstring( TEXT( " -writer" ) );
|
||||
break;
|
||||
case Calc:
|
||||
cmd_line += std::wstring( TEXT( " -calc" ) );
|
||||
break;
|
||||
case Impress:
|
||||
cmd_line += std::wstring( TEXT( " -impress" ) );
|
||||
break;
|
||||
case Office: // default to std command line
|
||||
break;
|
||||
// default: no default to find new added enums at compile time
|
||||
}
|
||||
switch(ShellCommand)
|
||||
{
|
||||
case New:
|
||||
cmd_line += std::wstring(TEXT(" -n \"%1\""));
|
||||
break;
|
||||
case Open:
|
||||
cmd_line += std::wstring(TEXT(" -o \"%1\""));
|
||||
break;
|
||||
case Print:
|
||||
cmd_line += std::wstring(TEXT(" -p \"%1\""));
|
||||
break;
|
||||
case Printto:
|
||||
cmd_line += std::wstring(TEXT(" -pt \"%2\" \"%1\""));
|
||||
break;
|
||||
// default: no default to find new added enums at compile time
|
||||
}
|
||||
return cmd_line;
|
||||
}
|
||||
|
||||
void RegistrationContextInformation::ExtractOpenOfficeExecNameFromPath()
|
||||
{
|
||||
std::wstring::size_type idx = m_OOExecPath.find_last_of(TEXT('\\'));
|
||||
assert(idx != std::wstring::npos); // assert valid path
|
||||
m_OOExecName = m_OOExecPath.substr(idx + 1);
|
||||
}
|
||||
|
||||
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|
@@ -1,173 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
// MsOfficeDocumentInformation.h: Schnittstelle f<>r die Klasse MsOfficeDocumentInformation.
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef _REGISTRATIONCONTEXTINFORMATION_HXX_
|
||||
#define _REGISTRATIONCONTEXTINFORMATION_HXX_
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(push, 1) /* disable warnings within system headers */
|
||||
#endif
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <windows.h>
|
||||
#include <msi.h>
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(pop)
|
||||
#endif
|
||||
|
||||
#include <string>
|
||||
|
||||
/** A simple implementation class that returns the
|
||||
appropriate display names for the Microsoft
|
||||
Office document types.
|
||||
Under Windows 9x this class checks if the
|
||||
document display name is convertable to an ANSI
|
||||
string and if not returns an english default.
|
||||
So we avoid garbage if soemone for instance
|
||||
installs an japanese StarOffice/OpenOffice
|
||||
under a German Windows 98 for instance.
|
||||
*/
|
||||
class RegistrationContextInformation
|
||||
{
|
||||
public:
|
||||
|
||||
enum SHELL_COMMAND {New, Open, Print, Printto};
|
||||
enum OFFICE_APPLICATION {Office, Writer, Calc, Impress};
|
||||
|
||||
RegistrationContextInformation(MSIHANDLE hMsi, const std::wstring& OpenOfficeExecutablePath);
|
||||
|
||||
/** Word document information
|
||||
The icon index is the index of the icon
|
||||
in soffice.exe to be associated with
|
||||
word document files
|
||||
*/
|
||||
std::wstring GetWordDocumentDisplayName() const;
|
||||
std::wstring GetWordDocumentFileExtension() const;
|
||||
std::wstring GetWordDocumentDefaultIconEntry() const;
|
||||
std::wstring GetWordDocumentDefaultShellCommand() const;
|
||||
|
||||
/** MOOX Word document information
|
||||
The icon index is the index of the icon
|
||||
in soffice.exe to be associated with
|
||||
word document files
|
||||
*/
|
||||
std::wstring GetMOOXWordDocumentDisplayName() const;
|
||||
std::wstring GetMOOXWordDocumentFileExtension() const;
|
||||
|
||||
/** Word template information
|
||||
The icon index is the index of the icon
|
||||
in soffice.exe to be associated with
|
||||
word template files
|
||||
*/
|
||||
std::wstring GetWordTemplateDisplayName() const;
|
||||
std::wstring GetWordTemplateFileExtension() const;
|
||||
std::wstring GetWordTemplateDefaultIconEntry() const;
|
||||
std::wstring GetWordTemplateDefaultShellCommand() const;
|
||||
|
||||
/** Rtf document information
|
||||
The icon index is the index of the icon
|
||||
in soffice.exe to be associated with
|
||||
rtf document files
|
||||
*/
|
||||
std::wstring GetRtfDocumentDisplayName() const;
|
||||
std::wstring GetRtfDocumentFileExtension() const;
|
||||
std::wstring GetRtfDocumentDefaultIconEntry() const;
|
||||
std::wstring GetRtfDocumentDefaultShellCommand() const;
|
||||
|
||||
/** Excel sheet information
|
||||
The icon index is the index of the icon
|
||||
in soffice.exe to be associated with
|
||||
Excel sheets
|
||||
*/
|
||||
std::wstring GetExcelSheetDisplayName() const;
|
||||
std::wstring GetExcelSheetFileExtension() const;
|
||||
std::wstring GetExcelSheetDefaultIconEntry() const;
|
||||
std::wstring GetExcelSheetDefaultShellCommand() const;
|
||||
|
||||
std::wstring GetMOOXExcelSheetDisplayName() const;
|
||||
std::wstring GetMOOXExcelSheetFileExtension() const;
|
||||
|
||||
/** Excel template information
|
||||
The icon index is the index of the icon
|
||||
in soffice.exe to be associated with
|
||||
Excel template files
|
||||
*/
|
||||
std::wstring GetExcelTemplateDisplayName() const;
|
||||
std::wstring GetExcelTemplateFileExtension() const;
|
||||
std::wstring GetExcelTemplateDefaultIconEntry() const;
|
||||
std::wstring GetExcelTemplateDefaultShellCommand() const;
|
||||
|
||||
/** PowerPoint document information
|
||||
The icon index is the index of the icon
|
||||
in soffice.exe to be associated with
|
||||
PowerPoint document files
|
||||
*/
|
||||
std::wstring GetPowerPointDocumentDisplayName() const;
|
||||
std::wstring GetPowerPointDocumentFileExtension() const;
|
||||
std::wstring GetPowerPointDocumentDefaultIconEntry() const;
|
||||
std::wstring GetPowerPointDocumentDefaultShellCommand() const;
|
||||
|
||||
std::wstring GetMOOXPowerPointDocumentDisplayName() const;
|
||||
std::wstring GetMOOXPowerPointDocumentFileExtension() const;
|
||||
|
||||
/** PowerPoint template information
|
||||
The icon index is the index of the icon
|
||||
in soffice.exe to be associated with
|
||||
PowerPoint template files
|
||||
*/
|
||||
std::wstring GetPowerPointTemplateDisplayName() const;
|
||||
std::wstring GetPowerPointTemplateFileExtension() const;
|
||||
std::wstring GetPowerPointTemplateDefaultIconEntry() const;
|
||||
std::wstring GetPowerPointTemplateDefaultShellCommand() const;
|
||||
|
||||
/** PowerPoint Show information
|
||||
*/
|
||||
std::wstring GetPowerPointShowDisplayName() const;
|
||||
std::wstring GetPowerPointShowFileExtension() const;
|
||||
std::wstring GetPowerPointShowDefaultIconEntry() const;
|
||||
std::wstring GetPowerPointShowDefaultShellCommand() const;
|
||||
|
||||
/** The string for the "New" command that should appear
|
||||
in the Explorer context menu when someone right
|
||||
clicks a Microsoft document
|
||||
*/
|
||||
std::wstring ShellNewCommandDisplayName() const;
|
||||
|
||||
/** The string for the "Edit" command that should
|
||||
appear in the Explorer context menu when someone
|
||||
right clicks a document
|
||||
*/
|
||||
std::wstring ShellEditCommandDisplayName() const;
|
||||
|
||||
/** A friendly name for the application
|
||||
*/
|
||||
std::wstring GetOpenOfficeFriendlyAppName() const;
|
||||
|
||||
/** The path to the StarOffice/OpenOffice executable
|
||||
*/
|
||||
std::wstring GetOpenOfficeExecutablePath() const;
|
||||
|
||||
/** The name of the executable (currently "soffice.exe"
|
||||
but may change in the future, who knows)
|
||||
*/
|
||||
std::wstring GetOpenOfficeExecutableName() const;
|
||||
|
||||
/** A command line for the specified shell command
|
||||
*/
|
||||
std::wstring GetOpenOfficeCommandline(SHELL_COMMAND ShellCommand,
|
||||
OFFICE_APPLICATION OfficeApp) const;
|
||||
|
||||
private:
|
||||
void ExtractOpenOfficeExecNameFromPath();
|
||||
|
||||
private:
|
||||
MSIHANDLE msihandle_;
|
||||
std::wstring m_OOExecPath;
|
||||
std::wstring m_OOExecName;
|
||||
std::wstring m_OOIconPath;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|
@@ -1,245 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
/*************************************************************************
|
||||
*
|
||||
* 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 "registry.hxx"
|
||||
|
||||
#include <Shlwapi.h>
|
||||
#include <assert.h>
|
||||
#include <algorithm>
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(disable : 4786 4350)
|
||||
#endif
|
||||
|
||||
//-----------------------------------------------------
|
||||
/** Create instance and open the specified Registry key
|
||||
|
||||
@throws RegistryWriteAccessDenyException
|
||||
RegistryAccessDenyException
|
||||
RegistryKeyNotFoundException
|
||||
*/
|
||||
RegistryKeyImpl::RegistryKeyImpl(HKEY RootKey, const std::wstring& KeyName) :
|
||||
m_hRootKey(RootKey),
|
||||
m_hSubKey(0),
|
||||
m_KeyName(KeyName),
|
||||
m_IsWriteable(false)
|
||||
{
|
||||
}
|
||||
|
||||
//-----------------------------------------------------
|
||||
/** Create instance and open the specified Registry key
|
||||
|
||||
@throws RegistryWriteAccessDenyException
|
||||
RegistryAccessDenyException
|
||||
RegistryKeyNotFoundException
|
||||
*/
|
||||
RegistryKeyImpl::RegistryKeyImpl(HKEY RootKey) :
|
||||
m_hRootKey(RootKey),
|
||||
m_hSubKey(0),
|
||||
m_IsWriteable(false)
|
||||
{
|
||||
}
|
||||
|
||||
//-----------------------------------------------------
|
||||
/** Create an instances of the specified Registry key,
|
||||
the key is assumed to be already opened.
|
||||
*/
|
||||
RegistryKeyImpl::RegistryKeyImpl(HKEY RootKey, HKEY SubKey, const std::wstring& KeyName, bool Writeable) :
|
||||
m_hRootKey(RootKey),
|
||||
m_hSubKey(SubKey),
|
||||
m_KeyName(KeyName),
|
||||
m_IsWriteable(Writeable)
|
||||
{
|
||||
}
|
||||
|
||||
//-----------------------------------------------------
|
||||
/**
|
||||
*/
|
||||
RegistryKeyImpl::~RegistryKeyImpl()
|
||||
{
|
||||
if (IsOpen())
|
||||
Close();
|
||||
}
|
||||
|
||||
|
||||
//############################################
|
||||
// Queries
|
||||
//############################################
|
||||
|
||||
|
||||
//-----------------------------------------------------
|
||||
/** The name of the key at hand, maybe empty
|
||||
if this is any of the root keys
|
||||
*/
|
||||
std::wstring RegistryKeyImpl::GetName() const
|
||||
{
|
||||
return m_KeyName;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------
|
||||
/**
|
||||
*/
|
||||
bool RegistryKeyImpl::IsOpen() const
|
||||
{
|
||||
return m_hSubKey != 0;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------
|
||||
/** Is this one of the root keys
|
||||
HKEY_CLASSES_ROOT
|
||||
HKEY_CURRENT_USER
|
||||
etc.
|
||||
*/
|
||||
bool RegistryKeyImpl::IsRootKey() const
|
||||
{
|
||||
return (0 == m_KeyName.length());
|
||||
}
|
||||
|
||||
//-----------------------------------------------------
|
||||
/** Do we have write access on the key at hand
|
||||
*/
|
||||
bool RegistryKeyImpl::IsWriteable() const
|
||||
{
|
||||
return m_IsWriteable;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------
|
||||
/** Convenience function to determine if the
|
||||
Registry key at hand has the specified
|
||||
value
|
||||
|
||||
@precond IsOpen = true
|
||||
|
||||
throws RegistryAccessDenyException
|
||||
*/
|
||||
bool RegistryKeyImpl::HasValue(const std::wstring& Name) const
|
||||
{
|
||||
StringListPtr names = GetSubValueNames();
|
||||
|
||||
StringList::iterator iter_end = names->end();
|
||||
StringList::iterator iter = std::find(names->begin(), iter_end, Name);
|
||||
|
||||
return (iter != iter_end);
|
||||
}
|
||||
|
||||
struct CompareNamesCaseInsensitive
|
||||
{
|
||||
CompareNamesCaseInsensitive(const std::wstring& Name) :
|
||||
name_(Name)
|
||||
{}
|
||||
|
||||
bool operator() (const std::wstring& value)
|
||||
{
|
||||
return (0 == StrCmpI(value.c_str(), name_.c_str()));
|
||||
}
|
||||
|
||||
std::wstring name_;
|
||||
};
|
||||
|
||||
//-----------------------------------------------------
|
||||
/** Convenience function to determine if the
|
||||
Registry key at hand has the specified
|
||||
sub-key
|
||||
|
||||
@precond IsOpen = true
|
||||
|
||||
throws RegistryAccessDenyException
|
||||
*/
|
||||
bool RegistryKeyImpl::HasSubKey(const std::wstring& Name) const
|
||||
{
|
||||
StringListPtr names = GetSubKeyNames();
|
||||
|
||||
StringList::iterator iter_end = names->end();
|
||||
StringList::iterator iter = std::find_if(names->begin(), iter_end, CompareNamesCaseInsensitive(Name));
|
||||
|
||||
return (iter != iter_end);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------
|
||||
/**
|
||||
*/
|
||||
void RegistryKeyImpl::Close()
|
||||
{
|
||||
if (RegCloseKey(m_hSubKey) != ERROR_SUCCESS) {
|
||||
assert(false);
|
||||
}
|
||||
|
||||
m_hSubKey = 0;
|
||||
m_IsWriteable = false;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------
|
||||
/** Copies the specified value from RegistryKey to
|
||||
the registry key at hand, if a value with this
|
||||
name already exist under the registry key at hand
|
||||
it will be overwritten
|
||||
|
||||
@precond IsOpen = true
|
||||
IsWriteable = true
|
||||
RegistryKey.HasSubValue(Name) = true
|
||||
|
||||
@throws RegistryIOException
|
||||
RegistryWriteAccessDeniedException
|
||||
RegistryValueNotFoundException
|
||||
*/
|
||||
void RegistryKeyImpl::CopyValue(const RegistryKey& RegistryKey, const std::wstring& Name)
|
||||
{
|
||||
assert(RegistryKey->HasValue(Name));
|
||||
#ifdef __MINGW32__
|
||||
SetValue((const RegistryValue&)(RegistryKey->GetValue(Name)));
|
||||
#else
|
||||
SetValue(RegistryKey->GetValue(Name));
|
||||
#endif
|
||||
assert(HasValue(Name));
|
||||
}
|
||||
|
||||
/** Copies the specified value from RegistryKey to
|
||||
the registry key at hand under a new name,
|
||||
if a value with this name already exist there
|
||||
it will be overwritten
|
||||
|
||||
@precond IsOpen = true
|
||||
IsWriteable = true
|
||||
RegistryKey.HasSubValue(Name) = true
|
||||
|
||||
@throws RegistryIOException
|
||||
RegistryWriteAccessDeniedException
|
||||
RegistryValueNotFoundException
|
||||
*/
|
||||
void RegistryKeyImpl::CopyValue(const RegistryKey& RegistryKey, const std::wstring& Name, const std::wstring& NewName)
|
||||
{
|
||||
assert(RegistryKey->HasValue(Name));
|
||||
|
||||
RegistryValue RegVal = RegistryKey->GetValue(Name);
|
||||
RegVal->SetName(NewName);
|
||||
SetValue(RegVal);
|
||||
|
||||
assert(HasValue(NewName));
|
||||
}
|
||||
|
||||
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|
@@ -1,337 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
/*************************************************************************
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
************************************************************************/
|
||||
|
||||
#ifndef _REGISTRY_HXX_
|
||||
#define _REGISTRY_HXX_
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(push, 1) /* disable warnings within system headers */
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(pop)
|
||||
#endif
|
||||
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
#include <string>
|
||||
|
||||
#include "registryvalueimpl.hxx"
|
||||
|
||||
//---------------------------------------
|
||||
// forward declaration
|
||||
//---------------------------------------
|
||||
|
||||
class RegistryKeyImpl;
|
||||
|
||||
//---------------------------------------
|
||||
// typedefs
|
||||
//---------------------------------------
|
||||
|
||||
typedef std::auto_ptr<RegistryKeyImpl> RegistryKey;
|
||||
typedef std::vector<std::wstring> StringList;
|
||||
typedef std::auto_ptr<StringList> StringListPtr;
|
||||
|
||||
class RegistryKeyImpl
|
||||
{
|
||||
public:
|
||||
|
||||
//############################################
|
||||
// Destruction
|
||||
//############################################
|
||||
|
||||
virtual ~RegistryKeyImpl();
|
||||
|
||||
|
||||
//############################################
|
||||
// Queries
|
||||
//############################################
|
||||
|
||||
|
||||
/** The name of the key at hand, maybe empty
|
||||
if this is any of the root keys
|
||||
*/
|
||||
std::wstring GetName() const;
|
||||
|
||||
/** The number of sub values of the key at hand
|
||||
|
||||
@precond IsOpen = true
|
||||
|
||||
@throws
|
||||
*/
|
||||
virtual size_t GetSubValueCount() const = 0;
|
||||
|
||||
/** The number of sub-keys of the key at hand
|
||||
|
||||
@precond IsOpen = true
|
||||
|
||||
@throws
|
||||
*/
|
||||
virtual size_t GetSubKeyCount() const = 0;
|
||||
|
||||
bool IsOpen() const;
|
||||
|
||||
/** Do we have write access on the key at hand
|
||||
*/
|
||||
bool IsWriteable() const;
|
||||
|
||||
/** The StringList will be allocated on the heap,
|
||||
so this is in fact a transfer of ownership
|
||||
to the caller
|
||||
|
||||
@precond IsOpen = true
|
||||
|
||||
@throws RegistryIOException
|
||||
*/
|
||||
virtual StringListPtr GetSubKeyNames() const = 0;
|
||||
|
||||
/** The StringList will be allocated on the heap,
|
||||
so this is in fact a transfer of ownership
|
||||
to the caller
|
||||
|
||||
@precond IsOpen = true
|
||||
|
||||
@throws RegistryIOException
|
||||
*/
|
||||
virtual StringListPtr GetSubValueNames() const = 0;
|
||||
|
||||
/** Get the specified registry value
|
||||
|
||||
@precond IsOpen = true
|
||||
*/
|
||||
virtual RegistryValue GetValue(const std::wstring& Name) const = 0;
|
||||
|
||||
/** Get the specified registry value, return the given
|
||||
default value if value not found
|
||||
|
||||
@precond IsOpen = true
|
||||
*/
|
||||
virtual RegistryValue GetValue(const std::wstring& Name, const RegistryValue& Default) const = 0;
|
||||
|
||||
/** Convenience function to determine if the
|
||||
Registry key at hand has the specified
|
||||
value
|
||||
|
||||
@precond IsOpen = true
|
||||
|
||||
throws RegistryAccessDenyException
|
||||
*/
|
||||
bool HasValue(const std::wstring& Name) const;
|
||||
|
||||
/** Convenience function to determine if the
|
||||
Registry key at hand has the specified
|
||||
sub-key
|
||||
|
||||
@precond IsOpen = true
|
||||
|
||||
throws RegistryAccessDenyException
|
||||
*/
|
||||
bool HasSubKey(const std::wstring& Name) const;
|
||||
|
||||
|
||||
//############################################
|
||||
// Commands
|
||||
//############################################
|
||||
|
||||
|
||||
/** Open the registry key, has no effect if
|
||||
the key is already open
|
||||
|
||||
@precond IsOpen = false
|
||||
|
||||
@throws RegistryWriteAccessDenyException
|
||||
RegistryAccessDenyException
|
||||
*/
|
||||
virtual void Open(bool Writeable = true) = 0;
|
||||
|
||||
/** Close the registry key at hand, further
|
||||
using it without re-opening may cause
|
||||
RegistryIOExceptions to be thrown
|
||||
|
||||
This is a template method that calls
|
||||
ImplClose which has to be overwritten
|
||||
by sub-classes
|
||||
*/
|
||||
void Close();
|
||||
|
||||
/** Open the specified sub-key of the registry key
|
||||
at hand
|
||||
|
||||
@precond IsOpen = true
|
||||
HasSubKey(Name) = true
|
||||
|
||||
@throws RegistryIOException
|
||||
RegistryKeyNotFoundException
|
||||
RegistryAccessDeniedException
|
||||
*/
|
||||
virtual RegistryKey OpenSubKey(const std::wstring& Name, bool Writeable = true) = 0;
|
||||
|
||||
/** Creates a new sub-key below the key at hand
|
||||
|
||||
@precond IsOpen = true
|
||||
IsWriteable = true
|
||||
|
||||
@throws RegistryIOException
|
||||
RegistryWriteAccessDenyException
|
||||
*/
|
||||
virtual RegistryKey CreateSubKey(const std::wstring& Name) = 0;
|
||||
|
||||
/** Deletes a sub-key below the key at hand, the
|
||||
key must not have sub-keys
|
||||
|
||||
@precond IsOpen = true
|
||||
IsWriteable = true
|
||||
|
||||
@throws RegistryIOException
|
||||
RegistryWriteAccessDenyException
|
||||
*/
|
||||
virtual void DeleteSubKey(const std::wstring& Name) = 0;
|
||||
|
||||
/** Deletes a sub-key below the key at hand with all
|
||||
its sub-keys
|
||||
|
||||
@precond IsOpen = true
|
||||
IsWriteable = true;
|
||||
|
||||
@throws RegistryIOException
|
||||
RegistryWriteAccessDenyException
|
||||
*/
|
||||
virtual void DeleteSubKeyTree(const std::wstring& Name) = 0;
|
||||
|
||||
/** Delete the specified value
|
||||
|
||||
@precond IsOpen = true
|
||||
IsWriteable = true
|
||||
HasValue(Name) = true
|
||||
|
||||
@throws RegistryIOException
|
||||
RegistryWriteAccessDeniedException
|
||||
RegistryValueNotFoundException
|
||||
*/
|
||||
virtual void DeleteValue(const std::wstring& Name) = 0;
|
||||
|
||||
/** Set the specified registry value
|
||||
|
||||
@precond IsOpen = true
|
||||
IsWriteable = true
|
||||
|
||||
@throws RegistryIOException
|
||||
RegistryWriteAccessDenyException
|
||||
*/
|
||||
virtual void SetValue(const RegistryValue& Value) = 0;
|
||||
|
||||
|
||||
/** Copies the specified value from RegistryKey to
|
||||
the registry key at hand, if a value with this
|
||||
name already exist under the registry key at hand
|
||||
it will be overwritten
|
||||
|
||||
@precond IsOpen = true
|
||||
IsWriteable = true
|
||||
RegistryKey.HasSubValue(Name) = true
|
||||
|
||||
@throws RegistryIOException
|
||||
RegistryWriteAccessDeniedException
|
||||
RegistryValueNotFoundException
|
||||
*/
|
||||
virtual void CopyValue(const RegistryKey& RegistryKey, const std::wstring& Name);
|
||||
|
||||
/** Copies the specified value from RegistryKey to
|
||||
the registry key at hand under a new name,
|
||||
if a value with this name already exist there
|
||||
it will be overwritten
|
||||
|
||||
@precond IsOpen = true
|
||||
IsWriteable = true
|
||||
RegistryKey.HasSubValue(Name) = true
|
||||
|
||||
@throws RegistryIOException
|
||||
RegistryWriteAccessDeniedException
|
||||
RegistryValueNotFoundException
|
||||
*/
|
||||
virtual void CopyValue(const RegistryKey& RegistryKey, const std::wstring& Name, const std::wstring& NewName);
|
||||
|
||||
//############################################
|
||||
// Creation
|
||||
// only possible through WindowsRegistry class
|
||||
//############################################
|
||||
|
||||
|
||||
protected:
|
||||
/** Create instance of the specified Registry key
|
||||
|
||||
@throws RegistryWriteAccessDenyException
|
||||
RegistryAccessDenyException
|
||||
RegistryKeyNotFoundException
|
||||
*/
|
||||
RegistryKeyImpl(HKEY RootKey, const std::wstring& KeyName);
|
||||
|
||||
/** Create instance of the specified Registry key.
|
||||
RootKey should only one of the predefined
|
||||
keys HKEY_CLASSES_ROOT, HKEY_CURRENT_USER,
|
||||
HKEY_LOCAL_MACHINE, HKEY_USERS
|
||||
|
||||
@throws RegistryWriteAccessDenyException
|
||||
RegistryAccessDenyException
|
||||
RegistryKeyNotFoundException
|
||||
*/
|
||||
RegistryKeyImpl(HKEY RootKey);
|
||||
|
||||
/** Create an instances of the specified Registry key,
|
||||
the key is assumed to be already opened.
|
||||
*/
|
||||
RegistryKeyImpl(HKEY RootKey, HKEY SubKey, const std::wstring& KeyName, bool Writeable = true);
|
||||
|
||||
/** Is this one of the root keys
|
||||
HKEY_CLASSES_ROOT
|
||||
HKEY_CURRENT_USER
|
||||
etc.
|
||||
*/
|
||||
bool IsRootKey() const;
|
||||
|
||||
protected:
|
||||
HKEY m_hRootKey;
|
||||
HKEY m_hSubKey;
|
||||
std::wstring m_KeyName;
|
||||
bool m_IsWriteable;
|
||||
|
||||
// prevent copy and assignment
|
||||
private:
|
||||
RegistryKeyImpl(const RegistryKeyImpl&);
|
||||
RegistryKeyImpl& operator=(const RegistryKeyImpl&);
|
||||
|
||||
//######################################
|
||||
// Friend declarations
|
||||
//######################################
|
||||
|
||||
friend class WindowsRegistry;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|
@@ -1,88 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
// RegistryException.cpp: Implementierung der Klasse RegistryException.
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "registryexception.hxx"
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(push, 1) /* disable warnings within system headers */
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(pop)
|
||||
#endif
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Konstruktion/Destruktion
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
RegistryException::RegistryException(long ErrorCode) :
|
||||
m_ErrorCode(ErrorCode),
|
||||
m_ErrorMsg(0)
|
||||
{
|
||||
}
|
||||
|
||||
RegistryException::~RegistryException() throw()
|
||||
{
|
||||
if (m_ErrorMsg)
|
||||
LocalFree(m_ErrorMsg);
|
||||
}
|
||||
|
||||
const char* RegistryException::what() const throw()
|
||||
{
|
||||
FormatMessage(
|
||||
FORMAT_MESSAGE_ALLOCATE_BUFFER |
|
||||
FORMAT_MESSAGE_FROM_SYSTEM |
|
||||
FORMAT_MESSAGE_IGNORE_INSERTS,
|
||||
NULL,
|
||||
m_ErrorCode,
|
||||
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
|
||||
(LPTSTR) &m_ErrorMsg,
|
||||
0,
|
||||
NULL);
|
||||
|
||||
return reinterpret_cast<char*>(m_ErrorMsg);
|
||||
}
|
||||
|
||||
long RegistryException::GetErrorCode() const
|
||||
{
|
||||
return m_ErrorCode;
|
||||
}
|
||||
|
||||
//#######################################
|
||||
// Thrown when a Registry key is accessed
|
||||
// that is closed
|
||||
//#######################################
|
||||
|
||||
RegistryIOException::RegistryIOException(long ErrorCode) :
|
||||
RegistryException(ErrorCode)
|
||||
{
|
||||
};
|
||||
|
||||
RegistryNoWriteAccessException::RegistryNoWriteAccessException(long ErrorCode) :
|
||||
RegistryException(ErrorCode)
|
||||
{
|
||||
};
|
||||
|
||||
RegistryAccessDeniedException::RegistryAccessDeniedException(long ErrorCode) :
|
||||
RegistryException(ErrorCode)
|
||||
{
|
||||
};
|
||||
|
||||
RegistryValueNotFoundException::RegistryValueNotFoundException(long ErrorCode) :
|
||||
RegistryException(ErrorCode)
|
||||
{
|
||||
};
|
||||
|
||||
RegistryKeyNotFoundException::RegistryKeyNotFoundException(long ErrorCode) :
|
||||
RegistryException(ErrorCode)
|
||||
{
|
||||
};
|
||||
|
||||
RegistryInvalidOperationException::RegistryInvalidOperationException(long ErrorCode) :
|
||||
RegistryException(ErrorCode)
|
||||
{
|
||||
};
|
||||
|
||||
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|
@@ -1,107 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
// RegistryException.h: Schnittstelle f<>r die Klasse RegistryException.
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef _REGISTRYEXCEPTION_HXX_
|
||||
#define _REGISTRYEXCEPTION_HXX_
|
||||
|
||||
#include <exception>
|
||||
|
||||
//#######################################
|
||||
// Base class for all Registry exceptions
|
||||
//#######################################
|
||||
|
||||
class RegistryException : public std::exception
|
||||
{
|
||||
public:
|
||||
|
||||
RegistryException(long ErrorCode);
|
||||
|
||||
virtual ~RegistryException() throw();
|
||||
|
||||
/**
|
||||
@descr Returns a string that describes the error if
|
||||
available, else NULL will be returned. The
|
||||
returned string is only temporary so the caller
|
||||
has to copy it if he needs the string further.
|
||||
*/
|
||||
virtual const char* what() const throw();
|
||||
|
||||
/**
|
||||
@descr Returns the error code.
|
||||
*/
|
||||
|
||||
long GetErrorCode() const;
|
||||
|
||||
private:
|
||||
long m_ErrorCode;
|
||||
void* m_ErrorMsg;
|
||||
};
|
||||
|
||||
//#######################################
|
||||
// Thrown when a Registry key is accessed
|
||||
// that is closed
|
||||
//#######################################
|
||||
|
||||
class RegistryIOException : public RegistryException
|
||||
{
|
||||
public:
|
||||
RegistryIOException(long ErrorCode);
|
||||
};
|
||||
|
||||
//#######################################
|
||||
// Thrown when trying to write to a readonly registry key
|
||||
//#######################################
|
||||
|
||||
class RegistryNoWriteAccessException : public RegistryException
|
||||
{
|
||||
public:
|
||||
RegistryNoWriteAccessException(long ErrorCode);
|
||||
};
|
||||
|
||||
//#######################################
|
||||
// Thrown when trying to access an registry key, with improper
|
||||
// access rights
|
||||
//#######################################
|
||||
|
||||
class RegistryAccessDeniedException : public RegistryException
|
||||
{
|
||||
public:
|
||||
RegistryAccessDeniedException(long ErrorCode);
|
||||
};
|
||||
|
||||
//#######################################
|
||||
// A specified registry value could not be read because it is not
|
||||
// available
|
||||
//#######################################
|
||||
|
||||
class RegistryValueNotFoundException : public RegistryException
|
||||
{
|
||||
public:
|
||||
RegistryValueNotFoundException(long ErrorCode);
|
||||
};
|
||||
|
||||
//#######################################
|
||||
// A specified registry key was not found
|
||||
//#######################################
|
||||
|
||||
class RegistryKeyNotFoundException : public RegistryException
|
||||
{
|
||||
public:
|
||||
RegistryKeyNotFoundException(long ErrorCode);
|
||||
};
|
||||
|
||||
//#######################################
|
||||
// A specified registry operation is invalid
|
||||
//#######################################
|
||||
|
||||
class RegistryInvalidOperationException : public RegistryException
|
||||
{
|
||||
public:
|
||||
RegistryInvalidOperationException(long ErrorCode);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|
@@ -1,192 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
// RegistryValueImpl.cpp: Implementierung der Klasse RegistryValueImpl.
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "registryvalueimpl.hxx"
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(push, 1) /* disable warnings within system headers */
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(pop)
|
||||
#endif
|
||||
|
||||
#include <malloc.h>
|
||||
#include <assert.h>
|
||||
|
||||
#include "stringconverter.hxx"
|
||||
|
||||
//#################################
|
||||
// Creation/Destruction
|
||||
//#################################
|
||||
|
||||
//--------------------------------------------
|
||||
/**
|
||||
*/
|
||||
RegistryValueImpl::RegistryValueImpl(const std::wstring& Name, int Value) :
|
||||
m_Name(Name),
|
||||
m_Type(REG_DWORD),
|
||||
m_IntData(Value)
|
||||
{
|
||||
}
|
||||
|
||||
//--------------------------------------------
|
||||
/**
|
||||
*/
|
||||
RegistryValueImpl::RegistryValueImpl(const std::wstring& Name, const std::wstring& Value) :
|
||||
m_Name(Name),
|
||||
m_Type(REG_SZ),
|
||||
m_StringData(Value),
|
||||
m_IntData(0)
|
||||
{
|
||||
}
|
||||
|
||||
//--------------------------------------------
|
||||
/**
|
||||
*/
|
||||
RegistryValueImpl::RegistryValueImpl(const std::wstring& Name, const std::string& Value) :
|
||||
m_Name(Name),
|
||||
m_Type(REG_SZ),
|
||||
m_IntData(0)
|
||||
{
|
||||
m_StringData = AnsiToUnicodeString(Value);
|
||||
}
|
||||
|
||||
#if (_MSC_VER >= 1300)
|
||||
RegistryValueImpl::RegistryValueImpl(const RegistryValueImpl& s) :
|
||||
m_Name(s.m_Name),
|
||||
m_Type(s.m_Type),
|
||||
m_StringData(s.m_StringData),
|
||||
m_IntData(s.m_IntData)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
//--------------------------------------------
|
||||
/**
|
||||
*/
|
||||
RegistryValueImpl::~RegistryValueImpl()
|
||||
{
|
||||
}
|
||||
|
||||
//#################################
|
||||
// Query
|
||||
//#################################
|
||||
|
||||
//--------------------------------------------
|
||||
/** Returns the name of the value
|
||||
*/
|
||||
std::wstring RegistryValueImpl::GetName() const
|
||||
{
|
||||
return m_Name;
|
||||
}
|
||||
|
||||
//--------------------------------------------
|
||||
/** Return the size of data held
|
||||
*/
|
||||
size_t RegistryValueImpl::GetDataSize() const
|
||||
{
|
||||
size_t size = 0;
|
||||
|
||||
if (REG_DWORD == m_Type)
|
||||
size = sizeof(m_IntData);
|
||||
else if (REG_SZ == m_Type)
|
||||
size = m_StringData.length() ? ((m_StringData.length() + 1) * sizeof(wchar_t)) : 0;
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
//--------------------------------------------
|
||||
/** Get a pointer to the data buffer
|
||||
in order to copy the data
|
||||
*/
|
||||
const void* RegistryValueImpl::GetDataBuffer() const
|
||||
{
|
||||
const void* pData = 0;
|
||||
|
||||
if (REG_DWORD == m_Type)
|
||||
pData = reinterpret_cast<const void*>(&m_IntData);
|
||||
else if (REG_SZ == m_Type)
|
||||
pData = reinterpret_cast<const void*>(m_StringData.c_str());
|
||||
|
||||
return pData;
|
||||
}
|
||||
|
||||
//--------------------------------------------
|
||||
/** Returns the data as string
|
||||
*/
|
||||
std::wstring RegistryValueImpl::GetDataAsUniString() const
|
||||
{
|
||||
assert(REG_SZ == m_Type);
|
||||
return m_StringData;
|
||||
}
|
||||
|
||||
//--------------------------------------------
|
||||
/** Returns the data as string
|
||||
*/
|
||||
std::string RegistryValueImpl::GetDataAsAnsiString() const
|
||||
{
|
||||
assert(REG_SZ == m_Type);
|
||||
return UnicodeToAnsiString(m_StringData);
|
||||
}
|
||||
|
||||
//--------------------------------------------
|
||||
/** Returns the data as number
|
||||
*/
|
||||
int RegistryValueImpl::GetDataAsInt() const
|
||||
{
|
||||
assert(REG_DWORD == m_Type);
|
||||
return m_IntData;
|
||||
}
|
||||
|
||||
//--------------------------------------------
|
||||
/** Returns the type of the data
|
||||
*/
|
||||
int RegistryValueImpl::GetType() const
|
||||
{
|
||||
return m_Type;
|
||||
}
|
||||
|
||||
|
||||
//#################################
|
||||
// Command
|
||||
//#################################
|
||||
|
||||
|
||||
//--------------------------------------------
|
||||
/** Set a new name
|
||||
*/
|
||||
void RegistryValueImpl::SetName(const std::wstring& NewName)
|
||||
{
|
||||
m_Name = NewName;
|
||||
}
|
||||
|
||||
//--------------------------------------------
|
||||
/**
|
||||
*/
|
||||
void RegistryValueImpl::SetValue(const std::wstring& NewValue)
|
||||
{
|
||||
m_Type = REG_SZ;
|
||||
m_StringData = NewValue;
|
||||
}
|
||||
|
||||
//--------------------------------------------
|
||||
/**
|
||||
*/
|
||||
void RegistryValueImpl::SetValue(const std::string& NewValue)
|
||||
{
|
||||
m_Type = REG_SZ;
|
||||
m_StringData = AnsiToUnicodeString(NewValue);
|
||||
}
|
||||
|
||||
//--------------------------------------------
|
||||
/**
|
||||
*/
|
||||
void RegistryValueImpl::SetValue(int NewValue)
|
||||
{
|
||||
m_Type = REG_DWORD;
|
||||
m_IntData = NewValue;
|
||||
}
|
||||
|
||||
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|
@@ -1,111 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
// RegistryValueImpl.h: Schnittstelle f<>r die Klasse RegistryValueImpl.
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef _REGISTRYVALUEIMPL_HXX_
|
||||
#define _REGISTRYVALUEIMPL_HXX_
|
||||
|
||||
#include <memory>
|
||||
#include <string>
|
||||
|
||||
class RegistryValueImpl
|
||||
{
|
||||
public:
|
||||
|
||||
//#################################
|
||||
// Creation/Destruction
|
||||
//#################################
|
||||
|
||||
RegistryValueImpl(const std::wstring& Name, int Value);
|
||||
|
||||
RegistryValueImpl(const std::wstring& Name, const std::wstring& Value);
|
||||
|
||||
RegistryValueImpl(const std::wstring& Name, const std::string& Value);
|
||||
|
||||
#if (_MSC_VER >= 1300)
|
||||
RegistryValueImpl::RegistryValueImpl(const RegistryValueImpl& s);
|
||||
#endif
|
||||
|
||||
virtual ~RegistryValueImpl();
|
||||
|
||||
|
||||
//#################################
|
||||
// Query
|
||||
//#################################
|
||||
|
||||
|
||||
/** Returns the name of the value
|
||||
*/
|
||||
std::wstring GetName() const;
|
||||
|
||||
/** Return the size of data held
|
||||
*/
|
||||
size_t GetDataSize() const;
|
||||
|
||||
/** Get a pointer to the data buffer
|
||||
in order to copy the data
|
||||
*/
|
||||
const void* GetDataBuffer() const;
|
||||
|
||||
/** Returns the data as unicode string
|
||||
|
||||
@precond GetType = STRING
|
||||
*/
|
||||
std::wstring GetDataAsUniString() const;
|
||||
|
||||
/** Returns the data as ansi string
|
||||
|
||||
@precond GetType = STRING
|
||||
*/
|
||||
std::string GetDataAsAnsiString() const;
|
||||
|
||||
/** Returns the data as number
|
||||
|
||||
@precond GetType = NUMBER
|
||||
*/
|
||||
int GetDataAsInt() const;
|
||||
|
||||
/** Returns the type of the data
|
||||
*/
|
||||
int GetType() const;
|
||||
|
||||
//#################################
|
||||
// Command
|
||||
//#################################
|
||||
|
||||
|
||||
/** Set a new name
|
||||
*/
|
||||
void SetName(const std::wstring& NewName);
|
||||
|
||||
/**
|
||||
*/
|
||||
void SetValue(const std::wstring& NewValue);
|
||||
|
||||
/**
|
||||
*/
|
||||
void SetValue(const std::string& NewValue);
|
||||
|
||||
/**
|
||||
*/
|
||||
void SetValue(int NewValue);
|
||||
|
||||
//#################################
|
||||
// Private data
|
||||
//#################################
|
||||
|
||||
private:
|
||||
std::wstring m_Name;
|
||||
int m_Type;
|
||||
std::wstring m_StringData;
|
||||
int m_IntData;
|
||||
};
|
||||
|
||||
|
||||
typedef std::auto_ptr<RegistryValueImpl> RegistryValue;
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|
@@ -1,538 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
/*************************************************************************
|
||||
*
|
||||
* 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 "registryw9x.hxx"
|
||||
|
||||
#include <windows.h>
|
||||
#include <malloc.h>
|
||||
#include "registryvalueimpl.hxx"
|
||||
#include "registryexception.hxx"
|
||||
#include "stringconverter.hxx"
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(disable : 4786 4350)
|
||||
#endif
|
||||
|
||||
const size_t MAX_TMP_BUFF_SIZE = 1024 * sizeof(wchar_t);
|
||||
|
||||
|
||||
//############################################
|
||||
// Creation
|
||||
// only possible through WindowsRegistry class
|
||||
//############################################
|
||||
|
||||
|
||||
//-----------------------------------------------------
|
||||
/** Create instance and open the specified Registry key
|
||||
*/
|
||||
RegistryKeyImplWin9x::RegistryKeyImplWin9x(HKEY RootKey, const std::wstring& KeyName) :
|
||||
RegistryKeyImpl(RootKey, KeyName)
|
||||
{
|
||||
}
|
||||
|
||||
//-----------------------------------------------------
|
||||
/** Create instance and open the specified Registry key
|
||||
*/
|
||||
RegistryKeyImplWin9x::RegistryKeyImplWin9x(HKEY RootKey) :
|
||||
RegistryKeyImpl(RootKey)
|
||||
{
|
||||
}
|
||||
|
||||
//-----------------------------------------------------
|
||||
/** Create an instances of the specified Registry key,
|
||||
the key is assumed to be already opened.
|
||||
*/
|
||||
RegistryKeyImplWin9x::RegistryKeyImplWin9x(HKEY RootKey, HKEY SubKey, const std::wstring& KeyName, bool Writeable) :
|
||||
RegistryKeyImpl(RootKey, SubKey, KeyName, Writeable)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
//############################################
|
||||
// Queries
|
||||
//############################################
|
||||
|
||||
|
||||
//-----------------------------------------------------
|
||||
/** The number of sub values of the key at hand
|
||||
|
||||
@precond IsOpen = true
|
||||
|
||||
@throws
|
||||
*/
|
||||
size_t RegistryKeyImplWin9x::GetSubValueCount() const
|
||||
{
|
||||
assert(IsOpen());
|
||||
|
||||
DWORD nSubValues = 0;
|
||||
|
||||
LONG rc = RegQueryInfoKeyA(
|
||||
m_hSubKey,
|
||||
0, 0, 0, 0, 0, 0, &nSubValues, 0, 0, 0, 0);
|
||||
|
||||
if (ERROR_INVALID_HANDLE == rc)
|
||||
throw RegistryIOException(rc);
|
||||
else if (ERROR_SUCCESS != rc)
|
||||
throw RegistryException(rc);
|
||||
|
||||
return nSubValues;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------
|
||||
/** The number of sub-keys of the key at hand
|
||||
|
||||
@precond IsOpen = true
|
||||
|
||||
@throws
|
||||
*/
|
||||
size_t RegistryKeyImplWin9x::GetSubKeyCount() const
|
||||
{
|
||||
assert(IsOpen());
|
||||
|
||||
DWORD nSubKeys = 0;
|
||||
|
||||
LONG rc = RegQueryInfoKeyA(
|
||||
m_hSubKey,
|
||||
0, 0, 0, &nSubKeys, 0, 0, 0, 0, 0, 0, 0);
|
||||
|
||||
if (ERROR_INVALID_HANDLE == rc)
|
||||
throw RegistryIOException(rc);
|
||||
else if (ERROR_SUCCESS != rc)
|
||||
throw RegistryException(rc);
|
||||
|
||||
return nSubKeys;
|
||||
}
|
||||
|
||||
StringListPtr RegistryKeyImplWin9x::GetSubKeyNames() const
|
||||
{
|
||||
assert(IsOpen());
|
||||
|
||||
char buff[1024];
|
||||
DWORD buff_size = sizeof(buff);
|
||||
FILETIME ftime;
|
||||
|
||||
StringList* key_names = new StringList();
|
||||
|
||||
LONG rc = ERROR_SUCCESS;
|
||||
|
||||
for (DWORD i = 0; /* left empty */; i++)
|
||||
{
|
||||
rc = RegEnumKeyExA(
|
||||
m_hSubKey, i, buff, &buff_size,
|
||||
0, 0, 0, &ftime);
|
||||
|
||||
if (ERROR_SUCCESS != rc &&
|
||||
ERROR_MORE_DATA != rc)
|
||||
break;
|
||||
|
||||
buff_size = sizeof(buff);
|
||||
|
||||
key_names->push_back(AnsiToUnicodeString(buff));
|
||||
}
|
||||
|
||||
if (ERROR_INVALID_HANDLE == rc)
|
||||
throw RegistryIOException(rc);
|
||||
else if (ERROR_NO_MORE_ITEMS != rc && ERROR_SUCCESS != rc)
|
||||
throw RegistryException(rc);
|
||||
|
||||
return (StringListPtr) key_names;
|
||||
}
|
||||
|
||||
StringListPtr RegistryKeyImplWin9x::GetSubValueNames() const
|
||||
{
|
||||
assert(IsOpen());
|
||||
|
||||
char buff[1024];
|
||||
DWORD buff_size = sizeof(buff);
|
||||
|
||||
StringList* value_names = new StringList();
|
||||
|
||||
LONG rc = ERROR_SUCCESS;
|
||||
|
||||
for (DWORD i = 0; /* left empty */; i++)
|
||||
{
|
||||
rc = RegEnumValueA(
|
||||
m_hSubKey, i, buff, &buff_size,
|
||||
0, 0, 0, 0);
|
||||
|
||||
if (ERROR_SUCCESS != rc &&
|
||||
ERROR_MORE_DATA != rc)
|
||||
break;
|
||||
|
||||
buff_size = sizeof(buff);
|
||||
|
||||
value_names->push_back(AnsiToUnicodeString(buff));
|
||||
}
|
||||
|
||||
if (ERROR_INVALID_HANDLE == rc)
|
||||
throw RegistryIOException(rc);
|
||||
else if (ERROR_NO_MORE_ITEMS != rc && ERROR_SUCCESS != rc)
|
||||
throw RegistryException(rc);
|
||||
|
||||
return (StringListPtr) value_names;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------
|
||||
/** Get the specified registry value
|
||||
|
||||
@precond IsOpen = true
|
||||
*/
|
||||
RegistryValue RegistryKeyImplWin9x::GetValue(const std::wstring& Name) const
|
||||
{
|
||||
assert(IsOpen());
|
||||
|
||||
DWORD Type;
|
||||
char buff[MAX_TMP_BUFF_SIZE];
|
||||
DWORD size = sizeof(buff);
|
||||
|
||||
LONG rc = RegQueryValueExA(
|
||||
m_hSubKey,
|
||||
UnicodeToAnsiString(Name).c_str(),
|
||||
0,
|
||||
&Type,
|
||||
reinterpret_cast<LPBYTE>(buff),
|
||||
&size);
|
||||
|
||||
if (ERROR_FILE_NOT_FOUND == rc)
|
||||
throw RegistryValueNotFoundException(rc);
|
||||
else if (ERROR_ACCESS_DENIED == rc)
|
||||
throw RegistryAccessDeniedException(rc);
|
||||
else if (ERROR_SUCCESS != rc)
|
||||
throw RegistryException(rc);
|
||||
|
||||
RegistryValue regval;
|
||||
|
||||
if (REG_DWORD == Type)
|
||||
{
|
||||
regval = RegistryValue(new RegistryValueImpl(Name, *(reinterpret_cast<int*>(buff))));
|
||||
}
|
||||
else if (REG_SZ == Type || REG_EXPAND_SZ == Type || REG_MULTI_SZ == Type)
|
||||
{
|
||||
if (size > 0)
|
||||
regval = RegistryValue(new RegistryValueImpl(Name, std::string(reinterpret_cast<char*>(buff))));
|
||||
else
|
||||
regval = RegistryValue(new RegistryValueImpl(Name, std::string()));
|
||||
}
|
||||
else
|
||||
{
|
||||
assert(false);
|
||||
}
|
||||
|
||||
return regval;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------
|
||||
/** Get the specified registry value, return the given
|
||||
default value if value not found
|
||||
|
||||
@precond IsOpen = true
|
||||
*/
|
||||
RegistryValue RegistryKeyImplWin9x::GetValue(const std::wstring& Name, const RegistryValue& Default) const
|
||||
{
|
||||
assert(IsOpen());
|
||||
|
||||
DWORD Type;
|
||||
char buff[MAX_TMP_BUFF_SIZE];
|
||||
DWORD size = sizeof(buff);
|
||||
|
||||
LONG rc = RegQueryValueExA(
|
||||
m_hSubKey,
|
||||
UnicodeToAnsiString(Name).c_str(),
|
||||
0,
|
||||
&Type,
|
||||
reinterpret_cast<LPBYTE>(buff),
|
||||
&size);
|
||||
|
||||
if (ERROR_FILE_NOT_FOUND == rc)
|
||||
{
|
||||
#if !defined(__MINGW32__) && (_MSC_VER < 1300)
|
||||
return Default;
|
||||
#else
|
||||
RegistryValue regval_ptr;
|
||||
regval_ptr = RegistryValue(new RegistryValueImpl(*Default));
|
||||
return regval_ptr;
|
||||
#endif
|
||||
}
|
||||
|
||||
if (ERROR_ACCESS_DENIED == rc)
|
||||
throw RegistryAccessDeniedException(rc);
|
||||
else if (ERROR_SUCCESS != rc)
|
||||
throw RegistryException(rc);
|
||||
|
||||
RegistryValue regval;
|
||||
|
||||
if (REG_DWORD == Type)
|
||||
regval = RegistryValue(new RegistryValueImpl(Name, *reinterpret_cast<int*>(buff)));
|
||||
else if (REG_SZ == Type || REG_EXPAND_SZ == Type || REG_MULTI_SZ == Type)
|
||||
regval = RegistryValue(new RegistryValueImpl(Name, std::string(reinterpret_cast<char*>(buff))));
|
||||
else
|
||||
assert(false);
|
||||
|
||||
return regval;
|
||||
}
|
||||
|
||||
|
||||
//############################################
|
||||
// Commands
|
||||
//############################################
|
||||
|
||||
|
||||
//-----------------------------------------------------
|
||||
/** Open the registry key, has no effect if
|
||||
the key is already open
|
||||
|
||||
@precond IsOpen = false
|
||||
|
||||
@throws RegistryKeyNotFoundException
|
||||
RegistryWriteAccessDenyException
|
||||
RegistryAccessDenyException
|
||||
*/
|
||||
void RegistryKeyImplWin9x::Open(bool Writeable)
|
||||
{
|
||||
assert(!IsOpen());
|
||||
|
||||
REGSAM regsam = KEY_READ;
|
||||
|
||||
if (Writeable)
|
||||
regsam |= KEY_WRITE;
|
||||
|
||||
LONG rc = RegOpenKeyExA(
|
||||
m_hRootKey,
|
||||
UnicodeToAnsiString(m_KeyName).c_str(),
|
||||
0,
|
||||
regsam,
|
||||
&m_hSubKey);
|
||||
|
||||
if (ERROR_FILE_NOT_FOUND == rc)
|
||||
throw RegistryKeyNotFoundException(rc);
|
||||
else if (ERROR_ACCESS_DENIED == rc)
|
||||
throw RegistryAccessDeniedException(rc);
|
||||
else if (ERROR_SUCCESS != rc)
|
||||
throw RegistryException(rc);
|
||||
|
||||
m_IsWriteable = Writeable;
|
||||
|
||||
assert(IsOpen());
|
||||
}
|
||||
|
||||
//-----------------------------------------------------
|
||||
/** Open the specified sub-key of the registry key
|
||||
at hand
|
||||
|
||||
@precond IsOpen = true
|
||||
HasSubKey(Name) = true
|
||||
|
||||
@throws RegistryIOException
|
||||
RegistryKeyNotFoundException
|
||||
RegistryAccessDeniedException
|
||||
*/
|
||||
RegistryKey RegistryKeyImplWin9x::OpenSubKey(const std::wstring& Name, bool Writeable)
|
||||
{
|
||||
RegistryKey regkey(new RegistryKeyImplWin9x(m_hSubKey, Name));
|
||||
regkey->Open(Writeable);
|
||||
return regkey;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------
|
||||
/** Creates a new sub-key below the key at hand
|
||||
|
||||
@precond IsOpen = true
|
||||
IsWriteable = true
|
||||
|
||||
@throws RegistryIOException
|
||||
RegistryWriteAccessDenyException
|
||||
*/
|
||||
|
||||
RegistryKey RegistryKeyImplWin9x::CreateSubKey(const std::wstring& Name)
|
||||
{
|
||||
assert(IsOpen());
|
||||
assert(IsWriteable());
|
||||
|
||||
HKEY hRoot = IsRootKey() ? m_hRootKey : m_hSubKey;
|
||||
|
||||
HKEY hKey;
|
||||
|
||||
LONG rc = RegCreateKeyExA(
|
||||
hRoot,
|
||||
UnicodeToAnsiString(Name).c_str(),
|
||||
0,
|
||||
0,
|
||||
REG_OPTION_NON_VOLATILE,
|
||||
KEY_READ | KEY_WRITE,
|
||||
0,
|
||||
&hKey,
|
||||
0);
|
||||
|
||||
if (ERROR_INVALID_HANDLE == rc)
|
||||
throw RegistryIOException(rc);
|
||||
else if (ERROR_ACCESS_DENIED == rc)
|
||||
throw RegistryAccessDeniedException(rc);
|
||||
else if (ERROR_SUCCESS != rc)
|
||||
throw RegistryException(rc);
|
||||
|
||||
return RegistryKey(new RegistryKeyImplWin9x(hRoot, hKey, Name));
|
||||
}
|
||||
|
||||
//-----------------------------------------------------
|
||||
/** Deletes a sub-key below the key at hand, the
|
||||
key must not have sub-keys
|
||||
|
||||
@precond IsOpen = true
|
||||
IsWriteable = true
|
||||
|
||||
@throws RegistryIOException
|
||||
RegistryWriteAccessDenyException
|
||||
*/
|
||||
void RegistryKeyImplWin9x::DeleteSubKey(const std::wstring& Name)
|
||||
{
|
||||
assert(IsOpen());
|
||||
assert(IsWriteable());
|
||||
assert(HasSubKey(Name));
|
||||
|
||||
RegistryKey SubKey = OpenSubKey(Name);
|
||||
|
||||
size_t nSubKeyCount = SubKey->GetSubKeyCount();
|
||||
|
||||
assert(0 == nSubKeyCount);
|
||||
|
||||
if (nSubKeyCount)
|
||||
throw RegistryInvalidOperationException(ERROR_NOT_SUPPORTED);
|
||||
|
||||
LONG rc = RegDeleteKeyA(m_hSubKey, UnicodeToAnsiString(Name).c_str());
|
||||
|
||||
if (ERROR_INVALID_HANDLE == rc)
|
||||
throw RegistryIOException(rc);
|
||||
else if (ERROR_ACCESS_DENIED == rc)
|
||||
throw RegistryAccessDeniedException(rc);
|
||||
else if (ERROR_SUCCESS != rc)
|
||||
throw RegistryException(rc);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------
|
||||
/** Deletes a sub-key below the key at hand with all
|
||||
its sub-keys
|
||||
|
||||
@precond IsOpen = true
|
||||
IsWriteable = true;
|
||||
|
||||
@throws RegistryIOException
|
||||
RegistryWriteAccessDenyException
|
||||
*/
|
||||
void RegistryKeyImplWin9x::DeleteSubKeyTree(const std::wstring& Name)
|
||||
{
|
||||
LONG rc = RegDeleteKeyA(m_hSubKey, UnicodeToAnsiString(Name).c_str());
|
||||
|
||||
if (ERROR_INVALID_HANDLE == rc)
|
||||
throw RegistryIOException(rc);
|
||||
else if (ERROR_ACCESS_DENIED == rc)
|
||||
throw RegistryAccessDeniedException(rc);
|
||||
else if (ERROR_SUCCESS != rc)
|
||||
throw RegistryException(rc);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------
|
||||
/** Delete the specified value
|
||||
|
||||
@precond IsOpen = true
|
||||
IsWriteable = true
|
||||
HasValue(Name) = true
|
||||
|
||||
@throws RegistryIOException
|
||||
RegistryWriteAccessDeniedException
|
||||
RegistryValueNotFoundException
|
||||
*/
|
||||
void RegistryKeyImplWin9x::DeleteValue(const std::wstring& Name)
|
||||
{
|
||||
assert(IsOpen());
|
||||
assert(HasValue(Name));
|
||||
assert(IsWriteable());
|
||||
|
||||
LONG rc = RegDeleteValueA(
|
||||
m_hSubKey,
|
||||
UnicodeToAnsiString(Name).c_str());
|
||||
|
||||
if (ERROR_INVALID_HANDLE == rc)
|
||||
throw RegistryIOException(rc);
|
||||
else if (ERROR_ACCESS_DENIED == rc)
|
||||
throw RegistryNoWriteAccessException(rc);
|
||||
else if (ERROR_FILE_NOT_FOUND == rc)
|
||||
throw RegistryValueNotFoundException(rc);
|
||||
else if (ERROR_SUCCESS != rc)
|
||||
throw RegistryException(rc);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------
|
||||
/** Set the specified registry value
|
||||
|
||||
@precond IsOpen = true
|
||||
IsWriteable = true
|
||||
|
||||
@throws RegistryIOException
|
||||
RegistryWriteAccessDenyException
|
||||
*/
|
||||
void RegistryKeyImplWin9x::SetValue(const RegistryValue& Value)
|
||||
{
|
||||
assert(IsOpen());
|
||||
assert(IsWriteable());
|
||||
|
||||
LONG rc = ERROR_SUCCESS;
|
||||
|
||||
if (REG_SZ == Value->GetType())
|
||||
{
|
||||
std::string AnsiStr = Value->GetDataAsAnsiString();
|
||||
|
||||
rc = RegSetValueExA(
|
||||
m_hSubKey,
|
||||
UnicodeToAnsiString(Value->GetName()).c_str(),
|
||||
0,
|
||||
Value->GetType(),
|
||||
reinterpret_cast<const unsigned char*>(AnsiStr.c_str()),
|
||||
static_cast<DWORD>((AnsiStr.length() + 1)));
|
||||
}
|
||||
else
|
||||
{
|
||||
rc = RegSetValueExA(
|
||||
m_hSubKey,
|
||||
UnicodeToAnsiString(Value->GetName()).c_str(),
|
||||
0,
|
||||
Value->GetType(),
|
||||
reinterpret_cast<const unsigned char*>(Value->GetDataBuffer()),
|
||||
static_cast<DWORD>(Value->GetDataSize()));
|
||||
}
|
||||
|
||||
if (ERROR_INVALID_HANDLE == rc)
|
||||
throw RegistryIOException(rc);
|
||||
else if (ERROR_ACCESS_DENIED == rc)
|
||||
throw RegistryAccessDeniedException(rc);
|
||||
else if (ERROR_SUCCESS != rc)
|
||||
throw RegistryException(rc);
|
||||
}
|
||||
|
||||
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|
@@ -1,201 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
/*************************************************************************
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
************************************************************************/
|
||||
|
||||
#ifndef _REGISTRYW9X_HXX_
|
||||
#define _REGISTRYW9X_HXX_
|
||||
|
||||
#include "registry.hxx"
|
||||
|
||||
//---------------------------------------
|
||||
// constants
|
||||
//---------------------------------------
|
||||
|
||||
class RegistryKeyImplWin9x : public RegistryKeyImpl
|
||||
{
|
||||
public:
|
||||
|
||||
//############################################
|
||||
// Queries
|
||||
//############################################
|
||||
|
||||
/** The number of sub values of the key at hand
|
||||
|
||||
@precond IsOpen = true
|
||||
|
||||
@throws
|
||||
*/
|
||||
virtual size_t GetSubValueCount() const;
|
||||
|
||||
/** The number of sub-keys of the key at hand
|
||||
|
||||
@precond IsOpen = true
|
||||
|
||||
@throws
|
||||
*/
|
||||
virtual size_t GetSubKeyCount() const;
|
||||
|
||||
virtual StringListPtr GetSubKeyNames() const;
|
||||
|
||||
virtual StringListPtr GetSubValueNames() const;
|
||||
|
||||
/** Get the specified registry value
|
||||
|
||||
@precond IsOpen = true
|
||||
*/
|
||||
virtual RegistryValue GetValue(const std::wstring& Name) const;
|
||||
|
||||
/** Get the specified registry value, return the given
|
||||
default value if value not found
|
||||
|
||||
@precond IsOpen = true
|
||||
*/
|
||||
virtual RegistryValue GetValue(const std::wstring& Name, const RegistryValue& Default) const;
|
||||
|
||||
//############################################
|
||||
// Commands
|
||||
//############################################
|
||||
|
||||
/** Open the registry key, has no effect if
|
||||
the key is already open
|
||||
|
||||
@precond IsOpen = false
|
||||
|
||||
@throws RegistryWriteAccessDenyException
|
||||
RegistryAccessDenyException
|
||||
*/
|
||||
virtual void Open(bool Writeable = true);
|
||||
|
||||
/** Open the specified sub-key of the registry key
|
||||
at hand
|
||||
|
||||
@precond IsOpen = true
|
||||
HasSubKey(Name) = true
|
||||
|
||||
@throws RegistryIOException
|
||||
RegistryKeyNotFoundException
|
||||
RegistryAccessDeniedException
|
||||
*/
|
||||
virtual RegistryKey OpenSubKey(const std::wstring& Name, bool Writeable = true);
|
||||
|
||||
/** Creates a new sub-key below the key at hand
|
||||
|
||||
@precond IsOpen = true
|
||||
IsWriteable = true
|
||||
|
||||
@throws RegistryIOException
|
||||
RegistryWriteAccessDenyException
|
||||
*/
|
||||
virtual RegistryKey CreateSubKey(const std::wstring& Name);
|
||||
|
||||
/** Deletes a sub-key below the key at hand, the
|
||||
key must not have sub-keys
|
||||
|
||||
@precond IsOpen = true
|
||||
IsWriteable = true
|
||||
|
||||
@throws RegistryIOException
|
||||
RegistryWriteAccessDenyException
|
||||
*/
|
||||
virtual void DeleteSubKey(const std::wstring& Name);
|
||||
|
||||
/** Deletes a sub-key below the key at hand with all
|
||||
its sub-keys
|
||||
|
||||
@precond IsOpen = true
|
||||
IsWriteable = true;
|
||||
|
||||
@throws RegistryIOException
|
||||
RegistryWriteAccessDenyException
|
||||
*/
|
||||
virtual void DeleteSubKeyTree(const std::wstring& Name);
|
||||
|
||||
/** Delete the specified value
|
||||
|
||||
@precond IsOpen = true
|
||||
IsWriteable = true
|
||||
HasValue(Name) = true
|
||||
|
||||
@throws RegistryIOException
|
||||
RegistryWriteAccessDeniedException
|
||||
RegistryValueNotFoundException
|
||||
*/
|
||||
virtual void DeleteValue(const std::wstring& Name);
|
||||
|
||||
/** Set the specified registry value
|
||||
|
||||
@precond IsOpen = true
|
||||
IsWriteable = true
|
||||
|
||||
@throws RegistryIOException
|
||||
RegistryWriteAccessDenyException
|
||||
*/
|
||||
virtual void SetValue(const RegistryValue& Value);
|
||||
|
||||
//############################################
|
||||
// Creation
|
||||
//
|
||||
// only possible through WindowsRegistry class
|
||||
//############################################
|
||||
|
||||
protected:
|
||||
/** Create instance and open the specified Registry key
|
||||
|
||||
@throws RegistryWriteAccessDenyException
|
||||
RegistryAccessDenyException
|
||||
RegistryKeyNotFoundException
|
||||
*/
|
||||
RegistryKeyImplWin9x(HKEY RootKey, const std::wstring& KeyName);
|
||||
|
||||
/** Create instance and open the specified Registry key
|
||||
|
||||
@throws RegistryWriteAccessDenyException
|
||||
RegistryAccessDenyException
|
||||
RegistryKeyNotFoundException
|
||||
*/
|
||||
RegistryKeyImplWin9x(HKEY RootKey);
|
||||
|
||||
/** Create an instances of the specified Registry key,
|
||||
the key is assumed to be already opened.
|
||||
*/
|
||||
RegistryKeyImplWin9x(HKEY RootKey, HKEY SubKey, const std::wstring& KeyName, bool Writeable = true);
|
||||
|
||||
// prevent copy/assignment
|
||||
private:
|
||||
RegistryKeyImplWin9x(const RegistryKeyImplWin9x&);
|
||||
RegistryKeyImplWin9x& operator=(const RegistryKeyImplWin9x&);
|
||||
|
||||
//######################################
|
||||
// Friend declarations
|
||||
//######################################
|
||||
|
||||
friend class WindowsRegistry;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|
@@ -1,607 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
/*************************************************************************
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
************************************************************************/
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(push, 1) /* disable warnings within system headers */
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(pop)
|
||||
#endif
|
||||
|
||||
#include <malloc.h>
|
||||
#include "registrywnt.hxx"
|
||||
#include "registryvalueimpl.hxx"
|
||||
#include "registryexception.hxx"
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(disable : 4786 4350)
|
||||
#endif
|
||||
|
||||
const size_t MAX_TMP_BUFF_SIZE = 1024 * sizeof(wchar_t);
|
||||
|
||||
|
||||
//############################################
|
||||
// Creation
|
||||
// only possible through WindowsRegistry class
|
||||
//############################################
|
||||
|
||||
|
||||
//-----------------------------------------------------
|
||||
/** Create instance and open the specified Registry key
|
||||
*/
|
||||
RegistryKeyImplWinNT::RegistryKeyImplWinNT(HKEY RootKey, const std::wstring& KeyName) :
|
||||
RegistryKeyImpl(RootKey, KeyName)
|
||||
{
|
||||
}
|
||||
|
||||
//-----------------------------------------------------
|
||||
/** Create instance and open the specified Registry key
|
||||
*/
|
||||
RegistryKeyImplWinNT::RegistryKeyImplWinNT(HKEY RootKey) :
|
||||
RegistryKeyImpl(RootKey)
|
||||
{
|
||||
}
|
||||
|
||||
//-----------------------------------------------------
|
||||
/** Create an instances of the specified Registry key,
|
||||
the key is assumed to be already opened.
|
||||
*/
|
||||
RegistryKeyImplWinNT::RegistryKeyImplWinNT(HKEY RootKey, HKEY SubKey, const std::wstring& KeyName, bool Writeable) :
|
||||
RegistryKeyImpl(RootKey, SubKey, KeyName, Writeable)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
//############################################
|
||||
// Queries
|
||||
//############################################
|
||||
|
||||
|
||||
//-----------------------------------------------------
|
||||
/** The number of sub values of the key at hand
|
||||
|
||||
@precond IsOpen = true
|
||||
|
||||
@throws
|
||||
*/
|
||||
size_t RegistryKeyImplWinNT::GetSubValueCount() const
|
||||
{
|
||||
assert(IsOpen());
|
||||
|
||||
DWORD nSubValues = 0;
|
||||
|
||||
LONG rc = RegQueryInfoKeyW(
|
||||
m_hSubKey,
|
||||
0, 0, 0, 0, 0, 0, &nSubValues, 0, 0, 0, 0);
|
||||
|
||||
if (ERROR_INVALID_HANDLE == rc)
|
||||
throw RegistryIOException(rc);
|
||||
else if (ERROR_SUCCESS != rc)
|
||||
throw RegistryException(rc);
|
||||
|
||||
return nSubValues;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------
|
||||
/** The number of sub-keys of the key at hand
|
||||
|
||||
@precond IsOpen = true
|
||||
|
||||
@throws
|
||||
*/
|
||||
size_t RegistryKeyImplWinNT::GetSubKeyCount() const
|
||||
{
|
||||
assert(IsOpen());
|
||||
|
||||
DWORD nSubKeys = 0;
|
||||
|
||||
LONG rc = RegQueryInfoKeyA(
|
||||
m_hSubKey,
|
||||
0, 0, 0, &nSubKeys, 0, 0, 0, 0, 0, 0, 0);
|
||||
|
||||
if (ERROR_INVALID_HANDLE == rc)
|
||||
throw RegistryIOException(rc);
|
||||
else if (ERROR_SUCCESS != rc)
|
||||
throw RegistryException(rc);
|
||||
|
||||
return nSubKeys;
|
||||
}
|
||||
|
||||
StringListPtr RegistryKeyImplWinNT::GetSubKeyNames() const
|
||||
{
|
||||
assert(IsOpen());
|
||||
|
||||
wchar_t buff[1024];
|
||||
DWORD buff_size = sizeof(buff);
|
||||
FILETIME ftime;
|
||||
|
||||
StringList* key_names = new StringList();
|
||||
|
||||
LONG rc = ERROR_SUCCESS;
|
||||
|
||||
for (DWORD i = 0; /* left empty */; i++)
|
||||
{
|
||||
rc = RegEnumKeyExW(
|
||||
m_hSubKey, i, buff, &buff_size,
|
||||
0, 0, 0, &ftime);
|
||||
|
||||
if (ERROR_SUCCESS != rc &&
|
||||
ERROR_MORE_DATA != rc)
|
||||
break;
|
||||
|
||||
buff_size = sizeof(buff);
|
||||
|
||||
key_names->push_back(buff);
|
||||
}
|
||||
|
||||
if (ERROR_INVALID_HANDLE == rc)
|
||||
throw RegistryIOException(rc);
|
||||
else if (ERROR_NO_MORE_ITEMS != rc && ERROR_SUCCESS != rc)
|
||||
throw RegistryException(rc);
|
||||
|
||||
#if (_MSC_VER < 1300) && !defined(__MINGW32__)
|
||||
return key_names;
|
||||
#else
|
||||
return (StringListPtr) key_names;
|
||||
#endif
|
||||
}
|
||||
|
||||
StringListPtr RegistryKeyImplWinNT::GetSubValueNames() const
|
||||
{
|
||||
assert(IsOpen());
|
||||
|
||||
wchar_t buff[1024];
|
||||
DWORD buff_size = sizeof(buff);
|
||||
|
||||
StringList* value_names = new StringList();
|
||||
|
||||
LONG rc = ERROR_SUCCESS;
|
||||
|
||||
for (DWORD i = 0; /* left empty */; i++)
|
||||
{
|
||||
rc = RegEnumValueW(
|
||||
m_hSubKey, i, buff, &buff_size,
|
||||
0, 0, 0, 0);
|
||||
|
||||
if (ERROR_SUCCESS != rc &&
|
||||
ERROR_MORE_DATA != rc)
|
||||
break;
|
||||
|
||||
buff_size = sizeof(buff);
|
||||
|
||||
value_names->push_back(buff);
|
||||
}
|
||||
|
||||
if (ERROR_INVALID_HANDLE == rc)
|
||||
throw RegistryIOException(rc);
|
||||
else if (ERROR_NO_MORE_ITEMS != rc && ERROR_SUCCESS != rc)
|
||||
throw RegistryException(rc);
|
||||
|
||||
#if (_MSC_VER < 1300) && !defined(__MINGW32__)
|
||||
return value_names;
|
||||
#else
|
||||
return (StringListPtr) value_names;
|
||||
#endif
|
||||
}
|
||||
|
||||
//-----------------------------------------------------
|
||||
/** Get the specified registry value
|
||||
|
||||
@precond IsOpen = true
|
||||
*/
|
||||
RegistryValue RegistryKeyImplWinNT::GetValue(const std::wstring& Name) const
|
||||
{
|
||||
assert(IsOpen());
|
||||
|
||||
DWORD Type;
|
||||
wchar_t buff[MAX_TMP_BUFF_SIZE];
|
||||
DWORD size = sizeof(buff);
|
||||
|
||||
LONG rc = RegQueryValueExW(
|
||||
m_hSubKey,
|
||||
Name.c_str(),
|
||||
0,
|
||||
&Type,
|
||||
reinterpret_cast<LPBYTE>(buff),
|
||||
&size);
|
||||
|
||||
if (ERROR_FILE_NOT_FOUND == rc)
|
||||
throw RegistryValueNotFoundException(rc);
|
||||
else if (ERROR_ACCESS_DENIED == rc)
|
||||
throw RegistryAccessDeniedException(rc);
|
||||
else if (ERROR_SUCCESS != rc)
|
||||
throw RegistryException(rc);
|
||||
|
||||
RegistryValue regval;
|
||||
|
||||
if (REG_DWORD == Type)
|
||||
{
|
||||
regval = RegistryValue(new RegistryValueImpl(Name, *(reinterpret_cast<int*>(buff))));
|
||||
}
|
||||
else if (REG_SZ == Type || REG_EXPAND_SZ == Type || REG_MULTI_SZ == Type)
|
||||
{
|
||||
if (size > 0)
|
||||
regval = RegistryValue(new RegistryValueImpl(Name, std::wstring(reinterpret_cast<wchar_t*>(buff))));
|
||||
else
|
||||
regval = RegistryValue(new RegistryValueImpl(Name, std::wstring()));
|
||||
}
|
||||
else
|
||||
{
|
||||
assert(false);
|
||||
}
|
||||
|
||||
return regval;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------
|
||||
/** Get the specified registry value, return the given
|
||||
default value if value not found
|
||||
|
||||
@precond IsOpen = true
|
||||
*/
|
||||
RegistryValue RegistryKeyImplWinNT::GetValue(const std::wstring& Name, const RegistryValue& Default) const
|
||||
{
|
||||
assert(IsOpen());
|
||||
|
||||
DWORD Type;
|
||||
wchar_t buff[MAX_TMP_BUFF_SIZE];
|
||||
DWORD size = sizeof(buff);
|
||||
|
||||
LONG rc = RegQueryValueExW(
|
||||
m_hSubKey,
|
||||
Name.c_str(),
|
||||
0,
|
||||
&Type,
|
||||
reinterpret_cast<LPBYTE>(buff),
|
||||
&size);
|
||||
|
||||
if (ERROR_FILE_NOT_FOUND == rc)
|
||||
{
|
||||
#if (_MSC_VER < 1300) && !defined(__MINGW32__)
|
||||
return Default;
|
||||
#else
|
||||
RegistryValue regval_ptr;
|
||||
regval_ptr = RegistryValue(new RegistryValueImpl(*Default));
|
||||
return regval_ptr;
|
||||
#endif
|
||||
}
|
||||
|
||||
if (ERROR_ACCESS_DENIED == rc)
|
||||
throw RegistryAccessDeniedException(rc);
|
||||
else if (ERROR_SUCCESS != rc)
|
||||
throw RegistryException(rc);
|
||||
|
||||
RegistryValue regval;
|
||||
|
||||
if (REG_DWORD == Type)
|
||||
regval = RegistryValue(new RegistryValueImpl(Name, *reinterpret_cast<int*>(buff)));
|
||||
else if (REG_SZ == Type || REG_EXPAND_SZ == Type || REG_MULTI_SZ == Type)
|
||||
regval = RegistryValue(new RegistryValueImpl(Name, std::wstring(reinterpret_cast<wchar_t*>(buff))));
|
||||
else
|
||||
assert(false);
|
||||
|
||||
return regval;
|
||||
}
|
||||
|
||||
|
||||
//############################################
|
||||
// Commands
|
||||
//############################################
|
||||
|
||||
|
||||
//-----------------------------------------------------
|
||||
/** Open the registry key, has no effect if
|
||||
the key is already open
|
||||
|
||||
@precond IsOpen = false
|
||||
|
||||
@throws RegistryKeyNotFoundException
|
||||
RegistryWriteAccessDenyException
|
||||
RegistryAccessDenyException
|
||||
*/
|
||||
void RegistryKeyImplWinNT::Open(bool Writeable)
|
||||
{
|
||||
assert(!IsOpen());
|
||||
|
||||
REGSAM regsam = KEY_READ;
|
||||
|
||||
if (Writeable)
|
||||
regsam |= KEY_WRITE;
|
||||
|
||||
LONG rc = RegOpenKeyExW(
|
||||
m_hRootKey,
|
||||
m_KeyName.c_str(),
|
||||
0,
|
||||
regsam,
|
||||
&m_hSubKey);
|
||||
|
||||
if (ERROR_FILE_NOT_FOUND == rc)
|
||||
throw RegistryKeyNotFoundException(rc);
|
||||
else if (ERROR_ACCESS_DENIED == rc)
|
||||
throw RegistryAccessDeniedException(rc);
|
||||
else if (ERROR_SUCCESS != rc)
|
||||
throw RegistryException(rc);
|
||||
|
||||
m_IsWriteable = Writeable;
|
||||
|
||||
assert(IsOpen());
|
||||
}
|
||||
|
||||
//-----------------------------------------------------
|
||||
/** Open the specified sub-key of the registry key
|
||||
at hand
|
||||
|
||||
@precond IsOpen = true
|
||||
HasSubKey(Name) = true
|
||||
|
||||
@throws RegistryIOException
|
||||
RegistryKeyNotFoundException
|
||||
RegistryAccessDeniedException
|
||||
*/
|
||||
RegistryKey RegistryKeyImplWinNT::OpenSubKey(const std::wstring& Name, bool Writeable)
|
||||
{
|
||||
RegistryKey regkey(new RegistryKeyImplWinNT(m_hSubKey, Name));
|
||||
regkey->Open(Writeable);
|
||||
return regkey;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------
|
||||
/** Creates a new sub-key below the key at hand
|
||||
|
||||
@precond IsOpen = true
|
||||
IsWriteable = true
|
||||
|
||||
@throws RegistryIOException
|
||||
RegistryWriteAccessDenyException
|
||||
*/
|
||||
|
||||
RegistryKey RegistryKeyImplWinNT::CreateSubKey(const std::wstring& Name)
|
||||
{
|
||||
assert(IsOpen());
|
||||
assert(IsWriteable());
|
||||
|
||||
HKEY hRoot = IsRootKey() ? m_hRootKey : m_hSubKey;
|
||||
|
||||
HKEY hKey;
|
||||
|
||||
LONG rc = RegCreateKeyExW(
|
||||
hRoot,
|
||||
Name.c_str(),
|
||||
0,
|
||||
0,
|
||||
REG_OPTION_NON_VOLATILE,
|
||||
KEY_READ | KEY_WRITE,
|
||||
0,
|
||||
&hKey,
|
||||
0);
|
||||
|
||||
if (ERROR_INVALID_HANDLE == rc)
|
||||
throw RegistryIOException(rc);
|
||||
else if (ERROR_ACCESS_DENIED == rc)
|
||||
throw RegistryAccessDeniedException(rc);
|
||||
else if (ERROR_SUCCESS != rc)
|
||||
throw RegistryException(rc);
|
||||
|
||||
return RegistryKey(new RegistryKeyImplWinNT(hRoot, hKey, Name));
|
||||
}
|
||||
|
||||
//-----------------------------------------------------
|
||||
/** Deletes a sub-key below the key at hand, the
|
||||
key must not have sub-keys
|
||||
|
||||
@precond IsOpen = true
|
||||
IsWriteable = true
|
||||
|
||||
@throws RegistryIOException
|
||||
RegistryWriteAccessDenyException
|
||||
*/
|
||||
void RegistryKeyImplWinNT::DeleteSubKey(const std::wstring& Name)
|
||||
{
|
||||
assert(IsOpen());
|
||||
assert(IsWriteable());
|
||||
assert(HasSubKey(Name));
|
||||
|
||||
RegistryKey SubKey = OpenSubKey(Name);
|
||||
|
||||
size_t nSubKeyCount = SubKey->GetSubKeyCount();
|
||||
|
||||
assert(0 == nSubKeyCount);
|
||||
|
||||
if (nSubKeyCount)
|
||||
throw RegistryInvalidOperationException(ERROR_NOT_SUPPORTED);
|
||||
|
||||
LONG rc = RegDeleteKeyW(m_hSubKey, Name.c_str());
|
||||
|
||||
if (ERROR_INVALID_HANDLE == rc)
|
||||
throw RegistryIOException(rc);
|
||||
else if (ERROR_ACCESS_DENIED == rc)
|
||||
throw RegistryAccessDeniedException(rc);
|
||||
else if (ERROR_SUCCESS != rc)
|
||||
throw RegistryException(rc);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------
|
||||
/** Deletes a sub-key below the key at hand with all
|
||||
its sub-keys
|
||||
|
||||
@precond IsOpen = true
|
||||
IsWriteable = true;
|
||||
|
||||
@throws RegistryIOException
|
||||
RegistryWriteAccessDenyException
|
||||
*/
|
||||
void RegistryKeyImplWinNT::DeleteSubKeyTree(const std::wstring& Name)
|
||||
{
|
||||
ImplDeleteSubKeyTree(m_hSubKey, Name);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------
|
||||
/** Deletes a sub-key below the key at hand with all
|
||||
its sub-keys
|
||||
|
||||
@precond IsOpen = true
|
||||
IsWriteable = true;
|
||||
|
||||
@throws RegistryIOException
|
||||
RegistryWriteAccessDenyException
|
||||
*/
|
||||
LONG RegistryKeyImplWinNT::ImplDeleteSubKeyTree(HKEY RootKey, const std::wstring& Name)
|
||||
{
|
||||
assert(IsOpen());
|
||||
|
||||
HKEY hKey;
|
||||
|
||||
LONG rc = RegOpenKeyExW(
|
||||
RootKey,
|
||||
Name.c_str(),
|
||||
0,
|
||||
KEY_READ | DELETE,
|
||||
&hKey);
|
||||
|
||||
if (ERROR_SUCCESS == rc)
|
||||
{
|
||||
wchar_t* lpSubKey;
|
||||
DWORD nMaxSubKeyLen;
|
||||
|
||||
rc = RegQueryInfoKeyW(
|
||||
hKey, 0, 0, 0, 0,
|
||||
&nMaxSubKeyLen,
|
||||
0, 0, 0, 0, 0, 0);
|
||||
|
||||
nMaxSubKeyLen++; // space for trailing '\0'
|
||||
|
||||
lpSubKey = reinterpret_cast<wchar_t*>(
|
||||
_alloca(nMaxSubKeyLen*sizeof(wchar_t)));
|
||||
|
||||
while (ERROR_SUCCESS == rc)
|
||||
{
|
||||
DWORD nLen = nMaxSubKeyLen;
|
||||
|
||||
rc = RegEnumKeyExW(
|
||||
hKey,
|
||||
0, // always index zero
|
||||
lpSubKey,
|
||||
&nLen,
|
||||
0, 0, 0, 0);
|
||||
|
||||
if (ERROR_NO_MORE_ITEMS == rc)
|
||||
{
|
||||
rc = RegDeleteKeyW(RootKey, Name.c_str());
|
||||
break;
|
||||
}
|
||||
else if (rc == ERROR_SUCCESS)
|
||||
{
|
||||
rc = ImplDeleteSubKeyTree(hKey, lpSubKey);
|
||||
}
|
||||
|
||||
} // while
|
||||
|
||||
RegCloseKey(hKey);
|
||||
|
||||
} // if
|
||||
|
||||
if (ERROR_INVALID_HANDLE == rc)
|
||||
throw RegistryIOException(rc);
|
||||
else if (ERROR_ACCESS_DENIED == rc)
|
||||
throw RegistryAccessDeniedException(rc);
|
||||
else if (ERROR_FILE_NOT_FOUND == rc)
|
||||
throw RegistryKeyNotFoundException(rc);
|
||||
else if (ERROR_SUCCESS != rc)
|
||||
throw RegistryException(rc);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------
|
||||
/** Delete the specified value
|
||||
|
||||
@precond IsOpen = true
|
||||
IsWriteable = true
|
||||
HasValue(Name) = true
|
||||
|
||||
@throws RegistryIOException
|
||||
RegistryWriteAccessDeniedException
|
||||
RegistryValueNotFoundException
|
||||
*/
|
||||
void RegistryKeyImplWinNT::DeleteValue(const std::wstring& Name)
|
||||
{
|
||||
assert(IsOpen());
|
||||
assert(HasValue(Name));
|
||||
assert(IsWriteable());
|
||||
|
||||
LONG rc = RegDeleteValueW(
|
||||
m_hSubKey,
|
||||
Name.c_str());
|
||||
|
||||
if (ERROR_INVALID_HANDLE == rc)
|
||||
throw RegistryIOException(rc);
|
||||
else if (ERROR_ACCESS_DENIED == rc)
|
||||
throw RegistryNoWriteAccessException(rc);
|
||||
else if (ERROR_FILE_NOT_FOUND == rc)
|
||||
throw RegistryValueNotFoundException(rc);
|
||||
else if (ERROR_SUCCESS != rc)
|
||||
throw RegistryException(rc);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------
|
||||
/** Set the specified registry value
|
||||
|
||||
@precond IsOpen = true
|
||||
IsWriteable = true
|
||||
|
||||
@throws RegistryIOException
|
||||
RegistryWriteAccessDenyException
|
||||
*/
|
||||
void RegistryKeyImplWinNT::SetValue(const RegistryValue& Value)
|
||||
{
|
||||
assert(IsOpen());
|
||||
assert(IsWriteable());
|
||||
|
||||
LONG rc = RegSetValueExW(
|
||||
m_hSubKey,
|
||||
Value->GetName().c_str(),
|
||||
0,
|
||||
Value->GetType(),
|
||||
reinterpret_cast<const unsigned char*>(Value->GetDataBuffer()),
|
||||
static_cast<DWORD>(Value->GetDataSize()));
|
||||
|
||||
if (ERROR_INVALID_HANDLE == rc)
|
||||
throw RegistryIOException(rc);
|
||||
else if (ERROR_ACCESS_DENIED == rc)
|
||||
throw RegistryAccessDeniedException(rc);
|
||||
else if (ERROR_SUCCESS != rc)
|
||||
throw RegistryException(rc);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|
@@ -1,205 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
/*************************************************************************
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
************************************************************************/
|
||||
|
||||
#ifndef _REGISTRYWNT_HXX_
|
||||
#define _REGISTRYWNT_HXX_
|
||||
|
||||
#include "registry.hxx"
|
||||
|
||||
//---------------------------------------
|
||||
// constants
|
||||
//---------------------------------------
|
||||
|
||||
class RegistryKeyImplWinNT : public RegistryKeyImpl
|
||||
{
|
||||
public:
|
||||
|
||||
//############################################
|
||||
// Queries
|
||||
//############################################
|
||||
|
||||
/** The number of sub values of the key at hand
|
||||
|
||||
@precond IsOpen = true
|
||||
|
||||
@throws
|
||||
*/
|
||||
virtual size_t GetSubValueCount() const;
|
||||
|
||||
/** The number of sub-keys of the key at hand
|
||||
|
||||
@precond IsOpen = true
|
||||
|
||||
@throws
|
||||
*/
|
||||
virtual size_t GetSubKeyCount() const;
|
||||
|
||||
virtual StringListPtr GetSubKeyNames() const;
|
||||
|
||||
virtual StringListPtr GetSubValueNames() const;
|
||||
|
||||
/** Get the specified registry value
|
||||
|
||||
@precond IsOpen = true
|
||||
*/
|
||||
virtual RegistryValue GetValue(const std::wstring& Name) const;
|
||||
|
||||
/** Get the specified registry value, return the given
|
||||
default value if value not found
|
||||
|
||||
@precond IsOpen = true
|
||||
*/
|
||||
virtual RegistryValue GetValue(const std::wstring& Name, const RegistryValue& Default) const;
|
||||
|
||||
//############################################
|
||||
// Commands
|
||||
//############################################
|
||||
|
||||
/** Open the registry key, has no effect if
|
||||
the key is already open
|
||||
|
||||
@precond IsOpen = false
|
||||
|
||||
@throws RegistryWriteAccessDenyException
|
||||
RegistryAccessDenyException
|
||||
*/
|
||||
virtual void Open(bool Writeable = true);
|
||||
|
||||
/** Open the specified sub-key of the registry key
|
||||
at hand
|
||||
|
||||
@precond IsOpen = true
|
||||
HasSubKey(Name) = true
|
||||
|
||||
@throws RegistryIOException
|
||||
RegistryKeyNotFoundException
|
||||
RegistryAccessDeniedException
|
||||
*/
|
||||
virtual RegistryKey OpenSubKey(const std::wstring& Name, bool Writeable = true);
|
||||
|
||||
/** Creates a new sub-key below the key at hand
|
||||
|
||||
@precond IsOpen = true
|
||||
IsWriteable = true
|
||||
|
||||
@throws RegistryIOException
|
||||
RegistryWriteAccessDenyException
|
||||
*/
|
||||
virtual RegistryKey CreateSubKey(const std::wstring& Name);
|
||||
|
||||
/** Deletes a sub-key below the key at hand, the
|
||||
key must not have sub-keys
|
||||
|
||||
@precond IsOpen = true
|
||||
IsWriteable = true
|
||||
|
||||
@throws RegistryIOException
|
||||
RegistryWriteAccessDenyException
|
||||
*/
|
||||
virtual void DeleteSubKey(const std::wstring& Name);
|
||||
|
||||
/** Deletes a sub-key below the key at hand with all
|
||||
its sub-keys
|
||||
|
||||
@precond IsOpen = true
|
||||
IsWriteable = true;
|
||||
|
||||
@throws RegistryIOException
|
||||
RegistryWriteAccessDenyException
|
||||
*/
|
||||
virtual void DeleteSubKeyTree(const std::wstring& Name);
|
||||
|
||||
/** Delete the specified value
|
||||
|
||||
@precond IsOpen = true
|
||||
IsWriteable = true
|
||||
HasValue(Name) = true
|
||||
|
||||
@throws RegistryIOException
|
||||
RegistryWriteAccessDeniedException
|
||||
RegistryValueNotFoundException
|
||||
*/
|
||||
virtual void DeleteValue(const std::wstring& Name);
|
||||
|
||||
/** Set the specified registry value
|
||||
|
||||
@precond IsOpen = true
|
||||
IsWriteable = true
|
||||
|
||||
@throws RegistryIOException
|
||||
RegistryWriteAccessDenyException
|
||||
*/
|
||||
virtual void SetValue(const RegistryValue& Value);
|
||||
|
||||
//############################################
|
||||
// Creation
|
||||
//
|
||||
// only possible through WindowsRegistry class
|
||||
//############################################
|
||||
|
||||
protected:
|
||||
/** Create instance and open the specified Registry key
|
||||
|
||||
@throws RegistryWriteAccessDenyException
|
||||
RegistryAccessDenyException
|
||||
RegistryKeyNotFoundException
|
||||
*/
|
||||
RegistryKeyImplWinNT(HKEY RootKey, const std::wstring& KeyName);
|
||||
|
||||
/** Create instance and open the specified Registry key
|
||||
|
||||
@throws RegistryWriteAccessDenyException
|
||||
RegistryAccessDenyException
|
||||
RegistryKeyNotFoundException
|
||||
*/
|
||||
RegistryKeyImplWinNT(HKEY RootKey);
|
||||
|
||||
/** Create an instances of the specified Registry key,
|
||||
the key is assumed to be already opened.
|
||||
*/
|
||||
RegistryKeyImplWinNT(HKEY RootKey, HKEY SubKey, const std::wstring& KeyName, bool Writeable = true);
|
||||
|
||||
private:
|
||||
|
||||
LONG ImplDeleteSubKeyTree(HKEY RootKey, const std::wstring& Name);
|
||||
|
||||
//prevent copy and assignment
|
||||
private:
|
||||
RegistryKeyImplWinNT(const RegistryKeyImplWinNT&);
|
||||
RegistryKeyImplWinNT& operator=(const RegistryKeyImplWinNT&);
|
||||
|
||||
//######################################
|
||||
// Friend declarations
|
||||
//######################################
|
||||
|
||||
friend class WindowsRegistry;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|
@@ -1,72 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
/*************************************************************************
|
||||
*
|
||||
* 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 "stringconverter.hxx"
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(push, 1) /* disable warnings within system headers */
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(pop)
|
||||
#endif
|
||||
|
||||
#include <malloc.h>
|
||||
|
||||
/** Convert a Unicode string to an ANSI string based on CP_ACP
|
||||
*/
|
||||
std::string UnicodeToAnsiString(const std::wstring& UniString)
|
||||
{
|
||||
int len = WideCharToMultiByte(
|
||||
CP_ACP, 0, UniString.c_str(), -1, 0, 0, 0, 0);
|
||||
|
||||
char* buff = reinterpret_cast<char*>(_alloca(len));
|
||||
|
||||
WideCharToMultiByte(
|
||||
CP_ACP, 0, UniString.c_str(), -1, buff, len, 0, 0);
|
||||
|
||||
return std::string(buff);
|
||||
}
|
||||
|
||||
/** Convert an ANSI string to unicode based on CP_ACP
|
||||
*/
|
||||
std::wstring AnsiToUnicodeString(const std::string& AnsiString)
|
||||
{
|
||||
int len = MultiByteToWideChar(
|
||||
CP_ACP, 0, AnsiString.c_str(), -1, 0, 0);
|
||||
|
||||
wchar_t* buff = reinterpret_cast<wchar_t*>(_alloca(len * sizeof(wchar_t)));
|
||||
|
||||
MultiByteToWideChar(
|
||||
CP_ACP, 0, AnsiString.c_str(), -1, buff, len);
|
||||
|
||||
return std::wstring(buff);
|
||||
}
|
||||
|
||||
|
||||
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|
@@ -1,44 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
/*************************************************************************
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
************************************************************************/
|
||||
|
||||
#ifndef _STRINGCONVERTER_HXX_
|
||||
#define _STRINGCONVERTER_HXX_
|
||||
|
||||
#include <string>
|
||||
|
||||
/** Convert a Unicode string to an ANSI string based on CP_ACP
|
||||
*/
|
||||
std::string UnicodeToAnsiString(const std::wstring& UniString);
|
||||
|
||||
/** Convert an ANSI string to unicode based on CP_ACP
|
||||
*/
|
||||
std::wstring AnsiToUnicodeString(const std::string& AnsiString);
|
||||
|
||||
#endif
|
||||
|
||||
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|
@@ -1,139 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
// UserRegistrar.cpp: Implementierung der Klasse UserRegistrar.
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "userregistrar.hxx"
|
||||
#include "registryvalueimpl.hxx"
|
||||
#include "windowsregistry.hxx"
|
||||
#include "registryexception.hxx"
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(disable : 4350)
|
||||
#endif
|
||||
|
||||
//--------------------------------------
|
||||
/**
|
||||
*/
|
||||
UserRegistrar::UserRegistrar(const RegistrationContextInformation& RegContext) :
|
||||
Registrar(RegContext)
|
||||
{
|
||||
RegistryKey RegKey = WindowsRegistry().GetCurrentUserKey();
|
||||
m_RootKey = RegKey->OpenSubKey(L"Software\\Classes");
|
||||
}
|
||||
|
||||
//###################################
|
||||
// Command
|
||||
//###################################
|
||||
|
||||
//--------------------------------------
|
||||
/**
|
||||
*/
|
||||
void UserRegistrar::UnregisterAsHtmlEditorForInternetExplorer() const
|
||||
{
|
||||
Registrar::UnregisterAsHtmlEditorForInternetExplorer();
|
||||
|
||||
DeleteHtmFileAssociationKeys();
|
||||
|
||||
try
|
||||
{
|
||||
RegistryKey RegKey = m_RootKey->OpenSubKey(L"Applications");
|
||||
if ((0 == RegKey->GetSubValueCount()) && (0 == RegKey->GetSubKeyCount()))
|
||||
{
|
||||
RegKey->Close();
|
||||
m_RootKey->DeleteSubKey(L"Applications");
|
||||
}
|
||||
}
|
||||
catch(RegistryKeyNotFoundException&)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
//--------------------------------------
|
||||
/**
|
||||
*/
|
||||
void UserRegistrar::RegisterAsDefaultShellHtmlEditor() const
|
||||
{
|
||||
RegistryKey LocalHtmKey = m_RootKey->CreateSubKey(L".htm");
|
||||
|
||||
if (!LocalHtmKey->HasValue(DEFAULT_VALUE_NAME))
|
||||
{
|
||||
RegistryKey HKCRKey = WindowsRegistry().GetClassesRootKey();
|
||||
|
||||
if (HKCRKey->HasSubKey(L".htm"))
|
||||
{
|
||||
RegistryKey RootHtmKey = HKCRKey->OpenSubKey(L".htm", false);
|
||||
|
||||
if (RootHtmKey->HasValue(DEFAULT_VALUE_NAME))
|
||||
{
|
||||
RegistryValue RegVal = RootHtmKey->GetValue(DEFAULT_VALUE_NAME);
|
||||
|
||||
std::wstring RootHtmFwdKey = RegVal->GetDataAsUniString();
|
||||
|
||||
if (HKCRKey->HasSubKey(RootHtmFwdKey))
|
||||
{
|
||||
m_RootKey->CreateSubKey(RootHtmFwdKey);
|
||||
LocalHtmKey->CopyValue(RootHtmKey, DEFAULT_VALUE_NAME);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// calling base class method
|
||||
Registrar::RegisterAsDefaultShellHtmlEditor();
|
||||
}
|
||||
|
||||
//--------------------------------------
|
||||
/**
|
||||
*/
|
||||
void UserRegistrar::UnregisterAsDefaultShellHtmlEditor() const
|
||||
{
|
||||
// calling base class method
|
||||
Registrar::UnregisterAsDefaultShellHtmlEditor();
|
||||
DeleteHtmFileAssociationKeys();
|
||||
}
|
||||
|
||||
//--------------------------------------
|
||||
/**
|
||||
*/
|
||||
void UserRegistrar::UnregisterForMsOfficeApplication(
|
||||
const std::wstring& FileExtension) const
|
||||
{
|
||||
/// calling base class method
|
||||
Registrar::UnregisterForMsOfficeApplication(FileExtension);
|
||||
|
||||
if (m_RootKey->HasSubKey(FileExtension))
|
||||
{
|
||||
RegistryKey RegKey = m_RootKey->OpenSubKey(FileExtension);
|
||||
|
||||
if ((0 == RegKey->GetSubKeyCount()) && (0 == RegKey->GetSubValueCount()))
|
||||
{
|
||||
RegKey->Close();
|
||||
m_RootKey->DeleteSubKey(FileExtension);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//--------------------------------------
|
||||
/**
|
||||
*/
|
||||
RegistryKey UserRegistrar::GetRootKeyForDefHtmlEditorForIERegistration() const
|
||||
{
|
||||
return WindowsRegistry().GetCurrentUserKey();
|
||||
}
|
||||
|
||||
//--------------------------------------
|
||||
/**
|
||||
*/
|
||||
void UserRegistrar::DeleteHtmFileAssociationKeys() const
|
||||
{
|
||||
// Later delete the created keys if they are empty and have not changed meanwhile.
|
||||
// Remeber: if we create a new registry key in the user part of the
|
||||
// registry, changes to that key via the merged key HKEY_CLASSES_ROOT
|
||||
// go into the user branch HKEY_CURRENT_USER and are not visible for other users.
|
||||
// so we must carefully detect if the keys have not changed in order to prevent accidentally
|
||||
// deleting a key and so destroying existing associations
|
||||
// See MSDN: "Merged View of HKEY_CLASSES_ROOT"
|
||||
}
|
||||
|
||||
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|
@@ -1,46 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
// UserRegistrar.h: Schnittstelle f<>r die Klasse UserRegistrar.
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef _USERREGISTRAR_HXX_
|
||||
#define _USERREGISTRAR_HXX_
|
||||
|
||||
#include "registrar.hxx"
|
||||
|
||||
class UserRegistrar : public Registrar
|
||||
{
|
||||
public:
|
||||
|
||||
//###################################
|
||||
// Creation
|
||||
//###################################
|
||||
|
||||
UserRegistrar(const RegistrationContextInformation& RegContext);
|
||||
|
||||
//###################################
|
||||
// Command
|
||||
//###################################
|
||||
|
||||
virtual void UnregisterAsHtmlEditorForInternetExplorer() const;
|
||||
|
||||
virtual void RegisterAsDefaultShellHtmlEditor() const;
|
||||
virtual void UnregisterAsDefaultShellHtmlEditor() const;
|
||||
|
||||
protected:
|
||||
virtual void UnregisterForMsOfficeApplication(
|
||||
const std::wstring& FileExtension) const;
|
||||
|
||||
virtual RegistryKey GetRootKeyForDefHtmlEditorForIERegistration() const;
|
||||
|
||||
private:
|
||||
|
||||
/** Delete the privately created file associations
|
||||
for htm files if the keys are empty
|
||||
*/
|
||||
void DeleteHtmFileAssociationKeys() const;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|
@@ -1,58 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
// WindowsRegistry.cpp: Implementierung der Klasse WindowsRegistry.
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "windowsregistry.hxx"
|
||||
#include "registrywnt.hxx"
|
||||
#include "registryw9x.hxx"
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(disable : 4350)
|
||||
#endif
|
||||
|
||||
WindowsRegistry::WindowsRegistry()
|
||||
{
|
||||
OSVERSIONINFOA osverinfo;
|
||||
ZeroMemory(&osverinfo, sizeof(osverinfo));
|
||||
osverinfo.dwOSVersionInfoSize = sizeof(osverinfo);
|
||||
GetVersionExA(&osverinfo);
|
||||
|
||||
m_IsWinNT = (osverinfo.dwPlatformId == VER_PLATFORM_WIN32_NT);
|
||||
}
|
||||
|
||||
RegistryKey WindowsRegistry::GetClassesRootKey(bool Writeable) const
|
||||
{
|
||||
return GetRegistryKey(HKEY_CLASSES_ROOT, Writeable);
|
||||
}
|
||||
|
||||
RegistryKey WindowsRegistry::GetCurrentUserKey(bool Writeable) const
|
||||
{
|
||||
return GetRegistryKey(HKEY_CURRENT_USER, Writeable);
|
||||
}
|
||||
|
||||
RegistryKey WindowsRegistry::GetLocalMachineKey(bool Writeable) const
|
||||
{
|
||||
return GetRegistryKey(HKEY_LOCAL_MACHINE, Writeable);
|
||||
}
|
||||
|
||||
RegistryKey WindowsRegistry::GetUserKey(bool Writeable) const
|
||||
{
|
||||
return GetRegistryKey(HKEY_USERS, Writeable);
|
||||
}
|
||||
|
||||
RegistryKey WindowsRegistry::GetRegistryKey(HKEY RootKey, bool Writeable) const
|
||||
{
|
||||
RegistryKey regkey;
|
||||
|
||||
if (m_IsWinNT)
|
||||
regkey = RegistryKey(new RegistryKeyImplWinNT(RootKey));
|
||||
else
|
||||
regkey = RegistryKey(new RegistryKeyImplWin9x(RootKey));
|
||||
|
||||
regkey->Open(Writeable);
|
||||
|
||||
return regkey;
|
||||
}
|
||||
|
||||
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|
@@ -1,43 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
// WindowsRegistry.h: Schnittstelle f<>r die Klasse WindowsRegistry.
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef _WINDOWSREGISTRY_HXX_
|
||||
#define _WINDOWSREGISTRY_HXX_
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(push, 1) /* disable warnings within system headers */
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(pop)
|
||||
#endif
|
||||
|
||||
#include "Registry.hxx"
|
||||
|
||||
/** Basically a factory class
|
||||
*/
|
||||
class WindowsRegistry
|
||||
{
|
||||
public:
|
||||
WindowsRegistry();
|
||||
|
||||
RegistryKey GetClassesRootKey(bool Writeable = true) const;
|
||||
|
||||
RegistryKey GetCurrentUserKey(bool Writeable = true) const;
|
||||
|
||||
RegistryKey GetLocalMachineKey(bool Writeable = true) const;
|
||||
|
||||
RegistryKey GetUserKey(bool Writeable = true) const;
|
||||
|
||||
private:
|
||||
RegistryKey GetRegistryKey(HKEY RootKey, bool Writeable) const;
|
||||
|
||||
private:
|
||||
bool m_IsWinNT;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|
Reference in New Issue
Block a user