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_desktop.hxx" 26 27 #include "oemjob.hxx" 28 #include <rtl/bootstrap.hxx> 29 #include <rtl/ustrbuf.hxx> 30 #include <osl/file.hxx> 31 #include <unotools/bootstrap.hxx> 32 #include <tools/config.hxx> 33 #include <com/sun/star/frame/XDesktop.hpp> 34 #include <com/sun/star/frame/XFrame.hpp> 35 #include <com/sun/star/frame/XModel.hpp> 36 #include <com/sun/star/util/XCloseable.hpp> 37 #include <com/sun/star/ui/dialogs/XExecutableDialog.hpp> 38 #include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp> 39 #include <com/sun/star/beans/NamedValue.hpp> 40 41 using namespace rtl; 42 using namespace ::com::sun::star::uno; 43 using namespace ::com::sun::star::lang; 44 using namespace ::com::sun::star::beans; 45 using namespace ::com::sun::star::ui::dialogs; 46 using namespace ::com::sun::star::frame; 47 using namespace ::com::sun::star::util; 48 49 namespace desktop{ 50 51 char const OEM_PRELOAD_SECTION[] = "Bootstrap"; 52 char const OEM_PRELOAD[] = "Preload"; 53 char const STR_TRUE[] = "1"; 54 char const STR_FALSE[] = "0"; 55 56 const char* OEMPreloadJob::interfaces[] = 57 { 58 "com.sun.star.task.XJob", 59 NULL, 60 }; 61 const char* OEMPreloadJob::implementationName = "com.sun.star.comp.desktop.OEMPreloadJob"; 62 const char* OEMPreloadJob::serviceName = "com.sun.star.office.OEMPreloadJob"; 63 64 OUString OEMPreloadJob::GetImplementationName() 65 { 66 return OUString( RTL_CONSTASCII_USTRINGPARAM( implementationName)); 67 } 68 69 Sequence< OUString > OEMPreloadJob::GetSupportedServiceNames() 70 { 71 sal_Int32 nSize = (sizeof( interfaces ) / sizeof( const char *)) - 1; 72 Sequence< OUString > aResult( nSize ); 73 74 for( sal_Int32 i = 0; i < nSize; i++ ) 75 aResult[i] = OUString::createFromAscii( interfaces[i] ); 76 return aResult; 77 } 78 79 Reference< XInterface > SAL_CALL OEMPreloadJob::CreateInstance( 80 const Reference< XMultiServiceFactory >& rSMgr ) 81 { 82 static osl::Mutex aMutex; 83 osl::MutexGuard guard( aMutex ); 84 return (XComponent*) ( new OEMPreloadJob( rSMgr ) ); 85 } 86 87 OEMPreloadJob::OEMPreloadJob( const Reference< XMultiServiceFactory >& xFactory ) : 88 m_aListeners( m_aMutex ), 89 m_xServiceManager( xFactory ) 90 { 91 } 92 93 OEMPreloadJob::~OEMPreloadJob() 94 { 95 } 96 97 // XComponent 98 void SAL_CALL OEMPreloadJob::dispose() throw ( RuntimeException ) 99 { 100 EventObject aObject; 101 aObject.Source = (XComponent*)this; 102 m_aListeners.disposeAndClear( aObject ); 103 } 104 105 void SAL_CALL OEMPreloadJob::addEventListener( const Reference< XEventListener > & aListener) throw ( RuntimeException ) 106 { 107 m_aListeners.addInterface( aListener ); 108 } 109 110 void SAL_CALL OEMPreloadJob::removeEventListener( const Reference< XEventListener > & aListener ) throw ( RuntimeException ) 111 { 112 m_aListeners.removeInterface( aListener ); 113 } 114 115 // XServiceInfo 116 ::rtl::OUString SAL_CALL OEMPreloadJob::getImplementationName() 117 throw ( RuntimeException ) 118 { 119 return OEMPreloadJob::GetImplementationName(); 120 } 121 122 sal_Bool SAL_CALL OEMPreloadJob::supportsService( const ::rtl::OUString& rServiceName ) 123 throw ( RuntimeException ) 124 { 125 sal_Int32 nSize = sizeof( interfaces ) / sizeof( const char *); 126 127 for( sal_Int32 i = 0; i < nSize; i++ ) 128 if ( rServiceName.equalsAscii( interfaces[i] )) 129 return sal_True; 130 return sal_False; 131 } 132 133 Sequence< ::rtl::OUString > SAL_CALL OEMPreloadJob::getSupportedServiceNames() 134 throw ( RuntimeException ) 135 { 136 return OEMPreloadJob::GetSupportedServiceNames(); 137 } 138 139 // XJob 140 Any SAL_CALL OEMPreloadJob::execute(const Sequence<NamedValue>&) 141 throw ( RuntimeException ) 142 { 143 sal_Bool bCont = sal_False; 144 // are we an OEM version at all? 145 if (checkOEMPreloadFlag()) 146 { 147 // create OEM preload service dialog 148 Reference <XExecutableDialog> xDialog( m_xServiceManager->createInstance( 149 OUString::createFromAscii("org.openoffice.comp.preload.OEMPreloadWizard")), 150 UNO_QUERY ); 151 if ( xDialog.is() ){ 152 // execute OEM preload dialog and check return value 153 if ( xDialog->execute() == ExecutableDialogResults::OK ) { 154 // user accepted. 155 // make sure the job does not get called again. 156 bCont = sal_True; 157 disableOEMPreloadFlag(); 158 } else { 159 // user declined... 160 // terminate. 161 /* 162 Reference< XDesktop > xDesktop( m_xServiceManager->createInstance( 163 OUString::createFromAscii("com.sun.star.frame.Desktop")), 164 UNO_QUERY ); 165 xDesktop->terminate(); 166 */ 167 /* 168 OUString aName; 169 OUString aEnvType; 170 Reference<XFrame> rFrame; 171 Reference<XModel> rModel; 172 Reference<XCloseable> rClose; 173 for (int i=0; i<args.getLength(); i++) 174 { 175 if (args[i].Name.equalsAscii("EnvType")) 176 args[i].Value >>= aEnvType; 177 else if (args[i].Name.equalsAscii("Frame")) { 178 args[i].Value >>= rFrame; 179 rClose = Reference<XCloseable>(rFrame, UNO_QUERY); 180 } 181 else if (args[i].Name.equalsAscii("Model")) { 182 args[i].Value >>= rModel; 183 rClose = Reference<XCloseable>(rModel, UNO_QUERY); 184 } 185 } 186 if (rClose.is()) rClose->close(sal_True); 187 */ 188 bCont = sal_False; 189 } 190 } 191 } else { 192 // don't try again 193 bCont = sal_True; 194 } 195 /* 196 NamedValue nv; 197 nv.Name = OUString::createFromAscii("Deactivate"); 198 nv.Value <<= bDeactivate; 199 Sequence<NamedValue> s(1); 200 s[0] = nv; 201 */ 202 Any r; 203 r <<= bCont; 204 return r; 205 } 206 207 208 static sal_Bool existsURL( OUString const& _sURL ) 209 { 210 using namespace osl; 211 DirectoryItem aDirItem; 212 213 if (_sURL.getLength() != 0) 214 return ( DirectoryItem::get( _sURL, aDirItem ) == DirectoryItem::E_None ); 215 216 return sal_False; 217 } 218 219 220 // locate soffice.ini/.rc file 221 static OUString locateIniFile() 222 { 223 OUString aUserDataPath; 224 OUString aSofficeIniFileURL; 225 226 // Retrieve the default file URL for the soffice.ini/rc 227 Bootstrap().getIniName( aSofficeIniFileURL ); 228 229 if ( utl::Bootstrap::locateUserData( aUserDataPath ) == utl::Bootstrap::PATH_EXISTS ) 230 { 231 const char CONFIG_DIR[] = "/config"; 232 233 sal_Int32 nIndex = aSofficeIniFileURL.lastIndexOf( '/'); 234 if ( nIndex > 0 ) 235 { 236 OUString aUserSofficeIniFileURL; 237 OUStringBuffer aBuffer( aUserDataPath ); 238 aBuffer.appendAscii( CONFIG_DIR ); 239 aBuffer.append( aSofficeIniFileURL.copy( nIndex )); 240 aUserSofficeIniFileURL = aBuffer.makeStringAndClear(); 241 242 if ( existsURL( aUserSofficeIniFileURL )) 243 return aUserSofficeIniFileURL; 244 } 245 } 246 // Fallback try to use the soffice.ini/rc from program folder 247 return aSofficeIniFileURL; 248 } 249 250 // check whether the OEMPreload flag was set in soffice.ini/.rc 251 sal_Bool OEMPreloadJob::checkOEMPreloadFlag() 252 { 253 OUString aSofficeIniFileURL; 254 aSofficeIniFileURL = locateIniFile(); 255 Config aConfig(aSofficeIniFileURL); 256 aConfig.SetGroup( OEM_PRELOAD_SECTION ); 257 ByteString sResult = aConfig.ReadKey( OEM_PRELOAD ); 258 if ( sResult == STR_TRUE ) 259 return sal_True; 260 else 261 return sal_False; 262 } 263 264 void OEMPreloadJob::disableOEMPreloadFlag() 265 { 266 OUString aSofficeIniFileURL = locateIniFile(); 267 if ( aSofficeIniFileURL.getLength() > 0 ) 268 { 269 Config aConfig(aSofficeIniFileURL); 270 aConfig.SetGroup( OEM_PRELOAD_SECTION ); 271 aConfig.WriteKey( OEM_PRELOAD, STR_FALSE ); 272 aConfig.Flush(); 273 } 274 } 275 276 } // namespace desktop 277