1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sfx2.hxx"
26
27 #include "appbaslib.hxx"
28
29 #include <sfx2/sfxuno.hxx>
30 #include "sfxtypes.hxx"
31 #include <sfx2/app.hxx>
32
33 #include <basic/basmgr.hxx>
34 #include <tools/diagnose_ex.h>
35 #include <comphelper/processfactory.hxx>
36
37 using namespace ::com::sun::star::uno;
38 using namespace ::com::sun::star::lang;
39 using namespace ::com::sun::star::script;
40 using namespace ::com::sun::star::embed;
41 using ::rtl::OUString;
42 using ::osl::MutexGuard;
43 using ::osl::Mutex;
44
45 //============================================================================
SfxBasicManagerHolder()46 SfxBasicManagerHolder::SfxBasicManagerHolder()
47 :mpBasicManager( NULL )
48 {
49 }
50
reset(BasicManager * _pBasicManager)51 void SfxBasicManagerHolder::reset( BasicManager* _pBasicManager )
52 {
53 impl_releaseContainers();
54
55 // Note: we do not delete the old BasicManager. BasicManager instances are
56 // nowadays obtained from the BasicManagerRepository, and the ownership is with
57 // the repository.
58 // @see basic::BasicManagerRepository::getApplicationBasicManager
59 // @see basic::BasicManagerRepository::getDocumentBasicManager
60 mpBasicManager = _pBasicManager;
61
62 if ( mpBasicManager )
63 {
64 try
65 {
66 mxBasicContainer.set( mpBasicManager->GetScriptLibraryContainer(), UNO_QUERY_THROW );
67 mxDialogContainer.set( mpBasicManager->GetDialogLibraryContainer(), UNO_QUERY_THROW );
68 }
69 catch( const Exception& )
70 {
71 DBG_UNHANDLED_EXCEPTION();
72 }
73 }
74 }
75
isAnyContainerModified() const76 bool SfxBasicManagerHolder::isAnyContainerModified() const
77 {
78 OSL_PRECOND( isValid(), "SfxBasicManagerHolder::isAnyContainerModified: not initialized!" );
79
80 if ( mxBasicContainer.is() && mxBasicContainer->isModified() )
81 return true;
82 if ( mxDialogContainer.is() && mxDialogContainer->isModified() )
83 return true;
84
85 return false;
86 }
87
storeAllLibraries()88 void SfxBasicManagerHolder::storeAllLibraries()
89 {
90 OSL_PRECOND( isValid(), "SfxBasicManagerHolder::storeAllLibraries: not initialized!" );
91 try
92 {
93 if ( mxBasicContainer.is() )
94 mxBasicContainer->storeLibraries();
95 if ( mxDialogContainer.is() )
96 mxDialogContainer->storeLibraries();
97 }
98 catch( const Exception& )
99 {
100 DBG_UNHANDLED_EXCEPTION();
101 }
102 }
103
setStorage(const Reference<XStorage> & _rxStorage)104 void SfxBasicManagerHolder::setStorage( const Reference< XStorage >& _rxStorage )
105 {
106 try
107 {
108 if ( mxBasicContainer.is() )
109 mxBasicContainer->setRootStorage( _rxStorage );
110 if ( mxDialogContainer.is() )
111 mxDialogContainer->setRootStorage( _rxStorage );
112 }
113 catch( const Exception& )
114 {
115 DBG_UNHANDLED_EXCEPTION();
116 }
117 }
118
storeLibrariesToStorage(const Reference<XStorage> & _rxStorage)119 void SfxBasicManagerHolder::storeLibrariesToStorage( const Reference< XStorage >& _rxStorage )
120 {
121 OSL_PRECOND( isValid(), "SfxBasicManagerHolder::storeLibrariesToStorage: not initialized!" );
122
123 try
124 {
125 if ( mxBasicContainer.is() )
126 mxBasicContainer->storeLibrariesToStorage( _rxStorage );
127 if ( mxDialogContainer.is() )
128 mxDialogContainer->storeLibrariesToStorage( _rxStorage );
129 }
130 catch( const Exception& )
131 {
132 DBG_UNHANDLED_EXCEPTION();
133 }
134 }
135
getLibraryContainer(ContainerType _eType)136 Reference< XLibraryContainer > SfxBasicManagerHolder::getLibraryContainer( ContainerType _eType )
137 {
138 OSL_PRECOND( isValid(), "SfxBasicManagerHolder::getLibraryContainer: not initialized!" );
139
140 switch ( _eType )
141 {
142 case SCRIPTS: return mxBasicContainer.get();
143 case DIALOGS: return mxDialogContainer.get();
144 }
145 DBG_ERROR( "SfxBasicManagerHolder::getLibraryContainer: illegal container type!" );
146 return NULL;
147 }
148
impl_releaseContainers()149 void SfxBasicManagerHolder::impl_releaseContainers()
150 {
151 mxBasicContainer.clear();
152 mxDialogContainer.clear();
153 }
154
155 sal_Bool
LegacyPsswdBinaryLimitExceeded(Sequence<rtl::OUString> & sModules)156 SfxBasicManagerHolder::LegacyPsswdBinaryLimitExceeded( Sequence< rtl::OUString >& sModules )
157 {
158 if ( mpBasicManager )
159 return mpBasicManager->LegacyPsswdBinaryLimitExceeded( sModules );
160 return sal_True;
161 }
162
163 //============================================================================
164 // Service for application library container
SFX_IMPL_ONEINSTANCEFACTORY(SfxApplicationDialogLibraryContainer)165 SFX_IMPL_ONEINSTANCEFACTORY( SfxApplicationDialogLibraryContainer )
166
167 Sequence< OUString > SfxApplicationDialogLibraryContainer::impl_getStaticSupportedServiceNames()
168 {
169 static Sequence< OUString > seqServiceNames( 1 );
170 static sal_Bool bNeedsInit = sal_True;
171
172 MutexGuard aGuard( Mutex::getGlobalMutex() );
173 if( bNeedsInit )
174 {
175 OUString* pSeq = seqServiceNames.getArray();
176 pSeq[0] = OUString::createFromAscii( "com.sun.star.script.ApplicationDialogLibraryContainer" );
177 bNeedsInit = sal_False;
178 }
179 return seqServiceNames;
180 }
181
impl_getStaticImplementationName()182 OUString SfxApplicationDialogLibraryContainer::impl_getStaticImplementationName()
183 {
184 static OUString aImplName;
185 static sal_Bool bNeedsInit = sal_True;
186
187 MutexGuard aGuard( Mutex::getGlobalMutex() );
188 if( bNeedsInit )
189 {
190 aImplName = OUString::createFromAscii( "com.sun.star.comp.sfx2.ApplicationDialogLibraryContainer" );
191 bNeedsInit = sal_False;
192 }
193 return aImplName;
194 }
195
impl_createInstance(const Reference<XMultiServiceFactory> &)196 Reference< XInterface > SAL_CALL SfxApplicationDialogLibraryContainer::impl_createInstance
197 ( const Reference< XMultiServiceFactory >& )
198 throw( Exception )
199 {
200 SFX_APP()->GetBasicManager();
201 Reference< XInterface > xRet =
202 Reference< XInterface >( SFX_APP()->GetDialogContainer(), UNO_QUERY );
203 return xRet;
204 }
205
206 //============================================================================
207 // Service for application library container
SFX_IMPL_ONEINSTANCEFACTORY(SfxApplicationScriptLibraryContainer)208 SFX_IMPL_ONEINSTANCEFACTORY( SfxApplicationScriptLibraryContainer )
209
210 Sequence< OUString > SfxApplicationScriptLibraryContainer::impl_getStaticSupportedServiceNames()
211 {
212 static Sequence< OUString > seqServiceNames( 1 );
213 static sal_Bool bNeedsInit = sal_True;
214
215 MutexGuard aGuard( Mutex::getGlobalMutex() );
216 if( bNeedsInit )
217 {
218 OUString* pSeq = seqServiceNames.getArray();
219 pSeq[0] = OUString::createFromAscii( "com.sun.star.script.ApplicationScriptLibraryContainer" );
220 bNeedsInit = sal_False;
221 }
222 return seqServiceNames;
223 }
224
impl_getStaticImplementationName()225 OUString SfxApplicationScriptLibraryContainer::impl_getStaticImplementationName()
226 {
227 static OUString aImplName;
228 static sal_Bool bNeedsInit = sal_True;
229
230 MutexGuard aGuard( Mutex::getGlobalMutex() );
231 if( bNeedsInit )
232 {
233 aImplName = OUString::createFromAscii( "com.sun.star.comp.sfx2.ApplicationScriptLibraryContainer" );
234 bNeedsInit = sal_False;
235 }
236 return aImplName;
237 }
238
impl_createInstance(const Reference<XMultiServiceFactory> &)239 Reference< XInterface > SAL_CALL SfxApplicationScriptLibraryContainer::impl_createInstance
240 ( const Reference< XMultiServiceFactory >& )
241 throw( Exception )
242 {
243 SFX_APP()->GetBasicManager();
244 Reference< XInterface > xRet =
245 Reference< XInterface >( SFX_APP()->GetBasicContainer(), UNO_QUERY );
246 return xRet;
247 }
248
249