// 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/read_node.h" #include "base/logging.h" #include "sync/internal_api/public/base_transaction.h" #include "sync/syncable/entry.h" #include "sync/syncable/syncable_base_transaction.h" #include "sync/syncable/syncable_util.h" namespace syncer { ////////////////////////////////////////////////////////////////////////// // ReadNode member definitions ReadNode::ReadNode(const BaseTransaction* transaction) : entry_(NULL), transaction_(transaction) { DCHECK(transaction); } ReadNode::ReadNode() { entry_ = NULL; transaction_ = NULL; } ReadNode::~ReadNode() { delete entry_; } void ReadNode::InitByRootLookup() { DCHECK(!entry_) << "Init called twice"; syncable::BaseTransaction* trans = transaction_->GetWrappedTrans(); entry_ = new syncable::Entry(trans, syncable::GET_BY_ID, trans->root_id()); if (!entry_->good()) DCHECK(false) << "Could not lookup root node for reading."; } BaseNode::InitByLookupResult ReadNode::InitByIdLookup(int64 id) { DCHECK(!entry_) << "Init called twice"; DCHECK_NE(id, kInvalidId); syncable::BaseTransaction* trans = transaction_->GetWrappedTrans(); entry_ = new syncable::Entry(trans, syncable::GET_BY_HANDLE, id); if (!entry_->good()) return INIT_FAILED_ENTRY_NOT_GOOD; if (entry_->GetIsDel()) return INIT_FAILED_ENTRY_IS_DEL; ModelType model_type = GetModelType(); LOG_IF(WARNING, model_type == UNSPECIFIED || model_type == TOP_LEVEL_FOLDER) << "SyncAPI InitByIdLookup referencing unusual object."; return DecryptIfNecessary() ? INIT_OK : INIT_FAILED_DECRYPT_IF_NECESSARY; } BaseNode::InitByLookupResult ReadNode::InitByClientTagLookup( ModelType model_type, const std::string& tag) { DCHECK(!entry_) << "Init called twice"; if (tag.empty()) return INIT_FAILED_PRECONDITION; const std::string hash = syncable::GenerateSyncableHash(model_type, tag); entry_ = new syncable::Entry(transaction_->GetWrappedTrans(), syncable::GET_BY_CLIENT_TAG, hash); if (!entry_->good()) return INIT_FAILED_ENTRY_NOT_GOOD; if (entry_->GetIsDel()) return INIT_FAILED_ENTRY_IS_DEL; return DecryptIfNecessary() ? INIT_OK : INIT_FAILED_DECRYPT_IF_NECESSARY; } const syncable::Entry* ReadNode::GetEntry() const { return entry_; } const BaseTransaction* ReadNode::GetTransaction() const { return transaction_; } BaseNode::InitByLookupResult ReadNode::InitByTagLookupForBookmarks( const std::string& tag) { DCHECK(!entry_) << "Init called twice"; if (tag.empty()) return INIT_FAILED_PRECONDITION; syncable::BaseTransaction* trans = transaction_->GetWrappedTrans(); entry_ = new syncable::Entry(trans, syncable::GET_BY_SERVER_TAG, tag); if (!entry_->good()) return INIT_FAILED_ENTRY_NOT_GOOD; if (entry_->GetIsDel()) return INIT_FAILED_ENTRY_IS_DEL; ModelType model_type = GetModelType(); DCHECK_EQ(model_type, BOOKMARKS) << "InitByTagLookup deprecated for all types except bookmarks."; return DecryptIfNecessary() ? INIT_OK : INIT_FAILED_DECRYPT_IF_NECESSARY; } BaseNode::InitByLookupResult ReadNode::InitTypeRoot(ModelType type) { DCHECK(!entry_) << "Init called twice"; if (!IsRealDataType(type)) return INIT_FAILED_PRECONDITION; syncable::BaseTransaction* trans = transaction_->GetWrappedTrans(); entry_ = new syncable::Entry(trans, syncable::GET_TYPE_ROOT, type); if (!entry_->good()) return INIT_FAILED_ENTRY_NOT_GOOD; if (entry_->GetIsDel()) return INIT_FAILED_ENTRY_IS_DEL; ModelType found_model_type = GetModelType(); LOG_IF(WARNING, found_model_type == UNSPECIFIED || found_model_type == TOP_LEVEL_FOLDER) << "SyncAPI InitTypeRoot referencing unusually typed object."; return DecryptIfNecessary() ? INIT_OK : INIT_FAILED_DECRYPT_IF_NECESSARY; } } // namespace syncer