xref: /AOO41X/main/framework/source/services/license.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_framework.hxx"
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir //_________________________________________________________________________________________________________________
32*cdf0e10cSrcweir //	my own includes
33*cdf0e10cSrcweir //_________________________________________________________________________________________________________________
34*cdf0e10cSrcweir #include <services/license.hxx>
35*cdf0e10cSrcweir #include <threadhelp/resetableguard.hxx>
36*cdf0e10cSrcweir #include <macros/debug.hxx>
37*cdf0e10cSrcweir #include <services.h>
38*cdf0e10cSrcweir 
39*cdf0e10cSrcweir // local header for UI implementation
40*cdf0e10cSrcweir #include "services/licensedlg.hxx"
41*cdf0e10cSrcweir #include "classes/resource.hrc"
42*cdf0e10cSrcweir 
43*cdf0e10cSrcweir //_________________________________________________________________________________________________________________
44*cdf0e10cSrcweir //	interface includes
45*cdf0e10cSrcweir //_________________________________________________________________________________________________________________
46*cdf0e10cSrcweir 
47*cdf0e10cSrcweir #include <com/sun/star/frame/XDesktop.hpp>
48*cdf0e10cSrcweir #include <com/sun/star/lang/XInitialization.hpp>
49*cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp>
50*cdf0e10cSrcweir #include <com/sun/star/uno/Any.hxx>
51*cdf0e10cSrcweir #include <com/sun/star/util/XChangesBatch.hpp>
52*cdf0e10cSrcweir #include <com/sun/star/beans/NamedValue.hpp>
53*cdf0e10cSrcweir #include <com/sun/star/lang/XComponent.hpp>
54*cdf0e10cSrcweir 
55*cdf0e10cSrcweir 
56*cdf0e10cSrcweir //_________________________________________________________________________________________________________________
57*cdf0e10cSrcweir //	includes of other projects
58*cdf0e10cSrcweir //_________________________________________________________________________________________________________________
59*cdf0e10cSrcweir 
60*cdf0e10cSrcweir #include <rtl/ustrbuf.hxx>
61*cdf0e10cSrcweir #include <rtl/strbuf.hxx>
62*cdf0e10cSrcweir #include <rtl/ustring.hxx>
63*cdf0e10cSrcweir #include <rtl/string.hxx>
64*cdf0e10cSrcweir #include <unotools/bootstrap.hxx>
65*cdf0e10cSrcweir #include <osl/file.hxx>
66*cdf0e10cSrcweir #include <svtools/xtextedt.hxx>
67*cdf0e10cSrcweir #include <vcl/svapp.hxx>
68*cdf0e10cSrcweir #include <comphelper/processfactory.hxx>
69*cdf0e10cSrcweir #include <tools/date.hxx>
70*cdf0e10cSrcweir #include <tools/time.hxx>
71*cdf0e10cSrcweir #include <tools/datetime.hxx>
72*cdf0e10cSrcweir #include <osl/file.hxx>
73*cdf0e10cSrcweir #include <osl/time.h>
74*cdf0e10cSrcweir 
75*cdf0e10cSrcweir //_________________________________________________________________________________________________________________
76*cdf0e10cSrcweir //	namespace
77*cdf0e10cSrcweir //_________________________________________________________________________________________________________________
78*cdf0e10cSrcweir 
79*cdf0e10cSrcweir namespace framework{
80*cdf0e10cSrcweir using namespace utl;
81*cdf0e10cSrcweir using namespace ::osl							;
82*cdf0e10cSrcweir using namespace ::cppu							;
83*cdf0e10cSrcweir using namespace ::com::sun::star::uno			;
84*cdf0e10cSrcweir using namespace ::com::sun::star::beans			;
85*cdf0e10cSrcweir using namespace ::com::sun::star::lang			;
86*cdf0e10cSrcweir using namespace ::com::sun::star::util			;
87*cdf0e10cSrcweir using namespace ::com::sun::star::frame 		;
88*cdf0e10cSrcweir 
89*cdf0e10cSrcweir //_________________________________________________________________________________________________________________
90*cdf0e10cSrcweir //	non exported const
91*cdf0e10cSrcweir //_________________________________________________________________________________________________________________
92*cdf0e10cSrcweir 
93*cdf0e10cSrcweir // license file name
94*cdf0e10cSrcweir static const char *szLicensePath = "/share/readme";
95*cdf0e10cSrcweir #ifdef UNX
96*cdf0e10cSrcweir static const char *szUNXLicenseName = "/LICENSE";
97*cdf0e10cSrcweir static const char *szUNXLicenseExt = "";
98*cdf0e10cSrcweir #elif defined(WNT) || defined(OS2)
99*cdf0e10cSrcweir static const char *szWNTLicenseName = "/license";
100*cdf0e10cSrcweir static const char *szWNTLicenseExt = ".txt";
101*cdf0e10cSrcweir #endif
102*cdf0e10cSrcweir 
103*cdf0e10cSrcweir //_________________________________________________________________________________________________________________
104*cdf0e10cSrcweir //	non exported definitions
105*cdf0e10cSrcweir //_________________________________________________________________________________________________________________
106*cdf0e10cSrcweir 
107*cdf0e10cSrcweir //_________________________________________________________________________________________________________________
108*cdf0e10cSrcweir //	declarations
109*cdf0e10cSrcweir //_________________________________________________________________________________________________________________
110*cdf0e10cSrcweir 
111*cdf0e10cSrcweir //*****************************************************************************************************************
112*cdf0e10cSrcweir //	constructor
113*cdf0e10cSrcweir //*****************************************************************************************************************
114*cdf0e10cSrcweir License::License( const Reference< XMultiServiceFactory >& xFactory )
115*cdf0e10cSrcweir 		//	Init baseclasses first
116*cdf0e10cSrcweir 		//	Attention:
117*cdf0e10cSrcweir 		//		Don't change order of initialization!
118*cdf0e10cSrcweir 		//      ThreadHelpBase is a struct with a mutex as member. We can't use a mutex as member, while
119*cdf0e10cSrcweir 		//		we must garant right initialization and a valid value of this! First initialize
120*cdf0e10cSrcweir 		//		baseclasses and then members. And we need the mutex for other baseclasses !!!
121*cdf0e10cSrcweir         :   ThreadHelpBase  ( &Application::GetSolarMutex() )
122*cdf0e10cSrcweir         ,   OWeakObject     (                               )
123*cdf0e10cSrcweir 		// Init member
124*cdf0e10cSrcweir         ,   m_xFactory      ( xFactory                      )
125*cdf0e10cSrcweir         ,   m_bTerminate    ( sal_False                     )
126*cdf0e10cSrcweir {
127*cdf0e10cSrcweir }
128*cdf0e10cSrcweir 
129*cdf0e10cSrcweir //*****************************************************************************************************************
130*cdf0e10cSrcweir //	destructor
131*cdf0e10cSrcweir //*****************************************************************************************************************
132*cdf0e10cSrcweir License::~License()
133*cdf0e10cSrcweir {
134*cdf0e10cSrcweir }
135*cdf0e10cSrcweir 
136*cdf0e10cSrcweir //*****************************************************************************************************************
137*cdf0e10cSrcweir //	XInterface, XTypeProvider, XServiceInfo
138*cdf0e10cSrcweir //*****************************************************************************************************************
139*cdf0e10cSrcweir 
140*cdf0e10cSrcweir DEFINE_XINTERFACE_4					(	License						   ,
141*cdf0e10cSrcweir 										OWeakObject					   ,
142*cdf0e10cSrcweir 										DIRECT_INTERFACE(XTypeProvider ),
143*cdf0e10cSrcweir 										DIRECT_INTERFACE(XServiceInfo  ),
144*cdf0e10cSrcweir 										DIRECT_INTERFACE(XJob	       ),
145*cdf0e10cSrcweir                                         DIRECT_INTERFACE(XCloseable    )
146*cdf0e10cSrcweir 									)
147*cdf0e10cSrcweir 
148*cdf0e10cSrcweir DEFINE_XTYPEPROVIDER_4				(	License	,
149*cdf0e10cSrcweir 										XTypeProvider	,
150*cdf0e10cSrcweir 										XServiceInfo	,
151*cdf0e10cSrcweir 										XJob            ,
152*cdf0e10cSrcweir                                         XCloseable
153*cdf0e10cSrcweir 									)
154*cdf0e10cSrcweir 
155*cdf0e10cSrcweir DEFINE_XSERVICEINFO_MULTISERVICE	(	License,
156*cdf0e10cSrcweir                                         OWeakObject                 ,
157*cdf0e10cSrcweir 										SERVICENAME_LICENSE			,
158*cdf0e10cSrcweir 										IMPLEMENTATIONNAME_LICENSE
159*cdf0e10cSrcweir 									)
160*cdf0e10cSrcweir 
161*cdf0e10cSrcweir DEFINE_INIT_SERVICE                 (   License,
162*cdf0e10cSrcweir                                         {
163*cdf0e10cSrcweir                                         }
164*cdf0e10cSrcweir                                     )
165*cdf0e10cSrcweir 
166*cdf0e10cSrcweir 
167*cdf0e10cSrcweir #if 0
168*cdf0e10cSrcweir IMPL_STATIC_LINK_NOINSTANCE( License, Terminate, void*, EMPTYARG )
169*cdf0e10cSrcweir {
170*cdf0e10cSrcweir     /*
171*cdf0e10cSrcweir     Reference< XMultiServiceFactory > xFactory = comphelper::getProcessServiceFactory();
172*cdf0e10cSrcweir     Reference< XDesktop > xDesktop(xFactory->createInstance(
173*cdf0e10cSrcweir         ::rtl::OUString::createFromAscii("com.sun.star.frame.Desktop")), UNO_QUERY);
174*cdf0e10cSrcweir     if (xDesktop.is())
175*cdf0e10cSrcweir         xDesktop->terminate();
176*cdf0e10cSrcweir     */
177*cdf0e10cSrcweir     /*
178*cdf0e10cSrcweir     _exit(0);
179*cdf0e10cSrcweir     */
180*cdf0e10cSrcweir 	return 0;
181*cdf0e10cSrcweir }
182*cdf0e10cSrcweir #endif
183*cdf0e10cSrcweir 
184*cdf0e10cSrcweir static DateTime _oslDateTimeToDateTime(const oslDateTime& aDateTime)
185*cdf0e10cSrcweir {
186*cdf0e10cSrcweir     return DateTime(
187*cdf0e10cSrcweir         Date(aDateTime.Day, aDateTime.Month, aDateTime.Year),
188*cdf0e10cSrcweir         Time(aDateTime.Hours, aDateTime.Minutes, aDateTime.Seconds));
189*cdf0e10cSrcweir }
190*cdf0e10cSrcweir 
191*cdf0e10cSrcweir static ::rtl::OUString _makeDateTimeString (const DateTime& aDateTime, sal_Bool bUTC = sal_False)
192*cdf0e10cSrcweir {
193*cdf0e10cSrcweir     ::rtl::OStringBuffer aDateTimeString;
194*cdf0e10cSrcweir     aDateTimeString.append((sal_Int32)aDateTime.GetYear());
195*cdf0e10cSrcweir     aDateTimeString.append("-");
196*cdf0e10cSrcweir     if (aDateTime.GetMonth()<10) aDateTimeString.append("0");
197*cdf0e10cSrcweir     aDateTimeString.append((sal_Int32)aDateTime.GetMonth());
198*cdf0e10cSrcweir     aDateTimeString.append("-");
199*cdf0e10cSrcweir     if (aDateTime.GetDay()<10) aDateTimeString.append("0");
200*cdf0e10cSrcweir     aDateTimeString.append((sal_Int32)aDateTime.GetDay());
201*cdf0e10cSrcweir     aDateTimeString.append("T");
202*cdf0e10cSrcweir     if (aDateTime.GetHour()<10) aDateTimeString.append("0");
203*cdf0e10cSrcweir     aDateTimeString.append((sal_Int32)aDateTime.GetHour());
204*cdf0e10cSrcweir     aDateTimeString.append(":");
205*cdf0e10cSrcweir     if (aDateTime.GetMin()<10) aDateTimeString.append("0");
206*cdf0e10cSrcweir     aDateTimeString.append((sal_Int32)aDateTime.GetMin());
207*cdf0e10cSrcweir     aDateTimeString.append(":");
208*cdf0e10cSrcweir     if (aDateTime.GetSec()<10) aDateTimeString.append("0");
209*cdf0e10cSrcweir     aDateTimeString.append((sal_Int32)aDateTime.GetSec());
210*cdf0e10cSrcweir     if (bUTC) aDateTimeString.append("Z");
211*cdf0e10cSrcweir 
212*cdf0e10cSrcweir     return OStringToOUString(aDateTimeString.makeStringAndClear(), RTL_TEXTENCODING_ASCII_US);
213*cdf0e10cSrcweir }
214*cdf0e10cSrcweir 
215*cdf0e10cSrcweir static sal_Bool _parseDateTime(const ::rtl::OUString& aString, DateTime& aDateTime)
216*cdf0e10cSrcweir {
217*cdf0e10cSrcweir     // take apart a canonical literal xsd:dateTime string
218*cdf0e10cSrcweir     //CCYY-MM-DDThh:mm:ss(Z)
219*cdf0e10cSrcweir 
220*cdf0e10cSrcweir     ::rtl::OUString aDateTimeString = aString.trim();
221*cdf0e10cSrcweir 
222*cdf0e10cSrcweir     // check length
223*cdf0e10cSrcweir     if (aDateTimeString.getLength() < 19 || aDateTimeString.getLength() > 20)
224*cdf0e10cSrcweir         return sal_False;
225*cdf0e10cSrcweir 
226*cdf0e10cSrcweir     sal_Int32 nDateLength = 10;
227*cdf0e10cSrcweir     sal_Int32 nTimeLength = 8;
228*cdf0e10cSrcweir 
229*cdf0e10cSrcweir     ::rtl::OUString aDateTimeSep = ::rtl::OUString::createFromAscii("T");
230*cdf0e10cSrcweir     ::rtl::OUString aDateSep = ::rtl::OUString::createFromAscii("-");
231*cdf0e10cSrcweir     ::rtl::OUString aTimeSep = ::rtl::OUString::createFromAscii(":");
232*cdf0e10cSrcweir     ::rtl::OUString aUTCString = ::rtl::OUString::createFromAscii("Z");
233*cdf0e10cSrcweir 
234*cdf0e10cSrcweir     ::rtl::OUString aDateString = aDateTimeString.copy(0, nDateLength);
235*cdf0e10cSrcweir     ::rtl::OUString aTimeString = aDateTimeString.copy(nDateLength+1, nTimeLength);
236*cdf0e10cSrcweir 
237*cdf0e10cSrcweir     sal_Int32 nIndex = 0;
238*cdf0e10cSrcweir     sal_Int32 nYear = aDateString.getToken(0, '-', nIndex).toInt32();
239*cdf0e10cSrcweir     sal_Int32 nMonth = aDateString.getToken(0, '-', nIndex).toInt32();
240*cdf0e10cSrcweir     sal_Int32 nDay = aDateString.getToken(0, '-', nIndex).toInt32();
241*cdf0e10cSrcweir     nIndex = 0;
242*cdf0e10cSrcweir     sal_Int32 nHour = aTimeString.getToken(0, ':', nIndex).toInt32();
243*cdf0e10cSrcweir     sal_Int32 nMinute = aTimeString.getToken(0, ':', nIndex).toInt32();
244*cdf0e10cSrcweir     sal_Int32 nSecond = aTimeString.getToken(0, ':', nIndex).toInt32();
245*cdf0e10cSrcweir 
246*cdf0e10cSrcweir     Date tmpDate((sal_uInt16)nDay, (sal_uInt16)nMonth, (sal_uInt16)nYear);
247*cdf0e10cSrcweir     Time tmpTime(nHour, nMinute, nSecond);
248*cdf0e10cSrcweir     DateTime tmpDateTime(tmpDate, tmpTime);
249*cdf0e10cSrcweir     if (aString.indexOf(aUTCString) < 0)
250*cdf0e10cSrcweir         tmpDateTime.ConvertToUTC();
251*cdf0e10cSrcweir 
252*cdf0e10cSrcweir     aDateTime = tmpDateTime;
253*cdf0e10cSrcweir     return sal_True;
254*cdf0e10cSrcweir }
255*cdf0e10cSrcweir 
256*cdf0e10cSrcweir static ::rtl::OUString _getCurrentDateString()
257*cdf0e10cSrcweir {
258*cdf0e10cSrcweir     ::rtl::OUString aString;
259*cdf0e10cSrcweir     return _makeDateTimeString(DateTime());
260*cdf0e10cSrcweir }
261*cdf0e10cSrcweir 
262*cdf0e10cSrcweir // execution of license check...
263*cdf0e10cSrcweir css::uno::Any SAL_CALL License::execute(const css::uno::Sequence< css::beans::NamedValue >& )
264*cdf0e10cSrcweir     throw( css::lang::IllegalArgumentException, css::uno::Exception)
265*cdf0e10cSrcweir {
266*cdf0e10cSrcweir     // return value
267*cdf0e10cSrcweir     Any aRet; aRet <<= sal_False;
268*cdf0e10cSrcweir 
269*cdf0e10cSrcweir     try
270*cdf0e10cSrcweir     {
271*cdf0e10cSrcweir         ::rtl::OUString aBaseInstallPath;
272*cdf0e10cSrcweir         Bootstrap::PathStatus aBaseLocateResult =
273*cdf0e10cSrcweir             Bootstrap::locateBaseInstallation(aBaseInstallPath);
274*cdf0e10cSrcweir         if (aBaseLocateResult != Bootstrap::PATH_EXISTS)
275*cdf0e10cSrcweir         {
276*cdf0e10cSrcweir             // base install noit found
277*cdf0e10cSrcweir             // prepare termination
278*cdf0e10cSrcweir             // m_bTerminate = sal_True;
279*cdf0e10cSrcweir             // Application::PostUserEvent( STATIC_LINK( 0, License, Terminate ) );
280*cdf0e10cSrcweir             aRet <<= sal_False;
281*cdf0e10cSrcweir             return aRet;
282*cdf0e10cSrcweir         }
283*cdf0e10cSrcweir         // determine the filename of the license to show
284*cdf0e10cSrcweir 	    ::rtl::OUString  aLangString;
285*cdf0e10cSrcweir         ::com::sun::star::lang::Locale aLocale;
286*cdf0e10cSrcweir         ::rtl::OString aMgrName = ::rtl::OString("fwe");
287*cdf0e10cSrcweir         AllSettings aSettings(Application::GetSettings());
288*cdf0e10cSrcweir         aLocale = aSettings.GetUILocale();
289*cdf0e10cSrcweir         ResMgr* pResMgr = ResMgr::SearchCreateResMgr(aMgrName, aLocale);
290*cdf0e10cSrcweir 
291*cdf0e10cSrcweir         aLangString = aLocale.Language;
292*cdf0e10cSrcweir         if ( aLocale.Country.getLength() != 0 )
293*cdf0e10cSrcweir         {
294*cdf0e10cSrcweir             aLangString += ::rtl::OUString::createFromAscii("-");
295*cdf0e10cSrcweir             aLangString += aLocale.Country;
296*cdf0e10cSrcweir 	        if ( aLocale.Variant.getLength() != 0 )
297*cdf0e10cSrcweir             {
298*cdf0e10cSrcweir 	            aLangString += ::rtl::OUString::createFromAscii("-");
299*cdf0e10cSrcweir 	            aLangString += aLocale.Variant;
300*cdf0e10cSrcweir             }
301*cdf0e10cSrcweir         }
302*cdf0e10cSrcweir #if defined(WNT) || defined(OS2)
303*cdf0e10cSrcweir         ::rtl::OUString aLicensePath =
304*cdf0e10cSrcweir             aBaseInstallPath + ::rtl::OUString::createFromAscii(szLicensePath)
305*cdf0e10cSrcweir             + ::rtl::OUString::createFromAscii(szWNTLicenseName)
306*cdf0e10cSrcweir             + ::rtl::OUString::createFromAscii("_")
307*cdf0e10cSrcweir             + aLangString
308*cdf0e10cSrcweir             + ::rtl::OUString::createFromAscii(szWNTLicenseExt);
309*cdf0e10cSrcweir #else
310*cdf0e10cSrcweir         ::rtl::OUString aLicensePath =
311*cdf0e10cSrcweir             aBaseInstallPath + ::rtl::OUString::createFromAscii(szLicensePath)
312*cdf0e10cSrcweir             + ::rtl::OUString::createFromAscii(szUNXLicenseName)
313*cdf0e10cSrcweir             + ::rtl::OUString::createFromAscii("_")
314*cdf0e10cSrcweir             + aLangString
315*cdf0e10cSrcweir             + ::rtl::OUString::createFromAscii(szUNXLicenseExt);
316*cdf0e10cSrcweir #endif
317*cdf0e10cSrcweir         // check if we need to show the license at all
318*cdf0e10cSrcweir         // open org.openoffice.Setup/Office/ooLicenseAcceptDate
319*cdf0e10cSrcweir         ::rtl::OUString sConfigSrvc = SERVICENAME_CFGPROVIDER;
320*cdf0e10cSrcweir         ::rtl::OUString sAccessSrvc = ::rtl::OUString::createFromAscii("com.sun.star.configuration.ConfigurationUpdateAccess");
321*cdf0e10cSrcweir         ::rtl::OUString sReadSrvc   = SERVICENAME_CFGREADACCESS;
322*cdf0e10cSrcweir 
323*cdf0e10cSrcweir         // get configuration provider
324*cdf0e10cSrcweir         Reference< XMultiServiceFactory > theConfigProvider = Reference< XMultiServiceFactory >(
325*cdf0e10cSrcweir         m_xFactory->createInstance(sConfigSrvc), UNO_QUERY_THROW);
326*cdf0e10cSrcweir         Sequence< Any > theArgs(1);
327*cdf0e10cSrcweir         NamedValue v;
328*cdf0e10cSrcweir         v.Name = ::rtl::OUString::createFromAscii("NodePath");
329*cdf0e10cSrcweir         v.Value <<= ::rtl::OUString::createFromAscii("org.openoffice.Setup/Office");
330*cdf0e10cSrcweir         theArgs[0] <<= v;
331*cdf0e10cSrcweir         Reference< XPropertySet > pset = Reference< XPropertySet >(
332*cdf0e10cSrcweir             theConfigProvider->createInstanceWithArguments(sAccessSrvc, theArgs), UNO_QUERY_THROW);
333*cdf0e10cSrcweir 
334*cdf0e10cSrcweir         // if we find a date there, compare it to baseinstall license date
335*cdf0e10cSrcweir         ::rtl::OUString aAcceptDate;
336*cdf0e10cSrcweir         if (pset->getPropertyValue(::rtl::OUString::createFromAscii("ooLicenseAcceptDate")) >>= aAcceptDate)
337*cdf0e10cSrcweir         {
338*cdf0e10cSrcweir             // get LicenseFileDate from base install
339*cdf0e10cSrcweir             ::rtl::OUString aLicenseURL = aLicensePath;
340*cdf0e10cSrcweir             /*
341*cdf0e10cSrcweir             if (FileBase::getFileURLFromSystemPath(aLicensePath, aLicenseURL) != FileBase::E_None)
342*cdf0e10cSrcweir                 return makeAny(sal_False);
343*cdf0e10cSrcweir                 */
344*cdf0e10cSrcweir             DirectoryItem aDirItem;
345*cdf0e10cSrcweir             if (DirectoryItem::get(aLicenseURL, aDirItem) != FileBase::E_None)
346*cdf0e10cSrcweir                 return makeAny(sal_False);
347*cdf0e10cSrcweir             FileStatus aStatus(FileStatusMask_All);
348*cdf0e10cSrcweir             if (aDirItem.getFileStatus(aStatus) != FileBase::E_None)
349*cdf0e10cSrcweir                 return makeAny(sal_False);
350*cdf0e10cSrcweir             TimeValue aTimeVal = aStatus.getModifyTime();
351*cdf0e10cSrcweir             oslDateTime aDateTimeVal;
352*cdf0e10cSrcweir             if (!osl_getDateTimeFromTimeValue(&aTimeVal, &aDateTimeVal))
353*cdf0e10cSrcweir                 return makeAny(sal_False);
354*cdf0e10cSrcweir 
355*cdf0e10cSrcweir             // compare dates
356*cdf0e10cSrcweir             DateTime aLicenseDateTime = _oslDateTimeToDateTime(aDateTimeVal);
357*cdf0e10cSrcweir             DateTime aAcceptDateTime;
358*cdf0e10cSrcweir             if (!_parseDateTime(aAcceptDate, aAcceptDateTime))
359*cdf0e10cSrcweir                 return makeAny(sal_False);
360*cdf0e10cSrcweir 
361*cdf0e10cSrcweir             if ( aAcceptDateTime > aLicenseDateTime )
362*cdf0e10cSrcweir                 return makeAny(sal_True);
363*cdf0e10cSrcweir         }
364*cdf0e10cSrcweir         // prepare to show
365*cdf0e10cSrcweir         // display license dialog
366*cdf0e10cSrcweir         LicenseDialog* pDialog = new LicenseDialog(aLicensePath, pResMgr);
367*cdf0e10cSrcweir         sal_Bool bAgreed = (pDialog->Execute() == 1);
368*cdf0e10cSrcweir         delete pDialog;
369*cdf0e10cSrcweir 
370*cdf0e10cSrcweir         if (bAgreed) {
371*cdf0e10cSrcweir 
372*cdf0e10cSrcweir             // write org.openoffice.Setup/ooLicenseAcceptDate
373*cdf0e10cSrcweir             aAcceptDate = _getCurrentDateString();
374*cdf0e10cSrcweir             pset->setPropertyValue(::rtl::OUString::createFromAscii("ooLicenseAcceptDate"), makeAny(aAcceptDate));
375*cdf0e10cSrcweir             Reference< XChangesBatch >(pset, UNO_QUERY_THROW)->commitChanges();
376*cdf0e10cSrcweir 
377*cdf0e10cSrcweir             // enable quickstarter
378*cdf0e10cSrcweir             sal_Bool bQuickstart( sal_True );
379*cdf0e10cSrcweir             sal_Bool bAutostart( sal_True );
380*cdf0e10cSrcweir             Sequence< Any > aSeq( 2 );
381*cdf0e10cSrcweir             aSeq[0] <<= bQuickstart;
382*cdf0e10cSrcweir             aSeq[1] <<= bAutostart;
383*cdf0e10cSrcweir 
384*cdf0e10cSrcweir             Reference < XInitialization > xQuickstart( ::comphelper::getProcessServiceFactory()->createInstance(
385*cdf0e10cSrcweir                 ::rtl::OUString::createFromAscii( "com.sun.star.office.Quickstart" )),UNO_QUERY );
386*cdf0e10cSrcweir             if ( xQuickstart.is() )
387*cdf0e10cSrcweir                 xQuickstart->initialize( aSeq );
388*cdf0e10cSrcweir 
389*cdf0e10cSrcweir             aRet <<= sal_True;
390*cdf0e10cSrcweir         }
391*cdf0e10cSrcweir         else
392*cdf0e10cSrcweir         {
393*cdf0e10cSrcweir             // license was not accepted
394*cdf0e10cSrcweir             // prepare termination
395*cdf0e10cSrcweir             // m_bTerminate = sal_True;
396*cdf0e10cSrcweir             // Application::PostUserEvent( STATIC_LINK( 0, License, Terminate ) );
397*cdf0e10cSrcweir             aRet <<= sal_False;
398*cdf0e10cSrcweir         }
399*cdf0e10cSrcweir     }
400*cdf0e10cSrcweir     catch (RuntimeException&)
401*cdf0e10cSrcweir     {
402*cdf0e10cSrcweir         // license could not be verified
403*cdf0e10cSrcweir         aRet <<= sal_False;
404*cdf0e10cSrcweir     }
405*cdf0e10cSrcweir     return aRet;
406*cdf0e10cSrcweir }
407*cdf0e10cSrcweir 
408*cdf0e10cSrcweir void SAL_CALL License::close(sal_Bool /*bDeliverOwnership*/) throw (css::util::CloseVetoException)
409*cdf0e10cSrcweir {
410*cdf0e10cSrcweir     if (!m_bTerminate)
411*cdf0e10cSrcweir         throw CloseVetoException();
412*cdf0e10cSrcweir }
413*cdf0e10cSrcweir void SAL_CALL License::addCloseListener(const css::uno::Reference< css::util::XCloseListener >&)
414*cdf0e10cSrcweir     throw (css::uno::RuntimeException)
415*cdf0e10cSrcweir {
416*cdf0e10cSrcweir }
417*cdf0e10cSrcweir void SAL_CALL License::removeCloseListener(const css::uno::Reference< css::util::XCloseListener >&)
418*cdf0e10cSrcweir     throw (css::uno::RuntimeException)
419*cdf0e10cSrcweir {
420*cdf0e10cSrcweir }
421*cdf0e10cSrcweir 
422*cdf0e10cSrcweir 
423*cdf0e10cSrcweir //************************************************************************
424*cdf0e10cSrcweir //   License Dialog
425*cdf0e10cSrcweir //************************************************************************
426*cdf0e10cSrcweir 
427*cdf0e10cSrcweir LicenseDialog::LicenseDialog(const ::rtl::OUString & aLicensePath, ResMgr *pResMgr) :
428*cdf0e10cSrcweir     ModalDialog(NULL, ResId(DLG_LICENSE, *pResMgr)),
429*cdf0e10cSrcweir     aLicenseML(this, ResId(ML_LICENSE, *pResMgr)),
430*cdf0e10cSrcweir     aInfo1FT(this, ResId(FT_INFO1, *pResMgr)),
431*cdf0e10cSrcweir     aInfo2FT(this, ResId(FT_INFO2, *pResMgr)),
432*cdf0e10cSrcweir     aInfo3FT(this, ResId(FT_INFO3, *pResMgr)),
433*cdf0e10cSrcweir     aInfo2_1FT(this, ResId(FT_INFO2_1, *pResMgr)),
434*cdf0e10cSrcweir     aInfo3_1FT(this, ResId(FT_INFO3_1, *pResMgr)),
435*cdf0e10cSrcweir     aFixedLine(this, ResId(FL_DIVIDE, *pResMgr)),
436*cdf0e10cSrcweir     aPBPageDown(this, ResId(PB_PAGEDOWN, *pResMgr)),
437*cdf0e10cSrcweir     aPBDecline( this, ResId(PB_DECLINE, *pResMgr) ),
438*cdf0e10cSrcweir     aPBAccept( this, ResId(PB_ACCEPT, *pResMgr) ),
439*cdf0e10cSrcweir     aArrow(this, ResId(IMG_ARROW, *pResMgr)),
440*cdf0e10cSrcweir     aStrAccept( ResId(LICENSE_ACCEPT, *pResMgr) ),
441*cdf0e10cSrcweir     aStrNotAccept( ResId(LICENSE_NOTACCEPT, *pResMgr) ),
442*cdf0e10cSrcweir     bEndReached(sal_False)
443*cdf0e10cSrcweir {
444*cdf0e10cSrcweir     FreeResource();
445*cdf0e10cSrcweir 
446*cdf0e10cSrcweir     aLicenseML.SetEndReachedHdl( LINK(this, LicenseDialog, EndReachedHdl) );
447*cdf0e10cSrcweir     aLicenseML.SetScrolledHdl( LINK(this, LicenseDialog, ScrolledHdl) );
448*cdf0e10cSrcweir 
449*cdf0e10cSrcweir     aPBPageDown.SetClickHdl( LINK(this, LicenseDialog, PageDownHdl) );
450*cdf0e10cSrcweir     aPBDecline.SetClickHdl( LINK(this, LicenseDialog, DeclineBtnHdl) );
451*cdf0e10cSrcweir     aPBAccept.SetClickHdl( LINK(this, LicenseDialog, AcceptBtnHdl) );
452*cdf0e10cSrcweir 
453*cdf0e10cSrcweir     // We want a automatic repeating page down button
454*cdf0e10cSrcweir     WinBits aStyle = aPBPageDown.GetStyle();
455*cdf0e10cSrcweir     aStyle |= WB_REPEAT;
456*cdf0e10cSrcweir     aPBPageDown.SetStyle( aStyle );
457*cdf0e10cSrcweir 
458*cdf0e10cSrcweir     String aText = aInfo2FT.GetText();
459*cdf0e10cSrcweir     aText.SearchAndReplaceAll( UniString::CreateFromAscii("%PAGEDOWN"), aPBPageDown.GetText() );
460*cdf0e10cSrcweir     aInfo2FT.SetText( aText );
461*cdf0e10cSrcweir 
462*cdf0e10cSrcweir     aPBDecline.SetText( aStrNotAccept );
463*cdf0e10cSrcweir     aPBAccept.SetText( aStrAccept );
464*cdf0e10cSrcweir 
465*cdf0e10cSrcweir     aPBAccept.Disable();
466*cdf0e10cSrcweir 
467*cdf0e10cSrcweir     // load license text
468*cdf0e10cSrcweir     File aLicenseFile(aLicensePath);
469*cdf0e10cSrcweir     if ( aLicenseFile.open(OpenFlag_Read) == FileBase::E_None)
470*cdf0e10cSrcweir     {
471*cdf0e10cSrcweir         DirectoryItem d;
472*cdf0e10cSrcweir         DirectoryItem::get(aLicensePath, d);
473*cdf0e10cSrcweir         FileStatus fs(FileStatusMask_FileSize);
474*cdf0e10cSrcweir         d.getFileStatus(fs);
475*cdf0e10cSrcweir         sal_uInt64 nBytesRead = 0;
476*cdf0e10cSrcweir         sal_uInt64 nPosition = 0;
477*cdf0e10cSrcweir         sal_uInt32 nBytes = (sal_uInt32)fs.getFileSize();
478*cdf0e10cSrcweir         sal_Char *pBuffer = new sal_Char[nBytes];
479*cdf0e10cSrcweir         // FileBase RC r = FileBase::E_None;
480*cdf0e10cSrcweir         while (aLicenseFile.read(pBuffer+nPosition, nBytes-nPosition, nBytesRead) == FileBase::E_None
481*cdf0e10cSrcweir             && nPosition + nBytesRead < nBytes)
482*cdf0e10cSrcweir         {
483*cdf0e10cSrcweir             nPosition += nBytesRead;
484*cdf0e10cSrcweir         }
485*cdf0e10cSrcweir         ::rtl::OUString aLicenseString(pBuffer, nBytes, RTL_TEXTENCODING_UTF8,
486*cdf0e10cSrcweir                 OSTRING_TO_OUSTRING_CVTFLAGS | RTL_TEXTTOUNICODE_FLAGS_GLOBAL_SIGNATURE);
487*cdf0e10cSrcweir         delete[] pBuffer;
488*cdf0e10cSrcweir         aLicenseML.SetText(aLicenseString);
489*cdf0e10cSrcweir     }
490*cdf0e10cSrcweir 
491*cdf0e10cSrcweir }
492*cdf0e10cSrcweir 
493*cdf0e10cSrcweir LicenseDialog::~LicenseDialog()
494*cdf0e10cSrcweir {
495*cdf0e10cSrcweir }
496*cdf0e10cSrcweir 
497*cdf0e10cSrcweir IMPL_LINK( LicenseDialog, PageDownHdl, PushButton *, EMPTYARG )
498*cdf0e10cSrcweir {
499*cdf0e10cSrcweir     aLicenseML.ScrollDown( SCROLL_PAGEDOWN );
500*cdf0e10cSrcweir     return 0;
501*cdf0e10cSrcweir }
502*cdf0e10cSrcweir 
503*cdf0e10cSrcweir IMPL_LINK( LicenseDialog, EndReachedHdl, LicenseView *, EMPTYARG )
504*cdf0e10cSrcweir {
505*cdf0e10cSrcweir     bEndReached = sal_True;
506*cdf0e10cSrcweir 
507*cdf0e10cSrcweir     EnableControls();
508*cdf0e10cSrcweir 
509*cdf0e10cSrcweir     return 0;
510*cdf0e10cSrcweir }
511*cdf0e10cSrcweir 
512*cdf0e10cSrcweir IMPL_LINK( LicenseDialog, ScrolledHdl, LicenseView *, EMPTYARG )
513*cdf0e10cSrcweir {
514*cdf0e10cSrcweir     EnableControls();
515*cdf0e10cSrcweir 
516*cdf0e10cSrcweir     return 0;
517*cdf0e10cSrcweir }
518*cdf0e10cSrcweir 
519*cdf0e10cSrcweir IMPL_LINK( LicenseDialog, DeclineBtnHdl, PushButton *, EMPTYARG )
520*cdf0e10cSrcweir {
521*cdf0e10cSrcweir     EndDialog(0);
522*cdf0e10cSrcweir     return 0;
523*cdf0e10cSrcweir }
524*cdf0e10cSrcweir IMPL_LINK( LicenseDialog, AcceptBtnHdl, PushButton *, EMPTYARG )
525*cdf0e10cSrcweir {
526*cdf0e10cSrcweir     EndDialog(1);
527*cdf0e10cSrcweir     return 0;
528*cdf0e10cSrcweir }
529*cdf0e10cSrcweir 
530*cdf0e10cSrcweir 
531*cdf0e10cSrcweir void LicenseDialog::EnableControls()
532*cdf0e10cSrcweir {
533*cdf0e10cSrcweir     if( !bEndReached &&
534*cdf0e10cSrcweir         ( aLicenseML.IsEndReached() || !aLicenseML.GetText().Len() ) )
535*cdf0e10cSrcweir         bEndReached = sal_True;
536*cdf0e10cSrcweir 
537*cdf0e10cSrcweir     if ( bEndReached )
538*cdf0e10cSrcweir     {
539*cdf0e10cSrcweir         Point aPos( aInfo1FT.GetPosPixel().X(),
540*cdf0e10cSrcweir                 aInfo3_1FT.GetPosPixel().Y() );
541*cdf0e10cSrcweir         aArrow.SetPosPixel( aPos );
542*cdf0e10cSrcweir         aPBAccept.Enable();
543*cdf0e10cSrcweir     }
544*cdf0e10cSrcweir     else
545*cdf0e10cSrcweir     {
546*cdf0e10cSrcweir         Point aPos( aInfo1FT.GetPosPixel().X(),
547*cdf0e10cSrcweir                 aInfo2_1FT.GetPosPixel().Y() );
548*cdf0e10cSrcweir         aArrow.SetPosPixel( aPos );
549*cdf0e10cSrcweir         aPBAccept.Disable();
550*cdf0e10cSrcweir     }
551*cdf0e10cSrcweir 
552*cdf0e10cSrcweir     if ( aLicenseML.IsEndReached() )
553*cdf0e10cSrcweir         aPBPageDown.Disable();
554*cdf0e10cSrcweir     else
555*cdf0e10cSrcweir         aPBPageDown.Enable();
556*cdf0e10cSrcweir 
557*cdf0e10cSrcweir }
558*cdf0e10cSrcweir 
559*cdf0e10cSrcweir 
560*cdf0e10cSrcweir LicenseView::LicenseView( Window* pParent, const ResId& rResId )
561*cdf0e10cSrcweir     : MultiLineEdit( pParent, rResId )
562*cdf0e10cSrcweir {
563*cdf0e10cSrcweir     SetLeftMargin( 5 );
564*cdf0e10cSrcweir 
565*cdf0e10cSrcweir     mbEndReached = IsEndReached();
566*cdf0e10cSrcweir 
567*cdf0e10cSrcweir 	StartListening( *GetTextEngine() );
568*cdf0e10cSrcweir }
569*cdf0e10cSrcweir 
570*cdf0e10cSrcweir LicenseView::~LicenseView()
571*cdf0e10cSrcweir {
572*cdf0e10cSrcweir     maEndReachedHdl = Link();
573*cdf0e10cSrcweir     maScrolledHdl   = Link();
574*cdf0e10cSrcweir 
575*cdf0e10cSrcweir     EndListeningAll();
576*cdf0e10cSrcweir }
577*cdf0e10cSrcweir 
578*cdf0e10cSrcweir void LicenseView::ScrollDown( ScrollType eScroll )
579*cdf0e10cSrcweir {
580*cdf0e10cSrcweir     ScrollBar*  pScroll = GetVScrollBar();
581*cdf0e10cSrcweir 
582*cdf0e10cSrcweir     if ( pScroll )
583*cdf0e10cSrcweir         pScroll->DoScrollAction( eScroll );
584*cdf0e10cSrcweir }
585*cdf0e10cSrcweir 
586*cdf0e10cSrcweir sal_Bool LicenseView::IsEndReached() const
587*cdf0e10cSrcweir {
588*cdf0e10cSrcweir     sal_Bool bEndReached;
589*cdf0e10cSrcweir 
590*cdf0e10cSrcweir     ExtTextView*    pView = GetTextView();
591*cdf0e10cSrcweir     ExtTextEngine*  pEdit = GetTextEngine();
592*cdf0e10cSrcweir     sal_uLong           nHeight = pEdit->GetTextHeight();
593*cdf0e10cSrcweir     Size            aOutSize = pView->GetWindow()->GetOutputSizePixel();
594*cdf0e10cSrcweir     Point           aBottom( 0, aOutSize.Height() );
595*cdf0e10cSrcweir 
596*cdf0e10cSrcweir     if ( (sal_uLong) pView->GetDocPos( aBottom ).Y() >= nHeight - 1 )
597*cdf0e10cSrcweir         bEndReached = sal_True;
598*cdf0e10cSrcweir     else
599*cdf0e10cSrcweir         bEndReached = sal_False;
600*cdf0e10cSrcweir 
601*cdf0e10cSrcweir     return bEndReached;
602*cdf0e10cSrcweir }
603*cdf0e10cSrcweir 
604*cdf0e10cSrcweir void LicenseView::Notify( SfxBroadcaster&, const SfxHint& rHint )
605*cdf0e10cSrcweir {
606*cdf0e10cSrcweir     if ( rHint.IsA( TYPE(TextHint) ) )
607*cdf0e10cSrcweir     {
608*cdf0e10cSrcweir         sal_Bool    bLastVal = EndReached();
609*cdf0e10cSrcweir         sal_uLong   nId = ((const TextHint&)rHint).GetId();
610*cdf0e10cSrcweir 
611*cdf0e10cSrcweir         if ( nId == TEXT_HINT_PARAINSERTED )
612*cdf0e10cSrcweir         {
613*cdf0e10cSrcweir             if ( bLastVal )
614*cdf0e10cSrcweir                 mbEndReached = IsEndReached();
615*cdf0e10cSrcweir         }
616*cdf0e10cSrcweir         else if ( nId == TEXT_HINT_VIEWSCROLLED )
617*cdf0e10cSrcweir         {
618*cdf0e10cSrcweir             if ( ! mbEndReached )
619*cdf0e10cSrcweir                 mbEndReached = IsEndReached();
620*cdf0e10cSrcweir             maScrolledHdl.Call( this );
621*cdf0e10cSrcweir         }
622*cdf0e10cSrcweir 
623*cdf0e10cSrcweir         if ( EndReached() && !bLastVal )
624*cdf0e10cSrcweir         {
625*cdf0e10cSrcweir             maEndReachedHdl.Call( this );
626*cdf0e10cSrcweir         }
627*cdf0e10cSrcweir     }
628*cdf0e10cSrcweir }
629*cdf0e10cSrcweir 
630*cdf0e10cSrcweir }		//	namespace framework
631*cdf0e10cSrcweir 
632