• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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