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)#ifndef SYNC_SYNCABLE_ENTRY_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SYNC_SYNCABLE_ENTRY_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "sync/base/sync_export.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/syncable/entry_kernel.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace syncer {
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Cryptographer;
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ReadNode;
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace syncable {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Directory;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BaseTransaction;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A read-only meta entry
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Instead of:
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   Entry e = transaction.GetById(id);
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// use:
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   Entry e(transaction, GET_BY_ID, id);
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Why?  The former would require a copy constructor, and it would be difficult
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to enforce that an entry never outlived its transaction if there were a copy
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// constructor.
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum GetById {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GET_BY_ID
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum GetByClientTag {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GET_BY_CLIENT_TAG
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum GetByServerTag {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GET_BY_SERVER_TAG
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum GetByHandle {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GET_BY_HANDLE
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SYNC_EXPORT Entry {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // After constructing, you must check good() to test whether the Get
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // succeeded.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Entry(BaseTransaction* trans, GetByHandle, int64 handle);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Entry(BaseTransaction* trans, GetById, const Id& id);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Entry(BaseTransaction* trans, GetByServerTag, const std::string& tag);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Entry(BaseTransaction* trans, GetByClientTag, const std::string& tag);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool good() const { return 0 != kernel_; }
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BaseTransaction* trans() const { return basetrans_; }
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Field accessors.
59d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  int64 GetMetahandle() const {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(kernel_);
61d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return kernel_->ref(META_HANDLE);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
63d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
64d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  int64 GetBaseVersion() const {
65d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    DCHECK(kernel_);
66d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return kernel_->ref(BASE_VERSION);
67d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
68d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
69d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  int64 GetServerVersion() const {
70d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    DCHECK(kernel_);
71d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return kernel_->ref(SERVER_VERSION);
72d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
73d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
74d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  int64 GetLocalExternalId() const {
75d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    DCHECK(kernel_);
76d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return kernel_->ref(LOCAL_EXTERNAL_ID);
77d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
78d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
79d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  int64 GetTransactionVersion() const {
80d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    DCHECK(kernel_);
81d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return kernel_->ref(TRANSACTION_VERSION);
82d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
83d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
84d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  const base::Time& GetMtime() const {
85d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    DCHECK(kernel_);
86d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return kernel_->ref(MTIME);
87d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
88d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
89d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  const base::Time& GetServerMtime() const {
90d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    DCHECK(kernel_);
91d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return kernel_->ref(SERVER_MTIME);
92d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
93d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
94d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  const base::Time& GetCtime() const {
95d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    DCHECK(kernel_);
96d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return kernel_->ref(CTIME);
97d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
98d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
99d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  const base::Time& GetServerCtime() const {
100d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    DCHECK(kernel_);
101d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return kernel_->ref(SERVER_CTIME);
102d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
103d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
104d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  Id GetId() const {
105d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    DCHECK(kernel_);
106d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return kernel_->ref(ID);
107d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
108d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
109d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  Id GetParentId() const {
110d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    DCHECK(kernel_);
111d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return kernel_->ref(PARENT_ID);
112d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
113d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
114d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  Id GetServerParentId() const {
115d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    DCHECK(kernel_);
116d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return kernel_->ref(SERVER_PARENT_ID);
117d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
118d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
119d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  bool GetIsUnsynced() const {
120d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    DCHECK(kernel_);
121d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return kernel_->ref(IS_UNSYNCED);
122d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
123d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
124d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  bool GetIsUnappliedUpdate() const {
125d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    DCHECK(kernel_);
126d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return kernel_->ref(IS_UNAPPLIED_UPDATE);
127d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
128d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
129d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  bool GetIsDel() const {
130d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    DCHECK(kernel_);
131d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return kernel_->ref(IS_DEL);
132d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
133d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
134d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  bool GetIsDir() const {
135d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    DCHECK(kernel_);
136d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return kernel_->ref(IS_DIR);
137d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
138d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
139d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  bool GetServerIsDir() const {
140d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    DCHECK(kernel_);
141d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return kernel_->ref(SERVER_IS_DIR);
142d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
143d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
144d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  bool GetServerIsDel() const {
145d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    DCHECK(kernel_);
146d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return kernel_->ref(SERVER_IS_DEL);
147d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
148d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
149d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  const std::string& GetNonUniqueName() const {
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(kernel_);
151d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return kernel_->ref(NON_UNIQUE_NAME);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
153d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
154d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  const std::string& GetServerNonUniqueName() const {
155d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    DCHECK(kernel_);
156d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return kernel_->ref(SERVER_NON_UNIQUE_NAME);
157d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
158d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
159d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  const std::string& GetUniqueServerTag() const {
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(kernel_);
161d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return kernel_->ref(UNIQUE_SERVER_TAG);
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
163d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
164d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  const std::string& GetUniqueClientTag() const {
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(kernel_);
166d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return kernel_->ref(UNIQUE_CLIENT_TAG);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
168d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
169d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  const std::string& GetUniqueBookmarkTag() const {
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(kernel_);
171d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return kernel_->ref(UNIQUE_BOOKMARK_TAG);
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
173d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
174d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  const sync_pb::EntitySpecifics& GetSpecifics() const {
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(kernel_);
176d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return kernel_->ref(SPECIFICS);
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
178d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
179d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  const sync_pb::EntitySpecifics& GetServerSpecifics() const {
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(kernel_);
181d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return kernel_->ref(SERVER_SPECIFICS);
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
183d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
184d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  const sync_pb::EntitySpecifics& GetBaseServerSpecifics() const {
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(kernel_);
186d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return kernel_->ref(BASE_SERVER_SPECIFICS);
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
188d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
189d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  const UniquePosition& GetServerUniquePosition() const {
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(kernel_);
191d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return kernel_->ref(SERVER_UNIQUE_POSITION);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
193d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
194d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  const UniquePosition& GetUniquePosition() const {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(kernel_);
196d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return kernel_->ref(UNIQUE_POSITION);
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
198d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
199d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  bool GetSyncing() const {
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(kernel_);
201d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return kernel_->ref(SYNCING);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ModelType GetServerModelType() const;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ModelType GetModelType() const;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Id GetPredecessorId() const;
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Id GetSuccessorId() const;
209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Id GetFirstChildId() const;
210868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  int GetTotalNodeCount() const;
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  int GetPositionIndex() const;
2137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
21490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Returns a vector of this node's children's handles.
21590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Clears |result| if there are no children.  If this node is of a type that
21690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // supports user-defined ordering then the resulting vector will be in the
21790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // proper order.
21890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void GetChildHandles(std::vector<int64>* result) const;
21990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  inline bool ExistsOnClientBecauseNameIsNonEmpty() const {
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(kernel_);
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return !kernel_->ref(NON_UNIQUE_NAME).empty();
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  inline bool IsRoot() const {
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(kernel_);
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return kernel_->ref(ID).IsRoot();
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Returns true if this is an entry that is expected to maintain a certain
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // sort ordering relative to its siblings under the same parent.
232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool ShouldMaintainPosition() const;
233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Directory* dir() const;
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const EntryKernel GetKernelCopy() const {
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return *kernel_;
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Dumps all entry info into a DictionaryValue and returns it.
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Transfers ownership of the DictionaryValue to the caller.
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::DictionaryValue* ToValue(Cryptographer* cryptographer) const;
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:  // Don't allow creation on heap, except by sync API wrappers.
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void* operator new(size_t size) { return (::operator new)(size); }
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  inline explicit Entry(BaseTransaction* trans)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : basetrans_(trans),
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kernel_(NULL) { }
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BaseTransaction* const basetrans_;
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EntryKernel* kernel_;
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class Directory;
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class syncer::ReadNode;
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend std::ostream& operator << (std::ostream& s, const Entry& e);
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(Entry);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::ostream& operator<<(std::ostream& os, const Entry& entry);
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace syncable
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace syncer
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // SYNC_SYNCABLE_ENTRY_H_
270