// Copyright (c) 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/syncable.h" namespace sync_api { ////////////////////////////////////////////////////////////////////////// // 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_->Get(syncable::IS_DEL)) return INIT_FAILED_ENTRY_IS_DEL; syncable::ModelType model_type = GetModelType(); LOG_IF(WARNING, model_type == syncable::UNSPECIFIED || model_type == syncable::TOP_LEVEL_FOLDER) << "SyncAPI InitByIdLookup referencing unusual object."; return DecryptIfNecessary() ? INIT_OK : INIT_FAILED_DECRYPT_IF_NECESSARY; } BaseNode::InitByLookupResult ReadNode::InitByClientTagLookup( syncable::ModelType model_type, const std::string& tag) { DCHECK(!entry_) << "Init called twice"; if (tag.empty()) return INIT_FAILED_PRECONDITION; const std::string hash = 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_->Get(syncable::IS_DEL)) 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::InitByTagLookup( 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_->Get(syncable::IS_DEL)) return INIT_FAILED_ENTRY_IS_DEL; syncable::ModelType model_type = GetModelType(); LOG_IF(WARNING, model_type == syncable::UNSPECIFIED || model_type == syncable::TOP_LEVEL_FOLDER) << "SyncAPI InitByTagLookup referencing unusually typed object."; return DecryptIfNecessary() ? INIT_OK : INIT_FAILED_DECRYPT_IF_NECESSARY; } } // namespace sync_api