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 "pages.hxx"
28 #include "wizard.hrc"
29 #include "wizard.hxx"
30 #include "migration.hxx"
31 #include <vcl/msgbox.hxx>
32 #include <vcl/mnemonic.hxx>
33 #include <vos/security.hxx>
34 #include <app.hxx>
35 #include <rtl/ustring.hxx>
36 #include <osl/file.hxx>
37 #include <unotools/bootstrap.hxx>
38 #include <unotools/configmgr.hxx>
39 #include <unotools/useroptions.hxx>
40 #include <sfx2/basedlgs.hxx>
41 #include <comphelper/processfactory.hxx>
42 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
43 #include <com/sun/star/lang/XInitialization.hpp>
44 #include <com/sun/star/frame/XDesktop.hpp>
45 #include <com/sun/star/beans/XMaterialHolder.hpp>
46 #include <com/sun/star/beans/NamedValue.hpp>
47 #include <com/sun/star/container/XNameReplace.hpp>
48 #include <com/sun/star/task/XJobExecutor.hpp>
49 #include <comphelper/configurationhelper.hxx>
50 #include <rtl/bootstrap.hxx>
51 #include <rtl/ustrbuf.hxx>
52 #include <osl/file.hxx>
53 #include <osl/thread.hxx>
54 #include <unotools/bootstrap.hxx>
55 #include <tools/config.hxx>
56 
57 using namespace rtl;
58 using namespace osl;
59 using namespace utl;
60 using namespace svt;
61 using namespace com::sun::star;
62 using namespace com::sun::star::frame;
63 using namespace com::sun::star::lang;
64 using namespace com::sun::star::util;
65 using namespace com::sun::star::beans;
66 using namespace com::sun::star::uno;
67 using namespace com::sun::star::container;
68 
69 #define UNISTRING(s) rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(s))
70 
71 namespace desktop {
72 
_setBold(FixedText & ft)73 static void _setBold(FixedText& ft)
74 {
75     Font f = ft.GetControlFont();
76     f.SetWeight(WEIGHT_BOLD);
77     ft.SetControlFont(f);
78 }
79 
WelcomePage(svt::OWizardMachine * parent,const ResId & resid,sal_Bool bLicenseNeedsAcceptance)80 WelcomePage::WelcomePage( svt::OWizardMachine* parent, const ResId& resid, sal_Bool bLicenseNeedsAcceptance )
81     : OWizardPage(parent, resid)
82     , m_ftHead(this, WizardResId(FT_WELCOME_HEADER))
83     , m_ftBody(this, WizardResId(FT_WELCOME_BODY))
84     , m_pParent(parent)
85     , m_bLicenseNeedsAcceptance( bLicenseNeedsAcceptance )
86     , bIsEvalVersion(false)
87     , bNoEvalText(false)
88 {
89     FreeResource();
90 
91     _setBold(m_ftHead);
92 
93     checkEval();
94 
95     // check for migration
96     if (Migration::checkMigration())
97     {
98         String aText(WizardResId(STR_WELCOME_MIGRATION));
99         // replace %OLDPRODUCT with found version name
100         aText.SearchAndReplaceAll( UniString::CreateFromAscii("%OLD_VERSION"), Migration::getOldVersionName());
101         m_ftBody.SetText( aText );
102     }
103     else if ( ! m_bLicenseNeedsAcceptance )
104     {
105         String aText(WizardResId(STR_WELCOME_WITHOUT_LICENSE));
106         m_ftBody.SetText( aText );
107     }
108 }
109 
110 
checkEval()111 void WelcomePage::checkEval()
112 {
113     Reference< XMultiServiceFactory > xFactory = ::comphelper::getProcessServiceFactory();
114     Reference< XMaterialHolder > xHolder(xFactory->createInstance(
115         OUString::createFromAscii("com.sun.star.tab.tabreg")), UNO_QUERY);
116     if (xHolder.is()) {
117         Any aData = xHolder->getMaterial();
118         Sequence < NamedValue > aSeq;
119         if (aData >>= aSeq) {
120             bIsEvalVersion = true;
121             for (int i=0; i< aSeq.getLength(); i++) {
122                 if (aSeq[i].Name.equalsAscii("NoEvalText")) {
123                     aSeq[i].Value >>= bNoEvalText;
124                 }
125             }
126         }
127     }
128 }
129 
130 
ActivatePage()131 void WelcomePage::ActivatePage()
132 {
133     OWizardPage::ActivatePage();
134     // this page has no controls, so forwarding to default
135     // button (next) won't work if we grap focus
136     // GrabFocus();
137 }
138 
139 // -------------------------------------------------------------------
140 
141 class MigrationThread : public ::osl::Thread
142 {
143     public:
144         MigrationThread();
145 
146         virtual void SAL_CALL run();
147         virtual void SAL_CALL onTerminated();
148 };
149 
MigrationThread()150 MigrationThread::MigrationThread()
151 {
152 }
153 
run()154 void MigrationThread::run()
155 {
156     try
157     {
158         Migration::doMigration();
159     }
160     catch ( uno::Exception& )
161     {
162     }
163 }
164 
onTerminated()165 void MigrationThread::onTerminated()
166 {
167 }
168 
169 // -------------------------------------------------------------------
170 
MigrationPage(svt::OWizardMachine * parent,const ResId & resid,Throbber & i_throbber)171 MigrationPage::MigrationPage(
172     svt::OWizardMachine* parent,
173     const ResId& resid, Throbber& i_throbber )
174     : OWizardPage(parent, resid)
175     , m_ftHead(this, WizardResId(FT_MIGRATION_HEADER))
176     , m_ftBody(this, WizardResId(FT_MIGRATION_BODY))
177     , m_cbMigration(this, WizardResId(CB_MIGRATION))
178     , m_rThrobber(i_throbber)
179     , m_bMigrationDone(sal_False)
180 {
181     FreeResource();
182     _setBold(m_ftHead);
183 
184     // replace %OLDPRODUCT with found version name
185     String aText = m_ftBody.GetText();
186     aText.SearchAndReplaceAll( UniString::CreateFromAscii("%OLDPRODUCT"), Migration::getOldVersionName());
187     m_ftBody.SetText( aText );
188 }
189 
commitPage(svt::WizardTypes::CommitPageReason _eReason)190 sal_Bool MigrationPage::commitPage( svt::WizardTypes::CommitPageReason _eReason )
191 {
192     if (_eReason == svt::WizardTypes::eTravelForward && m_cbMigration.IsChecked() && !m_bMigrationDone)
193     {
194         GetParent()->EnterWait();
195         FirstStartWizard* pWizard = dynamic_cast< FirstStartWizard* >( GetParent() );
196         if ( pWizard )
197             pWizard->DisableButtonsWhileMigration();
198 
199         m_rThrobber.Show();
200         m_rThrobber.start();
201         MigrationThread* pMigThread = new MigrationThread();
202         pMigThread->create();
203 
204 		while ( pMigThread->isRunning() )
205         {
206             Application::Reschedule();
207         }
208 
209         m_rThrobber.stop();
210         GetParent()->LeaveWait();
211         // Next state will enable buttons - so no EnableButtons necessary!
212         m_rThrobber.Hide();
213         pMigThread->join();
214         delete pMigThread;
215         m_bMigrationDone = sal_True;
216     }
217     else
218         Migration::cancelMigration();
219     return sal_True;
220 }
221 
ActivatePage()222 void MigrationPage::ActivatePage()
223 {
224     OWizardPage::ActivatePage();
225     GrabFocus();
226 }
227 
UserPage(svt::OWizardMachine * parent,const ResId & resid)228 UserPage::UserPage( svt::OWizardMachine* parent, const ResId& resid)
229 	: OWizardPage(parent, resid)
230 	, m_ftHead(this, WizardResId(FT_USER_HEADER))
231     , m_ftBody(this, WizardResId(FT_USER_BODY))
232     , m_ftFirst(this, WizardResId(FT_USER_FIRST))
233     , m_edFirst(this, WizardResId(ED_USER_FIRST))
234 	, m_ftLast(this, WizardResId(FT_USER_LAST))
235 	, m_edLast(this, WizardResId(ED_USER_LAST))
236     , m_ftInitials(this, WizardResId(FT_USER_INITIALS))
237 	, m_edInitials(this, WizardResId(ED_USER_INITIALS))
238     , m_ftFather(this, WizardResId(FT_USER_FATHER))
239 	, m_edFather(this, WizardResId(ED_USER_FATHER))
240     , m_lang(Application::GetSettings().GetUILanguage())
241 {
242     FreeResource();
243     _setBold(m_ftHead);
244 
245 	// check whether this is a russian version. otherwise
246 	// we'll hide the 'Fathers name' field
247     SvtUserOptions aUserOpt;
248     m_edFirst.SetText(aUserOpt.GetFirstName());
249     m_edLast.SetText(aUserOpt.GetLastName());
250 #if 0
251     rtl::OUString aUserName;
252     vos::OSecurity().getUserName( aUserName );
253    	aUserOpt.SetID( aUserName );
254 #endif
255 
256     m_edInitials.SetText(aUserOpt.GetID());
257     if (m_lang == LANGUAGE_RUSSIAN)
258     {
259 	    m_ftFather.Show();
260 	    m_edFather.Show();
261         m_edFather.SetText(aUserOpt.GetFathersName());
262     }
263 }
264 
commitPage(svt::WizardTypes::CommitPageReason)265 sal_Bool UserPage::commitPage( svt::WizardTypes::CommitPageReason )
266 {
267     SvtUserOptions aUserOpt;
268     aUserOpt.SetFirstName(m_edFirst.GetText());
269     aUserOpt.SetLastName(m_edLast.GetText());
270     aUserOpt.SetID( m_edInitials.GetText());
271 
272     if (m_lang == LANGUAGE_RUSSIAN)
273         aUserOpt.SetFathersName(m_edFather.GetText());
274 
275     return sal_True;
276 }
277 
ActivatePage()278 void UserPage::ActivatePage()
279 {
280     OWizardPage::ActivatePage();
281     GrabFocus();
282 }
283 
284 // -------------------------------------------------------------------
UpdateCheckPage(svt::OWizardMachine * parent,const ResId & resid)285 UpdateCheckPage::UpdateCheckPage( svt::OWizardMachine* parent, const ResId& resid)
286     : OWizardPage(parent, resid)
287     , m_ftHead(this, WizardResId(FT_UPDATE_CHECK_HEADER))
288     , m_ftBody(this, WizardResId(FT_UPDATE_CHECK_BODY))
289     , m_cbUpdateCheck(this, WizardResId(CB_UPDATE_CHECK))
290 {
291     FreeResource();
292     _setBold(m_ftHead);
293 }
294 
commitPage(svt::WizardTypes::CommitPageReason _eReason)295 sal_Bool UpdateCheckPage::commitPage( svt::WizardTypes::CommitPageReason _eReason )
296 {
297     if ( _eReason == svt::WizardTypes::eTravelForward )
298     {
299         try {
300             Reference < XNameReplace > xUpdateAccess;
301             Reference < XMultiServiceFactory > xFactory( ::comphelper::getProcessServiceFactory() );
302 
303             xUpdateAccess = Reference < XNameReplace >(
304                 xFactory->createInstance( UNISTRING( "com.sun.star.setup.UpdateCheckConfig" ) ), UNO_QUERY_THROW );
305 
306             if ( !xUpdateAccess.is() )
307                 return sal_False;
308 
309             sal_Bool bAutoUpdChk = m_cbUpdateCheck.IsChecked();
310             xUpdateAccess->replaceByName( UNISTRING("AutoCheckEnabled"), makeAny( bAutoUpdChk ) );
311 
312             Reference< XChangesBatch > xChangesBatch( xUpdateAccess, UNO_QUERY);
313             if( xChangesBatch.is() && xChangesBatch->hasPendingChanges() )
314                 xChangesBatch->commitChanges();
315         } catch (RuntimeException)
316         {
317         }
318     }
319 
320     return sal_True;
321 }
322 
ActivatePage()323 void UpdateCheckPage::ActivatePage()
324 {
325     OWizardPage::ActivatePage();
326     GrabFocus();
327 }
328 
329 } // namespace desktop
330 
331