132b1fd08SAndrew Rist /**************************************************************
232b1fd08SAndrew Rist  *
332b1fd08SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
432b1fd08SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
532b1fd08SAndrew Rist  * distributed with this work for additional information
632b1fd08SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
732b1fd08SAndrew Rist  * to you under the Apache License, Version 2.0 (the
832b1fd08SAndrew Rist  * "License"); you may not use this file except in compliance
932b1fd08SAndrew Rist  * with the License.  You may obtain a copy of the License at
1032b1fd08SAndrew Rist  *
1132b1fd08SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
1232b1fd08SAndrew Rist  *
1332b1fd08SAndrew Rist  * Unless required by applicable law or agreed to in writing,
1432b1fd08SAndrew Rist  * software distributed under the License is distributed on an
1532b1fd08SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
1632b1fd08SAndrew Rist  * KIND, either express or implied.  See the License for the
1732b1fd08SAndrew Rist  * specific language governing permissions and limitations
1832b1fd08SAndrew Rist  * under the License.
1932b1fd08SAndrew Rist  *
2032b1fd08SAndrew Rist  *************************************************************/
2132b1fd08SAndrew Rist 
22cdf0e10cSrcweir // Registrar.cpp: Implementierung der Klasse Registrar.
23cdf0e10cSrcweir //
24cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////
25cdf0e10cSrcweir 
26cdf0e10cSrcweir #include "registrar.hxx"
27cdf0e10cSrcweir 
28cdf0e10cSrcweir #ifndef _REGISTRYVALUEIMPL_HXX_
29cdf0e10cSrcweir #include "RegistryValueImpl.hxx"
30cdf0e10cSrcweir #endif
31cdf0e10cSrcweir #include "windowsregistry.hxx"
32cdf0e10cSrcweir #include "registryexception.hxx"
33cdf0e10cSrcweir 
34cdf0e10cSrcweir #include <assert.h>
35cdf0e10cSrcweir #ifdef _MSC_VER
36cdf0e10cSrcweir #pragma warning(disable: 4350 4482)
37cdf0e10cSrcweir #include "strsafe.h"
38cdf0e10cSrcweir #endif
39cdf0e10cSrcweir 
40cdf0e10cSrcweir //----------------------------------------------------------
41cdf0e10cSrcweir #ifdef DEBUG
42cdf0e10cSrcweir inline void OutputDebugStringFormat( LPCTSTR pFormat, ... )
43cdf0e10cSrcweir {
44cdf0e10cSrcweir 	TCHAR    buffer[1024];
45cdf0e10cSrcweir 	va_list  args;
46cdf0e10cSrcweir 
47cdf0e10cSrcweir 	va_start( args, pFormat );
48cdf0e10cSrcweir 	StringCchVPrintf( buffer, sizeof(buffer), pFormat, args );
49cdf0e10cSrcweir 	OutputDebugString( buffer );
50cdf0e10cSrcweir }
51cdf0e10cSrcweir #else
52cdf0e10cSrcweir static inline void OutputDebugStringFormat( LPCTSTR, ... )
53cdf0e10cSrcweir {
54cdf0e10cSrcweir }
55cdf0e10cSrcweir #endif
56cdf0e10cSrcweir //----------------------------------------------------------
57cdf0e10cSrcweir 
58cdf0e10cSrcweir const int MSWORD                     = 0x1;
59cdf0e10cSrcweir const int MSEXCEL                    = 0x2;
60cdf0e10cSrcweir const int MSPOWERPOINT               = 0x4;
61cdf0e10cSrcweir const int DEFAULT_HTML_EDITOR_FOR_IE = 0x8;
62cdf0e10cSrcweir const int HTML_EDITOR				 = 0x10;
63cdf0e10cSrcweir const int DEFAULT_SHELL_HTML_EDITOR  = 0x20;
64cdf0e10cSrcweir 
65cdf0e10cSrcweir namespace /* private */
66cdf0e10cSrcweir {
67cdf0e10cSrcweir     const std::wstring HTM_OPENWITHLIST = L".htm\\OpenWithList";
68cdf0e10cSrcweir     const std::wstring APPLICATIONS = L"Applications";
69cdf0e10cSrcweir     const std::wstring SHELL_EDIT_COMMAND = L"shell\\edit\\command";
70cdf0e10cSrcweir     const std::wstring HTML_EDIT = L"HTML Edit";
71cdf0e10cSrcweir     const std::wstring HTML_EDIT_DISPLAY_NAME = L"Edit Display Name";
72cdf0e10cSrcweir     const std::wstring SHELL_EDIT_COMMAND_BACKUP = L"Shell Edit Cmd";
73cdf0e10cSrcweir     const std::wstring DEFAULT_HTML_EDITOR = L"Default HTML Editor";
74cdf0e10cSrcweir     const std::wstring MS_IE_DEF_HTML_EDITOR = L"Software\\Microsoft\\Internet Explorer\\Default HTML Editor";
75cdf0e10cSrcweir     const std::wstring MS_IE_DEF_HTML_EDITOR_SHL_EDIT_CMD = L"Software\\Microsoft\\Internet Explorer\\Default HTML Editor\\shell\\edit\\command";
76cdf0e10cSrcweir }
77cdf0e10cSrcweir 
78cdf0e10cSrcweir Registrar::Registrar(const RegistrationContextInformation& RegContext) :
79cdf0e10cSrcweir 	m_ContextInformation(RegContext),
80*599cc5b4SOliver-Rainer Wittmann     FORWARD_KEY_PREFIX(L"OpenOffice"),
81cdf0e10cSrcweir     DEFAULT_VALUE_NAME(L""),
82cdf0e10cSrcweir     BACKUP_VALUE_NAME(L"Backup"),
83*599cc5b4SOliver-Rainer Wittmann     PRIVATE_BACKUP_KEY_NAME(L"OpenOffice.reg4msdocmsi"),//PRIVATE_BACKUP_KEY_NAME(L"soffice6.bak"),
84cdf0e10cSrcweir     REGISTRATION_STATE(L"Reg4MsDocState")
85cdf0e10cSrcweir {
86cdf0e10cSrcweir     m_RootKey = WindowsRegistry().GetClassesRootKey();
87cdf0e10cSrcweir }
88cdf0e10cSrcweir 
89cdf0e10cSrcweir Registrar::~Registrar()
90cdf0e10cSrcweir {
91cdf0e10cSrcweir }
92cdf0e10cSrcweir 
93cdf0e10cSrcweir void Registrar::RegisterForMsWord() const
94cdf0e10cSrcweir {
95cdf0e10cSrcweir     assert(m_RootKey.get());
96cdf0e10cSrcweir 
97cdf0e10cSrcweir     RegisterForMsOfficeApplication(
98cdf0e10cSrcweir         m_ContextInformation.GetWordDocumentFileExtension(),
99cdf0e10cSrcweir         m_ContextInformation.GetWordDocumentDisplayName(),
100cdf0e10cSrcweir         m_ContextInformation.GetWordDocumentDefaultIconEntry(),
101cdf0e10cSrcweir         m_ContextInformation.GetWordDocumentDefaultShellCommand(),
102cdf0e10cSrcweir         m_ContextInformation.ShellNewCommandDisplayName(),
103cdf0e10cSrcweir         RegistrationContextInformation::Writer);
104cdf0e10cSrcweir 
105cdf0e10cSrcweir     RegisterForMsOfficeApplication(
106cdf0e10cSrcweir         m_ContextInformation.GetWordTemplateFileExtension(),
107cdf0e10cSrcweir         m_ContextInformation.GetWordTemplateDisplayName(),
108cdf0e10cSrcweir         m_ContextInformation.GetWordTemplateDefaultIconEntry(),
109cdf0e10cSrcweir         m_ContextInformation.GetWordTemplateDefaultShellCommand(),
110cdf0e10cSrcweir         m_ContextInformation.ShellNewCommandDisplayName(),
111cdf0e10cSrcweir         RegistrationContextInformation::Writer);
112cdf0e10cSrcweir 
113cdf0e10cSrcweir     RegisterForMsOfficeApplication(
114cdf0e10cSrcweir         m_ContextInformation.GetRtfDocumentFileExtension(),
115cdf0e10cSrcweir         m_ContextInformation.GetRtfDocumentDisplayName(),
116cdf0e10cSrcweir         m_ContextInformation.GetRtfDocumentDefaultIconEntry(),
117cdf0e10cSrcweir         m_ContextInformation.GetRtfDocumentDefaultShellCommand(),
118cdf0e10cSrcweir         m_ContextInformation.ShellNewCommandDisplayName(),
119cdf0e10cSrcweir         RegistrationContextInformation::Writer);
120cdf0e10cSrcweir 
121cdf0e10cSrcweir     SaveRegisteredFor(MSWORD);
122cdf0e10cSrcweir }
123cdf0e10cSrcweir 
124cdf0e10cSrcweir void Registrar::UnregisterForMsWord() const
125cdf0e10cSrcweir {
126cdf0e10cSrcweir 	assert(m_RootKey.get());
127cdf0e10cSrcweir 
128cdf0e10cSrcweir 	try
129cdf0e10cSrcweir 	{
130cdf0e10cSrcweir 		UnregisterForMsOfficeApplication(
131cdf0e10cSrcweir 			m_ContextInformation.GetWordDocumentFileExtension());
132cdf0e10cSrcweir 	}
133cdf0e10cSrcweir 	catch(RegistryKeyNotFoundException&)
134cdf0e10cSrcweir 	{}
135cdf0e10cSrcweir 
136cdf0e10cSrcweir 	try
137cdf0e10cSrcweir 	{
138cdf0e10cSrcweir 		UnregisterForMsOfficeApplication(
139cdf0e10cSrcweir 			m_ContextInformation.GetWordTemplateFileExtension());
140cdf0e10cSrcweir 	}
141cdf0e10cSrcweir 	catch(RegistryKeyNotFoundException&)
142cdf0e10cSrcweir 	{}
143cdf0e10cSrcweir 
144cdf0e10cSrcweir 	try
145cdf0e10cSrcweir 	{
146cdf0e10cSrcweir 		UnregisterForMsOfficeApplication(
147cdf0e10cSrcweir 			m_ContextInformation.GetRtfDocumentFileExtension());
148cdf0e10cSrcweir 	}
149cdf0e10cSrcweir 	catch(RegistryKeyNotFoundException&)
150cdf0e10cSrcweir 	{}
151cdf0e10cSrcweir 
152cdf0e10cSrcweir 	SaveNotRegisteredFor(MSWORD);
153cdf0e10cSrcweir }
154cdf0e10cSrcweir 
155cdf0e10cSrcweir bool Registrar::QueryPreselectForMsApplication(const std::wstring& file_extension) const
156cdf0e10cSrcweir {
157cdf0e10cSrcweir     bool preselect = false;
158cdf0e10cSrcweir 
159cdf0e10cSrcweir     // We use HKCR else we would not see that a registration for
160cdf0e10cSrcweir     // MS Office applications already exist if we are about to
161cdf0e10cSrcweir     // register in HKCU\Software\Classes
162cdf0e10cSrcweir     RegistryKey root_key = WindowsRegistry().GetClassesRootKey();
163cdf0e10cSrcweir 
164cdf0e10cSrcweir 	if (!root_key->HasSubKey(file_extension))
165cdf0e10cSrcweir 	{
166cdf0e10cSrcweir         preselect = true;
167cdf0e10cSrcweir         OutputDebugStringFormat( TEXT("QueryPreselect: No SubKey found for (%s), preselected!\n"), file_extension.c_str() );
168cdf0e10cSrcweir     }
169cdf0e10cSrcweir     else
170cdf0e10cSrcweir     {
171cdf0e10cSrcweir         RegistryKey RegKey = root_key->OpenSubKey(file_extension, false);
172cdf0e10cSrcweir 
173cdf0e10cSrcweir         if (RegKey->HasValue(DEFAULT_VALUE_NAME))
174cdf0e10cSrcweir 	    {
175cdf0e10cSrcweir 		    RegistryValue RegVal = RegKey->GetValue(DEFAULT_VALUE_NAME);
176cdf0e10cSrcweir 
177cdf0e10cSrcweir 		    if (REG_SZ == RegVal->GetType() &&
178cdf0e10cSrcweir 		        IsOpenOfficeRegisteredForMsApplication(RegVal->GetDataAsUniString()))
179cdf0e10cSrcweir             {
180cdf0e10cSrcweir 			    preselect = true;
181cdf0e10cSrcweir                 OutputDebugStringFormat( TEXT("QueryPreselect: (%s) registered to Office, preselected!\n"), file_extension.c_str() );
182cdf0e10cSrcweir             }
183cdf0e10cSrcweir             else if ( (REG_SZ == RegVal->GetType()) && ! root_key->HasSubKey( RegVal->GetDataAsUniString() ) )
184cdf0e10cSrcweir             {
185cdf0e10cSrcweir 			    preselect = true;
186cdf0e10cSrcweir                 OutputDebugStringFormat( TEXT("QueryPreselect: (%s) registered but destination is empty, preselected!\n"), file_extension.c_str() );
187cdf0e10cSrcweir             }
188cdf0e10cSrcweir 	    }
189cdf0e10cSrcweir         else
190cdf0e10cSrcweir         {
191cdf0e10cSrcweir             preselect = true;
192cdf0e10cSrcweir             OutputDebugStringFormat( TEXT("QueryPreselect: No default found for SubKey (%s), preselected!\n"), file_extension.c_str() );
193cdf0e10cSrcweir         }
194cdf0e10cSrcweir     }
195cdf0e10cSrcweir     return preselect;
196cdf0e10cSrcweir }
197cdf0e10cSrcweir 
198cdf0e10cSrcweir bool Registrar::QueryPreselectMsWordRegistration() const
199cdf0e10cSrcweir {
200cdf0e10cSrcweir     return QueryPreselectForMsApplication(
201cdf0e10cSrcweir         m_ContextInformation.GetWordDocumentFileExtension());
202cdf0e10cSrcweir }
203cdf0e10cSrcweir 
204cdf0e10cSrcweir void Registrar::RegisterForMsExcel() const
205cdf0e10cSrcweir {
206cdf0e10cSrcweir     assert(m_RootKey.get());
207cdf0e10cSrcweir 
208cdf0e10cSrcweir 	RegisterForMsOfficeApplication(
209cdf0e10cSrcweir 		m_ContextInformation.GetExcelSheetFileExtension(),
210cdf0e10cSrcweir 		m_ContextInformation.GetExcelSheetDisplayName(),
211cdf0e10cSrcweir 		m_ContextInformation.GetExcelSheetDefaultIconEntry(),
212cdf0e10cSrcweir 		m_ContextInformation.GetExcelSheetDefaultShellCommand(),
213cdf0e10cSrcweir 		m_ContextInformation.ShellNewCommandDisplayName(),
214cdf0e10cSrcweir         RegistrationContextInformation::Calc);
215cdf0e10cSrcweir 
216cdf0e10cSrcweir 	RegisterForMsOfficeApplication(
217cdf0e10cSrcweir 		m_ContextInformation.GetExcelTemplateFileExtension(),
218cdf0e10cSrcweir 		m_ContextInformation.GetExcelTemplateDisplayName(),
219cdf0e10cSrcweir 		m_ContextInformation.GetExcelTemplateDefaultIconEntry(),
220cdf0e10cSrcweir 		m_ContextInformation.GetExcelTemplateDefaultShellCommand(),
221cdf0e10cSrcweir 		m_ContextInformation.ShellNewCommandDisplayName(),
222cdf0e10cSrcweir         RegistrationContextInformation::Calc);
223cdf0e10cSrcweir 
224cdf0e10cSrcweir     SaveRegisteredFor(MSEXCEL);
225cdf0e10cSrcweir }
226cdf0e10cSrcweir 
227cdf0e10cSrcweir void Registrar::UnregisterForMsExcel() const
228cdf0e10cSrcweir {
229cdf0e10cSrcweir     assert(m_RootKey.get());
230cdf0e10cSrcweir 
231cdf0e10cSrcweir 	try
232cdf0e10cSrcweir 	{
233cdf0e10cSrcweir 		UnregisterForMsOfficeApplication(
234cdf0e10cSrcweir 			m_ContextInformation.GetExcelSheetFileExtension());
235cdf0e10cSrcweir 	}
236cdf0e10cSrcweir 	catch(RegistryKeyNotFoundException&)
237cdf0e10cSrcweir 	{}
238cdf0e10cSrcweir 
239cdf0e10cSrcweir 	try
240cdf0e10cSrcweir 	{
241cdf0e10cSrcweir 		UnregisterForMsOfficeApplication(
242cdf0e10cSrcweir 			m_ContextInformation.GetExcelTemplateFileExtension());
243cdf0e10cSrcweir 	}
244cdf0e10cSrcweir 	catch(RegistryKeyNotFoundException&)
245cdf0e10cSrcweir 	{}
246cdf0e10cSrcweir 
247cdf0e10cSrcweir     SaveNotRegisteredFor(MSEXCEL);
248cdf0e10cSrcweir }
249cdf0e10cSrcweir 
250cdf0e10cSrcweir bool Registrar::QueryPreselectMsExcelRegistration() const
251cdf0e10cSrcweir {
252cdf0e10cSrcweir     return QueryPreselectForMsApplication(
253cdf0e10cSrcweir         m_ContextInformation.GetExcelSheetFileExtension());
254cdf0e10cSrcweir }
255cdf0e10cSrcweir 
256cdf0e10cSrcweir void Registrar::RegisterForMsPowerPoint() const
257cdf0e10cSrcweir {
258cdf0e10cSrcweir     assert(m_RootKey.get());
259cdf0e10cSrcweir 
260cdf0e10cSrcweir     RegisterForMsOfficeApplication(
261cdf0e10cSrcweir         m_ContextInformation.GetPowerPointDocumentFileExtension(),
262cdf0e10cSrcweir         m_ContextInformation.GetPowerPointDocumentDisplayName(),
263cdf0e10cSrcweir         m_ContextInformation.GetPowerPointDocumentDefaultIconEntry(),
264cdf0e10cSrcweir         m_ContextInformation.GetPowerPointDocumentDefaultShellCommand(),
265cdf0e10cSrcweir         m_ContextInformation.ShellNewCommandDisplayName(),
266cdf0e10cSrcweir         RegistrationContextInformation::Impress);
267cdf0e10cSrcweir 
268cdf0e10cSrcweir     RegisterForMsOfficeApplication(
269cdf0e10cSrcweir         m_ContextInformation.GetPowerPointShowFileExtension(),
270cdf0e10cSrcweir         m_ContextInformation.GetPowerPointShowDisplayName(),
271cdf0e10cSrcweir         m_ContextInformation.GetPowerPointShowDefaultIconEntry(),
272cdf0e10cSrcweir         m_ContextInformation.GetPowerPointShowDefaultShellCommand(),
273cdf0e10cSrcweir         m_ContextInformation.ShellNewCommandDisplayName(),
274cdf0e10cSrcweir         RegistrationContextInformation::Impress);
275cdf0e10cSrcweir 
276cdf0e10cSrcweir     RegisterForMsOfficeApplication(
277cdf0e10cSrcweir         m_ContextInformation.GetPowerPointTemplateFileExtension(),
278cdf0e10cSrcweir         m_ContextInformation.GetPowerPointTemplateDisplayName(),
279cdf0e10cSrcweir         m_ContextInformation.GetPowerPointTemplateDefaultIconEntry(),
280cdf0e10cSrcweir         m_ContextInformation.GetPowerPointTemplateDefaultShellCommand(),
281cdf0e10cSrcweir         m_ContextInformation.ShellNewCommandDisplayName(),
282cdf0e10cSrcweir         RegistrationContextInformation::Impress);
283cdf0e10cSrcweir 
284cdf0e10cSrcweir     SaveRegisteredFor(MSPOWERPOINT);
285cdf0e10cSrcweir }
286cdf0e10cSrcweir 
287cdf0e10cSrcweir void Registrar::UnregisterForMsPowerPoint() const
288cdf0e10cSrcweir {
289cdf0e10cSrcweir     assert(m_RootKey.get());
290cdf0e10cSrcweir 
291cdf0e10cSrcweir 	try
292cdf0e10cSrcweir 	{
293cdf0e10cSrcweir 		UnregisterForMsOfficeApplication(
294cdf0e10cSrcweir 			m_ContextInformation.GetPowerPointDocumentFileExtension());
295cdf0e10cSrcweir 	}
296cdf0e10cSrcweir 	catch(RegistryKeyNotFoundException&)
297cdf0e10cSrcweir 	{}
298cdf0e10cSrcweir 
299cdf0e10cSrcweir 	try
300cdf0e10cSrcweir 	{
301cdf0e10cSrcweir 		UnregisterForMsOfficeApplication(
302cdf0e10cSrcweir 			m_ContextInformation.GetPowerPointShowFileExtension());
303cdf0e10cSrcweir 	}
304cdf0e10cSrcweir 	catch(RegistryKeyNotFoundException&)
305cdf0e10cSrcweir 	{}
306cdf0e10cSrcweir 
307cdf0e10cSrcweir 	try
308cdf0e10cSrcweir 	{
309cdf0e10cSrcweir 		UnregisterForMsOfficeApplication(
310cdf0e10cSrcweir 			m_ContextInformation.GetPowerPointTemplateFileExtension());
311cdf0e10cSrcweir 	}
312cdf0e10cSrcweir 	catch(RegistryKeyNotFoundException&)
313cdf0e10cSrcweir 	{}
314cdf0e10cSrcweir 
315cdf0e10cSrcweir     SaveNotRegisteredFor(MSPOWERPOINT);
316cdf0e10cSrcweir }
317cdf0e10cSrcweir 
318cdf0e10cSrcweir //-----------------------------------------
319cdf0e10cSrcweir /*
320cdf0e10cSrcweir */
321cdf0e10cSrcweir bool Registrar::QueryPreselectMsPowerPointRegistration() const
322cdf0e10cSrcweir {
323cdf0e10cSrcweir     return QueryPreselectForMsApplication( m_ContextInformation.GetPowerPointDocumentFileExtension()) &&
324cdf0e10cSrcweir            QueryPreselectForMsApplication( m_ContextInformation.GetPowerPointShowFileExtension());
325cdf0e10cSrcweir }
326cdf0e10cSrcweir 
327cdf0e10cSrcweir //-----------------------------------------
328cdf0e10cSrcweir /** The documentation says we have to
329cdf0e10cSrcweir       make the following entries to register
330cdf0e10cSrcweir       a html editor for the Internet Explorer
331cdf0e10cSrcweir       HKCR\.htm\OpenWithList\App Friendly Name\shell\edit\command
332cdf0e10cSrcweir       But the reality shows that this works only
333cdf0e10cSrcweir       with Internet Explorer 5.x
334cdf0e10cSrcweir       Internet Explorer 6.0 wants the follwoing
335cdf0e10cSrcweir       entries:
336cdf0e10cSrcweir       HKCR\.htm\OpenWithList\App.exe
337cdf0e10cSrcweir       HKCR\Applications\App.ex\shell\edit\command
338cdf0e10cSrcweir */
339cdf0e10cSrcweir void Registrar::RegisterAsHtmlEditorForInternetExplorer() const
340cdf0e10cSrcweir {
341cdf0e10cSrcweir     assert(m_RootKey.get());
342cdf0e10cSrcweir 
343cdf0e10cSrcweir     std::wstring OOFriendlyAppName = m_ContextInformation.GetOpenOfficeFriendlyAppName();
344cdf0e10cSrcweir 
345cdf0e10cSrcweir     std::wstring RegKeyName = HTM_OPENWITHLIST + std::wstring(L"\\") + OOFriendlyAppName;
346cdf0e10cSrcweir     RegistryKey RegKey = m_RootKey->CreateSubKey(RegKeyName);
347cdf0e10cSrcweir 
348cdf0e10cSrcweir     RegKey = RegKey->CreateSubKey(SHELL_EDIT_COMMAND);
349cdf0e10cSrcweir 
350cdf0e10cSrcweir     RegistryValue RegVal(
351cdf0e10cSrcweir         new RegistryValueImpl(
352cdf0e10cSrcweir             DEFAULT_VALUE_NAME,
353cdf0e10cSrcweir             m_ContextInformation.GetOpenOfficeCommandline(RegistrationContextInformation::Open,
354cdf0e10cSrcweir                                                           RegistrationContextInformation::Writer)));
355cdf0e10cSrcweir 
356cdf0e10cSrcweir     RegKey->SetValue(RegVal);
357cdf0e10cSrcweir 
358cdf0e10cSrcweir     RegKeyName = APPLICATIONS + std::wstring(L"\\") + OOFriendlyAppName;
359cdf0e10cSrcweir     RegKey = m_RootKey->CreateSubKey(RegKeyName);
360cdf0e10cSrcweir 
361cdf0e10cSrcweir     RegVal->SetName(L"FriendlyAppName");
362cdf0e10cSrcweir     RegVal->SetValue(OOFriendlyAppName);
363cdf0e10cSrcweir     RegKey->SetValue(RegVal);
364cdf0e10cSrcweir 
365cdf0e10cSrcweir     RegKey = RegKey->CreateSubKey(SHELL_EDIT_COMMAND);
366cdf0e10cSrcweir     RegVal->SetName(DEFAULT_VALUE_NAME);
367cdf0e10cSrcweir     RegVal->SetValue(
368cdf0e10cSrcweir         m_ContextInformation.GetOpenOfficeCommandline(RegistrationContextInformation::Open,
369cdf0e10cSrcweir                                                       RegistrationContextInformation::Writer));
370cdf0e10cSrcweir     RegKey->SetValue(RegVal);
371cdf0e10cSrcweir 
372cdf0e10cSrcweir     SaveRegisteredFor(HTML_EDITOR);
373cdf0e10cSrcweir }
374cdf0e10cSrcweir 
375cdf0e10cSrcweir void Registrar::UnregisterAsHtmlEditorForInternetExplorer() const
376cdf0e10cSrcweir {
377cdf0e10cSrcweir     assert(m_RootKey.get());
378cdf0e10cSrcweir 
379cdf0e10cSrcweir 	try
380cdf0e10cSrcweir 	{
381cdf0e10cSrcweir 		std::wstring OOFriendlyAppName = m_ContextInformation.GetOpenOfficeFriendlyAppName();
382cdf0e10cSrcweir 
383cdf0e10cSrcweir         RegistryKey aRegKey = m_RootKey->OpenSubKey( APPLICATIONS );
384cdf0e10cSrcweir         if ( aRegKey->HasSubKey( OOFriendlyAppName ) )
385cdf0e10cSrcweir 		    aRegKey->DeleteSubKeyTree( OOFriendlyAppName );
386cdf0e10cSrcweir 
387cdf0e10cSrcweir         aRegKey = m_RootKey->OpenSubKey( HTM_OPENWITHLIST );
388cdf0e10cSrcweir         if ( aRegKey->HasSubKey( OOFriendlyAppName ) )
389cdf0e10cSrcweir 		    aRegKey->DeleteSubKeyTree( OOFriendlyAppName );
390cdf0e10cSrcweir 	}
391cdf0e10cSrcweir     catch(RegistryKeyNotFoundException&)
392cdf0e10cSrcweir 	{}
393cdf0e10cSrcweir 
394cdf0e10cSrcweir     SaveNotRegisteredFor(HTML_EDITOR);
395cdf0e10cSrcweir }
396cdf0e10cSrcweir 
397cdf0e10cSrcweir void Registrar::RegisterAsDefaultHtmlEditorForInternetExplorer() const
398cdf0e10cSrcweir {
399cdf0e10cSrcweir     assert(m_RootKey.get());
400cdf0e10cSrcweir 
401cdf0e10cSrcweir     RegistryKey RegistrationRootKey = GetRootKeyForDefHtmlEditorForIERegistration();
402cdf0e10cSrcweir 
403cdf0e10cSrcweir     RegistryKey RegKey = RegistrationRootKey->CreateSubKey(MS_IE_DEF_HTML_EDITOR_SHL_EDIT_CMD);
404cdf0e10cSrcweir 
405cdf0e10cSrcweir     RegistryValue RegVal = RegistryValue(new RegistryValueImpl(DEFAULT_VALUE_NAME, L""));
406cdf0e10cSrcweir 
407cdf0e10cSrcweir     if (RegKey->HasValue(DEFAULT_VALUE_NAME))
408cdf0e10cSrcweir 	{
409cdf0e10cSrcweir         RegVal = RegKey->GetValue(DEFAULT_VALUE_NAME);
410cdf0e10cSrcweir 
411cdf0e10cSrcweir         std::wstring CmdLine = RegVal->GetDataAsUniString();
412cdf0e10cSrcweir 
413cdf0e10cSrcweir         if (std::wstring::npos == CmdLine.find(m_ContextInformation.GetOpenOfficeExecutableName()))
414cdf0e10cSrcweir         {
415cdf0e10cSrcweir             RegistryKey BackupRegKey = m_RootKey->CreateSubKey(PRIVATE_BACKUP_KEY_NAME + L"\\" + DEFAULT_HTML_EDITOR);
416cdf0e10cSrcweir 
417cdf0e10cSrcweir             if (RegKey->HasValue(DEFAULT_VALUE_NAME))
418cdf0e10cSrcweir                 BackupRegKey->CopyValue(RegKey, DEFAULT_VALUE_NAME);
419cdf0e10cSrcweir 
420cdf0e10cSrcweir             RegKey = RegistrationRootKey->OpenSubKey(MS_IE_DEF_HTML_EDITOR);
421cdf0e10cSrcweir             if (RegKey->HasValue(L"Description"))
422cdf0e10cSrcweir                 BackupRegKey->CopyValue(RegKey, L"Description");
423cdf0e10cSrcweir         }
424cdf0e10cSrcweir     }
425cdf0e10cSrcweir 
426cdf0e10cSrcweir     RegVal->SetValue(
427cdf0e10cSrcweir         m_ContextInformation.GetOpenOfficeCommandline(RegistrationContextInformation::Open,
428cdf0e10cSrcweir                                                       RegistrationContextInformation::Writer));
429cdf0e10cSrcweir     RegKey = RegistrationRootKey->OpenSubKey(MS_IE_DEF_HTML_EDITOR_SHL_EDIT_CMD);
430cdf0e10cSrcweir     RegKey->SetValue(RegVal);
431cdf0e10cSrcweir 
432cdf0e10cSrcweir     RegVal->SetName(L"Description");
433cdf0e10cSrcweir     RegVal->SetValue(m_ContextInformation.GetOpenOfficeFriendlyAppName());
434cdf0e10cSrcweir     RegKey = RegistrationRootKey->OpenSubKey(MS_IE_DEF_HTML_EDITOR);
435cdf0e10cSrcweir     RegKey->SetValue(RegVal);
436cdf0e10cSrcweir 
437cdf0e10cSrcweir     SaveRegisteredFor(DEFAULT_HTML_EDITOR_FOR_IE);
438cdf0e10cSrcweir }
439cdf0e10cSrcweir 
440cdf0e10cSrcweir void Registrar::UnregisterAsDefaultHtmlEditorForInternetExplorer() const
441cdf0e10cSrcweir {
442cdf0e10cSrcweir     assert(m_RootKey.get());
443cdf0e10cSrcweir 
444cdf0e10cSrcweir     RegistryKey RegistrationRootKey = GetRootKeyForDefHtmlEditorForIERegistration();
445cdf0e10cSrcweir 
446cdf0e10cSrcweir     RegistryKey RegKey = RegistrationRootKey->OpenSubKey(MS_IE_DEF_HTML_EDITOR_SHL_EDIT_CMD);
447cdf0e10cSrcweir 
448cdf0e10cSrcweir     if (RegKey->HasValue(DEFAULT_VALUE_NAME))
449cdf0e10cSrcweir     {
450cdf0e10cSrcweir         RegistryValue RegVal = RegKey->GetValue(DEFAULT_VALUE_NAME);
451cdf0e10cSrcweir 
452cdf0e10cSrcweir         std::wstring CmdLine = RegVal->GetDataAsUniString();
453cdf0e10cSrcweir 
454cdf0e10cSrcweir         if (std::wstring::npos != CmdLine.find(m_ContextInformation.GetOpenOfficeExecutableName()))
455cdf0e10cSrcweir         {
456cdf0e10cSrcweir             RegistryKey BackupRegKey = m_RootKey->OpenSubKey(PRIVATE_BACKUP_KEY_NAME);
457cdf0e10cSrcweir 
458cdf0e10cSrcweir             if (BackupRegKey->HasSubKey(DEFAULT_HTML_EDITOR))
459cdf0e10cSrcweir             {
460cdf0e10cSrcweir                 BackupRegKey = BackupRegKey->OpenSubKey(DEFAULT_HTML_EDITOR);
461cdf0e10cSrcweir 
462cdf0e10cSrcweir                 if (BackupRegKey->HasValue(DEFAULT_VALUE_NAME))
463cdf0e10cSrcweir                     RegKey->CopyValue(BackupRegKey, DEFAULT_VALUE_NAME);
464cdf0e10cSrcweir                 else
465cdf0e10cSrcweir                     RegKey->DeleteValue(DEFAULT_VALUE_NAME);
466cdf0e10cSrcweir 
467cdf0e10cSrcweir                 RegKey = RegistrationRootKey->OpenSubKey(MS_IE_DEF_HTML_EDITOR);
468cdf0e10cSrcweir 
469cdf0e10cSrcweir                 if (BackupRegKey->HasValue(L"Description"))
470cdf0e10cSrcweir                     RegKey->CopyValue(BackupRegKey, L"Description");
471cdf0e10cSrcweir                 else
472cdf0e10cSrcweir                     RegKey->DeleteValue(L"Description");
473cdf0e10cSrcweir             }
474cdf0e10cSrcweir             else
475cdf0e10cSrcweir             {
476cdf0e10cSrcweir                 RegKey->DeleteValue(DEFAULT_VALUE_NAME);
477cdf0e10cSrcweir                 RegKey = RegistrationRootKey->OpenSubKey(MS_IE_DEF_HTML_EDITOR);
478cdf0e10cSrcweir                 RegKey->DeleteValue(L"Description");
479cdf0e10cSrcweir             }
480cdf0e10cSrcweir         }
481cdf0e10cSrcweir     }
482cdf0e10cSrcweir 
483cdf0e10cSrcweir     SaveNotRegisteredFor(DEFAULT_HTML_EDITOR_FOR_IE);
484cdf0e10cSrcweir }
485cdf0e10cSrcweir 
486cdf0e10cSrcweir void Registrar::RegisterAsDefaultShellHtmlEditor() const
487cdf0e10cSrcweir {
488cdf0e10cSrcweir     assert(m_RootKey.get());
489cdf0e10cSrcweir 
490cdf0e10cSrcweir     RegistryKey RegKey = m_RootKey->CreateSubKey(L".htm");
491cdf0e10cSrcweir 
492cdf0e10cSrcweir     RegistryValue RegVal = RegistryValue(
493cdf0e10cSrcweir         new RegistryValueImpl(DEFAULT_VALUE_NAME, L""));
494cdf0e10cSrcweir 
495cdf0e10cSrcweir     if (RegKey->HasValue(DEFAULT_VALUE_NAME))
496cdf0e10cSrcweir         RegVal = RegKey->GetValue(DEFAULT_VALUE_NAME);
497cdf0e10cSrcweir 
498cdf0e10cSrcweir     std::wstring HtmFwdKey = RegVal->GetDataAsUniString();
499cdf0e10cSrcweir     if (0 == HtmFwdKey.length() || !m_RootKey->HasSubKey(HtmFwdKey))
500cdf0e10cSrcweir         HtmFwdKey = L".htm";
501cdf0e10cSrcweir 
502cdf0e10cSrcweir     RegKey = m_RootKey->CreateSubKey(HtmFwdKey + L"\\" + SHELL_EDIT_COMMAND);
503cdf0e10cSrcweir 
504cdf0e10cSrcweir 	if (RegKey->HasValue(DEFAULT_VALUE_NAME))
505cdf0e10cSrcweir 	{
506cdf0e10cSrcweir 		RegVal = RegKey->GetValue(DEFAULT_VALUE_NAME);
507cdf0e10cSrcweir 
508cdf0e10cSrcweir 		std::wstring CmdLine = RegVal->GetDataAsUniString();
509cdf0e10cSrcweir 
510cdf0e10cSrcweir 		// backup old values if we are not in place
511cdf0e10cSrcweir 		if (std::wstring::npos == CmdLine.find(m_ContextInformation.GetOpenOfficeExecutableName()))
512cdf0e10cSrcweir 		{
513cdf0e10cSrcweir 			RegistryKey BackupRegKey = m_RootKey->CreateSubKey(PRIVATE_BACKUP_KEY_NAME + L"\\" + HTML_EDIT);
514cdf0e10cSrcweir 			BackupRegKey->CopyValue(RegKey, DEFAULT_VALUE_NAME, SHELL_EDIT_COMMAND_BACKUP);
515cdf0e10cSrcweir 		}
516cdf0e10cSrcweir 	}
517cdf0e10cSrcweir 
518cdf0e10cSrcweir     RegVal->SetValue(
519cdf0e10cSrcweir         m_ContextInformation.GetOpenOfficeCommandline(RegistrationContextInformation::Open,
520cdf0e10cSrcweir                                                       RegistrationContextInformation::Writer));
521cdf0e10cSrcweir 
522cdf0e10cSrcweir     RegKey->SetValue(RegVal);
523cdf0e10cSrcweir 
524cdf0e10cSrcweir     SaveRegisteredFor(DEFAULT_SHELL_HTML_EDITOR);
525cdf0e10cSrcweir }
526cdf0e10cSrcweir 
527cdf0e10cSrcweir void Registrar::UnregisterAsDefaultShellHtmlEditor() const
528cdf0e10cSrcweir {
529cdf0e10cSrcweir     assert(m_RootKey.get());
530cdf0e10cSrcweir 
531cdf0e10cSrcweir 	try
532cdf0e10cSrcweir 	{
533cdf0e10cSrcweir 		RegistryKey RegKey = m_RootKey->OpenSubKey(L".htm");
534cdf0e10cSrcweir 
535cdf0e10cSrcweir 		RegistryValue RegVal = RegistryValue(
536cdf0e10cSrcweir 			new RegistryValueImpl(DEFAULT_VALUE_NAME, L""));
537cdf0e10cSrcweir 
538cdf0e10cSrcweir 		if (RegKey->HasValue(DEFAULT_VALUE_NAME))
539cdf0e10cSrcweir 			RegVal = RegKey->GetValue(DEFAULT_VALUE_NAME);
540cdf0e10cSrcweir 
541cdf0e10cSrcweir 		std::wstring HtmFwdKey = RegVal->GetDataAsUniString();
542cdf0e10cSrcweir 
543cdf0e10cSrcweir 		if (0 == HtmFwdKey.length() || !m_RootKey->HasSubKey(HtmFwdKey))
544cdf0e10cSrcweir 			HtmFwdKey = L".htm";
545cdf0e10cSrcweir 
546cdf0e10cSrcweir 		RegKey = m_RootKey->OpenSubKey(HtmFwdKey + L"\\" + SHELL_EDIT_COMMAND);
547cdf0e10cSrcweir 
548cdf0e10cSrcweir 		RegVal = RegKey->GetValue(DEFAULT_VALUE_NAME);
549cdf0e10cSrcweir 
550cdf0e10cSrcweir 		std::wstring CmdLine = RegVal->GetDataAsUniString();
551cdf0e10cSrcweir 
552cdf0e10cSrcweir 		if (std::wstring::npos != CmdLine.find(m_ContextInformation.GetOpenOfficeExecutableName()))
553cdf0e10cSrcweir 		{
554cdf0e10cSrcweir 			RegistryKey BackupRegKey = m_RootKey->CreateSubKey(PRIVATE_BACKUP_KEY_NAME + L"\\" + HTML_EDIT);
555cdf0e10cSrcweir 
556cdf0e10cSrcweir 			if (BackupRegKey->HasValue(SHELL_EDIT_COMMAND_BACKUP))
557cdf0e10cSrcweir 				RegKey->CopyValue(BackupRegKey, SHELL_EDIT_COMMAND_BACKUP, DEFAULT_VALUE_NAME);
558cdf0e10cSrcweir 			else
559cdf0e10cSrcweir 				RegKey->DeleteValue(DEFAULT_VALUE_NAME);
560cdf0e10cSrcweir 		}
561cdf0e10cSrcweir 	}
562cdf0e10cSrcweir     catch(RegistryKeyNotFoundException&)
563cdf0e10cSrcweir 	{
564cdf0e10cSrcweir 	}
565cdf0e10cSrcweir 
566cdf0e10cSrcweir     SaveNotRegisteredFor(DEFAULT_SHELL_HTML_EDITOR);
567cdf0e10cSrcweir }
568cdf0e10cSrcweir 
569cdf0e10cSrcweir void Registrar::SaveRegisteredFor(int State) const
570cdf0e10cSrcweir {
571cdf0e10cSrcweir     assert(m_RootKey.get());
572cdf0e10cSrcweir 
573cdf0e10cSrcweir     int NewState = GetRegisterState();
574cdf0e10cSrcweir     NewState |= State;
575cdf0e10cSrcweir     SetRegisterState(NewState);
576cdf0e10cSrcweir }
577cdf0e10cSrcweir 
578cdf0e10cSrcweir void Registrar::SaveNotRegisteredFor(int State) const
579cdf0e10cSrcweir {
580cdf0e10cSrcweir     assert(m_RootKey.get());
581cdf0e10cSrcweir 
582cdf0e10cSrcweir     int NewState = GetRegisterState();
583cdf0e10cSrcweir     NewState &= ~State;
584cdf0e10cSrcweir     SetRegisterState(NewState);
585cdf0e10cSrcweir }
586cdf0e10cSrcweir 
587cdf0e10cSrcweir int Registrar::GetRegisterState() const
588cdf0e10cSrcweir {
589cdf0e10cSrcweir     int State = 0;
590cdf0e10cSrcweir 
591cdf0e10cSrcweir     RegistryKey RegKey = m_RootKey->CreateSubKey(PRIVATE_BACKUP_KEY_NAME);
592cdf0e10cSrcweir 
593cdf0e10cSrcweir     if (RegKey->HasValue(REGISTRATION_STATE))
594cdf0e10cSrcweir     {
595cdf0e10cSrcweir         RegistryValue RegVal = RegKey->GetValue(REGISTRATION_STATE);
596cdf0e10cSrcweir         if (REG_DWORD == RegVal->GetType())
597cdf0e10cSrcweir             State = RegVal->GetDataAsInt();
598cdf0e10cSrcweir     }
599cdf0e10cSrcweir 
600cdf0e10cSrcweir     return State;
601cdf0e10cSrcweir }
602cdf0e10cSrcweir 
603cdf0e10cSrcweir void Registrar::SetRegisterState(int NewState) const
604cdf0e10cSrcweir {
605cdf0e10cSrcweir     RegistryKey RegKey = m_RootKey->CreateSubKey(PRIVATE_BACKUP_KEY_NAME);
606cdf0e10cSrcweir     RegistryValue RegVal = RegistryValue(new RegistryValueImpl(REGISTRATION_STATE, NewState));
607cdf0e10cSrcweir     RegKey->SetValue(RegVal);
608cdf0e10cSrcweir }
609cdf0e10cSrcweir 
610cdf0e10cSrcweir bool Registrar::IsRegisteredFor(int State) const
611cdf0e10cSrcweir {
612cdf0e10cSrcweir     assert(m_RootKey.get());
613cdf0e10cSrcweir 
614cdf0e10cSrcweir     RegistryKey RegKey = m_RootKey->CreateSubKey(PRIVATE_BACKUP_KEY_NAME);
615cdf0e10cSrcweir 
616cdf0e10cSrcweir     int SavedState = 0;
617cdf0e10cSrcweir 
618cdf0e10cSrcweir     if (RegKey->HasValue(REGISTRATION_STATE))
619cdf0e10cSrcweir     {
620cdf0e10cSrcweir         RegistryValue RegVal = RegKey->GetValue(REGISTRATION_STATE);
621cdf0e10cSrcweir         if (REG_DWORD == RegVal->GetType())
622cdf0e10cSrcweir             SavedState = RegVal->GetDataAsInt();
623cdf0e10cSrcweir     }
624cdf0e10cSrcweir 
625cdf0e10cSrcweir 	return ((SavedState & State) == State);
626cdf0e10cSrcweir }
627cdf0e10cSrcweir 
628cdf0e10cSrcweir //--------------------------------------
629cdf0e10cSrcweir /** Restore the last registration state (necessary for
630cdf0e10cSrcweir 	Setup repair) */
631cdf0e10cSrcweir void Registrar::RepairRegistrationState() const
632cdf0e10cSrcweir {
633cdf0e10cSrcweir     assert(m_RootKey.get());
634cdf0e10cSrcweir 
635cdf0e10cSrcweir 	if (IsRegisteredFor(MSWORD))
636cdf0e10cSrcweir 		RegisterForMsWord();
637cdf0e10cSrcweir 
638cdf0e10cSrcweir 	if (IsRegisteredFor(MSEXCEL))
639cdf0e10cSrcweir 		RegisterForMsExcel();
640cdf0e10cSrcweir 
641cdf0e10cSrcweir 	if (IsRegisteredFor(MSPOWERPOINT))
642cdf0e10cSrcweir 		RegisterForMsPowerPoint();
643cdf0e10cSrcweir 
644cdf0e10cSrcweir 	if (IsRegisteredFor(DEFAULT_HTML_EDITOR_FOR_IE))
645cdf0e10cSrcweir 		RegisterAsDefaultHtmlEditorForInternetExplorer();
646cdf0e10cSrcweir 
647cdf0e10cSrcweir 	if (IsRegisteredFor(HTML_EDITOR))
648cdf0e10cSrcweir 		RegisterAsHtmlEditorForInternetExplorer();
649cdf0e10cSrcweir 
650cdf0e10cSrcweir 	if (IsRegisteredFor(DEFAULT_SHELL_HTML_EDITOR))
651cdf0e10cSrcweir 		RegisterAsDefaultShellHtmlEditor();
652cdf0e10cSrcweir }
653cdf0e10cSrcweir 
654cdf0e10cSrcweir /** Unregisters all and delete all Registry keys we have written */
655cdf0e10cSrcweir void Registrar::UnregisterAllAndCleanUpRegistry() const
656cdf0e10cSrcweir {
657cdf0e10cSrcweir 	assert(m_RootKey.get());
658cdf0e10cSrcweir 
659cdf0e10cSrcweir 	if (IsRegisteredFor(MSWORD))
660cdf0e10cSrcweir 		UnregisterForMsWord();
661cdf0e10cSrcweir 
662cdf0e10cSrcweir 	if (IsRegisteredFor(MSEXCEL))
663cdf0e10cSrcweir 		UnregisterForMsExcel();
664cdf0e10cSrcweir 
665cdf0e10cSrcweir 	if (IsRegisteredFor(MSPOWERPOINT))
666cdf0e10cSrcweir 		UnregisterForMsPowerPoint();
667cdf0e10cSrcweir 
668cdf0e10cSrcweir 	if (IsRegisteredFor(DEFAULT_HTML_EDITOR_FOR_IE))
669cdf0e10cSrcweir 		UnregisterAsDefaultHtmlEditorForInternetExplorer();
670cdf0e10cSrcweir 
671cdf0e10cSrcweir 	if (IsRegisteredFor(HTML_EDITOR))
672cdf0e10cSrcweir 		UnregisterAsHtmlEditorForInternetExplorer();
673cdf0e10cSrcweir 
674cdf0e10cSrcweir 	if (IsRegisteredFor(DEFAULT_SHELL_HTML_EDITOR))
675cdf0e10cSrcweir 		UnregisterAsDefaultShellHtmlEditor();
676cdf0e10cSrcweir 
677cdf0e10cSrcweir 	if (m_RootKey->HasSubKey(PRIVATE_BACKUP_KEY_NAME))
678cdf0e10cSrcweir 	    m_RootKey->DeleteSubKeyTree(PRIVATE_BACKUP_KEY_NAME);
679cdf0e10cSrcweir }
680cdf0e10cSrcweir 
681cdf0e10cSrcweir void Registrar::RegisterForMsOfficeApplication(
682cdf0e10cSrcweir     const std::wstring& FileExtension,
683cdf0e10cSrcweir     const std::wstring& DocumentDisplayName,
684cdf0e10cSrcweir     const std::wstring& DefaultIconEntry,
685cdf0e10cSrcweir     const std::wstring& DefaultShellCommand,
686cdf0e10cSrcweir     const std::wstring& ShellNewCommandDisplayName,
687cdf0e10cSrcweir     const RegistrationContextInformation::OFFICE_APPLICATION eOfficeApp) const
688cdf0e10cSrcweir {
689cdf0e10cSrcweir     assert(m_RootKey.get());
690cdf0e10cSrcweir 
691cdf0e10cSrcweir 	std::wstring ForwardKeyName = FORWARD_KEY_PREFIX + FileExtension;
692cdf0e10cSrcweir 
693cdf0e10cSrcweir 	RegistryKey ForwardKey = m_RootKey->CreateSubKey(ForwardKeyName);
694cdf0e10cSrcweir 	RegistryValue RegVal(new RegistryValueImpl(std::wstring(DEFAULT_VALUE_NAME), DocumentDisplayName));
695cdf0e10cSrcweir 	ForwardKey->SetValue(RegVal);
696cdf0e10cSrcweir 
697cdf0e10cSrcweir 	RegistryKey RegKey = ForwardKey->CreateSubKey(L"DefaultIcon");
698cdf0e10cSrcweir 	RegVal->SetValue(DefaultIconEntry);
699cdf0e10cSrcweir 	RegKey->SetValue(RegVal);
700cdf0e10cSrcweir 
701cdf0e10cSrcweir 	RegistryKey RegKeyShell = ForwardKey->CreateSubKey(L"shell");
702cdf0e10cSrcweir 	RegVal->SetValue(DefaultShellCommand);
703cdf0e10cSrcweir 	RegKeyShell->SetValue(RegVal);
704cdf0e10cSrcweir 
705cdf0e10cSrcweir 	RegKey = RegKeyShell->CreateSubKey(L"new");
706cdf0e10cSrcweir 	RegVal->SetValue(ShellNewCommandDisplayName);
707cdf0e10cSrcweir 	RegKey->SetValue(RegVal);
708cdf0e10cSrcweir 
709cdf0e10cSrcweir 	RegKey = RegKey->CreateSubKey(L"command");
710cdf0e10cSrcweir 	RegVal->SetValue(m_ContextInformation.GetOpenOfficeCommandline(RegistrationContextInformation::New, eOfficeApp));
711cdf0e10cSrcweir 	RegKey->SetValue(RegVal);
712cdf0e10cSrcweir 
713cdf0e10cSrcweir 	RegKey = RegKeyShell->CreateSubKey(L"open\\command");
714cdf0e10cSrcweir 	RegVal->SetValue(m_ContextInformation.GetOpenOfficeCommandline(RegistrationContextInformation::Open, eOfficeApp));
715cdf0e10cSrcweir 	RegKey->SetValue(RegVal);
716cdf0e10cSrcweir 
717cdf0e10cSrcweir 	RegKey = RegKeyShell->CreateSubKey(L"print\\command");
718cdf0e10cSrcweir 	RegVal->SetValue(m_ContextInformation.GetOpenOfficeCommandline(RegistrationContextInformation::Print, eOfficeApp));
719cdf0e10cSrcweir 	RegKey->SetValue(RegVal);
720cdf0e10cSrcweir 
721cdf0e10cSrcweir 	RegKey = RegKeyShell->CreateSubKey(L"printto\\command");
722cdf0e10cSrcweir 	RegVal->SetValue(m_ContextInformation.GetOpenOfficeCommandline(RegistrationContextInformation::Printto, eOfficeApp));
723cdf0e10cSrcweir 	RegKey->SetValue(RegVal);
724cdf0e10cSrcweir 
725cdf0e10cSrcweir     // set the new forward key under the appropriate extension
726cdf0e10cSrcweir 	RegKey = m_RootKey->CreateSubKey(FileExtension);
727cdf0e10cSrcweir 
728cdf0e10cSrcweir 	if (RegKey->HasValue(DEFAULT_VALUE_NAME))
729cdf0e10cSrcweir 	{
730cdf0e10cSrcweir 		RegVal = RegKey->GetValue(DEFAULT_VALUE_NAME);
731cdf0e10cSrcweir 
732cdf0e10cSrcweir 		if (REG_SZ == RegVal->GetType())
733cdf0e10cSrcweir 		{
734cdf0e10cSrcweir 			std::wstring str = RegVal->GetDataAsUniString();
735cdf0e10cSrcweir 			if (!IsOpenOfficeRegisteredForMsApplication(str))
736cdf0e10cSrcweir 				ForwardKey->CopyValue(RegKey, DEFAULT_VALUE_NAME, BACKUP_VALUE_NAME);
737cdf0e10cSrcweir 		}
738cdf0e10cSrcweir 	}
739cdf0e10cSrcweir 
740cdf0e10cSrcweir 	RegVal->SetValue(ForwardKeyName);
741cdf0e10cSrcweir 	RegKey->SetValue(RegVal);
742cdf0e10cSrcweir }
743cdf0e10cSrcweir 
744cdf0e10cSrcweir void Registrar::UnregisterForMsOfficeApplication(const std::wstring& FileExtension) const
745cdf0e10cSrcweir {
746cdf0e10cSrcweir     std::wstring FwdRegKeyName = FORWARD_KEY_PREFIX + FileExtension;
747cdf0e10cSrcweir 
748cdf0e10cSrcweir     if (m_RootKey->HasSubKey(FileExtension))
749cdf0e10cSrcweir     {
750cdf0e10cSrcweir         RegistryKey RegKey = m_RootKey->OpenSubKey(FileExtension);
751cdf0e10cSrcweir 
752cdf0e10cSrcweir         if (RegKey->HasValue(DEFAULT_VALUE_NAME))
753cdf0e10cSrcweir         {
754cdf0e10cSrcweir             RegistryValue RegVal = RegKey->GetValue(DEFAULT_VALUE_NAME);
755cdf0e10cSrcweir             if (REG_SZ == RegVal->GetType() &&
756cdf0e10cSrcweir                 IsOpenOfficeRegisteredForMsApplication(RegVal->GetDataAsUniString()))
757cdf0e10cSrcweir             {
758cdf0e10cSrcweir                 RegistryKey FwdRegKey = m_RootKey->CreateSubKey(FwdRegKeyName);
759cdf0e10cSrcweir 
760cdf0e10cSrcweir                 if (FwdRegKey->HasValue(BACKUP_VALUE_NAME))
761cdf0e10cSrcweir                     RegKey->CopyValue(FwdRegKey, BACKUP_VALUE_NAME, DEFAULT_VALUE_NAME);
762cdf0e10cSrcweir                 else
763cdf0e10cSrcweir                     RegKey->DeleteValue(DEFAULT_VALUE_NAME);
764cdf0e10cSrcweir             }
765cdf0e10cSrcweir         }
766cdf0e10cSrcweir     }
767cdf0e10cSrcweir 
768cdf0e10cSrcweir     if (m_RootKey->HasSubKey(FwdRegKeyName))
769cdf0e10cSrcweir         m_RootKey->DeleteSubKeyTree(FwdRegKeyName);
770cdf0e10cSrcweir }
771cdf0e10cSrcweir 
772cdf0e10cSrcweir RegistryKey Registrar::GetRootKeyForDefHtmlEditorForIERegistration() const
773cdf0e10cSrcweir {
774cdf0e10cSrcweir     return WindowsRegistry().GetLocalMachineKey();
775cdf0e10cSrcweir }
776cdf0e10cSrcweir 
777cdf0e10cSrcweir bool Registrar::IsOpenOfficeRegisteredForMsApplication(const std::wstring& DocumentExtensionDefValue) const
778cdf0e10cSrcweir {
779cdf0e10cSrcweir     return (std::wstring::npos != DocumentExtensionDefValue.find(FORWARD_KEY_PREFIX));
780cdf0e10cSrcweir }
781