| // 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 |