xref: /aoo42x/main/desktop/source/so_comp/oemjob.cxx (revision 2722cedd)
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 
GetImplementationName()64 OUString OEMPreloadJob::GetImplementationName()
65 {
66 	return OUString( RTL_CONSTASCII_USTRINGPARAM( implementationName));
67 }
68 
GetSupportedServiceNames()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 
CreateInstance(const Reference<XMultiServiceFactory> & rSMgr)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 
OEMPreloadJob(const Reference<XMultiServiceFactory> & xFactory)87 OEMPreloadJob::OEMPreloadJob( const Reference< XMultiServiceFactory >& xFactory ) :
88 	m_aListeners( m_aMutex ),
89 	m_xServiceManager( xFactory )
90 {
91 }
92 
~OEMPreloadJob()93 OEMPreloadJob::~OEMPreloadJob()
94 {
95 }
96 
97 // XComponent
dispose()98 void SAL_CALL OEMPreloadJob::dispose() throw ( RuntimeException )
99 {
100     EventObject aObject;
101     aObject.Source = (XComponent*)this;
102     m_aListeners.disposeAndClear( aObject );
103 }
104 
addEventListener(const Reference<XEventListener> & aListener)105 void SAL_CALL OEMPreloadJob::addEventListener( const Reference< XEventListener > & aListener) throw ( RuntimeException )
106 {
107     m_aListeners.addInterface( aListener );
108 }
109 
removeEventListener(const Reference<XEventListener> & aListener)110 void SAL_CALL OEMPreloadJob::removeEventListener( const Reference< XEventListener > & aListener ) throw ( RuntimeException )
111 {
112     m_aListeners.removeInterface( aListener );
113 }
114 
115 // XServiceInfo
getImplementationName()116 ::rtl::OUString SAL_CALL OEMPreloadJob::getImplementationName()
117 throw ( RuntimeException )
118 {
119 	return OEMPreloadJob::GetImplementationName();
120 }
121 
supportsService(const::rtl::OUString & rServiceName)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 
getSupportedServiceNames()133 Sequence< ::rtl::OUString > SAL_CALL OEMPreloadJob::getSupportedServiceNames()
134 throw ( RuntimeException )
135 {
136 	return OEMPreloadJob::GetSupportedServiceNames();
137 }
138 
139 // XJob
execute(const Sequence<NamedValue> &)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 
existsURL(OUString const & _sURL)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
locateIniFile()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
checkOEMPreloadFlag()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 
disableOEMPreloadFlag()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