1 /* 2 * Copyright (c) 2021 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef ABILITY_SYNC_H 17 #define ABILITY_SYNC_H 18 19 #include <cstdint> 20 #include <string> 21 22 #include "db_ability.h" 23 #include "icommunicator.h" 24 #include "ikvdb_sync_interface.h" 25 #include "isync_task_context.h" 26 #include "parcel.h" 27 #ifdef RELATIONAL_STORE 28 #include "ischema.h" 29 #endif 30 #include "schema_negotiate.h" 31 32 namespace DistributedDB { 33 class AbilitySyncRequestPacket { 34 public: 35 AbilitySyncRequestPacket(); 36 ~AbilitySyncRequestPacket(); 37 38 void SetProtocolVersion(uint32_t protocolVersion); 39 uint32_t GetProtocolVersion() const; 40 41 void SetSendCode(int32_t sendCode); 42 int32_t GetSendCode() const; 43 44 void SetSoftwareVersion(uint32_t swVersion); 45 uint32_t GetSoftwareVersion() const; 46 47 void SetSchema(const std::string &schema); 48 std::string GetSchema() const; 49 50 void SetSchemaType(uint32_t schemaType); 51 uint32_t GetSchemaType() const; 52 53 void SetSecLabel(int32_t secLabel); 54 int32_t GetSecLabel() const; 55 56 void SetSecFlag(int32_t secFlag); 57 int32_t GetSecFlag() const; 58 59 void SetDbCreateTime(uint64_t dbCreateTime); 60 uint64_t GetDbCreateTime() const; 61 62 uint32_t CalculateLen() const; 63 64 DbAbility GetDbAbility() const; 65 66 void SetDbAbility(const DbAbility &dbAbility); 67 68 private: 69 uint32_t protocolVersion_; 70 int32_t sendCode_; 71 uint32_t softwareVersion_; 72 std::string schema_; 73 int32_t secLabel_; 74 int32_t secFlag_; 75 uint32_t schemaType_; 76 uint64_t dbCreateTime_; 77 DbAbility dbAbility_; 78 }; 79 80 class AbilitySyncAckPacket { 81 public: 82 AbilitySyncAckPacket(); 83 ~AbilitySyncAckPacket(); 84 85 void SetProtocolVersion(uint32_t protocolVersion); 86 uint32_t GetProtocolVersion() const; 87 88 void SetSoftwareVersion(uint32_t swVersion); 89 uint32_t GetSoftwareVersion() const; 90 91 void SetAckCode(int32_t ackCode); 92 int32_t GetAckCode() const; 93 94 void SetSchema(const std::string &schema); 95 std::string GetSchema() const; 96 97 void SetSchemaType(uint32_t schemaType); 98 uint32_t GetSchemaType() const; 99 100 void SetSecLabel(int32_t secLabel); 101 int32_t GetSecLabel() const; 102 103 void SetSecFlag(int32_t secFlag); 104 int32_t GetSecFlag() const; 105 106 void SetPermitSync(uint32_t permitSync); 107 uint32_t GetPermitSync() const; 108 109 void SetRequirePeerConvert(uint32_t requirePeerConvert); 110 uint32_t GetRequirePeerConvert() const; 111 112 void SetDbCreateTime(uint64_t dbCreateTime); 113 uint64_t GetDbCreateTime() const; 114 115 uint32_t CalculateLen() const; 116 117 DbAbility GetDbAbility() const; 118 119 void SetDbAbility(const DbAbility &dbAbility); 120 121 void SetRelationalSyncOpinion(const RelationalSyncOpinion &relationalSyncOpinion); 122 123 RelationalSyncOpinion GetRelationalSyncOpinion() const; 124 125 private: 126 uint32_t protocolVersion_; 127 uint32_t softwareVersion_; 128 int32_t ackCode_; 129 std::string schema_; 130 int32_t secLabel_; 131 int32_t secFlag_; 132 uint32_t schemaType_; 133 uint32_t permitSync_; 134 uint32_t requirePeerConvert_; 135 uint64_t dbCreateTime_; 136 DbAbility dbAbility_; 137 RelationalSyncOpinion relationalSyncOpinion_; 138 }; 139 140 class AbilitySync { 141 public: 142 static const int CHECK_SUCCESS = 0; 143 static const int LAST_NOTIFY = 0xfe; 144 AbilitySync(); 145 ~AbilitySync(); 146 147 // Start Ability Sync 148 int SyncStart(uint32_t sessionId, uint32_t sequenceId, uint16_t remoteCommunicatorVersion, 149 const CommErrHandler &handler = nullptr); 150 151 int Initialize(ICommunicator *inCommunicator, ISyncInterface *inStorage, std::shared_ptr<Metadata> &inMetadata, 152 const std::string &deviceId); 153 154 int AckRecv(const Message *message, ISyncTaskContext *context); 155 156 int RequestRecv(const Message *message, ISyncTaskContext *context); 157 158 int AckNotifyRecv(const Message *message, ISyncTaskContext *context); 159 160 bool GetAbilitySyncFinishedStatus() const; 161 162 void SetAbilitySyncFinishedStatus(bool syncFinished); 163 164 static int RegisterTransformFunc(); 165 166 static uint32_t CalculateLen(const Message *inMsg); 167 168 static int Serialization(uint8_t *buffer, uint32_t length, const Message *inMsg); // register to communicator 169 170 static int DeSerialization(const uint8_t *buffer, uint32_t length, Message *inMsg); // register to communicator 171 172 private: 173 174 static int RequestPacketSerialization(uint8_t *buffer, uint32_t length, const Message *inMsg); 175 176 static int AckPacketSerialization(uint8_t *buffer, uint32_t length, const Message *inMsg); 177 178 static int RequestPacketDeSerialization(const uint8_t *buffer, uint32_t length, Message *inMsg); 179 180 static int AckPacketDeSerialization(const uint8_t *buffer, uint32_t length, Message *inMsg); 181 182 static int RequestPacketCalculateLen(const Message *inMsg, uint32_t &len); 183 184 static int AckPacketCalculateLen(const Message *inMsg, uint32_t &len); 185 186 static int RequestPacketDeSerializationTailPart(Parcel &parcel, AbilitySyncRequestPacket *packet, 187 uint32_t version); 188 189 static int AckPacketDeSerializationTailPart(Parcel &parcel, AbilitySyncAckPacket *packet, uint32_t version); 190 191 bool SecLabelCheck(const AbilitySyncRequestPacket *packet) const; 192 193 void HandleVersionV3RequestParam(const AbilitySyncRequestPacket *packet, ISyncTaskContext *context) const; 194 195 void HandleVersionV3AckSecOptionParam(const AbilitySyncAckPacket *packet, 196 ISyncTaskContext *context) const; 197 198 int HandleVersionV3AckSchemaParam(const AbilitySyncAckPacket *recvPacket, 199 AbilitySyncAckPacket &sendPacket, ISyncTaskContext *context, bool sendOpinion) const; 200 201 void HandleKvAckSchemaParam(const AbilitySyncAckPacket *recvPacket, 202 ISyncTaskContext *context, AbilitySyncAckPacket &sendPacket) const; 203 204 int HandleRelationAckSchemaParam(const AbilitySyncAckPacket *recvPacket, 205 AbilitySyncAckPacket &sendPacket, ISyncTaskContext *context, bool sendOpinion) const; 206 207 void GetPacketSecOption(SecurityOption &option) const; 208 209 int SetAbilityRequestBodyInfo(AbilitySyncRequestPacket &packet, uint16_t remoteCommunicatorVersion) const; 210 211 int SetAbilityAckBodyInfo(AbilitySyncAckPacket &ackPacket, int ackCode, bool isAckNotify) const; 212 213 void SetAbilityAckSchemaInfo(AbilitySyncAckPacket &ackPacket, const ISchema &schemaObj) const; 214 215 void SetAbilityAckSyncOpinionInfo(AbilitySyncAckPacket &ackPacket, SyncOpinion localOpinion) const; 216 217 int GetDbAbilityInfo(DbAbility &dbAbility) const; 218 219 int AckMsgCheck(const Message *message, ISyncTaskContext *context) const; 220 221 bool IsSingleKvVer() const; 222 223 bool IsSingleRelationalVer() const; 224 225 int SendAck(const Message *message, int ackCode, bool isAckNotify, AbilitySyncAckPacket &ackPacket); 226 227 int SendAckWithEmptySchema(const Message *message, int ackCode, bool isAckNotify); 228 229 int SendAck(const Message *message, const AbilitySyncAckPacket &ackPacket, bool isAckNotify); 230 231 int HandleRequestRecv(const Message *message, ISyncTaskContext *context, bool isCompatible); 232 233 SyncOpinion MakeKvSyncOpnion(const AbilitySyncRequestPacket *packet, const std::string &remoteSchema) const; 234 235 RelationalSyncOpinion MakeRelationSyncOpnion(const AbilitySyncRequestPacket *packet, 236 const std::string &remoteSchema) const; 237 238 int AckRecvWithHighVersion(const Message *message, ISyncTaskContext *context, const AbilitySyncAckPacket *packet); 239 240 ICommunicator *communicator_; 241 ISyncInterface *storageInterface_; 242 std::shared_ptr<Metadata> metadata_; 243 std::string deviceId_; 244 bool syncFinished_; 245 static const int FAILED_GET_SEC_CLASSIFICATION = 0x55; 246 }; 247 } // namespace DistributedDB 248 #endif // ABILITY_SYNC_H 249