1fb726d48Sopenharmony_ci/* 2fb726d48Sopenharmony_ci * Copyright (C) 2022 Huawei Device Co., Ltd. 3fb726d48Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4fb726d48Sopenharmony_ci * you may not use this file except in compliance with the License. 5fb726d48Sopenharmony_ci * You may obtain a copy of the License at 6fb726d48Sopenharmony_ci * 7fb726d48Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8fb726d48Sopenharmony_ci * 9fb726d48Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10fb726d48Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11fb726d48Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12fb726d48Sopenharmony_ci * See the License for the specific language governing permissions and 13fb726d48Sopenharmony_ci * limitations under the License. 14fb726d48Sopenharmony_ci */ 15fb726d48Sopenharmony_ci 16fb726d48Sopenharmony_ciimport { WireType } from '../message/WireType'; 17fb726d48Sopenharmony_ciimport { SessionHandShake } from '../message/SessionHandShake'; 18fb726d48Sopenharmony_ciimport { PayloadProtect } from '../message/PayloadProtect'; 19fb726d48Sopenharmony_ciimport { TransferConfig } from '../message/TransferConfig'; 20fb726d48Sopenharmony_ciimport { TransferPayload } from '../message/TransferPayload'; 21fb726d48Sopenharmony_ciimport { log } from '../../log/Log'; 22fb726d48Sopenharmony_ci 23fb726d48Sopenharmony_ciexport class Serialize { 24fb726d48Sopenharmony_ci static bannerByteLength: number = 8; 25fb726d48Sopenharmony_ci 26fb726d48Sopenharmony_ci static serializeSessionHandShake(handShake: SessionHandShake): Uint8Array { 27fb726d48Sopenharmony_ci let bannerValue = this.serializeToString(1, handShake.banner); 28fb726d48Sopenharmony_ci let authTypeValue = this.serializeU8(2, handShake.authType); 29fb726d48Sopenharmony_ci let sessionIdValue = this.serializeU32(3, handShake.sessionId); 30fb726d48Sopenharmony_ci let connectKey = this.serializeToString(4, handShake.connectKey); 31fb726d48Sopenharmony_ci let buf = this.serializeToString(5, handShake.buf); 32fb726d48Sopenharmony_ci let version = this.serializeToString(6, handShake.version); 33fb726d48Sopenharmony_ci let mergedArray = new Uint8Array( 34fb726d48Sopenharmony_ci bannerValue.length + authTypeValue.length + sessionIdValue.length + connectKey.length + buf.length + version.length 35fb726d48Sopenharmony_ci ); 36fb726d48Sopenharmony_ci mergedArray.set(bannerValue); 37fb726d48Sopenharmony_ci mergedArray.set(authTypeValue, bannerValue.length); 38fb726d48Sopenharmony_ci mergedArray.set(sessionIdValue, bannerValue.length + authTypeValue.length); 39fb726d48Sopenharmony_ci mergedArray.set(connectKey, bannerValue.length + authTypeValue.length + sessionIdValue.length); 40fb726d48Sopenharmony_ci mergedArray.set(buf, bannerValue.length + authTypeValue.length + sessionIdValue.length + connectKey.length); 41fb726d48Sopenharmony_ci mergedArray.set(version, bannerValue.length + authTypeValue.length + sessionIdValue.length + connectKey.length + buf.length); 42fb726d48Sopenharmony_ci return mergedArray; 43fb726d48Sopenharmony_ci } 44fb726d48Sopenharmony_ci 45fb726d48Sopenharmony_ci static serializePayloadProtect(payloadProtect: PayloadProtect): Uint8Array { 46fb726d48Sopenharmony_ci let channelId = this.serializeU32(1, payloadProtect.channelId); 47fb726d48Sopenharmony_ci let commandFlag = this.serializeU32(2, payloadProtect.commandFlag); 48fb726d48Sopenharmony_ci let checkSum = this.serializeU8(3, payloadProtect.checkSum); 49fb726d48Sopenharmony_ci let vCode = this.serializeU8(4, payloadProtect.vCode); 50fb726d48Sopenharmony_ci let mergedArray = new Uint8Array(channelId.length + commandFlag.length + checkSum.length + vCode.length); 51fb726d48Sopenharmony_ci mergedArray.set(channelId); 52fb726d48Sopenharmony_ci mergedArray.set(commandFlag, channelId.length); 53fb726d48Sopenharmony_ci mergedArray.set(checkSum, channelId.length + commandFlag.length); 54fb726d48Sopenharmony_ci mergedArray.set(vCode, channelId.length + commandFlag.length + checkSum.length); 55fb726d48Sopenharmony_ci return mergedArray; 56fb726d48Sopenharmony_ci } 57fb726d48Sopenharmony_ci 58fb726d48Sopenharmony_ci static serializeTransferConfig(transferConfig: TransferConfig): Uint8Array { 59fb726d48Sopenharmony_ci let fileSizeValue = this.serializeU64(1, transferConfig.fileSize); 60fb726d48Sopenharmony_ci let atimeValue = this.serializeU64(2, transferConfig.atime); 61fb726d48Sopenharmony_ci let mtimeValue = this.serializeU64(3, transferConfig.mtime); 62fb726d48Sopenharmony_ci let optionsValue = this.serializeToString(4, transferConfig.options); 63fb726d48Sopenharmony_ci let pathValue = this.serializeToString(5, transferConfig.path); 64fb726d48Sopenharmony_ci let optionalNameValue = this.serializeToString(6, transferConfig.optionalName); 65fb726d48Sopenharmony_ci let updateIfNewValue = this.serializeU32(7, transferConfig.updateIfNew ? 1 : 0); 66fb726d48Sopenharmony_ci let compressTypeValue = this.serializeU8(8, transferConfig.compressType); 67fb726d48Sopenharmony_ci let holdTimestampValue = this.serializeU32(9, transferConfig.holdTimestamp ? 1 : 0); 68fb726d48Sopenharmony_ci let functionNameValue = this.serializeToString(10, transferConfig.functionName); 69fb726d48Sopenharmony_ci let clientCwdValue = this.serializeToString(11, transferConfig.clientCwd); 70fb726d48Sopenharmony_ci let reserve1Value = this.serializeToString(12, transferConfig.reserve1); 71fb726d48Sopenharmony_ci let reserve2Value = this.serializeToString(13, transferConfig.reserve2); 72fb726d48Sopenharmony_ci let mergedArray = new Uint8Array( 73fb726d48Sopenharmony_ci fileSizeValue.length + 74fb726d48Sopenharmony_ci atimeValue.length + 75fb726d48Sopenharmony_ci mtimeValue.length + 76fb726d48Sopenharmony_ci optionsValue.length + 77fb726d48Sopenharmony_ci pathValue.length + 78fb726d48Sopenharmony_ci optionalNameValue.length + 79fb726d48Sopenharmony_ci updateIfNewValue.length + 80fb726d48Sopenharmony_ci compressTypeValue.length + 81fb726d48Sopenharmony_ci holdTimestampValue.length + 82fb726d48Sopenharmony_ci functionNameValue.length + 83fb726d48Sopenharmony_ci clientCwdValue.length + 84fb726d48Sopenharmony_ci reserve1Value.length + 85fb726d48Sopenharmony_ci reserve2Value.length 86fb726d48Sopenharmony_ci ); 87fb726d48Sopenharmony_ci let offset = 0; 88fb726d48Sopenharmony_ci mergedArray.set(fileSizeValue); 89fb726d48Sopenharmony_ci offset += fileSizeValue.length; 90fb726d48Sopenharmony_ci mergedArray.set(atimeValue, offset); 91fb726d48Sopenharmony_ci offset += atimeValue.length; 92fb726d48Sopenharmony_ci mergedArray.set(mtimeValue, offset); 93fb726d48Sopenharmony_ci offset += mtimeValue.length; 94fb726d48Sopenharmony_ci mergedArray.set(optionsValue, offset); 95fb726d48Sopenharmony_ci offset += optionsValue.length; 96fb726d48Sopenharmony_ci mergedArray.set(pathValue, offset); 97fb726d48Sopenharmony_ci offset += pathValue.length; 98fb726d48Sopenharmony_ci mergedArray.set(optionalNameValue, offset); 99fb726d48Sopenharmony_ci offset += optionalNameValue.length; 100fb726d48Sopenharmony_ci mergedArray.set(updateIfNewValue, offset); 101fb726d48Sopenharmony_ci offset += updateIfNewValue.length; 102fb726d48Sopenharmony_ci mergedArray.set(compressTypeValue, offset); 103fb726d48Sopenharmony_ci offset += compressTypeValue.length; 104fb726d48Sopenharmony_ci mergedArray.set(holdTimestampValue, offset); 105fb726d48Sopenharmony_ci offset += holdTimestampValue.length; 106fb726d48Sopenharmony_ci mergedArray.set(functionNameValue, offset); 107fb726d48Sopenharmony_ci offset += functionNameValue.length; 108fb726d48Sopenharmony_ci mergedArray.set(clientCwdValue, offset); 109fb726d48Sopenharmony_ci offset += clientCwdValue.length; 110fb726d48Sopenharmony_ci mergedArray.set(reserve1Value, offset); 111fb726d48Sopenharmony_ci offset += reserve1Value.length; 112fb726d48Sopenharmony_ci mergedArray.set(reserve2Value, offset); 113fb726d48Sopenharmony_ci return mergedArray; 114fb726d48Sopenharmony_ci } 115fb726d48Sopenharmony_ci 116fb726d48Sopenharmony_ci static serializeTransferPayload(transferPayload: TransferPayload): Uint8Array { 117fb726d48Sopenharmony_ci let indexValue = this.serializeU64(1, transferPayload.index); 118fb726d48Sopenharmony_ci let compressTypeValue = this.serializeU8(2, transferPayload.compressType); 119fb726d48Sopenharmony_ci let compressSizeValue = this.serializeU32(3, transferPayload.compressSize); 120fb726d48Sopenharmony_ci let uncompressSizeValue = this.serializeU32(4, transferPayload.uncompressSize); 121fb726d48Sopenharmony_ci let mergedArray = new Uint8Array( 122fb726d48Sopenharmony_ci indexValue.length + compressTypeValue.length + compressSizeValue.length + uncompressSizeValue.length 123fb726d48Sopenharmony_ci ); 124fb726d48Sopenharmony_ci let offset = 0; 125fb726d48Sopenharmony_ci mergedArray.set(indexValue); 126fb726d48Sopenharmony_ci offset += indexValue.length; 127fb726d48Sopenharmony_ci mergedArray.set(compressTypeValue, offset); 128fb726d48Sopenharmony_ci offset += compressTypeValue.length; 129fb726d48Sopenharmony_ci mergedArray.set(compressSizeValue, offset); 130fb726d48Sopenharmony_ci offset += compressSizeValue.length; 131fb726d48Sopenharmony_ci mergedArray.set(uncompressSizeValue, offset); 132fb726d48Sopenharmony_ci return mergedArray; 133fb726d48Sopenharmony_ci } 134fb726d48Sopenharmony_ci 135fb726d48Sopenharmony_ci static serializeToString(tag: number, value: string): Uint8Array { 136fb726d48Sopenharmony_ci let number = this.makeTagWireType(tag, WireType.LENGTH_DELIMETED); 137fb726d48Sopenharmony_ci let data = this.writeVarIntU32(number); 138fb726d48Sopenharmony_ci let dataLength = this.writeVarIntU32(value.length); 139fb726d48Sopenharmony_ci const encoder = new TextEncoder(); 140fb726d48Sopenharmony_ci const buffer = encoder.encode(value); 141fb726d48Sopenharmony_ci let stringValue = new Uint8Array(data.length + dataLength.length + buffer.length); 142fb726d48Sopenharmony_ci stringValue.set(data); 143fb726d48Sopenharmony_ci stringValue.set(dataLength, data.length); 144fb726d48Sopenharmony_ci stringValue.set(buffer, data.length + dataLength.length); 145fb726d48Sopenharmony_ci return stringValue; 146fb726d48Sopenharmony_ci } 147fb726d48Sopenharmony_ci 148fb726d48Sopenharmony_ci static serializeU8(tag: number, value: number): Uint8Array { 149fb726d48Sopenharmony_ci return this.serializeU32(tag, value); 150fb726d48Sopenharmony_ci } 151fb726d48Sopenharmony_ci 152fb726d48Sopenharmony_ci static serializeU32(tag: number, value: number): Uint8Array { 153fb726d48Sopenharmony_ci let makeTagWireType = this.writeTagWriteType(tag, WireType.VARINT); 154fb726d48Sopenharmony_ci let writeVarInt = this.writeVarIntU32(value); 155fb726d48Sopenharmony_ci let mergedArray = new Uint8Array(makeTagWireType.length + writeVarInt.length); 156fb726d48Sopenharmony_ci mergedArray.set(makeTagWireType); 157fb726d48Sopenharmony_ci mergedArray.set(writeVarInt, makeTagWireType.length); 158fb726d48Sopenharmony_ci return mergedArray; 159fb726d48Sopenharmony_ci } 160fb726d48Sopenharmony_ci 161fb726d48Sopenharmony_ci static serializeU64(tag: number, value: number): Uint8Array { 162fb726d48Sopenharmony_ci let makeTagWireType = this.writeTagWriteType(tag, WireType.VARINT); 163fb726d48Sopenharmony_ci let writeVarInt = this.writeVarIntU64(value); 164fb726d48Sopenharmony_ci let mergedArray = new Uint8Array(makeTagWireType.length + writeVarInt.length); 165fb726d48Sopenharmony_ci mergedArray.set(makeTagWireType); 166fb726d48Sopenharmony_ci mergedArray.set(writeVarInt, makeTagWireType.length); 167fb726d48Sopenharmony_ci return mergedArray; 168fb726d48Sopenharmony_ci } 169fb726d48Sopenharmony_ci 170fb726d48Sopenharmony_ci static writeTagWriteType(tag: number, wireType: number): Uint8Array { 171fb726d48Sopenharmony_ci let number = this.makeTagWireType(tag, wireType); 172fb726d48Sopenharmony_ci return this.writeVarIntU32(number); 173fb726d48Sopenharmony_ci } 174fb726d48Sopenharmony_ci 175fb726d48Sopenharmony_ci static makeTagWireType(tag: number, wireType: number): number { 176fb726d48Sopenharmony_ci return (tag << 3) | wireType; 177fb726d48Sopenharmony_ci } 178fb726d48Sopenharmony_ci 179fb726d48Sopenharmony_ci static writeVarIntU64(u64value: number): Uint8Array { 180fb726d48Sopenharmony_ci let uint64buffer: number[] = []; 181fb726d48Sopenharmony_ci for (let index = 0; index < 10; index++) { 182fb726d48Sopenharmony_ci uint64buffer[index] = u64value & 0b01111111; 183fb726d48Sopenharmony_ci u64value = u64value >> 7; 184fb726d48Sopenharmony_ci if (u64value) { 185fb726d48Sopenharmony_ci uint64buffer[index] = uint64buffer[index] | 0b10000000; 186fb726d48Sopenharmony_ci } else { 187fb726d48Sopenharmony_ci break; 188fb726d48Sopenharmony_ci } 189fb726d48Sopenharmony_ci } 190fb726d48Sopenharmony_ci return new Uint8Array(uint64buffer); 191fb726d48Sopenharmony_ci } 192fb726d48Sopenharmony_ci 193fb726d48Sopenharmony_ci static writeVarIntU32(u32value: number): Uint8Array { 194fb726d48Sopenharmony_ci let u32buffer: number[] = []; 195fb726d48Sopenharmony_ci for (let index = 0; index < 5; index++) { 196fb726d48Sopenharmony_ci u32buffer[index] = u32value & 0b01111111; 197fb726d48Sopenharmony_ci u32value = u32value >> 7; 198fb726d48Sopenharmony_ci if (u32value) { 199fb726d48Sopenharmony_ci u32buffer[index] = u32buffer[index] | 0b10000000; 200fb726d48Sopenharmony_ci } else { 201fb726d48Sopenharmony_ci break; 202fb726d48Sopenharmony_ci } 203fb726d48Sopenharmony_ci } 204fb726d48Sopenharmony_ci return new Uint8Array(u32buffer); 205fb726d48Sopenharmony_ci } 206fb726d48Sopenharmony_ci 207fb726d48Sopenharmony_ci static parseHandshake(data: Uint8Array): SessionHandShake { 208fb726d48Sopenharmony_ci // banner 209fb726d48Sopenharmony_ci let bannerBuffer = data.buffer; 210fb726d48Sopenharmony_ci let bannerTag = this.getTag(WireType.LENGTH_DELIMETED, new DataView(bannerBuffer)); 211fb726d48Sopenharmony_ci let bannerLengthBuf = bannerBuffer.slice(this.writeVarIntU32(this.makeTagWireType(bannerTag, WireType.LENGTH_DELIMETED)).length); 212fb726d48Sopenharmony_ci let bannerSize = this.readVarIntU32(new DataView(bannerLengthBuf)); 213fb726d48Sopenharmony_ci let bannerDataBuffer = bannerLengthBuf.slice(this.writeVarIntU32(bannerSize).length); 214fb726d48Sopenharmony_ci let banner = this.parseString(bannerDataBuffer, bannerSize); 215fb726d48Sopenharmony_ci 216fb726d48Sopenharmony_ci // authType 217fb726d48Sopenharmony_ci let authBuffer = bannerDataBuffer.slice(bannerSize); 218fb726d48Sopenharmony_ci let authTypeTag = this.getTag(WireType.VARINT, new DataView(authBuffer)); 219fb726d48Sopenharmony_ci let authDataBuffer = authBuffer.slice(this.writeVarIntU32(this.makeTagWireType(authTypeTag, WireType.VARINT)).length); 220fb726d48Sopenharmony_ci let authType = this.parseU8(new DataView(authDataBuffer), 1); 221fb726d48Sopenharmony_ci let authTypeLenth = this.writeVarIntU32(authType).length; 222fb726d48Sopenharmony_ci 223fb726d48Sopenharmony_ci // sessionId 224fb726d48Sopenharmony_ci let sessionIdBuffer = authDataBuffer.slice(authTypeLenth); 225fb726d48Sopenharmony_ci let sessionIdTag = this.getTag(WireType.VARINT, new DataView(sessionIdBuffer)); 226fb726d48Sopenharmony_ci let sessionDataBuffer = sessionIdBuffer.slice(this.writeVarIntU32(this.makeTagWireType(sessionIdTag, WireType.VARINT)).length); 227fb726d48Sopenharmony_ci let sessionId = this.parseU32(new DataView(sessionDataBuffer), 3); 228fb726d48Sopenharmony_ci let sessionIdLenth = this.writeVarIntU32(sessionId).length; 229fb726d48Sopenharmony_ci 230fb726d48Sopenharmony_ci // connectKey 231fb726d48Sopenharmony_ci let connectKeyBuffer = sessionDataBuffer.slice(sessionIdLenth); 232fb726d48Sopenharmony_ci let connectKeyTag = this.getTag(WireType.LENGTH_DELIMETED, new DataView(connectKeyBuffer)); 233fb726d48Sopenharmony_ci let connectLengthBuffer = connectKeyBuffer.slice(this.writeVarIntU32(this.makeTagWireType(connectKeyTag, WireType.LENGTH_DELIMETED)).length); 234fb726d48Sopenharmony_ci let connectKeySize = this.readVarIntU32(new DataView(connectLengthBuffer)); 235fb726d48Sopenharmony_ci let connectDataBuffer = connectLengthBuffer.slice(this.writeVarIntU32(connectKeySize).length); 236fb726d48Sopenharmony_ci let connectKey = this.parseString(connectDataBuffer, connectKeySize); 237fb726d48Sopenharmony_ci 238fb726d48Sopenharmony_ci // buf 239fb726d48Sopenharmony_ci let bufBuffer = connectDataBuffer.slice(connectKeySize); 240fb726d48Sopenharmony_ci let bufTag = this.getTag(WireType.LENGTH_DELIMETED, new DataView(bufBuffer)); 241fb726d48Sopenharmony_ci let lengthBuffer = bufBuffer.slice(this.writeVarIntU32(this.makeTagWireType(bufTag, WireType.LENGTH_DELIMETED)).length); 242fb726d48Sopenharmony_ci let bufSize = this.readVarIntU32(new DataView(lengthBuffer)); 243fb726d48Sopenharmony_ci let dataBuffer = lengthBuffer.slice(this.writeVarIntU32(bufSize).length); 244fb726d48Sopenharmony_ci let buf = this.parseString(dataBuffer, bufSize); 245fb726d48Sopenharmony_ci 246fb726d48Sopenharmony_ci // version 247fb726d48Sopenharmony_ci let versionBuffer = dataBuffer.slice(bufSize); 248fb726d48Sopenharmony_ci let versionTag = this.getTag(WireType.LENGTH_DELIMETED, new DataView(versionBuffer)); 249fb726d48Sopenharmony_ci let versionLengthBuffer = versionBuffer.slice(this.writeVarIntU32(this.makeTagWireType(versionTag, WireType.LENGTH_DELIMETED)).length); 250fb726d48Sopenharmony_ci let versionSize = this.readVarIntU32(new DataView(versionLengthBuffer)); 251fb726d48Sopenharmony_ci let versionDataBuffer = versionLengthBuffer.slice(this.writeVarIntU32(versionSize).length); 252fb726d48Sopenharmony_ci let version = this.parseString(versionDataBuffer, versionSize); 253fb726d48Sopenharmony_ci return new SessionHandShake(banner, authType, sessionId, connectKey, buf, version); 254fb726d48Sopenharmony_ci } 255fb726d48Sopenharmony_ci 256fb726d48Sopenharmony_ci static parseTransferConfig(data: ArrayBuffer): TransferConfig { 257fb726d48Sopenharmony_ci let uint8Array = new Uint8Array(data); 258fb726d48Sopenharmony_ci // channelId 259fb726d48Sopenharmony_ci let dataBuffer = uint8Array.buffer; 260fb726d48Sopenharmony_ci let channelTag = this.getTag(WireType.VARINT, new DataView(dataBuffer)); 261fb726d48Sopenharmony_ci let channelDataBuffer = dataBuffer.slice(1); 262fb726d48Sopenharmony_ci let channelDataView = new DataView(channelDataBuffer); 263fb726d48Sopenharmony_ci let fileSize = this.parseU64(channelDataView, 1); 264fb726d48Sopenharmony_ci return new TransferConfig(fileSize, 0, 0, '', '', '', false, 0, false, '', '', '', ''); 265fb726d48Sopenharmony_ci } 266fb726d48Sopenharmony_ci 267fb726d48Sopenharmony_ci static parsePayloadProtect(data: ArrayBuffer): PayloadProtect { 268fb726d48Sopenharmony_ci let uint8Array = new Uint8Array(data); 269fb726d48Sopenharmony_ci 270fb726d48Sopenharmony_ci // channelId 271fb726d48Sopenharmony_ci let dataBuffer = uint8Array.buffer; 272fb726d48Sopenharmony_ci let channelTag = this.getTag(WireType.VARINT, new DataView(dataBuffer)); 273fb726d48Sopenharmony_ci let channelDataBuffer = dataBuffer.slice(1); 274fb726d48Sopenharmony_ci let channelDataView = new DataView(channelDataBuffer); 275fb726d48Sopenharmony_ci let channelId = this.parseU32(channelDataView, 1); 276fb726d48Sopenharmony_ci 277fb726d48Sopenharmony_ci // commandFlag 278fb726d48Sopenharmony_ci let commandTagBuffer = channelDataBuffer.slice(1); 279fb726d48Sopenharmony_ci let commandTag = this.getTag(WireType.VARINT, new DataView(commandTagBuffer)); 280fb726d48Sopenharmony_ci let commandDataBuffer = commandTagBuffer.slice(1); 281fb726d48Sopenharmony_ci let commandDataView = new DataView(commandDataBuffer); 282fb726d48Sopenharmony_ci let commandFlag = this.parseU32(commandDataView, 1); 283fb726d48Sopenharmony_ci 284fb726d48Sopenharmony_ci // checkSum 285fb726d48Sopenharmony_ci let checkSumTagBuffer = commandDataBuffer.slice(1); 286fb726d48Sopenharmony_ci let checkSumTag = this.getTag(WireType.VARINT, new DataView(checkSumTagBuffer)); 287fb726d48Sopenharmony_ci let checkSumDataBuffer = checkSumTagBuffer.slice(1); 288fb726d48Sopenharmony_ci let checkSumDataView = new DataView(checkSumDataBuffer); 289fb726d48Sopenharmony_ci let checkSum = this.parseU8(checkSumDataView, 1); 290fb726d48Sopenharmony_ci 291fb726d48Sopenharmony_ci // vCode 292fb726d48Sopenharmony_ci let vCodeTagBuffer = checkSumDataBuffer.slice(1); 293fb726d48Sopenharmony_ci let vCodeTag = this.getTag(WireType.VARINT, new DataView(vCodeTagBuffer)); 294fb726d48Sopenharmony_ci let vCodeDataBuffer = vCodeTagBuffer.slice(1); 295fb726d48Sopenharmony_ci let vCodeDataView = new DataView(vCodeDataBuffer); 296fb726d48Sopenharmony_ci let vCode = this.parseU8(vCodeDataView, 1); 297fb726d48Sopenharmony_ci 298fb726d48Sopenharmony_ci return new PayloadProtect(channelId, commandFlag, checkSum, vCode); 299fb726d48Sopenharmony_ci } 300fb726d48Sopenharmony_ci 301fb726d48Sopenharmony_ci static parseString(buffer: ArrayBuffer, size: number): string { 302fb726d48Sopenharmony_ci let arrayBuffer = buffer.slice(0, size); 303fb726d48Sopenharmony_ci let textDecoder = new TextDecoder(); 304fb726d48Sopenharmony_ci return textDecoder.decode(arrayBuffer); 305fb726d48Sopenharmony_ci } 306fb726d48Sopenharmony_ci 307fb726d48Sopenharmony_ci static parseU8(dataView: DataView, size: number): number { 308fb726d48Sopenharmony_ci return this.parseU32(dataView, size); 309fb726d48Sopenharmony_ci } 310fb726d48Sopenharmony_ci 311fb726d48Sopenharmony_ci static parseU32(dataView: DataView, size: number): number { 312fb726d48Sopenharmony_ci return this.readVarIntU32(dataView); 313fb726d48Sopenharmony_ci } 314fb726d48Sopenharmony_ci 315fb726d48Sopenharmony_ci static parseU64(dataView: DataView, size: number): number { 316fb726d48Sopenharmony_ci return this.readVarIntU64(dataView); 317fb726d48Sopenharmony_ci } 318fb726d48Sopenharmony_ci 319fb726d48Sopenharmony_ci static readVarIntU32(dataView: DataView): number { 320fb726d48Sopenharmony_ci let u32IntValue: number = 0; 321fb726d48Sopenharmony_ci for (let u32IntIndex = 0; u32IntIndex < 5; u32IntIndex++) { 322fb726d48Sopenharmony_ci if (dataView.byteLength < u32IntIndex + 1) { 323fb726d48Sopenharmony_ci return -1; 324fb726d48Sopenharmony_ci } 325fb726d48Sopenharmony_ci let int8 = dataView.getUint8(u32IntIndex); 326fb726d48Sopenharmony_ci let readValue = int8 & 0b01111111; 327fb726d48Sopenharmony_ci u32IntValue |= readValue << (7 * u32IntIndex); 328fb726d48Sopenharmony_ci if (!(int8 & 0b10000000)) { 329fb726d48Sopenharmony_ci return u32IntValue; 330fb726d48Sopenharmony_ci } 331fb726d48Sopenharmony_ci } 332fb726d48Sopenharmony_ci return -1; 333fb726d48Sopenharmony_ci } 334fb726d48Sopenharmony_ci 335fb726d48Sopenharmony_ci static readVarIntU64(dataView: DataView): number { 336fb726d48Sopenharmony_ci let u62IntValue: number = 0; 337fb726d48Sopenharmony_ci for (let u62IntIndex = 0; u62IntIndex < 10; u62IntIndex++) { 338fb726d48Sopenharmony_ci if (dataView.byteLength < u62IntIndex + 1) { 339fb726d48Sopenharmony_ci return -1; 340fb726d48Sopenharmony_ci } 341fb726d48Sopenharmony_ci let int8 = dataView.getUint8(u62IntIndex); 342fb726d48Sopenharmony_ci let readValue = int8 & 0b01111111; 343fb726d48Sopenharmony_ci u62IntValue |= readValue << (7 * u62IntIndex); 344fb726d48Sopenharmony_ci if (!(int8 & 0b10000000)) { 345fb726d48Sopenharmony_ci return u62IntValue; 346fb726d48Sopenharmony_ci } 347fb726d48Sopenharmony_ci } 348fb726d48Sopenharmony_ci return -1; 349fb726d48Sopenharmony_ci } 350fb726d48Sopenharmony_ci 351fb726d48Sopenharmony_ci static readTagWireType(tagKey: number): number { 352fb726d48Sopenharmony_ci let wireNewType: WireType = tagKey & 0b0111; 353fb726d48Sopenharmony_ci return tagKey >> 3; 354fb726d48Sopenharmony_ci } 355fb726d48Sopenharmony_ci 356fb726d48Sopenharmony_ci static getTag(wireType: WireType, dataView: DataView): number { 357fb726d48Sopenharmony_ci let tagKey = this.readVarIntU32(dataView); 358fb726d48Sopenharmony_ci return this.readTagWireType(tagKey); 359fb726d48Sopenharmony_ci } 360fb726d48Sopenharmony_ci} 361