Roll src/third_party/WebKit f36d5e0:68b67cd (svn 193299:193303)
[chromium-blink-merge.git] / sync / internal_api / read_node.cc
blobc162800df0c0e1e1801d6dacb5dc70f02dd92251
1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "sync/internal_api/public/read_node.h"
7 #include "base/logging.h"
8 #include "sync/internal_api/public/base_transaction.h"
9 #include "sync/syncable/entry.h"
10 #include "sync/syncable/syncable_base_transaction.h"
11 #include "sync/syncable/syncable_util.h"
13 namespace syncer {
15 //////////////////////////////////////////////////////////////////////////
16 // ReadNode member definitions
17 ReadNode::ReadNode(const BaseTransaction* transaction)
18 : entry_(NULL), transaction_(transaction) {
19 DCHECK(transaction);
22 ReadNode::ReadNode() {
23 entry_ = NULL;
24 transaction_ = NULL;
27 ReadNode::~ReadNode() {
28 delete entry_;
31 void ReadNode::InitByRootLookup() {
32 DCHECK(!entry_) << "Init called twice";
33 syncable::BaseTransaction* trans = transaction_->GetWrappedTrans();
34 entry_ = new syncable::Entry(trans, syncable::GET_BY_ID, trans->root_id());
35 if (!entry_->good())
36 DCHECK(false) << "Could not lookup root node for reading.";
39 BaseNode::InitByLookupResult ReadNode::InitByIdLookup(int64 id) {
40 DCHECK(!entry_) << "Init called twice";
41 DCHECK_NE(id, kInvalidId);
42 syncable::BaseTransaction* trans = transaction_->GetWrappedTrans();
43 entry_ = new syncable::Entry(trans, syncable::GET_BY_HANDLE, id);
44 if (!entry_->good())
45 return INIT_FAILED_ENTRY_NOT_GOOD;
46 if (entry_->GetIsDel())
47 return INIT_FAILED_ENTRY_IS_DEL;
48 ModelType model_type = GetModelType();
49 LOG_IF(WARNING, model_type == UNSPECIFIED || model_type == TOP_LEVEL_FOLDER)
50 << "SyncAPI InitByIdLookup referencing unusual object.";
51 return DecryptIfNecessary() ? INIT_OK : INIT_FAILED_DECRYPT_IF_NECESSARY;
54 BaseNode::InitByLookupResult ReadNode::InitByClientTagLookup(
55 ModelType model_type,
56 const std::string& tag) {
57 DCHECK(!entry_) << "Init called twice";
58 if (tag.empty())
59 return INIT_FAILED_PRECONDITION;
61 const std::string hash = syncable::GenerateSyncableHash(model_type, tag);
63 entry_ = new syncable::Entry(transaction_->GetWrappedTrans(),
64 syncable::GET_BY_CLIENT_TAG, hash);
65 if (!entry_->good())
66 return INIT_FAILED_ENTRY_NOT_GOOD;
67 if (entry_->GetIsDel())
68 return INIT_FAILED_ENTRY_IS_DEL;
69 return DecryptIfNecessary() ? INIT_OK : INIT_FAILED_DECRYPT_IF_NECESSARY;
72 const syncable::Entry* ReadNode::GetEntry() const {
73 return entry_;
76 const BaseTransaction* ReadNode::GetTransaction() const {
77 return transaction_;
80 BaseNode::InitByLookupResult ReadNode::InitByTagLookupForBookmarks(
81 const std::string& tag) {
82 DCHECK(!entry_) << "Init called twice";
83 if (tag.empty())
84 return INIT_FAILED_PRECONDITION;
85 syncable::BaseTransaction* trans = transaction_->GetWrappedTrans();
86 entry_ = new syncable::Entry(trans, syncable::GET_BY_SERVER_TAG, tag);
87 if (!entry_->good())
88 return INIT_FAILED_ENTRY_NOT_GOOD;
89 if (entry_->GetIsDel())
90 return INIT_FAILED_ENTRY_IS_DEL;
91 ModelType model_type = GetModelType();
92 DCHECK_EQ(model_type, BOOKMARKS)
93 << "InitByTagLookup deprecated for all types except bookmarks.";
94 return DecryptIfNecessary() ? INIT_OK : INIT_FAILED_DECRYPT_IF_NECESSARY;
97 BaseNode::InitByLookupResult ReadNode::InitTypeRoot(ModelType type) {
98 DCHECK(!entry_) << "Init called twice";
99 if (!IsRealDataType(type))
100 return INIT_FAILED_PRECONDITION;
101 syncable::BaseTransaction* trans = transaction_->GetWrappedTrans();
102 entry_ = new syncable::Entry(trans, syncable::GET_TYPE_ROOT, type);
103 if (!entry_->good())
104 return INIT_FAILED_ENTRY_NOT_GOOD;
105 if (entry_->GetIsDel())
106 return INIT_FAILED_ENTRY_IS_DEL;
107 ModelType found_model_type = GetModelType();
108 LOG_IF(WARNING, found_model_type == UNSPECIFIED ||
109 found_model_type == TOP_LEVEL_FOLDER)
110 << "SyncAPI InitTypeRoot referencing unusually typed object.";
111 return DecryptIfNecessary() ? INIT_OK : INIT_FAILED_DECRYPT_IF_NECESSARY;
114 } // namespace syncer