// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROME_BROWSER_CHROMEOS_CONTACTS_CONTACT_MANAGER_H_ #define CHROME_BROWSER_CHROMEOS_CONTACTS_CONTACT_MANAGER_H_ #include <map> #include <vector> #include "base/basictypes.h" #include "base/compiler_specific.h" #include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "base/observer_list.h" #include "base/stl_util.h" #include "chrome/browser/chromeos/contacts/contact_store_observer.h" #include "content/public/browser/notification_observer.h" #include "content/public/browser/notification_registrar.h" class Profile; namespace contacts { class Contact; typedef std::vector<const Contact*> ContactPointers; class ContactManagerObserver; class ContactStore; class ContactStoreFactory; // Class that exposes contacts to rest of the browser. class ContactManagerInterface { public: ContactManagerInterface() {} virtual ~ContactManagerInterface() {} // Returns a weak pointer tied to the lifetime of this object. virtual base::WeakPtr<ContactManagerInterface> GetWeakPtr() = 0; // Adds or removes an observer for changes to |profile|'s contacts. virtual void AddObserver(ContactManagerObserver* observer, Profile* profile) = 0; virtual void RemoveObserver(ContactManagerObserver* observer, Profile* profile) = 0; // Returns pointers to all currently-loaded contacts for |profile|. The // returned Contact objects may not persist indefinitely; the caller must not // refer to them again after unblocking the UI thread. virtual scoped_ptr<ContactPointers> GetAllContacts(Profile* profile) = 0; // Returns the contact identified by |contact_id|. // NULL is returned if the contact doesn't exist. virtual const Contact* GetContactById(Profile* profile, const std::string& contact_id) = 0; private: DISALLOW_COPY_AND_ASSIGN(ContactManagerInterface); }; // Real, singleton implementation of ContactManagerInterface. class ContactManager : public ContactManagerInterface, public ContactStoreObserver, public content::NotificationObserver { public: static ContactManager* GetInstance(); ContactManager(); virtual ~ContactManager(); // Swaps in a new factory to use for creating ContactStores. // Must be called before any stores have been created. void SetContactStoreForTesting(scoped_ptr<ContactStoreFactory> factory); void Init(); // ContactManagerInterface overrides: virtual base::WeakPtr<ContactManagerInterface> GetWeakPtr() OVERRIDE; virtual void AddObserver(ContactManagerObserver* observer, Profile* profile) OVERRIDE; virtual void RemoveObserver(ContactManagerObserver* observer, Profile* profile) OVERRIDE; virtual scoped_ptr<ContactPointers> GetAllContacts(Profile* profile) OVERRIDE; virtual const Contact* GetContactById(Profile* profile, const std::string& contact_id) OVERRIDE; // ContactStoreObserver overrides: virtual void OnContactsUpdated(ContactStore* store) OVERRIDE; // content::NotificationObserver overrides: virtual void Observe(int type, const content::NotificationSource& source, const content::NotificationDetails& details) OVERRIDE; private: typedef ObserverList<ContactManagerObserver> Observers; typedef std::map<Profile*, ContactStore*> ContactStoreMap; typedef std::map<Profile*, Observers*> ProfileObserversMap; // Returns the list of observers interested in |profile|. If not present, // creates a new list if |create| is true and returns NULL otherwise. Observers* GetObserversForProfile(Profile* profile, bool create); // Handles profile creation and destruction. void HandleProfileCreated(Profile* profile); void HandleProfileDestroyed(Profile* profile); content::NotificationRegistrar registrar_; // Maps from a profile to observers that are interested in changes to that // profile's contacts. ProfileObserversMap profile_observers_; // Deletes values in |profile_observers_|. STLValueDeleter<ProfileObserversMap> profile_observers_deleter_; // Creates objects for |contact_stores_|. scoped_ptr<ContactStoreFactory> contact_store_factory_; // Maps from a profile to a store for getting the profile's contacts. ContactStoreMap contact_stores_; // Deletes values in |contact_stores_|. STLValueDeleter<ContactStoreMap> contact_stores_deleter_; // Note: This should remain the last member so it'll be destroyed and // invalidate its weak pointers before any other members are destroyed. base::WeakPtrFactory<ContactManagerInterface> weak_ptr_factory_; DISALLOW_COPY_AND_ASSIGN(ContactManager); }; } // namespace contacts #endif // CHROME_BROWSER_CHROMEOS_CONTACTS_CONTACT_MANAGER_H_