diff options
Diffstat (limited to 'svtools/source/productregistration/productregistration.cxx')
-rw-r--r-- | svtools/source/productregistration/productregistration.cxx | 510 |
1 files changed, 510 insertions, 0 deletions
diff --git a/svtools/source/productregistration/productregistration.cxx b/svtools/source/productregistration/productregistration.cxx new file mode 100644 index 000000000000..b3d90a73b231 --- /dev/null +++ b/svtools/source/productregistration/productregistration.cxx @@ -0,0 +1,510 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: productregistration.cxx,v $ + * $Revision: 1.10 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_svtools.hxx" + +#include "productregistration.hxx" +#include "regoptions.hxx" +#include "registrationdlg.hxx" +#ifndef _SVTOOLS_HRC +#include <svtools/svtools.hrc> +#endif +#include "cppuhelper/factory.hxx" +#include <cppuhelper/implbase1.hxx> +#include <com/sun/star/lang/XInitialization.hpp> +#include <com/sun/star/system/XSystemShellExecute.hpp> +#include <com/sun/star/system/SystemShellExecuteFlags.hpp> +#include <com/sun/star/frame/DispatchResultState.hpp> +#include <com/sun/star/frame/XDesktop.hpp> +#include <com/sun/star/beans/XMaterialHolder.hpp> +#include <com/sun/star/container/XHierarchicalNameAccess.hpp> +#include <toolkit/helper/vclunohelper.hxx> +#include <vcl/svapp.hxx> +#include <vcl/msgbox.hxx> +#include <osl/diagnose.h> + +#include <algorithm> +#include <functional> +#include <memory> + +#define PRODREG_IMPLNAME "com.sun.star.comp.setup.ProductRegistration" +#define PRODREG_SERVNAME "com.sun.star.setup.ProductRegistration" + +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::registry; +using namespace ::com::sun::star::container; + +using rtl::OUString; + +//........................................................................ +namespace svt +{ +//........................................................................ + + using namespace ::com::sun::star::task; + using namespace ::com::sun::star::system; + using namespace ::com::sun::star::beans; + using namespace ::com::sun::star::frame; + using namespace ::com::sun::star::awt; + + //------------------------------------------------------------------- + + struct EqualsOUString : public ::std::unary_function< OUString, sal_Bool > + { + const OUString& m_rCompare; + EqualsOUString( const OUString& _rCompare ) : m_rCompare( _rCompare ) { } + + sal_Bool operator() ( const OUString& _rCompare ) + { + return m_rCompare.equals( _rCompare ); + } + }; + + //==================================================================== + //= OProductRegistration + //==================================================================== + + //-------------------------------------------------------------------- + OProductRegistration::OProductRegistration( const Reference< XMultiServiceFactory >& _rxORB ) + :m_xORB( _rxORB ) + { + } + + //-------------------------------------------------------------------- + Reference< XInterface > OProductRegistration::Create( const Reference< XMultiServiceFactory >& _rxORB ) + { + return static_cast< ::cppu::OWeakObject* >( new OProductRegistration( _rxORB ) ); + } + + //-------------------------------------------------------------------- + OUString SAL_CALL OProductRegistration::getImplementationName_Static( ) + { + return OUString::createFromAscii( PRODREG_IMPLNAME ); + } + + //-------------------------------------------------------------------- + Sequence< OUString > SAL_CALL OProductRegistration::getSupportedServiceNames_Static( ) throw (RuntimeException) + { + Sequence< OUString > aServiceNames( 1 ); + aServiceNames[ 0 ] = OUString::createFromAscii( PRODREG_SERVNAME ); + return aServiceNames; + } + + //-------------------------------------------------------------------- + OUString SAL_CALL OProductRegistration::getImplementationName( ) throw (RuntimeException) + { + return getImplementationName_Static( ); + } + + //-------------------------------------------------------------------- + sal_Bool SAL_CALL OProductRegistration::supportsService( const OUString& _rServiceName ) throw (RuntimeException) + { + Sequence< OUString > aServiceNames( getSupportedServiceNames( ) ); + const OUString* pNames = aServiceNames.getConstArray( ); + const OUString* pNamesEnd = aServiceNames.getConstArray( ) + aServiceNames.getLength(); + + const OUString* pFound = ::std::find_if( + pNames, + pNamesEnd, + EqualsOUString( _rServiceName ) + ); + return pFound != pNamesEnd; + } + + //-------------------------------------------------------------------- + Sequence< OUString > SAL_CALL OProductRegistration::getSupportedServiceNames( ) throw (RuntimeException) + { + return getSupportedServiceNames_Static( ); + } + + //-------------------------------------------------------------------- + static Reference< XFrame > lcl_getActiveFrame( const Reference< XMultiServiceFactory >& xFactory ) + { + try + { + Reference< XDesktop > xDesktop( + xFactory->createInstance( OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.frame.Desktop") ) ), + UNO_QUERY_THROW ); + + Reference< XFrame > xFrame(xDesktop->getCurrentFrame()); + if( ! xFrame.is() ) + { + // Perhaps the frames collection of the desktop knows about an "active frame"? + Reference< XFramesSupplier > xFrames( xDesktop, UNO_QUERY_THROW ); + xFrame = xFrames->getActiveFrame(); + } + + return xFrame; + } + catch(const Exception& ) + { + OSL_ENSURE( sal_False, "lcl_getActiveFrame: caught an exception!" ); + return Reference< XFrame >(); + } + } + + //-------------------------------------------------------------------- + static Window* lcl_getPreferredDialogParent( const Reference< XFrame >& xFrame ) + { + Window* pReturn = Application::GetDefDialogParent(); + + try + { + if ( xFrame.is() ) + { + Reference< XWindow > xWindow = xFrame->getContainerWindow(); + if ( xWindow.is() ) + pReturn = VCLUnoHelper::GetWindow( xWindow ); + } + } + catch( const Exception& ) + { + OSL_ENSURE( sal_False, "lcl_getPreferredDialogParent: caught an exception!" ); + } + + return pReturn; + } + + //-------------------------------------------------------------------- + static bool lcl_isEvalVersion( const Reference< XMultiServiceFactory >& _rxORB ) + { + bool bIsEvaluationVersion = false; + + try + { + Reference < XMaterialHolder > xHolder( + _rxORB->createInstance( OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.tab.tabreg" ) ) ), + UNO_QUERY + ); + + if ( xHolder.is() ) + { + Any aData = xHolder->getMaterial(); + Sequence < NamedValue > aSeq; + + if ( aData >>= aSeq ) + { + // it's an evaluation version - a non-eval version wouldn't provide this "material" + bIsEvaluationVersion = true; + } + } + } + catch( const Exception& ) + { + OSL_ENSURE( false, "lcl_isEvalVersion: caught an exception!" ); + } + + return bIsEvaluationVersion; + } + + //-------------------------------------------------------------------- + static bool lcl_doNewStyleRegistration( const Reference< XMultiServiceFactory >& xFactory, bool online ) + { + try + { + Reference< XMultiServiceFactory > xConfigProvider( + xFactory->createInstance( + OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.configuration.ConfigurationProvider" ) ) + ), + UNO_QUERY_THROW + ); + + PropertyValue aNodePath; + aNodePath.Name = OUString( RTL_CONSTASCII_USTRINGPARAM( "nodepath" ) ); + aNodePath.Value = makeAny( OUString( RTL_CONSTASCII_USTRINGPARAM( "/org.openoffice.Office.Jobs/Events" ) ) ); + + Sequence< Any > lArguments(1); + lArguments[0] = makeAny( aNodePath ); + + Reference< XHierarchicalNameAccess > xNameAccess( + xConfigProvider->createInstanceWithArguments( + OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.configuration.ConfigurationAccess" ) ), + lArguments + ), + UNO_QUERY_THROW + ); + + if( ! xNameAccess->hasByHierarchicalName( OUString( RTL_CONSTASCII_USTRINGPARAM( "onRegisterNow/JobList" ) ) ) ) + return false; + + Reference< XJobExecutor > xJobExecutor( + xFactory->createInstance( + OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.task.JobExecutor" ) ) + ), + UNO_QUERY_THROW + ); + + xJobExecutor->trigger( online ? OUString( RTL_CONSTASCII_USTRINGPARAM( "onRegisterNow" ) ) : + OUString( RTL_CONSTASCII_USTRINGPARAM( "onRegisterLater" ) ) ); + + return true; + } + catch( const Exception& ) + { + OSL_ENSURE( false, "lcl_getOnlineRegistrationDispatch: caught an exception!" ); + return false; + } + } + + //-------------------------------------------------------------------- + void SAL_CALL OProductRegistration::trigger( const OUString& _rEvent ) throw (RuntimeException) + { + bool registerOnline = false; + + switch ( classify( _rEvent ) ) + { + case etRegistrationRequired: + registerOnline = true; + break; + + default: + break; + } + + // prefer new style registration + if( ! lcl_doNewStyleRegistration(m_xORB, registerOnline ) && registerOnline ) + doOnlineRegistration(); + } + + //-------------------------------------------------------------------- + Any SAL_CALL OProductRegistration::execute( const Sequence< NamedValue >& ) throw (IllegalArgumentException, Exception, RuntimeException) + { + Any aReturn; + + static sal_Bool bFirstEncounter( sal_True ); + if ( bFirstEncounter ) + { // during this session, this event was never triggered before .... + bFirstEncounter = sal_False; + + sal_Bool bDeactivateJob = sal_True; + + // our config options + RegOptions aRegOptions; + // check them for the permissions for the dialog + RegOptions::DialogPermission ePermission( aRegOptions.getDialogPermission() ); + + if ( RegOptions::dpDisabled != ePermission ) + { // the dialog is _not_ disabled + + // for this session, I'm no interested in the dialog registration anymore + aRegOptions.markSessionDone( ); + + if ( ( RegOptions::dpNotThisSession == ePermission ) // first trigger session not reached + || ( RegOptions::dpRemindLater == ePermission ) // or at a later reminder date + ) + { // the dialog should be executed during one of the next sessions + bDeactivateJob = sal_False; + } + else + { + // if we're here, the dialog should be executed during this session + OSL_ENSURE( RegOptions::dpThisSession == ePermission, "OProductRegistration::execute: invalid permissions!" ); + + { + // this is some kind of HACK. + // This registration dialog is intended to appear very very early during the + // first office start after installation. Unfortunately, this is so early + // that even SFX is not yet loaded, thus the SfxHelp class is not yet available, + // thus, there is no help during the lifetime of the dialog. + // To fake this, we explicitly load the necessary services when the user + // really requests help herein. + // #110791# - 2003-06-11 - fs@openoffice.org + Reference < XInitialization > xOfficeWrapper( + m_xORB->createInstance( + OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.office.OfficeWrapper" ) ) + ), + UNO_QUERY + ); + if ( xOfficeWrapper.is() ) + xOfficeWrapper->initialize( Sequence < Any >() ); + } + + std::auto_ptr<ResMgr> pResMgr (ResMgr::CreateResMgr ( + CREATEVERSIONRESMGR_NAME(productregistration))); + + Reference< XFrame > xFrame = lcl_getActiveFrame( m_xORB ); + // execute it + RegistrationDialog aDialog ( + lcl_getPreferredDialogParent( xFrame ), + ResId( DLG_REGISTRATION_REQUEST, *pResMgr.get() ), + lcl_isEvalVersion( m_xORB ) ); + aDialog.Execute(); + + bool registerOnline = false; + + switch ( aDialog.getResponse() ) + { + case RegistrationDialog::urRegisterNow: + registerOnline = true; + break; + + case RegistrationDialog::urRegisterLater: + bDeactivateJob = sal_False; + // remind again in seven days from now on ... + aRegOptions.activateReminder( 7 ); + break; + + case RegistrationDialog::urRegisterNever: + case RegistrationDialog::urAlreadyRegistered: + // never register or already registered + // -> deactivate the job, and nothing else + break; + + default: + OSL_ENSURE( sal_False, "OProductRegistration::execute: invalid response from the dialog!" ); + } + + // prefer new style registration + if( ! lcl_doNewStyleRegistration(m_xORB, registerOnline) && registerOnline ) + doOnlineRegistration(); + } + } + + Sequence< NamedValue > aJobResponse( 1 ); + aJobResponse[0].Name = OUString::createFromAscii( "Deactivate" ); + aJobResponse[0].Value <<= bDeactivateJob; + aReturn <<= aJobResponse; + } + + return aReturn; + } + + //-------------------------------------------------------------------- + void OProductRegistration::doOnlineRegistration( ) + { + sal_Bool bSuccess = sal_False; + try + { + // create the Desktop component which can load components + Reference< XSystemShellExecute > xSystemShell( + m_xORB->createInstance( OUString::createFromAscii( "com.sun.star.system.SystemShellExecute" ) ), + UNO_QUERY + ); + OSL_ENSURE( xSystemShell.is(), "OProductRegistration::doOnlineRegistration: invalid SystemExecute component!" ); + + // access the configuration to retrieve the URL we shall use for registration + RegOptions aOptions; + OUString sRegistrationURL( aOptions.getRegistrationURL( ) ); + OSL_ENSURE( sRegistrationURL.getLength(), "OProductRegistration::doOnlineRegistration: invalid URL found!" ); + + if ( xSystemShell.is() && sRegistrationURL.getLength() ) + { + xSystemShell->execute( sRegistrationURL, OUString(), SystemShellExecuteFlags::DEFAULTS ); + bSuccess = sal_True; + } + } + catch( const Exception& ) + { + } + if ( !bSuccess ) + { + std::auto_ptr<ResMgr> pResMgr (ResMgr::CreateResMgr ( + CREATEVERSIONRESMGR_NAME(productregistration))); + + ErrorBox aRegistrationError( + Application::GetDefDialogParent(), + ResId( ERRBOX_REG_NOSYSBROWSER, *pResMgr.get() )); + aRegistrationError.Execute(); + + // try again later + RegOptions aRegOptions; + aRegOptions.activateReminder( 7 ); + } + } + + //-------------------------------------------------------------------- + OProductRegistration::EventType OProductRegistration::classify( const OUString& _rEventDesc ) + { + EventType eReturn = etUnknown; + if ( _rEventDesc.equalsAscii( "RegistrationRequired" ) ) + { + eReturn = etRegistrationRequired; + } + return eReturn; + } + +//........................................................................ +} // namespace svt +//........................................................................ + +extern "C" +{ +SAL_DLLPUBLIC_EXPORT void SAL_CALL component_getImplementationEnvironment ( + const sal_Char ** ppEnvTypeName, uno_Environment ** /* ppEnv */) +{ + *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME; +} + +SAL_DLLPUBLIC_EXPORT sal_Bool SAL_CALL component_writeInfo ( + void * /* pServiceManager */, void * pRegistryKey) +{ + if (pRegistryKey) + { + Reference< XRegistryKey > xRegistryKey ( + reinterpret_cast< XRegistryKey* >( pRegistryKey )); + Reference< XRegistryKey > xNewKey; + + xNewKey = xRegistryKey->createKey( + OUString::createFromAscii( "/" PRODREG_IMPLNAME "/UNO/SERVICES" )); + xNewKey->createKey( + OUString::createFromAscii( PRODREG_SERVNAME )); + + return sal_True; + } + return sal_False; +} + +SAL_DLLPUBLIC_EXPORT void * SAL_CALL component_getFactory ( + const sal_Char * pImplementationName, void * pServiceManager, void * /* pRegistryKey */) +{ + void * pResult = 0; + if (pServiceManager) + { + Reference< XSingleServiceFactory > xFactory; + if (svt::OProductRegistration::getImplementationName_Static().compareToAscii (pImplementationName) == 0) + { + xFactory = cppu::createSingleFactory ( + reinterpret_cast< XMultiServiceFactory* >(pServiceManager), + svt::OProductRegistration::getImplementationName_Static(), + svt::OProductRegistration::Create, + svt::OProductRegistration::getSupportedServiceNames_Static()); + } + if (xFactory.is()) + { + xFactory->acquire(); + pResult = xFactory.get(); + } + } + return pResult; +} + +} // extern "C" |