1f6e50924SAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3f6e50924SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4f6e50924SAndrew Rist * or more contributor license agreements. See the NOTICE file
5f6e50924SAndrew Rist * distributed with this work for additional information
6f6e50924SAndrew Rist * regarding copyright ownership. The ASF licenses this file
7f6e50924SAndrew Rist * to you under the Apache License, Version 2.0 (the
8f6e50924SAndrew Rist * "License"); you may not use this file except in compliance
9f6e50924SAndrew Rist * with the License. You may obtain a copy of the License at
10f6e50924SAndrew Rist *
11f6e50924SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12f6e50924SAndrew Rist *
13f6e50924SAndrew Rist * Unless required by applicable law or agreed to in writing,
14f6e50924SAndrew Rist * software distributed under the License is distributed on an
15f6e50924SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16f6e50924SAndrew Rist * KIND, either express or implied. See the License for the
17f6e50924SAndrew Rist * specific language governing permissions and limitations
18f6e50924SAndrew Rist * under the License.
19f6e50924SAndrew Rist *
20f6e50924SAndrew Rist *************************************************************/
21f6e50924SAndrew Rist
22f6e50924SAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir
25cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
26cdf0e10cSrcweir #include "precompiled_svx.hxx"
27cdf0e10cSrcweir
28cdf0e10cSrcweir #define UNICODE
29cdf0e10cSrcweir #define _UNICODE
30cdf0e10cSrcweir
31cdf0e10cSrcweir #include <tools/svwin.h>
32cdf0e10cSrcweir
33cdf0e10cSrcweir #define WIN32_LEAN_AND_MEAN
34cdf0e10cSrcweir #include <tchar.h>
35cdf0e10cSrcweir #include <stdio.h>
36cdf0e10cSrcweir #include <systools/win32/uwinapi.h>
37cdf0e10cSrcweir
38cdf0e10cSrcweir // need to undef min and max macros from MS headers here to make
39cdf0e10cSrcweir // the std::min and std::max from stl visible again
40cdf0e10cSrcweir #ifdef min
41cdf0e10cSrcweir #undef min
42cdf0e10cSrcweir #endif
43cdf0e10cSrcweir #ifdef max
44cdf0e10cSrcweir #undef max
45cdf0e10cSrcweir #endif
46cdf0e10cSrcweir
47cdf0e10cSrcweir #include "docrecovery.hxx"
48cdf0e10cSrcweir
49cdf0e10cSrcweir //***************************************************************************
50cdf0e10cSrcweir
RegReadValue(HKEY hBaseKey,LPCTSTR lpSubKey,LPCTSTR lpValueName,LPVOID lpData,DWORD cbData)51cdf0e10cSrcweir static LONG RegReadValue( HKEY hBaseKey, LPCTSTR lpSubKey, LPCTSTR lpValueName, LPVOID lpData, DWORD cbData )
52cdf0e10cSrcweir {
53cdf0e10cSrcweir HKEY hKey = NULL;
54cdf0e10cSrcweir LONG lResult;
55cdf0e10cSrcweir
56cdf0e10cSrcweir lResult = RegOpenKeyEx( hBaseKey, lpSubKey, 0, KEY_QUERY_VALUE, &hKey );
57cdf0e10cSrcweir
58cdf0e10cSrcweir if ( ERROR_SUCCESS == lResult )
59cdf0e10cSrcweir {
60cdf0e10cSrcweir lResult = RegQueryValueEx( hKey, lpValueName, NULL, NULL, (LPBYTE)lpData, &cbData );
61cdf0e10cSrcweir RegCloseKey( hKey );
62cdf0e10cSrcweir }
63cdf0e10cSrcweir
64cdf0e10cSrcweir return lResult;
65cdf0e10cSrcweir }
66cdf0e10cSrcweir
67cdf0e10cSrcweir //***************************************************************************
68cdf0e10cSrcweir
RegWriteValue(HKEY hBaseKey,LPCTSTR lpSubKey,LPCTSTR lpValueName,DWORD dwType,LPCVOID lpData,DWORD cbData)69cdf0e10cSrcweir static LONG RegWriteValue( HKEY hBaseKey, LPCTSTR lpSubKey, LPCTSTR lpValueName, DWORD dwType, LPCVOID lpData, DWORD cbData )
70cdf0e10cSrcweir {
71cdf0e10cSrcweir HKEY hKey = NULL;
72cdf0e10cSrcweir LONG lResult;
73cdf0e10cSrcweir
74cdf0e10cSrcweir lResult = RegCreateKeyEx( hBaseKey, lpSubKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, NULL );
75cdf0e10cSrcweir
76cdf0e10cSrcweir if ( ERROR_SUCCESS == lResult )
77cdf0e10cSrcweir {
78cdf0e10cSrcweir lResult = RegSetValueEx( hKey, lpValueName, NULL, dwType, (CONST sal_uInt8 *)lpData, cbData );
79cdf0e10cSrcweir RegCloseKey( hKey );
80cdf0e10cSrcweir }
81cdf0e10cSrcweir
82cdf0e10cSrcweir return lResult;
83cdf0e10cSrcweir }
84cdf0e10cSrcweir
85cdf0e10cSrcweir //***************************************************************************
86cdf0e10cSrcweir
87cdf0e10cSrcweir namespace svx{
88cdf0e10cSrcweir namespace DocRecovery{
89cdf0e10cSrcweir
ReadParams()90cdf0e10cSrcweir bool ErrorRepSendDialog::ReadParams()
91cdf0e10cSrcweir {
92cdf0e10cSrcweir _TCHAR szBuffer[2048];
93cdf0e10cSrcweir
94cdf0e10cSrcweir if ( ERROR_SUCCESS == RegReadValue(
95cdf0e10cSrcweir HKEY_CURRENT_USER,
96*599cc5b4SOliver-Rainer Wittmann TEXT("SOFTWARE\\OpenOffice\\CrashReport"),
97cdf0e10cSrcweir TEXT("HTTPProxyServer"),
98cdf0e10cSrcweir szBuffer,
99cdf0e10cSrcweir sizeof(szBuffer) ) )
100cdf0e10cSrcweir maParams.maHTTPProxyServer = (sal_Unicode *)szBuffer;
101cdf0e10cSrcweir
102cdf0e10cSrcweir DWORD dwProxyPort;
103cdf0e10cSrcweir if ( ERROR_SUCCESS == RegReadValue(
104cdf0e10cSrcweir HKEY_CURRENT_USER,
105*599cc5b4SOliver-Rainer Wittmann TEXT("SOFTWARE\\OpenOffice\\CrashReport"),
106cdf0e10cSrcweir TEXT("HTTPProxyPort"),
107cdf0e10cSrcweir &dwProxyPort,
108cdf0e10cSrcweir sizeof(dwProxyPort) ) )
109cdf0e10cSrcweir {
110cdf0e10cSrcweir _stprintf( szBuffer, _T("%d"), dwProxyPort );
111cdf0e10cSrcweir maParams.maHTTPProxyPort = (sal_Unicode *)szBuffer;
112cdf0e10cSrcweir }
113cdf0e10cSrcweir
114cdf0e10cSrcweir if ( ERROR_SUCCESS == RegReadValue(
115cdf0e10cSrcweir HKEY_CURRENT_USER,
116*599cc5b4SOliver-Rainer Wittmann TEXT("SOFTWARE\\OpenOffice\\CrashReport"),
117cdf0e10cSrcweir TEXT("ReturnAddress"),
118cdf0e10cSrcweir szBuffer,
119cdf0e10cSrcweir sizeof(szBuffer) ) )
120cdf0e10cSrcweir maEMailAddrED.SetText( (sal_Unicode *)szBuffer );
121cdf0e10cSrcweir
122cdf0e10cSrcweir DWORD fAllowContact = sal_False;
123cdf0e10cSrcweir RegReadValue(
124cdf0e10cSrcweir HKEY_CURRENT_USER,
125*599cc5b4SOliver-Rainer Wittmann TEXT("SOFTWARE\\OpenOffice\\CrashReport"),
126cdf0e10cSrcweir TEXT("AllowContact"),
127cdf0e10cSrcweir &fAllowContact,
128cdf0e10cSrcweir sizeof(fAllowContact) );
129cdf0e10cSrcweir maContactCB.Check( (sal_Bool)fAllowContact );
130cdf0e10cSrcweir
131cdf0e10cSrcweir DWORD uInternetConnection = 0;
132cdf0e10cSrcweir RegReadValue(
133cdf0e10cSrcweir HKEY_CURRENT_USER,
134*599cc5b4SOliver-Rainer Wittmann TEXT("SOFTWARE\\OpenOffice\\CrashReport"),
135cdf0e10cSrcweir TEXT("HTTPConnection"),
136cdf0e10cSrcweir &uInternetConnection,
137cdf0e10cSrcweir sizeof(uInternetConnection) );
138cdf0e10cSrcweir maParams.miHTTPConnectionType = uInternetConnection;
139cdf0e10cSrcweir
140cdf0e10cSrcweir return true;
141cdf0e10cSrcweir }
142cdf0e10cSrcweir
SaveParams()143cdf0e10cSrcweir bool ErrorRepSendDialog::SaveParams()
144cdf0e10cSrcweir {
145cdf0e10cSrcweir const _TCHAR *lpHTTPProxyServer = reinterpret_cast<LPCTSTR>(maParams.maHTTPProxyServer.GetBuffer());
146cdf0e10cSrcweir RegWriteValue(
147cdf0e10cSrcweir HKEY_CURRENT_USER,
148*599cc5b4SOliver-Rainer Wittmann TEXT("SOFTWARE\\OpenOffice\\CrashReport"),
149cdf0e10cSrcweir TEXT("HTTPProxyServer"), REG_SZ,
150cdf0e10cSrcweir lpHTTPProxyServer,
151cdf0e10cSrcweir sizeof(TCHAR) * (_tcslen(lpHTTPProxyServer) + 1) );
152cdf0e10cSrcweir
153cdf0e10cSrcweir _TCHAR* endptr = NULL;
154cdf0e10cSrcweir DWORD dwProxyPort = _tcstoul( reinterpret_cast<LPCTSTR>(maParams.maHTTPProxyPort.GetBuffer()), &endptr, 10 );
155cdf0e10cSrcweir
156cdf0e10cSrcweir RegWriteValue(
157cdf0e10cSrcweir HKEY_CURRENT_USER,
158*599cc5b4SOliver-Rainer Wittmann TEXT("SOFTWARE\\OpenOffice\\CrashReport"),
159cdf0e10cSrcweir TEXT("HTTPProxyPort"), REG_DWORD,
160cdf0e10cSrcweir &dwProxyPort,
161cdf0e10cSrcweir sizeof(DWORD) );
162cdf0e10cSrcweir
163cdf0e10cSrcweir DWORD fAllowContact = IsContactAllowed();
164cdf0e10cSrcweir RegWriteValue(
165cdf0e10cSrcweir HKEY_CURRENT_USER,
166*599cc5b4SOliver-Rainer Wittmann TEXT("SOFTWARE\\OpenOffice\\CrashReport"),
167cdf0e10cSrcweir TEXT("AllowContact"), REG_DWORD,
168cdf0e10cSrcweir &fAllowContact,
169cdf0e10cSrcweir sizeof(DWORD) );
170cdf0e10cSrcweir
171cdf0e10cSrcweir
172cdf0e10cSrcweir DWORD uInternetConnection = maParams.miHTTPConnectionType;
173cdf0e10cSrcweir
174cdf0e10cSrcweir RegWriteValue(
175cdf0e10cSrcweir HKEY_CURRENT_USER,
176*599cc5b4SOliver-Rainer Wittmann TEXT("SOFTWARE\\OpenOffice\\CrashReport"),
177cdf0e10cSrcweir TEXT("HTTPConnection"), REG_DWORD,
178cdf0e10cSrcweir &uInternetConnection,
179cdf0e10cSrcweir sizeof(DWORD) );
180cdf0e10cSrcweir
181cdf0e10cSrcweir const _TCHAR *lpEmail = reinterpret_cast<LPCTSTR>(GetEMailAddress().GetBuffer());
182cdf0e10cSrcweir RegWriteValue(
183cdf0e10cSrcweir HKEY_CURRENT_USER,
184*599cc5b4SOliver-Rainer Wittmann TEXT("SOFTWARE\\OpenOffice\\CrashReport"),
185cdf0e10cSrcweir TEXT("ReturnAddress"), REG_SZ,
186cdf0e10cSrcweir lpEmail,
187cdf0e10cSrcweir sizeof(TCHAR) * (_tcslen(lpEmail) + 1) );
188cdf0e10cSrcweir
189cdf0e10cSrcweir return true;
190cdf0e10cSrcweir }
191cdf0e10cSrcweir
SendReport()192cdf0e10cSrcweir bool ErrorRepSendDialog::SendReport()
193cdf0e10cSrcweir {
194cdf0e10cSrcweir TCHAR szTempPath[MAX_PATH];
195cdf0e10cSrcweir TCHAR szFileName[MAX_PATH];
196cdf0e10cSrcweir
197cdf0e10cSrcweir GetTempPath( elementsof(szTempPath), szTempPath );
198cdf0e10cSrcweir GetTempFileName( szTempPath, TEXT("DSC"), 0, szFileName );
199cdf0e10cSrcweir
200cdf0e10cSrcweir FILE *fp = _tfopen( szFileName, _T("wb") );
201cdf0e10cSrcweir
202cdf0e10cSrcweir if ( fp )
203cdf0e10cSrcweir {
204cdf0e10cSrcweir ByteString strUTF8( GetUsing(), RTL_TEXTENCODING_UTF8 );
205cdf0e10cSrcweir
206cdf0e10cSrcweir fwrite( strUTF8.GetBuffer(), 1, strUTF8.Len(), fp );
207cdf0e10cSrcweir fclose( fp );
208cdf0e10cSrcweir }
209cdf0e10cSrcweir
210cdf0e10cSrcweir SetEnvironmentVariable( TEXT("ERRORREPORT_SUBJECT"), reinterpret_cast<LPCTSTR>(GetDocType().GetBuffer()) );
211cdf0e10cSrcweir SetEnvironmentVariable( TEXT("ERRORREPORT_BODYFILE"), szFileName );
212cdf0e10cSrcweir
213cdf0e10cSrcweir _TCHAR szBuffer[1024];
214cdf0e10cSrcweir TCHAR szPath[MAX_PATH];
215cdf0e10cSrcweir LPTSTR lpFilePart;
216cdf0e10cSrcweir PROCESS_INFORMATION ProcessInfo;
217cdf0e10cSrcweir STARTUPINFO StartupInfo;
218cdf0e10cSrcweir
219cdf0e10cSrcweir if ( SearchPath( NULL, TEXT("crashrep.exe"), NULL, MAX_PATH, szPath, &lpFilePart ) )
220cdf0e10cSrcweir {
221cdf0e10cSrcweir ZeroMemory( &StartupInfo, sizeof(StartupInfo) );
222cdf0e10cSrcweir StartupInfo.cb = sizeof(StartupInfo.cb);
223cdf0e10cSrcweir
224cdf0e10cSrcweir sntprintf( szBuffer, elementsof(szBuffer),
225cdf0e10cSrcweir _T("%s -noui -load -send"),
226cdf0e10cSrcweir szPath );
227cdf0e10cSrcweir
228cdf0e10cSrcweir if (
229cdf0e10cSrcweir CreateProcess(
230cdf0e10cSrcweir NULL,
231cdf0e10cSrcweir szBuffer,
232cdf0e10cSrcweir NULL,
233cdf0e10cSrcweir NULL,
234cdf0e10cSrcweir sal_False,
235cdf0e10cSrcweir 0,
236cdf0e10cSrcweir NULL, NULL, &StartupInfo, &ProcessInfo )
237cdf0e10cSrcweir )
238cdf0e10cSrcweir {
239cdf0e10cSrcweir DWORD dwExitCode;
240cdf0e10cSrcweir
241cdf0e10cSrcweir WaitForSingleObject( ProcessInfo.hProcess, INFINITE );
242cdf0e10cSrcweir if ( GetExitCodeProcess( ProcessInfo.hProcess, &dwExitCode ) && 0 == dwExitCode )
243cdf0e10cSrcweir return true;
244cdf0e10cSrcweir
245cdf0e10cSrcweir }
246cdf0e10cSrcweir }
247cdf0e10cSrcweir
248cdf0e10cSrcweir DeleteFile( szFileName );
249cdf0e10cSrcweir
250cdf0e10cSrcweir
251cdf0e10cSrcweir return false;
252cdf0e10cSrcweir }
253cdf0e10cSrcweir
254cdf0e10cSrcweir
255cdf0e10cSrcweir } // namespace DocRecovery
256cdf0e10cSrcweir } // namespace svx
257