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_API_SYNC_CHANGE_PROCESSOR_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SYNC_API_SYNC_CHANGE_PROCESSOR_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "sync/api/sync_data.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/api/sync_error.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "sync/base/sync_export.h" 1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "sync/internal_api/public/base/model_type.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace tracked_objects { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Location; 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace tracked_objects 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace syncer { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SyncChange; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::vector<SyncChange> SyncChangeList; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An interface for services that handle receiving SyncChanges. 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SYNC_EXPORT SyncChangeProcessor { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 28c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Whether a context change should force a datatype refresh or not. 29c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch enum ContextRefreshStatus { NO_REFRESH, REFRESH_NEEDED }; 30e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch typedef base::Callback<void(const SyncData&)> GetSyncDataCallback; 31e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncChangeProcessor(); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~SyncChangeProcessor(); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Process a list of SyncChanges. 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns: A default SyncError (IsSet() == false) if no errors were 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // encountered, and a filled SyncError (IsSet() == true) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // otherwise. 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Inputs: 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |from_here|: allows tracking of where sync changes originate. 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |change_list|: is the list of sync changes in need of processing. 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual SyncError ProcessSyncChanges( 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const tracked_objects::Location& from_here, 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SyncChangeList& change_list) = 0; 4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Fills a list of SyncData. This should create an up to date representation 4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // of all the data known to the ChangeProcessor for |datatype|, and 4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // should match/be a subset of the server's view of that datatype. 4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // 5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // WARNING: This can be a potentially slow & memory intensive operation and 5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // should only be used when absolutely necessary / sparingly. 5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual SyncDataList GetAllSyncData(ModelType type) const = 0; 53e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 54e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // Retrieves the SyncData identified by |type| and |sync_tag| and invokes 55e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // |callback| asynchronously. If no such SyncData exists locally, IsValid on 56e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // the SyncData passed to |callback| will return false. 57e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // 58e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // This is an asynchronous local operation that may result in disk IO. 59e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // 60e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // Refer to sync_data.h for a description of |sync_tag|. 61e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // 62e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // TODO:(maniscalco): N.B. this method should really be pure virtual. An 63e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // implentation is provided here just to verify that everything compiles. 64e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // Update this method to be pure virtual (bug 353300). 65e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch virtual void GetSyncData(const ModelType& type, 66e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const std::string& sync_tag, 67e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const GetSyncDataCallback& callback) const {} 68c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 69c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Updates the context for |type|, triggering an optional context refresh. 70c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Default implementation does nothing. A type's context is a per-client blob 71c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // that can affect all SyncData sent to/from the server, much like a cookie. 72c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // TODO(zea): consider pulling the refresh logic into a separate method 73c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // unrelated to datatype implementations. 74c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual syncer::SyncError UpdateDataTypeContext( 75c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ModelType type, 76c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ContextRefreshStatus refresh_status, 77c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const std::string& context); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace syncer 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // SYNC_API_SYNC_CHANGE_PROCESSOR_H_ 83