// Copyright 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "sync/internal_api/public/write_transaction.h" #include #include "sync/syncable/directory.h" #include "sync/syncable/mutable_entry.h" #include "sync/syncable/syncable_write_transaction.h" namespace syncer { ////////////////////////////////////////////////////////////////////////// // WriteTransaction member definitions WriteTransaction::WriteTransaction(const tracked_objects::Location& from_here, UserShare* share) : BaseTransaction(share), transaction_(NULL) { transaction_ = new syncable::WriteTransaction(from_here, syncable::SYNCAPI, share->directory.get()); } WriteTransaction::WriteTransaction(const tracked_objects::Location& from_here, UserShare* share, int64_t* new_model_version) : BaseTransaction(share), transaction_(NULL) { transaction_ = new syncable::WriteTransaction(from_here, share->directory.get(), new_model_version); } WriteTransaction::~WriteTransaction() { delete transaction_; } syncable::BaseTransaction* WriteTransaction::GetWrappedTrans() const { return transaction_; } void WriteTransaction::SetDataTypeContext( ModelType type, syncer::SyncChangeProcessor::ContextRefreshStatus refresh_status, const std::string& context) { DCHECK(ProtocolTypes().Has(type)); int field_number = GetSpecificsFieldNumberFromModelType(type); sync_pb::DataTypeContext local_context; GetDirectory()->GetDataTypeContext(transaction_, type, &local_context); if (local_context.context() == context) return; if (!local_context.has_data_type_id()) local_context.set_data_type_id(field_number); DCHECK_EQ(field_number, local_context.data_type_id()); DCHECK_GE(local_context.version(), 0); local_context.set_version(local_context.version() + 1); local_context.set_context(context); GetDirectory()->SetDataTypeContext(transaction_, type, local_context); if (refresh_status == syncer::SyncChangeProcessor::REFRESH_NEEDED) { DVLOG(1) << "Forcing refresh of type " << ModelTypeToString(type); // Clear the progress token from the progress markers. Preserve all other // state, in case a GC directive was present. sync_pb::DataTypeProgressMarker progress_marker; GetDirectory()->GetDownloadProgress(type, &progress_marker); progress_marker.clear_token(); GetDirectory()->SetDownloadProgress(type, progress_marker); // Go through and reset the versions for all the synced entities of this // data type. GetDirectory()->ResetVersionsForType(transaction_, type); } // Note that it's possible for a GetUpdatesResponse that arrives immediately // after the context update to override the cleared progress markers. // TODO(zea): add a flag in the directory to prevent this from happening. // See crbug.com/360280 } void WriteTransaction::UpdateEntriesMarkAttachmentAsOnServer( const AttachmentId& attachment_id) { syncable::Directory::Metahandles handles; GetDirectory()->GetMetahandlesByAttachmentId( transaction_, attachment_id.GetProto(), &handles); for (syncable::Directory::Metahandles::iterator iter = handles.begin(); iter != handles.end(); ++iter) { syncable::MutableEntry entry(transaction_, syncable::GET_BY_HANDLE, *iter); entry.MarkAttachmentAsOnServer(attachment_id.GetProto()); } } } // namespace syncer