1// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#ifndef CHROME_BROWSER_SYNC_GLUE_FOREIGN_SESSION_TRACKER_H_ 6#define CHROME_BROWSER_SYNC_GLUE_FOREIGN_SESSION_TRACKER_H_ 7#pragma once 8 9#include <map> 10#include <set> 11#include <string> 12#include <vector> 13 14#include "base/basictypes.h" 15#include "base/memory/scoped_vector.h" 16#include "chrome/browser/sessions/session_id.h" 17#include "chrome/browser/sessions/session_types.h" 18 19namespace browser_sync { 20 21// Class to manage foreign sessions. The tracker will own all ForeignSession 22// and SessionTab objects it creates, and deletes them appropriately on 23// destruction. 24class ForeignSessionTracker { 25 public: 26 ForeignSessionTracker(); 27 ~ForeignSessionTracker(); 28 29 // Fill a preallocated vector with all foreign sessions we're tracking. 30 // Returns true if we had foreign sessions to fill it with, false otherwise. 31 bool LookupAllForeignSessions(std::vector<const ForeignSession*>* sessions); 32 33 // Attempts to look up the session windows associatd with the foreign session 34 // given by |foreign_session_tag|. 35 // If lookup succeeds: 36 // - Fills windows with the SessionWindow pointers, returns true. 37 // Else 38 // - Returns false. 39 bool LookupSessionWindows(const std::string& foreign_session_tag, 40 std::vector<SessionWindow*>* windows); 41 42 // Attempts to look up the foreign tab associated with the given tag and tab 43 // id. 44 // If lookup succeeds: 45 // - Sets tab to point to the SessionTab, and returns true. 46 // Else 47 // - Returns false, tab is set to NULL. 48 bool LookupSessionTab(const std::string& foreign_session_tag, 49 SessionID::id_type tab_id, 50 const SessionTab** tab); 51 52 // Returns a pointer to the ForeignSession object associated with 53 // foreign_session_tag. If none exists, creates one and returns its pointer. 54 ForeignSession* GetForeignSession(const std::string& foreign_session_tag); 55 56 // Deletes the foreign session associated with |foreign_session_tag| if it 57 // exists. 58 // Returns true if the session existed and was deleted, false otherwise. 59 bool DeleteForeignSession(const std::string& foreign_session_tag); 60 61 // Returns a pointer to the SessionTab object associated with |tab_id| for 62 // the session specified with |foreign_session_tag|. If none exists, creates 63 // one and returns its pointer. 64 // |has_window| determines if newly created tabs are added to the pool of 65 // orphaned tabs (thos which can't be reached by traversing foreign sessions). 66 SessionTab* GetSessionTab(const std::string& foreign_session_tag, 67 SessionID::id_type tab_id, 68 bool has_window); 69 70 // Free the memory for all dynamically allocated objects and clear the 71 // tracking structures. 72 void clear(); 73 74 inline bool empty() { 75 return foreign_tab_map_.empty() && foreign_session_map_.empty(); 76 } 77 78 inline size_t num_foreign_sessions() { 79 return foreign_session_map_.size(); 80 } 81 82 inline size_t num_foreign_tabs(const std::string& foreign_session_tag) { 83 if (foreign_tab_map_.find(foreign_session_tag) != foreign_tab_map_.end()) { 84 return foreign_tab_map_[foreign_session_tag]->size(); 85 } else { 86 return 0; 87 } 88 } 89 private: 90 // Datatypes for accessing foreign tab data. 91 typedef std::map<SessionID::id_type, SessionTab*> IDToSessionTabMap; 92 typedef std::map<std::string, IDToSessionTabMap*> ForeignTabMap; 93 typedef std::map<std::string, ForeignSession*> ForeignSessionMap; 94 95 // Per foreign client mapping of their tab id's to their SessionTab objects. 96 ForeignTabMap foreign_tab_map_; 97 98 // Map of foreign sessions, accessed by the foreign client id. 99 ForeignSessionMap foreign_session_map_; 100 101 // The set of foreign tabs that we have seen, and created SessionTab objects 102 // for, but have not yet mapped to ForeignSessions. These are temporarily 103 // orphaned tabs, and won't be deleted if we delete foreign_session_map_. 104 std::set<SessionTab*> unmapped_tabs_; 105 106 DISALLOW_COPY_AND_ASSIGN(ForeignSessionTracker); 107}; 108 109} // namespace browser_sync 110 111#endif // CHROME_BROWSER_SYNC_GLUE_FOREIGN_SESSION_TRACKER_H_ 112