syncapi.h revision 4a5e2dc747d50c653511c68ccb2cfbfb740bd5a7
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 { 110731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick UserShare(); 111731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ~UserShare(); 112731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The DirectoryManager itself, which is the parent of Transactions and can 114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // be shared across multiple threads (unlike Directory). 115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<syncable::DirectoryManager> dir_manager; 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // The username of the sync user. 1183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::string name; 1193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}; 1203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Contains everything needed to talk to and identify a user account. 1223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickstruct SyncCredentials { 1233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::string email; 1243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::string sync_token; 125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// A valid BaseNode will never have an ID of zero. 128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic const int64 kInvalidId = 0; 129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// BaseNode wraps syncable::Entry, and corresponds to a single object's state. 131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This, like syncable::Entry, is intended for use on the stack. A valid 132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// transaction is necessary to create a BaseNode or any of its children. 133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Unlike syncable::Entry, a sync API BaseNode is identified primarily by its 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// int64 metahandle, which we call an ID here. 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass BaseNode { 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // All subclasses of BaseNode must provide a way to initialize themselves by 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // doing an ID lookup. Returns false on failure. An invalid or deleted 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // ID will result in failure. 140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual bool InitByIdLookup(int64 id) = 0; 141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // All subclasses of BaseNode must also provide a way to initialize themselves 143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // by doing a client tag lookup. Returns false on failure. A deleted node 144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // will return FALSE. 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual bool InitByClientTagLookup(syncable::ModelType model_type, 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& tag) = 0; 147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Each object is identified by a 64-bit id (internally, the syncable 149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // metahandle). These ids are strictly local handles. They will persist 150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // on this client, but the same object on a different client may have a 151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // different ID value. 152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int64 GetId() const; 153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Nodes are hierarchically arranged into a single-rooted tree. 155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // InitByRootLookup on ReadNode allows access to the root. GetParentId is 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // how you find a node's parent. 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int64 GetParentId() const; 158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Nodes are either folders or not. This corresponds to the IS_DIR property 160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // of syncable::Entry. 161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool GetIsFolder() const; 162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns the title of the object. 164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Uniqueness of the title is not enforced on siblings -- it is not an error 165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // for two children to share a title. 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::wstring GetTitle() const; 167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns the model type of this object. The model type is set at node 169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // creation time and is expected never to change. 170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch syncable::ModelType GetModelType() const; 171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Getter specific to the BOOKMARK datatype. Returns protobuf 173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // data. Can only be called if GetModelType() == BOOKMARK. 174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const sync_pb::BookmarkSpecifics& GetBookmarkSpecifics() const; 175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Legacy, bookmark-specific getter that wraps GetBookmarkSpecifics() above. 177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns the URL of a bookmark object. 178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // TODO(ncarter): Remove this datatype-specific accessor. 179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL GetURL() const; 180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Legacy, bookmark-specific getter that wraps GetBookmarkSpecifics() above. 182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Fill in a vector with the byte data of this node's favicon. Assumes 183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // that the node is a bookmark. 184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Favicons are expected to be PNG images, and though no verification is 185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // done on the syncapi client of this, the server may reject favicon updates 186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // that are invalid for whatever reason. 187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // TODO(ncarter): Remove this datatype-specific accessor. 188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void GetFaviconBytes(std::vector<unsigned char>* output) const; 189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Getter specific to the APPS datatype. Returns protobuf 1913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // data. Can only be called if GetModelType() == APPS. 1923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const sync_pb::AppSpecifics& GetAppSpecifics() const; 1933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Getter specific to the AUTOFILL datatype. Returns protobuf 195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // data. Can only be called if GetModelType() == AUTOFILL. 196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const sync_pb::AutofillSpecifics& GetAutofillSpecifics() const; 197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Getter specific to the NIGORI datatype. Returns protobuf 199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // data. Can only be called if GetModelType() == NIGORI. 200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const sync_pb::NigoriSpecifics& GetNigoriSpecifics() const; 201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Getter specific to the PASSWORD datatype. Returns protobuf 203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // data. Can only be called if GetModelType() == PASSWORD. 204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const sync_pb::PasswordSpecificsData& GetPasswordSpecifics() const; 205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Getter specific to the PREFERENCE datatype. Returns protobuf 207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // data. Can only be called if GetModelType() == PREFERENCE. 208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const sync_pb::PreferenceSpecifics& GetPreferenceSpecifics() const; 209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Getter specific to the THEME datatype. Returns protobuf 211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // data. Can only be called if GetModelType() == THEME. 212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const sync_pb::ThemeSpecifics& GetThemeSpecifics() const; 213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Getter specific to the TYPED_URLS datatype. Returns protobuf 215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // data. Can only be called if GetModelType() == TYPED_URLS. 216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const sync_pb::TypedUrlSpecifics& GetTypedUrlSpecifics() const; 217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Getter specific to the EXTENSIONS datatype. Returns protobuf 219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // data. Can only be called if GetModelType() == EXTENSIONS. 220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const sync_pb::ExtensionSpecifics& GetExtensionSpecifics() const; 221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 2223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Getter specific to the SESSIONS datatype. Returns protobuf 2233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // data. Can only be called if GetModelType() == SESSIONS. 2243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const sync_pb::SessionSpecifics& GetSessionSpecifics() const; 2253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns the local external ID associated with the node. 227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int64 GetExternalId() const; 228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Return the ID of the node immediately before this in the sibling order. 230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // For the first node in the ordering, return 0. 231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int64 GetPredecessorId() const; 232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Return the ID of the node immediately after this in the sibling order. 234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // For the last node in the ordering, return 0. 235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int64 GetSuccessorId() const; 236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Return the ID of the first child of this node. If this node has no 238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // children, return 0. 239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int64 GetFirstChildId() const; 240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // These virtual accessors provide access to data members of derived classes. 242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual const syncable::Entry* GetEntry() const = 0; 243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual const BaseTransaction* GetTransaction() const = 0; 244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected: 246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BaseNode(); 247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual ~BaseNode(); 248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The server has a size limit on client tags, so we generate a fixed length 249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // hash locally. This also ensures that ModelTypes have unique namespaces. 250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static std::string GenerateSyncableHash(syncable::ModelType model_type, 251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& client_tag); 252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Determines whether part of the entry is encrypted, and if so attempts to 254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // decrypt it. Unless decryption is necessary and fails, this will always 255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // return |true|. 256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool DecryptIfNecessary(syncable::Entry* entry); 257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Node is meant for stack use only. 260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void* operator new(size_t size); 261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // If this node represents a password, this field will hold the actual 263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // decrypted password data. 264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<sync_pb::PasswordSpecificsData> password_data_; 265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch friend class SyncApiTest; 267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FRIEND_TEST_ALL_PREFIXES(SyncApiTest, GenerateSyncableHash); 268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DISALLOW_COPY_AND_ASSIGN(BaseNode); 270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// WriteNode extends BaseNode to add mutation, and wraps 273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// syncable::MutableEntry. A WriteTransaction is needed to create a WriteNode. 274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass WriteNode : public BaseNode { 275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Create a WriteNode using the given transaction. 277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch explicit WriteNode(WriteTransaction* transaction); 278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual ~WriteNode(); 279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // A client must use one (and only one) of the following Init variants to 281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // populate the node. 282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // BaseNode implementation. 284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual bool InitByIdLookup(int64 id); 285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual bool InitByClientTagLookup(syncable::ModelType model_type, 286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& tag); 287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Create a new node with the specified parent and predecessor. |model_type| 289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // dictates the type of the item, and controls which EntitySpecifics proto 290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // extension can be used with this item. Use a NULL |predecessor| 291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // to indicate that this is to be the first child. 292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // |predecessor| must be a child of |new_parent| or NULL. Returns false on 293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // failure. 294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool InitByCreation(syncable::ModelType model_type, 295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const BaseNode& parent, 296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const BaseNode* predecessor); 297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Create nodes using this function if they're unique items that 299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // you want to fetch using client_tag. Note that the behavior of these 300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // items is slightly different than that of normal items. 301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Most importantly, if it exists locally, this function will 302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // actually undelete it 303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Client unique tagged nodes must NOT be folders. 304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool InitUniqueByCreation(syncable::ModelType model_type, 305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const BaseNode& parent, 306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& client_tag); 307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Each server-created permanent node is tagged with a unique string. 309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Look up the node with the particular tag. If it does not exist, 310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // return false. 311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool InitByTagLookup(const std::string& tag); 312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // These Set() functions correspond to the Get() functions of BaseNode. 314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void SetIsFolder(bool folder); 315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void SetTitle(const std::wstring& title); 316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // External ID is a client-only field, so setting it doesn't cause the item to 318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // be synced again. 319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void SetExternalId(int64 external_id); 320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Remove this node and its children. 322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void Remove(); 323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Set a new parent and position. Position is specified by |predecessor|; if 325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // it is NULL, the node is moved to the first position. |predecessor| must 326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // be a child of |new_parent| or NULL. Returns false on failure.. 327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool SetPosition(const BaseNode& new_parent, const BaseNode* predecessor); 328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Set the bookmark specifics (url and favicon). 330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Should only be called if GetModelType() == BOOKMARK. 331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void SetBookmarkSpecifics(const sync_pb::BookmarkSpecifics& specifics); 332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Legacy, bookmark-specific setters that wrap SetBookmarkSpecifics() above. 334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Should only be called if GetModelType() == BOOKMARK. 335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // TODO(ncarter): Remove these two datatype-specific accessors. 336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void SetURL(const GURL& url); 337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void SetFaviconBytes(const std::vector<unsigned char>& bytes); 338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 3393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Set the app specifics (id, update url, enabled state, etc). 3403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Should only be called if GetModelType() == APPS. 3413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void SetAppSpecifics(const sync_pb::AppSpecifics& specifics); 3423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Set the autofill specifics (name and value). 344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Should only be called if GetModelType() == AUTOFILL. 345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void SetAutofillSpecifics(const sync_pb::AutofillSpecifics& specifics); 346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Set the nigori specifics. 348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Should only be called if GetModelType() == NIGORI. 349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void SetNigoriSpecifics(const sync_pb::NigoriSpecifics& specifics); 350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Set the password specifics. 352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Should only be called if GetModelType() == PASSWORD. 353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void SetPasswordSpecifics(const sync_pb::PasswordSpecificsData& specifics); 354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Set the preference specifics (name and value). 356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Should only be called if GetModelType() == PREFERENCE. 357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void SetPreferenceSpecifics(const sync_pb::PreferenceSpecifics& specifics); 358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Set the theme specifics (name and value). 360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Should only be called if GetModelType() == THEME. 361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void SetThemeSpecifics(const sync_pb::ThemeSpecifics& specifics); 362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Set the typed_url specifics (url, title, typed_count, etc). 364c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Should only be called if GetModelType() == TYPED_URLS. 365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void SetTypedUrlSpecifics(const sync_pb::TypedUrlSpecifics& specifics); 366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Set the extension specifics (id, update url, enabled state, etc). 368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Should only be called if GetModelType() == EXTENSIONS. 369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void SetExtensionSpecifics(const sync_pb::ExtensionSpecifics& specifics); 370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 3713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Set the session specifics (windows, tabs, navigations etc.). 3723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Should only be called if GetModelType() == SESSIONS. 3733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void SetSessionSpecifics(const sync_pb::SessionSpecifics& specifics); 3743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Implementation of BaseNode's abstract virtual accessors. 376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual const syncable::Entry* GetEntry() const; 377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 378c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual const BaseTransaction* GetTransaction() const; 379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void* operator new(size_t size); // Node is meant for stack use only. 382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Helper to set model type. This will clear any specifics data. 384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void PutModelType(syncable::ModelType model_type); 385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Helper to set the previous node. 387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void PutPredecessor(const BaseNode* predecessor); 388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Private helpers to set type-specific protobuf data. These don't 390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // do any checking on the previous modeltype, so they can be used 391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // for internal initialization (you can use them to set the modeltype). 392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Additionally, they will mark for syncing if the underlying value 393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // changes. 3943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void PutAppSpecificsAndMarkForSyncing( 3953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const sync_pb::AppSpecifics& new_value); 396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void PutAutofillSpecificsAndMarkForSyncing( 397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const sync_pb::AutofillSpecifics& new_value); 398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void PutBookmarkSpecificsAndMarkForSyncing( 399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const sync_pb::BookmarkSpecifics& new_value); 400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void PutNigoriSpecificsAndMarkForSyncing( 401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const sync_pb::NigoriSpecifics& new_value); 402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void PutPasswordSpecificsAndMarkForSyncing( 403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const sync_pb::PasswordSpecifics& new_value); 404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void PutPreferenceSpecificsAndMarkForSyncing( 405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const sync_pb::PreferenceSpecifics& new_value); 406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void PutThemeSpecificsAndMarkForSyncing( 407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const sync_pb::ThemeSpecifics& new_value); 408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void PutTypedUrlSpecificsAndMarkForSyncing( 409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const sync_pb::TypedUrlSpecifics& new_value); 410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void PutExtensionSpecificsAndMarkForSyncing( 411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const sync_pb::ExtensionSpecifics& new_value); 4123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void PutSessionSpecificsAndMarkForSyncing( 4133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const sync_pb::SessionSpecifics& new_value); 414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void PutSpecificsAndMarkForSyncing( 415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const sync_pb::EntitySpecifics& specifics); 416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Sets IS_UNSYNCED and SYNCING to ensure this entry is considered in an 418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // upcoming commit pass. 419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void MarkForSyncing(); 420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The underlying syncable object which this class wraps. 422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch syncable::MutableEntry* entry_; 423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The sync API transaction that is the parent of this node. 425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteTransaction* transaction_; 426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DISALLOW_COPY_AND_ASSIGN(WriteNode); 428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// ReadNode wraps a syncable::Entry to provide the functionality of a 431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// read-only BaseNode. 432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ReadNode : public BaseNode { 433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 434c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Create an unpopulated ReadNode on the given transaction. Call some flavor 435c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // of Init to populate the ReadNode with a database entry. 436c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch explicit ReadNode(const BaseTransaction* transaction); 437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual ~ReadNode(); 438c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // A client must use one (and only one) of the following Init variants to 440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // populate the node. 441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // BaseNode implementation. 443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual bool InitByIdLookup(int64 id); 444c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual bool InitByClientTagLookup(syncable::ModelType model_type, 445c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& tag); 446c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 447c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // There is always a root node, so this can't fail. The root node is 448c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // never mutable, so root lookup is only possible on a ReadNode. 449c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void InitByRootLookup(); 450c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 451c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Each server-created permanent node is tagged with a unique string. 452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Look up the node with the particular tag. If it does not exist, 453c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // return false. 454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool InitByTagLookup(const std::string& tag); 455c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 456c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Implementation of BaseNode's abstract virtual accessors. 457c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual const syncable::Entry* GetEntry() const; 458c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual const BaseTransaction* GetTransaction() const; 459c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 460c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 461c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void* operator new(size_t size); // Node is meant for stack use only. 462c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 463c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The underlying syncable object which this class wraps. 464c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch syncable::Entry* entry_; 465c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 466c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The sync API transaction that is the parent of this node. 467c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const BaseTransaction* transaction_; 468c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 469c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DISALLOW_COPY_AND_ASSIGN(ReadNode); 470c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 471c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 472c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Sync API's BaseTransaction, ReadTransaction, and WriteTransaction allow for 473c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// batching of several read and/or write operations. The read and write 474c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// operations are performed by creating ReadNode and WriteNode instances using 475c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// the transaction. These transaction classes wrap identically named classes in 476c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// syncable, and are used in a similar way. Unlike syncable::BaseTransaction, 477c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// whose construction requires an explicit syncable::ScopedDirLookup, a sync 478c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// API BaseTransaction creates its own ScopedDirLookup implicitly. 479c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass BaseTransaction { 480c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 481c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Provide access to the underlying syncable.h objects from BaseNode. 482c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual syncable::BaseTransaction* GetWrappedTrans() const = 0; 483c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const syncable::ScopedDirLookup& GetLookup() const { return *lookup_; } 484c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser_sync::Cryptographer* GetCryptographer() const { 485c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return cryptographer_; 486c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 487c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 488c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected: 489c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The ScopedDirLookup is created in the constructor and destroyed 490c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // in the destructor. Creation of the ScopedDirLookup is not expected 491c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // to fail. 492c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch explicit BaseTransaction(UserShare* share); 493c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual ~BaseTransaction(); 494c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 495c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 496c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // A syncable ScopedDirLookup, which is the parent of syncable transactions. 497c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch syncable::ScopedDirLookup* lookup_; 498c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 499c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser_sync::Cryptographer* cryptographer_; 500c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 501c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DISALLOW_COPY_AND_ASSIGN(BaseTransaction); 502c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 503c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 504c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Sync API's ReadTransaction is a read-only BaseTransaction. It wraps 505c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// a syncable::ReadTransaction. 506c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ReadTransaction : public BaseTransaction { 507c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 508c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Start a new read-only transaction on the specified repository. 509c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch explicit ReadTransaction(UserShare* share); 510c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 511c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Resume the middle of a transaction. Will not close transaction. 512c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ReadTransaction(UserShare* share, syncable::BaseTransaction* trans); 513c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 514c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual ~ReadTransaction(); 515c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 516c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // BaseTransaction override. 517c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual syncable::BaseTransaction* GetWrappedTrans() const; 518c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 519c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void* operator new(size_t size); // Transaction is meant for stack use only. 520c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 521c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The underlying syncable object which this class wraps. 522c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch syncable::BaseTransaction* transaction_; 523c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool close_transaction_; 524c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 525c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DISALLOW_COPY_AND_ASSIGN(ReadTransaction); 526c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 527c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 528c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Sync API's WriteTransaction is a read/write BaseTransaction. It wraps 529c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// a syncable::WriteTransaction. 530c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass WriteTransaction : public BaseTransaction { 531c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 532c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Start a new read/write transaction. 533c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch explicit WriteTransaction(UserShare* share); 534c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual ~WriteTransaction(); 535c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 536c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Provide access to the syncable.h transaction from the API WriteNode. 537c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual syncable::BaseTransaction* GetWrappedTrans() const; 538c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch syncable::WriteTransaction* GetWrappedWriteTrans() { return transaction_; } 539c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 540c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 541c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void* operator new(size_t size); // Transaction is meant for stack use only. 542c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 543c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The underlying syncable object which this class wraps. 544c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch syncable::WriteTransaction* transaction_; 545c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 546c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DISALLOW_COPY_AND_ASSIGN(WriteTransaction); 547c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 548c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 549c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// SyncManager encapsulates syncable::DirectoryManager and serves as the parent 550c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// of all other objects in the sync API. SyncManager is thread-safe. If 551c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// multiple threads interact with the same local sync repository (i.e. the 552c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// same sqlite database), they should share a single SyncManager instance. The 553c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// caller should typically create one SyncManager for the lifetime of a user 554c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// session. 555c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass SyncManager { 556c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 557c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // SyncInternal contains the implementation of SyncManager, while abstracting 558c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // internal types from clients of the interface. 559c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch class SyncInternal; 560c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // TODO(tim): Depending on how multi-type encryption pans out, maybe we 5623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // should turn ChangeRecord itself into a class. Or we could template this 5633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // wrapper / add a templated method to return unencrypted protobufs. 5643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick class ExtraChangeRecordData { 5653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public: 5663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ExtraChangeRecordData() {} 5673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick virtual ~ExtraChangeRecordData() {} 5683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick }; 5693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 570c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // ChangeRecord indicates a single item that changed as a result of a sync 571c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // operation. This gives the sync id of the node that changed, and the type 572c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // of change. To get the actual property values after an ADD or UPDATE, the 573c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // client should get the node with InitByIdLookup(), using the provided id. 574c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch struct ChangeRecord { 575c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch enum Action { 576c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ACTION_ADD, 577c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ACTION_DELETE, 578c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ACTION_UPDATE, 579c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 580731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ChangeRecord(); 581731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ~ChangeRecord(); 582731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 583c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int64 id; 584c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Action action; 585c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sync_pb::EntitySpecifics specifics; 5863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick linked_ptr<ExtraChangeRecordData> extra; 5873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick }; 5883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 5893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Since PasswordSpecifics is just an encrypted blob, we extend to provide 5903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // access to unencrypted bits. 5913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick class ExtraPasswordChangeRecordData : public ExtraChangeRecordData { 5923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public: 593731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick explicit ExtraPasswordChangeRecordData( 594731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const sync_pb::PasswordSpecificsData& data); 595731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick virtual ~ExtraPasswordChangeRecordData(); 5963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const sync_pb::PasswordSpecificsData& unencrypted() { 5973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return unencrypted_; 5983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 5993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private: 6003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick sync_pb::PasswordSpecificsData unencrypted_; 601c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 602c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 603c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Status encapsulates detailed state about the internals of the SyncManager. 604c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch struct Status { 605c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Summary is a distilled set of important information that the end-user may 606c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // wish to be informed about (through UI, for example). Note that if a 607c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // summary state requires user interaction (such as auth failures), more 608c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // detailed information may be contained in additional status fields. 609c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch enum Summary { 610c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The internal instance is in an unrecognizable state. This should not 611c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // happen. 612c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch INVALID = 0, 613c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Can't connect to server, but there are no pending changes in 614c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // our local cache. 615c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OFFLINE, 616c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Can't connect to server, and there are pending changes in our 617c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // local cache. 618c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OFFLINE_UNSYNCED, 619c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Connected and syncing. 620c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SYNCING, 621c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Connected, no pending changes. 622c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch READY, 623c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Internal sync error. 624c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CONFLICT, 625c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Can't connect to server, and we haven't completed the initial 626c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // sync yet. So there's nothing we can do but wait for the server. 627c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OFFLINE_UNUSABLE, 628c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 629c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Summary summary; 630c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 631c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Various server related information. 632c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool authenticated; // Successfully authenticated via GAIA. 633c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool server_up; // True if we have received at least one good 634c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // reply from the server. 635c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool server_reachable; // True if we received any reply from the server. 636c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool server_broken; // True of the syncer is stopped because of server 637c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // issues. 638c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 639c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool notifications_enabled; // True only if subscribed for notifications. 640c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int notifications_received; 641c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int notifications_sent; 642c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 643c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Various Syncer data. 644c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int unsynced_count; 645c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int conflicting_count; 646c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool syncing; 647c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool initial_sync_ended; 648c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool syncer_stuck; 649c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int64 updates_available; 650c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int64 updates_received; 651c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool disk_full; 652c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool invalid_store; 653c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int max_consecutive_errors; // The max number of errors from any component. 654c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 655c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 656c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // An interface the embedding application implements to receive notifications 657c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // from the SyncManager. Register an observer via SyncManager::AddObserver. 658c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This observer is an event driven model as the events may be raised from 659c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // different internal threads, and simply providing an "OnStatusChanged" type 660c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // notification complicates things such as trying to determine "what changed", 661c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // if different members of the Status object are modified from different 662c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // threads. This way, the event is explicit, and it is safe for the Observer 663c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // to dispatch to a native thread or synchronize accordingly. 664c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch class Observer { 665c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 666c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Observer() { } 667c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual ~Observer() { } 668c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 669c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Notify the observer that changes have been applied to the sync model. 670c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // 671c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This will be invoked on the same thread as on which ApplyChanges was 672c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // called. |changes| is an array of size |change_count|, and contains the 673c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // ID of each individual item that was changed. |changes| exists only for 674c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // the duration of the call. If items of multiple data types change at 675c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // the same time, this method is invoked once per data type and |changes| 676c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // is restricted to items of the ModelType indicated by |model_type|. 677c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Because the observer is passed a |trans|, the observer can assume a 678c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // read lock on the sync model that will be released after the function 679c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // returns. 680c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // 681c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The SyncManager constructs |changes| in the following guaranteed order: 682c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // 683c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // 1. Deletions, from leaves up to parents. 684c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // 2. Updates to existing items with synced parents & predecessors. 685c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // 3. New items with synced parents & predecessors. 686c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // 4. Items with parents & predecessors in |changes|. 687c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // 5. Repeat #4 until all items are in |changes|. 688c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // 689c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Thus, an implementation of OnChangesApplied should be able to 690c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // process the change records in the order without having to worry about 691c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // forward dependencies. But since deletions come before reparent 692c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // operations, a delete may temporarily orphan a node that is 693c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // updated later in the list. 694c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void OnChangesApplied(syncable::ModelType model_type, 695c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const BaseTransaction* trans, 696c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const ChangeRecord* changes, 697c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int change_count) = 0; 698c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 6993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // OnChangesComplete gets called when the TransactionComplete event is 7003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // posted (after OnChangesApplied finishes), after the transaction lock 7013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // and the change channel mutex are released. 7023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // 7033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // The purpose of this function is to support processors that require 7043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // split-transactions changes. For example, if a model processor wants to 7053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // perform blocking I/O due to a change, it should calculate the changes 7063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // while holding the transaction lock (from within OnChangesApplied), buffer 7073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // those changes, let the transaction fall out of scope, and then commit 7083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // those changes from within OnChangesComplete (postponing the blocking 7093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // I/O to when it no longer holds any lock). 7103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick virtual void OnChangesComplete(syncable::ModelType model_type) = 0; 7113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 712c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // A round-trip sync-cycle took place and the syncer has resolved any 713c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // conflicts that may have arisen. 714c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void OnSyncCycleCompleted( 715c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const browser_sync::sessions::SyncSessionSnapshot* snapshot) = 0; 716c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 717c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Called when user interaction may be required due to an auth problem. 718c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void OnAuthError(const GoogleServiceAuthError& auth_error) = 0; 719c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 7203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Called when a new auth token is provided by the sync server. 7213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick virtual void OnUpdatedToken(const std::string& token) = 0; 7223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 723c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Called when user interaction is required to obtain a valid passphrase. 724c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void OnPassphraseRequired() = 0; 725c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 726c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Called when the passphrase provided by the user has been accepted and is 7273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // now used to encrypt sync data. |bootstrap_token| is an opaque base64 7283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // encoded representation of the key generated by the accepted passphrase, 7293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // and is provided to the observer for persistence purposes and use in a 7303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // future initialization of sync (e.g. after restart). 7313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick virtual void OnPassphraseAccepted(const std::string& bootstrap_token) = 0; 732c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 733c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Called when initialization is complete to the point that SyncManager can 734c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // process changes. This does not necessarily mean authentication succeeded 735c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // or that the SyncManager is online. 736c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // IMPORTANT: Creating any type of transaction before receiving this 737c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // notification is illegal! 738c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // WARNING: Calling methods on the SyncManager before receiving this 739c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // message, unless otherwise specified, produces undefined behavior. 740c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void OnInitializationComplete() = 0; 741c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 742c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The syncer thread has been paused. 743c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void OnPaused() = 0; 744c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 745c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The syncer thread has been resumed. 746c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void OnResumed() = 0; 747c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 748c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // We are no longer permitted to communicate with the server. Sync should 749c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // be disabled and state cleaned up at once. This can happen for a number 750c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // of reasons, e.g. swapping from a test instance to production, or a 751c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // global stop syncing operation has wiped the store. 752c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void OnStopSyncingPermanently() = 0; 753c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 7543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // After a request to clear server data, these callbacks are invoked to 7553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // indicate success or failure 7563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick virtual void OnClearServerDataSucceeded() = 0; 7573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick virtual void OnClearServerDataFailed() = 0; 7583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 759c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 760c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DISALLOW_COPY_AND_ASSIGN(Observer); 761c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 762c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 763c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Create an uninitialized SyncManager. Callers must Init() before using. 764c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SyncManager(); 765c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual ~SyncManager(); 766c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 767c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Initialize the sync manager. |database_location| specifies the path of 768c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // the directory in which to locate a sqlite repository storing the syncer 769c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // backend state. Initialization will open the database, or create it if it 770c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // does not already exist. Returns false on failure. 771c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // |sync_server_and_path| and |sync_server_port| represent the Chrome sync 772c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // server to use, and |use_ssl| specifies whether to communicate securely; 773c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // the default is false. 774c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // |post_factory| will be owned internally and used to create 775c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // instances of an HttpPostProvider. 776c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // |model_safe_worker| ownership is given to the SyncManager. 777c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // |user_agent| is a 7-bit ASCII string suitable for use as the User-Agent 778c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // HTTP header. Used internally when collecting stats to classify clients. 7793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // |notifier_options| contains options specific to sync notifications. 780c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool Init(const FilePath& database_location, 781c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const char* sync_server_and_path, 782c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int sync_server_port, 783c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool use_ssl, 784c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch HttpPostProviderFactory* post_factory, 785c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser_sync::ModelSafeWorkerRegistrar* registrar, 786c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const char* user_agent, 7873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const SyncCredentials& credentials, 7883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const notifier::NotifierOptions& notifier_options, 7893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const std::string& restored_key_for_bootstrapping, 7903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool setup_for_test_mode); 791c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 792c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns the username last used for a successful authentication. 793c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns empty if there is no such username. 794c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& GetAuthenticatedUsername(); 795c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 7963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Check if the database has been populated with a full "initial" download of 7973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // sync items for each data type currently present in the routing info. 7983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Prerequisite for calling this is that OnInitializationComplete has been 7993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // called. 8003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool InitialSyncEndedForAllEnabledTypes(); 8013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 8023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Migrate tokens from user settings DB to the token service. 8033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void MigrateTokens(); 8043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 8053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Update tokens that we're using in Sync. Email must stay the same. 8063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void UpdateCredentials(const SyncCredentials& credentials); 807c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 808c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Start the SyncerThread. 809c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void StartSyncing(); 810c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 811c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Attempt to set the passphrase. If the passphrase is valid, 812c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // OnPassphraseAccepted will be fired to notify the ProfileSyncService and the 813c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // syncer will be nudged so that any update that was waiting for this 814c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // passphrase gets applied as soon as possible. 815c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // If the passphrase in invalid, OnPassphraseRequired will be fired. 816c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Calling this metdod again is the appropriate course of action to "retry" 817c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // with a new passphrase. 8184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // |is_explicit| is true if the call is in response to the user explicitly 8194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // setting a passphrase as opposed to implicitly (from the users' perspective) 8204a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // using their Google Account password. An implicit SetPassphrase will *not* 8214a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // *not* override an explicit passphrase set previously. 8224a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch void SetPassphrase(const std::string& passphrase, bool is_explicit); 823c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 824c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Requests the syncer thread to pause. The observer's OnPause 825c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // method will be called when the syncer thread is paused. Returns 826c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // false if the syncer thread can not be paused (e.g. if it is not 827c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // started). 828c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool RequestPause(); 829c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 830c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Requests the syncer thread to resume. The observer's OnResume 831c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // method will be called when the syncer thread is resumed. Returns 832c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // false if the syncer thread can not be resumed (e.g. if it is not 833c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // paused). 834c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool RequestResume(); 835c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 836c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Request a nudge of the syncer, which will cause the syncer thread 837c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // to run at the next available opportunity. 838c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void RequestNudge(); 839c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 8403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Request a clearing of all data on the server 8413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void RequestClearServerData(); 8423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 843c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Adds a listener to be notified of sync events. 844c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // NOTE: It is OK (in fact, it's probably a good idea) to call this before 845c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // having received OnInitializationCompleted. 846c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void SetObserver(Observer* observer); 847c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 848c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Remove the observer set by SetObserver (no op if none was set). 849c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Make sure to call this if the Observer set in SetObserver is being 850c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // destroyed so the SyncManager doesn't potentially dereference garbage. 851c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void RemoveObserver(); 852c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 853c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Status-related getters. Typically GetStatusSummary will suffice, but 854c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // GetDetailedSyncStatus can be useful for gathering debug-level details of 855c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // the internals of the sync engine. 856c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Status::Summary GetStatusSummary() const; 857c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Status GetDetailedStatus() const; 858c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 8594a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Whether or not the Nigori node is encrypted using an explicit passphrase. 8604a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch bool IsUsingExplicitPassphrase(); 8614a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 862c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Get the internal implementation for use by BaseTransaction, etc. 863c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SyncInternal* GetImpl() const; 864c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 865c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Call periodically from a database-safe thread to persist recent changes 866c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // to the syncapi model. 867c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void SaveChanges(); 868c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 869c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Issue a final SaveChanges, close sqlite handles, and stop running threads. 870c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Must be called from the same thread that called Init(). 871c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void Shutdown(); 872c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 873c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UserShare* GetUserShare() const; 874c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 8753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Uses a read-only transaction to determine if the directory being synced has 8763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // any remaining unsynced items. 8773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool HasUnsyncedItems() const; 8783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 879c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 880c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // An opaque pointer to the nested private class. 881c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SyncInternal* data_; 882c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 883c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DISALLOW_COPY_AND_ASSIGN(SyncManager); 884c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 885c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 886c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// An interface the embedding application (e.g. Chromium) implements to 887c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// provide required HTTP POST functionality to the syncer backend. 888c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This interface is designed for one-time use. You create one, use it, and 889c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// create another if you want to make a subsequent POST. 890c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// TODO(timsteele): Bug 1482576. Consider splitting syncapi.h into two files: 891c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// one for the API defining the exports, which doesn't need to be included from 892c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// anywhere internally, and another file for the interfaces like this one. 893c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass HttpPostProviderInterface { 894c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 895c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch HttpPostProviderInterface() { } 896c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual ~HttpPostProviderInterface() { } 897c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 898c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Use specified user agent string when POSTing. If not called a default UA 899c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // may be used. 900c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void SetUserAgent(const char* user_agent) = 0; 901c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 902c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Add additional headers to the request. 903c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void SetExtraRequestHeaders(const char * headers) = 0; 904c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 905c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Set the URL to POST to. 906c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void SetURL(const char* url, int port) = 0; 907c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 908c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Set the type, length and content of the POST payload. 909c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // |content_type| is a null-terminated MIME type specifier. 910c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // |content| is a data buffer; Do not interpret as a null-terminated string. 911c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // |content_length| is the total number of chars in |content|. It is used to 912c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // assign/copy |content| data. 913c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void SetPostPayload(const char* content_type, int content_length, 914c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const char* content) = 0; 915c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 916c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns true if the URL request succeeded. If the request failed, 917c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // os_error() may be non-zero and hence contain more information. 918c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual bool MakeSynchronousPost(int* os_error_code, int* response_code) = 0; 919c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 920c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Get the length of the content returned in the HTTP response. 921c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This does not count the trailing null-terminating character returned 922c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // by GetResponseContent, so it is analogous to calling string.length. 923c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual int GetResponseContentLength() const = 0; 924c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 925c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Get the content returned in the HTTP response. 926c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This is a null terminated string of characters. 927c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Value should be copied. 928c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual const char* GetResponseContent() const = 0; 929c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 930c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Get the value of a header returned in the HTTP response. 931c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // If the header is not present, returns the empty string. 932c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual const std::string GetResponseHeaderValue( 933c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& name) const = 0; 934c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 935c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 936c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DISALLOW_COPY_AND_ASSIGN(HttpPostProviderInterface); 937c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 938c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 939c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// A factory to create HttpPostProviders to hide details about the 940c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// implementations and dependencies. 941c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// A factory instance itself should be owned by whomever uses it to create 942c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// HttpPostProviders. 943c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass HttpPostProviderFactory { 944c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 945c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Obtain a new HttpPostProviderInterface instance, owned by caller. 946c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual HttpPostProviderInterface* Create() = 0; 947c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 948c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // When the interface is no longer needed (ready to be cleaned up), clients 949c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // must call Destroy(). 950c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This allows actual HttpPostProvider subclass implementations to be 951c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // reference counted, which is useful if a particular implementation uses 952c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // multiple threads to serve network requests. 953c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void Destroy(HttpPostProviderInterface* http) = 0; 954c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual ~HttpPostProviderFactory() { } 955c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 956c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 957c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace sync_api 958c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 959c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif // CHROME_BROWSER_SYNC_ENGINE_SYNCAPI_H_ 960