コード例 #1
0
        short 구조체_데이터크기_구하기(Dictionary <string, StructInfo> structMap, StructInfo structInfo)
        {
            short totalSize = 0;

            foreach (var memberInfo in structInfo.MemberList)
            {
                if (IsBasicType(memberInfo.Type))
                {
                    if (memberInfo.ArrayValue > 0)
                    {
                        totalSize += (short)(4 * memberInfo.ArrayValue);
                    }
                    else
                    {
                        return(패킷_구조체_기본_버퍼크기);
                    }
                }
                else
                {
                    if (structMap.ContainsKey(memberInfo.Type))
                    {
                        totalSize += 구조체_데이터크기_구하기(structMap, structMap[memberInfo.Type]);
                    }
                    else
                    {
                        throw new System.Exception("구조체를 찾을 수 없습니다.");
                    }
                }
            }

            return(totalSize);
        }
コード例 #2
0
        short 클래스_데이터_크기_구하기(Dictionary <string, StructInfo> structMap, StructInfo structInfo)
        {
            short totalSize = 0;

            foreach (var memberInfo in structInfo.MemberList)
            {
                var typeSize = CheckDataType.CSharpTypeSize(memberInfo.Type);
                if (typeSize > 0)
                {
                    if (memberInfo.ArrayValue <= 1)
                    {
                        totalSize += typeSize;
                    }
                    else
                    {
                        return(typeSize);
                    }
                }
                else
                {
                    if (structMap.ContainsKey(memberInfo.Type))
                    {
                        totalSize += 클래스_데이터_크기_구하기(structMap, structMap[memberInfo.Type]);
                    }
                    else
                    {
                        throw new System.Exception("클래스를 찾을 수 없습니다.");
                    }
                }
            }

            return(totalSize);
        }
コード例 #3
0
        void 디코드_멤버데이터_구조체(string indent, Dictionary <string, StructInfo> 구조체정의_사전, StructInfo structInfo, string packetDataName, List <string> GenerateCode)
        {
            int            fieldIndex     = -1;
            MemberDataInfo prevMemberInfo = null;

            foreach (var memberInfo in structInfo.MemberList)
            {
                ++fieldIndex;
                if (fieldIndex > 0)
                {
                    prevMemberInfo = structInfo.MemberList[fieldIndex - 1];
                }

                if (CheckDataType.IsCppNumberType(memberInfo.Type) ||
                    CheckDataType.IsCSharpNumberType(memberInfo.Type)
                    )
                {
                    if (memberInfo.ArrayValue > 1)
                    {
                        디코드_멤버데이터_정수배열(indent, prevMemberInfo, memberInfo, packetDataName, GenerateCode);
                    }
                    else
                    {
                        디코드_멤버데이터_정수(indent, memberInfo, packetDataName, GenerateCode);
                    }
                }
                else if (CheckDataType.IsCppUnicodeCharacterType(memberInfo.Type) ||
                         CheckDataType.IsCSharpCharacterType(memberInfo.Type)
                         )
                {
                    디코드_멤버데이터_문자열(indent, memberInfo, packetDataName, GenerateCode);
                }
                else // 구조체
                {
                    var structInfo2 = 구조체정의_사전[memberInfo.Type];

                    if (memberInfo.ArrayValue <= 1)
                    {
                        var rePacketDataName = string.Format("{0}.{1}", packetDataName, memberInfo.Name);
                        디코드_멤버데이터_구조체(indent, 구조체정의_사전, structInfo2, rePacketDataName, GenerateCode);
                    }
                    else
                    {
                        var rePacketDataName         = string.Format("{0}.{1}[i]", packetDataName, memberInfo.Name);
                        var arrayValuePrevMemberName = prevMemberInfo.Name;

                        GenerateCode.Add(string.Format("{0}for(int i = 0; i < {1}; ++i)", indent, arrayValuePrevMemberName));

                        GenerateCode.Add(indent + "{");
                        디코드_멤버데이터_구조체(indent + "\t", 구조체정의_사전, structInfo2, rePacketDataName, GenerateCode);
                        GenerateCode.Add(indent + "}");
                        GenerateCode.Add("");
                    }
                }
            }
        }
コード例 #4
0
        void 엔코드_함수_만들기(string indent, Dictionary <string, StructInfo> 구조체정의_사전, StructInfo structInfo, List <string> GenerateCode)
        {
            GenerateCode.Add(string.Format("{0}public static void Encode(List<byte> packetData, {1} packet)", indent, structInfo.Name));
            GenerateCode.Add(indent + "{");

            var indent2 = indent + "\t";

            엔코드_멤버데이터_구조체(indent2, 구조체정의_사전, structInfo, "packet", GenerateCode);

            GenerateCode.Add(indent + "}");
            GenerateCode.Add("");
        }
        void 디코드_함수_만들기(Dictionary <string, StructInfo> 구조체정의_사전, StructInfo structInfo, List <string> GenerateCode)
        {
            GenerateCode.Add(string.Format("\t\tbool Decode(char* pBuffer, {0}& PacketData)", structInfo.Name));
            GenerateCode.Add("\t\t{");
            GenerateCode.Add("\t\t\tshort ReadSize = 0;");
            GenerateCode.Add("\t\t\tshort ReadPos = PACKET_HEADER_SIZE; // 헤더 부분 이후부터 인코딩 시작");
            GenerateCode.Add("");

            디코드_멤버데이터_구조체("\t\t\t", 구조체정의_사전, structInfo, "PacketData", GenerateCode);

            GenerateCode.Add("\t\t\treturn true;");
            GenerateCode.Add("\t\t}");
            GenerateCode.Add("");
        }
コード例 #6
0
        void 디코드_함수_만들기(string indent, Dictionary <string, StructInfo> 구조체정의_사전, StructInfo structInfo, List <string> GenerateCode)
        {
            GenerateCode.Add(string.Format("{0}public static bool Decode(byte[] packetData, ref {1} packet)", indent, structInfo.Name));
            GenerateCode.Add(indent + "{");

            string indent2 = indent + "\t";

            GenerateCode.Add(string.Format("{0}int readPos = 0;", indent2));
            GenerateCode.Add("");

            디코드_멤버데이터_구조체(indent2, 구조체정의_사전, structInfo, "PacketData", GenerateCode);

            GenerateCode.Add(indent2 + "treturn true;");
            GenerateCode.Add(indent + "}");
            GenerateCode.Add("");
        }
        void 엔코드_함수_만들기(Dictionary <string, StructInfo> 구조체정의_사전, StructInfo structInfo, List <string> GenerateCode)
        {
            GenerateCode.Add(string.Format("\t\tbool Encode({0}& PacketData, short RegionID, short PacketID, char* OutPutBuffer, int OutPutBufferSize)", structInfo.Name));
            GenerateCode.Add("\t\t{");
            GenerateCode.Add("\t\t\tshort UseSize = 0;");
            GenerateCode.Add("\t\t\tshort WritePos = PACKET_HEADER_SIZE; // 헤더 부분 이후부터 인코딩 시작");
            GenerateCode.Add("\t\t\tchar* pBuffer = Encode_Init(OutPutBuffer, OutPutBufferSize);");
            GenerateCode.Add("\t\t\tmemset(pBuffer, 0, MaxBufferSize);");
            GenerateCode.Add("");

            엔코드_멤버데이터_구조체("\t\t\t", 구조체정의_사전, structInfo, "PacketData", GenerateCode);

            GenerateCode.Add("\t\t\tshort BodySize = WritePos - PACKET_HEADER_SIZE;");
            GenerateCode.Add("\t\t\tEncoder::WriteNumber<short>(RegionID, pBuffer, 0);");
            GenerateCode.Add("\t\t\tEncoder::WriteNumber<short>(PacketID, pBuffer, 2);");
            GenerateCode.Add("\t\t\tEncoder::WriteNumber<short>(BodySize, pBuffer, 4);");
            GenerateCode.Add("\t\t\treturn true;");
            GenerateCode.Add("\t\t}");
            GenerateCode.Add("");
        }
コード例 #8
0
        short 구조체_데이터크기_구하기(Dictionary<string, StructInfo> structMap, StructInfo structInfo)
        {
            short totalSize = 0;

            foreach (var memberInfo in structInfo.MemberList)
            {
                if (IsBasicType(memberInfo.Type))
                {
                    if (memberInfo.ArrayValue > 0)
                    {
                        totalSize += (short)(4 * memberInfo.ArrayValue);
                    }
                    else
                    {
                        return 패킷_구조체_기본_버퍼크기;
                    }
                }
                else
                {
                    if (structMap.ContainsKey(memberInfo.Type))
                    {
                        totalSize += 구조체_데이터크기_구하기(structMap, structMap[memberInfo.Type]);
                    }
                    else
                    {
                        throw new System.Exception("구조체를 찾을 수 없습니다.");
                    }
                }
            }

            return totalSize;
        }
コード例 #9
0
ファイル: GenerateCSharpEnDecoder.cs プロジェクト: CCJY/CGSF
        void 엔코드_함수_만들기(string indent, Dictionary<string, StructInfo> 구조체정의_사전, StructInfo structInfo, List<string> GenerateCode)
        {
            GenerateCode.Add(string.Format("{0}public static void Encode(List<byte> packetData, {1} packet)", indent, structInfo.Name));
            GenerateCode.Add(indent + "{");

            var indent2 = indent + "\t";
            엔코드_멤버데이터_구조체(indent2, 구조체정의_사전, structInfo, "packet", GenerateCode);

            GenerateCode.Add(indent + "}");
            GenerateCode.Add("");
        }
コード例 #10
0
ファイル: GenerateCSharpEnDecoder.cs プロジェクト: CCJY/CGSF
        void 엔코드_멤버데이터_구조체(string indent, Dictionary<string, StructInfo> 구조체정의_사전, 
            StructInfo structInfo, string packetDataName,
            List<string> GenerateCode)
        {
            int fieldIndex = -1;
            MemberDataInfo prevMemberInfo = null;
            foreach (var memberInfo in structInfo.MemberList)
            {
                ++fieldIndex;
                if (fieldIndex > 0)
                {
                    prevMemberInfo = structInfo.MemberList[fieldIndex - 1];
                }

                if (CheckDataType.IsCppNumberType(memberInfo.Type) || CheckDataType.IsCSharpNumberType(memberInfo.Type))
                {
                    if (memberInfo.ArrayValue > 1)
                    {
                        엔코드_멤버데이터_정수배열(indent, prevMemberInfo, memberInfo, packetDataName, GenerateCode);
                    }
                    else
                    {
                        엔코드_멤버데이터_정수(indent, memberInfo, packetDataName, GenerateCode);
                    }
                }
                else if (CheckDataType.IsCppUnicodeCharacterType(memberInfo.Type) ||
                        CheckDataType.IsCSharpCharacterType(memberInfo.Type) )
                {
                    엔코드_멤버데이터_문자열(indent, memberInfo, packetDataName, GenerateCode);
                }
                else // 구조체
                {
                    var structInfo2 = 구조체정의_사전[memberInfo.Type];

                    if (memberInfo.ArrayValue <= 1)
                    {
                        var rePacketDataName = string.Format("{0}.{1}", packetDataName, memberInfo.Name);
                        엔코드_멤버데이터_구조체(indent, 구조체정의_사전, structInfo2, rePacketDataName, GenerateCode);
                    }
                    else
                    {
                        var rePacketDataName = string.Format("{0}.{1}[i]", packetDataName, memberInfo.Name);
                        var arrayValuePrevMemberName = prevMemberInfo.Name;

                        GenerateCode.Add(string.Format("{0}for(int i = 0; i < {1}; ++i)", indent, arrayValuePrevMemberName));

                        GenerateCode.Add(indent + "{");
                        엔코드_멤버데이터_구조체("\t" + indent, 구조체정의_사전, structInfo2, rePacketDataName, GenerateCode);
                        GenerateCode.Add(indent + "}");
                        GenerateCode.Add("");
                    }
                }
            }
        }
コード例 #11
0
ファイル: GenerateCSharpEnDecoder.cs プロジェクト: CCJY/CGSF
        void 디코드_함수_만들기(string indent, Dictionary<string, StructInfo> 구조체정의_사전, StructInfo structInfo, List<string> GenerateCode)
        {
            GenerateCode.Add(string.Format("{0}public static bool Decode(byte[] packetData, ref {1} packet)", indent, structInfo.Name));
            GenerateCode.Add(indent + "{");

            string indent2 = indent + "\t";
            GenerateCode.Add(string.Format("{0}int readPos = 0;", indent2));
            GenerateCode.Add("");

            디코드_멤버데이터_구조체(indent2, 구조체정의_사전, structInfo, "PacketData", GenerateCode);

            GenerateCode.Add(indent2 + "treturn true;");
            GenerateCode.Add(indent + "}");
            GenerateCode.Add("");
        }
コード例 #12
0
ファイル: GenerateCppEnDecoder.cs プロジェクト: CCJY/CGSF
        void 엔코드_함수_만들기(Dictionary<string, StructInfo> 구조체정의_사전, StructInfo structInfo, List<string> GenerateCode)
        {
            GenerateCode.Add(string.Format("\t\tbool Encode({0}& PacketData, short RegionID, short PacketID, char* OutPutBuffer, int OutPutBufferSize)", structInfo.Name));
            GenerateCode.Add("\t\t{");
            GenerateCode.Add("\t\t\tshort UseSize = 0;");
            GenerateCode.Add("\t\t\tshort WritePos = PACKET_HEADER_SIZE; // 헤더 부분 이후부터 인코딩 시작");
            GenerateCode.Add("\t\t\tchar* pBuffer = Encode_Init(OutPutBuffer, OutPutBufferSize);");
            GenerateCode.Add("\t\t\tmemset(pBuffer, 0, MaxBufferSize);");
            GenerateCode.Add("");

            엔코드_멤버데이터_구조체("\t\t\t", 구조체정의_사전, structInfo, "PacketData", GenerateCode);

            GenerateCode.Add("\t\t\tshort BodySize = WritePos - PACKET_HEADER_SIZE;");
            GenerateCode.Add("\t\t\tEncoder::WriteNumber<short>(RegionID, pBuffer, 0);");
            GenerateCode.Add("\t\t\tEncoder::WriteNumber<short>(PacketID, pBuffer, 2);");
            GenerateCode.Add("\t\t\tEncoder::WriteNumber<short>(BodySize, pBuffer, 4);");
            GenerateCode.Add("\t\t\treturn true;");
            GenerateCode.Add("\t\t}");
            GenerateCode.Add("");
        }
コード例 #13
0
ファイル: GenerateCppEnDecoder.cs プロジェクト: CCJY/CGSF
        void 디코드_함수_만들기(Dictionary<string, StructInfo> 구조체정의_사전, StructInfo structInfo, List<string> GenerateCode)
        {
            GenerateCode.Add(string.Format("\t\tbool Decode(char* pBuffer, {0}& PacketData)", structInfo.Name));
            GenerateCode.Add("\t\t{");
            GenerateCode.Add("\t\t\tshort ReadSize = 0;");
            GenerateCode.Add("\t\t\tshort ReadPos = PACKET_HEADER_SIZE; // 헤더 부분 이후부터 인코딩 시작");
            GenerateCode.Add("");

            디코드_멤버데이터_구조체("\t\t\t", 구조체정의_사전, structInfo, "PacketData", GenerateCode);

            GenerateCode.Add("\t\t\treturn true;");
            GenerateCode.Add("\t\t}");
            GenerateCode.Add("");
        }
コード例 #14
0
        short 클래스_데이터_크기_구하기(Dictionary<string, StructInfo> structMap, StructInfo structInfo)
        {
            short totalSize = 0;

            foreach (var memberInfo in structInfo.MemberList)
            {
                var typeSize = CheckDataType.CSharpTypeSize(memberInfo.Type);
                if (typeSize > 0)
                {
                    if (memberInfo.ArrayValue <= 1)
                    {
                        totalSize += typeSize;
                    }
                    else
                    {
                        return typeSize;
                    }
                }
                else
                {
                    if (structMap.ContainsKey(memberInfo.Type))
                    {
                        totalSize += 클래스_데이터_크기_구하기(structMap, structMap[memberInfo.Type]);
                    }
                    else
                    {
                        throw new System.Exception("클래스를 찾을 수 없습니다.");
                    }
                }
            }

            return totalSize;
        }