15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Utility functions manipulating syncable::Entries, intended for use by the 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// syncer. 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SYNC_ENGINE_SYNCER_UTIL_H_ 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SYNC_ENGINE_SYNCER_UTIL_H_ 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set> 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "sync/base/sync_export.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/engine/syncer.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/engine/syncer_types.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/syncable/entry_kernel.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/syncable/metahandle_set.h" 20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "sync/syncable/mutable_entry.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/syncable/syncable_id.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace sync_pb { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SyncEntity; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace sync_pb 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace syncer { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace syncable { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BaseTransaction; 314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class ModelNeutralWriteTransaction; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace syncable 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Cryptographer; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If the server sent down a client-tagged entry, or an entry whose 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// commit response was lost, it is necessary to update a local entry 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// with an ID that doesn't match the ID of the update. Here, we 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// find the ID of such an entry, if it exists. This function may 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// determine that |server_entry| should be dropped; if so, it returns 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the null ID -- callers must handle this case. When update application 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// should proceed normally with a new local entry, this function will 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// return server_entry.id(); the caller must create an entry with that 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ID. This function does not alter the database. 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)syncable::Id FindLocalIdToUpdate( 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncable::BaseTransaction* trans, 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const sync_pb::SyncEntity& server_entry); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UpdateAttemptResponse AttemptToUpdateEntry( 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncable::WriteTransaction* const trans, 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncable::MutableEntry* const entry, 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Cryptographer* cryptographer); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Returns the most accurate position information available in this update. It 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// prefers to use the unique_position() field, but will fall back to using the 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// int64-based position_in_parent if necessary. 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// The suffix parameter is the unique bookmark tag for the item being updated. 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Will return an invalid position if no valid position can be constructed, or 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// if this type does not support positioning. 62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)SYNC_EXPORT_PRIVATE UniquePosition GetUpdatePosition( 63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const sync_pb::SyncEntity& update, 64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& suffix); 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Fetch the cache_guid and item_id-based unique bookmark tag from an update. 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Will return an empty string if someting unexpected happens. 68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)SYNC_EXPORT_PRIVATE std::string GetUniqueBookmarkTagFromUpdate( 69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const sync_pb::SyncEntity& update); 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Pass in name to avoid redundant UTF8 conversion. 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciSYNC_EXPORT_PRIVATE void UpdateServerFieldsFromUpdate( 734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) syncable::ModelNeutralMutableEntry* local_entry, 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const sync_pb::SyncEntity& server_entry, 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& name); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Creates a new Entry iff no Entry exists with the given id. 784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void CreateNewEntry(syncable::ModelNeutralWriteTransaction *trans, 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const syncable::Id& id); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This function is called on an entry when we can update the user-facing data 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// from the server data. 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void UpdateLocalDataFromServerData(syncable::WriteTransaction* trans, 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncable::MutableEntry* entry); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VerifyCommitResult ValidateCommitEntry(syncable::Entry* entry); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VerifyResult VerifyNewEntry(const sync_pb::SyncEntity& update, 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncable::Entry* target, 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const bool deleted); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assumes we have an existing entry; check here for updates that break 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// consistency rules. 944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)VerifyResult VerifyUpdateConsistency( 954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) syncable::ModelNeutralWriteTransaction* trans, 964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const sync_pb::SyncEntity& update, 974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const bool deleted, 984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const bool is_directory, 994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ModelType model_type, 1004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) syncable::ModelNeutralMutableEntry* target); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assumes we have an existing entry; verify an update that seems to be 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// expressing an 'undelete' 1044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)VerifyResult VerifyUndelete(syncable::ModelNeutralWriteTransaction* trans, 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const sync_pb::SyncEntity& update, 1064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) syncable::ModelNeutralMutableEntry* target); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MarkDeletedChildrenSynced( 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncable::Directory* dir, 1104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) syncable::BaseWriteTransaction* trans, 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<syncable::Id>* deleted_folders); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace syncer 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // SYNC_ENGINE_SYNCER_UTIL_H_ 116