1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski // UserRegistrar.cpp: Implementierung der Klasse UserRegistrar. 23*b1cdbd2cSJim Jagielski // 24*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////// 25*b1cdbd2cSJim Jagielski 26*b1cdbd2cSJim Jagielski #include "userregistrar.hxx" 27*b1cdbd2cSJim Jagielski #include "registryvalueimpl.hxx" 28*b1cdbd2cSJim Jagielski #include "windowsregistry.hxx" 29*b1cdbd2cSJim Jagielski #include "registryexception.hxx" 30*b1cdbd2cSJim Jagielski 31*b1cdbd2cSJim Jagielski #ifdef _MSC_VER 32*b1cdbd2cSJim Jagielski #pragma warning(disable : 4350) 33*b1cdbd2cSJim Jagielski #endif 34*b1cdbd2cSJim Jagielski 35*b1cdbd2cSJim Jagielski //-------------------------------------- 36*b1cdbd2cSJim Jagielski /** 37*b1cdbd2cSJim Jagielski */ UserRegistrar(const RegistrationContextInformation & RegContext)38*b1cdbd2cSJim JagielskiUserRegistrar::UserRegistrar(const RegistrationContextInformation& RegContext) : 39*b1cdbd2cSJim Jagielski Registrar(RegContext) 40*b1cdbd2cSJim Jagielski { 41*b1cdbd2cSJim Jagielski RegistryKey RegKey = WindowsRegistry().GetCurrentUserKey(); 42*b1cdbd2cSJim Jagielski m_RootKey = RegKey->OpenSubKey(L"Software\\Classes"); 43*b1cdbd2cSJim Jagielski } 44*b1cdbd2cSJim Jagielski 45*b1cdbd2cSJim Jagielski //################################### 46*b1cdbd2cSJim Jagielski // Command 47*b1cdbd2cSJim Jagielski //################################### 48*b1cdbd2cSJim Jagielski 49*b1cdbd2cSJim Jagielski //-------------------------------------- 50*b1cdbd2cSJim Jagielski /** 51*b1cdbd2cSJim Jagielski */ UnregisterAsHtmlEditorForInternetExplorer() const52*b1cdbd2cSJim Jagielskivoid UserRegistrar::UnregisterAsHtmlEditorForInternetExplorer() const 53*b1cdbd2cSJim Jagielski { 54*b1cdbd2cSJim Jagielski Registrar::UnregisterAsHtmlEditorForInternetExplorer(); 55*b1cdbd2cSJim Jagielski 56*b1cdbd2cSJim Jagielski DeleteHtmFileAssociationKeys(); 57*b1cdbd2cSJim Jagielski 58*b1cdbd2cSJim Jagielski try 59*b1cdbd2cSJim Jagielski { 60*b1cdbd2cSJim Jagielski RegistryKey RegKey = m_RootKey->OpenSubKey(L"Applications"); 61*b1cdbd2cSJim Jagielski if ((0 == RegKey->GetSubValueCount()) && (0 == RegKey->GetSubKeyCount())) 62*b1cdbd2cSJim Jagielski { 63*b1cdbd2cSJim Jagielski RegKey->Close(); 64*b1cdbd2cSJim Jagielski m_RootKey->DeleteSubKey(L"Applications"); 65*b1cdbd2cSJim Jagielski } 66*b1cdbd2cSJim Jagielski } 67*b1cdbd2cSJim Jagielski catch(RegistryKeyNotFoundException&) 68*b1cdbd2cSJim Jagielski { 69*b1cdbd2cSJim Jagielski } 70*b1cdbd2cSJim Jagielski } 71*b1cdbd2cSJim Jagielski 72*b1cdbd2cSJim Jagielski //-------------------------------------- 73*b1cdbd2cSJim Jagielski /** 74*b1cdbd2cSJim Jagielski */ RegisterAsDefaultShellHtmlEditor() const75*b1cdbd2cSJim Jagielskivoid UserRegistrar::RegisterAsDefaultShellHtmlEditor() const 76*b1cdbd2cSJim Jagielski { 77*b1cdbd2cSJim Jagielski RegistryKey LocalHtmKey = m_RootKey->CreateSubKey(L".htm"); 78*b1cdbd2cSJim Jagielski 79*b1cdbd2cSJim Jagielski if (!LocalHtmKey->HasValue(DEFAULT_VALUE_NAME)) 80*b1cdbd2cSJim Jagielski { 81*b1cdbd2cSJim Jagielski RegistryKey HKCRKey = WindowsRegistry().GetClassesRootKey(); 82*b1cdbd2cSJim Jagielski 83*b1cdbd2cSJim Jagielski if (HKCRKey->HasSubKey(L".htm")) 84*b1cdbd2cSJim Jagielski { 85*b1cdbd2cSJim Jagielski RegistryKey RootHtmKey = HKCRKey->OpenSubKey(L".htm", false); 86*b1cdbd2cSJim Jagielski 87*b1cdbd2cSJim Jagielski if (RootHtmKey->HasValue(DEFAULT_VALUE_NAME)) 88*b1cdbd2cSJim Jagielski { 89*b1cdbd2cSJim Jagielski RegistryValue RegVal = RootHtmKey->GetValue(DEFAULT_VALUE_NAME); 90*b1cdbd2cSJim Jagielski 91*b1cdbd2cSJim Jagielski std::wstring RootHtmFwdKey = RegVal->GetDataAsUniString(); 92*b1cdbd2cSJim Jagielski 93*b1cdbd2cSJim Jagielski if (HKCRKey->HasSubKey(RootHtmFwdKey)) 94*b1cdbd2cSJim Jagielski { 95*b1cdbd2cSJim Jagielski m_RootKey->CreateSubKey(RootHtmFwdKey); 96*b1cdbd2cSJim Jagielski LocalHtmKey->CopyValue(RootHtmKey, DEFAULT_VALUE_NAME); 97*b1cdbd2cSJim Jagielski } 98*b1cdbd2cSJim Jagielski } 99*b1cdbd2cSJim Jagielski } 100*b1cdbd2cSJim Jagielski } 101*b1cdbd2cSJim Jagielski 102*b1cdbd2cSJim Jagielski // calling base class method 103*b1cdbd2cSJim Jagielski Registrar::RegisterAsDefaultShellHtmlEditor(); 104*b1cdbd2cSJim Jagielski } 105*b1cdbd2cSJim Jagielski 106*b1cdbd2cSJim Jagielski //-------------------------------------- 107*b1cdbd2cSJim Jagielski /** 108*b1cdbd2cSJim Jagielski */ UnregisterAsDefaultShellHtmlEditor() const109*b1cdbd2cSJim Jagielskivoid UserRegistrar::UnregisterAsDefaultShellHtmlEditor() const 110*b1cdbd2cSJim Jagielski { 111*b1cdbd2cSJim Jagielski // calling base class method 112*b1cdbd2cSJim Jagielski Registrar::UnregisterAsDefaultShellHtmlEditor(); 113*b1cdbd2cSJim Jagielski DeleteHtmFileAssociationKeys(); 114*b1cdbd2cSJim Jagielski } 115*b1cdbd2cSJim Jagielski 116*b1cdbd2cSJim Jagielski //-------------------------------------- 117*b1cdbd2cSJim Jagielski /** 118*b1cdbd2cSJim Jagielski */ UnregisterForMsOfficeApplication(const std::wstring & FileExtension) const119*b1cdbd2cSJim Jagielskivoid UserRegistrar::UnregisterForMsOfficeApplication( 120*b1cdbd2cSJim Jagielski const std::wstring& FileExtension) const 121*b1cdbd2cSJim Jagielski { 122*b1cdbd2cSJim Jagielski /// calling base class method 123*b1cdbd2cSJim Jagielski Registrar::UnregisterForMsOfficeApplication(FileExtension); 124*b1cdbd2cSJim Jagielski 125*b1cdbd2cSJim Jagielski if (m_RootKey->HasSubKey(FileExtension)) 126*b1cdbd2cSJim Jagielski { 127*b1cdbd2cSJim Jagielski RegistryKey RegKey = m_RootKey->OpenSubKey(FileExtension); 128*b1cdbd2cSJim Jagielski 129*b1cdbd2cSJim Jagielski if ((0 == RegKey->GetSubKeyCount()) && (0 == RegKey->GetSubValueCount())) 130*b1cdbd2cSJim Jagielski { 131*b1cdbd2cSJim Jagielski RegKey->Close(); 132*b1cdbd2cSJim Jagielski m_RootKey->DeleteSubKey(FileExtension); 133*b1cdbd2cSJim Jagielski } 134*b1cdbd2cSJim Jagielski } 135*b1cdbd2cSJim Jagielski } 136*b1cdbd2cSJim Jagielski 137*b1cdbd2cSJim Jagielski //-------------------------------------- 138*b1cdbd2cSJim Jagielski /** 139*b1cdbd2cSJim Jagielski */ GetRootKeyForDefHtmlEditorForIERegistration() const140*b1cdbd2cSJim JagielskiRegistryKey UserRegistrar::GetRootKeyForDefHtmlEditorForIERegistration() const 141*b1cdbd2cSJim Jagielski { 142*b1cdbd2cSJim Jagielski return WindowsRegistry().GetCurrentUserKey(); 143*b1cdbd2cSJim Jagielski } 144*b1cdbd2cSJim Jagielski 145*b1cdbd2cSJim Jagielski //-------------------------------------- 146*b1cdbd2cSJim Jagielski /** 147*b1cdbd2cSJim Jagielski */ DeleteHtmFileAssociationKeys() const148*b1cdbd2cSJim Jagielskivoid UserRegistrar::DeleteHtmFileAssociationKeys() const 149*b1cdbd2cSJim Jagielski { 150*b1cdbd2cSJim Jagielski // Later delete the created keys if they are empty and have not changed meanwhile. 151*b1cdbd2cSJim Jagielski // Remeber: if we create a new registry key in the user part of the 152*b1cdbd2cSJim Jagielski // registry, changes to that key via the merged key HKEY_CLASSES_ROOT 153*b1cdbd2cSJim Jagielski // go into the user branch HKEY_CURRENT_USER and are not visible for other users. 154*b1cdbd2cSJim Jagielski // so we must carefully detect if the keys have not changed in order to prevent accidentally 155*b1cdbd2cSJim Jagielski // deleting a key and so destroying existing associations 156*b1cdbd2cSJim Jagielski // See MSDN: "Merged View of HKEY_CLASSES_ROOT" 157*b1cdbd2cSJim Jagielski } 158