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