upgrade_detector_impl.h revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_UPGRADE_DETECTOR_IMPL_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_UPGRADE_DETECTOR_IMPL_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/timer.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/upgrade_detector.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename T> struct DefaultSingletonTraits; 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class UpgradeDetectorImpl : public UpgradeDetector { 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~UpgradeDetectorImpl(); 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the singleton instance. 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static UpgradeDetectorImpl* GetInstance(); 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend struct DefaultSingletonTraits<UpgradeDetectorImpl>; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpgradeDetectorImpl(); 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start the timer that will call |CheckForUpgrade()|. 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void StartTimerForUpgradeCheck(); 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Launches a task on the file thread to check if we have the latest version. 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CheckForUpgrade(); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sends out a notification and starts a one shot timer to wait until 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // notifying the user. 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void UpgradeDetected(UpgradeAvailable upgrade_available); 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns true after calling UpgradeDetected if current install is outdated. 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool DetectOutdatedInstall(); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The function that sends out a notification (after a certain time has 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // elapsed) that lets the rest of the UI know we should start notifying the 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // user that a new version is available. 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NotifyOnUpgrade(); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Called on the FILE thread to detect an upgrade. Calls back UpgradeDetected 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // on the UI thread if so. Although it looks weird, this needs to be a static 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // method receiving a WeakPtr<> to this object so that we can interrupt 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the UpgradeDetected callback before it runs. Having this method non-static 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // and using |this| directly wouldn't be thread safe. And keeping it as a 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // non-class function would prevent it from calling UpgradeDetected. 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static void DetectUpgradeTask( 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::WeakPtr<UpgradeDetectorImpl> upgrade_detector); 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We periodically check to see if Chrome has been upgraded. 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::RepeatingTimer<UpgradeDetectorImpl> detect_upgrade_timer_; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // After we detect an upgrade we start a recurring timer to see if enough time 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // has passed and we should start notifying the user. 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::RepeatingTimer<UpgradeDetectorImpl> upgrade_notification_timer_; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We use this factory to create callback tasks for UpgradeDetected. We pass 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the task to the actual upgrade detection code, which is in 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DetectUpgradeTask. 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WeakPtrFactory<UpgradeDetectorImpl> weak_factory_; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // True if this build is a dev or canary channel build. 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_unstable_channel_; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The date the binaries were built. 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Time build_date_; 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(UpgradeDetectorImpl); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_UPGRADE_DETECTOR_IMPL_H_ 76