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"
15 //////////////////////////////////////////////////////////////////////////
16 // ReadNode member definitions
17 ReadNode::ReadNode(const BaseTransaction
* transaction
)
18 : entry_(NULL
), transaction_(transaction
) {
22 ReadNode::ReadNode() {
27 ReadNode::~ReadNode() {
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());
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
);
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(
56 const std::string
& tag
) {
57 DCHECK(!entry_
) << "Init called twice";
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
);
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 {
76 const BaseTransaction
* ReadNode::GetTransaction() const {
80 int64
ReadNode::GetTransactionVersion() const {
81 return GetEntry()->GetTransactionVersion();
84 BaseNode::InitByLookupResult
ReadNode::InitByTagLookupForBookmarks(
85 const std::string
& tag
) {
86 DCHECK(!entry_
) << "Init called twice";
88 return INIT_FAILED_PRECONDITION
;
89 syncable::BaseTransaction
* trans
= transaction_
->GetWrappedTrans();
90 entry_
= new syncable::Entry(trans
, syncable::GET_BY_SERVER_TAG
, tag
);
92 return INIT_FAILED_ENTRY_NOT_GOOD
;
93 if (entry_
->GetIsDel())
94 return INIT_FAILED_ENTRY_IS_DEL
;
95 ModelType model_type
= GetModelType();
96 DCHECK_EQ(model_type
, BOOKMARKS
)
97 << "InitByTagLookup deprecated for all types except bookmarks.";
98 return DecryptIfNecessary() ? INIT_OK
: INIT_FAILED_DECRYPT_IF_NECESSARY
;
101 BaseNode::InitByLookupResult
ReadNode::InitTypeRoot(ModelType type
) {
102 DCHECK(!entry_
) << "Init called twice";
103 if (!IsRealDataType(type
))
104 return INIT_FAILED_PRECONDITION
;
105 syncable::BaseTransaction
* trans
= transaction_
->GetWrappedTrans();
106 entry_
= new syncable::Entry(trans
, syncable::GET_TYPE_ROOT
, type
);
108 return INIT_FAILED_ENTRY_NOT_GOOD
;
109 if (entry_
->GetIsDel())
110 return INIT_FAILED_ENTRY_IS_DEL
;
111 ModelType found_model_type
= GetModelType();
112 LOG_IF(WARNING
, found_model_type
== UNSPECIFIED
||
113 found_model_type
== TOP_LEVEL_FOLDER
)
114 << "SyncAPI InitTypeRoot referencing unusually typed object.";
115 return DecryptIfNecessary() ? INIT_OK
: INIT_FAILED_DECRYPT_IF_NECESSARY
;
118 } // namespace syncer