/************************************************************** * * 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 #include #include #include #include #include #include #include #include "updateinfo.hxx" #include "updatecheckconfiglistener.hxx" #include "actionlistener.hxx" #include "updatehdl.hxx" #include "download.hxx" class UpdateCheck; class UpdateCheckConfig; class UpdateCheckInitData { public: inline rtl::Reference< UpdateCheck > SAL_CALL operator() () const; }; class WorkerThread : public osl::Thread { public: virtual void SAL_CALL cancel() = 0; }; class UpdateCheck : public UpdateCheckConfigListener, public IActionListener, public DownloadInteractionHandler, public salhelper::ReferenceObject, public rtl::StaticWithInit< rtl::Reference< UpdateCheck >, UpdateCheckInitData > { UpdateCheck() : m_eState(NOT_INITIALIZED), m_eUpdateState(UPDATESTATES_COUNT), m_pThread(NULL) {}; public: inline SAL_CALL operator rtl::Reference< UpdateCheckConfigListener > () { return static_cast< UpdateCheckConfigListener * > (this); } void initialize(const com::sun::star::uno::Sequence& rValues, const com::sun::star::uno::Reference& xContext); /* Returns an instance of the specified service obtained from the specified * component context */ static com::sun::star::uno::Reference< com::sun::star::uno::XInterface > createService( const rtl::OUString& aServiceName, const com::sun::star::uno::Reference& xContext); // Update internal update info member void setUpdateInfo(const UpdateInfo& aInfo); /* This method turns on the menubar icon, triggers the bubble window or * updates the dialog text when appropriate */ void setUIState(UpdateState eState, bool suppressBubble = false); // Returns the UI state that matches rInfo best static UpdateState getUIState(const UpdateInfo& rInfo); // Check for updates failed void setCheckFailedState(); // Executes the update check dialog for manual checks and downloads interaction void showDialog(bool forceCheck = false); // Returns true if the update dialog is currently showing bool isDialogShowing() const; bool shouldShowExtUpdDlg() const { return ( m_bShowExtUpdDlg && m_bHasExtensionUpdate ); } void showExtensionDialog(); void setHasExtensionUpdates( bool bHasUpdates ) { m_bHasExtensionUpdate = bHasUpdates; } bool hasOfficeUpdate() const { return (m_aUpdateInfo.BuildId.getLength() > 0); } // DownloadInteractionHandler virtual bool downloadTargetExists(const rtl::OUString& rFileName); virtual void downloadStalled(const rtl::OUString& rErrorMessage); virtual void downloadProgressAt(sal_Int8 nProcent); virtual void downloadStarted(const rtl::OUString& rLocalFileName, sal_Int64 nFileSize); virtual void downloadFinished(const rtl::OUString& rLocalFileName); // checks if the download target already exists and asks user what to do next virtual bool checkDownloadDestination( const rtl::OUString& rFile ); // Cancels the download action (and resumes checking if enabled) void cancelDownload(); // Returns the XInteractionHandler of the UpdateHandler instance if present (and visible) com::sun::star::uno::Reference< com::sun::star::task::XInteractionHandler > getInteractionHandler() const; // UpdateCheckConfigListener virtual void autoCheckStatusChanged(bool enabled); virtual void autoCheckIntervalChanged(); // IActionListener void cancel(); void download(); void install(); void pause(); void resume(); void closeAfterFailure(); // rtl::IReference virtual oslInterlockedCount SAL_CALL acquire() SAL_THROW(()); virtual oslInterlockedCount SAL_CALL release() SAL_THROW(()); private: // Schedules or cancels next automatic check for updates void enableAutoCheck(bool enable); // Starts/resumes or stops a download void enableDownload(bool enable, bool paused=false); // Shuts down the currently running thread void shutdownThread(bool join); // Returns the update handler instance rtl::Reference getUpdateHandler(); // Open the given URL in a browser void showReleaseNote(const rtl::OUString& rURL) const; // stores the release note url on disk to be used by setup app static bool storeReleaseNote(sal_Int8 nNum, const rtl::OUString &rURL); /* This method turns on the menubar icon and triggers the bubble window */ void handleMenuBarUI( rtl::Reference< UpdateHandler > rUpdateHandler, UpdateState& eState, bool suppressBubble ); enum State { NOT_INITIALIZED, DISABLED, CHECK_SCHEDULED, DOWNLOADING, DOWNLOAD_PAUSED }; State m_eState; UpdateState m_eUpdateState; mutable osl::Mutex m_aMutex; WorkerThread *m_pThread; osl::Condition m_aCondition; UpdateInfo m_aUpdateInfo; rtl::OUString m_aImageName; bool m_bHasExtensionUpdate; bool m_bShowExtUpdDlg; rtl::Reference m_aUpdateHandler; com::sun::star::uno::Reference m_xMenuBarUI; com::sun::star::uno::Reference m_xContext; friend class UpdateCheckInitData; }; inline rtl::Reference< UpdateCheck > SAL_CALL UpdateCheckInitData::operator() () const { return rtl::Reference< UpdateCheck > (new UpdateCheck()); }