cui/source/dialogs/about.cxx | 8 cui/source/options/optupdt.cxx | 69 +++++- cui/source/options/optupdt.hxx | 4 cui/uiconfig/ui/optonlineupdatepage.ui | 65 +++++ extensions/source/update/check/org/openoffice/Office/Jobs.xcu | 3 extensions/source/update/feed/updatefeed.cxx | 111 +++++++--- include/vcl/svapp.hxx | 5 instsetoo_native/CustomTarget_setup.mk | 2 offapi/com/sun/star/awt/XToolkitExperimental.idl | 3 toolkit/source/awt/vclxtoolkit.cxx | 9 vcl/generic/app/geninst.cxx | 33 ++ vcl/inc/generic/geninst.h | 2 vcl/inc/salinst.hxx | 3 vcl/inc/win/salinst.h | 2 vcl/source/app/svapp.cxx | 32 ++ vcl/win/source/app/salinst.cxx | 40 +++ 16 files changed, 343 insertions(+), 48 deletions(-)
New commits: commit 56a9594649872f4076b6891f917138d2b1e8d028 Author: Michael Meeks <michael.me...@collabora.com> Date: Sat Nov 14 17:23:00 2015 +0000 Update-check, expand to allow reporting of H/W and OS versions. Off by default. Expand config options to show the user agent used. Re-use this to show more useful info in Help->About too. Change-Id: I1044116ef9beeb341a537c0f4451dca54e198f67 Reviewed-on: https://gerrit.libreoffice.org/20098 Tested-by: Jenkins <c...@libreoffice.org> Reviewed-by: Michael Meeks <michael.me...@collabora.com> diff --git a/cui/source/dialogs/about.cxx b/cui/source/dialogs/about.cxx index 7dec293..07615cd 100644 --- a/cui/source/dialogs/about.cxx +++ b/cui/source/dialogs/about.cxx @@ -48,7 +48,6 @@ #include <rtl/ustrbuf.hxx> #include <vcl/bitmap.hxx> #include <officecfg/Office/Common.hxx> -#include <vcl/opengl/OpenGLWrapper.hxx> using namespace ::com::sun::star::uno; using namespace ::com::sun::star::beans; @@ -295,10 +294,9 @@ OUString AboutDialog::GetVersionString() sVersion += m_sBuildStr.replaceAll("$BUILDID", sBuildId); } - if (OpenGLWrapper::isVCLOpenGLEnabled()) - { - sVersion += "-GL"; - } + sVersion += "\n"; + sVersion += Application::GetHWOSConfInfo(); + sVersion += "\n"; if (EXTRA_BUILDID[0] != '\0') { diff --git a/cui/source/options/optupdt.cxx b/cui/source/options/optupdt.cxx index 6ca3f1f..9da2bb42 100644 --- a/cui/source/options/optupdt.cxx +++ b/cui/source/options/optupdt.cxx @@ -29,6 +29,8 @@ #include <com/sun/star/lang/XMultiServiceFactory.hpp> #include <com/sun/star/ui/dialogs/FolderPicker.hpp> #include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp> +#include <com/sun/star/deployment/UpdateInformationProvider.hpp> +#include <com/sun/star/ucb/XWebDAVCommandEnvironment.hpp> #include <com/sun/star/frame/Desktop.hpp> #include <com/sun/star/frame/XDispatchProvider.hpp> #include <com/sun/star/util/XChangesBatch.hpp> @@ -38,9 +40,7 @@ #include <osl/file.hxx> #include <osl/security.hxx> -using namespace ::com::sun::star; - -// class SvxOnlineUpdateTabPage -------------------------------------------------- +using namespace ::css; SvxOnlineUpdateTabPage::SvxOnlineUpdateTabPage(vcl::Window* pParent, const SfxItemSet& rSet) : SfxTabPage(pParent, "OptOnlineUpdatePage", "cui/ui/optonlineupdatepage.ui", &rSet) @@ -56,8 +56,11 @@ SvxOnlineUpdateTabPage::SvxOnlineUpdateTabPage(vcl::Window* pParent, const SfxIt get(m_pDestPath, "destpath"); get(m_pChangePathButton, "changepath"); get(m_pLastChecked, "lastchecked"); + get(m_pExtrasCheckBox, "extrabits"); + get(m_pUserAgentLabel, "useragent"); m_pAutoCheckCheckBox->SetClickHdl( LINK( this, SvxOnlineUpdateTabPage, AutoCheckHdl_Impl ) ); + m_pExtrasCheckBox->SetClickHdl( LINK( this, SvxOnlineUpdateTabPage, ExtrasCheckHdl_Impl ) ); m_pCheckNowButton->SetClickHdl( LINK( this, SvxOnlineUpdateTabPage, CheckNowHdl_Impl ) ); m_pChangePathButton->SetClickHdl( LINK( this, SvxOnlineUpdateTabPage, FileDialogHdl_Impl ) ); @@ -80,6 +83,7 @@ SvxOnlineUpdateTabPage::SvxOnlineUpdateTabPage(vcl::Window* pParent, const SfxIt m_aLastCheckedTemplate = m_pLastChecked->GetText(); UpdateLastCheckedText(); + UpdateUserAgent(); } SvxOnlineUpdateTabPage::~SvxOnlineUpdateTabPage() @@ -99,10 +103,12 @@ void SvxOnlineUpdateTabPage::dispose() m_pDestPath.clear(); m_pChangePathButton.clear(); m_pLastChecked.clear(); + m_pExtrasCheckBox.clear(); + m_pUserAgentLabel.clear(); + SfxTabPage::dispose(); } - void SvxOnlineUpdateTabPage::UpdateLastCheckedText() { OUString aDateStr; @@ -160,6 +166,36 @@ void SvxOnlineUpdateTabPage::UpdateLastCheckedText() m_pLastChecked->SetText( aText ); } +void SvxOnlineUpdateTabPage::UpdateUserAgent() +{ + try { + uno::Reference< ucb::XWebDAVCommandEnvironment > xDav( + css::deployment::UpdateInformationProvider::create( + ::comphelper::getProcessComponentContext() ), + css::uno::UNO_QUERY_THROW ); + + OUString aPseudoURL = "useragent:normal"; + if( m_pExtrasCheckBox->IsChecked() ) + aPseudoURL = "useragent:extended"; + uno::Sequence< beans::StringPair > aHeaders + = xDav->getUserRequestHeaders( aPseudoURL, ucb::WebDAVHTTPMethod(0) ); + + for ( auto i = aHeaders.begin(); i != aHeaders.end(); ++i ) + { + if ( i->First == "User-Agent" ) + { + OUString aText = i->Second; + aText = aText.replaceAll(";", ";\n"); + aText = aText.replaceAll("(", "\n("); + m_pUserAgentLabel->SetText( aText ); + break; + } + } + } catch (const uno::Exception &) { + SAL_WARN( "cui.options", "Unexpected exception fetching User Agent" ); + } +} + VclPtr<SfxTabPage> SvxOnlineUpdateTabPage::Create( vcl::Window* pParent, const SfxItemSet* rAttrSet ) { @@ -220,6 +256,13 @@ bool SvxOnlineUpdateTabPage::FillItemSet( SfxItemSet* ) bModified = true; } + if( m_pExtrasCheckBox->IsValueChangedFromSaved() ) + { + bValue = m_pExtrasCheckBox->IsChecked(); + m_xUpdateAccess->replaceByName( "ExtendedUserAgent", uno::makeAny( bValue ) ); + bModified = true; + } + uno::Reference< util::XChangesBatch > xChangesBatch(m_xUpdateAccess, uno::UNO_QUERY); if( xChangesBatch.is() && xChangesBatch->hasPendingChanges() ) xChangesBatch->commitChanges(); @@ -227,8 +270,6 @@ bool SvxOnlineUpdateTabPage::FillItemSet( SfxItemSet* ) return bModified; } - - void SvxOnlineUpdateTabPage::Reset( const SfxItemSet* ) { bool bValue = false; @@ -266,17 +307,18 @@ void SvxOnlineUpdateTabPage::Reset( const SfxItemSet* ) if( osl::FileBase::E_None == osl::FileBase::getSystemPathFromFileURL(sValue, aPath) ) m_pDestPath->SetText(aPath); + m_xUpdateAccess->getByName( "ExtendedUserAgent" ) >>= bValue; + m_pExtrasCheckBox->Check(bValue); + m_pExtrasCheckBox->SaveValue(); + UpdateUserAgent(); + m_pAutoDownloadCheckBox->SaveValue(); } - - void SvxOnlineUpdateTabPage::FillUserData() { } - - IMPL_LINK_TYPED( SvxOnlineUpdateTabPage, AutoCheckHdl_Impl, Button*, pBox, void ) { bool bEnabled = static_cast<CheckBox*>(pBox)->IsChecked(); @@ -286,7 +328,10 @@ IMPL_LINK_TYPED( SvxOnlineUpdateTabPage, AutoCheckHdl_Impl, Button*, pBox, void m_pEveryMonthButton->Enable(bEnabled); } - +IMPL_LINK_TYPED( SvxOnlineUpdateTabPage, ExtrasCheckHdl_Impl, Button*, , void ) +{ + UpdateUserAgent(); +} IMPL_LINK_NOARG_TYPED(SvxOnlineUpdateTabPage, FileDialogHdl_Impl, Button*, void) { @@ -308,8 +353,6 @@ IMPL_LINK_NOARG_TYPED(SvxOnlineUpdateTabPage, FileDialogHdl_Impl, Button*, void) } } - - IMPL_LINK_NOARG_TYPED(SvxOnlineUpdateTabPage, CheckNowHdl_Impl, Button*, void) { uno::Reference < uno::XComponentContext> xContext( ::comphelper::getProcessComponentContext() ); diff --git a/cui/source/options/optupdt.hxx b/cui/source/options/optupdt.hxx index 8844826c..9460930 100644 --- a/cui/source/options/optupdt.hxx +++ b/cui/source/options/optupdt.hxx @@ -39,16 +39,20 @@ private: VclPtr<FixedText> m_pDestPath; VclPtr<PushButton> m_pChangePathButton; VclPtr<FixedText> m_pLastChecked; + VclPtr<CheckBox> m_pExtrasCheckBox; + VclPtr<FixedText> m_pUserAgentLabel; OUString m_aNeverChecked; OUString m_aLastCheckedTemplate; DECL_LINK_TYPED(FileDialogHdl_Impl, Button*, void); DECL_LINK_TYPED(CheckNowHdl_Impl, Button*, void); DECL_LINK_TYPED(AutoCheckHdl_Impl, Button*, void); + DECL_LINK_TYPED(ExtrasCheckHdl_Impl, Button*, void); css::uno::Reference< css::container::XNameReplace > m_xUpdateAccess; void UpdateLastCheckedText(); + void UpdateUserAgent(); public: SvxOnlineUpdateTabPage( vcl::Window* pParent, const SfxItemSet& rSet ); diff --git a/cui/uiconfig/ui/optonlineupdatepage.ui b/cui/uiconfig/ui/optonlineupdatepage.ui index cf4c4ae..4de1123 100644 --- a/cui/uiconfig/ui/optonlineupdatepage.ui +++ b/cui/uiconfig/ui/optonlineupdatepage.ui @@ -216,6 +216,71 @@ </packing> </child> <child> + <object class="GtkCheckButton" id="extrabits"> + <property name="label" translatable="yes">_Send OS version & simple hardware info.</property> + <property name="tooltip_text" translatable="yes">This information lets us optimize for your hardware & OS.</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">7</property> + <property name="width">2</property> + </packing> + </child> + <child> + <object class="GtkHBox" id="hbox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="spacing">8</property> + <property name="homogeneous">False</property> + <child> + <object class="GtkLabel" id="useragent_label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="yalign">0</property> + <property name="label" translatable="yes">User Agent:</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="useragent_changed"> + <property name="visible">False</property> + <property name="can_focus">False</property> + <property name="yalign">0</property> + <property name="label" translatable="yes">Hit apply to update</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="useragent"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">8</property> + <property name="width">2</property> + </packing> + </child> + <child> <object class="GtkLabel" id="neverchecked"> <property name="can_focus">False</property> <property name="no_show_all">True</property> diff --git a/extensions/source/update/check/org/openoffice/Office/Jobs.xcu b/extensions/source/update/check/org/openoffice/Office/Jobs.xcu index f11c14e..58db404 100644 --- a/extensions/source/update/check/org/openoffice/Office/Jobs.xcu +++ b/extensions/source/update/check/org/openoffice/Office/Jobs.xcu @@ -49,6 +49,9 @@ <prop oor:name="DownloadPaused" oor:type="xs:boolean" oor:op="replace"> <value>false</value> </prop> + <prop oor:name="ExtendedUserAgent" oor:type="xs:boolean" oor:op="replace"> + <value>false</value> + </prop> </node> </node> </node> diff --git a/extensions/source/update/feed/updatefeed.cxx b/extensions/source/update/feed/updatefeed.cxx index 8bb9277..12ee3a8 100644 --- a/extensions/source/update/feed/updatefeed.cxx +++ b/extensions/source/update/feed/updatefeed.cxx @@ -46,6 +46,8 @@ #include <com/sun/star/task/PasswordContainerInteractionHandler.hpp> #include <com/sun/star/xml/dom/DocumentBuilder.hpp> #include <com/sun/star/xml/xpath/XPathAPI.hpp> +#include <com/sun/star/awt/Toolkit.hpp> +#include <com/sun/star/awt/XToolkitExperimental.hpp> #include <rtl/ref.hxx> #include <rtl/bootstrap.hxx> @@ -136,6 +138,8 @@ class UpdateInformationProvider : ucb::XWebDAVCommandEnvironment, lang::XServiceInfo > { + OUString getUserAgent(bool bExtended); + bool isUserAgentExtended(); public: static uno::Reference< uno::XInterface > createInstance(const uno::Reference<uno::XComponentContext>& xContext); @@ -176,7 +180,7 @@ public: // XWebDAVCommandEnvironment virtual uno::Sequence< beans::StringPair > SAL_CALL getUserRequestHeaders( const OUString&, ucb::WebDAVHTTPMethod ) - throw ( uno::RuntimeException, std::exception ) override { return m_aRequestHeaderList; }; + throw ( uno::RuntimeException, std::exception ) override; // XServiceInfo virtual OUString SAL_CALL getImplementationName() @@ -190,6 +194,7 @@ protected: virtual ~UpdateInformationProvider(); static OUString getConfigurationItem(uno::Reference<lang::XMultiServiceFactory> const & configurationProvider, OUString const & node, OUString const & item); + static uno::Any getConfigurationItemAny(uno::Reference<lang::XMultiServiceFactory> const & configurationProvider, OUString const & node, OUString const & item); private: uno::Reference< io::XInputStream > load(const OUString& rURL); @@ -312,9 +317,6 @@ private: deployment::UpdateInformationEntry m_aEntry; }; - - - UpdateInformationProvider::UpdateInformationProvider( const uno::Reference<uno::XComponentContext>& xContext, const uno::Reference< ucb::XUniversalContentBroker >& xUniversalContentBroker, @@ -324,11 +326,35 @@ UpdateInformationProvider::UpdateInformationProvider( , m_xUniversalContentBroker(xUniversalContentBroker) , m_xDocumentBuilder(xDocumentBuilder) , m_xXPathAPI(xXPathAPI) - , m_aRequestHeaderList(1) + , m_aRequestHeaderList(2) , m_nCommandId(0) { uno::Reference< lang::XMultiServiceFactory > xConfigurationProvider( - css::configuration::theDefaultProvider::get(xContext)); + css::configuration::theDefaultProvider::get(m_xContext)); + + m_aRequestHeaderList[0].First = "Accept-Language"; + m_aRequestHeaderList[0].Second = getConfigurationItem( xConfigurationProvider, "org.openoffice.Setup/L10N", "ooLocale" ); +} + +bool +UpdateInformationProvider::isUserAgentExtended() +{ + uno::Reference< lang::XMultiServiceFactory > xConfigurationProvider( + css::configuration::theDefaultProvider::get(m_xContext)); + + uno::Any aExtended = getConfigurationItemAny( + xConfigurationProvider, + "org.openoffice.Office.Jobs/Jobs/UpdateCheck/Arguments", + "ExtendedUserAgent"); + bool bExtendedUserAgent = false; + aExtended >>= bExtendedUserAgent; + return bExtendedUserAgent; +} + +OUString UpdateInformationProvider::getUserAgent(bool bExtended) +{ + uno::Reference< lang::XMultiServiceFactory > xConfigurationProvider( + css::configuration::theDefaultProvider::get(m_xContext)); OUStringBuffer buf; buf.append( @@ -342,30 +368,63 @@ UpdateInformationProvider::UpdateInformationProvider( xConfigurationProvider, "org.openoffice.Setup/Product", "ooSetupVersion")); + OUString extension( getConfigurationItem( xConfigurationProvider, "org.openoffice.Setup/Product", "ooSetupExtension")); - if (!extension.isEmpty()) { + if (!extension.isEmpty()) buf.append(extension); - } + OUString product(buf.makeStringAndClear()); OUString aUserAgent( "${$BRAND_BASE_DIR/" LIBO_ETC_FOLDER "/" SAL_CONFIGFILE("version") ":UpdateUserAgent}" ); + OUString aExtended; + if( bExtended ) + { + try { + uno::Reference< css::awt::XToolkitExperimental > xToolkit( + css::awt::Toolkit::create( m_xContext ), uno::UNO_QUERY_THROW ); + if ( xToolkit.is() ) + aExtended = xToolkit->getHWOSConfInfo(); + } catch (const uno::Exception &) { + SAL_WARN( "extensions.update", "Failed to find version info from toolkit" ); + } + } rtl::Bootstrap::expandMacros( aUserAgent ); aUserAgent = aUserAgent.replaceAll("<PRODUCT>", product); + aUserAgent = aUserAgent.replaceAll("<OPTIONAL_OS_HW_DATA>", aExtended); SAL_INFO("extensions.update", "UpdateUserAgent: " << aUserAgent); - m_aRequestHeaderList[0].First = "Accept-Language"; - m_aRequestHeaderList[0].Second = getConfigurationItem( xConfigurationProvider, "org.openoffice.Setup/L10N", "ooLocale" ); - if( !aUserAgent.isEmpty() ) + return aUserAgent; +} + +uno::Sequence< beans::StringPair > SAL_CALL UpdateInformationProvider::getUserRequestHeaders( + const OUString &aURL, ucb::WebDAVHTTPMethod ) + throw ( uno::RuntimeException, std::exception ) +{ + bool bExtendedUserAgent; + uno::Sequence< beans::StringPair > aPair = m_aRequestHeaderList; + + // Internal use from cui/ some magic URLs + if( aURL.startsWith( "useragent:" ) ) + bExtendedUserAgent = (aURL == "useragent:extended"); + else + bExtendedUserAgent = isUserAgentExtended(); + + OUString aUserAgent = getUserAgent(bExtendedUserAgent); + + if( aUserAgent.isEmpty() ) + aPair.realloc(1); + else { - m_aRequestHeaderList.realloc(2); - m_aRequestHeaderList[1].First = "User-Agent"; - m_aRequestHeaderList[1].Second = aUserAgent; + aPair[1].First = "User-Agent"; + aPair[1].Second = aUserAgent; } -} + + return aPair; +}; uno::Reference< uno::XInterface > UpdateInformationProvider::createInstance(const uno::Reference<uno::XComponentContext>& xContext) @@ -383,18 +442,13 @@ UpdateInformationProvider::createInstance(const uno::Reference<uno::XComponentCo return *new UpdateInformationProvider(xContext, xUniversalContentBroker, xDocumentBuilder, xXPath); } - - UpdateInformationProvider::~UpdateInformationProvider() { } - - -OUString -UpdateInformationProvider::getConfigurationItem(uno::Reference<lang::XMultiServiceFactory> const & configurationProvider, OUString const & node, OUString const & item) +uno::Any +UpdateInformationProvider::getConfigurationItemAny(uno::Reference<lang::XMultiServiceFactory> const & configurationProvider, OUString const & node, OUString const & item) { - rtl::OUString sRet; beans::PropertyValue aProperty; aProperty.Name = "nodepath"; aProperty.Value = uno::makeAny(node); @@ -408,11 +462,16 @@ UpdateInformationProvider::getConfigurationItem(uno::Reference<lang::XMultiServi aArgumentList ), uno::UNO_QUERY_THROW); - xNameAccess->getByName(item) >>= sRet; - return sRet; + return xNameAccess->getByName(item); } - +OUString +UpdateInformationProvider::getConfigurationItem(uno::Reference<lang::XMultiServiceFactory> const & configurationProvider, OUString const & node, OUString const & item) +{ + OUString sRet; + getConfigurationItemAny(configurationProvider, node, item) >>= sRet; + return sRet; +} void UpdateInformationProvider::storeCommandInfo( @@ -425,8 +484,6 @@ UpdateInformationProvider::storeCommandInfo( m_xCommandProcessor = rxCommandProcessor; } - - uno::Reference< io::XInputStream > UpdateInformationProvider::load(const OUString& rURL) { diff --git a/include/vcl/svapp.hxx b/include/vcl/svapp.hxx index f3521b0..a8b813b 100644 --- a/include/vcl/svapp.hxx +++ b/include/vcl/svapp.hxx @@ -948,6 +948,11 @@ public: */ static OUString GetAppName(); + /** Get useful OS, Hardware and configuration information, + * cf. Help->About, and User-Agent + */ + static OUString GetHWOSConfInfo(); + /** Load a localized branding PNG file as a bitmap. @param pName Name of the bitmap to load. diff --git a/instsetoo_native/CustomTarget_setup.mk b/instsetoo_native/CustomTarget_setup.mk index 5c332e0..e4cdd53 100644 --- a/instsetoo_native/CustomTarget_setup.mk +++ b/instsetoo_native/CustomTarget_setup.mk @@ -143,7 +143,7 @@ $(call gb_CustomTarget_get_workdir,instsetoo_native/setup)/$(call gb_Helper_get_ && echo 'ReferenceOOoMajorMinor=4.1' \ && echo 'UpdateID=$(PRODUCTNAME)_$(LIBO_VERSION_MAJOR)_en-US' \ && echo 'UpdateURL=$(if $(ENABLE_ONLINE_UPDATE),http://update.libreoffice.org/check.php$(if $(filter-out WNT,$(OS)),?pkgfmt=$(PKGFORMAT)))' \ - && echo 'UpdateUserAgent=<PRODUCT> ($${buildid}; $${_OS}; $${_ARCH}; BundledLanguages=$${AllLanguages})' \ + && echo 'UpdateUserAgent=<PRODUCT> ($${buildid}; $${_OS}; $${_ARCH}; <OPTIONAL_OS_HW_DATA>BundledLanguages=$${AllLanguages})' \ && echo 'Vendor=$(OOO_VENDOR)' \ ) > $@ diff --git a/offapi/com/sun/star/awt/XToolkitExperimental.idl b/offapi/com/sun/star/awt/XToolkitExperimental.idl index d120290..72fb359 100644 --- a/offapi/com/sun/star/awt/XToolkitExperimental.idl +++ b/offapi/com/sun/star/awt/XToolkitExperimental.idl @@ -23,6 +23,9 @@ interface XToolkitExperimental : XToolkit2 */ void processEventsToIdle(); + /** Get misc. information for User-Agent: + */ + string getHWOSConfInfo(); }; }; }; }; }; diff --git a/toolkit/source/awt/vclxtoolkit.cxx b/toolkit/source/awt/vclxtoolkit.cxx index a763df1..a1100a8 100644 --- a/toolkit/source/awt/vclxtoolkit.cxx +++ b/toolkit/source/awt/vclxtoolkit.cxx @@ -194,6 +194,8 @@ public: // css::awt::XToolkitExperimental virtual void SAL_CALL processEventsToIdle() throw (css::uno::RuntimeException, std::exception) override; + virtual OUString SAL_CALL getHWOSConfInfo() + throw (::css::uno::RuntimeException, ::std::exception) override; // css::awt::XToolkit css::uno::Reference< css::awt::XWindowPeer > SAL_CALL getDesktopWindow( ) throw(css::uno::RuntimeException, std::exception) override; @@ -1913,6 +1915,13 @@ void SAL_CALL VCLXToolkit::processEventsToIdle() Scheduler::ProcessTaskScheduling(false); } +OUString SAL_CALL VCLXToolkit::getHWOSConfInfo() + throw (::css::uno::RuntimeException, ::std::exception) +{ + SolarMutexGuard aSolarGuard; + return Application::GetHWOSConfInfo(); +} + // css:awt:XToolkitRobot void SAL_CALL VCLXToolkit::keyPress( const css::awt::KeyEvent & aKeyEvent ) diff --git a/vcl/generic/app/geninst.cxx b/vcl/generic/app/geninst.cxx index f481eb8..27923a1 100644 --- a/vcl/generic/app/geninst.cxx +++ b/vcl/generic/app/geninst.cxx @@ -20,6 +20,10 @@ #include <string.h> #include <stdlib.h> +#if defined(LINUX) +# include <stdio.h> +#endif + #include <osl/module.hxx> #include <comphelper/solarmutex.hxx> #include <vcl/opengl/OpenGLContext.hxx> @@ -128,4 +132,33 @@ SalGenericInstance::~SalGenericInstance() delete mpSalYieldMutex; } +OUString SalGenericInstance::getOSVersion() +{ + OUString aKernelVer = "unknown"; + +// not so generic, but at least shared between all unix backend +#if defined(LINUX) + FILE* pVersion = fopen( "/proc/version", "r" ); + if ( pVersion ) + { + char aVerBuffer[512]; + if ( fgets ( aVerBuffer, 511, pVersion ) ) + { + aKernelVer = OUString::createFromAscii( aVerBuffer ); + sal_Int32 nIndex = 0; + // "Linux version 3.16.7-29-desktop ..." + OUString aVers = aKernelVer.getToken( 2, ' ', nIndex ); + // "3.16.7-29-desktop ..." + sal_Int32 nTooDetailed = aVers.indexOf( '.', 2); + if (nTooDetailed < 1 || nTooDetailed > 8) + aKernelVer = "misparse"; + else // "3.16.7-29-desktop ..." + aKernelVer = aVers.copy(0, nTooDetailed); + } + fclose( pVersion ); + } +#endif + return aKernelVer; +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/inc/generic/geninst.h b/vcl/inc/generic/geninst.h index 0ebfd67..5e7e61e 100644 --- a/vcl/inc/generic/geninst.h +++ b/vcl/inc/generic/geninst.h @@ -105,6 +105,8 @@ public: bool isPrinterInit() const { return mbPrinterInit; } virtual GenPspGraphics *CreatePrintGraphics() = 0; + virtual OUString getOSVersion() override; + // prolly belongs somewhere else ... just a font help static void RegisterFontSubstitutors( PhysicalFontCollection* pFontCollection ); static int FetchFontSubstitutionFlags(); diff --git a/vcl/inc/salinst.hxx b/vcl/inc/salinst.hxx index 8f1a4a5..a5f8806 100644 --- a/vcl/inc/salinst.hxx +++ b/vcl/inc/salinst.hxx @@ -172,6 +172,9 @@ public: virtual void updatePrinterUpdate() {} virtual void jobStartedPrinterUpdate() {} virtual void jobEndedPrinterUpdate() {} + + /// get information about underlying versions + virtual OUString getOSVersion() { return OUString("-"); } }; // called from SVMain diff --git a/vcl/inc/win/salinst.h b/vcl/inc/win/salinst.h index 601159a..4c1bc7f 100644 --- a/vcl/inc/win/salinst.h +++ b/vcl/inc/win/salinst.h @@ -82,6 +82,8 @@ public: virtual void* GetConnectionIdentifier( ConnectionIdentifierType& rReturnedType, int& rReturnedBytes ) override; virtual void AddToRecentDocumentList(const OUString& rFileUrl, const OUString& rMimeType, const OUString& rDocumentService) override; + virtual OUString getOSVersion() override; + static int WorkaroundExceptionHandlingInUSER32Lib(int nExcept, LPEXCEPTION_POINTERS pExceptionInfo); }; diff --git a/vcl/source/app/svapp.cxx b/vcl/source/app/svapp.cxx index 7f490b6..e8cb62f 100644 --- a/vcl/source/app/svapp.cxx +++ b/vcl/source/app/svapp.cxx @@ -51,6 +51,7 @@ #include "vcl/scheduler.hxx" #include "vcl/unohelp.hxx" #include "vcl/lazydelete.hxx" +#include "vcl/opengl/OpenGLWrapper.hxx" #include "salinst.hxx" #include "salframe.hxx" @@ -74,6 +75,7 @@ #include <cassert> #include <utility> +#include <thread> using namespace ::com::sun::star; using namespace ::com::sun::star::uno; @@ -1162,6 +1164,36 @@ OUString Application::GetAppName() return OUString(); } +OUString Application::GetHWOSConfInfo() +{ + ImplSVData* pSVData = ImplGetSVData(); + OUStringBuffer aDetails; + + aDetails.append( "Threads " ); + aDetails.append( (sal_Int32) + std::thread::hardware_concurrency() ); + aDetails.append( "; " ); + + OUString aVersion; + if ( pSVData && pSVData->mpDefInst ) + aVersion = pSVData->mpDefInst->getOSVersion(); + else + aVersion = "-"; + + aDetails.append( "Ver: " ); + aDetails.append( aVersion ); + aDetails.append( "; " ); + + aDetails.append( "Render: " ); + if ( OpenGLWrapper::isVCLOpenGLEnabled() ) + aDetails.append( "GL" ); + else + aDetails.append( "default" ); + aDetails.append( "; " ); + + return aDetails.makeStringAndClear(); +} + void Application::SetDisplayName( const OUString& rName ) { ImplSVData* pSVData = ImplGetSVData(); diff --git a/vcl/win/source/app/salinst.cxx b/vcl/win/source/app/salinst.cxx index 4ddf3a9..fcb5a15 100644 --- a/vcl/win/source/app/salinst.cxx +++ b/vcl/win/source/app/salinst.cxx @@ -115,7 +115,7 @@ class SalYieldMutex : public comphelper::SolarMutex public: // for ImplSalYield() WinSalInstance* mpInstData; - sal_uLong mnCount; + sal_uLong mnCount; DWORD mnThreadId; public: @@ -125,7 +125,7 @@ public: virtual void release(); virtual bool tryToAcquire(); - sal_uLong GetAcquireCount( sal_uLong nThreadId ); + sal_uLong GetAcquireCount( sal_uLong nThreadId ); }; SalYieldMutex::SalYieldMutex( WinSalInstance* pInstData ) @@ -1114,4 +1114,40 @@ int WinSalInstance::WorkaroundExceptionHandlingInUSER32Lib(int, LPEXCEPTION_POIN } #endif +OUString WinSalInstance::getOSVersion() +{ + SalData* pSalData = GetSalData(); + if ( !pSalData ) + return OUString("unknown"); + + WORD nMajor = 0, nMinor = 0; +#ifdef _WIN32_WINNT_WINBLUE + // Trying to hide the real version info behind an + // uber-lame non-forward-compatible, 'compatibility' API + // seems unlikely to help OS designers, or API users. + nMajor = 30; + while( !IsWindowsVersionOrGreater( nMajor, 0, 0 ) && nMajor > 0) + nMajor--; + nMinor = 30; + while( !IsWindowsVersionOrGreater( nMajor, nMinor, 0 ) && nMinor > 0) + nMinor--; +#else + OSVERSIONINFO aVersionInfo; + memset( &aVersionInfo, 0, sizeof( aVersionInfo ) ); + aVersionInfo.dwOSVersionInfoSize = sizeof( aVersionInfo ); + if ( GetVersionEx( &aVersionInfo ) ) + { + nMajor = aVersionInfo.dwMajorVersion; + nMinor = aVersionInfo.dwMinorVersion; + } +#endif + OUStringBuffer aVer; + aVer.append( "Windows " ); + aVer.append( (sal_Int32)nMajor ); + aVer.append( "." ); + aVer.append( (sal_Int32)nMinor ); + + return aVer.makeStringAndClear(); +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits