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 BaseNode::InitByLookupResult
ReadNode::InitByTagLookupForBookmarks(
81 const std::string
& tag
) {
82 DCHECK(!entry_
) << "Init called twice";
84 return INIT_FAILED_PRECONDITION
;
85 syncable::BaseTransaction
* trans
= transaction_
->GetWrappedTrans();
86 entry_
= new syncable::Entry(trans
, syncable::GET_BY_SERVER_TAG
, tag
);
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
);
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