15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 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_DOWNLOAD_ALL_DOWNLOAD_ITEM_NOTIFIER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_DOWNLOAD_ALL_DOWNLOAD_ITEM_NOTIFIER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_manager.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_item.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// AllDownloadItemNotifier observes ALL the DownloadItems on a given
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DownloadManager.
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Clients should use GetManager() instead of storing their own pointer to the
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// manager so that they can be sensitive to managers that have gone down.
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Example Usage:
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// class DownloadSystemConsumer : public AllDownloadItemNotifier::Observer {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  public:
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   DownloadSystemConsumer(content::DownloadManager* original_manager,
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//            content::DownloadManager* incognito_manager)
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//     : original_notifier_(original_manager, this),
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//       incognito_notifier_(incognito_manager, this) {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   }
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   virtual void OnDownloadUpdated(
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     content::DownloadManager* manager, content::DownloadItem* item) { ... }
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  private:
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   AllDownloadItemNotifier original_notifier_;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   AllDownloadItemNotifier incognito_notifier_;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// };
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class AllDownloadItemNotifier : public content::DownloadManager::Observer,
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                public content::DownloadItem::Observer {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All of the methods take the DownloadManager so that subclasses can observe
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // multiple managers at once and easily distinguish which manager a given item
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // belongs to.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class Observer {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Observer() {}
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~Observer() {}
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void OnDownloadCreated(
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::DownloadManager* manager, content::DownloadItem* item) {}
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void OnDownloadUpdated(
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::DownloadManager* manager, content::DownloadItem* item) {}
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void OnDownloadOpened(
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::DownloadManager* manager, content::DownloadItem* item) {}
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void OnDownloadRemoved(
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::DownloadManager* manager, content::DownloadItem* item) {}
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(Observer);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AllDownloadItemNotifier(content::DownloadManager* manager,
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          Observer* observer);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~AllDownloadItemNotifier();
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns NULL if the manager has gone down.
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::DownloadManager* GetManager() const { return manager_; }
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // content::DownloadManager::Observer
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ManagerGoingDown(content::DownloadManager* manager) OVERRIDE;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnDownloadCreated(content::DownloadManager* manager,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                content::DownloadItem* item) OVERRIDE;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // content::DownloadItem::Observer
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnDownloadUpdated(content::DownloadItem* item) OVERRIDE;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnDownloadOpened(content::DownloadItem* item) OVERRIDE;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnDownloadRemoved(content::DownloadItem* item) OVERRIDE;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnDownloadDestroyed(content::DownloadItem* item) OVERRIDE;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::DownloadManager* manager_;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AllDownloadItemNotifier::Observer* observer_;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<content::DownloadItem*> observing_;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AllDownloadItemNotifier);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_DOWNLOAD_ALL_DOWNLOAD_ITEM_NOTIFIER_H_
87