xref: /trunk/main/desktop/source/so_comp/evaluation.cxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_desktop.hxx"
30 
31 #include "evaluation.hxx"
32 #include <com/sun/star/beans/NamedValue.hpp>
33 #include <com/sun/star/registry/XRegistryKey.hpp>
34 #include <com/sun/star/util/Date.hpp>
35 #include <rtl/ustrbuf.hxx>
36 #include <uno/environment.h>
37 #include <cppuhelper/factory.hxx>
38 #include <unotools/configmgr.hxx>
39 #include <vcl/msgbox.hxx>
40 #include <tools/resmgr.hxx>
41 #include <tools/resid.hxx>
42 #include "../app/desktop.hrc"
43 
44 
45 using namespace rtl;
46 using namespace ::com::sun::star::uno;
47 using namespace ::com::sun::star::lang;
48 using namespace ::com::sun::star::beans;
49 using namespace ::com::sun::star::registry;
50 
51 namespace desktop {
52 
53 static SOEvaluation*    pSOEval=0;
54 
55 const char* SOEvaluation::interfaces[] =
56 {
57     "com.sun.star.beans.XExactName",
58     "com.sun.star.beans.XMaterialHolder",
59     "com.sun.star.lang.XComponent",
60     "com.sun.star.lang.XServiceInfo",
61     NULL,
62 };
63 
64 const char* SOEvaluation::implementationName = "com.sun.star.comp.desktop.Evaluation";
65 const char* SOEvaluation::serviceName = "com.sun.star.office.Evaluation";
66 
67 OUString SOEvaluation::GetImplementationName()
68 {
69     return OUString( RTL_CONSTASCII_USTRINGPARAM( implementationName));
70 }
71 
72 Sequence< OUString > SOEvaluation::GetSupportedServiceNames()
73 {
74     sal_Int32 nSize = (sizeof( interfaces ) / sizeof( const char *)) - 1;
75     Sequence< OUString > aResult( nSize );
76 
77     for( sal_Int32 i = 0; i < nSize; i++ )
78         aResult[i] = OUString::createFromAscii( interfaces[i] );
79     return aResult;
80 }
81 
82 Reference< XInterface >  SAL_CALL SOEvaluation::CreateInstance(
83     const Reference< XMultiServiceFactory >& rSMgr )
84 {
85     static osl::Mutex   aMutex;
86     if ( pSOEval == 0 )
87     {
88         osl::MutexGuard guard( aMutex );
89         if ( pSOEval == 0 )
90             return (XComponent*) ( new SOEvaluation( rSMgr ) );
91     }
92     return (XComponent*)0;
93 }
94 
95 SOEvaluation::SOEvaluation( const Reference< XMultiServiceFactory >& xFactory ) :
96     m_aListeners( m_aMutex ),
97     m_xServiceManager( xFactory )
98 {
99 }
100 
101 SOEvaluation::~SOEvaluation()
102 {
103 }
104 
105 // XComponent
106 void SAL_CALL SOEvaluation::dispose() throw ( RuntimeException )
107 {
108     EventObject aObject;
109     aObject.Source = (XComponent*)this;
110     m_aListeners.disposeAndClear( aObject );
111 }
112 
113 void SAL_CALL SOEvaluation::addEventListener( const Reference< XEventListener > & aListener) throw ( RuntimeException )
114 {
115     m_aListeners.addInterface( aListener );
116 }
117 
118 void SAL_CALL SOEvaluation::removeEventListener( const Reference< XEventListener > & aListener ) throw ( RuntimeException )
119 {
120     m_aListeners.removeInterface( aListener );
121 }
122 
123 // XExactName
124 rtl::OUString SAL_CALL SOEvaluation::getExactName( const rtl::OUString& rApproximateName ) throw ( RuntimeException )
125 {
126     // get the tabreg service for an evaluation version
127     // without this service office shouldn't run at all
128     OUString aTitle = rApproximateName;
129     OUString aEval;
130     sal_Bool bExpired = sal_True;
131     Reference < XMaterialHolder > xHolder( m_xServiceManager->createInstance(
132             ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.tab.tabreg" ) ) ), UNO_QUERY );
133     if ( xHolder.is() )
134     {
135         // get a sequence of strings for the defined locales
136         // a registered version doesn't provide data
137         bExpired = sal_False;
138         Any aData = xHolder->getMaterial();
139         Sequence < NamedValue > aSeq;
140         if ( aData >>= aSeq )
141         {
142             // this is an evaluation version, because it provides "material"
143             bExpired = sal_True;
144             for (int i=0; i<aSeq.getLength(); i++ )
145             {
146                 NamedValue& rValue = aSeq[i];
147                 if ( rValue.Name.equalsAscii("expired") )
148                     rValue.Value >>= bExpired;
149                 else if (rValue.Name.equalsAscii("title") )
150                     rValue.Value >>= aEval;
151             }
152             // append eval string to title
153             aTitle += OUString::createFromAscii(" ") + aEval;
154             if ( bExpired )
155                 throw RuntimeException();
156         }
157     }
158 
159     return aTitle;
160 }
161 
162 // XMaterialHolder
163 Any SAL_CALL SOEvaluation::getMaterial() throw( RuntimeException )
164 {
165     // Time bomb implementation. Return empty Any to do nothing or
166     // provide a com::sun::star::util::Date with the time bomb date.
167     Any a;
168 
169     // change here to force recompile 00002
170 #ifdef TIMEBOMB
171     // Code for extracting/providing time bomb date!
172     int nDay   = TIMEBOMB % 100;
173     int nMonth = ( TIMEBOMB % 10000 ) / 100;
174     int nYear  = TIMEBOMB / 10000;
175     com::sun::star::util::Date  aDate( nDay, nMonth, nYear );
176     a <<= aDate;
177 #endif
178     return a;
179 }
180 
181 // XServiceInfo
182 ::rtl::OUString SAL_CALL SOEvaluation::getImplementationName()
183 throw ( RuntimeException )
184 {
185     return SOEvaluation::GetImplementationName();
186 }
187 
188 sal_Bool SAL_CALL SOEvaluation::supportsService( const ::rtl::OUString& rServiceName )
189 throw ( RuntimeException )
190 {
191     sal_Int32 nSize = (sizeof( interfaces ) / sizeof( const char *))-1;
192 
193     for( sal_Int32 i = 0; i < nSize; i++ )
194         if ( rServiceName.equalsAscii( interfaces[i] ))
195             return sal_True;
196     return sal_False;
197 }
198 
199 Sequence< ::rtl::OUString > SAL_CALL SOEvaluation::getSupportedServiceNames()
200 throw ( RuntimeException )
201 {
202     return SOEvaluation::GetSupportedServiceNames();
203 }
204 
205 }
206