1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: productregistration.cxx,v $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
31 // MARKER(update_precomp.py): autogen include statement, do not remove
32 #include "precompiled_svtools.hxx"
34 #include "productregistration.hxx"
35 #include "regoptions.hxx"
36 #include "registrationdlg.hxx"
38 #include <svtools/svtools.hrc>
40 #include "cppuhelper/factory.hxx"
41 #include <cppuhelper/implbase1.hxx>
42 #include <com/sun/star/lang/XInitialization.hpp>
43 #include <com/sun/star/system/XSystemShellExecute.hpp>
44 #include <com/sun/star/system/SystemShellExecuteFlags.hpp>
45 #include <com/sun/star/frame/DispatchResultState.hpp>
46 #include <com/sun/star/frame/XDesktop.hpp>
47 #include <com/sun/star/beans/XMaterialHolder.hpp>
48 #include <com/sun/star/container/XHierarchicalNameAccess.hpp>
49 #include <toolkit/helper/vclunohelper.hxx>
50 #include <vcl/svapp.hxx>
51 #include <vcl/msgbox.hxx>
52 #include <osl/diagnose.h>
58 #define PRODREG_IMPLNAME "com.sun.star.comp.setup.ProductRegistration"
59 #define PRODREG_SERVNAME "com.sun.star.setup.ProductRegistration"
61 using namespace ::com::sun::star::uno
;
62 using namespace ::com::sun::star::lang
;
63 using namespace ::com::sun::star::registry
;
64 using namespace ::com::sun::star::container
;
68 //........................................................................
71 //........................................................................
73 using namespace ::com::sun::star::task
;
74 using namespace ::com::sun::star::system
;
75 using namespace ::com::sun::star::beans
;
76 using namespace ::com::sun::star::frame
;
77 using namespace ::com::sun::star::awt
;
79 //-------------------------------------------------------------------
81 struct EqualsOUString
: public ::std::unary_function
< OUString
, sal_Bool
>
83 const OUString
& m_rCompare
;
84 EqualsOUString( const OUString
& _rCompare
) : m_rCompare( _rCompare
) { }
86 sal_Bool
operator() ( const OUString
& _rCompare
)
88 return m_rCompare
.equals( _rCompare
);
92 //====================================================================
93 //= OProductRegistration
94 //====================================================================
96 //--------------------------------------------------------------------
97 OProductRegistration::OProductRegistration( const Reference
< XMultiServiceFactory
>& _rxORB
)
102 //--------------------------------------------------------------------
103 Reference
< XInterface
> OProductRegistration::Create( const Reference
< XMultiServiceFactory
>& _rxORB
)
105 return static_cast< ::cppu::OWeakObject
* >( new OProductRegistration( _rxORB
) );
108 //--------------------------------------------------------------------
109 OUString SAL_CALL
OProductRegistration::getImplementationName_Static( )
111 return OUString::createFromAscii( PRODREG_IMPLNAME
);
114 //--------------------------------------------------------------------
115 Sequence
< OUString
> SAL_CALL
OProductRegistration::getSupportedServiceNames_Static( ) throw (RuntimeException
)
117 Sequence
< OUString
> aServiceNames( 1 );
118 aServiceNames
[ 0 ] = OUString::createFromAscii( PRODREG_SERVNAME
);
119 return aServiceNames
;
122 //--------------------------------------------------------------------
123 OUString SAL_CALL
OProductRegistration::getImplementationName( ) throw (RuntimeException
)
125 return getImplementationName_Static( );
128 //--------------------------------------------------------------------
129 sal_Bool SAL_CALL
OProductRegistration::supportsService( const OUString
& _rServiceName
) throw (RuntimeException
)
131 Sequence
< OUString
> aServiceNames( getSupportedServiceNames( ) );
132 const OUString
* pNames
= aServiceNames
.getConstArray( );
133 const OUString
* pNamesEnd
= aServiceNames
.getConstArray( ) + aServiceNames
.getLength();
135 const OUString
* pFound
= ::std::find_if(
138 EqualsOUString( _rServiceName
)
140 return pFound
!= pNamesEnd
;
143 //--------------------------------------------------------------------
144 Sequence
< OUString
> SAL_CALL
OProductRegistration::getSupportedServiceNames( ) throw (RuntimeException
)
146 return getSupportedServiceNames_Static( );
149 //--------------------------------------------------------------------
150 static Reference
< XFrame
> lcl_getActiveFrame( const Reference
< XMultiServiceFactory
>& xFactory
)
154 Reference
< XDesktop
> xDesktop(
155 xFactory
->createInstance( OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.frame.Desktop") ) ),
158 Reference
< XFrame
> xFrame(xDesktop
->getCurrentFrame());
161 // Perhaps the frames collection of the desktop knows about an "active frame"?
162 Reference
< XFramesSupplier
> xFrames( xDesktop
, UNO_QUERY_THROW
);
163 xFrame
= xFrames
->getActiveFrame();
168 catch(const Exception
& )
170 OSL_ENSURE( sal_False
, "lcl_getActiveFrame: caught an exception!" );
171 return Reference
< XFrame
>();
175 //--------------------------------------------------------------------
176 static Window
* lcl_getPreferredDialogParent( const Reference
< XFrame
>& xFrame
)
178 Window
* pReturn
= Application::GetDefDialogParent();
184 Reference
< XWindow
> xWindow
= xFrame
->getContainerWindow();
186 pReturn
= VCLUnoHelper::GetWindow( xWindow
);
189 catch( const Exception
& )
191 OSL_ENSURE( sal_False
, "lcl_getPreferredDialogParent: caught an exception!" );
197 //--------------------------------------------------------------------
198 static bool lcl_isEvalVersion( const Reference
< XMultiServiceFactory
>& _rxORB
)
200 bool bIsEvaluationVersion
= false;
204 Reference
< XMaterialHolder
> xHolder(
205 _rxORB
->createInstance( OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.tab.tabreg" ) ) ),
211 Any aData
= xHolder
->getMaterial();
212 Sequence
< NamedValue
> aSeq
;
214 if ( aData
>>= aSeq
)
216 // it's an evaluation version - a non-eval version wouldn't provide this "material"
217 bIsEvaluationVersion
= true;
221 catch( const Exception
& )
223 OSL_ENSURE( false, "lcl_isEvalVersion: caught an exception!" );
226 return bIsEvaluationVersion
;
229 //--------------------------------------------------------------------
230 static bool lcl_doNewStyleRegistration( const Reference
< XMultiServiceFactory
>& xFactory
, bool online
)
234 Reference
< XMultiServiceFactory
> xConfigProvider(
235 xFactory
->createInstance(
236 OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.configuration.ConfigurationProvider" ) )
241 PropertyValue aNodePath
;
242 aNodePath
.Name
= OUString( RTL_CONSTASCII_USTRINGPARAM( "nodepath" ) );
243 aNodePath
.Value
= makeAny( OUString( RTL_CONSTASCII_USTRINGPARAM( "/org.openoffice.Office.Jobs/Events" ) ) );
245 Sequence
< Any
> lArguments(1);
246 lArguments
[0] = makeAny( aNodePath
);
248 Reference
< XHierarchicalNameAccess
> xNameAccess(
249 xConfigProvider
->createInstanceWithArguments(
250 OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.configuration.ConfigurationAccess" ) ),
256 if( ! xNameAccess
->hasByHierarchicalName( OUString( RTL_CONSTASCII_USTRINGPARAM( "onRegisterNow/JobList" ) ) ) )
259 Reference
< XJobExecutor
> xJobExecutor(
260 xFactory
->createInstance(
261 OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.task.JobExecutor" ) )
266 xJobExecutor
->trigger( online
? OUString( RTL_CONSTASCII_USTRINGPARAM( "onRegisterNow" ) ) :
267 OUString( RTL_CONSTASCII_USTRINGPARAM( "onRegisterLater" ) ) );
271 catch( const Exception
& )
273 OSL_ENSURE( false, "lcl_getOnlineRegistrationDispatch: caught an exception!" );
278 //--------------------------------------------------------------------
279 void SAL_CALL
OProductRegistration::trigger( const OUString
& _rEvent
) throw (RuntimeException
)
281 bool registerOnline
= false;
283 switch ( classify( _rEvent
) )
285 case etRegistrationRequired
:
286 registerOnline
= true;
293 // prefer new style registration
294 if( ! lcl_doNewStyleRegistration(m_xORB
, registerOnline
) && registerOnline
)
295 doOnlineRegistration();
298 //--------------------------------------------------------------------
299 Any SAL_CALL
OProductRegistration::execute( const Sequence
< NamedValue
>& ) throw (IllegalArgumentException
, Exception
, RuntimeException
)
303 static sal_Bool
bFirstEncounter( sal_True
);
304 if ( bFirstEncounter
)
305 { // during this session, this event was never triggered before ....
306 bFirstEncounter
= sal_False
;
308 sal_Bool bDeactivateJob
= sal_True
;
310 // our config options
311 RegOptions aRegOptions
;
312 // check them for the permissions for the dialog
313 RegOptions::DialogPermission
ePermission( aRegOptions
.getDialogPermission() );
315 if ( RegOptions::dpDisabled
!= ePermission
)
316 { // the dialog is _not_ disabled
318 // for this session, I'm no interested in the dialog registration anymore
319 aRegOptions
.markSessionDone( );
321 if ( ( RegOptions::dpNotThisSession
== ePermission
) // first trigger session not reached
322 || ( RegOptions::dpRemindLater
== ePermission
) // or at a later reminder date
324 { // the dialog should be executed during one of the next sessions
325 bDeactivateJob
= sal_False
;
329 // if we're here, the dialog should be executed during this session
330 OSL_ENSURE( RegOptions::dpThisSession
== ePermission
, "OProductRegistration::execute: invalid permissions!" );
333 // this is some kind of HACK.
334 // This registration dialog is intended to appear very very early during the
335 // first office start after installation. Unfortunately, this is so early
336 // that even SFX is not yet loaded, thus the SfxHelp class is not yet available,
337 // thus, there is no help during the lifetime of the dialog.
338 // To fake this, we explicitly load the necessary services when the user
339 // really requests help herein.
340 // #110791# - 2003-06-11 - fs@openoffice.org
341 Reference
< XInitialization
> xOfficeWrapper(
342 m_xORB
->createInstance(
343 OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.office.OfficeWrapper" ) )
347 if ( xOfficeWrapper
.is() )
348 xOfficeWrapper
->initialize( Sequence
< Any
>() );
351 std::auto_ptr
<ResMgr
> pResMgr (ResMgr::CreateResMgr (
352 CREATEVERSIONRESMGR_NAME(productregistration
)));
354 Reference
< XFrame
> xFrame
= lcl_getActiveFrame( m_xORB
);
356 RegistrationDialog
aDialog (
357 lcl_getPreferredDialogParent( xFrame
),
358 ResId( DLG_REGISTRATION_REQUEST
, *pResMgr
.get() ),
359 lcl_isEvalVersion( m_xORB
) );
362 bool registerOnline
= false;
364 switch ( aDialog
.getResponse() )
366 case RegistrationDialog::urRegisterNow
:
367 registerOnline
= true;
370 case RegistrationDialog::urRegisterLater
:
371 bDeactivateJob
= sal_False
;
372 // remind again in seven days from now on ...
373 aRegOptions
.activateReminder( 7 );
376 case RegistrationDialog::urRegisterNever
:
377 case RegistrationDialog::urAlreadyRegistered
:
378 // never register or already registered
379 // -> deactivate the job, and nothing else
383 OSL_ENSURE( sal_False
, "OProductRegistration::execute: invalid response from the dialog!" );
386 // prefer new style registration
387 if( ! lcl_doNewStyleRegistration(m_xORB
, registerOnline
) && registerOnline
)
388 doOnlineRegistration();
392 Sequence
< NamedValue
> aJobResponse( 1 );
393 aJobResponse
[0].Name
= OUString::createFromAscii( "Deactivate" );
394 aJobResponse
[0].Value
<<= bDeactivateJob
;
395 aReturn
<<= aJobResponse
;
401 //--------------------------------------------------------------------
402 void OProductRegistration::doOnlineRegistration( )
404 sal_Bool bSuccess
= sal_False
;
407 // create the Desktop component which can load components
408 Reference
< XSystemShellExecute
> xSystemShell(
409 m_xORB
->createInstance( OUString::createFromAscii( "com.sun.star.system.SystemShellExecute" ) ),
412 OSL_ENSURE( xSystemShell
.is(), "OProductRegistration::doOnlineRegistration: invalid SystemExecute component!" );
414 // access the configuration to retrieve the URL we shall use for registration
416 OUString
sRegistrationURL( aOptions
.getRegistrationURL( ) );
417 OSL_ENSURE( sRegistrationURL
.getLength(), "OProductRegistration::doOnlineRegistration: invalid URL found!" );
419 if ( xSystemShell
.is() && sRegistrationURL
.getLength() )
421 xSystemShell
->execute( sRegistrationURL
, OUString(), SystemShellExecuteFlags::DEFAULTS
);
425 catch( const Exception
& )
430 std::auto_ptr
<ResMgr
> pResMgr (ResMgr::CreateResMgr (
431 CREATEVERSIONRESMGR_NAME(productregistration
)));
433 ErrorBox
aRegistrationError(
434 Application::GetDefDialogParent(),
435 ResId( ERRBOX_REG_NOSYSBROWSER
, *pResMgr
.get() ));
436 aRegistrationError
.Execute();
439 RegOptions aRegOptions
;
440 aRegOptions
.activateReminder( 7 );
444 //--------------------------------------------------------------------
445 OProductRegistration::EventType
OProductRegistration::classify( const OUString
& _rEventDesc
)
447 EventType eReturn
= etUnknown
;
448 if ( _rEventDesc
.equalsAscii( "RegistrationRequired" ) )
450 eReturn
= etRegistrationRequired
;
455 //........................................................................
457 //........................................................................
461 SAL_DLLPUBLIC_EXPORT
void SAL_CALL
component_getImplementationEnvironment (
462 const sal_Char
** ppEnvTypeName
, uno_Environment
** /* ppEnv */)
464 *ppEnvTypeName
= CPPU_CURRENT_LANGUAGE_BINDING_NAME
;
467 SAL_DLLPUBLIC_EXPORT sal_Bool SAL_CALL
component_writeInfo (
468 void * /* pServiceManager */, void * pRegistryKey
)
472 Reference
< XRegistryKey
> xRegistryKey (
473 reinterpret_cast< XRegistryKey
* >( pRegistryKey
));
474 Reference
< XRegistryKey
> xNewKey
;
476 xNewKey
= xRegistryKey
->createKey(
477 OUString::createFromAscii( "/" PRODREG_IMPLNAME
"/UNO/SERVICES" ));
479 OUString::createFromAscii( PRODREG_SERVNAME
));
486 SAL_DLLPUBLIC_EXPORT
void * SAL_CALL
component_getFactory (
487 const sal_Char
* pImplementationName
, void * pServiceManager
, void * /* pRegistryKey */)
492 Reference
< XSingleServiceFactory
> xFactory
;
493 if (svt::OProductRegistration::getImplementationName_Static().compareToAscii (pImplementationName
) == 0)
495 xFactory
= cppu::createSingleFactory (
496 reinterpret_cast< XMultiServiceFactory
* >(pServiceManager
),
497 svt::OProductRegistration::getImplementationName_Static(),
498 svt::OProductRegistration::Create
,
499 svt::OProductRegistration::getSupportedServiceNames_Static());
504 pResult
= xFactory
.get();