blob: 35fbb7a1c55f92f09f5e97f0c8bcc1a6071def15 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// Registrar.cpp: Implementierung der Klasse Registrar.
//
//////////////////////////////////////////////////////////////////////
#include "registrar.hxx"
#ifndef _REGISTRYVALUEIMPL_HXX_
#include "RegistryValueImpl.hxx"
#endif
#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"OpenOffice"),
DEFAULT_VALUE_NAME(L""),
BACKUP_VALUE_NAME(L"Backup"),
PRIVATE_BACKUP_KEY_NAME(L"OpenOffice.reg4msdocmsi"),//PRIVATE_BACKUP_KEY_NAME(L"soffice6.bak"),
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.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.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.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.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.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));
}