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