Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5986)

Unified Diff: chrome/browser/sync/glue/foreign_session_tracker.cc

Issue 5705004: [SYNC] Sessions datatype refactor. Most things related to sessions under-the-... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Rebase Created 9 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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
« no previous file with comments | « chrome/browser/sync/glue/foreign_session_tracker.h ('k') | chrome/browser/sync/glue/session_change_processor.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698