Files
libreoffice/svx/source/dialog/sendreportw32.cxx

223 lines
7.0 KiB
C++
Raw Normal View History

#define UNICODE
#define _UNICODE
#include "docrecovery.hxx"
#include <tools/svwin.h>
#define WIN32_LEAN_AND_MEAN
#include <tchar.h>
#include <stdio.h>
#include <systools/win32/uwinapi.h>
//***************************************************************************
static LONG RegReadValue( HKEY hBaseKey, LPCTSTR lpSubKey, LPCTSTR lpValueName, LPVOID lpData, DWORD cbData )
{
HKEY hKey = NULL;
LONG lResult;
lResult = RegOpenKeyEx( hBaseKey, lpSubKey, 0, KEY_QUERY_VALUE, &hKey );
if ( ERROR_SUCCESS == lResult )
{
lResult = RegQueryValueEx( hKey, lpValueName, NULL, NULL, (LPBYTE)lpData, &cbData );
RegCloseKey( hKey );
}
return lResult;
}
//***************************************************************************
static LONG RegWriteValue( HKEY hBaseKey, LPCTSTR lpSubKey, LPCTSTR lpValueName, DWORD dwType, LPCVOID lpData, DWORD cbData )
{
HKEY hKey = NULL;
LONG lResult;
lResult = RegCreateKeyEx( hBaseKey, lpSubKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, NULL );
if ( ERROR_SUCCESS == lResult )
{
lResult = RegSetValueEx( hKey, lpValueName, NULL, dwType, (CONST BYTE *)lpData, cbData );
RegCloseKey( hKey );
}
return lResult;
}
//***************************************************************************
namespace svx{
namespace DocRecovery{
bool ErrorRepSendDialog::ReadParams()
{
_TCHAR szBuffer[2048];
if ( ERROR_SUCCESS == RegReadValue(
HKEY_CURRENT_USER,
TEXT("SOFTWARE\\OpenOffice.org\\CrashReport"),
TEXT("HTTPProxyServer"),
szBuffer,
sizeof(szBuffer) ) )
maParams.maHTTPProxyServer = (sal_Unicode *)szBuffer;
DWORD dwProxyPort;
if ( ERROR_SUCCESS == RegReadValue(
HKEY_CURRENT_USER,
TEXT("SOFTWARE\\OpenOffice.org\\CrashReport"),
TEXT("HTTPProxyPort"),
&dwProxyPort,
sizeof(dwProxyPort) ) )
{
_stprintf( szBuffer, _T("%d"), dwProxyPort );
maParams.maHTTPProxyPort = (sal_Unicode *)szBuffer;
}
if ( ERROR_SUCCESS == RegReadValue(
HKEY_CURRENT_USER,
TEXT("SOFTWARE\\OpenOffice.org\\CrashReport"),
TEXT("ReturnAddress"),
szBuffer,
sizeof(szBuffer) ) )
maEMailAddrED.SetText( (sal_Unicode *)szBuffer );
BOOL fAllowContact = FALSE;
RegReadValue(
HKEY_CURRENT_USER,
TEXT("SOFTWARE\\OpenOffice.org\\CrashReport"),
TEXT("AllowContact"),
&fAllowContact,
sizeof(fAllowContact) );
maContactCB.Check( fAllowContact );
DWORD uInternetConnection = 0;
RegReadValue(
HKEY_CURRENT_USER,
TEXT("SOFTWARE\\OpenOffice.org\\CrashReport"),
TEXT("HTTPConnection"),
&uInternetConnection,
sizeof(uInternetConnection) );
maParams.miHTTPConnectionType = uInternetConnection;
return true;
}
bool ErrorRepSendDialog::SaveParams()
{
const _TCHAR *lpHTTPProxyServer = maParams.maHTTPProxyServer.GetBuffer();
RegWriteValue(
HKEY_CURRENT_USER,
TEXT("SOFTWARE\\OpenOffice.org\\CrashReport"),
TEXT("HTTPProxyServer"), REG_SZ,
lpHTTPProxyServer,
sizeof(TCHAR) * (_tcslen(lpHTTPProxyServer) + 1) );
_TCHAR* endptr = NULL;
DWORD dwProxyPort = _tcstoul( maParams.maHTTPProxyPort.GetBuffer(), &endptr, 10 );
RegWriteValue(
HKEY_CURRENT_USER,
TEXT("SOFTWARE\\OpenOffice.org\\CrashReport"),
TEXT("HTTPProxyPort"), REG_DWORD,
&dwProxyPort,
sizeof(DWORD) );
DWORD fAllowContact = IsContactAllowed();
RegWriteValue(
HKEY_CURRENT_USER,
TEXT("SOFTWARE\\OpenOffice.org\\CrashReport"),
TEXT("AllowContact"), REG_DWORD,
&fAllowContact,
sizeof(DWORD) );
DWORD uInternetConnection = maParams.miHTTPConnectionType;
RegWriteValue(
HKEY_CURRENT_USER,
TEXT("SOFTWARE\\OpenOffice.org\\CrashReport"),
TEXT("HTTPConnection"), REG_DWORD,
&uInternetConnection,
sizeof(DWORD) );
const _TCHAR *lpEmail = GetEMailAddress().GetBuffer();
RegWriteValue(
HKEY_CURRENT_USER,
TEXT("SOFTWARE\\OpenOffice.org\\CrashReport"),
TEXT("ReturnAddress"), REG_SZ,
lpEmail,
sizeof(TCHAR) * (_tcslen(lpEmail) + 1) );
return true;
}
bool ErrorRepSendDialog::SendReport()
{
TCHAR szTempPath[MAX_PATH];
TCHAR szFileName[MAX_PATH];
GetTempPath( elementsof(szTempPath), szTempPath );
GetTempFileName( szTempPath, TEXT("DSC"), 0, szFileName );
FILE *fp = _tfopen( szFileName, _T("wb") );
if ( fp )
{
ByteString strUTF8( GetUsing(), RTL_TEXTENCODING_UTF8 );
fwrite( strUTF8.GetBuffer(), 1, strUTF8.Len(), fp );
fclose( fp );
}
SetEnvironmentVariable( TEXT("ERRORREPORT_SUBJECT"), GetDocType().GetBuffer() );
SetEnvironmentVariable( TEXT("ERRORREPORT_BODYFILE"), szFileName );
BOOL fSuccess = FALSE;
_TCHAR szBuffer[1024];
TCHAR szPath[MAX_PATH];
LPTSTR lpFilePart;
PROCESS_INFORMATION ProcessInfo;
STARTUPINFO StartupInfo;
if ( SearchPath( NULL, TEXT("crashrep.exe"), NULL, MAX_PATH, szPath, &lpFilePart ) )
{
ZeroMemory( &StartupInfo, sizeof(StartupInfo) );
StartupInfo.cb = sizeof(StartupInfo.cb);
sntprintf( szBuffer, elementsof(szBuffer),
_T("%s -noui -load -send"),
szPath );
if (
CreateProcess(
NULL,
szBuffer,
NULL,
NULL,
FALSE,
0,
NULL, NULL, &StartupInfo, &ProcessInfo )
)
{
DWORD dwExitCode;
WaitForSingleObject( ProcessInfo.hProcess, INFINITE );
if ( GetExitCodeProcess( ProcessInfo.hProcess, &dwExitCode ) && 0 == dwExitCode )
return true;
}
}
DeleteFile( szFileName );
return false;
}
} // namespace DocRecovery
} // namespace svx