@@ -41,7 +41,7 @@ def addTextSerialize(typeList, typeData, typesDict, idPrefix, primeType, boxed,
41
41
if (isTemplate != '' ):
42
42
templateArgument = '<MTP::SecureRequest>'
43
43
44
- result += 'bool Serialize_' + name + '(MTPStringLogger &to, int32 stage, int32 lev, Types &types, Types &vtypes, StagesFlags &stages, StagesFlags &flags, const ' + primeType + ' *start, const ' + primeType + ' *end, uint32 iflag) {\n '
44
+ result += 'bool Serialize_' + name + '(DumpToTextBuffer &to, int32 stage, int32 lev, Types &types, Types &vtypes, StagesFlags &stages, StagesFlags &flags, const ' + primeType + ' *start, const ' + primeType + ' *end, uint32 iflag) {\n '
45
45
if (len (conditions )):
46
46
result += '\t auto flag = ' + prefix + name + templateArgument + '::Flags::from_raw(iflag);\n \n '
47
47
if (len (prms )):
@@ -162,8 +162,11 @@ def readAndGenerate(inputFiles, outputPath, scheme):
162
162
outputSource = outputPath + '.cpp'
163
163
outputConversionHeader = outputPath + '-conversion.h'
164
164
outputConversionSource = outputPath + '-conversion.cpp'
165
+ outputSerializationHeader = outputPath + '-dump_to_text.h'
166
+ outputSerializationSource = outputPath + '-dump_to_text.cpp'
165
167
outputHeaderBasename = os .path .basename (outputHeader )
166
168
outputConversionHeaderBasename = os .path .basename (outputConversionHeader )
169
+ outputSerializationHeaderBasename = os .path .basename (outputSerializationHeader )
167
170
168
171
prefixes = scheme .get ('prefixes' , {})
169
172
dataPrefix = prefixes .get ('data' , '' )
@@ -196,16 +199,11 @@ def fullDataName(name):
196
199
synonyms = scheme .get ('synonyms' , {})
197
200
writeSections = scheme .get ('sections' , [])
198
201
readWriteSection = 'read-write' in writeSections
199
- serializationSection = 'serialization' in writeSections
200
202
201
203
primitiveTypeNames = scheme .get ('types' )
202
204
typeIdType = primitiveTypeNames .get ('typeId' )
203
205
primeType = primitiveTypeNames .get ('prime' , '' )
204
206
bufferType = primitiveTypeNames .get ('buffer' , '' )
205
- if primeType == '' or bufferType == '' :
206
- if readWriteSection or serializationSection :
207
- print ('Required types not provided.' )
208
- sys .exit (1 )
209
207
210
208
writeConversion = 'conversion' in scheme
211
209
conversionScheme = scheme .get ('conversion' , {})
@@ -224,6 +222,15 @@ def conversionMake(name):
224
222
def conversionMove (name ):
225
223
return conversionTemplate ('move_object_as' , name )
226
224
225
+ writeSerialization = 'dumpToText' in scheme
226
+ serializationScheme = scheme .get ('dumpToText' , {})
227
+ serializationInclude = serializationScheme .get ('include' ) if writeSerialization else ''
228
+
229
+ if primeType == '' or bufferType == '' :
230
+ if readWriteSection or writeSerialization :
231
+ print ('Required types not provided.' )
232
+ sys .exit (1 )
233
+
227
234
def isBuiltinType (name ):
228
235
return name in builtinTypes or name in builtinTemplateTypes
229
236
@@ -1113,16 +1120,12 @@ def isBuiltinType(name):
1113
1120
flagOperators += 'inline ' + parentName + '::Flags mtpCastFlags(' + childName + '::Flags flags) { return static_cast<' + parentName + '::Flag>(flags.value()); }\n '
1114
1121
flagOperators += 'inline ' + parentName + '::Flags mtpCastFlags(MTPflags<' + childName + '::Flags> flags) { return mtpCastFlags(flags.v); }\n '
1115
1122
1116
- textSerializeHeader = ''
1117
1123
textSerializeSource = ''
1118
- if serializationSection :
1119
- textSerializeHeader = '\n \
1120
- // Human-readable text serialization\n \
1121
- [[nodiscard]] bool mtpTextSerializeType(MTPStringLogger &to, const ' + primeType + ' *&from, const ' + primeType + ' *end, ' + primeType + ' cons, uint32 level, ' + primeType + ' vcons);\n '
1124
+ if writeSerialization :
1125
+ # manual types added here
1122
1126
1123
- # manual types added here
1124
1127
textSerializeMethods += '\
1125
- bool _serialize_rpc_result(MTPStringLogger &to, int32 stage, int32 lev, Types &types, Types &vtypes, StagesFlags &stages, StagesFlags &flags, const ' + primeType + ' *start, const ' + primeType + ' *end, uint32 iflag) {\n \
1128
+ bool Serialize_rpc_result(DumpToTextBuffer &to, int32 stage, int32 lev, Types &types, Types &vtypes, StagesFlags &stages, StagesFlags &flags, const ' + primeType + ' *start, const ' + primeType + ' *end, uint32 iflag) {\n \
1126
1129
if (stage) {\n \
1127
1130
to.add(",\\ n").addSpaces(lev);\n \
1128
1131
} else {\n \
@@ -1137,7 +1140,7 @@ def isBuiltinType(name):
1137
1140
return true;\n \
1138
1141
}\n \
1139
1142
\n \
1140
- bool _serialize_msg_container(MTPStringLogger &to, int32 stage, int32 lev, Types &types, Types &vtypes, StagesFlags &stages, StagesFlags &flags, const ' + primeType + ' *start, const ' + primeType + ' *end, uint32 iflag) {\n \
1143
+ bool Serialize_msg_container(DumpToTextBuffer &to, int32 stage, int32 lev, Types &types, Types &vtypes, StagesFlags &stages, StagesFlags &flags, const ' + primeType + ' *start, const ' + primeType + ' *end, uint32 iflag) {\n \
1141
1144
if (stage) {\n \
1142
1145
to.add(",\\ n").addSpaces(lev);\n \
1143
1146
} else {\n \
@@ -1151,7 +1154,7 @@ def isBuiltinType(name):
1151
1154
return true;\n \
1152
1155
}\n \
1153
1156
\n \
1154
- bool _serialize_core_message(MTPStringLogger &to, int32 stage, int32 lev, Types &types, Types &vtypes, StagesFlags &stages, StagesFlags &flags, const ' + primeType + ' *start, const ' + primeType + ' *end, uint32 iflag) {\n \
1157
+ bool Serialize_core_message(DumpToTextBuffer &to, int32 stage, int32 lev, Types &types, Types &vtypes, StagesFlags &stages, StagesFlags &flags, const ' + primeType + ' *start, const ' + primeType + ' *end, uint32 iflag) {\n \
1155
1158
if (stage) {\n \
1156
1159
to.add(",\\ n").addSpaces(lev);\n \
1157
1160
} else {\n \
@@ -1170,20 +1173,21 @@ def isBuiltinType(name):
1170
1173
\n '
1171
1174
1172
1175
textSerializeInit += '\
1173
- result.insert(' + idPrefix + 'rpc_result, _serialize_rpc_result );\n \
1174
- result.insert(' + idPrefix + 'msg_container, _serialize_msg_container );\n \
1175
- result.insert(' + idPrefix + 'core_message, _serialize_core_message );\n '
1176
+ result.insert(' + idPrefix + 'rpc_result, Serialize_rpc_result );\n \
1177
+ result.insert(' + idPrefix + 'msg_container, Serialize_msg_container );\n \
1178
+ result.insert(' + idPrefix + 'core_message, Serialize_core_message );\n '
1176
1179
textSerializeSource = '\n \
1180
+ namespace {\n \
1181
+ \n \
1177
1182
using Types = QVector<' + typeIdType + '>;\n \
1178
1183
using StagesFlags = QVector<int32>;\n \
1179
1184
\n \
1180
1185
' + textSerializeMethods + '\n \
1181
- namespace {\n \
1182
1186
\n \
1183
- using TextSerializer = bool (*)(MTPStringLogger &to, int32 stage, int32 lev, Types &types, Types &vtypes, StagesFlags &stages, StagesFlags &flags, const ' + primeType + ' *start, const ' + primeType + ' *end, uint32 iflag);\n \
1187
+ using TextSerializer = bool (*)(DumpToTextBuffer &to, int32 stage, int32 lev, Types &types, Types &vtypes, StagesFlags &stages, StagesFlags &flags, const ' + primeType + ' *start, const ' + primeType + ' *end, uint32 iflag);\n \
1184
1188
using TextSerializers = QMap<' + typeIdType + ', TextSerializer>;\n \
1185
1189
\n \
1186
- QMap<' + typeIdType + ', TextSerializer> createTextSerializers () {\n \
1190
+ QMap<' + typeIdType + ', TextSerializer> CreateTextSerializers () {\n \
1187
1191
auto result = QMap<' + typeIdType + ', TextSerializer>();\n \
1188
1192
\n \
1189
1193
' + textSerializeInit + '\n \
@@ -1192,8 +1196,8 @@ def isBuiltinType(name):
1192
1196
\n \
1193
1197
} // namespace\n \
1194
1198
\n \
1195
- bool mtpTextSerializeType(MTPStringLogger &to, const ' + primeType + ' *&from, const ' + primeType + ' *end, ' + primeType + ' cons, uint32 level, ' + primeType + ' vcons) {\n \
1196
- static auto serializers = createTextSerializers ();\n \
1199
+ bool DumpToTextType(DumpToTextBuffer &to, const ' + primeType + ' *&from, const ' + primeType + ' *end, ' + primeType + ' cons, uint32 level, ' + primeType + ' vcons) {\n \
1200
+ static auto kSerializers = CreateTextSerializers ();\n \
1197
1201
\n \
1198
1202
QVector<' + typeIdType + '> types, vtypes;\n \
1199
1203
QVector<int32> stages, flags;\n \
@@ -1221,13 +1225,13 @@ def isBuiltinType(name):
1221
1225
}\n \
1222
1226
\n \
1223
1227
int32 lev = level + types.size() - 1;\n \
1224
- auto it = serializers .constFind(type);\n \
1225
- if (it != serializers .cend()) {\n \
1228
+ auto it = kSerializers .constFind(type);\n \
1229
+ if (it != kSerializers .cend()) {\n \
1226
1230
if (!(*it.value())(to, stage, lev, types, vtypes, stages, flags, from, end, flag)) {\n \
1227
1231
to.error();\n \
1228
1232
return false;\n \
1229
1233
}\n \
1230
- } else if (mtpTextSerializeCore (to, from, end, type, lev, vtype)) {\n \
1234
+ } else if (DumpToTextCore (to, from, end, type, lev, vtype)) {\n \
1231
1235
types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back();\n \
1232
1236
} else {\n \
1233
1237
to.error();\n \
@@ -1280,7 +1284,7 @@ class TypeCreator;\n\
1280
1284
' + flagOperators + '\n \
1281
1285
// Factory methods declaration\n \
1282
1286
' + factories + '\n \
1283
- ' + ('} // namespace ' + globalNamespace + '\n ' if globalNamespace != '' else '' ) + textSerializeHeader
1287
+ ' + ('} // namespace ' + globalNamespace + '\n ' if globalNamespace != '' else '' )
1284
1288
1285
1289
source = '\
1286
1290
// WARNING! All changes made in this file will be lost!\n \
@@ -1300,7 +1304,7 @@ class TypeCreator final {\n\
1300
1304
' + ('} // namespace ' + creatorNamespace + '\n \n ' if creatorNamespace != '' else '' ) + '\
1301
1305
// Methods definition\n \
1302
1306
' + methods + '\n \
1303
- ' + ('} // namespace ' + globalNamespace + '\n ' if globalNamespace != '' else '' ) + textSerializeSource
1307
+ ' + ('} // namespace ' + globalNamespace + '\n ' if globalNamespace != '' else '' )
1304
1308
1305
1309
conversionHeader = '\
1306
1310
// WARNING! All changes made in this file will be lost!\n \
@@ -1326,6 +1330,33 @@ class TypeCreator final {\n\
1326
1330
' + conversionSource + '\n \
1327
1331
' + ('} // namespace ' + globalNamespace + '\n ' if globalNamespace != '' else '' )
1328
1332
1333
+ serializationHeader = '\
1334
+ // WARNING! All changes made in this file will be lost!\n \
1335
+ // Created from ' + inputNames + ' by \' generate.py\' \n \
1336
+ //\n \
1337
+ #pragma once\n \
1338
+ \n \
1339
+ ' + ('#include "' + builtinInclude + '"\n \n ' if builtinInclude != '' else '' ) + '\
1340
+ namespace MTP::details {\n \
1341
+ \n \
1342
+ struct DumpToTextBuffer;\n \
1343
+ \n \
1344
+ [[nodiscard]] bool DumpToTextType(DumpToTextBuffer &to, const ' + primeType + ' *&from, const ' + primeType + ' *end, ' + primeType + ' cons = 0, uint32 level = 0, ' + primeType + ' vcons = 0);\n \
1345
+ \n \
1346
+ } // namespace MTP::details\n '
1347
+
1348
+ serializationSource = '\
1349
+ // WARNING! All changes made in this file will be lost!\n \
1350
+ // Created from ' + inputNames + ' by \' generate.py\' \n \
1351
+ //\n \
1352
+ #include "' + outputSerializationHeaderBasename + '"\n \
1353
+ #include "' + outputHeaderBasename + '"\n \
1354
+ #include "' + serializationInclude + '"\n \
1355
+ \n \
1356
+ namespace MTP::details {\n \
1357
+ ' + textSerializeSource + '\n \
1358
+ } // namespace MTP::details\n '
1359
+
1329
1360
alreadyHeader = ''
1330
1361
if os .path .isfile (outputHeader ):
1331
1362
with open (outputHeader , 'r' ) as already :
@@ -1358,3 +1389,20 @@ class TypeCreator final {\n\
1358
1389
if alreadySource != conversionSource :
1359
1390
with open (outputConversionSource , 'w' ) as out :
1360
1391
out .write (conversionSource )
1392
+
1393
+ if writeSerialization :
1394
+ alreadyHeader = ''
1395
+ if os .path .isfile (outputSerializationHeader ):
1396
+ with open (outputSerializationHeader , 'r' ) as already :
1397
+ alreadyHeader = already .read ()
1398
+ if alreadyHeader != serializationHeader :
1399
+ with open (outputSerializationHeader , 'w' ) as out :
1400
+ out .write (serializationHeader )
1401
+
1402
+ alreadySource = ''
1403
+ if os .path .isfile (outputSerializationSource ):
1404
+ with open (outputSerializationSource , 'r' ) as already :
1405
+ alreadySource = already .read ()
1406
+ if alreadySource != serializationSource :
1407
+ with open (outputSerializationSource , 'w' ) as out :
1408
+ out .write (serializationSource )
0 commit comments