summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--components/sync_driver/generic_change_processor.cc69
-rw-r--r--components/sync_driver/generic_change_processor.h31
-rw-r--r--components/sync_driver/generic_change_processor_unittest.cc43
-rw-r--r--sync/api/sync_data.cc54
-rw-r--r--sync/api/sync_data.h12
-rw-r--r--sync/api/sync_data_unittest.cc19
6 files changed, 71 insertions, 157 deletions
diff --git a/components/sync_driver/generic_change_processor.cc b/components/sync_driver/generic_change_processor.cc
index 30b215e..9bfd0c2 100644
--- a/components/sync_driver/generic_change_processor.cc
+++ b/components/sync_driver/generic_change_processor.cc
@@ -85,11 +85,6 @@ syncer::SyncData BuildRemoteSyncData(
attachment_service_proxy);
}
-const syncer::AttachmentId& AttachmentToAttachmentId(
- const syncer::Attachment& attachment) {
- return attachment.GetId();
-}
-
} // namespace
GenericChangeProcessor::GenericChangeProcessor(
@@ -410,7 +405,7 @@ syncer::SyncError GenericChangeProcessor::ProcessSyncChanges(
// Keep track of brand new attachments so we can persist them on this device
// and upload them to the server.
- syncer::AttachmentList new_attachments;
+ syncer::AttachmentIdList new_attachments;
syncer::WriteTransaction trans(from_here, share_handle());
@@ -476,7 +471,7 @@ syncer::SyncError GenericChangeProcessor::ProcessSyncChanges(
NOTREACHED();
return error;
}
- StoreAndUploadAttachments(new_attachments);
+ UploadAttachments(new_attachments);
}
return syncer::SyncError();
@@ -492,7 +487,7 @@ syncer::SyncError GenericChangeProcessor::HandleActionAdd(
const syncer::ModelType& type,
const syncer::WriteTransaction& trans,
syncer::WriteNode* sync_node,
- syncer::AttachmentList* new_attachments) {
+ syncer::AttachmentIdList* new_attachments) {
// TODO(sync): Handle other types of creation (custom parents, folders,
// etc.).
syncer::ReadNode root_node(&trans);
@@ -560,12 +555,8 @@ syncer::SyncError GenericChangeProcessor::HandleActionAdd(
SetAttachmentMetadata(attachment_ids, sync_node);
// Return any newly added attachments.
- const syncer::AttachmentList& local_attachments_for_upload =
- sync_data_local.GetLocalAttachmentsForUpload();
- new_attachments->insert(new_attachments->end(),
- local_attachments_for_upload.begin(),
- local_attachments_for_upload.end());
-
+ new_attachments->insert(
+ new_attachments->end(), attachment_ids.begin(), attachment_ids.end());
if (merge_result_.get()) {
merge_result_->set_num_items_added(merge_result_->num_items_added() + 1);
}
@@ -581,7 +572,7 @@ syncer::SyncError GenericChangeProcessor::HandleActionUpdate(
const syncer::ModelType& type,
const syncer::WriteTransaction& trans,
syncer::WriteNode* sync_node,
- syncer::AttachmentList* new_attachments) {
+ syncer::AttachmentIdList* new_attachments) {
// TODO(zea): consider having this logic for all possible changes?
const syncer::SyncDataLocal sync_data_local(change.sync_data());
@@ -663,14 +654,12 @@ syncer::SyncError GenericChangeProcessor::HandleActionUpdate(
sync_node->SetTitle(change.sync_data().GetTitle());
SetNodeSpecifics(sync_data_local.GetSpecifics(), sync_node);
- SetAttachmentMetadata(sync_data_local.GetAttachmentIds(), sync_node);
+ syncer::AttachmentIdList attachment_ids = sync_data_local.GetAttachmentIds();
+ SetAttachmentMetadata(attachment_ids, sync_node);
// Return any newly added attachments.
- const syncer::AttachmentList& local_attachments_for_upload =
- sync_data_local.GetLocalAttachmentsForUpload();
- new_attachments->insert(new_attachments->end(),
- local_attachments_for_upload.begin(),
- local_attachments_for_upload.end());
+ new_attachments->insert(
+ new_attachments->end(), attachment_ids.begin(), attachment_ids.end());
if (merge_result_.get()) {
merge_result_->set_num_items_modified(merge_result_->num_items_modified() +
@@ -722,42 +711,14 @@ syncer::UserShare* GenericChangeProcessor::share_handle() const {
return share_handle_;
}
-void GenericChangeProcessor::StoreAndUploadAttachments(
- const syncer::AttachmentList& attachments) {
+void GenericChangeProcessor::UploadAttachments(
+ const syncer::AttachmentIdList& attachment_ids) {
DCHECK(CalledOnValidThread());
DCHECK(attachment_service_.get() != NULL);
- attachment_service_->GetStore()->Write(
- attachments,
- base::Bind(&GenericChangeProcessor::WriteAttachmentsDone,
- weak_ptr_factory_.GetWeakPtr(),
- attachments));
-}
-
-void GenericChangeProcessor::WriteAttachmentsDone(
- const syncer::AttachmentList& attachments,
- const syncer::AttachmentStore::Result& result) {
- DCHECK(CalledOnValidThread());
- DCHECK(attachment_service_.get() != NULL);
- if (result != syncer::AttachmentStore::SUCCESS) {
- // TODO(maniscalco): Deal with case where an error occurred (bug 361251).
- return;
- }
- // TODO(maniscalco): Here is where we're going to update the in-directory
- // entry to indicate that the attachments have been successfully stored on
- // disk. Why do we care? Because we might crash after persisting the
- // directory to disk, but before we have persisted its attachments, leaving us
- // with danging attachment ids. Having a flag that indicates we've stored the
- // entry will allow us to detect and filter entries with dangling attachment
- // ids (bug 368353).
-
- // Begin uploading the attachments now that they are safe on disk.
- syncer::AttachmentIdSet attachment_ids;
- std::transform(attachments.begin(),
- attachments.end(),
- std::inserter(attachment_ids, attachment_ids.end()),
- AttachmentToAttachmentId);
- attachment_service_->UploadAttachments(attachment_ids);
+ syncer::AttachmentIdSet attachment_id_set;
+ attachment_id_set.insert(attachment_ids.begin(), attachment_ids.end());
+ attachment_service_->UploadAttachments(attachment_id_set);
}
} // namespace sync_driver
diff --git a/components/sync_driver/generic_change_processor.h b/components/sync_driver/generic_change_processor.h
index afd1ba3..f76fba5e 100644
--- a/components/sync_driver/generic_change_processor.h
+++ b/components/sync_driver/generic_change_processor.h
@@ -117,30 +117,25 @@ class GenericChangeProcessor : public ChangeProcessor,
const syncer::ModelType& type,
const syncer::WriteTransaction& trans,
syncer::WriteNode* sync_node,
- syncer::AttachmentList* new_attachments);
+ syncer::AttachmentIdList* new_attachments);
// Logically part of ProcessSyncChanges.
//
// |new_attachments| is an output parameter containing newly added attachments
// that need to be stored. This method will append to it.
- syncer::SyncError HandleActionUpdate(const syncer::SyncChange& change,
- const std::string& type_str,
- const syncer::ModelType& type,
- const syncer::WriteTransaction& trans,
- syncer::WriteNode* sync_node,
- syncer::AttachmentList* new_attachments);
-
- // Store |attachments| locally then upload them to the sync server.
+ syncer::SyncError HandleActionUpdate(
+ const syncer::SyncChange& change,
+ const std::string& type_str,
+ const syncer::ModelType& type,
+ const syncer::WriteTransaction& trans,
+ syncer::WriteNode* sync_node,
+ syncer::AttachmentIdList* new_attachments);
+
+ // Upload |attachments| to the sync server.
//
- // Store and uploading are asynchronous operations. |WriteAttachmentsDone|
- // will be invoked once the attachments have been stored on the local device.
- void StoreAndUploadAttachments(const syncer::AttachmentList& attachments);
-
- // Invoked once attachments have been stored locally.
- //
- // See also AttachmentStore::WriteCallback.
- void WriteAttachmentsDone(const syncer::AttachmentList& attachments,
- const syncer::AttachmentStore::Result& result);
+ // This function assumes that attachments were already stored in
+ // AttachmentStore.
+ void UploadAttachments(const syncer::AttachmentIdList& attachment_ids);
// The SyncableService this change processor will forward changes on to.
const base::WeakPtr<syncer::SyncableService> local_service_;
diff --git a/components/sync_driver/generic_change_processor_unittest.cc b/components/sync_driver/generic_change_processor_unittest.cc
index 9ea4e43..ce20575 100644
--- a/components/sync_driver/generic_change_processor_unittest.cc
+++ b/components/sync_driver/generic_change_processor_unittest.cc
@@ -33,8 +33,6 @@ namespace sync_driver {
namespace {
-const char kTestData[] = "some data";
-
// A mock that keeps track of attachments passed to UploadAttachments.
class MockAttachmentService : public syncer::AttachmentServiceImpl {
public:
@@ -347,12 +345,10 @@ TEST_F(SyncGenericChangeProcessorTest,
sync_pb::EntitySpecifics specifics;
sync_pb::PreferenceSpecifics* pref_specifics = specifics.mutable_preference();
pref_specifics->set_name("test");
- syncer::AttachmentList attachments;
- scoped_refptr<base::RefCountedString> attachment_data =
- new base::RefCountedString;
- attachment_data->data() = kTestData;
- attachments.push_back(syncer::Attachment::Create(attachment_data));
- attachments.push_back(syncer::Attachment::Create(attachment_data));
+
+ syncer::AttachmentIdList attachment_ids;
+ attachment_ids.push_back(syncer::AttachmentId::Create());
+ attachment_ids.push_back(syncer::AttachmentId::Create());
// Add a SyncData with two attachments.
syncer::SyncChangeList change_list;
@@ -360,7 +356,7 @@ TEST_F(SyncGenericChangeProcessorTest,
syncer::SyncChange(FROM_HERE,
syncer::SyncChange::ACTION_ADD,
syncer::SyncData::CreateLocalDataWithAttachments(
- tag, title, specifics, attachments)));
+ tag, title, specifics, attachment_ids)));
ASSERT_FALSE(
change_processor()->ProcessSyncChanges(FROM_HERE, change_list).IsSet());
RunLoop();
@@ -369,20 +365,20 @@ TEST_F(SyncGenericChangeProcessorTest,
ASSERT_EQ(mock_attachment_service()->attachment_id_sets()->size(), 1U);
const syncer::AttachmentIdSet& attachments_added =
mock_attachment_service()->attachment_id_sets()->front();
- ASSERT_THAT(attachments_added,
- testing::UnorderedElementsAre(attachments[0].GetId(),
- attachments[1].GetId()));
+ ASSERT_THAT(
+ attachments_added,
+ testing::UnorderedElementsAre(attachment_ids[0], attachment_ids[1]));
// Update the SyncData, replacing its two attachments with one new attachment.
- syncer::AttachmentList new_attachments;
- new_attachments.push_back(syncer::Attachment::Create(attachment_data));
+ syncer::AttachmentIdList new_attachment_ids;
+ new_attachment_ids.push_back(syncer::AttachmentId::Create());
mock_attachment_service()->attachment_id_sets()->clear();
change_list.clear();
change_list.push_back(
syncer::SyncChange(FROM_HERE,
syncer::SyncChange::ACTION_UPDATE,
syncer::SyncData::CreateLocalDataWithAttachments(
- tag, title, specifics, new_attachments)));
+ tag, title, specifics, new_attachment_ids)));
ASSERT_FALSE(
change_processor()->ProcessSyncChanges(FROM_HERE, change_list).IsSet());
RunLoop();
@@ -392,7 +388,7 @@ TEST_F(SyncGenericChangeProcessorTest,
const syncer::AttachmentIdSet& new_attachments_added =
mock_attachment_service()->attachment_id_sets()->front();
ASSERT_THAT(new_attachments_added,
- testing::UnorderedElementsAre(new_attachments[0].GetId()));
+ testing::UnorderedElementsAre(new_attachment_ids[0]));
}
// Verify that after attachment is uploaded GenericChangeProcessor updates
@@ -403,11 +399,9 @@ TEST_F(SyncGenericChangeProcessorTest, AttachmentUploaded) {
sync_pb::EntitySpecifics specifics;
sync_pb::PreferenceSpecifics* pref_specifics = specifics.mutable_preference();
pref_specifics->set_name("test");
- syncer::AttachmentList attachments;
- scoped_refptr<base::RefCountedString> attachment_data =
- new base::RefCountedString;
- attachment_data->data() = kTestData;
- attachments.push_back(syncer::Attachment::Create(attachment_data));
+
+ syncer::AttachmentIdList attachment_ids;
+ attachment_ids.push_back(syncer::AttachmentId::Create());
// Add a SyncData with two attachments.
syncer::SyncChangeList change_list;
@@ -415,12 +409,11 @@ TEST_F(SyncGenericChangeProcessorTest, AttachmentUploaded) {
syncer::SyncChange(FROM_HERE,
syncer::SyncChange::ACTION_ADD,
syncer::SyncData::CreateLocalDataWithAttachments(
- tag, title, specifics, attachments)));
+ tag, title, specifics, attachment_ids)));
ASSERT_FALSE(
change_processor()->ProcessSyncChanges(FROM_HERE, change_list).IsSet());
- sync_pb::AttachmentIdProto attachment_id_proto =
- attachments[0].GetId().GetProto();
+ sync_pb::AttachmentIdProto attachment_id_proto = attachment_ids[0].GetProto();
syncer::AttachmentId attachment_id =
syncer::AttachmentId::CreateFromProto(attachment_id_proto);
@@ -429,7 +422,7 @@ TEST_F(SyncGenericChangeProcessorTest, AttachmentUploaded) {
syncer::ReadNode node(&read_transaction);
ASSERT_EQ(node.InitByClientTagLookup(syncer::PREFERENCES, tag),
syncer::BaseNode::INIT_OK);
- syncer::AttachmentIdList attachment_ids = node.GetAttachmentIds();
+ attachment_ids = node.GetAttachmentIds();
EXPECT_EQ(1U, attachment_ids.size());
}
diff --git a/sync/api/sync_data.cc b/sync/api/sync_data.cc
index 5ddbecb..7fbdbc2 100644
--- a/sync/api/sync_data.cc
+++ b/sync/api/sync_data.cc
@@ -16,17 +16,8 @@
#include "sync/protocol/proto_value_conversions.h"
#include "sync/protocol/sync.pb.h"
-using syncer::Attachment;
-using syncer::AttachmentIdList;
-using syncer::AttachmentList;
-
namespace {
-sync_pb::AttachmentIdProto AttachmentToProto(
- const syncer::Attachment& attachment) {
- return attachment.GetId().GetProto();
-}
-
sync_pb::AttachmentIdProto IdToProto(
const syncer::AttachmentId& attachment_id) {
return attachment_id.GetProto();
@@ -36,19 +27,12 @@ syncer::AttachmentId ProtoToId(const sync_pb::AttachmentIdProto& proto) {
return syncer::AttachmentId::CreateFromProto(proto);
}
-// Return true iff |attachments| contains one or more elements with the same
-// AttachmentId.
-bool ContainsDuplicateAttachments(const syncer::AttachmentList& attachments) {
- std::set<syncer::AttachmentId> id_set;
- AttachmentList::const_iterator iter = attachments.begin();
- AttachmentList::const_iterator end = attachments.end();
- for (; iter != end; ++iter) {
- if (id_set.find(iter->GetId()) != id_set.end()) {
- return true;
- }
- id_set.insert(iter->GetId());
- }
- return false;
+// Return true iff |attachment_ids| contains duplicates.
+bool ContainsDuplicateAttachments(
+ const syncer::AttachmentIdList& attachment_ids) {
+ syncer::AttachmentIdSet id_set;
+ id_set.insert(attachment_ids.begin(), attachment_ids.end());
+ return id_set.size() != attachment_ids.size();
}
} // namespace
@@ -82,13 +66,11 @@ SyncData::SyncData() : id_(kInvalidId), is_valid_(false) {}
SyncData::SyncData(int64 id,
sync_pb::SyncEntity* entity,
- AttachmentList* attachments,
const base::Time& remote_modification_time,
const syncer::AttachmentServiceProxy& attachment_service)
: id_(id),
remote_modification_time_(remote_modification_time),
immutable_entity_(entity),
- attachments_(attachments),
attachment_service_(attachment_service),
is_valid_(true) {}
@@ -106,9 +88,9 @@ SyncData SyncData::CreateLocalDelete(const std::string& sync_tag,
SyncData SyncData::CreateLocalData(const std::string& sync_tag,
const std::string& non_unique_title,
const sync_pb::EntitySpecifics& specifics) {
- syncer::AttachmentList attachments;
+ syncer::AttachmentIdList attachment_ids;
return CreateLocalDataWithAttachments(
- sync_tag, non_unique_title, specifics, attachments);
+ sync_tag, non_unique_title, specifics, attachment_ids);
}
// Static.
@@ -116,20 +98,18 @@ SyncData SyncData::CreateLocalDataWithAttachments(
const std::string& sync_tag,
const std::string& non_unique_title,
const sync_pb::EntitySpecifics& specifics,
- const AttachmentList& attachments) {
- DCHECK(!ContainsDuplicateAttachments(attachments));
+ const AttachmentIdList& attachment_ids) {
+ DCHECK(!ContainsDuplicateAttachments(attachment_ids));
sync_pb::SyncEntity entity;
entity.set_client_defined_unique_tag(sync_tag);
entity.set_non_unique_name(non_unique_title);
entity.mutable_specifics()->CopyFrom(specifics);
- std::transform(attachments.begin(),
- attachments.end(),
+ std::transform(attachment_ids.begin(),
+ attachment_ids.end(),
RepeatedFieldBackInserter(entity.mutable_attachment_id()),
- AttachmentToProto);
- AttachmentList copy_of_attachments(attachments);
+ IdToProto);
return SyncData(kInvalidId,
&entity,
- &copy_of_attachments,
base::Time(),
AttachmentServiceProxy());
}
@@ -148,9 +128,7 @@ SyncData SyncData::CreateRemoteData(
attachment_ids.end(),
RepeatedFieldBackInserter(entity.mutable_attachment_id()),
IdToProto);
- AttachmentList attachments;
- return SyncData(
- id, &entity, &attachments, modification_time, attachment_service);
+ return SyncData(id, &entity, modification_time, attachment_service);
}
bool SyncData::IsValid() const { return is_valid_; }
@@ -215,10 +193,6 @@ SyncDataLocal::SyncDataLocal(const SyncData& sync_data) : SyncData(sync_data) {
SyncDataLocal::~SyncDataLocal() {}
-const AttachmentList& SyncDataLocal::GetLocalAttachmentsForUpload() const {
- return attachments_.Get();
-}
-
const std::string& SyncDataLocal::GetTag() const {
return immutable_entity_.Get().client_defined_unique_tag();
}
diff --git a/sync/api/sync_data.h b/sync/api/sync_data.h
index 7a0c210..4e5acd3 100644
--- a/sync/api/sync_data.h
+++ b/sync/api/sync_data.h
@@ -14,7 +14,7 @@
#include "base/memory/ref_counted.h"
#include "base/stl_util.h"
#include "base/time/time.h"
-#include "sync/api/attachments/attachment.h"
+#include "sync/api/attachments/attachment_id.h"
#include "sync/base/sync_export.h"
#include "sync/internal_api/public/attachments/attachment_service_proxy.h"
#include "sync/internal_api/public/base/model_type.h"
@@ -55,7 +55,7 @@ class SYNC_EXPORT SyncData {
// primarily for debug purposes, and will be overwritten if the datatype is
// encrypted.
//
- // For data with attachments: |attachments| must not contain duplicates.
+ // For data with attachments: |attachment_ids| must not contain duplicates.
static SyncData CreateLocalDelete(
const std::string& sync_tag,
ModelType datatype);
@@ -67,7 +67,7 @@ class SYNC_EXPORT SyncData {
const std::string& sync_tag,
const std::string& non_unique_title,
const sync_pb::EntitySpecifics& specifics,
- const AttachmentList& attachments);
+ const AttachmentIdList& attachment_ids);
// Helper method for creating SyncData objects originating from the syncer.
static SyncData CreateRemoteData(
@@ -136,8 +136,6 @@ class SYNC_EXPORT SyncData {
// The actual shared sync entity being held.
ImmutableSyncEntity immutable_entity_;
- Immutable<AttachmentList> attachments_;
-
AttachmentServiceProxy attachment_service_;
private:
@@ -147,7 +145,6 @@ class SYNC_EXPORT SyncData {
// Clears |entity| and |attachments|.
SyncData(int64 id,
sync_pb::SyncEntity* entity,
- AttachmentList* attachments,
const base::Time& remote_modification_time,
const syncer::AttachmentServiceProxy& attachment_service);
};
@@ -161,9 +158,6 @@ class SYNC_EXPORT SyncDataLocal : public SyncData {
explicit SyncDataLocal(const SyncData& sync_data);
~SyncDataLocal();
- // Return a list of this SyncData's attachments.
- const AttachmentList& GetLocalAttachmentsForUpload() const;
-
// Return the value of the unique client tag. This is only set for data going
// TO the syncer, not coming from.
const std::string& GetTag() const;
diff --git a/sync/api/sync_data_unittest.cc b/sync/api/sync_data_unittest.cc
index 92aa687..a0a83cd 100644
--- a/sync/api/sync_data_unittest.cc
+++ b/sync/api/sync_data_unittest.cc
@@ -71,30 +71,28 @@ TEST_F(SyncDataTest, CreateLocalData) {
TEST_F(SyncDataTest, CreateLocalDataWithAttachments) {
specifics.mutable_preference();
- scoped_refptr<base::RefCountedMemory> bytes(new base::RefCountedString);
- AttachmentList attachments;
- attachments.push_back(Attachment::Create(bytes));
- attachments.push_back(Attachment::Create(bytes));
- attachments.push_back(Attachment::Create(bytes));
+ AttachmentIdList attachment_ids;
+ attachment_ids.push_back(AttachmentId::Create());
+ attachment_ids.push_back(AttachmentId::Create());
+ attachment_ids.push_back(AttachmentId::Create());
SyncData data = SyncData::CreateLocalDataWithAttachments(
- kSyncTag, kNonUniqueTitle, specifics, attachments);
+ kSyncTag, kNonUniqueTitle, specifics, attachment_ids);
EXPECT_TRUE(data.IsValid());
EXPECT_TRUE(data.IsLocal());
EXPECT_EQ(kSyncTag, SyncDataLocal(data).GetTag());
EXPECT_EQ(kDatatype, data.GetDataType());
EXPECT_EQ(kNonUniqueTitle, data.GetTitle());
EXPECT_TRUE(data.GetSpecifics().has_preference());
- AttachmentIdList attachment_ids = data.GetAttachmentIds();
+ attachment_ids = data.GetAttachmentIds();
EXPECT_EQ(3U, attachment_ids.size());
- EXPECT_EQ(3U, SyncDataLocal(data).GetLocalAttachmentsForUpload().size());
}
TEST_F(SyncDataTest, CreateLocalDataWithAttachments_EmptyListOfAttachments) {
specifics.mutable_preference();
- AttachmentList attachments;
+ AttachmentIdList attachment_ids;
SyncData data = SyncData::CreateLocalDataWithAttachments(
- kSyncTag, kNonUniqueTitle, specifics, attachments);
+ kSyncTag, kNonUniqueTitle, specifics, attachment_ids);
EXPECT_TRUE(data.IsValid());
EXPECT_TRUE(data.IsLocal());
EXPECT_EQ(kSyncTag, SyncDataLocal(data).GetTag());
@@ -102,7 +100,6 @@ TEST_F(SyncDataTest, CreateLocalDataWithAttachments_EmptyListOfAttachments) {
EXPECT_EQ(kNonUniqueTitle, data.GetTitle());
EXPECT_TRUE(data.GetSpecifics().has_preference());
EXPECT_TRUE(data.GetAttachmentIds().empty());
- EXPECT_TRUE(SyncDataLocal(data).GetLocalAttachmentsForUpload().empty());
}
TEST_F(SyncDataTest, CreateRemoteData) {