| 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/engine/syncer_proto_util.h" | 5 #include "sync/engine/syncer_proto_util.h" |
| 6 | 6 |
| 7 #include "base/format_macros.h" | 7 #include "base/format_macros.h" |
| 8 #include "base/stringprintf.h" | 8 #include "base/stringprintf.h" |
| 9 #include "sync/engine/net/server_connection_manager.h" | 9 #include "sync/engine/net/server_connection_manager.h" |
| 10 #include "sync/engine/syncer.h" | 10 #include "sync/engine/syncer.h" |
| 11 #include "sync/engine/syncer_types.h" | 11 #include "sync/engine/syncer_types.h" |
| 12 #include "sync/engine/throttled_data_type_tracker.h" | 12 #include "sync/engine/throttled_data_type_tracker.h" |
| 13 #include "sync/engine/traffic_logger.h" | 13 #include "sync/engine/traffic_logger.h" |
| 14 #include "sync/internal_api/public/syncable/model_type.h" | 14 #include "sync/internal_api/public/syncable/model_type.h" |
| 15 #include "sync/protocol/sync.pb.h" | 15 #include "sync/protocol/sync.pb.h" |
| 16 #include "sync/protocol/sync_enums.pb.h" | 16 #include "sync/protocol/sync_enums.pb.h" |
| 17 #include "sync/protocol/sync_protocol_error.h" | 17 #include "sync/protocol/sync_protocol_error.h" |
| 18 #include "sync/sessions/sync_session.h" | 18 #include "sync/sessions/sync_session.h" |
| 19 #include "sync/syncable/directory.h" | 19 #include "sync/syncable/directory.h" |
| 20 #include "sync/syncable/entry.h" | 20 #include "sync/syncable/entry.h" |
| 21 #include "sync/syncable/syncable-inl.h" | 21 #include "sync/syncable/syncable-inl.h" |
| 22 #include "sync/util/time.h" | 22 #include "sync/util/time.h" |
| 23 | 23 |
| 24 using csync::SyncProtocolErrorType; | 24 using syncer::SyncProtocolErrorType; |
| 25 using std::string; | 25 using std::string; |
| 26 using std::stringstream; | 26 using std::stringstream; |
| 27 using syncable::BASE_VERSION; | 27 using syncable::BASE_VERSION; |
| 28 using syncable::CTIME; | 28 using syncable::CTIME; |
| 29 using syncable::ID; | 29 using syncable::ID; |
| 30 using syncable::IS_DEL; | 30 using syncable::IS_DEL; |
| 31 using syncable::IS_DIR; | 31 using syncable::IS_DIR; |
| 32 using syncable::IS_UNSYNCED; | 32 using syncable::IS_UNSYNCED; |
| 33 using syncable::MTIME; | 33 using syncable::MTIME; |
| 34 using syncable::PARENT_ID; | 34 using syncable::PARENT_ID; |
| 35 | 35 |
| 36 namespace csync { | 36 namespace syncer { |
| 37 using sessions::SyncSession; | 37 using sessions::SyncSession; |
| 38 | 38 |
| 39 namespace { | 39 namespace { |
| 40 | 40 |
| 41 // Time to backoff syncing after receiving a throttled response. | 41 // Time to backoff syncing after receiving a throttled response. |
| 42 const int kSyncDelayAfterThrottled = 2 * 60 * 60; // 2 hours | 42 const int kSyncDelayAfterThrottled = 2 * 60 * 60; // 2 hours |
| 43 | 43 |
| 44 void LogResponseProfilingData(const ClientToServerResponse& response) { | 44 void LogResponseProfilingData(const ClientToServerResponse& response) { |
| 45 if (response.has_profiling_data()) { | 45 if (response.has_profiling_data()) { |
| 46 stringstream response_trace; | 46 stringstream response_trace; |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 210 } | 210 } |
| 211 } | 211 } |
| 212 return throttle_delay; | 212 return throttle_delay; |
| 213 } | 213 } |
| 214 | 214 |
| 215 void SyncerProtoUtil::HandleThrottleError( | 215 void SyncerProtoUtil::HandleThrottleError( |
| 216 const SyncProtocolError& error, | 216 const SyncProtocolError& error, |
| 217 const base::TimeTicks& throttled_until, | 217 const base::TimeTicks& throttled_until, |
| 218 ThrottledDataTypeTracker* tracker, | 218 ThrottledDataTypeTracker* tracker, |
| 219 sessions::SyncSession::Delegate* delegate) { | 219 sessions::SyncSession::Delegate* delegate) { |
| 220 DCHECK_EQ(error.error_type, csync::THROTTLED); | 220 DCHECK_EQ(error.error_type, syncer::THROTTLED); |
| 221 if (error.error_data_types.Empty()) { | 221 if (error.error_data_types.Empty()) { |
| 222 // No datatypes indicates the client should be completely throttled. | 222 // No datatypes indicates the client should be completely throttled. |
| 223 delegate->OnSilencedUntil(throttled_until); | 223 delegate->OnSilencedUntil(throttled_until); |
| 224 } else { | 224 } else { |
| 225 tracker->SetUnthrottleTime(error.error_data_types, throttled_until); | 225 tracker->SetUnthrottleTime(error.error_data_types, throttled_until); |
| 226 } | 226 } |
| 227 } | 227 } |
| 228 | 228 |
| 229 namespace { | 229 namespace { |
| 230 | 230 |
| 231 // Helper function for an assertion in PostClientToServerMessage. | 231 // Helper function for an assertion in PostClientToServerMessage. |
| 232 bool IsVeryFirstGetUpdates(const ClientToServerMessage& message) { | 232 bool IsVeryFirstGetUpdates(const ClientToServerMessage& message) { |
| 233 if (!message.has_get_updates()) | 233 if (!message.has_get_updates()) |
| 234 return false; | 234 return false; |
| 235 DCHECK_LT(0, message.get_updates().from_progress_marker_size()); | 235 DCHECK_LT(0, message.get_updates().from_progress_marker_size()); |
| 236 for (int i = 0; i < message.get_updates().from_progress_marker_size(); ++i) { | 236 for (int i = 0; i < message.get_updates().from_progress_marker_size(); ++i) { |
| 237 if (!message.get_updates().from_progress_marker(i).token().empty()) | 237 if (!message.get_updates().from_progress_marker(i).token().empty()) |
| 238 return false; | 238 return false; |
| 239 } | 239 } |
| 240 return true; | 240 return true; |
| 241 } | 241 } |
| 242 | 242 |
| 243 SyncProtocolErrorType ConvertSyncProtocolErrorTypePBToLocalType( | 243 SyncProtocolErrorType ConvertSyncProtocolErrorTypePBToLocalType( |
| 244 const sync_pb::SyncEnums::ErrorType& error_type) { | 244 const sync_pb::SyncEnums::ErrorType& error_type) { |
| 245 switch (error_type) { | 245 switch (error_type) { |
| 246 case sync_pb::SyncEnums::SUCCESS: | 246 case sync_pb::SyncEnums::SUCCESS: |
| 247 return csync::SYNC_SUCCESS; | 247 return syncer::SYNC_SUCCESS; |
| 248 case sync_pb::SyncEnums::NOT_MY_BIRTHDAY: | 248 case sync_pb::SyncEnums::NOT_MY_BIRTHDAY: |
| 249 return csync::NOT_MY_BIRTHDAY; | 249 return syncer::NOT_MY_BIRTHDAY; |
| 250 case sync_pb::SyncEnums::THROTTLED: | 250 case sync_pb::SyncEnums::THROTTLED: |
| 251 return csync::THROTTLED; | 251 return syncer::THROTTLED; |
| 252 case sync_pb::SyncEnums::CLEAR_PENDING: | 252 case sync_pb::SyncEnums::CLEAR_PENDING: |
| 253 return csync::CLEAR_PENDING; | 253 return syncer::CLEAR_PENDING; |
| 254 case sync_pb::SyncEnums::TRANSIENT_ERROR: | 254 case sync_pb::SyncEnums::TRANSIENT_ERROR: |
| 255 return csync::TRANSIENT_ERROR; | 255 return syncer::TRANSIENT_ERROR; |
| 256 case sync_pb::SyncEnums::MIGRATION_DONE: | 256 case sync_pb::SyncEnums::MIGRATION_DONE: |
| 257 return csync::MIGRATION_DONE; | 257 return syncer::MIGRATION_DONE; |
| 258 case sync_pb::SyncEnums::UNKNOWN: | 258 case sync_pb::SyncEnums::UNKNOWN: |
| 259 return csync::UNKNOWN_ERROR; | 259 return syncer::UNKNOWN_ERROR; |
| 260 case sync_pb::SyncEnums::USER_NOT_ACTIVATED: | 260 case sync_pb::SyncEnums::USER_NOT_ACTIVATED: |
| 261 case sync_pb::SyncEnums::AUTH_INVALID: | 261 case sync_pb::SyncEnums::AUTH_INVALID: |
| 262 case sync_pb::SyncEnums::ACCESS_DENIED: | 262 case sync_pb::SyncEnums::ACCESS_DENIED: |
| 263 return csync::INVALID_CREDENTIAL; | 263 return syncer::INVALID_CREDENTIAL; |
| 264 default: | 264 default: |
| 265 NOTREACHED(); | 265 NOTREACHED(); |
| 266 return csync::UNKNOWN_ERROR; | 266 return syncer::UNKNOWN_ERROR; |
| 267 } | 267 } |
| 268 } | 268 } |
| 269 | 269 |
| 270 csync::ClientAction ConvertClientActionPBToLocalClientAction( | 270 syncer::ClientAction ConvertClientActionPBToLocalClientAction( |
| 271 const sync_pb::SyncEnums::Action& action) { | 271 const sync_pb::SyncEnums::Action& action) { |
| 272 switch (action) { | 272 switch (action) { |
| 273 case sync_pb::SyncEnums::UPGRADE_CLIENT: | 273 case sync_pb::SyncEnums::UPGRADE_CLIENT: |
| 274 return csync::UPGRADE_CLIENT; | 274 return syncer::UPGRADE_CLIENT; |
| 275 case sync_pb::SyncEnums::CLEAR_USER_DATA_AND_RESYNC: | 275 case sync_pb::SyncEnums::CLEAR_USER_DATA_AND_RESYNC: |
| 276 return csync::CLEAR_USER_DATA_AND_RESYNC; | 276 return syncer::CLEAR_USER_DATA_AND_RESYNC; |
| 277 case sync_pb::SyncEnums::ENABLE_SYNC_ON_ACCOUNT: | 277 case sync_pb::SyncEnums::ENABLE_SYNC_ON_ACCOUNT: |
| 278 return csync::ENABLE_SYNC_ON_ACCOUNT; | 278 return syncer::ENABLE_SYNC_ON_ACCOUNT; |
| 279 case sync_pb::SyncEnums::STOP_AND_RESTART_SYNC: | 279 case sync_pb::SyncEnums::STOP_AND_RESTART_SYNC: |
| 280 return csync::STOP_AND_RESTART_SYNC; | 280 return syncer::STOP_AND_RESTART_SYNC; |
| 281 case sync_pb::SyncEnums::DISABLE_SYNC_ON_CLIENT: | 281 case sync_pb::SyncEnums::DISABLE_SYNC_ON_CLIENT: |
| 282 return csync::DISABLE_SYNC_ON_CLIENT; | 282 return syncer::DISABLE_SYNC_ON_CLIENT; |
| 283 case sync_pb::SyncEnums::UNKNOWN_ACTION: | 283 case sync_pb::SyncEnums::UNKNOWN_ACTION: |
| 284 return csync::UNKNOWN_ACTION; | 284 return syncer::UNKNOWN_ACTION; |
| 285 default: | 285 default: |
| 286 NOTREACHED(); | 286 NOTREACHED(); |
| 287 return csync::UNKNOWN_ACTION; | 287 return syncer::UNKNOWN_ACTION; |
| 288 } | 288 } |
| 289 } | 289 } |
| 290 | 290 |
| 291 csync::SyncProtocolError ConvertErrorPBToLocalType( | 291 syncer::SyncProtocolError ConvertErrorPBToLocalType( |
| 292 const sync_pb::ClientToServerResponse::Error& error) { | 292 const sync_pb::ClientToServerResponse::Error& error) { |
| 293 csync::SyncProtocolError sync_protocol_error; | 293 syncer::SyncProtocolError sync_protocol_error; |
| 294 sync_protocol_error.error_type = ConvertSyncProtocolErrorTypePBToLocalType( | 294 sync_protocol_error.error_type = ConvertSyncProtocolErrorTypePBToLocalType( |
| 295 error.error_type()); | 295 error.error_type()); |
| 296 sync_protocol_error.error_description = error.error_description(); | 296 sync_protocol_error.error_description = error.error_description(); |
| 297 sync_protocol_error.url = error.url(); | 297 sync_protocol_error.url = error.url(); |
| 298 sync_protocol_error.action = ConvertClientActionPBToLocalClientAction( | 298 sync_protocol_error.action = ConvertClientActionPBToLocalClientAction( |
| 299 error.action()); | 299 error.action()); |
| 300 | 300 |
| 301 if (error.error_data_type_ids_size() > 0) { | 301 if (error.error_data_type_ids_size() > 0) { |
| 302 // THROTTLED is currently the only error code that uses |error_data_types|. | 302 // THROTTLED is currently the only error code that uses |error_data_types|. |
| 303 DCHECK_EQ(error.error_type(), sync_pb::SyncEnums::THROTTLED); | 303 DCHECK_EQ(error.error_type(), sync_pb::SyncEnums::THROTTLED); |
| 304 for (int i = 0; i < error.error_data_type_ids_size(); ++i) { | 304 for (int i = 0; i < error.error_data_type_ids_size(); ++i) { |
| 305 sync_protocol_error.error_data_types.Put( | 305 sync_protocol_error.error_data_types.Put( |
| 306 syncable::GetModelTypeFromSpecificsFieldNumber( | 306 syncable::GetModelTypeFromSpecificsFieldNumber( |
| 307 error.error_data_type_ids(i))); | 307 error.error_data_type_ids(i))); |
| 308 } | 308 } |
| 309 } | 309 } |
| 310 | 310 |
| 311 return sync_protocol_error; | 311 return sync_protocol_error; |
| 312 } | 312 } |
| 313 | 313 |
| 314 // TODO(lipalani) : Rename these function names as per the CR for issue 7740067. | 314 // TODO(lipalani) : Rename these function names as per the CR for issue 7740067. |
| 315 csync::SyncProtocolError ConvertLegacyErrorCodeToNewError( | 315 syncer::SyncProtocolError ConvertLegacyErrorCodeToNewError( |
| 316 const sync_pb::SyncEnums::ErrorType& error_type) { | 316 const sync_pb::SyncEnums::ErrorType& error_type) { |
| 317 csync::SyncProtocolError error; | 317 syncer::SyncProtocolError error; |
| 318 error.error_type = ConvertSyncProtocolErrorTypePBToLocalType(error_type); | 318 error.error_type = ConvertSyncProtocolErrorTypePBToLocalType(error_type); |
| 319 if (error_type == sync_pb::SyncEnums::CLEAR_PENDING || | 319 if (error_type == sync_pb::SyncEnums::CLEAR_PENDING || |
| 320 error_type == sync_pb::SyncEnums::NOT_MY_BIRTHDAY) { | 320 error_type == sync_pb::SyncEnums::NOT_MY_BIRTHDAY) { |
| 321 error.action = csync::DISABLE_SYNC_ON_CLIENT; | 321 error.action = syncer::DISABLE_SYNC_ON_CLIENT; |
| 322 } // There is no other action we can compute for legacy server. | 322 } // There is no other action we can compute for legacy server. |
| 323 return error; | 323 return error; |
| 324 } | 324 } |
| 325 | 325 |
| 326 } // namespace | 326 } // namespace |
| 327 | 327 |
| 328 // static | 328 // static |
| 329 SyncerError SyncerProtoUtil::PostClientToServerMessage( | 329 SyncerError SyncerProtoUtil::PostClientToServerMessage( |
| 330 const ClientToServerMessage& msg, | 330 const ClientToServerMessage& msg, |
| 331 ClientToServerResponse* response, | 331 ClientToServerResponse* response, |
| 332 SyncSession* session) { | 332 SyncSession* session) { |
| 333 | 333 |
| 334 CHECK(response); | 334 CHECK(response); |
| 335 DCHECK(!msg.get_updates().has_from_timestamp()); // Deprecated. | 335 DCHECK(!msg.get_updates().has_from_timestamp()); // Deprecated. |
| 336 DCHECK(!msg.get_updates().has_requested_types()); // Deprecated. | 336 DCHECK(!msg.get_updates().has_requested_types()); // Deprecated. |
| 337 DCHECK(msg.has_store_birthday() || IsVeryFirstGetUpdates(msg)) | 337 DCHECK(msg.has_store_birthday() || IsVeryFirstGetUpdates(msg)) |
| 338 << "Must call AddRequestBirthday to set birthday."; | 338 << "Must call AddRequestBirthday to set birthday."; |
| 339 | 339 |
| 340 syncable::Directory* dir = session->context()->directory(); | 340 syncable::Directory* dir = session->context()->directory(); |
| 341 | 341 |
| 342 LogClientToServerMessage(msg); | 342 LogClientToServerMessage(msg); |
| 343 session->context()->traffic_recorder()->RecordClientToServerMessage(msg); | 343 session->context()->traffic_recorder()->RecordClientToServerMessage(msg); |
| 344 if (!PostAndProcessHeaders(session->context()->connection_manager(), session, | 344 if (!PostAndProcessHeaders(session->context()->connection_manager(), session, |
| 345 msg, response)) { | 345 msg, response)) { |
| 346 // There was an error establishing communication with the server. | 346 // There was an error establishing communication with the server. |
| 347 // We can not proceed beyond this point. | 347 // We can not proceed beyond this point. |
| 348 const csync::HttpResponse::ServerConnectionCode server_status = | 348 const syncer::HttpResponse::ServerConnectionCode server_status = |
| 349 session->context()->connection_manager()->server_status(); | 349 session->context()->connection_manager()->server_status(); |
| 350 | 350 |
| 351 DCHECK_NE(server_status, csync::HttpResponse::NONE); | 351 DCHECK_NE(server_status, syncer::HttpResponse::NONE); |
| 352 DCHECK_NE(server_status, csync::HttpResponse::SERVER_CONNECTION_OK); | 352 DCHECK_NE(server_status, syncer::HttpResponse::SERVER_CONNECTION_OK); |
| 353 | 353 |
| 354 return ServerConnectionErrorAsSyncerError(server_status); | 354 return ServerConnectionErrorAsSyncerError(server_status); |
| 355 } | 355 } |
| 356 | 356 |
| 357 LogClientToServerResponse(*response); | 357 LogClientToServerResponse(*response); |
| 358 session->context()->traffic_recorder()->RecordClientToServerResponse( | 358 session->context()->traffic_recorder()->RecordClientToServerResponse( |
| 359 *response); | 359 *response); |
| 360 | 360 |
| 361 csync::SyncProtocolError sync_protocol_error; | 361 syncer::SyncProtocolError sync_protocol_error; |
| 362 | 362 |
| 363 // Birthday mismatch overrides any error that is sent by the server. | 363 // Birthday mismatch overrides any error that is sent by the server. |
| 364 if (!VerifyResponseBirthday(dir, response)) { | 364 if (!VerifyResponseBirthday(dir, response)) { |
| 365 sync_protocol_error.error_type = csync::NOT_MY_BIRTHDAY; | 365 sync_protocol_error.error_type = syncer::NOT_MY_BIRTHDAY; |
| 366 sync_protocol_error.action = | 366 sync_protocol_error.action = |
| 367 csync::DISABLE_SYNC_ON_CLIENT; | 367 syncer::DISABLE_SYNC_ON_CLIENT; |
| 368 } else if (response->has_error()) { | 368 } else if (response->has_error()) { |
| 369 // This is a new server. Just get the error from the protocol. | 369 // This is a new server. Just get the error from the protocol. |
| 370 sync_protocol_error = ConvertErrorPBToLocalType(response->error()); | 370 sync_protocol_error = ConvertErrorPBToLocalType(response->error()); |
| 371 } else { | 371 } else { |
| 372 // Legacy server implementation. Compute the error based on |error_code|. | 372 // Legacy server implementation. Compute the error based on |error_code|. |
| 373 sync_protocol_error = ConvertLegacyErrorCodeToNewError( | 373 sync_protocol_error = ConvertLegacyErrorCodeToNewError( |
| 374 response->error_code()); | 374 response->error_code()); |
| 375 } | 375 } |
| 376 | 376 |
| 377 // Now set the error into the status so the layers above us could read it. | 377 // Now set the error into the status so the layers above us could read it. |
| 378 sessions::StatusController* status = session->mutable_status_controller(); | 378 sessions::StatusController* status = session->mutable_status_controller(); |
| 379 status->set_sync_protocol_error(sync_protocol_error); | 379 status->set_sync_protocol_error(sync_protocol_error); |
| 380 | 380 |
| 381 // Inform the delegate of the error we got. | 381 // Inform the delegate of the error we got. |
| 382 session->delegate()->OnSyncProtocolError(session->TakeSnapshot()); | 382 session->delegate()->OnSyncProtocolError(session->TakeSnapshot()); |
| 383 | 383 |
| 384 // Now do any special handling for the error type and decide on the return | 384 // Now do any special handling for the error type and decide on the return |
| 385 // value. | 385 // value. |
| 386 switch (sync_protocol_error.error_type) { | 386 switch (sync_protocol_error.error_type) { |
| 387 case csync::UNKNOWN_ERROR: | 387 case syncer::UNKNOWN_ERROR: |
| 388 LOG(WARNING) << "Sync protocol out-of-date. The server is using a more " | 388 LOG(WARNING) << "Sync protocol out-of-date. The server is using a more " |
| 389 << "recent version."; | 389 << "recent version."; |
| 390 return SERVER_RETURN_UNKNOWN_ERROR; | 390 return SERVER_RETURN_UNKNOWN_ERROR; |
| 391 case csync::SYNC_SUCCESS: | 391 case syncer::SYNC_SUCCESS: |
| 392 LogResponseProfilingData(*response); | 392 LogResponseProfilingData(*response); |
| 393 return SYNCER_OK; | 393 return SYNCER_OK; |
| 394 case csync::THROTTLED: | 394 case syncer::THROTTLED: |
| 395 LOG(WARNING) << "Client silenced by server."; | 395 LOG(WARNING) << "Client silenced by server."; |
| 396 HandleThrottleError(sync_protocol_error, | 396 HandleThrottleError(sync_protocol_error, |
| 397 base::TimeTicks::Now() + GetThrottleDelay(*response), | 397 base::TimeTicks::Now() + GetThrottleDelay(*response), |
| 398 session->context()->throttled_data_type_tracker(), | 398 session->context()->throttled_data_type_tracker(), |
| 399 session->delegate()); | 399 session->delegate()); |
| 400 return SERVER_RETURN_THROTTLED; | 400 return SERVER_RETURN_THROTTLED; |
| 401 case csync::TRANSIENT_ERROR: | 401 case syncer::TRANSIENT_ERROR: |
| 402 return SERVER_RETURN_TRANSIENT_ERROR; | 402 return SERVER_RETURN_TRANSIENT_ERROR; |
| 403 case csync::MIGRATION_DONE: | 403 case syncer::MIGRATION_DONE: |
| 404 HandleMigrationDoneResponse(response, session); | 404 HandleMigrationDoneResponse(response, session); |
| 405 return SERVER_RETURN_MIGRATION_DONE; | 405 return SERVER_RETURN_MIGRATION_DONE; |
| 406 case csync::CLEAR_PENDING: | 406 case syncer::CLEAR_PENDING: |
| 407 return SERVER_RETURN_CLEAR_PENDING; | 407 return SERVER_RETURN_CLEAR_PENDING; |
| 408 case csync::NOT_MY_BIRTHDAY: | 408 case syncer::NOT_MY_BIRTHDAY: |
| 409 return SERVER_RETURN_NOT_MY_BIRTHDAY; | 409 return SERVER_RETURN_NOT_MY_BIRTHDAY; |
| 410 default: | 410 default: |
| 411 NOTREACHED(); | 411 NOTREACHED(); |
| 412 return UNSET; | 412 return UNSET; |
| 413 } | 413 } |
| 414 } | 414 } |
| 415 | 415 |
| 416 // static | 416 // static |
| 417 bool SyncerProtoUtil::Compare(const syncable::Entry& local_entry, | 417 bool SyncerProtoUtil::Compare(const syncable::Entry& local_entry, |
| 418 const SyncEntity& server_entry) { | 418 const SyncEntity& server_entry) { |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 535 | 535 |
| 536 std::string SyncerProtoUtil::ClientToServerResponseDebugString( | 536 std::string SyncerProtoUtil::ClientToServerResponseDebugString( |
| 537 const sync_pb::ClientToServerResponse& response) { | 537 const sync_pb::ClientToServerResponse& response) { |
| 538 // Add more handlers as needed. | 538 // Add more handlers as needed. |
| 539 std::string output; | 539 std::string output; |
| 540 if (response.has_get_updates()) | 540 if (response.has_get_updates()) |
| 541 output.append(GetUpdatesResponseString(response.get_updates())); | 541 output.append(GetUpdatesResponseString(response.get_updates())); |
| 542 return output; | 542 return output; |
| 543 } | 543 } |
| 544 | 544 |
| 545 } // namespace csync | 545 } // namespace syncer |
| OLD | NEW |