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_cui.hxx"
26 
27 // include ---------------------------------------------------------------
28 
29 #define _SVX_OPTIMPROVE_CXX
30 
31 #include <optimprove.hxx>
32 #include <dialmgr.hxx>
33 #include <vcl/msgbox.hxx>
34 
35 #include "optimprove.hrc"
36 #include "helpid.hrc"
37 #include <cuires.hrc>
38 #include <svx/dialogs.hrc>
39 #include <com/sun/star/beans/PropertyValue.hpp>
40 #include <com/sun/star/lang/XComponent.hpp>
41 #include <com/sun/star/oooimprovement/XCore.hpp>
42 #include <com/sun/star/oooimprovement/XCoreController.hpp>
43 #include <com/sun/star/system/SystemShellExecute.hpp>
44 #include <com/sun/star/system/SystemShellExecuteFlags.hpp>
45 #include <com/sun/star/util/XStringSubstitution.hpp>
46 #include <comphelper/configurationhelper.hxx>
47 #include <comphelper/processfactory.hxx>
48 #include <comphelper/synchronousdispatch.hxx>
49 #include <comphelper/uieventslogger.hxx>
50 #include <tools/testtoolloader.hxx>
51 #include <osl/file.hxx>
52 
53 #define C2S(s)  ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(s))
54 
55 namespace beans  = ::com::sun::star::beans;
56 namespace lang  = ::com::sun::star::lang;
57 namespace uno   = ::com::sun::star::uno;
58 namespace util  = ::com::sun::star::util;
59 using namespace com::sun::star::system;
60 
61 
62 namespace
63 {
lcl_doesLogfileExist(const::rtl::OUString & sLogPath)64     bool lcl_doesLogfileExist(const ::rtl::OUString& sLogPath)
65     {
66         ::rtl::OUString sLogFile( sLogPath );
67         sLogFile += C2S("/Current.csv");
68         ::osl::File aLogFile(sLogFile);
69         return aLogFile.open(osl_File_OpenFlag_Read) == ::osl::FileBase::E_None;
70     }
71 }
72 
73 // class SvxImprovementOptionsPage ---------------------------------------
74 
SvxImprovementOptionsPage(Window * pParent,const SfxItemSet & rSet)75 SvxImprovementOptionsPage::SvxImprovementOptionsPage( Window* pParent, const SfxItemSet& rSet ) :
76 
77     SfxTabPage( pParent, CUI_RES( RID_SVXPAGE_IMPROVEMENT ), rSet ),
78 
79     m_aImproveFL                ( this, CUI_RES( FL_IMPROVE ) ),
80     m_aInvitationFT             ( this, CUI_RES( FT_INVITATION ) ),
81     m_aYesRB                    ( this, CUI_RES( RB_YES ) ),
82     m_aNoRB                     ( this, CUI_RES( RB_NO ) ),
83     m_aInfoFI                   ( this, CUI_RES( FI_INFO ) ),
84     m_aDataFL                   ( this, CUI_RES( FL_DATA ) ),
85     m_aNumberOfReportsFT        ( this, CUI_RES( FT_NR_REPORTS ) ),
86     m_aNumberOfReportsValueFT   ( this, CUI_RES( FT_NR_REPORTS_VALUE ) ),
87     m_aNumberOfActionsFT        ( this, CUI_RES( FT_NR_ACTIONS ) ),
88     m_aNumberOfActionsValueFT   ( this, CUI_RES( FT_NR_ACTIONS_VALUE ) ),
89     m_aShowDataPB               ( this, CUI_RES( PB_SHOWDATA ) ),
90 
91     m_sInfo                     (       CUI_RES( STR_INFO ) ),
92     m_sMoreInfo                 (       CUI_RES( STR_MOREINFO ) )
93 
94 {
95     FreeResource();
96 
97     m_aInfoFI.SetURL( C2S( "www.sun.com/privacy/" ) );
98     m_aInfoFI.SetClickHdl( LINK( this, SvxImprovementOptionsPage, HandleHyperlink ) );
99     m_aShowDataPB.SetClickHdl( LINK( this, SvxImprovementOptionsPage, HandleShowData ) );
100 }
101 
~SvxImprovementOptionsPage()102 SvxImprovementOptionsPage::~SvxImprovementOptionsPage()
103 {
104 }
105 
IMPL_LINK(SvxImprovementOptionsPage,HandleHyperlink,svt::FixedHyperlinkImage *,EMPTYARG)106 IMPL_LINK( SvxImprovementOptionsPage, HandleHyperlink, svt::FixedHyperlinkImage*, EMPTYARG )
107 {
108     ::rtl::OUString sURL( m_aInfoFI.GetURL() );
109 
110     if ( sURL.getLength() > 0 )
111     {
112         try
113         {
114             uno::Reference< XSystemShellExecute > xSystemShell(
115                 com::sun::star::system::SystemShellExecute::create(
116                     ::comphelper::getProcessComponentContext() ) );
117             if ( xSystemShell.is() )
118             {
119                 xSystemShell->execute(
120                     sURL, ::rtl::OUString(), SystemShellExecuteFlags::DEFAULTS );
121             }
122         }
123         catch( const uno::Exception& e )
124         {
125              OSL_TRACE( "Caught exception: %s\n thread terminated.\n",
126                 rtl::OUStringToOString( e.Message, RTL_TEXTENCODING_UTF8 ).getStr() );
127         }
128     }
129 
130     return 0;
131 }
132 
IMPL_LINK(SvxImprovementOptionsPage,HandleShowData,PushButton *,EMPTYARG)133 IMPL_LINK( SvxImprovementOptionsPage, HandleShowData, PushButton*, EMPTYARG )
134 {
135     uno::Reference < uno::XInterface > xDesktop( ::comphelper::getProcessServiceFactory()->createInstance(
136         C2S("com.sun.star.frame.Desktop") ), uno::UNO_QUERY );
137     if ( xDesktop.is() )
138     {
139         ::rtl::OUString sLogFile( m_sLogPath );
140         sLogFile += C2S("/Current.csv");
141         uno::Sequence< beans::PropertyValue > aArgs(3);
142 		aArgs[0].Name = ::rtl::OUString::createFromAscii("FilterName");
143 		aArgs[0].Value = uno::makeAny(::rtl::OUString::createFromAscii("Text - txt - csv (StarCalc)"));
144 		aArgs[1].Name = ::rtl::OUString::createFromAscii("FilterOptions");
145 		aArgs[1].Value = uno::makeAny(::rtl::OUString::createFromAscii("44,34,12,1,"));
146 		aArgs[2].Name = ::rtl::OUString::createFromAscii("ReadOnly");
147 		aArgs[2].Value = uno::makeAny(true);
148 
149         uno::Reference< lang::XComponent > xDoc = ::comphelper::SynchronousDispatch::dispatch(
150             xDesktop, sLogFile, C2S("_default"), 0, aArgs );
151         if ( xDoc.is() )
152         {
153             dynamic_cast<Dialog*>(GetParent())->EndDialog( RET_CANCEL );
154             return 1;
155         }
156     }
157 
158     return 0;
159 }
160 
Create(Window * pParent,const SfxItemSet & rSet)161 SfxTabPage* SvxImprovementOptionsPage::Create( Window* pParent, const SfxItemSet& rSet )
162 {
163     return new SvxImprovementOptionsPage( pParent, rSet );
164 }
165 
FillItemSet(SfxItemSet &)166 sal_Bool SvxImprovementOptionsPage::FillItemSet( SfxItemSet& /*rSet*/ )
167 {
168     uno::Reference< lang::XMultiServiceFactory > xSMGR = ::comphelper::getProcessServiceFactory();
169     uno::Reference< uno::XInterface > xConfig;
170 
171     try
172     {
173         xConfig = ::comphelper::ConfigurationHelper::openConfig(
174             xSMGR, C2S("/org.openoffice.Office.OOoImprovement.Settings"),
175             ::comphelper::ConfigurationHelper::E_STANDARD );
176         ::comphelper::ConfigurationHelper::writeRelativeKey(
177             xConfig, C2S("Participation"), C2S("ShowedInvitation"), uno::makeAny( true ) );
178         ::comphelper::ConfigurationHelper::writeRelativeKey(
179             xConfig, C2S("Participation"), C2S("InvitationAccepted"), uno::makeAny( m_aYesRB.IsChecked() != sal_False ) );
180         ::comphelper::ConfigurationHelper::flush( xConfig );
181         // TODO: refactor
182         ::comphelper::UiEventsLogger::reinit();
183         ::tools::InitTestToolLib();
184     }
185     catch( uno::Exception& )
186     {
187     }
188 
189     return sal_False;
190 }
191 
Reset(const SfxItemSet &)192 void SvxImprovementOptionsPage::Reset( const SfxItemSet& /*rSet*/ )
193 {
194     uno::Reference< lang::XMultiServiceFactory > xSMGR = ::comphelper::getProcessServiceFactory();
195     uno::Reference< com::sun::star::oooimprovement::XCore > xCore(
196         xSMGR->createInstance( C2S("com.sun.star.oooimprovement.Core") ),
197         uno::UNO_QUERY );
198     uno::Reference< uno::XInterface > xConfig;
199 
200     try
201     {
202         m_aNoRB.Check();
203         xConfig = ::comphelper::ConfigurationHelper::openConfig(
204             xSMGR, C2S("/org.openoffice.Office.OOoImprovement.Settings"),
205             ::comphelper::ConfigurationHelper::E_READONLY );
206         if ( xConfig.is() )
207         {
208             bool bYesChecked = false;
209             uno::Any aAny = ::comphelper::ConfigurationHelper::
210                 readRelativeKey( xConfig, C2S("Participation"), C2S("ShowedInvitation") );
211             if ( ( aAny >>= bYesChecked ) && bYesChecked )
212             {
213                 bool bTemp = false;
214                 aAny = ::comphelper::ConfigurationHelper::
215                     readRelativeKey( xConfig, C2S("Participation"), C2S("InvitationAccepted") );
216                 if ( aAny >>= bTemp )
217                 {
218                     bYesChecked &= bTemp;
219                     if ( bYesChecked )
220                         m_aYesRB.Check();
221                 }
222             }
223 
224             ::rtl::OUString sURL;
225             aAny = ::comphelper::ConfigurationHelper::
226                 readRelativeKey( xConfig, C2S("Participation"), C2S("HelpUrl") );
227             if ( aAny >>= sURL )
228                 m_aInfoFI.SetURL( sURL );
229 
230             sal_Int32 nCount = 0;
231             aAny = ::comphelper::ConfigurationHelper::
232                 readRelativeKey( xConfig, C2S("Counters"), C2S("UploadedReports") );
233             if ( aAny >>= nCount )
234                 m_aNumberOfReportsValueFT.SetText( String::CreateFromInt32( nCount ) );
235             aAny = ::comphelper::ConfigurationHelper::
236                 readRelativeKey( xConfig, C2S("Counters"), C2S("LoggedEvents") );
237             if ( aAny >>= nCount )
238             {
239                 if ( xCore.is() )
240                     nCount += xCore->getSessionLogEventCount();
241                 m_aNumberOfActionsValueFT.SetText( String::CreateFromInt32( nCount ) );
242             }
243 
244             ::rtl::OUString sPath;
245             aAny = ::comphelper::ConfigurationHelper::readDirectKey(
246                 xSMGR, C2S("/org.openoffice.Office.Logging"), C2S("OOoImprovement"),
247                 C2S("LogPath"), ::comphelper::ConfigurationHelper::E_READONLY );
248             if ( aAny >>= sPath )
249             {
250                 uno::Reference< util::XStringSubstitution > xSubst(
251                     xSMGR->createInstance( C2S("com.sun.star.util.PathSubstitution") ),
252                     uno::UNO_QUERY );
253                 if ( xSubst.is() )
254                     sPath = xSubst->substituteVariables( sPath, sal_False );
255                 m_sLogPath = sPath;
256                 m_aShowDataPB.Enable(lcl_doesLogfileExist(m_sLogPath));
257             }
258         }
259     }
260     catch( uno::Exception& )
261     {
262         m_aShowDataPB.Enable(false);
263     }
264 }
265 
266