/************************************************************** * * 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. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_svx.hxx" #define UNICODE #define _UNICODE #include #define WIN32_LEAN_AND_MEAN #include #include #include // need to undef min and max macros from MS headers here to make // the std::min and std::max from stl visible again #ifdef min #undef min #endif #ifdef max #undef max #endif #include "docrecovery.hxx" //*************************************************************************** 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 sal_uInt8 *)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\\CrashReport"), TEXT("HTTPProxyServer"), szBuffer, sizeof(szBuffer) ) ) maParams.maHTTPProxyServer = (sal_Unicode *)szBuffer; DWORD dwProxyPort; if ( ERROR_SUCCESS == RegReadValue( HKEY_CURRENT_USER, TEXT("SOFTWARE\\OpenOffice\\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\\CrashReport"), TEXT("ReturnAddress"), szBuffer, sizeof(szBuffer) ) ) maEMailAddrED.SetText( (sal_Unicode *)szBuffer ); DWORD fAllowContact = sal_False; RegReadValue( HKEY_CURRENT_USER, TEXT("SOFTWARE\\OpenOffice\\CrashReport"), TEXT("AllowContact"), &fAllowContact, sizeof(fAllowContact) ); maContactCB.Check( (sal_Bool)fAllowContact ); DWORD uInternetConnection = 0; RegReadValue( HKEY_CURRENT_USER, TEXT("SOFTWARE\\OpenOffice\\CrashReport"), TEXT("HTTPConnection"), &uInternetConnection, sizeof(uInternetConnection) ); maParams.miHTTPConnectionType = uInternetConnection; return true; } bool ErrorRepSendDialog::SaveParams() { const _TCHAR *lpHTTPProxyServer = reinterpret_cast(maParams.maHTTPProxyServer.GetBuffer()); RegWriteValue( HKEY_CURRENT_USER, TEXT("SOFTWARE\\OpenOffice\\CrashReport"), TEXT("HTTPProxyServer"), REG_SZ, lpHTTPProxyServer, sizeof(TCHAR) * (_tcslen(lpHTTPProxyServer) + 1) ); _TCHAR* endptr = NULL; DWORD dwProxyPort = _tcstoul( reinterpret_cast(maParams.maHTTPProxyPort.GetBuffer()), &endptr, 10 ); RegWriteValue( HKEY_CURRENT_USER, TEXT("SOFTWARE\\OpenOffice\\CrashReport"), TEXT("HTTPProxyPort"), REG_DWORD, &dwProxyPort, sizeof(DWORD) ); DWORD fAllowContact = IsContactAllowed(); RegWriteValue( HKEY_CURRENT_USER, TEXT("SOFTWARE\\OpenOffice\\CrashReport"), TEXT("AllowContact"), REG_DWORD, &fAllowContact, sizeof(DWORD) ); DWORD uInternetConnection = maParams.miHTTPConnectionType; RegWriteValue( HKEY_CURRENT_USER, TEXT("SOFTWARE\\OpenOffice\\CrashReport"), TEXT("HTTPConnection"), REG_DWORD, &uInternetConnection, sizeof(DWORD) ); const _TCHAR *lpEmail = reinterpret_cast(GetEMailAddress().GetBuffer()); RegWriteValue( HKEY_CURRENT_USER, TEXT("SOFTWARE\\OpenOffice\\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"), reinterpret_cast(GetDocType().GetBuffer()) ); SetEnvironmentVariable( TEXT("ERRORREPORT_BODYFILE"), szFileName ); _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, sal_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