blob: 29e8b64a7c19fe2bd20c7452944928f1ead54f57 [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.
*
*************************************************************/
//Implementierung der Klasse RegistrationContextInformation.
#include <assert.h>
#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_IsWin9x(true),
m_OOExecPath(OpenOfficeExecutablePath)
{
OSVERSIONINFOA osverinfo;
ZeroMemory(&osverinfo, sizeof(osverinfo));
osverinfo.dwOSVersionInfoSize = sizeof(osverinfo);
GetVersionExA(&osverinfo);
m_IsWin9x = (osverinfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS);
assert(m_OOExecPath.length());
ExtractOpenOfficeExecNameFromPath();
}
std::wstring RegistrationContextInformation::GetWordDocumentDisplayName() const
{
std::wstring str;
GetMsiProp(msihandle_, TEXT("STR_MS_WORD_DOCUMENT"), str);
if (m_IsWin9x && !IsConvertableToAnsi(str))
str = TEXT("Microsoft Word Document");
return str;
}
std::wstring RegistrationContextInformation::GetWordDocumentFileExtension() const
{
return std::wstring(TEXT(".doc"));
}
std::wstring RegistrationContextInformation::GetWordDocumentDefaultIconEntry() const
{
return m_OOExecPath + std::wstring(TEXT(",1"));
}
std::wstring RegistrationContextInformation::GetWordDocumentDefaultShellCommand() const
{
return std::wstring(TEXT("open"));
}
std::wstring RegistrationContextInformation::GetWordTemplateDisplayName() const
{
std::wstring str;
GetMsiProp(msihandle_, TEXT("STR_MS_WORD_TEMPLATE"), str);
if (m_IsWin9x && !IsConvertableToAnsi(str))
str = TEXT("Microsoft Word Template");
return str;
}
std::wstring RegistrationContextInformation::GetWordTemplateFileExtension() const
{
return std::wstring(TEXT(".dot"));
}
std::wstring RegistrationContextInformation::GetWordTemplateDefaultIconEntry() const
{
return m_OOExecPath + 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);
if (m_IsWin9x && !IsConvertableToAnsi(str))
str = TEXT("Rich Text Document");
return str;
}
std::wstring RegistrationContextInformation::GetRtfDocumentFileExtension() const
{
return std::wstring(TEXT(".rtf"));
}
std::wstring RegistrationContextInformation::GetRtfDocumentDefaultIconEntry() const
{
return m_OOExecPath + 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);
if (m_IsWin9x && !IsConvertableToAnsi(str))
str = TEXT("Microsoft Excel Worksheet");
return str;
}
std::wstring RegistrationContextInformation::GetExcelSheetFileExtension() const
{
return std::wstring(TEXT(".xls"));
}
std::wstring RegistrationContextInformation::GetExcelSheetDefaultIconEntry() const
{
return m_OOExecPath + std::wstring(TEXT(",3"));
}
std::wstring RegistrationContextInformation::GetExcelSheetDefaultShellCommand() const
{
return std::wstring(TEXT("open"));
}
std::wstring RegistrationContextInformation::GetExcelTemplateDisplayName() const
{
std::wstring str;
GetMsiProp(msihandle_, TEXT("STR_MS_EXCEL_TEMPLATE"), str);
if (m_IsWin9x && !IsConvertableToAnsi(str))
str = TEXT("Microsoft Excel Template");
return str;
}
std::wstring RegistrationContextInformation::GetExcelTemplateFileExtension() const
{
return std::wstring(TEXT(".xlt"));
}
std::wstring RegistrationContextInformation::GetExcelTemplateDefaultIconEntry() const
{
return m_OOExecPath + 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);
if (m_IsWin9x && !IsConvertableToAnsi(str))
str = TEXT("Microsoft PowerPoint Presentation");
return str;
}
std::wstring RegistrationContextInformation::GetPowerPointDocumentFileExtension() const
{
return std::wstring(TEXT(".ppt"));
}
std::wstring RegistrationContextInformation::GetPowerPointDocumentDefaultIconEntry() const
{
return m_OOExecPath + std::wstring(TEXT(",7"));
}
std::wstring RegistrationContextInformation::GetPowerPointDocumentDefaultShellCommand() const
{
return std::wstring(TEXT("open"));
}
std::wstring RegistrationContextInformation::GetPowerPointTemplateDisplayName() const
{
std::wstring str;
GetMsiProp(msihandle_, TEXT("STR_MS_POWERPOINT_TEMPLATE"), str);
if (m_IsWin9x && !IsConvertableToAnsi(str))
str = TEXT("Microsoft PowerPoint Template");
return str;
}
std::wstring RegistrationContextInformation::GetPowerPointTemplateFileExtension() const
{
return std::wstring(TEXT(".pot"));
}
std::wstring RegistrationContextInformation::GetPowerPointTemplateDefaultIconEntry() const
{
return m_OOExecPath + 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);
if (m_IsWin9x && !IsConvertableToAnsi(str))
str = TEXT("Microsoft PowerPoint Show");
return str;
}
std::wstring RegistrationContextInformation::GetPowerPointShowFileExtension() const
{
return std::wstring(TEXT(".pps"));
}
std::wstring RegistrationContextInformation::GetPowerPointShowDefaultIconEntry() const
{
return m_OOExecPath + 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("&"));
if (m_IsWin9x && !IsConvertableToAnsi(str))
str = TEXT("&New");
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("&"));
if (m_IsWin9x && !IsConvertableToAnsi(str))
str = TEXT("&Edit");
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 Apache 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;
}
bool RegistrationContextInformation::IsConvertableToAnsi(const std::wstring& String) const
{
char buff[MAX_REGKEY_LENGTH_WIN9X];
BOOL bUsedDefChar = 0;
if (String.length() > 0)
{
WideCharToMultiByte(
CP_ACP,
WC_COMPOSITECHECK | WC_DEFAULTCHAR,
String.c_str(),
static_cast<int>(String.length()),
buff,
sizeof(buff),
NULL,
&bUsedDefChar);
}
return !bUsedDefChar;
}
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);
}