Home | History | Annotate | Download | only in engine
      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
      3 // found in the LICENSE file.
      4 
      5 #ifndef SYNC_ENGINE_SYNCER_PROTO_UTIL_H_
      6 #define SYNC_ENGINE_SYNCER_PROTO_UTIL_H_
      7 
      8 #include <string>
      9 
     10 #include "base/gtest_prod_util.h"
     11 #include "base/time/time.h"
     12 #include "sync/base/sync_export.h"
     13 #include "sync/internal_api/public/base/model_type.h"
     14 #include "sync/internal_api/public/util/syncer_error.h"
     15 #include "sync/sessions/sync_session.h"
     16 #include "sync/syncable/blob.h"
     17 
     18 namespace sync_pb {
     19 class ClientToServerMessage;
     20 class ClientToServerResponse;
     21 class ClientToServerResponse_Error;
     22 class CommitResponse_EntryResponse;
     23 class EntitySpecifics;
     24 class SyncEntity;
     25 }
     26 
     27 namespace syncer {
     28 
     29 class ServerConnectionManager;
     30 
     31 namespace sessions {
     32 class SyncProtocolError;
     33 class SyncSessionContext;
     34 }
     35 
     36 namespace syncable {
     37 class Directory;
     38 class Entry;
     39 }
     40 
     41 // Returns the types to migrate from the data in |response|.
     42 SYNC_EXPORT_PRIVATE ModelTypeSet GetTypesToMigrate(
     43     const sync_pb::ClientToServerResponse& response);
     44 
     45 // Builds a SyncProtocolError from the data in |error|.
     46 SYNC_EXPORT_PRIVATE SyncProtocolError ConvertErrorPBToLocalType(
     47     const sync_pb::ClientToServerResponse_Error& error);
     48 
     49 class SYNC_EXPORT_PRIVATE SyncerProtoUtil {
     50  public:
     51   // Posts the given message and fills the buffer with the returned value.
     52   // Returns true on success.  Also handles store birthday verification: will
     53   // produce a SyncError if the birthday is incorrect.
     54   // NOTE: This will add all fields that must be sent on every request, which
     55   // includes store birthday, protocol version, client chips, api keys, etc.
     56   static SyncerError PostClientToServerMessage(
     57       sync_pb::ClientToServerMessage* msg,
     58       sync_pb::ClientToServerResponse* response,
     59       sessions::SyncSession* session);
     60 
     61   static bool ShouldMaintainPosition(const sync_pb::SyncEntity& sync_entity);
     62 
     63   // Utility methods for converting between syncable::Blobs and protobuf byte
     64   // fields.
     65   static void CopyProtoBytesIntoBlob(const std::string& proto_bytes,
     66                                      syncable::Blob* blob);
     67   static bool ProtoBytesEqualsBlob(const std::string& proto_bytes,
     68                                    const syncable::Blob& blob);
     69   static void CopyBlobIntoProtoBytes(const syncable::Blob& blob,
     70                                      std::string* proto_bytes);
     71 
     72   // Extract the name field from a sync entity.
     73   static const std::string& NameFromSyncEntity(
     74       const sync_pb::SyncEntity& entry);
     75 
     76   // Extract the name field from a commit entry response.
     77   static const std::string& NameFromCommitEntryResponse(
     78       const sync_pb::CommitResponse_EntryResponse& entry);
     79 
     80   // Persist the bag of chips if it is present in the response.
     81   static void PersistBagOfChips(
     82       syncable::Directory* dir,
     83       const sync_pb::ClientToServerResponse& response);
     84 
     85   // EntitySpecifics is used as a filter for the GetUpdates message to tell
     86   // the server which datatypes to send back.  This adds a datatype so that
     87   // it's included in the filter.
     88   static void AddToEntitySpecificDatatypesFilter(ModelType datatype,
     89       sync_pb::EntitySpecifics* filter);
     90 
     91   // Get a debug string representation of the client to server response.
     92   static std::string ClientToServerResponseDebugString(
     93       const sync_pb::ClientToServerResponse& response);
     94 
     95   // Get update contents as a string. Intended for logging, and intended
     96   // to have a smaller footprint than the protobuf's built-in pretty printer.
     97   static std::string SyncEntityDebugString(const sync_pb::SyncEntity& entry);
     98 
     99   // Pull the birthday from the dir and put it into the msg.
    100   static void AddRequestBirthday(syncable::Directory* dir,
    101                                  sync_pb::ClientToServerMessage* msg);
    102 
    103   // Pull the bag of chips from the dir and put it into the msg.
    104   static void AddBagOfChips(syncable::Directory* dir,
    105                             sync_pb::ClientToServerMessage* msg);
    106 
    107 
    108   // Set the protocol version field in the outgoing message.
    109   static void SetProtocolVersion(sync_pb::ClientToServerMessage* msg);
    110 
    111  private:
    112   SyncerProtoUtil() {}
    113 
    114   // Helper functions for PostClientToServerMessage.
    115 
    116   // Verifies the store birthday, alerting/resetting as appropriate if there's a
    117   // mismatch. Return false if the syncer should be stuck.
    118   static bool VerifyResponseBirthday(
    119       const sync_pb::ClientToServerResponse& response,
    120       syncable::Directory* dir);
    121 
    122   // Returns true if sync is disabled by admin for a dasher account.
    123   static bool IsSyncDisabledByAdmin(
    124       const sync_pb::ClientToServerResponse& response);
    125 
    126   // Post the message using the scm, and do some processing on the returned
    127   // headers. Decode the server response.
    128   static bool PostAndProcessHeaders(ServerConnectionManager* scm,
    129                                     sessions::SyncSession* session,
    130                                     const sync_pb::ClientToServerMessage& msg,
    131                                     sync_pb::ClientToServerResponse* response);
    132 
    133   static base::TimeDelta GetThrottleDelay(
    134       const sync_pb::ClientToServerResponse& response);
    135 
    136   friend class SyncerProtoUtilTest;
    137   FRIEND_TEST_ALL_PREFIXES(SyncerProtoUtilTest, AddRequestBirthday);
    138   FRIEND_TEST_ALL_PREFIXES(SyncerProtoUtilTest, PostAndProcessHeaders);
    139   FRIEND_TEST_ALL_PREFIXES(SyncerProtoUtilTest, VerifyDisabledByAdmin);
    140   FRIEND_TEST_ALL_PREFIXES(SyncerProtoUtilTest, VerifyResponseBirthday);
    141   FRIEND_TEST_ALL_PREFIXES(SyncerProtoUtilTest, HandleThrottlingNoDatatypes);
    142   FRIEND_TEST_ALL_PREFIXES(SyncerProtoUtilTest, HandleThrottlingWithDatatypes);
    143 
    144   DISALLOW_COPY_AND_ASSIGN(SyncerProtoUtil);
    145 };
    146 
    147 }  // namespace syncer
    148 
    149 #endif  // SYNC_ENGINE_SYNCER_PROTO_UTIL_H_
    150