Index: chrome/browser/sync/glue/foreign_session_tracker.cc |
=================================================================== |
--- chrome/browser/sync/glue/foreign_session_tracker.cc (revision 0) |
+++ chrome/browser/sync/glue/foreign_session_tracker.cc (revision 0) |
@@ -0,0 +1,143 @@ |
+// Copyright (c) 2010 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. |
+ |
+#include "chrome/browser/sync/glue/foreign_session_tracker.h" |
+#include "chrome/browser/sync/glue/session_model_associator.h" |
+ |
+namespace browser_sync { |
+ |
+ |
+ForeignSessionTracker::ForeignSessionTracker() { |
+} |
+ |
+ForeignSessionTracker::~ForeignSessionTracker() { |
+ clear(); |
+} |
+ |
+bool ForeignSessionTracker::LookupAllForeignSessions( |
+ std::vector<const ForeignSession*>* sessions) { |
+ DCHECK(sessions); |
+ // Fill vector of sessions from our foreign session map. |
+ for (ForeignSessionMap::const_iterator i = |
+ foreign_session_map_.begin(); i != foreign_session_map_.end(); ++i) { |
+ // Only include sessions with open tabs. |
+ ForeignSession* foreign_session = i->second; |
+ if (foreign_session->windows.size() > 0 && |
+ !SessionModelAssociator::SessionWindowHasNoTabsToSync( |
+ *foreign_session->windows[0])) { |
+ sessions->push_back(foreign_session); |
+ } |
+ } |
+ |
+ if (sessions->size() > 0) |
+ return true; |
+ else |
+ return false; |
+} |
+ |
+bool ForeignSessionTracker::LookupSessionWindows( |
+ const std::string& foreign_session_tag, |
+ std::vector<SessionWindow*>* windows) { |
+ DCHECK(windows); |
+ ForeignSessionMap::iterator iter = foreign_session_map_.find( |
+ foreign_session_tag); |
+ if (iter == foreign_session_map_.end()) |
+ return false; |
+ *windows = iter->second->windows; |
+ return true; |
+} |
+ |
+bool ForeignSessionTracker::LookupSessionTab( |
+ const std::string& tag, |
+ SessionID::id_type tab_id, |
+ const SessionTab** tab) { |
+ DCHECK(tab); |
+ if (foreign_tab_map_.find(tag) == foreign_tab_map_.end()) { |
+ // We have no record of this session. |
+ *tab = NULL; |
+ return false; |
+ } |
+ if (foreign_tab_map_[tag]->find(tab_id) == foreign_tab_map_[tag]->end()) { |
+ // We have no record of this tab. |
+ *tab = NULL; |
+ return false; |
+ } |
+ *tab = (*foreign_tab_map_[tag])[tab_id]; |
+ return true; |
+} |
+ |
+ForeignSession* ForeignSessionTracker::GetForeignSession( |
+ const std::string& foreign_session_tag) { |
+ scoped_ptr<ForeignSession> foreign_session; |
+ if (foreign_session_map_.find(foreign_session_tag) != |
+ foreign_session_map_.end()) { |
+ foreign_session.reset(foreign_session_map_[foreign_session_tag]); |
+ } else { |
+ foreign_session.reset(new ForeignSession); |
+ foreign_session->foreign_session_tag = foreign_session_tag; |
+ foreign_session_map_[foreign_session_tag] = foreign_session.get(); |
+ } |
+ DCHECK(foreign_session.get()); |
+ return foreign_session.release(); |
+} |
+ |
+bool ForeignSessionTracker::DeleteForeignSession( |
+ const std::string& foreign_session_tag) { |
+ ForeignSessionMap::iterator iter = |
+ foreign_session_map_.find(foreign_session_tag); |
+ if (iter != foreign_session_map_.end()) { |
+ delete iter->second; // Delete the ForeignSession object. |
+ foreign_session_map_.erase(iter); |
+ return true; |
+ } else { |
+ return false; |
+ } |
+} |
+ |
+SessionTab* ForeignSessionTracker::GetSessionTab( |
+ const std::string& foreign_session_tag, |
+ SessionID::id_type tab_id, |
+ bool has_window) { |
+ if (foreign_tab_map_.find(foreign_session_tag) == foreign_tab_map_.end()) |
+ foreign_tab_map_[foreign_session_tag] = new IDToSessionTabMap; |
+ scoped_ptr<SessionTab> tab; |
+ IDToSessionTabMap::iterator iter = |
+ foreign_tab_map_[foreign_session_tag]->find(tab_id); |
+ if (iter != foreign_tab_map_[foreign_session_tag]->end()) { |
+ tab.reset(iter->second); |
+ if (has_window) // This tab is linked to a window, so it's not an orphan. |
+ unmapped_tabs_.erase(tab.get()); |
+ VLOG(1) << "Associating " << foreign_session_tag << "'s seen tab " << |
+ tab_id << " at " << tab.get(); |
+ } else { |
+ tab.reset(new SessionTab()); |
+ (*foreign_tab_map_[foreign_session_tag])[tab_id] = tab.get(); |
+ if (!has_window) // This tab is not linked to a window, it's an orphan. |
+ unmapped_tabs_.insert(tab.get()); |
+ VLOG(1) << "Associating " << foreign_session_tag << "'s new tab " << |
+ tab_id << " at " << tab.get(); |
+ } |
+ DCHECK(tab.get()); |
+ return tab.release(); |
+} |
+ |
+void ForeignSessionTracker::clear() { |
+ // Delete ForeignSession objects (which also deletes all their windows/tabs). |
+ STLDeleteContainerPairSecondPointers(foreign_session_map_.begin(), |
+ foreign_session_map_.end()); |
+ foreign_session_map_.clear(); |
+ |
+ // Delete IDToSessTab maps. Does not delete the SessionTab objects, because |
+ // they should already be referenced through foreign_session_map_. |
+ STLDeleteContainerPairSecondPointers(foreign_tab_map_.begin(), |
+ foreign_tab_map_.end()); |
+ foreign_tab_map_.clear(); |
+ |
+ // Go through and delete any tabs we had allocated but had not yet placed into |
+ // a ForeignSessionobject. |
+ STLDeleteContainerPointers(unmapped_tabs_.begin(), unmapped_tabs_.end()); |
+ unmapped_tabs_.clear(); |
+} |
+ |
+} // namespace browser_sync |
Property changes on: chrome/browser/sync/glue/foreign_session_tracker.cc |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |