1/* 2* Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development 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// remote消息中变量类型名(key)与对应的写parcel方法名(value)的映射(参考parcel.h) 16const DATA_W_MAP = new Map( 17 [['bool', 'WriteBoolUnaligned'], ['int8_t', 'WriteInt8'], ['uint8_t', 'ReadUint8'], 18 ['int16_t', 'WriteInt16'], ['uint16_t', 'WriteUint16'], 19 ['int32_t', 'WriteInt32'], ['uint32_t', 'WriteUint32'], ['int64_t', 'WriteInt64'], ['uint64_t', 'WriteUint64'], 20 ['float', 'WriteFloat'], ['double', 'WriteDouble'], ['char *', 'WriteCString'], ['std::string', 'WriteString'], 21 ['string', 'WriteString'] 22]); 23 24// remote消息中变量类型名(key)与对应的读parcel方法名(value)的映射(参考parcel.h) 25const DATA_R_MAP = new Map( 26 [['bool', 'ReadBoolUnaligned'], ['int8_t', 'ReadInt8'], ['uint8_t', 'ReadUint8'], 27 ['int16_t', 'ReadInt16'], ['uint16_t', 'ReadUint16'], 28 ['int32_t', 'ReadInt32'], ['uint32_t', 'ReadUint32'], ['int64_t', 'ReadInt64'], ['uint64_t', 'ReadUint64'], 29 ['float', 'ReadFloat'], ['double', 'ReadDouble'], ['char *', 'ReadCString'], ['std::string', 'ReadString'], 30 ['string', 'ReadString'] 31]); 32 33// 常用类型转换表, 将C语言常见类型(key)转换为remote data读写函数使用的类型(value) 34// 例如 ErrCode 类型在框架中的系统原型为int类型,这里映射成int32_t, 35// 因为int32_t类型在 DATA_W_MAP/DATA_R_MAP 表中有对应的读写数据方法(WriteInt32/ReadInt32) 36const TYPE_DEF_MAP = new Map( 37 [['ErrCode', 'int32_t'], ['char', 'int8_t'], ['short', 'int16_t'], ['int', 'int32_t'], ['long', 'int64_t'], 38 ['unsigned char', 'uint8_t'], ['unsigned short', 'uint16_t'], ['unsigned int', 'uint32_t'], 39 ['unsigned long', 'uint64_t'], ['double_t', 'double'], ['float_t', 'float'], ['size_t', 'double'], 40 ['long long', 'double'], ['long double', 'double'] 41]); 42 43// remote消息中vector变量类型名(key)与对应的写parcel方法名(value)的映射(参考parcel.h) 44const VECTOR_W_MAP = new Map( 45 [['bool', 'WriteBoolVector'], ['int8_t', 'WriteInt8Vector'], ['uint8_t', 'WriteUInt8Vector'], 46 ['int16_t', 'WriteInt16Vector'], ['uint16_t', 'WriteUInt16Vector'], ['int32_t', 'WriteInt32Vector'], 47 ['uint32_t', 'WriteUInt32Vector'], ['int64_t', 'WriteInt64Vector'], ['uint64_t', 'WriteUInt64Vector'], 48 ['float', 'WriteFloatVector'], ['double', 'WriteDoubleVector'], ['u16string', 'WriteString16Vector'], 49 ['std::string', 'WriteStringVector'], ['string', 'WriteStringVector'] 50]); 51 52// remote消息中vector变量类型名(key)与对应的读parcel方法名(value)的映射(参考parcel.h) 53const VECTOR_R_MAP = new Map( 54 [['bool', 'ReadBoolVector'], ['int8_t', 'ReadInt8Vector'], ['uint8_t', 'ReadUInt8Vector'], 55 ['int16_t', 'ReadInt16Vector'], ['uint16_t', 'ReadUInt16Vector'], ['int32_t', 'ReadInt32Vector'], 56 ['uint32_t', 'ReadUInt32Vector'], ['int64_t', 'ReadInt64Vector'], ['uint64_t', 'ReadUInt64Vector'], 57 ['float', 'ReadFloatVector'], ['double', 'ReadDoubleVector'], ['u16string', 'ReadString16Vector'], 58 ['std::string', 'ReadStringVector'], ['string', 'ReadStringVector'] 59]); 60 61function getParcelType(srcType) { 62 let parcelType = TYPE_DEF_MAP.get(srcType); 63 return parcelType === undefined ? srcType : parcelType; 64} 65 66class MarshallInfo { 67 constructor(className) { 68 this.className = className; 69 this.marshallFuncName = ''; 70 this.marshallFuncStr = ''; 71 this.unmarshallFuncName = ''; 72 this.unmarshallFuncStr = ''; 73 } 74} 75 76class AllParseFileList { } 77AllParseFileList.parseFile_ = []; 78AllParseFileList.push = function (ifs) { 79 AllParseFileList.parseFile_.push(ifs); 80}; 81AllParseFileList.pop = function () { 82 AllParseFileList.parseFile_.pop(); 83}; 84AllParseFileList.clearAll = function () { 85 AllParseFileList.parseFile_.splice(0, AllParseFileList.parseFile_.length); 86}; 87AllParseFileList.findClassByName = function (destClassName) { 88 for (let i = 0; i < AllParseFileList.parseFile_.length; ++i) { 89 let classes = AllParseFileList.parseFile_[i].classes; 90 for (let className in classes) { 91 if (className === destClassName) { 92 classes[className].isInclude = AllParseFileList.parseFile_[i].isInclude; 93 return classes[className]; 94 } 95 } 96 } 97 return null; 98}; 99 100 101/** 102 * 记录正在生成序列化代码的类名,防止嵌套循环 103 */ 104class ProcessingClassList { } 105ProcessingClassList.classes_ = []; 106ProcessingClassList.push = function (classObj) { 107 if (this.findByName(classObj.className) !== null) { 108 // 已存在的class不重复添加 109 return; 110 } 111 ProcessingClassList.classes_.push(classObj); 112}; 113ProcessingClassList.clearAll = function () { 114 ProcessingClassList.classes_.splice(0, ProcessingClassList.classes_.length); 115}; 116ProcessingClassList.findByName = function (className) { 117 for (let i = 0; i < ProcessingClassList.classes_.length; ++i) { 118 if (ProcessingClassList.classes_[i].className === className) { 119 return ProcessingClassList.classes_[i]; 120 } 121 } 122 return null; 123}; 124 125module.exports = { 126 DATA_W_MAP, DATA_R_MAP, VECTOR_W_MAP, VECTOR_R_MAP, getParcelType, AllParseFileList, MarshallInfo, 127 ProcessingClassList 128}; 129 130