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 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_desktop.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include "vcl/svapp.hxx"
28*b1cdbd2cSJim Jagielski #include "vcl/msgbox.hxx"
29*b1cdbd2cSJim Jagielski 
30*b1cdbd2cSJim Jagielski #include "vos/mutex.hxx"
31*b1cdbd2cSJim Jagielski 
32*b1cdbd2cSJim Jagielski #include "toolkit/helper/vclunohelper.hxx"
33*b1cdbd2cSJim Jagielski 
34*b1cdbd2cSJim Jagielski #include "com/sun/star/beans/XPropertySet.hpp"
35*b1cdbd2cSJim Jagielski 
36*b1cdbd2cSJim Jagielski #include "dp_gui_dialog2.hxx"
37*b1cdbd2cSJim Jagielski #include "dp_gui_extensioncmdqueue.hxx"
38*b1cdbd2cSJim Jagielski #include "dp_gui_theextmgr.hxx"
39*b1cdbd2cSJim Jagielski #include "dp_gui_theextmgr.hxx"
40*b1cdbd2cSJim Jagielski #include "dp_identifier.hxx"
41*b1cdbd2cSJim Jagielski #include "dp_update.hxx"
42*b1cdbd2cSJim Jagielski 
43*b1cdbd2cSJim Jagielski #define OUSTR(x) ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(x) )
44*b1cdbd2cSJim Jagielski 
45*b1cdbd2cSJim Jagielski #define USER_PACKAGE_MANAGER    OUSTR("user")
46*b1cdbd2cSJim Jagielski #define SHARED_PACKAGE_MANAGER  OUSTR("shared")
47*b1cdbd2cSJim Jagielski #define BUNDLED_PACKAGE_MANAGER OUSTR("bundled")
48*b1cdbd2cSJim Jagielski 
49*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
50*b1cdbd2cSJim Jagielski using ::rtl::OUString;
51*b1cdbd2cSJim Jagielski 
52*b1cdbd2cSJim Jagielski namespace dp_gui {
53*b1cdbd2cSJim Jagielski 
54*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
55*b1cdbd2cSJim Jagielski 
56*b1cdbd2cSJim Jagielski ::rtl::Reference< TheExtensionManager > TheExtensionManager::s_ExtMgr;
57*b1cdbd2cSJim Jagielski 
58*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
59*b1cdbd2cSJim Jagielski //                             TheExtensionManager
60*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
61*b1cdbd2cSJim Jagielski 
TheExtensionManager(Window * pParent,const uno::Reference<uno::XComponentContext> & xContext)62*b1cdbd2cSJim Jagielski TheExtensionManager::TheExtensionManager( Window *pParent,
63*b1cdbd2cSJim Jagielski                                           const uno::Reference< uno::XComponentContext > &xContext ) :
64*b1cdbd2cSJim Jagielski     m_xContext( xContext ),
65*b1cdbd2cSJim Jagielski     m_pParent( pParent ),
66*b1cdbd2cSJim Jagielski     m_pExtMgrDialog( NULL ),
67*b1cdbd2cSJim Jagielski     m_pUpdReqDialog( NULL ),
68*b1cdbd2cSJim Jagielski     m_pExecuteCmdQueue( NULL )
69*b1cdbd2cSJim Jagielski {
70*b1cdbd2cSJim Jagielski     m_xExtensionManager = deployment::ExtensionManager::get( xContext );
71*b1cdbd2cSJim Jagielski     m_xExtensionManager->addModifyListener( this );
72*b1cdbd2cSJim Jagielski 
73*b1cdbd2cSJim Jagielski     uno::Reference< lang::XMultiServiceFactory > xConfig(
74*b1cdbd2cSJim Jagielski         xContext->getServiceManager()->createInstanceWithContext(
75*b1cdbd2cSJim Jagielski             OUSTR("com.sun.star.configuration.ConfigurationProvider"), xContext ), uno::UNO_QUERY_THROW);
76*b1cdbd2cSJim Jagielski     uno::Any args[1];
77*b1cdbd2cSJim Jagielski     beans::PropertyValue aValue( OUSTR("nodepath"), 0, uno::Any( OUSTR("/org.openoffice.Office.OptionsDialog/Nodes") ),
78*b1cdbd2cSJim Jagielski                                  beans::PropertyState_DIRECT_VALUE );
79*b1cdbd2cSJim Jagielski     args[0] <<= aValue;
80*b1cdbd2cSJim Jagielski     m_xNameAccessNodes = uno::Reference< container::XNameAccess >(
81*b1cdbd2cSJim Jagielski         xConfig->createInstanceWithArguments( OUSTR("com.sun.star.configuration.ConfigurationAccess"),
82*b1cdbd2cSJim Jagielski                                               uno::Sequence< uno::Any >( args, 1 )), uno::UNO_QUERY_THROW);
83*b1cdbd2cSJim Jagielski 
84*b1cdbd2cSJim Jagielski     // get the 'get more extensions here' url
85*b1cdbd2cSJim Jagielski     uno::Reference< container::XNameAccess > xNameAccessRepositories;
86*b1cdbd2cSJim Jagielski     beans::PropertyValue aValue2( OUSTR("nodepath"), 0, uno::Any( OUSTR("/org.openoffice.Office.ExtensionManager/ExtensionRepositories") ),
87*b1cdbd2cSJim Jagielski                                   beans::PropertyState_DIRECT_VALUE );
88*b1cdbd2cSJim Jagielski     args[0] <<= aValue2;
89*b1cdbd2cSJim Jagielski     xNameAccessRepositories = uno::Reference< container::XNameAccess > (
90*b1cdbd2cSJim Jagielski         xConfig->createInstanceWithArguments( OUSTR("com.sun.star.configuration.ConfigurationAccess"),
91*b1cdbd2cSJim Jagielski                                               uno::Sequence< uno::Any >( args, 1 )), uno::UNO_QUERY_THROW);
92*b1cdbd2cSJim Jagielski     try
93*b1cdbd2cSJim Jagielski     {   //throws css::container::NoSuchElementException, css::lang::WrappedTargetException
94*b1cdbd2cSJim Jagielski         uno::Any value = xNameAccessRepositories->getByName( OUSTR( "WebsiteLink" ) );
95*b1cdbd2cSJim Jagielski         m_sGetExtensionsURL = value.get< OUString > ();
96*b1cdbd2cSJim Jagielski      }
97*b1cdbd2cSJim Jagielski     catch ( uno::Exception& )
98*b1cdbd2cSJim Jagielski     {}
99*b1cdbd2cSJim Jagielski 
100*b1cdbd2cSJim Jagielski     if ( dp_misc::office_is_running() )
101*b1cdbd2cSJim Jagielski     {
102*b1cdbd2cSJim Jagielski 		// the registration should be done after the construction has been ended
103*b1cdbd2cSJim Jagielski 		// otherwise an exception prevents object creation, but it is registered as a listener
104*b1cdbd2cSJim Jagielski         m_xDesktop.set( xContext->getServiceManager()->createInstanceWithContext(
105*b1cdbd2cSJim Jagielski                             OUSTR("com.sun.star.frame.Desktop"), xContext ), uno::UNO_QUERY );
106*b1cdbd2cSJim Jagielski         if ( m_xDesktop.is() )
107*b1cdbd2cSJim Jagielski             m_xDesktop->addTerminateListener( this );
108*b1cdbd2cSJim Jagielski     }
109*b1cdbd2cSJim Jagielski }
110*b1cdbd2cSJim Jagielski 
111*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
~TheExtensionManager()112*b1cdbd2cSJim Jagielski TheExtensionManager::~TheExtensionManager()
113*b1cdbd2cSJim Jagielski {
114*b1cdbd2cSJim Jagielski     if ( m_pUpdReqDialog )
115*b1cdbd2cSJim Jagielski         delete m_pUpdReqDialog;
116*b1cdbd2cSJim Jagielski     if ( m_pExtMgrDialog )
117*b1cdbd2cSJim Jagielski         delete m_pExtMgrDialog;
118*b1cdbd2cSJim Jagielski     if ( m_pExecuteCmdQueue )
119*b1cdbd2cSJim Jagielski         delete m_pExecuteCmdQueue;
120*b1cdbd2cSJim Jagielski }
121*b1cdbd2cSJim Jagielski 
122*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
createDialog(const bool bCreateUpdDlg)123*b1cdbd2cSJim Jagielski void TheExtensionManager::createDialog( const bool bCreateUpdDlg )
124*b1cdbd2cSJim Jagielski {
125*b1cdbd2cSJim Jagielski     const ::vos::OGuard guard( Application::GetSolarMutex() );
126*b1cdbd2cSJim Jagielski 
127*b1cdbd2cSJim Jagielski     if ( bCreateUpdDlg )
128*b1cdbd2cSJim Jagielski     {
129*b1cdbd2cSJim Jagielski         if ( !m_pUpdReqDialog )
130*b1cdbd2cSJim Jagielski         {
131*b1cdbd2cSJim Jagielski             m_pUpdReqDialog = new UpdateRequiredDialog( NULL, this );
132*b1cdbd2cSJim Jagielski             delete m_pExecuteCmdQueue;
133*b1cdbd2cSJim Jagielski             m_pExecuteCmdQueue = new ExtensionCmdQueue( (DialogHelper*) m_pUpdReqDialog, this, m_xContext );
134*b1cdbd2cSJim Jagielski             createPackageList();
135*b1cdbd2cSJim Jagielski         }
136*b1cdbd2cSJim Jagielski     }
137*b1cdbd2cSJim Jagielski     else if ( !m_pExtMgrDialog )
138*b1cdbd2cSJim Jagielski     {
139*b1cdbd2cSJim Jagielski         m_pExtMgrDialog = new ExtMgrDialog( m_pParent, this );
140*b1cdbd2cSJim Jagielski         delete m_pExecuteCmdQueue;
141*b1cdbd2cSJim Jagielski         m_pExecuteCmdQueue = new ExtensionCmdQueue( (DialogHelper*) m_pExtMgrDialog, this, m_xContext );
142*b1cdbd2cSJim Jagielski         m_pExtMgrDialog->setGetExtensionsURL( m_sGetExtensionsURL );
143*b1cdbd2cSJim Jagielski         createPackageList();
144*b1cdbd2cSJim Jagielski     }
145*b1cdbd2cSJim Jagielski }
146*b1cdbd2cSJim Jagielski 
147*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
Show()148*b1cdbd2cSJim Jagielski void TheExtensionManager::Show()
149*b1cdbd2cSJim Jagielski {
150*b1cdbd2cSJim Jagielski     const ::vos::OGuard guard( Application::GetSolarMutex() );
151*b1cdbd2cSJim Jagielski 
152*b1cdbd2cSJim Jagielski     getDialog()->Show();
153*b1cdbd2cSJim Jagielski }
154*b1cdbd2cSJim Jagielski 
155*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
SetText(const::rtl::OUString & rTitle)156*b1cdbd2cSJim Jagielski void TheExtensionManager::SetText( const ::rtl::OUString &rTitle )
157*b1cdbd2cSJim Jagielski {
158*b1cdbd2cSJim Jagielski     const ::vos::OGuard guard( Application::GetSolarMutex() );
159*b1cdbd2cSJim Jagielski 
160*b1cdbd2cSJim Jagielski     getDialog()->SetText( rTitle );
161*b1cdbd2cSJim Jagielski }
162*b1cdbd2cSJim Jagielski 
163*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
ToTop(sal_uInt16 nFlags)164*b1cdbd2cSJim Jagielski void TheExtensionManager::ToTop( sal_uInt16 nFlags )
165*b1cdbd2cSJim Jagielski {
166*b1cdbd2cSJim Jagielski     const ::vos::OGuard guard( Application::GetSolarMutex() );
167*b1cdbd2cSJim Jagielski 
168*b1cdbd2cSJim Jagielski     getDialog()->ToTop( nFlags );
169*b1cdbd2cSJim Jagielski }
170*b1cdbd2cSJim Jagielski 
171*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
Close()172*b1cdbd2cSJim Jagielski bool TheExtensionManager::Close()
173*b1cdbd2cSJim Jagielski {
174*b1cdbd2cSJim Jagielski     if ( m_pExtMgrDialog )
175*b1cdbd2cSJim Jagielski         return m_pExtMgrDialog->Close();
176*b1cdbd2cSJim Jagielski     else if ( m_pUpdReqDialog )
177*b1cdbd2cSJim Jagielski         return m_pUpdReqDialog->Close();
178*b1cdbd2cSJim Jagielski     else
179*b1cdbd2cSJim Jagielski         return true;
180*b1cdbd2cSJim Jagielski }
181*b1cdbd2cSJim Jagielski 
182*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
execute()183*b1cdbd2cSJim Jagielski sal_Int16 TheExtensionManager::execute()
184*b1cdbd2cSJim Jagielski {
185*b1cdbd2cSJim Jagielski     sal_Int16 nRet = 0;
186*b1cdbd2cSJim Jagielski 
187*b1cdbd2cSJim Jagielski     if ( m_pUpdReqDialog )
188*b1cdbd2cSJim Jagielski     {
189*b1cdbd2cSJim Jagielski         nRet = m_pUpdReqDialog->Execute();
190*b1cdbd2cSJim Jagielski         delete m_pUpdReqDialog;
191*b1cdbd2cSJim Jagielski         m_pUpdReqDialog = NULL;
192*b1cdbd2cSJim Jagielski     }
193*b1cdbd2cSJim Jagielski 
194*b1cdbd2cSJim Jagielski     return nRet;
195*b1cdbd2cSJim Jagielski }
196*b1cdbd2cSJim Jagielski 
197*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
isVisible()198*b1cdbd2cSJim Jagielski bool TheExtensionManager::isVisible()
199*b1cdbd2cSJim Jagielski {
200*b1cdbd2cSJim Jagielski     return getDialog()->IsVisible();
201*b1cdbd2cSJim Jagielski }
202*b1cdbd2cSJim Jagielski 
203*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
checkUpdates(bool,bool)204*b1cdbd2cSJim Jagielski bool TheExtensionManager::checkUpdates( bool /* bShowUpdateOnly */, bool /*bParentVisible*/ )
205*b1cdbd2cSJim Jagielski {
206*b1cdbd2cSJim Jagielski     std::vector< uno::Reference< deployment::XPackage >  > vEntries;
207*b1cdbd2cSJim Jagielski     uno::Sequence< uno::Sequence< uno::Reference< deployment::XPackage > > > xAllPackages;
208*b1cdbd2cSJim Jagielski 
209*b1cdbd2cSJim Jagielski     try {
210*b1cdbd2cSJim Jagielski         xAllPackages = m_xExtensionManager->getAllExtensions( uno::Reference< task::XAbortChannel >(),
211*b1cdbd2cSJim Jagielski                                                               uno::Reference< ucb::XCommandEnvironment >() );
212*b1cdbd2cSJim Jagielski     } catch ( deployment::DeploymentException & ) {
213*b1cdbd2cSJim Jagielski         return false;
214*b1cdbd2cSJim Jagielski     } catch ( ucb::CommandFailedException & ) {
215*b1cdbd2cSJim Jagielski         return false;
216*b1cdbd2cSJim Jagielski     } catch ( ucb::CommandAbortedException & ) {
217*b1cdbd2cSJim Jagielski         return false;
218*b1cdbd2cSJim Jagielski     } catch ( lang::IllegalArgumentException & e ) {
219*b1cdbd2cSJim Jagielski         throw uno::RuntimeException( e.Message, e.Context );
220*b1cdbd2cSJim Jagielski     }
221*b1cdbd2cSJim Jagielski 
222*b1cdbd2cSJim Jagielski     for ( sal_Int32 i = 0; i < xAllPackages.getLength(); ++i )
223*b1cdbd2cSJim Jagielski     {
224*b1cdbd2cSJim Jagielski 		uno::Reference< deployment::XPackage > xPackage = dp_misc::getExtensionWithHighestVersion(xAllPackages[i]);
225*b1cdbd2cSJim Jagielski 		OSL_ASSERT(xPackage.is());
226*b1cdbd2cSJim Jagielski         if ( xPackage.is() )
227*b1cdbd2cSJim Jagielski         {
228*b1cdbd2cSJim Jagielski 			vEntries.push_back( xPackage );
229*b1cdbd2cSJim Jagielski         }
230*b1cdbd2cSJim Jagielski     }
231*b1cdbd2cSJim Jagielski 
232*b1cdbd2cSJim Jagielski     m_pExecuteCmdQueue->checkForUpdates( vEntries );
233*b1cdbd2cSJim Jagielski     return true;
234*b1cdbd2cSJim Jagielski }
235*b1cdbd2cSJim Jagielski 
236*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
installPackage(const OUString & rPackageURL,bool bWarnUser)237*b1cdbd2cSJim Jagielski bool TheExtensionManager::installPackage( const OUString &rPackageURL, bool bWarnUser )
238*b1cdbd2cSJim Jagielski {
239*b1cdbd2cSJim Jagielski     if ( rPackageURL.getLength() == 0 )
240*b1cdbd2cSJim Jagielski         return false;
241*b1cdbd2cSJim Jagielski 
242*b1cdbd2cSJim Jagielski     createDialog( false );
243*b1cdbd2cSJim Jagielski 
244*b1cdbd2cSJim Jagielski     bool bInstall = true;
245*b1cdbd2cSJim Jagielski     bool bInstallForAll = false;
246*b1cdbd2cSJim Jagielski 
247*b1cdbd2cSJim Jagielski     // DV! missing function is read only repository from extension manager
248*b1cdbd2cSJim Jagielski     if ( !bWarnUser && ! m_xExtensionManager->isReadOnlyRepository( SHARED_PACKAGE_MANAGER ) )
249*b1cdbd2cSJim Jagielski         bInstall = getDialogHelper()->installForAllUsers( bInstallForAll );
250*b1cdbd2cSJim Jagielski 
251*b1cdbd2cSJim Jagielski     if ( !bInstall )
252*b1cdbd2cSJim Jagielski         return false;
253*b1cdbd2cSJim Jagielski 
254*b1cdbd2cSJim Jagielski     if ( bInstallForAll )
255*b1cdbd2cSJim Jagielski         m_pExecuteCmdQueue->addExtension( rPackageURL, SHARED_PACKAGE_MANAGER, false );
256*b1cdbd2cSJim Jagielski     else
257*b1cdbd2cSJim Jagielski         m_pExecuteCmdQueue->addExtension( rPackageURL, USER_PACKAGE_MANAGER, bWarnUser );
258*b1cdbd2cSJim Jagielski 
259*b1cdbd2cSJim Jagielski     return true;
260*b1cdbd2cSJim Jagielski }
261*b1cdbd2cSJim Jagielski 
262*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
queryTermination()263*b1cdbd2cSJim Jagielski bool TheExtensionManager::queryTermination()
264*b1cdbd2cSJim Jagielski {
265*b1cdbd2cSJim Jagielski     if ( dp_misc::office_is_running() )
266*b1cdbd2cSJim Jagielski         return true;
267*b1cdbd2cSJim Jagielski     // the standalone application unopkg must not close ( and quit ) the dialog
268*b1cdbd2cSJim Jagielski     // when there are still actions in the queue
269*b1cdbd2cSJim Jagielski     return true;
270*b1cdbd2cSJim Jagielski }
271*b1cdbd2cSJim Jagielski 
272*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
terminateDialog()273*b1cdbd2cSJim Jagielski void TheExtensionManager::terminateDialog()
274*b1cdbd2cSJim Jagielski {
275*b1cdbd2cSJim Jagielski     if ( ! dp_misc::office_is_running() )
276*b1cdbd2cSJim Jagielski     {
277*b1cdbd2cSJim Jagielski         const ::vos::OGuard guard( Application::GetSolarMutex() );
278*b1cdbd2cSJim Jagielski         delete m_pExtMgrDialog;
279*b1cdbd2cSJim Jagielski         m_pExtMgrDialog = NULL;
280*b1cdbd2cSJim Jagielski         delete m_pUpdReqDialog;
281*b1cdbd2cSJim Jagielski         m_pUpdReqDialog = NULL;
282*b1cdbd2cSJim Jagielski         Application::Quit();
283*b1cdbd2cSJim Jagielski     }
284*b1cdbd2cSJim Jagielski }
285*b1cdbd2cSJim Jagielski 
286*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
createPackageList()287*b1cdbd2cSJim Jagielski void TheExtensionManager::createPackageList()
288*b1cdbd2cSJim Jagielski {
289*b1cdbd2cSJim Jagielski     uno::Sequence< uno::Sequence< uno::Reference< deployment::XPackage > > > xAllPackages;
290*b1cdbd2cSJim Jagielski 
291*b1cdbd2cSJim Jagielski     try {
292*b1cdbd2cSJim Jagielski         xAllPackages = m_xExtensionManager->getAllExtensions( uno::Reference< task::XAbortChannel >(),
293*b1cdbd2cSJim Jagielski                                                               uno::Reference< ucb::XCommandEnvironment >() );
294*b1cdbd2cSJim Jagielski     } catch ( deployment::DeploymentException & ) {
295*b1cdbd2cSJim Jagielski         return;
296*b1cdbd2cSJim Jagielski     } catch ( ucb::CommandFailedException & ) {
297*b1cdbd2cSJim Jagielski         return;
298*b1cdbd2cSJim Jagielski     } catch ( ucb::CommandAbortedException & ) {
299*b1cdbd2cSJim Jagielski         return;
300*b1cdbd2cSJim Jagielski     } catch ( lang::IllegalArgumentException & e ) {
301*b1cdbd2cSJim Jagielski         throw uno::RuntimeException( e.Message, e.Context );
302*b1cdbd2cSJim Jagielski     }
303*b1cdbd2cSJim Jagielski 
304*b1cdbd2cSJim Jagielski     for ( sal_Int32 i = 0; i < xAllPackages.getLength(); ++i )
305*b1cdbd2cSJim Jagielski     {
306*b1cdbd2cSJim Jagielski         uno::Sequence< uno::Reference< deployment::XPackage > > xPackageList = xAllPackages[i];
307*b1cdbd2cSJim Jagielski 
308*b1cdbd2cSJim Jagielski         for ( sal_Int32 j = 0; j < xPackageList.getLength(); ++j )
309*b1cdbd2cSJim Jagielski         {
310*b1cdbd2cSJim Jagielski             uno::Reference< deployment::XPackage > xPackage = xPackageList[j];
311*b1cdbd2cSJim Jagielski             if ( xPackage.is() )
312*b1cdbd2cSJim Jagielski             {
313*b1cdbd2cSJim Jagielski                 PackageState eState = getPackageState( xPackage );
314*b1cdbd2cSJim Jagielski                 getDialogHelper()->addPackageToList( xPackage );
315*b1cdbd2cSJim Jagielski                 // When the package is enabled, we can stop here, otherwise we have to look for
316*b1cdbd2cSJim Jagielski                 // another version of this package
317*b1cdbd2cSJim Jagielski                 if ( ( eState == REGISTERED ) || ( eState == NOT_AVAILABLE ) )
318*b1cdbd2cSJim Jagielski                     break;
319*b1cdbd2cSJim Jagielski             }
320*b1cdbd2cSJim Jagielski         }
321*b1cdbd2cSJim Jagielski     }
322*b1cdbd2cSJim Jagielski 
323*b1cdbd2cSJim Jagielski     uno::Sequence< uno::Reference< deployment::XPackage > > xNoLicPackages;
324*b1cdbd2cSJim Jagielski     xNoLicPackages = m_xExtensionManager->getExtensionsWithUnacceptedLicenses( SHARED_PACKAGE_MANAGER,
325*b1cdbd2cSJim Jagielski                                                                                uno::Reference< ucb::XCommandEnvironment >() );
326*b1cdbd2cSJim Jagielski     for ( sal_Int32 i = 0; i < xNoLicPackages.getLength(); ++i )
327*b1cdbd2cSJim Jagielski     {
328*b1cdbd2cSJim Jagielski         uno::Reference< deployment::XPackage > xPackage = xNoLicPackages[i];
329*b1cdbd2cSJim Jagielski         if ( xPackage.is() )
330*b1cdbd2cSJim Jagielski         {
331*b1cdbd2cSJim Jagielski             getDialogHelper()->addPackageToList( xPackage, true );
332*b1cdbd2cSJim Jagielski         }
333*b1cdbd2cSJim Jagielski     }
334*b1cdbd2cSJim Jagielski }
335*b1cdbd2cSJim Jagielski 
336*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
getPackageState(const uno::Reference<deployment::XPackage> & xPackage) const337*b1cdbd2cSJim Jagielski PackageState TheExtensionManager::getPackageState( const uno::Reference< deployment::XPackage > &xPackage ) const
338*b1cdbd2cSJim Jagielski {
339*b1cdbd2cSJim Jagielski     try {
340*b1cdbd2cSJim Jagielski         beans::Optional< beans::Ambiguous< sal_Bool > > option(
341*b1cdbd2cSJim Jagielski             xPackage->isRegistered( uno::Reference< task::XAbortChannel >(),
342*b1cdbd2cSJim Jagielski                                     uno::Reference< ucb::XCommandEnvironment >() ) );
343*b1cdbd2cSJim Jagielski         if ( option.IsPresent )
344*b1cdbd2cSJim Jagielski         {
345*b1cdbd2cSJim Jagielski             ::beans::Ambiguous< sal_Bool > const & reg = option.Value;
346*b1cdbd2cSJim Jagielski             if ( reg.IsAmbiguous )
347*b1cdbd2cSJim Jagielski                 return AMBIGUOUS;
348*b1cdbd2cSJim Jagielski             else
349*b1cdbd2cSJim Jagielski                 return reg.Value ? REGISTERED : NOT_REGISTERED;
350*b1cdbd2cSJim Jagielski         }
351*b1cdbd2cSJim Jagielski         else
352*b1cdbd2cSJim Jagielski             return NOT_AVAILABLE;
353*b1cdbd2cSJim Jagielski     }
354*b1cdbd2cSJim Jagielski     catch ( uno::RuntimeException & ) {
355*b1cdbd2cSJim Jagielski         throw;
356*b1cdbd2cSJim Jagielski     }
357*b1cdbd2cSJim Jagielski     catch ( uno::Exception & exc) {
358*b1cdbd2cSJim Jagielski         (void) exc;
359*b1cdbd2cSJim Jagielski         OSL_ENSURE( 0, ::rtl::OUStringToOString( exc.Message, RTL_TEXTENCODING_UTF8 ).getStr() );
360*b1cdbd2cSJim Jagielski         return NOT_AVAILABLE;
361*b1cdbd2cSJim Jagielski     }
362*b1cdbd2cSJim Jagielski }
363*b1cdbd2cSJim Jagielski 
364*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
isReadOnly(const uno::Reference<deployment::XPackage> & xPackage) const365*b1cdbd2cSJim Jagielski bool TheExtensionManager::isReadOnly( const uno::Reference< deployment::XPackage > &xPackage ) const
366*b1cdbd2cSJim Jagielski {
367*b1cdbd2cSJim Jagielski     if ( m_xExtensionManager.is() && xPackage.is() )
368*b1cdbd2cSJim Jagielski     {
369*b1cdbd2cSJim Jagielski         return m_xExtensionManager->isReadOnlyRepository( xPackage->getRepositoryName() );
370*b1cdbd2cSJim Jagielski     }
371*b1cdbd2cSJim Jagielski     else
372*b1cdbd2cSJim Jagielski         return true;
373*b1cdbd2cSJim Jagielski }
374*b1cdbd2cSJim Jagielski 
375*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
376*b1cdbd2cSJim Jagielski // The function investigates if the extension supports options.
supportsOptions(const uno::Reference<deployment::XPackage> & xPackage) const377*b1cdbd2cSJim Jagielski bool TheExtensionManager::supportsOptions( const uno::Reference< deployment::XPackage > &xPackage ) const
378*b1cdbd2cSJim Jagielski {
379*b1cdbd2cSJim Jagielski     bool bOptions = false;
380*b1cdbd2cSJim Jagielski 
381*b1cdbd2cSJim Jagielski     if ( ! xPackage->isBundle() )
382*b1cdbd2cSJim Jagielski         return false;
383*b1cdbd2cSJim Jagielski 
384*b1cdbd2cSJim Jagielski     beans::Optional< OUString > aId = xPackage->getIdentifier();
385*b1cdbd2cSJim Jagielski 
386*b1cdbd2cSJim Jagielski     //a bundle must always have an id
387*b1cdbd2cSJim Jagielski     OSL_ASSERT( aId.IsPresent );
388*b1cdbd2cSJim Jagielski 
389*b1cdbd2cSJim Jagielski     //iterate over all available nodes
390*b1cdbd2cSJim Jagielski     uno::Sequence< OUString > seqNames = m_xNameAccessNodes->getElementNames();
391*b1cdbd2cSJim Jagielski 
392*b1cdbd2cSJim Jagielski     for ( int i = 0; i < seqNames.getLength(); i++ )
393*b1cdbd2cSJim Jagielski     {
394*b1cdbd2cSJim Jagielski         uno::Any anyNode = m_xNameAccessNodes->getByName( seqNames[i] );
395*b1cdbd2cSJim Jagielski         //If we have a node then then it must contain the set of leaves. This is part of OptionsDialog.xcs
396*b1cdbd2cSJim Jagielski         uno::Reference< XInterface> xIntNode = anyNode.get< uno::Reference< XInterface > >();
397*b1cdbd2cSJim Jagielski         uno::Reference< container::XNameAccess > xNode( xIntNode, uno::UNO_QUERY_THROW );
398*b1cdbd2cSJim Jagielski 
399*b1cdbd2cSJim Jagielski         uno::Any anyLeaves = xNode->getByName( OUSTR("Leaves") );
400*b1cdbd2cSJim Jagielski         uno::Reference< XInterface > xIntLeaves = anyLeaves.get< uno::Reference< XInterface > >();
401*b1cdbd2cSJim Jagielski         uno::Reference< container::XNameAccess > xLeaves( xIntLeaves, uno::UNO_QUERY_THROW );
402*b1cdbd2cSJim Jagielski 
403*b1cdbd2cSJim Jagielski         //iterate over all available leaves
404*b1cdbd2cSJim Jagielski         uno::Sequence< OUString > seqLeafNames = xLeaves->getElementNames();
405*b1cdbd2cSJim Jagielski         for ( int j = 0; j < seqLeafNames.getLength(); j++ )
406*b1cdbd2cSJim Jagielski         {
407*b1cdbd2cSJim Jagielski             uno::Any anyLeaf = xLeaves->getByName( seqLeafNames[j] );
408*b1cdbd2cSJim Jagielski             uno::Reference< XInterface > xIntLeaf = anyLeaf.get< uno::Reference< XInterface > >();
409*b1cdbd2cSJim Jagielski             uno::Reference< beans::XPropertySet > xLeaf( xIntLeaf, uno::UNO_QUERY_THROW );
410*b1cdbd2cSJim Jagielski             //investigate the Id property if it matches the extension identifier which
411*b1cdbd2cSJim Jagielski             //has been passed in.
412*b1cdbd2cSJim Jagielski             uno::Any anyValue = xLeaf->getPropertyValue( OUSTR("Id") );
413*b1cdbd2cSJim Jagielski 
414*b1cdbd2cSJim Jagielski             OUString sId = anyValue.get< OUString >();
415*b1cdbd2cSJim Jagielski             if ( sId == aId.Value )
416*b1cdbd2cSJim Jagielski             {
417*b1cdbd2cSJim Jagielski                 bOptions = true;
418*b1cdbd2cSJim Jagielski                 break;
419*b1cdbd2cSJim Jagielski             }
420*b1cdbd2cSJim Jagielski         }
421*b1cdbd2cSJim Jagielski         if ( bOptions )
422*b1cdbd2cSJim Jagielski             break;
423*b1cdbd2cSJim Jagielski     }
424*b1cdbd2cSJim Jagielski     return bOptions;
425*b1cdbd2cSJim Jagielski }
426*b1cdbd2cSJim Jagielski 
427*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
428*b1cdbd2cSJim Jagielski // XEventListener
disposing(lang::EventObject const & rEvt)429*b1cdbd2cSJim Jagielski void TheExtensionManager::disposing( lang::EventObject const & rEvt )
430*b1cdbd2cSJim Jagielski     throw ( uno::RuntimeException )
431*b1cdbd2cSJim Jagielski {
432*b1cdbd2cSJim Jagielski     bool shutDown = (rEvt.Source == m_xDesktop);
433*b1cdbd2cSJim Jagielski 
434*b1cdbd2cSJim Jagielski     if ( shutDown && m_xDesktop.is() )
435*b1cdbd2cSJim Jagielski     {
436*b1cdbd2cSJim Jagielski         m_xDesktop->removeTerminateListener( this );
437*b1cdbd2cSJim Jagielski         m_xDesktop.clear();
438*b1cdbd2cSJim Jagielski     }
439*b1cdbd2cSJim Jagielski 
440*b1cdbd2cSJim Jagielski     if ( shutDown )
441*b1cdbd2cSJim Jagielski     {
442*b1cdbd2cSJim Jagielski         if ( dp_misc::office_is_running() )
443*b1cdbd2cSJim Jagielski         {
444*b1cdbd2cSJim Jagielski             const ::vos::OGuard guard( Application::GetSolarMutex() );
445*b1cdbd2cSJim Jagielski             delete m_pExtMgrDialog;
446*b1cdbd2cSJim Jagielski             m_pExtMgrDialog = NULL;
447*b1cdbd2cSJim Jagielski             delete m_pUpdReqDialog;
448*b1cdbd2cSJim Jagielski             m_pUpdReqDialog = NULL;
449*b1cdbd2cSJim Jagielski         }
450*b1cdbd2cSJim Jagielski         s_ExtMgr.clear();
451*b1cdbd2cSJim Jagielski     }
452*b1cdbd2cSJim Jagielski }
453*b1cdbd2cSJim Jagielski 
454*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
455*b1cdbd2cSJim Jagielski // XTerminateListener
queryTermination(::lang::EventObject const &)456*b1cdbd2cSJim Jagielski void TheExtensionManager::queryTermination( ::lang::EventObject const & )
457*b1cdbd2cSJim Jagielski     throw ( frame::TerminationVetoException, uno::RuntimeException )
458*b1cdbd2cSJim Jagielski {
459*b1cdbd2cSJim Jagielski     DialogHelper *pDialogHelper = getDialogHelper();
460*b1cdbd2cSJim Jagielski 
461*b1cdbd2cSJim Jagielski     if ( m_pExecuteCmdQueue->isBusy() || ( pDialogHelper && pDialogHelper->isBusy() ) )
462*b1cdbd2cSJim Jagielski     {
463*b1cdbd2cSJim Jagielski         ToTop( TOTOP_RESTOREWHENMIN );
464*b1cdbd2cSJim Jagielski         throw frame::TerminationVetoException(
465*b1cdbd2cSJim Jagielski             OUSTR("The office cannot be closed while the Extension Manager is running"),
466*b1cdbd2cSJim Jagielski             uno::Reference<XInterface>(static_cast<frame::XTerminateListener*>(this), uno::UNO_QUERY));
467*b1cdbd2cSJim Jagielski     }
468*b1cdbd2cSJim Jagielski     else
469*b1cdbd2cSJim Jagielski     {
470*b1cdbd2cSJim Jagielski         if ( m_pExtMgrDialog )
471*b1cdbd2cSJim Jagielski             m_pExtMgrDialog->Close();
472*b1cdbd2cSJim Jagielski         if ( m_pUpdReqDialog )
473*b1cdbd2cSJim Jagielski             m_pUpdReqDialog->Close();
474*b1cdbd2cSJim Jagielski     }
475*b1cdbd2cSJim Jagielski }
476*b1cdbd2cSJim Jagielski 
477*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
notifyTermination(::lang::EventObject const & rEvt)478*b1cdbd2cSJim Jagielski void TheExtensionManager::notifyTermination( ::lang::EventObject const & rEvt )
479*b1cdbd2cSJim Jagielski     throw ( uno::RuntimeException )
480*b1cdbd2cSJim Jagielski {
481*b1cdbd2cSJim Jagielski     disposing( rEvt );
482*b1cdbd2cSJim Jagielski }
483*b1cdbd2cSJim Jagielski 
484*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
485*b1cdbd2cSJim Jagielski // XModifyListener
modified(::lang::EventObject const &)486*b1cdbd2cSJim Jagielski void TheExtensionManager::modified( ::lang::EventObject const & /*rEvt*/ )
487*b1cdbd2cSJim Jagielski     throw ( uno::RuntimeException )
488*b1cdbd2cSJim Jagielski {
489*b1cdbd2cSJim Jagielski     getDialogHelper()->prepareChecking();
490*b1cdbd2cSJim Jagielski     createPackageList();
491*b1cdbd2cSJim Jagielski     getDialogHelper()->checkEntries();
492*b1cdbd2cSJim Jagielski }
493*b1cdbd2cSJim Jagielski 
494*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
get(const uno::Reference<uno::XComponentContext> & xContext,const uno::Reference<awt::XWindow> & xParent,const OUString & extensionURL)495*b1cdbd2cSJim Jagielski ::rtl::Reference< TheExtensionManager > TheExtensionManager::get( const uno::Reference< uno::XComponentContext > &xContext,
496*b1cdbd2cSJim Jagielski                                                                   const uno::Reference< awt::XWindow > &xParent,
497*b1cdbd2cSJim Jagielski                                                                   const OUString & extensionURL )
498*b1cdbd2cSJim Jagielski {
499*b1cdbd2cSJim Jagielski     if ( s_ExtMgr.is() )
500*b1cdbd2cSJim Jagielski     {
501*b1cdbd2cSJim Jagielski         OSL_DOUBLE_CHECKED_LOCKING_MEMORY_BARRIER();
502*b1cdbd2cSJim Jagielski         if ( extensionURL.getLength() )
503*b1cdbd2cSJim Jagielski             s_ExtMgr->installPackage( extensionURL, true );
504*b1cdbd2cSJim Jagielski         return s_ExtMgr;
505*b1cdbd2cSJim Jagielski     }
506*b1cdbd2cSJim Jagielski 
507*b1cdbd2cSJim Jagielski     Window * pParent = DIALOG_NO_PARENT;
508*b1cdbd2cSJim Jagielski     if ( xParent.is() )
509*b1cdbd2cSJim Jagielski         pParent = VCLUnoHelper::GetWindow(xParent);
510*b1cdbd2cSJim Jagielski 
511*b1cdbd2cSJim Jagielski     ::rtl::Reference<TheExtensionManager> that( new TheExtensionManager( pParent, xContext ) );
512*b1cdbd2cSJim Jagielski 
513*b1cdbd2cSJim Jagielski     const ::vos::OGuard guard( Application::GetSolarMutex() );
514*b1cdbd2cSJim Jagielski     if ( ! s_ExtMgr.is() )
515*b1cdbd2cSJim Jagielski     {
516*b1cdbd2cSJim Jagielski         OSL_DOUBLE_CHECKED_LOCKING_MEMORY_BARRIER();
517*b1cdbd2cSJim Jagielski         s_ExtMgr = that;
518*b1cdbd2cSJim Jagielski     }
519*b1cdbd2cSJim Jagielski 
520*b1cdbd2cSJim Jagielski     if ( extensionURL.getLength() )
521*b1cdbd2cSJim Jagielski         s_ExtMgr->installPackage( extensionURL, true );
522*b1cdbd2cSJim Jagielski 
523*b1cdbd2cSJim Jagielski     return s_ExtMgr;
524*b1cdbd2cSJim Jagielski }
525*b1cdbd2cSJim Jagielski 
526*b1cdbd2cSJim Jagielski } //namespace dp_gui
527*b1cdbd2cSJim Jagielski 
528