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