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); }
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); }
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(""); } } } }
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(""); }
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(""); }
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; }
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 엔코드_멤버데이터_구조체(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(""); } } } }
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(""); }
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(""); }
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; }