| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| #include <cppuhelper/implbase3.hxx> |
| #include <com/sun/star/beans/NamedValue.hpp> |
| #include <com/sun/star/container/XNameContainer.hpp> |
| #include <com/sun/star/lang/XServiceInfo.hpp> |
| #include <com/sun/star/uno/XComponentContext.hpp> |
| #include <com/sun/star/util/XChangesBatch.hpp> |
| #include <rtl/ref.hxx> |
| |
| #include "updatecheckconfiglistener.hxx" |
| #include "updateinfo.hxx" |
| |
| /* Interface to acess configuration data read-only */ |
| struct IByNameAccess |
| { |
| virtual ::com::sun::star::uno::Any getValue(const sal_Char * pName) = 0; |
| }; |
| |
| /* This helper class provides by name access to a sequence of named values */ |
| class NamedValueByNameAccess : public IByNameAccess |
| { |
| const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::NamedValue >& m_rValues; |
| |
| public: |
| NamedValueByNameAccess( |
| const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::NamedValue >& rValues) : |
| m_rValues(rValues) {} ; |
| |
| virtual ~NamedValueByNameAccess(); |
| |
| virtual ::com::sun::star::uno::Any getValue(const sal_Char * pName); |
| }; |
| |
| |
| /* This class encapsulates the configuration item actually used for storing the state |
| * the update check is actually in. |
| */ |
| class UpdateCheckROModel |
| { |
| public: |
| UpdateCheckROModel(IByNameAccess& aNameAccess) : m_aNameAccess(aNameAccess) {}; |
| |
| bool isAutoCheckEnabled() const; |
| bool isDownloadPaused() const; |
| rtl::OUString getLocalFileName() const; |
| sal_Int64 getDownloadSize() const; |
| |
| rtl::OUString getUpdateEntryVersion() const; |
| void getUpdateEntry(UpdateInfo& rInfo) const; |
| |
| private: |
| |
| rtl::OUString getStringValue(const sal_Char *) const; |
| |
| IByNameAccess& m_aNameAccess; |
| }; |
| |
| |
| |
| /* This class implements the non published UNO service com.sun.star.setup.UpdateCheckConfig, |
| * which primary use is to be able to track changes done in the Toos -> Options page of this |
| * component, as this is not supported by the OOo configuration for extendable groups. |
| */ |
| |
| class UpdateCheckConfig : public ::cppu::WeakImplHelper3< |
| ::com::sun::star::container::XNameReplace, |
| ::com::sun::star::util::XChangesBatch, |
| ::com::sun::star::lang::XServiceInfo > |
| { |
| UpdateCheckConfig( const ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameContainer >& xContainer, |
| const ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameContainer >& xAvailableUpdates, |
| const ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameContainer >& xIgnoredUpdates, |
| const ::rtl::Reference< UpdateCheckConfigListener >& rListener ); |
| |
| virtual ~UpdateCheckConfig(); |
| |
| public: |
| |
| static ::com::sun::star::uno::Sequence< rtl::OUString > getServiceNames(); |
| static rtl::OUString getImplName(); |
| |
| static ::rtl::Reference< UpdateCheckConfig > get( |
| const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& xContext, |
| const ::rtl::Reference< UpdateCheckConfigListener >& rListener = ::rtl::Reference< UpdateCheckConfigListener >()); |
| |
| // Should really implement ROModel .. |
| bool isAutoCheckEnabled() const; |
| bool isAutoDownloadEnabled() const; |
| rtl::OUString getUpdateEntryVersion() const; |
| |
| /* Updates the timestamp of last check, but does not commit the change |
| * as either clearUpdateFound() or setUpdateFound() are expected to get |
| * called next. |
| */ |
| void updateLastChecked(); |
| |
| /* Returns the date of the last successful check in seconds since 1970 */ |
| sal_Int64 getLastChecked() const; |
| |
| /* Returns configured check interval in seconds */ |
| sal_Int64 getCheckInterval() const; |
| |
| /* Reset values of previously remembered update |
| */ |
| void clearUpdateFound(); |
| |
| /* Stores the specified data of an available update |
| */ |
| void storeUpdateFound(const UpdateInfo& rInfo, const rtl::OUString& aCurrentBuild); |
| |
| // Returns the local file name of a started download |
| rtl::OUString getLocalFileName() const; |
| |
| // Returns the local file name of a started download |
| rtl::OUString getDownloadDestination() const; |
| |
| // stores the local file name of a just started download |
| void storeLocalFileName(const rtl::OUString& rFileName, sal_Int64 nFileSize); |
| |
| // Removes the local file name of a download |
| void clearLocalFileName(); |
| |
| // Stores the bool value for manually paused downloads |
| void storeDownloadPaused(bool paused); |
| |
| // Returns the directory that acts as the user's desktop |
| static rtl::OUString getDesktopDirectory(); |
| |
| // Returns a directory accessible for all users |
| static rtl::OUString getAllUsersDirectory(); |
| |
| // store and retrieve information about extensions |
| bool storeExtensionVersion( const rtl::OUString& rExtensionName, |
| const rtl::OUString& rVersion ); |
| bool checkExtensionVersion( const rtl::OUString& rExtensionName, |
| const rtl::OUString& rVersion ); |
| |
| // XElementAccess |
| virtual ::com::sun::star::uno::Type SAL_CALL getElementType( ) |
| throw (::com::sun::star::uno::RuntimeException); |
| virtual sal_Bool SAL_CALL hasElements( ) |
| throw (::com::sun::star::uno::RuntimeException); |
| |
| // XNameAccess |
| virtual ::com::sun::star::uno::Any SAL_CALL getByName( const ::rtl::OUString& aName ) |
| throw (::com::sun::star::container::NoSuchElementException, |
| ::com::sun::star::lang::WrappedTargetException, |
| ::com::sun::star::uno::RuntimeException); |
| virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getElementNames( ) |
| throw (::com::sun::star::uno::RuntimeException); |
| virtual ::sal_Bool SAL_CALL hasByName( const ::rtl::OUString& aName ) |
| throw (::com::sun::star::uno::RuntimeException); |
| |
| // XNameReplace |
| virtual void SAL_CALL replaceByName( const ::rtl::OUString& aName, const ::com::sun::star::uno::Any& aElement ) |
| throw (::com::sun::star::lang::IllegalArgumentException, |
| ::com::sun::star::container::NoSuchElementException, |
| ::com::sun::star::lang::WrappedTargetException, |
| ::com::sun::star::uno::RuntimeException); |
| |
| // XChangesBatch |
| virtual void SAL_CALL commitChanges( ) |
| throw (::com::sun::star::lang::WrappedTargetException, |
| ::com::sun::star::uno::RuntimeException); |
| virtual ::sal_Bool SAL_CALL hasPendingChanges( ) |
| throw (::com::sun::star::uno::RuntimeException); |
| virtual ::com::sun::star::uno::Sequence< ::com::sun::star::util::ElementChange > SAL_CALL getPendingChanges( ) |
| throw (::com::sun::star::uno::RuntimeException); |
| |
| // XServiceInfo |
| virtual rtl::OUString SAL_CALL getImplementationName() |
| throw (::com::sun::star::uno::RuntimeException); |
| virtual sal_Bool SAL_CALL supportsService(rtl::OUString const & serviceName) |
| throw (::com::sun::star::uno::RuntimeException); |
| virtual ::com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames() |
| throw (::com::sun::star::uno::RuntimeException); |
| |
| private: |
| |
| static rtl::OUString getSubVersion( const rtl::OUString& rVersion, sal_Int32 *nIndex ); |
| static bool isVersionGreater( const rtl::OUString& rVersion1, const rtl::OUString& rVersion2 ); |
| |
| const ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameContainer > m_xContainer; |
| const ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameContainer > m_xAvailableUpdates; |
| const ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameContainer > m_xIgnoredUpdates; |
| const ::rtl::Reference< UpdateCheckConfigListener > m_rListener; |
| }; |
| |
| //------------------------------------------------------------------------------ |
| |
| |
| template <typename T> |
| T getValue( const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::NamedValue >& rNamedValues, const sal_Char * pszName ) |
| throw (::com::sun::star::uno::RuntimeException) |
| { |
| for( sal_Int32 n=0; n < rNamedValues.getLength(); n++ ) |
| { |
| // Unfortunatly gcc-3.3 does not like Any.get<T>(); |
| if( rNamedValues[n].Name.equalsAscii( pszName ) ) |
| { |
| T value = T(); |
| if( ! (rNamedValues[n].Value >>= value) ) |
| throw ::com::sun::star::uno::RuntimeException( |
| ::rtl::OUString( |
| cppu_Any_extraction_failure_msg( |
| &rNamedValues[n].Value, |
| ::cppu::getTypeFavourUnsigned(&value).getTypeLibType() ), |
| SAL_NO_ACQUIRE ), |
| ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >() ); |
| |
| return value; |
| } |
| } |
| |
| return T(); |
| } |