diff options
Diffstat (limited to 'sync/internal_api/read_node.cc')
-rw-r--r-- | sync/internal_api/read_node.cc | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/sync/internal_api/read_node.cc b/sync/internal_api/read_node.cc new file mode 100644 index 0000000..00ee6bc --- /dev/null +++ b/sync/internal_api/read_node.cc @@ -0,0 +1,97 @@ +// 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/read_node.h" + +#include "base/logging.h" +#include "sync/internal_api/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 |