12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/read_node.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/base_transaction.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/syncable/entry.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "sync/syncable/syncable_base_transaction.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "sync/syncable/syncable_util.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace syncer {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ReadNode member definitions
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ReadNode::ReadNode(const BaseTransaction* transaction)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : entry_(NULL), transaction_(transaction) {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(transaction);
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ReadNode::ReadNode() {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry_ = NULL;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  transaction_ = NULL;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ReadNode::~ReadNode() {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete entry_;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ReadNode::InitByRootLookup() {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!entry_) << "Init called twice";
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncable::BaseTransaction* trans = transaction_->GetWrappedTrans();
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry_ = new syncable::Entry(trans, syncable::GET_BY_ID, trans->root_id());
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!entry_->good())
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(false) << "Could not lookup root node for reading.";
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BaseNode::InitByLookupResult ReadNode::InitByIdLookup(int64 id) {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!entry_) << "Init called twice";
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_NE(id, kInvalidId);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncable::BaseTransaction* trans = transaction_->GetWrappedTrans();
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry_ = new syncable::Entry(trans, syncable::GET_BY_HANDLE, id);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!entry_->good())
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return INIT_FAILED_ENTRY_NOT_GOOD;
46d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (entry_->GetIsDel())
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return INIT_FAILED_ENTRY_IS_DEL;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ModelType model_type = GetModelType();
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LOG_IF(WARNING, model_type == UNSPECIFIED || model_type == TOP_LEVEL_FOLDER)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << "SyncAPI InitByIdLookup referencing unusual object.";
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return DecryptIfNecessary() ? INIT_OK : INIT_FAILED_DECRYPT_IF_NECESSARY;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BaseNode::InitByLookupResult ReadNode::InitByClientTagLookup(
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ModelType model_type,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& tag) {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!entry_) << "Init called twice";
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (tag.empty())
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return INIT_FAILED_PRECONDITION;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::string hash = syncable::GenerateSyncableHash(model_type, tag);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry_ = new syncable::Entry(transaction_->GetWrappedTrans(),
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               syncable::GET_BY_CLIENT_TAG, hash);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!entry_->good())
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return INIT_FAILED_ENTRY_NOT_GOOD;
67d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (entry_->GetIsDel())
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return INIT_FAILED_ENTRY_IS_DEL;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return DecryptIfNecessary() ? INIT_OK : INIT_FAILED_DECRYPT_IF_NECESSARY;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const syncable::Entry* ReadNode::GetEntry() const {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return entry_;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const BaseTransaction* ReadNode::GetTransaction() const {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return transaction_;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)BaseNode::InitByLookupResult ReadNode::InitByTagLookupForBookmarks(
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& tag) {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!entry_) << "Init called twice";
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (tag.empty())
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return INIT_FAILED_PRECONDITION;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncable::BaseTransaction* trans = transaction_->GetWrappedTrans();
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry_ = new syncable::Entry(trans, syncable::GET_BY_SERVER_TAG, tag);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!entry_->good())
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return INIT_FAILED_ENTRY_NOT_GOOD;
89d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (entry_->GetIsDel())
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return INIT_FAILED_ENTRY_IS_DEL;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ModelType model_type = GetModelType();
9246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DCHECK_EQ(model_type, BOOKMARKS)
9346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      << "InitByTagLookup deprecated for all types except bookmarks.";
9446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return DecryptIfNecessary() ? INIT_OK : INIT_FAILED_DECRYPT_IF_NECESSARY;
9546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
9646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
9746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)BaseNode::InitByLookupResult ReadNode::InitTypeRoot(ModelType type) {
9846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DCHECK(!entry_) << "Init called twice";
9946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (!IsRealDataType(type))
10046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return INIT_FAILED_PRECONDITION;
10146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  syncable::BaseTransaction* trans = transaction_->GetWrappedTrans();
10246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  entry_ = new syncable::Entry(trans, syncable::GET_TYPE_ROOT, type);
10346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (!entry_->good())
10446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return INIT_FAILED_ENTRY_NOT_GOOD;
10546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (entry_->GetIsDel())
10646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return INIT_FAILED_ENTRY_IS_DEL;
10746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ModelType found_model_type = GetModelType();
10846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  LOG_IF(WARNING, found_model_type == UNSPECIFIED ||
10946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                  found_model_type == TOP_LEVEL_FOLDER)
11046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      << "SyncAPI InitTypeRoot referencing unusually typed object.";
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return DecryptIfNecessary() ? INIT_OK : INIT_FAILED_DECRYPT_IF_NECESSARY;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace syncer
115