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 <sfx2/app.hxx> 28 #include <com/sun/star/frame/XTerminateListener.hpp> 29 #include <com/sun/star/uno/Reference.hxx> 30 #include <com/sun/star/frame/XDesktop.hpp> 31 #include <com/sun/star/lang/XServiceInfo.hpp> 32 33 #include <svtools/soerr.hxx> 34 #include <svtools/svtools.hrc> 35 #include <unotools/saveopt.hxx> 36 #include <unotools/localisationoptions.hxx> 37 #include <tools/config.hxx> 38 #ifndef _SV_RESARY_HXX 39 #include <tools/resary.hxx> 40 #endif 41 #include <tools/urlobj.hxx> 42 #include <svl/intitem.hxx> 43 #include <svl/eitem.hxx> 44 #include <svl/stritem.hxx> 45 #ifndef _MSGBOX_HXX //autogen 46 #include <vcl/msgbox.hxx> 47 #endif 48 #include <svtools/ehdl.hxx> 49 #ifndef _UNOTOOLS_PROCESSFACTORY_HXX 50 #include <comphelper/processfactory.hxx> 51 #endif 52 #include <unotools/configmgr.hxx> 53 #include <rtl/ustrbuf.hxx> 54 #include <vos/security.hxx> 55 #include <ucbhelper/configurationkeys.hxx> 56 #include <unotools/pathoptions.hxx> 57 #include <unotools/historyoptions.hxx> 58 #include <unotools/moduleoptions.hxx> 59 #include <cppuhelper/implbase2.hxx> 60 61 #include <rtl/logfile.hxx> 62 #include <vcl/edit.hxx> 63 64 #include <sfx2/unoctitm.hxx> 65 #include "app.hrc" 66 #include "sfxlocal.hrc" 67 #include "appdata.hxx" 68 #include "arrdecl.hxx" 69 #include <sfx2/dispatch.hxx> 70 #include <sfx2/docfac.hxx> 71 #include <sfx2/evntconf.hxx> 72 #include "intro.hxx" 73 #include <sfx2/mnumgr.hxx> 74 #include <sfx2/msgpool.hxx> 75 #include <sfx2/progress.hxx> 76 #include "sfx2/sfxhelp.hxx" 77 #include "sfx2/sfxresid.hxx" 78 #include "sfxtypes.hxx" 79 #include <sfx2/viewsh.hxx> 80 #include "nochaos.hxx" 81 #include <sfx2/fcontnr.hxx> 82 #include "helper.hxx" // SfxContentHelper::Kill() 83 #include "sfxpicklist.hxx" 84 #include <tools/svlibrary.hxx> 85 86 #ifdef UNX 87 #define stricmp(a,b) strcmp(a,b) 88 #endif 89 90 using namespace ::com::sun::star::uno; 91 using namespace ::com::sun::star::frame; 92 using namespace ::com::sun::star::lang; 93 using namespace ::com::sun::star; 94 namespace css = ::com::sun::star; 95 96 class SfxTerminateListener_Impl : public ::cppu::WeakImplHelper2< XTerminateListener, XServiceInfo > 97 { 98 public: 99 100 // XTerminateListener 101 virtual void SAL_CALL queryTermination( const EventObject& aEvent ) throw( TerminationVetoException, RuntimeException ); 102 virtual void SAL_CALL notifyTermination( const EventObject& aEvent ) throw( RuntimeException ); 103 virtual void SAL_CALL disposing( const EventObject& Source ) throw( RuntimeException ); 104 105 // XServiceInfo 106 virtual ::rtl::OUString SAL_CALL getImplementationName() throw (RuntimeException); 107 virtual ::sal_Bool SAL_CALL supportsService( const ::rtl::OUString& sServiceName ) throw (RuntimeException); 108 virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames() throw (RuntimeException); 109 }; 110 111 void SAL_CALL SfxTerminateListener_Impl::disposing( const EventObject& ) throw( RuntimeException ) 112 { 113 } 114 115 void SAL_CALL SfxTerminateListener_Impl::queryTermination( const EventObject& ) throw(TerminationVetoException, RuntimeException ) 116 { 117 ::vos::OGuard aGuard( Application::GetSolarMutex() ); 118 if ( !SFX_APP()->QueryExit_Impl() ) 119 throw TerminationVetoException(); 120 } 121 122 void SAL_CALL SfxTerminateListener_Impl::notifyTermination( const EventObject& aEvent ) throw(RuntimeException ) 123 { 124 static ::rtl::OUString SERVICE_GLOBALEVENTBROADCASTER = ::rtl::OUString::createFromAscii("com.sun.star.frame.GlobalEventBroadcaster"); 125 static ::rtl::OUString EVENT_QUIT_APP = ::rtl::OUString::createFromAscii("OnCloseApp"); 126 127 Reference< XDesktop > xDesktop( aEvent.Source, UNO_QUERY ); 128 if( xDesktop.is() == sal_True ) 129 xDesktop->removeTerminateListener( this ); 130 131 ::vos::OGuard aGuard( Application::GetSolarMutex() ); 132 utl::ConfigManager::GetConfigManager()->StoreConfigItems(); 133 SfxApplication* pApp = SFX_APP(); 134 pApp->Broadcast( SfxSimpleHint( SFX_HINT_DEINITIALIZING ) ); 135 pApp->Get_Impl()->pAppDispatch->ReleaseAll(); 136 pApp->Get_Impl()->pAppDispatch->release(); 137 138 css::uno::Reference< css::lang::XMultiServiceFactory > xSMGR = ::comphelper::getProcessServiceFactory(); 139 css::uno::Reference< css::document::XEventListener > xGlobalBroadcaster(xSMGR->createInstance(SERVICE_GLOBALEVENTBROADCASTER), css::uno::UNO_QUERY); 140 if (xGlobalBroadcaster.is()) 141 { 142 css::document::EventObject aEvent2; 143 aEvent2.EventName = EVENT_QUIT_APP; 144 xGlobalBroadcaster->notifyEvent(aEvent2); 145 } 146 147 //pApp->Deinitialize(); 148 delete pApp; 149 Application::Quit(); 150 } 151 152 ::rtl::OUString SAL_CALL SfxTerminateListener_Impl::getImplementationName() throw (RuntimeException) 153 { 154 static const ::rtl::OUString IMPLNAME = ::rtl::OUString::createFromAscii("com.sun.star.comp.sfx2.SfxTerminateListener"); 155 return IMPLNAME; 156 } 157 158 ::sal_Bool SAL_CALL SfxTerminateListener_Impl::supportsService( const ::rtl::OUString& sServiceName ) throw (RuntimeException) 159 { 160 Sequence< ::rtl::OUString > lNames = getSupportedServiceNames(); 161 ::sal_Int32 c = lNames.getLength(); 162 ::sal_Int32 i = 0; 163 164 for (i=0; i<c; ++i) 165 { 166 if (lNames[i].equals(sServiceName)) 167 return sal_True; 168 } 169 170 return sal_False; 171 } 172 173 Sequence< ::rtl::OUString > SAL_CALL SfxTerminateListener_Impl::getSupportedServiceNames() throw (RuntimeException) 174 { 175 // Note: That service does not realy exists .-) 176 // But this implementation is not thought to be registered realy within our service.rdb. 177 // At least we need the implementation name only to identify these service at the global desktop instance. 178 // The desktop must know, which listener will terminate the SfxApplication in real ! 179 // It must call this special listener as last one ... otherwise we shutdown the SfxApplication BEFORE other listener 180 // can react ... 181 static const ::rtl::OUString SERVICENAME = ::rtl::OUString::createFromAscii("com.sun.star.frame.TerminateListener"); 182 Sequence< ::rtl::OUString > lNames(1); 183 lNames[0] = SERVICENAME; 184 return lNames; 185 } 186 187 //==================================================================== 188 189 #define DOSTRING( x ) #x 190 #define STRING( x ) DOSTRING( x ) 191 192 typedef bool ( *PFunc_getSpecialCharsForEdit)( Window* i_pParent, const Font& i_rFont, String& o_rOutString ); 193 194 //==================================================================== 195 // Lazy binding of the GetSpecialCharsForEdit function as it resides in 196 // a library above us. 197 //==================================================================== 198 199 extern "C" { static void SAL_CALL thisModule() {} } 200 201 String GetSpecialCharsForEdit(Window* pParent, const Font& rFont) 202 { 203 static bool bDetermineFunction = false; 204 static PFunc_getSpecialCharsForEdit pfunc_getSpecialCharsForEdit = 0; 205 206 ::vos::OGuard aGuard( Application::GetSolarMutex() ); 207 if ( !bDetermineFunction ) 208 { 209 bDetermineFunction = true; 210 211 static ::rtl::OUString aLibName( RTL_CONSTASCII_USTRINGPARAM( SVLIBRARY( "cui" ) ) ); 212 oslModule handleMod = osl_loadModuleRelative( 213 &thisModule, aLibName.pData, 0 ); 214 215 // get symbol 216 ::rtl::OUString aSymbol( RTL_CONSTASCII_USTRINGPARAM( "GetSpecialCharsForEdit" ) ); 217 pfunc_getSpecialCharsForEdit = (PFunc_getSpecialCharsForEdit)osl_getFunctionSymbol( handleMod, aSymbol.pData ); 218 DBG_ASSERT( pfunc_getSpecialCharsForEdit, "GetSpecialCharsForEdit() not found!" ); 219 } 220 221 String aRet; 222 if ( pfunc_getSpecialCharsForEdit ) 223 (*pfunc_getSpecialCharsForEdit)( pParent, rFont, aRet ); 224 return aRet; 225 } 226 227 //==================================================================== 228 229 bool SfxApplication::Initialize_Impl() 230 { 231 RTL_LOGFILE_CONTEXT( aLog, "sfx2 (mb93783) ::SfxApplication::Initialize_Impl" ); 232 233 #ifdef TLX_VALIDATE 234 StgIo::SetErrorLink( LINK( this, SfxStorageErrHdl, Error ) ); 235 #endif 236 237 Reference < XDesktop > xDesktop ( ::comphelper::getProcessServiceFactory()->createInstance( DEFINE_CONST_UNICODE("com.sun.star.frame.Desktop") ), UNO_QUERY ); 238 if (!xDesktop.is()) 239 throw RuntimeException( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Couldn't create mandatory desktop service!" )), xDesktop ); 240 xDesktop->addTerminateListener( new SfxTerminateListener_Impl() ); 241 242 Application::EnableAutoHelpId(); 243 244 pAppData_Impl->pAppDispatch = new SfxStatusDispatcher; 245 pAppData_Impl->pAppDispatch->acquire(); 246 247 // SV-Look 248 Help::EnableContextHelp(); 249 Help::EnableExtHelp(); 250 251 SvtLocalisationOptions aLocalisation; 252 Application::EnableAutoMnemonic ( aLocalisation.IsAutoMnemonic() ); 253 Application::SetDialogScaleX ( (short)(aLocalisation.GetDialogScale()) ); 254 255 256 #ifdef DBG_UTIL 257 // Der SimplerErrorHandler dient Debugzwecken. In der Product werden 258 // nichtgehandelte Fehler durch Errorcode 1 an SFX gegeben. 259 new SimpleErrorHandler; 260 #endif 261 pAppData_Impl->pBasicResMgr = CreateResManager("sb"); 262 pAppData_Impl->pSvtResMgr = CreateResManager("svt"); 263 new SfxErrorHandler( RID_ERRHDL, ERRCODE_AREA_TOOLS, ERRCODE_AREA_LIB1 ); 264 new SfxErrorHandler( RID_SO_ERROR_HANDLER, ERRCODE_AREA_SO, ERRCODE_AREA_SO_END, pAppData_Impl->pSvtResMgr ); 265 new SfxErrorHandler( RID_BASIC_START, ERRCODE_AREA_SBX, ERRCODE_AREA_SBX_END, pAppData_Impl->pBasicResMgr ); 266 267 // diverse Pointer 268 SfxPickList::GetOrCreate( SvtHistoryOptions().GetSize( ePICKLIST ) ); 269 270 ///////////////////////////////////////////////////////////////// 271 272 DBG_ASSERT( !pAppData_Impl->pAppDispat, "AppDispatcher already exists" ); 273 pAppData_Impl->pAppDispat = new SfxDispatcher((SfxDispatcher*)0); 274 pAppData_Impl->pSlotPool = new SfxSlotPool; 275 pAppData_Impl->pTbxCtrlFac = new SfxTbxCtrlFactArr_Impl; 276 pAppData_Impl->pStbCtrlFac = new SfxStbCtrlFactArr_Impl; 277 pAppData_Impl->pMenuCtrlFac = new SfxMenuCtrlFactArr_Impl; 278 pAppData_Impl->pViewFrames = new SfxViewFrameArr_Impl; 279 pAppData_Impl->pViewShells = new SfxViewShellArr_Impl; 280 pAppData_Impl->pObjShells = new SfxObjectShellArr_Impl; 281 pAppData_Impl->nInterfaces = SFX_INTERFACE_APP+8; 282 pAppData_Impl->pInterfaces = new SfxInterface*[pAppData_Impl->nInterfaces]; 283 memset( pAppData_Impl->pInterfaces, 0, sizeof(SfxInterface*) * pAppData_Impl->nInterfaces ); 284 285 Registrations_Impl(); 286 287 // Subklasse initialisieren 288 pAppData_Impl->bDowning = sal_False; 289 Init(); 290 291 // get CHAOS item pool... 292 pAppData_Impl->pPool = NoChaos::GetItemPool(); 293 SetPool( pAppData_Impl->pPool ); 294 295 if ( pAppData_Impl->bDowning ) 296 return sal_False; 297 298 // App-Dispatcher aufbauen 299 pAppData_Impl->pAppDispat->Push(*this); 300 pAppData_Impl->pAppDispat->Flush(); 301 pAppData_Impl->pAppDispat->DoActivate_Impl( sal_True, NULL ); 302 303 { 304 ::vos::OGuard aGuard( Application::GetSolarMutex() ); 305 // Set special characters callback on vcl edit control 306 Edit::SetGetSpecialCharsFunction(&GetSpecialCharsForEdit); 307 } 308 309 return sal_True; 310 } 311