OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "sync/internal_api/public/write_node.h" | 5 #include "sync/internal_api/public/write_node.h" |
6 | 6 |
7 #include "base/utf_string_conversions.h" | 7 #include "base/utf_string_conversions.h" |
8 #include "base/values.h" | 8 #include "base/values.h" |
9 #include "sync/internal_api/public/base_transaction.h" | 9 #include "sync/internal_api/public/base_transaction.h" |
10 #include "sync/internal_api/public/write_transaction.h" | 10 #include "sync/internal_api/public/write_transaction.h" |
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
198 SetEntitySpecifics(entity_specifics); | 198 SetEntitySpecifics(entity_specifics); |
199 } | 199 } |
200 | 200 |
201 void WriteNode::SetEntitySpecifics( | 201 void WriteNode::SetEntitySpecifics( |
202 const sync_pb::EntitySpecifics& new_value) { | 202 const sync_pb::EntitySpecifics& new_value) { |
203 ModelType new_specifics_type = | 203 ModelType new_specifics_type = |
204 GetModelTypeFromSpecifics(new_value); | 204 GetModelTypeFromSpecifics(new_value); |
205 DCHECK_NE(new_specifics_type, UNSPECIFIED); | 205 DCHECK_NE(new_specifics_type, UNSPECIFIED); |
206 DVLOG(1) << "Writing entity specifics of type " | 206 DVLOG(1) << "Writing entity specifics of type " |
207 << ModelTypeToString(new_specifics_type); | 207 << ModelTypeToString(new_specifics_type); |
208 // GetModelType() can be unspecified if this is the first time this | 208 DCHECK_EQ(new_specifics_type, GetModelType()); |
209 // node is being initialized (see PutModelType()). Otherwise, it | |
210 // should match |new_specifics_type|. | |
211 if (GetModelType() != UNSPECIFIED) { | |
212 DCHECK_EQ(new_specifics_type, GetModelType()); | |
213 } | |
214 | 209 |
215 // Preserve unknown fields. | 210 // Preserve unknown fields. |
216 const sync_pb::EntitySpecifics& old_specifics = entry_->Get(SPECIFICS); | 211 const sync_pb::EntitySpecifics& old_specifics = entry_->Get(SPECIFICS); |
217 sync_pb::EntitySpecifics new_specifics; | 212 sync_pb::EntitySpecifics new_specifics; |
218 new_specifics.CopyFrom(new_value); | 213 new_specifics.CopyFrom(new_value); |
219 new_specifics.mutable_unknown_fields()->MergeFrom( | 214 new_specifics.mutable_unknown_fields()->MergeFrom( |
220 old_specifics.unknown_fields()); | 215 old_specifics.unknown_fields()); |
221 | 216 |
222 // Will update the entry if encryption was necessary. | 217 // Will update the entry if encryption was necessary. |
223 if (!UpdateEntryWithEncryption(GetTransaction()->GetWrappedTrans(), | 218 if (!UpdateEntryWithEncryption(GetTransaction()->GetWrappedTrans(), |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
313 syncable::GET_BY_SERVER_TAG, tag); | 308 syncable::GET_BY_SERVER_TAG, tag); |
314 if (!entry_->good()) | 309 if (!entry_->good()) |
315 return INIT_FAILED_ENTRY_NOT_GOOD; | 310 return INIT_FAILED_ENTRY_NOT_GOOD; |
316 if (entry_->Get(syncable::IS_DEL)) | 311 if (entry_->Get(syncable::IS_DEL)) |
317 return INIT_FAILED_ENTRY_IS_DEL; | 312 return INIT_FAILED_ENTRY_IS_DEL; |
318 ModelType model_type = GetModelType(); | 313 ModelType model_type = GetModelType(); |
319 DCHECK_EQ(model_type, NIGORI); | 314 DCHECK_EQ(model_type, NIGORI); |
320 return INIT_OK; | 315 return INIT_OK; |
321 } | 316 } |
322 | 317 |
323 void WriteNode::PutModelType(ModelType model_type) { | |
324 // Set an empty specifics of the appropriate datatype. The presence | |
325 // of the specific field will identify the model type. | |
326 DCHECK(GetModelType() == model_type || | |
327 GetModelType() == UNSPECIFIED); // Immutable once set. | |
328 | |
329 sync_pb::EntitySpecifics specifics; | |
330 AddDefaultFieldValue(model_type, &specifics); | |
331 SetEntitySpecifics(specifics); | |
332 } | |
333 | |
334 // Create a new node with default properties, and bind this WriteNode to it. | 318 // Create a new node with default properties, and bind this WriteNode to it. |
335 // Return true on success. | 319 // Return true on success. |
336 bool WriteNode::InitByCreation(ModelType model_type, | 320 bool WriteNode::InitBookmarkByCreation(const BaseNode& parent, |
337 const BaseNode& parent, | 321 const BaseNode* predecessor) { |
338 const BaseNode* predecessor) { | |
339 DCHECK(!entry_) << "Init called twice"; | 322 DCHECK(!entry_) << "Init called twice"; |
340 // |predecessor| must be a child of |parent| or NULL. | 323 // |predecessor| must be a child of |parent| or NULL. |
341 if (predecessor && predecessor->GetParentId() != parent.GetId()) { | 324 if (predecessor && predecessor->GetParentId() != parent.GetId()) { |
342 DCHECK(false); | 325 DCHECK(false); |
343 return false; | 326 return false; |
344 } | 327 } |
345 | 328 |
346 syncable::Id parent_id = parent.GetEntry()->Get(syncable::ID); | 329 syncable::Id parent_id = parent.GetEntry()->Get(syncable::ID); |
347 | 330 |
348 // Start out with a dummy name. We expect | 331 // Start out with a dummy name. We expect |
349 // the caller to set a meaningful name after creation. | 332 // the caller to set a meaningful name after creation. |
350 string dummy(kDefaultNameForNewNodes); | 333 string dummy(kDefaultNameForNewNodes); |
351 | 334 |
352 entry_ = new syncable::MutableEntry(transaction_->GetWrappedWriteTrans(), | 335 entry_ = new syncable::MutableEntry(transaction_->GetWrappedWriteTrans(), |
353 syncable::CREATE, parent_id, dummy); | 336 syncable::CREATE, BOOKMARKS, |
| 337 parent_id, dummy); |
354 | 338 |
355 if (!entry_->good()) | 339 if (!entry_->good()) |
356 return false; | 340 return false; |
357 | 341 |
358 // Entries are untitled folders by default. | 342 // Entries are untitled folders by default. |
359 entry_->Put(syncable::IS_DIR, true); | 343 entry_->Put(syncable::IS_DIR, true); |
360 | 344 |
361 PutModelType(model_type); | |
362 | |
363 // Now set the predecessor, which sets IS_UNSYNCED as necessary. | 345 // Now set the predecessor, which sets IS_UNSYNCED as necessary. |
364 return PutPredecessor(predecessor); | 346 return PutPredecessor(predecessor); |
365 } | 347 } |
366 | 348 |
367 // Create a new node with default properties and a client defined unique tag, | 349 // Create a new node with default properties and a client defined unique tag, |
368 // and bind this WriteNode to it. | 350 // and bind this WriteNode to it. |
369 // Return true on success. If the tag exists in the database, then | 351 // Return true on success. If the tag exists in the database, then |
370 // we will attempt to undelete the node. | 352 // we will attempt to undelete the node. |
371 // TODO(chron): Code datatype into hash tag. | 353 // TODO(chron): Code datatype into hash tag. |
372 // TODO(chron): Is model type ever lost? | 354 // TODO(chron): Is model type ever lost? |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
420 // tags and updates. | 402 // tags and updates. |
421 | 403 |
422 existing_entry->Put(syncable::NON_UNIQUE_NAME, dummy); | 404 existing_entry->Put(syncable::NON_UNIQUE_NAME, dummy); |
423 existing_entry->Put(syncable::PARENT_ID, parent_id); | 405 existing_entry->Put(syncable::PARENT_ID, parent_id); |
424 entry_ = existing_entry.release(); | 406 entry_ = existing_entry.release(); |
425 } else { | 407 } else { |
426 return INIT_FAILED_ENTRY_ALREADY_EXISTS; | 408 return INIT_FAILED_ENTRY_ALREADY_EXISTS; |
427 } | 409 } |
428 } else { | 410 } else { |
429 entry_ = new syncable::MutableEntry(transaction_->GetWrappedWriteTrans(), | 411 entry_ = new syncable::MutableEntry(transaction_->GetWrappedWriteTrans(), |
430 syncable::CREATE, parent_id, dummy); | 412 syncable::CREATE, |
| 413 model_type, parent_id, dummy); |
431 if (!entry_->good()) | 414 if (!entry_->good()) |
432 return INIT_FAILED_COULD_NOT_CREATE_ENTRY; | 415 return INIT_FAILED_COULD_NOT_CREATE_ENTRY; |
433 | 416 |
434 // Only set IS_DIR for new entries. Don't bitflip undeleted ones. | 417 // Only set IS_DIR for new entries. Don't bitflip undeleted ones. |
435 entry_->Put(syncable::UNIQUE_CLIENT_TAG, hash); | 418 entry_->Put(syncable::UNIQUE_CLIENT_TAG, hash); |
436 } | 419 } |
437 | 420 |
438 // We don't support directory and tag combinations. | 421 // We don't support directory and tag combinations. |
439 entry_->Put(syncable::IS_DIR, false); | 422 entry_->Put(syncable::IS_DIR, false); |
440 | 423 |
441 // Will clear specifics data. | |
442 PutModelType(model_type); | |
443 | |
444 // Now set the predecessor, which sets IS_UNSYNCED as necessary. | 424 // Now set the predecessor, which sets IS_UNSYNCED as necessary. |
445 bool success = PutPredecessor(NULL); | 425 bool success = PutPredecessor(NULL); |
446 if (!success) | 426 if (!success) |
447 return INIT_FAILED_SET_PREDECESSOR; | 427 return INIT_FAILED_SET_PREDECESSOR; |
448 | 428 |
449 return INIT_SUCCESS; | 429 return INIT_SUCCESS; |
450 } | 430 } |
451 | 431 |
452 bool WriteNode::SetPosition(const BaseNode& new_parent, | 432 bool WriteNode::SetPosition(const BaseNode& new_parent, |
453 const BaseNode* predecessor) { | 433 const BaseNode* predecessor) { |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
506 MarkForSyncing(); | 486 MarkForSyncing(); |
507 | 487 |
508 return true; | 488 return true; |
509 } | 489 } |
510 | 490 |
511 void WriteNode::MarkForSyncing() { | 491 void WriteNode::MarkForSyncing() { |
512 syncable::MarkForSyncing(entry_); | 492 syncable::MarkForSyncing(entry_); |
513 } | 493 } |
514 | 494 |
515 } // namespace syncer | 495 } // namespace syncer |
OLD | NEW |