| OLD | NEW |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 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 | 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/engine/download_updates_command.h" | 5 #include "sync/engine/download_updates_command.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "sync/engine/syncer.h" | 10 #include "sync/engine/syncer.h" |
| 11 #include "sync/engine/syncer_proto_util.h" | 11 #include "sync/engine/syncer_proto_util.h" |
| 12 #include "sync/internal_api/public/base/model_type_invalidation_map.h" | 12 #include "sync/internal_api/public/base/model_type_invalidation_map.h" |
| 13 #include "sync/sessions/nudge_tracker.h" |
| 13 #include "sync/syncable/directory.h" | 14 #include "sync/syncable/directory.h" |
| 14 #include "sync/syncable/nigori_handler.h" | 15 #include "sync/syncable/nigori_handler.h" |
| 15 #include "sync/syncable/syncable_read_transaction.h" | 16 #include "sync/syncable/syncable_read_transaction.h" |
| 16 | 17 |
| 17 using sync_pb::DebugInfo; | 18 using sync_pb::DebugInfo; |
| 18 | 19 |
| 19 namespace syncer { | 20 namespace syncer { |
| 20 using sessions::StatusController; | 21 using sessions::StatusController; |
| 21 using sessions::SyncSession; | 22 using sessions::SyncSession; |
| 22 using std::string; | 23 using std::string; |
| (...skipping 20 matching lines...) Expand all Loading... |
| 43 update_response.get_updates().encryption_keys(), | 44 update_response.get_updates().encryption_keys(), |
| 44 &trans); | 45 &trans); |
| 45 | 46 |
| 46 DVLOG(1) << "GetUpdates returned " | 47 DVLOG(1) << "GetUpdates returned " |
| 47 << update_response.get_updates().encryption_keys_size() | 48 << update_response.get_updates().encryption_keys_size() |
| 48 << "encryption keys. Nigori keystore key " | 49 << "encryption keys. Nigori keystore key " |
| 49 << (success ? "" : "not ") << "updated."; | 50 << (success ? "" : "not ") << "updated."; |
| 50 return (success ? SYNCER_OK : SERVER_RESPONSE_VALIDATION_FAILED); | 51 return (success ? SYNCER_OK : SERVER_RESPONSE_VALIDATION_FAILED); |
| 51 } | 52 } |
| 52 | 53 |
| 54 sync_pb::SyncEnums::GetUpdatesOrigin ConvertGetUpdateSourceToOrigin( |
| 55 sync_pb::GetUpdatesCallerInfo::GetUpdatesSource source) { |
| 56 switch (source) { |
| 57 // Configurations: |
| 58 case sync_pb::GetUpdatesCallerInfo::NEWLY_SUPPORTED_DATATYPE: |
| 59 return sync_pb::SyncEnums::NEWLY_SUPPORTED_DATATYPE; |
| 60 case sync_pb::GetUpdatesCallerInfo::MIGRATION: |
| 61 return sync_pb::SyncEnums::MIGRATION; |
| 62 case sync_pb::GetUpdatesCallerInfo::RECONFIGURATION: |
| 63 return sync_pb::SyncEnums::RECONFIGURATION; |
| 64 case sync_pb::GetUpdatesCallerInfo::NEW_CLIENT: |
| 65 return sync_pb::SyncEnums::NEW_CLIENT; |
| 66 |
| 67 // Poll, which never overlaps with anything else: |
| 68 case sync_pb::GetUpdatesCallerInfo::PERIODIC: |
| 69 return sync_pb::SyncEnums::PERIODIC; |
| 70 |
| 71 // Overlapping normal-mode sources (fall-through is intentional): |
| 72 case sync_pb::GetUpdatesCallerInfo::LOCAL: |
| 73 case sync_pb::GetUpdatesCallerInfo::NOTIFICATION: |
| 74 case sync_pb::GetUpdatesCallerInfo::DATATYPE_REFRESH: |
| 75 return sync_pb::SyncEnums::GU_TRIGGER; |
| 76 |
| 77 // Deprecated or invalid (fall-through is intentional): |
| 78 case sync_pb::GetUpdatesCallerInfo::UNKNOWN: |
| 79 case sync_pb::GetUpdatesCallerInfo::FIRST_UPDATE: |
| 80 case sync_pb::GetUpdatesCallerInfo::SYNC_CYCLE_CONTINUATION: |
| 81 NOTREACHED() << "Invalid source: " << source; |
| 82 return sync_pb::SyncEnums::UNKNOWN_ORIGIN; |
| 83 } |
| 84 NOTREACHED(); |
| 85 return sync_pb::SyncEnums::UNKNOWN_ORIGIN; |
| 86 } |
| 87 |
| 53 } // namespace | 88 } // namespace |
| 54 | 89 |
| 55 SyncerError DownloadUpdatesCommand::ExecuteImpl(SyncSession* session) { | 90 SyncerError DownloadUpdatesCommand::ExecuteImpl(SyncSession* session) { |
| 56 sync_pb::ClientToServerMessage client_to_server_message; | 91 sync_pb::ClientToServerMessage client_to_server_message; |
| 57 sync_pb::ClientToServerResponse update_response; | 92 sync_pb::ClientToServerResponse update_response; |
| 58 | 93 |
| 59 client_to_server_message.set_share(session->context()->account_name()); | 94 client_to_server_message.set_share(session->context()->account_name()); |
| 60 client_to_server_message.set_message_contents( | 95 client_to_server_message.set_message_contents( |
| 61 sync_pb::ClientToServerMessage::GET_UPDATES); | 96 sync_pb::ClientToServerMessage::GET_UPDATES); |
| 62 sync_pb::GetUpdatesMessage* get_updates = | 97 sync_pb::GetUpdatesMessage* get_updates = |
| 63 client_to_server_message.mutable_get_updates(); | 98 client_to_server_message.mutable_get_updates(); |
| 64 get_updates->set_create_mobile_bookmarks_folder( | 99 get_updates->set_create_mobile_bookmarks_folder( |
| 65 create_mobile_bookmarks_folder_); | 100 create_mobile_bookmarks_folder_); |
| 66 | 101 |
| 102 sync_pb::SyncEnums::GetUpdatesOrigin origin = |
| 103 ConvertGetUpdateSourceToOrigin(session->source().updates_source); |
| 104 |
| 67 syncable::Directory* dir = session->context()->directory(); | 105 syncable::Directory* dir = session->context()->directory(); |
| 68 | 106 |
| 69 // Request updates for all enabled types. | 107 // Request updates for all enabled types. |
| 70 const ModelTypeSet enabled_types = | 108 const ModelTypeSet enabled_types = |
| 71 GetRoutingInfoTypes(session->context()->routing_info()); | 109 GetRoutingInfoTypes(session->context()->routing_info()); |
| 72 DVLOG(1) << "Getting updates for types " | 110 DVLOG(1) << "Getting updates for types " |
| 73 << ModelTypeSetToString(enabled_types); | 111 << ModelTypeSetToString(enabled_types); |
| 74 DCHECK(!enabled_types.Empty()); | 112 DCHECK(!enabled_types.Empty()); |
| 75 | 113 |
| 76 const ModelTypeInvalidationMap& invalidation_map = | 114 const ModelTypeInvalidationMap& invalidation_map = |
| 77 session->source().types; | 115 session->source().types; |
| 78 for (ModelTypeSet::Iterator it = enabled_types.First(); | 116 for (ModelTypeSet::Iterator it = enabled_types.First(); |
| 79 it.Good(); it.Inc()) { | 117 it.Good(); it.Inc()) { |
| 80 if (ProxyTypes().Has(it.Get())) | 118 if (ProxyTypes().Has(it.Get())) |
| 81 continue; | 119 continue; |
| 82 sync_pb::DataTypeProgressMarker* progress_marker = | 120 sync_pb::DataTypeProgressMarker* progress_marker = |
| 83 get_updates->add_from_progress_marker(); | 121 get_updates->add_from_progress_marker(); |
| 84 dir->GetDownloadProgress(it.Get(), progress_marker); | 122 dir->GetDownloadProgress(it.Get(), progress_marker); |
| 85 | 123 |
| 86 // Set notification hint if present. | 124 // Set notification hint if present. |
| 87 ModelTypeInvalidationMap::const_iterator find_it = | 125 ModelTypeInvalidationMap::const_iterator find_it = |
| 88 invalidation_map.find(it.Get()); | 126 invalidation_map.find(it.Get()); |
| 89 if (find_it != invalidation_map.end()) { | 127 if (find_it != invalidation_map.end()) { |
| 90 progress_marker->set_notification_hint(find_it->second.payload); | 128 progress_marker->set_notification_hint(find_it->second.payload); |
| 91 } | 129 } |
| 130 |
| 131 if (origin == sync_pb::SyncEnums::GU_TRIGGER) { |
| 132 session->nudge_tracker()->FillProtoMessage( |
| 133 it.Get(), |
| 134 progress_marker->mutable_get_update_triggers()); |
| 135 } else { |
| 136 DCHECK(!session->nudge_tracker()); |
| 137 } |
| 92 } | 138 } |
| 93 | 139 |
| 94 bool need_encryption_key = false; | 140 bool need_encryption_key = false; |
| 95 if (session->context()->keystore_encryption_enabled()) { | 141 if (session->context()->keystore_encryption_enabled()) { |
| 96 syncable::Directory* dir = session->context()->directory(); | 142 syncable::Directory* dir = session->context()->directory(); |
| 97 syncable::ReadTransaction trans(FROM_HERE, dir); | 143 syncable::ReadTransaction trans(FROM_HERE, dir); |
| 98 syncable::NigoriHandler* nigori_handler = dir->GetNigoriHandler(); | 144 syncable::NigoriHandler* nigori_handler = dir->GetNigoriHandler(); |
| 99 need_encryption_key = nigori_handler->NeedKeystoreKey(&trans); | 145 need_encryption_key = nigori_handler->NeedKeystoreKey(&trans); |
| 100 get_updates->set_need_encryption_key(need_encryption_key); | 146 get_updates->set_need_encryption_key(need_encryption_key); |
| 101 | 147 |
| 102 } | 148 } |
| 103 | 149 |
| 104 // We want folders for our associated types, always. If we were to set | 150 // We want folders for our associated types, always. If we were to set |
| 105 // this to false, the server would send just the non-container items | 151 // this to false, the server would send just the non-container items |
| 106 // (e.g. Bookmark URLs but not their containing folders). | 152 // (e.g. Bookmark URLs but not their containing folders). |
| 107 get_updates->set_fetch_folders(true); | 153 get_updates->set_fetch_folders(true); |
| 108 | 154 |
| 109 // Set GetUpdatesMessage.GetUpdatesCallerInfo information. | 155 // Set GetUpdatesMessage.GetUpdatesCallerInfo information. |
| 110 get_updates->mutable_caller_info()->set_source( | 156 get_updates->mutable_caller_info()->set_source( |
| 111 session->source().updates_source); | 157 session->source().updates_source); |
| 112 get_updates->mutable_caller_info()->set_notifications_enabled( | 158 get_updates->mutable_caller_info()->set_notifications_enabled( |
| 113 session->context()->notifications_enabled()); | 159 session->context()->notifications_enabled()); |
| 114 | 160 |
| 161 // Set the new and improved version of source, too. |
| 162 get_updates->set_get_updates_origin(origin); |
| 163 |
| 115 DebugInfo* debug_info = client_to_server_message.mutable_debug_info(); | 164 DebugInfo* debug_info = client_to_server_message.mutable_debug_info(); |
| 116 | 165 |
| 117 AppendClientDebugInfoIfNeeded(session, debug_info); | 166 AppendClientDebugInfoIfNeeded(session, debug_info); |
| 118 | 167 |
| 119 SyncerError result = SyncerProtoUtil::PostClientToServerMessage( | 168 SyncerError result = SyncerProtoUtil::PostClientToServerMessage( |
| 120 &client_to_server_message, | 169 &client_to_server_message, |
| 121 &update_response, | 170 &update_response, |
| 122 session); | 171 session); |
| 123 | 172 |
| 124 DVLOG(2) << SyncerProtoUtil::ClientToServerResponseDebugString( | 173 DVLOG(2) << SyncerProtoUtil::ClientToServerResponseDebugString( |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 159 // could be null in some unit tests. | 208 // could be null in some unit tests. |
| 160 if (session->context()->debug_info_getter()) { | 209 if (session->context()->debug_info_getter()) { |
| 161 session->context()->debug_info_getter()->GetAndClearDebugInfo( | 210 session->context()->debug_info_getter()->GetAndClearDebugInfo( |
| 162 debug_info); | 211 debug_info); |
| 163 } | 212 } |
| 164 session->mutable_status_controller()->set_debug_info_sent(); | 213 session->mutable_status_controller()->set_debug_info_sent(); |
| 165 } | 214 } |
| 166 } | 215 } |
| 167 | 216 |
| 168 } // namespace syncer | 217 } // namespace syncer |
| OLD | NEW |