From dee86d0cb4724b6b8e6419ef8d87436fb97bea69 Mon Sep 17 00:00:00 2001 From: godotg Date: Thu, 28 Sep 2023 10:15:34 +0800 Subject: [PATCH] feat[py]: python compatible field support --- .../serializer/python/GeneratePyUtils.java | 16 +++++-- .../serializer/python/PyCharSerializer.java | 47 ------------------- .../src/main/resources/python/ByteBuffer.py | 2 +- .../main/resources/python/ProtocolTemplate.py | 9 +++- 4 files changed, 21 insertions(+), 53 deletions(-) delete mode 100644 protocol/src/main/java/com/zfoo/protocol/serializer/python/PyCharSerializer.java diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/python/GeneratePyUtils.java b/protocol/src/main/java/com/zfoo/protocol/serializer/python/GeneratePyUtils.java index d175d0ef..b6e7e2d8 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/python/GeneratePyUtils.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/python/GeneratePyUtils.java @@ -153,11 +153,20 @@ public abstract class GeneratePyUtils { var fields = registration.getFields(); var fieldRegistrations = registration.getFieldRegistrations(); var pyBuilder = new StringBuilder(); + if (registration.isCompatible()) { + pyBuilder.append("beforeWriteIndex = buffer.getWriteOffset()").append(LS); + pyBuilder.append(TAB + TAB).append(StringUtils.format("buffer.writeInt({})", registration.getPredictionLength())).append(LS); + } else { + pyBuilder.append(TAB + TAB).append("buffer.writeInt(-1)").append(LS); + } for (var i = 0; i < fields.length; i++) { var field = fields[i]; var fieldRegistration = fieldRegistrations[i]; pySerializer(fieldRegistration.serializer()).writeObject(pyBuilder, "packet." + field.getName(), 2, field, fieldRegistration); } + if (registration.isCompatible()) { + pyBuilder.append(TAB + TAB).append(StringUtils.format("buffer.adjustPadding({}, beforeWriteIndex)", registration.getPredictionLength())).append(LS); + } return pyBuilder.toString(); } @@ -169,9 +178,10 @@ public abstract class GeneratePyUtils { var field = fields[i]; var fieldRegistration = fieldRegistrations[i]; if (field.isAnnotationPresent(Compatible.class)) { - pyBuilder.append(TAB + TAB).append("if not buffer.isReadable():").append(LS); - pyBuilder.append(TAB + TAB + TAB).append("return packet").append(LS); - pyBuilder.append(TAB + TAB).append("pass").append(LS); + pyBuilder.append(TAB + TAB).append("if buffer.compatibleRead(beforeReadIndex, length):").append(LS); + var compatibleReadObject = pySerializer(fieldRegistration.serializer()).readObject(pyBuilder, 3, field, fieldRegistration); + pyBuilder.append(TAB + TAB+ TAB).append(StringUtils.format("packet.{} = {}", field.getName(), compatibleReadObject)).append(LS); + continue; } var readObject = pySerializer(fieldRegistration.serializer()).readObject(pyBuilder, 2, field, fieldRegistration); pyBuilder.append(TAB + TAB).append(StringUtils.format("packet.{} = {}", field.getName(), readObject)).append(LS); diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/python/PyCharSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/python/PyCharSerializer.java deleted file mode 100644 index 697400e4..00000000 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/python/PyCharSerializer.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (C) 2020 The zfoo Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed - * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and limitations under the License. - */ - -package com.zfoo.protocol.serializer.python; - -import com.zfoo.protocol.generate.GenerateProtocolFile; -import com.zfoo.protocol.registration.field.IFieldRegistration; - -import com.zfoo.protocol.util.StringUtils; - -import java.lang.reflect.Field; - -import static com.zfoo.protocol.util.FileUtils.LS; - -/** - * @author godotg - */ -public class PyCharSerializer implements IPySerializer { - @Override - public String fieldDefaultValue(Field field, IFieldRegistration fieldRegistration) { - return "\"\""; - } - - @Override - public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) { - GenerateProtocolFile.addTab(builder, deep); - builder.append(StringUtils.format("buffer.writeChar({})", objectStr)).append(LS); - } - - @Override - public String readObject(StringBuilder builder, int deep, Field field, IFieldRegistration fieldRegistration) { - String result = "result" + GenerateProtocolFile.index.getAndIncrement(); - GenerateProtocolFile.addTab(builder, deep); - builder.append(StringUtils.format("{} = buffer.readChar()", result)).append(LS); - return result; - } -} diff --git a/protocol/src/main/resources/python/ByteBuffer.py b/protocol/src/main/resources/python/ByteBuffer.py index 1f34d183..57e1a978 100644 --- a/protocol/src/main/resources/python/ByteBuffer.py +++ b/protocol/src/main/resources/python/ByteBuffer.py @@ -32,7 +32,7 @@ class ByteBuffer(): pass def compatibleRead(self, beforeReadIndex, length): - return length != -1 && self.getReadOffset() < length + beforeReadIndex + return length != -1 and self.getReadOffset() < length + beforeReadIndex def getWriteOffset(self): return self.writeOffset diff --git a/protocol/src/main/resources/python/ProtocolTemplate.py b/protocol/src/main/resources/python/ProtocolTemplate.py index 8e672b6d..2758ebf4 100644 --- a/protocol/src/main/resources/python/ProtocolTemplate.py +++ b/protocol/src/main/resources/python/ProtocolTemplate.py @@ -8,16 +8,21 @@ class {}: @classmethod def write(cls, buffer, packet): - if buffer.writePacketFlag(packet): + if packet is None: + buffer.writeInt(0) return {} pass @classmethod def read(cls, buffer): - if not buffer.readBool(): + length = buffer.readInt() + if length == 0: return None + beforeReadIndex = buffer.getReadOffset() packet = {}() {} + if length > 0: + buffer.setReadOffset(beforeReadIndex + length) return packet