syncapi.h revision 3345a6884c488ff3a535c2c9acdd33d74b37e311
1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2010 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This file defines the "sync API", an interface to the syncer 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// backend that exposes (1) the core functionality of maintaining a consistent 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// local snapshot of a hierarchical object set; (2) a means to transactionally 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// access and modify those objects; (3) a means to control client/server 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// synchronization tasks, namely: pushing local object modifications to a 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// server, pulling nonlocal object modifications from a server to this client, 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// and resolving conflicts that may arise between the two; and (4) an 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// abstraction of some external functionality that is to be provided by the 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// host environment. 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This interface is used as the entry point into the syncer backend 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// when the backend is compiled as a library and embedded in another 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// application. A goal for this interface layer is to depend on very few 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// external types, so that an application can use the sync backend 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// without introducing a dependency on specific types. A non-goal is to 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// have binary compatibility across versions or compilers; this allows the 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// interface to use C++ classes. An application wishing to use the sync API 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// should ideally compile the syncer backend and this API as part of the 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// application's own build, to avoid e.g. mismatches in calling convention, 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// structure padding, or name mangling that could arise if there were a 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// compiler mismatch. 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The schema of the objects in the sync domain is based on the model, which 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// is essentially a hierarchy of items and folders similar to a filesystem, 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// but with a few important differences. The sync API contains fields 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// such as URL to easily allow the embedding application to store web 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// browser bookmarks. Also, the sync API allows duplicate titles in a parent. 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Consequently, it does not support looking up an object by title 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// and parent, since such a lookup is not uniquely determined. Lastly, 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// unlike a filesystem model, objects in the Sync API model have a strict 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// ordering within a parent; the position is manipulable by callers, and 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// children of a node can be enumerated in the order of their position. 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef CHROME_BROWSER_SYNC_ENGINE_SYNCAPI_H_ 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_SYNC_ENGINE_SYNCAPI_H_ 403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string> 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <vector> 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/basictypes.h" 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/gtest_prod_util.h" 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/scoped_ptr.h" 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "build/build_config.h" 493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/sync/protocol/password_specifics.pb.h" 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/syncable/model_type.h" 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/util/cryptographer.h" 523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/common/net/gaia/google_service_auth_error.h" 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "googleurl/src/gurl.h" 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass FilePath; 563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace browser_sync { 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ModelSafeWorkerRegistrar; 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace sessions { 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct SyncSessionSnapshot; 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merricknamespace notifier { 663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickstruct NotifierOptions; 673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Forward declarations of internal class types so that sync API objects 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// may have opaque pointers to these types. 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace syncable { 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass BaseTransaction; 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass DirectoryManager; 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Entry; 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass MutableEntry; 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ReadTransaction; 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ScopedDirLookup; 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass WriteTransaction; 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace sync_pb { 823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass AppSpecifics; 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass AutofillSpecifics; 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass BookmarkSpecifics; 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass EntitySpecifics; 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ExtensionSpecifics; 873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass SessionSpecifics; 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass NigoriSpecifics; 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass PasswordSpecifics; 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass PreferenceSpecifics; 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass PasswordSpecifics; 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass PasswordSpecificsData; 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ThemeSpecifics; 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass TypedUrlSpecifics; 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace sync_api { 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Forward declarations of classes to be defined later in this file. 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass BaseTransaction; 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass HttpPostProviderFactory; 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass SyncManager; 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass WriteTransaction; 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// A UserShare encapsulates the syncable pieces that represent an authenticated 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// user and their data (share). 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This encompasses all pieces required to build transaction objects on the 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// syncable share. 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct UserShare { 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The DirectoryManager itself, which is the parent of Transactions and can 111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // be shared across multiple threads (unlike Directory). 112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<syncable::DirectoryManager> dir_manager; 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // The username of the sync user. 1153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::string name; 1163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}; 1173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Contains everything needed to talk to and identify a user account. 1193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickstruct SyncCredentials { 1203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::string email; 1213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::string sync_token; 122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// A valid BaseNode will never have an ID of zero. 125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic const int64 kInvalidId = 0; 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// BaseNode wraps syncable::Entry, and corresponds to a single object's state. 128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This, like syncable::Entry, is intended for use on the stack. A valid 129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// transaction is necessary to create a BaseNode or any of its children. 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Unlike syncable::Entry, a sync API BaseNode is identified primarily by its 131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// int64 metahandle, which we call an ID here. 132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass BaseNode { 133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // All subclasses of BaseNode must provide a way to initialize themselves by 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // doing an ID lookup. Returns false on failure. An invalid or deleted 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // ID will result in failure. 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual bool InitByIdLookup(int64 id) = 0; 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // All subclasses of BaseNode must also provide a way to initialize themselves 140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // by doing a client tag lookup. Returns false on failure. A deleted node 141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // will return FALSE. 142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual bool InitByClientTagLookup(syncable::ModelType model_type, 143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& tag) = 0; 144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Each object is identified by a 64-bit id (internally, the syncable 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // metahandle). These ids are strictly local handles. They will persist 147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // on this client, but the same object on a different client may have a 148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // different ID value. 149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int64 GetId() const; 150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Nodes are hierarchically arranged into a single-rooted tree. 152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // InitByRootLookup on ReadNode allows access to the root. GetParentId is 153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // how you find a node's parent. 154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int64 GetParentId() const; 155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Nodes are either folders or not. This corresponds to the IS_DIR property 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // of syncable::Entry. 158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool GetIsFolder() const; 159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns the title of the object. 161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Uniqueness of the title is not enforced on siblings -- it is not an error 162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // for two children to share a title. 163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::wstring GetTitle() const; 164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns the model type of this object. The model type is set at node 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // creation time and is expected never to change. 167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch syncable::ModelType GetModelType() const; 168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Getter specific to the BOOKMARK datatype. Returns protobuf 170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // data. Can only be called if GetModelType() == BOOKMARK. 171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const sync_pb::BookmarkSpecifics& GetBookmarkSpecifics() const; 172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Legacy, bookmark-specific getter that wraps GetBookmarkSpecifics() above. 174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns the URL of a bookmark object. 175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // TODO(ncarter): Remove this datatype-specific accessor. 176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL GetURL() const; 177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Legacy, bookmark-specific getter that wraps GetBookmarkSpecifics() above. 179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Fill in a vector with the byte data of this node's favicon. Assumes 180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // that the node is a bookmark. 181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Favicons are expected to be PNG images, and though no verification is 182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // done on the syncapi client of this, the server may reject favicon updates 183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // that are invalid for whatever reason. 184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // TODO(ncarter): Remove this datatype-specific accessor. 185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void GetFaviconBytes(std::vector<unsigned char>* output) const; 186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Getter specific to the APPS datatype. Returns protobuf 1883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // data. Can only be called if GetModelType() == APPS. 1893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const sync_pb::AppSpecifics& GetAppSpecifics() const; 1903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Getter specific to the AUTOFILL datatype. Returns protobuf 192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // data. Can only be called if GetModelType() == AUTOFILL. 193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const sync_pb::AutofillSpecifics& GetAutofillSpecifics() const; 194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Getter specific to the NIGORI datatype. Returns protobuf 196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // data. Can only be called if GetModelType() == NIGORI. 197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const sync_pb::NigoriSpecifics& GetNigoriSpecifics() const; 198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Getter specific to the PASSWORD datatype. Returns protobuf 200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // data. Can only be called if GetModelType() == PASSWORD. 201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const sync_pb::PasswordSpecificsData& GetPasswordSpecifics() const; 202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Getter specific to the PREFERENCE datatype. Returns protobuf 204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // data. Can only be called if GetModelType() == PREFERENCE. 205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const sync_pb::PreferenceSpecifics& GetPreferenceSpecifics() const; 206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Getter specific to the THEME datatype. Returns protobuf 208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // data. Can only be called if GetModelType() == THEME. 209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const sync_pb::ThemeSpecifics& GetThemeSpecifics() const; 210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Getter specific to the TYPED_URLS datatype. Returns protobuf 212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // data. Can only be called if GetModelType() == TYPED_URLS. 213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const sync_pb::TypedUrlSpecifics& GetTypedUrlSpecifics() const; 214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Getter specific to the EXTENSIONS datatype. Returns protobuf 216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // data. Can only be called if GetModelType() == EXTENSIONS. 217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const sync_pb::ExtensionSpecifics& GetExtensionSpecifics() const; 218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 2193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Getter specific to the SESSIONS datatype. Returns protobuf 2203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // data. Can only be called if GetModelType() == SESSIONS. 2213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const sync_pb::SessionSpecifics& GetSessionSpecifics() const; 2223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns the local external ID associated with the node. 224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int64 GetExternalId() const; 225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Return the ID of the node immediately before this in the sibling order. 227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // For the first node in the ordering, return 0. 228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int64 GetPredecessorId() const; 229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Return the ID of the node immediately after this in the sibling order. 231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // For the last node in the ordering, return 0. 232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int64 GetSuccessorId() const; 233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Return the ID of the first child of this node. If this node has no 235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // children, return 0. 236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int64 GetFirstChildId() const; 237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // These virtual accessors provide access to data members of derived classes. 239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual const syncable::Entry* GetEntry() const = 0; 240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual const BaseTransaction* GetTransaction() const = 0; 241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected: 243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BaseNode(); 244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual ~BaseNode(); 245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The server has a size limit on client tags, so we generate a fixed length 246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // hash locally. This also ensures that ModelTypes have unique namespaces. 247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static std::string GenerateSyncableHash(syncable::ModelType model_type, 248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& client_tag); 249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Determines whether part of the entry is encrypted, and if so attempts to 251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // decrypt it. Unless decryption is necessary and fails, this will always 252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // return |true|. 253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool DecryptIfNecessary(syncable::Entry* entry); 254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Node is meant for stack use only. 257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void* operator new(size_t size); 258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // If this node represents a password, this field will hold the actual 260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // decrypted password data. 261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<sync_pb::PasswordSpecificsData> password_data_; 262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch friend class SyncApiTest; 264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FRIEND_TEST_ALL_PREFIXES(SyncApiTest, GenerateSyncableHash); 265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DISALLOW_COPY_AND_ASSIGN(BaseNode); 267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// WriteNode extends BaseNode to add mutation, and wraps 270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// syncable::MutableEntry. A WriteTransaction is needed to create a WriteNode. 271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass WriteNode : public BaseNode { 272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Create a WriteNode using the given transaction. 274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch explicit WriteNode(WriteTransaction* transaction); 275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual ~WriteNode(); 276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // A client must use one (and only one) of the following Init variants to 278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // populate the node. 279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // BaseNode implementation. 281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual bool InitByIdLookup(int64 id); 282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual bool InitByClientTagLookup(syncable::ModelType model_type, 283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& tag); 284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Create a new node with the specified parent and predecessor. |model_type| 286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // dictates the type of the item, and controls which EntitySpecifics proto 287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // extension can be used with this item. Use a NULL |predecessor| 288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // to indicate that this is to be the first child. 289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // |predecessor| must be a child of |new_parent| or NULL. Returns false on 290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // failure. 291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool InitByCreation(syncable::ModelType model_type, 292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const BaseNode& parent, 293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const BaseNode* predecessor); 294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Create nodes using this function if they're unique items that 296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // you want to fetch using client_tag. Note that the behavior of these 297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // items is slightly different than that of normal items. 298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Most importantly, if it exists locally, this function will 299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // actually undelete it 300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Client unique tagged nodes must NOT be folders. 301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool InitUniqueByCreation(syncable::ModelType model_type, 302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const BaseNode& parent, 303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& client_tag); 304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Each server-created permanent node is tagged with a unique string. 306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Look up the node with the particular tag. If it does not exist, 307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // return false. 308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool InitByTagLookup(const std::string& tag); 309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // These Set() functions correspond to the Get() functions of BaseNode. 311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void SetIsFolder(bool folder); 312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void SetTitle(const std::wstring& title); 313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // External ID is a client-only field, so setting it doesn't cause the item to 315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // be synced again. 316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void SetExternalId(int64 external_id); 317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Remove this node and its children. 319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void Remove(); 320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Set a new parent and position. Position is specified by |predecessor|; if 322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // it is NULL, the node is moved to the first position. |predecessor| must 323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // be a child of |new_parent| or NULL. Returns false on failure.. 324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool SetPosition(const BaseNode& new_parent, const BaseNode* predecessor); 325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Set the bookmark specifics (url and favicon). 327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Should only be called if GetModelType() == BOOKMARK. 328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void SetBookmarkSpecifics(const sync_pb::BookmarkSpecifics& specifics); 329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Legacy, bookmark-specific setters that wrap SetBookmarkSpecifics() above. 331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Should only be called if GetModelType() == BOOKMARK. 332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // TODO(ncarter): Remove these two datatype-specific accessors. 333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void SetURL(const GURL& url); 334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void SetFaviconBytes(const std::vector<unsigned char>& bytes); 335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 3363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Set the app specifics (id, update url, enabled state, etc). 3373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Should only be called if GetModelType() == APPS. 3383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void SetAppSpecifics(const sync_pb::AppSpecifics& specifics); 3393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Set the autofill specifics (name and value). 341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Should only be called if GetModelType() == AUTOFILL. 342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void SetAutofillSpecifics(const sync_pb::AutofillSpecifics& specifics); 343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Set the nigori specifics. 345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Should only be called if GetModelType() == NIGORI. 346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void SetNigoriSpecifics(const sync_pb::NigoriSpecifics& specifics); 347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Set the password specifics. 349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Should only be called if GetModelType() == PASSWORD. 350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void SetPasswordSpecifics(const sync_pb::PasswordSpecificsData& specifics); 351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Set the preference specifics (name and value). 353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Should only be called if GetModelType() == PREFERENCE. 354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void SetPreferenceSpecifics(const sync_pb::PreferenceSpecifics& specifics); 355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Set the theme specifics (name and value). 357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Should only be called if GetModelType() == THEME. 358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void SetThemeSpecifics(const sync_pb::ThemeSpecifics& specifics); 359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Set the typed_url specifics (url, title, typed_count, etc). 361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Should only be called if GetModelType() == TYPED_URLS. 362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void SetTypedUrlSpecifics(const sync_pb::TypedUrlSpecifics& specifics); 363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 364c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Set the extension specifics (id, update url, enabled state, etc). 365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Should only be called if GetModelType() == EXTENSIONS. 366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void SetExtensionSpecifics(const sync_pb::ExtensionSpecifics& specifics); 367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 3683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Set the session specifics (windows, tabs, navigations etc.). 3693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Should only be called if GetModelType() == SESSIONS. 3703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void SetSessionSpecifics(const sync_pb::SessionSpecifics& specifics); 3713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Implementation of BaseNode's abstract virtual accessors. 373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual const syncable::Entry* GetEntry() const; 374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual const BaseTransaction* GetTransaction() const; 376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 378c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void* operator new(size_t size); // Node is meant for stack use only. 379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Helper to set model type. This will clear any specifics data. 381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void PutModelType(syncable::ModelType model_type); 382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Helper to set the previous node. 384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void PutPredecessor(const BaseNode* predecessor); 385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Private helpers to set type-specific protobuf data. These don't 387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // do any checking on the previous modeltype, so they can be used 388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // for internal initialization (you can use them to set the modeltype). 389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Additionally, they will mark for syncing if the underlying value 390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // changes. 3913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void PutAppSpecificsAndMarkForSyncing( 3923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const sync_pb::AppSpecifics& new_value); 393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void PutAutofillSpecificsAndMarkForSyncing( 394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const sync_pb::AutofillSpecifics& new_value); 395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void PutBookmarkSpecificsAndMarkForSyncing( 396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const sync_pb::BookmarkSpecifics& new_value); 397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void PutNigoriSpecificsAndMarkForSyncing( 398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const sync_pb::NigoriSpecifics& new_value); 399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void PutPasswordSpecificsAndMarkForSyncing( 400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const sync_pb::PasswordSpecifics& new_value); 401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void PutPreferenceSpecificsAndMarkForSyncing( 402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const sync_pb::PreferenceSpecifics& new_value); 403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void PutThemeSpecificsAndMarkForSyncing( 404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const sync_pb::ThemeSpecifics& new_value); 405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void PutTypedUrlSpecificsAndMarkForSyncing( 406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const sync_pb::TypedUrlSpecifics& new_value); 407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void PutExtensionSpecificsAndMarkForSyncing( 408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const sync_pb::ExtensionSpecifics& new_value); 4093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void PutSessionSpecificsAndMarkForSyncing( 4103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const sync_pb::SessionSpecifics& new_value); 411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void PutSpecificsAndMarkForSyncing( 412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const sync_pb::EntitySpecifics& specifics); 413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Sets IS_UNSYNCED and SYNCING to ensure this entry is considered in an 415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // upcoming commit pass. 416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void MarkForSyncing(); 417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The underlying syncable object which this class wraps. 419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch syncable::MutableEntry* entry_; 420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The sync API transaction that is the parent of this node. 422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteTransaction* transaction_; 423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DISALLOW_COPY_AND_ASSIGN(WriteNode); 425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// ReadNode wraps a syncable::Entry to provide the functionality of a 428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// read-only BaseNode. 429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ReadNode : public BaseNode { 430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Create an unpopulated ReadNode on the given transaction. Call some flavor 432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // of Init to populate the ReadNode with a database entry. 433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch explicit ReadNode(const BaseTransaction* transaction); 434c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual ~ReadNode(); 435c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 436c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // A client must use one (and only one) of the following Init variants to 437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // populate the node. 438c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // BaseNode implementation. 440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual bool InitByIdLookup(int64 id); 441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual bool InitByClientTagLookup(syncable::ModelType model_type, 442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& tag); 443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 444c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // There is always a root node, so this can't fail. The root node is 445c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // never mutable, so root lookup is only possible on a ReadNode. 446c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void InitByRootLookup(); 447c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 448c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Each server-created permanent node is tagged with a unique string. 449c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Look up the node with the particular tag. If it does not exist, 450c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // return false. 451c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool InitByTagLookup(const std::string& tag); 452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 453c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Implementation of BaseNode's abstract virtual accessors. 454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual const syncable::Entry* GetEntry() const; 455c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual const BaseTransaction* GetTransaction() const; 456c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 457c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 458c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void* operator new(size_t size); // Node is meant for stack use only. 459c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 460c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The underlying syncable object which this class wraps. 461c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch syncable::Entry* entry_; 462c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 463c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The sync API transaction that is the parent of this node. 464c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const BaseTransaction* transaction_; 465c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 466c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DISALLOW_COPY_AND_ASSIGN(ReadNode); 467c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 468c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 469c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Sync API's BaseTransaction, ReadTransaction, and WriteTransaction allow for 470c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// batching of several read and/or write operations. The read and write 471c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// operations are performed by creating ReadNode and WriteNode instances using 472c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// the transaction. These transaction classes wrap identically named classes in 473c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// syncable, and are used in a similar way. Unlike syncable::BaseTransaction, 474c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// whose construction requires an explicit syncable::ScopedDirLookup, a sync 475c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// API BaseTransaction creates its own ScopedDirLookup implicitly. 476c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass BaseTransaction { 477c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 478c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Provide access to the underlying syncable.h objects from BaseNode. 479c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual syncable::BaseTransaction* GetWrappedTrans() const = 0; 480c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const syncable::ScopedDirLookup& GetLookup() const { return *lookup_; } 481c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser_sync::Cryptographer* GetCryptographer() const { 482c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return cryptographer_; 483c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 484c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 485c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected: 486c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The ScopedDirLookup is created in the constructor and destroyed 487c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // in the destructor. Creation of the ScopedDirLookup is not expected 488c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // to fail. 489c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch explicit BaseTransaction(UserShare* share); 490c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual ~BaseTransaction(); 491c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 492c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 493c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // A syncable ScopedDirLookup, which is the parent of syncable transactions. 494c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch syncable::ScopedDirLookup* lookup_; 495c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 496c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser_sync::Cryptographer* cryptographer_; 497c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 498c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DISALLOW_COPY_AND_ASSIGN(BaseTransaction); 499c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 500c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 501c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Sync API's ReadTransaction is a read-only BaseTransaction. It wraps 502c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// a syncable::ReadTransaction. 503c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ReadTransaction : public BaseTransaction { 504c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 505c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Start a new read-only transaction on the specified repository. 506c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch explicit ReadTransaction(UserShare* share); 507c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 508c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Resume the middle of a transaction. Will not close transaction. 509c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ReadTransaction(UserShare* share, syncable::BaseTransaction* trans); 510c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 511c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual ~ReadTransaction(); 512c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 513c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // BaseTransaction override. 514c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual syncable::BaseTransaction* GetWrappedTrans() const; 515c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 516c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void* operator new(size_t size); // Transaction is meant for stack use only. 517c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 518c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The underlying syncable object which this class wraps. 519c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch syncable::BaseTransaction* transaction_; 520c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool close_transaction_; 521c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 522c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DISALLOW_COPY_AND_ASSIGN(ReadTransaction); 523c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 524c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 525c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Sync API's WriteTransaction is a read/write BaseTransaction. It wraps 526c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// a syncable::WriteTransaction. 527c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass WriteTransaction : public BaseTransaction { 528c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 529c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Start a new read/write transaction. 530c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch explicit WriteTransaction(UserShare* share); 531c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual ~WriteTransaction(); 532c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 533c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Provide access to the syncable.h transaction from the API WriteNode. 534c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual syncable::BaseTransaction* GetWrappedTrans() const; 535c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch syncable::WriteTransaction* GetWrappedWriteTrans() { return transaction_; } 536c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 537c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 538c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void* operator new(size_t size); // Transaction is meant for stack use only. 539c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 540c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The underlying syncable object which this class wraps. 541c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch syncable::WriteTransaction* transaction_; 542c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 543c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DISALLOW_COPY_AND_ASSIGN(WriteTransaction); 544c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 545c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 546c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// SyncManager encapsulates syncable::DirectoryManager and serves as the parent 547c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// of all other objects in the sync API. SyncManager is thread-safe. If 548c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// multiple threads interact with the same local sync repository (i.e. the 549c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// same sqlite database), they should share a single SyncManager instance. The 550c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// caller should typically create one SyncManager for the lifetime of a user 551c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// session. 552c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass SyncManager { 553c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 554c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // SyncInternal contains the implementation of SyncManager, while abstracting 555c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // internal types from clients of the interface. 556c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch class SyncInternal; 557c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // TODO(tim): Depending on how multi-type encryption pans out, maybe we 5593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // should turn ChangeRecord itself into a class. Or we could template this 5603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // wrapper / add a templated method to return unencrypted protobufs. 5613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick class ExtraChangeRecordData { 5623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public: 5633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ExtraChangeRecordData() {} 5643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick virtual ~ExtraChangeRecordData() {} 5653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick }; 5663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 567c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // ChangeRecord indicates a single item that changed as a result of a sync 568c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // operation. This gives the sync id of the node that changed, and the type 569c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // of change. To get the actual property values after an ADD or UPDATE, the 570c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // client should get the node with InitByIdLookup(), using the provided id. 571c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch struct ChangeRecord { 572c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch enum Action { 573c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ACTION_ADD, 574c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ACTION_DELETE, 575c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ACTION_UPDATE, 576c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 577c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ChangeRecord() : id(kInvalidId), action(ACTION_ADD) {} 578c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int64 id; 579c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Action action; 580c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sync_pb::EntitySpecifics specifics; 5813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick linked_ptr<ExtraChangeRecordData> extra; 5823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick }; 5833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 5843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Since PasswordSpecifics is just an encrypted blob, we extend to provide 5853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // access to unencrypted bits. 5863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick class ExtraPasswordChangeRecordData : public ExtraChangeRecordData { 5873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public: 5883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ExtraPasswordChangeRecordData(const sync_pb::PasswordSpecificsData& data) 5893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick : unencrypted_(data) {} 5903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick virtual ~ExtraPasswordChangeRecordData() {} 5913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const sync_pb::PasswordSpecificsData& unencrypted() { 5923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return unencrypted_; 5933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 5943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private: 5953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick sync_pb::PasswordSpecificsData unencrypted_; 596c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 597c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 598c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Status encapsulates detailed state about the internals of the SyncManager. 599c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch struct Status { 600c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Summary is a distilled set of important information that the end-user may 601c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // wish to be informed about (through UI, for example). Note that if a 602c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // summary state requires user interaction (such as auth failures), more 603c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // detailed information may be contained in additional status fields. 604c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch enum Summary { 605c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The internal instance is in an unrecognizable state. This should not 606c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // happen. 607c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch INVALID = 0, 608c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Can't connect to server, but there are no pending changes in 609c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // our local cache. 610c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OFFLINE, 611c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Can't connect to server, and there are pending changes in our 612c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // local cache. 613c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OFFLINE_UNSYNCED, 614c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Connected and syncing. 615c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SYNCING, 616c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Connected, no pending changes. 617c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch READY, 618c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Internal sync error. 619c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CONFLICT, 620c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Can't connect to server, and we haven't completed the initial 621c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // sync yet. So there's nothing we can do but wait for the server. 622c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OFFLINE_UNUSABLE, 623c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 624c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Summary summary; 625c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 626c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Various server related information. 627c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool authenticated; // Successfully authenticated via GAIA. 628c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool server_up; // True if we have received at least one good 629c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // reply from the server. 630c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool server_reachable; // True if we received any reply from the server. 631c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool server_broken; // True of the syncer is stopped because of server 632c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // issues. 633c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 634c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool notifications_enabled; // True only if subscribed for notifications. 635c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int notifications_received; 636c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int notifications_sent; 637c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 638c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Various Syncer data. 639c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int unsynced_count; 640c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int conflicting_count; 641c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool syncing; 642c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool initial_sync_ended; 643c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool syncer_stuck; 644c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int64 updates_available; 645c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int64 updates_received; 646c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool disk_full; 647c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool invalid_store; 648c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int max_consecutive_errors; // The max number of errors from any component. 649c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 650c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 651c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // An interface the embedding application implements to receive notifications 652c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // from the SyncManager. Register an observer via SyncManager::AddObserver. 653c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This observer is an event driven model as the events may be raised from 654c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // different internal threads, and simply providing an "OnStatusChanged" type 655c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // notification complicates things such as trying to determine "what changed", 656c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // if different members of the Status object are modified from different 657c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // threads. This way, the event is explicit, and it is safe for the Observer 658c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // to dispatch to a native thread or synchronize accordingly. 659c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch class Observer { 660c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 661c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Observer() { } 662c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual ~Observer() { } 663c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 664c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Notify the observer that changes have been applied to the sync model. 665c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // 666c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This will be invoked on the same thread as on which ApplyChanges was 667c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // called. |changes| is an array of size |change_count|, and contains the 668c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // ID of each individual item that was changed. |changes| exists only for 669c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // the duration of the call. If items of multiple data types change at 670c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // the same time, this method is invoked once per data type and |changes| 671c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // is restricted to items of the ModelType indicated by |model_type|. 672c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Because the observer is passed a |trans|, the observer can assume a 673c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // read lock on the sync model that will be released after the function 674c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // returns. 675c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // 676c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The SyncManager constructs |changes| in the following guaranteed order: 677c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // 678c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // 1. Deletions, from leaves up to parents. 679c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // 2. Updates to existing items with synced parents & predecessors. 680c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // 3. New items with synced parents & predecessors. 681c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // 4. Items with parents & predecessors in |changes|. 682c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // 5. Repeat #4 until all items are in |changes|. 683c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // 684c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Thus, an implementation of OnChangesApplied should be able to 685c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // process the change records in the order without having to worry about 686c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // forward dependencies. But since deletions come before reparent 687c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // operations, a delete may temporarily orphan a node that is 688c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // updated later in the list. 689c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void OnChangesApplied(syncable::ModelType model_type, 690c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const BaseTransaction* trans, 691c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const ChangeRecord* changes, 692c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int change_count) = 0; 693c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 6943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // OnChangesComplete gets called when the TransactionComplete event is 6953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // posted (after OnChangesApplied finishes), after the transaction lock 6963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // and the change channel mutex are released. 6973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // 6983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // The purpose of this function is to support processors that require 6993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // split-transactions changes. For example, if a model processor wants to 7003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // perform blocking I/O due to a change, it should calculate the changes 7013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // while holding the transaction lock (from within OnChangesApplied), buffer 7023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // those changes, let the transaction fall out of scope, and then commit 7033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // those changes from within OnChangesComplete (postponing the blocking 7043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // I/O to when it no longer holds any lock). 7053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick virtual void OnChangesComplete(syncable::ModelType model_type) = 0; 7063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 707c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // A round-trip sync-cycle took place and the syncer has resolved any 708c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // conflicts that may have arisen. 709c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void OnSyncCycleCompleted( 710c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const browser_sync::sessions::SyncSessionSnapshot* snapshot) = 0; 711c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 712c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Called when user interaction may be required due to an auth problem. 713c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void OnAuthError(const GoogleServiceAuthError& auth_error) = 0; 714c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 7153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Called when a new auth token is provided by the sync server. 7163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick virtual void OnUpdatedToken(const std::string& token) = 0; 7173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 718c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Called when user interaction is required to obtain a valid passphrase. 719c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void OnPassphraseRequired() = 0; 720c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 721c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Called when the passphrase provided by the user has been accepted and is 7223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // now used to encrypt sync data. |bootstrap_token| is an opaque base64 7233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // encoded representation of the key generated by the accepted passphrase, 7243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // and is provided to the observer for persistence purposes and use in a 7253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // future initialization of sync (e.g. after restart). 7263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick virtual void OnPassphraseAccepted(const std::string& bootstrap_token) = 0; 727c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 728c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Called when initialization is complete to the point that SyncManager can 729c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // process changes. This does not necessarily mean authentication succeeded 730c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // or that the SyncManager is online. 731c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // IMPORTANT: Creating any type of transaction before receiving this 732c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // notification is illegal! 733c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // WARNING: Calling methods on the SyncManager before receiving this 734c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // message, unless otherwise specified, produces undefined behavior. 735c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void OnInitializationComplete() = 0; 736c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 737c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The syncer thread has been paused. 738c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void OnPaused() = 0; 739c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 740c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The syncer thread has been resumed. 741c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void OnResumed() = 0; 742c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 743c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // We are no longer permitted to communicate with the server. Sync should 744c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // be disabled and state cleaned up at once. This can happen for a number 745c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // of reasons, e.g. swapping from a test instance to production, or a 746c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // global stop syncing operation has wiped the store. 747c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void OnStopSyncingPermanently() = 0; 748c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 7493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // After a request to clear server data, these callbacks are invoked to 7503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // indicate success or failure 7513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick virtual void OnClearServerDataSucceeded() = 0; 7523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick virtual void OnClearServerDataFailed() = 0; 7533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 754c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 755c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DISALLOW_COPY_AND_ASSIGN(Observer); 756c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 757c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 758c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Create an uninitialized SyncManager. Callers must Init() before using. 759c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SyncManager(); 760c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual ~SyncManager(); 761c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 762c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Initialize the sync manager. |database_location| specifies the path of 763c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // the directory in which to locate a sqlite repository storing the syncer 764c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // backend state. Initialization will open the database, or create it if it 765c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // does not already exist. Returns false on failure. 766c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // |sync_server_and_path| and |sync_server_port| represent the Chrome sync 767c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // server to use, and |use_ssl| specifies whether to communicate securely; 768c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // the default is false. 769c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // |post_factory| will be owned internally and used to create 770c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // instances of an HttpPostProvider. 771c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // |model_safe_worker| ownership is given to the SyncManager. 772c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // |user_agent| is a 7-bit ASCII string suitable for use as the User-Agent 773c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // HTTP header. Used internally when collecting stats to classify clients. 7743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // |notifier_options| contains options specific to sync notifications. 775c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool Init(const FilePath& database_location, 776c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const char* sync_server_and_path, 777c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int sync_server_port, 778c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool use_ssl, 779c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch HttpPostProviderFactory* post_factory, 780c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser_sync::ModelSafeWorkerRegistrar* registrar, 781c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const char* user_agent, 7823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const SyncCredentials& credentials, 7833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const notifier::NotifierOptions& notifier_options, 7843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const std::string& restored_key_for_bootstrapping, 7853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool setup_for_test_mode); 786c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 787c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns the username last used for a successful authentication. 788c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns empty if there is no such username. 789c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& GetAuthenticatedUsername(); 790c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 7913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Check if the database has been populated with a full "initial" download of 7923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // sync items for each data type currently present in the routing info. 7933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Prerequisite for calling this is that OnInitializationComplete has been 7943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // called. 7953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool InitialSyncEndedForAllEnabledTypes(); 7963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 7973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Migrate tokens from user settings DB to the token service. 7983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void MigrateTokens(); 7993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 8003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Update tokens that we're using in Sync. Email must stay the same. 8013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void UpdateCredentials(const SyncCredentials& credentials); 802c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 803c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Start the SyncerThread. 804c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void StartSyncing(); 805c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 806c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Attempt to set the passphrase. If the passphrase is valid, 807c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // OnPassphraseAccepted will be fired to notify the ProfileSyncService and the 808c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // syncer will be nudged so that any update that was waiting for this 809c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // passphrase gets applied as soon as possible. 810c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // If the passphrase in invalid, OnPassphraseRequired will be fired. 811c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Calling this metdod again is the appropriate course of action to "retry" 812c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // with a new passphrase. 813c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void SetPassphrase(const std::string& passphrase); 814c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 815c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Requests the syncer thread to pause. The observer's OnPause 816c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // method will be called when the syncer thread is paused. Returns 817c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // false if the syncer thread can not be paused (e.g. if it is not 818c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // started). 819c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool RequestPause(); 820c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 821c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Requests the syncer thread to resume. The observer's OnResume 822c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // method will be called when the syncer thread is resumed. Returns 823c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // false if the syncer thread can not be resumed (e.g. if it is not 824c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // paused). 825c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool RequestResume(); 826c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 827c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Request a nudge of the syncer, which will cause the syncer thread 828c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // to run at the next available opportunity. 829c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void RequestNudge(); 830c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 8313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Request a clearing of all data on the server 8323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void RequestClearServerData(); 8333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 834c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Adds a listener to be notified of sync events. 835c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // NOTE: It is OK (in fact, it's probably a good idea) to call this before 836c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // having received OnInitializationCompleted. 837c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void SetObserver(Observer* observer); 838c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 839c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Remove the observer set by SetObserver (no op if none was set). 840c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Make sure to call this if the Observer set in SetObserver is being 841c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // destroyed so the SyncManager doesn't potentially dereference garbage. 842c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void RemoveObserver(); 843c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 844c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Status-related getters. Typically GetStatusSummary will suffice, but 845c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // GetDetailedSyncStatus can be useful for gathering debug-level details of 846c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // the internals of the sync engine. 847c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Status::Summary GetStatusSummary() const; 848c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Status GetDetailedStatus() const; 849c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 850c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Get the internal implementation for use by BaseTransaction, etc. 851c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SyncInternal* GetImpl() const; 852c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 853c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Call periodically from a database-safe thread to persist recent changes 854c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // to the syncapi model. 855c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void SaveChanges(); 856c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 857c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Issue a final SaveChanges, close sqlite handles, and stop running threads. 858c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Must be called from the same thread that called Init(). 859c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void Shutdown(); 860c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 861c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UserShare* GetUserShare() const; 862c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 8633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Uses a read-only transaction to determine if the directory being synced has 8643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // any remaining unsynced items. 8653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool HasUnsyncedItems() const; 8663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 867c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 868c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // An opaque pointer to the nested private class. 869c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SyncInternal* data_; 870c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 871c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DISALLOW_COPY_AND_ASSIGN(SyncManager); 872c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 873c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 874c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// An interface the embedding application (e.g. Chromium) implements to 875c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// provide required HTTP POST functionality to the syncer backend. 876c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This interface is designed for one-time use. You create one, use it, and 877c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// create another if you want to make a subsequent POST. 878c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// TODO(timsteele): Bug 1482576. Consider splitting syncapi.h into two files: 879c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// one for the API defining the exports, which doesn't need to be included from 880c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// anywhere internally, and another file for the interfaces like this one. 881c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass HttpPostProviderInterface { 882c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 883c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch HttpPostProviderInterface() { } 884c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual ~HttpPostProviderInterface() { } 885c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 886c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Use specified user agent string when POSTing. If not called a default UA 887c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // may be used. 888c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void SetUserAgent(const char* user_agent) = 0; 889c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 890c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Add additional headers to the request. 891c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void SetExtraRequestHeaders(const char * headers) = 0; 892c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 893c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Set the URL to POST to. 894c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void SetURL(const char* url, int port) = 0; 895c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 896c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Set the type, length and content of the POST payload. 897c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // |content_type| is a null-terminated MIME type specifier. 898c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // |content| is a data buffer; Do not interpret as a null-terminated string. 899c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // |content_length| is the total number of chars in |content|. It is used to 900c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // assign/copy |content| data. 901c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void SetPostPayload(const char* content_type, int content_length, 902c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const char* content) = 0; 903c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 904c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns true if the URL request succeeded. If the request failed, 905c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // os_error() may be non-zero and hence contain more information. 906c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual bool MakeSynchronousPost(int* os_error_code, int* response_code) = 0; 907c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 908c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Get the length of the content returned in the HTTP response. 909c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This does not count the trailing null-terminating character returned 910c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // by GetResponseContent, so it is analogous to calling string.length. 911c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual int GetResponseContentLength() const = 0; 912c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 913c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Get the content returned in the HTTP response. 914c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This is a null terminated string of characters. 915c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Value should be copied. 916c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual const char* GetResponseContent() const = 0; 917c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 918c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Get the value of a header returned in the HTTP response. 919c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // If the header is not present, returns the empty string. 920c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual const std::string GetResponseHeaderValue( 921c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& name) const = 0; 922c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 923c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 924c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DISALLOW_COPY_AND_ASSIGN(HttpPostProviderInterface); 925c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 926c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 927c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// A factory to create HttpPostProviders to hide details about the 928c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// implementations and dependencies. 929c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// A factory instance itself should be owned by whomever uses it to create 930c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// HttpPostProviders. 931c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass HttpPostProviderFactory { 932c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 933c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Obtain a new HttpPostProviderInterface instance, owned by caller. 934c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual HttpPostProviderInterface* Create() = 0; 935c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 936c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // When the interface is no longer needed (ready to be cleaned up), clients 937c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // must call Destroy(). 938c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This allows actual HttpPostProvider subclass implementations to be 939c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // reference counted, which is useful if a particular implementation uses 940c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // multiple threads to serve network requests. 941c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void Destroy(HttpPostProviderInterface* http) = 0; 942c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual ~HttpPostProviderFactory() { } 943c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 944c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 945c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace sync_api 946c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 947c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif // CHROME_BROWSER_SYNC_ENGINE_SYNCAPI_H_ 948