/// <summary> /// 解包 /// </summary> public void sWriteCSFileContent_S(StringBuilder sb, CmdStructFileData fileData, List <string> declareStringList, List <string> unpackStringList, List <string> ctorStringList) { sb.AppendLine("public class " + fileData.mClassName + "_S : " + fileData.mFatherClassName); sb.AppendLine("{"); sb.AppendLine("\tpublic const byte " + fileData.mGsParam + " = " + fileData.mNum + ";"); sb.AppendLine(); //声明 for (int j = 0; j < declareStringList.Count; ++j) { sb.AppendLine("\t" + declareStringList[j]); } sb.AppendLine(); //初始化 sb.AppendLine("\tpublic " + fileData.mClassName + "_S()"); sb.AppendLine("\t{"); sb.AppendLine("\t\tgsParam = " + fileData.mGsParam + ";"); for (int n = 0; n < ctorStringList.Count; ++n) { sb.AppendLine("\t\t" + ctorStringList[n]); } sb.AppendLine("\t}"); sb.AppendLine(""); sb.AppendLine("\tpublic override void UnPack(byte[] msg)"); sb.AppendLine("\t{"); sb.AppendLine("\t\tbase.UnPack(msg);"); for (int m = 0; m < unpackStringList.Count; ++m) { sb.AppendLine("\t\t" + unpackStringList[m]); } sb.AppendLine("\t\tReleaseByteBuffer();"); sb.AppendLine("\t}"); sb.AppendLine("}"); sb.AppendLine(); }
/// <summary> /// 发包 /// </summary> void sWriteCSFileContent_C(StringBuilder sb, CmdStructFileData fileData, List <string> declareStringList, List <string> packStringList) { sb.AppendLine("public class " + fileData.mClassName + "_C : " + fileData.mFatherClassName); sb.AppendLine("{"); sb.AppendLine("\tpublic const byte " + fileData.mGsParam + " = " + fileData.mNum + ";"); sb.AppendLine(); //声明 for (int j = 0; j < declareStringList.Count; ++j) { sb.AppendLine("\t" + declareStringList[j]); } sb.AppendLine(); //初始化 sb.AppendLine("\tpublic " + fileData.mClassName + "_C()"); sb.AppendLine("\t{"); sb.AppendLine("\t\tgsParam = " + fileData.mGsParam + ";"); sb.AppendLine("\t}"); sb.AppendLine(""); //PackData 打包 sb.AppendLine("\tpublic override void Pack()"); sb.AppendLine("\t{"); sb.AppendLine("\t\tbase.Pack();"); for (int k = 0; k < packStringList.Count; ++k) { sb.AppendLine("\t\t" + packStringList[k]); } sb.AppendLine("\t}"); sb.AppendLine(); sb.AppendLine("}"); sb.AppendLine(); }
/// <summary> /// Handler /// </summary> public void sWriteCSFileContent_Handler(StringBuilder sb, CmdStructFileData fileData) { sb.AppendLine("public class " + fileData.mClassName + "_Handler"); sb.AppendLine("{"); sb.AppendLine("\tstatic public void " + cmdHandlerFuncName + "(byte[] msg)"); sb.AppendLine("\t{"); sb.AppendLine("\t\t" + fileData.mClassName + "_S cmd = new " + fileData.mClassName + "_S();"); sb.AppendLine("\t\tcmd.UnPack(msg);"); sb.AppendLine(); sb.AppendLine("\t}"); sb.AppendLine("}"); }
/// <summary> /// Handler /// </summary> public void sWriteLuaFileContent_Handler(StringBuilder sb, CmdStructFileData fileData) { string _tempS = fileData.mClassName + "_S"; sb.AppendLine("local " + _tempS + " = require('NetCmd." + cmdOutFilePathName_S + "." + _tempS + "')"); sb.AppendLine(); string className = fileData.mClassName + "_Handler"; sb.AppendLine(className + " = class(\"" + className + "\");"); sb.AppendLine(); sb.AppendLine("function " + className + "." + cmdHandlerFuncName + "(msg)"); sb.AppendLine("\tlocal cmd = " + fileData.mClassName + "_S" + ".new()"); sb.AppendLine("\tcmd:UnPack(msg)"); sb.AppendLine("end"); sb.AppendLine(); sb.AppendLine("return " + className); }
/// <summary> /// 解包 /// </summary> public void sWriteLuaFileContent_S(StringBuilder sb, CmdStructFileData fileData, List <string> declareStringList, List <string> unpackStringList, List <string> ctorStringList) { sb.AppendLine("local " + fileData.mFatherClassName + " = require('NetCmd." + LuaScriptParserTool.CmdBaseDirectory + "." + fileData.mFatherClassName + "')"); sb.AppendLine(); string mClassName = fileData.mClassName + "_S"; sb.AppendLine(mClassName + " = class(\"" + mClassName + "\"," + fileData.mFatherClassName + ");"); sb.AppendLine(); string target = "{0}.{1} = {2};"; sb.AppendFormat(target, mClassName, fileData.mGsParam, fileData.mNum);; sb.Append("\n"); for (int j = 0; j < declareStringList.Count; ++j) { sb.AppendLine(declareStringList[j].Replace("self", mClassName)); } sb.AppendLine(); sb.AppendLine("function " + mClassName + ":ctor()"); sb.AppendLine("\tself.super:ctor()"); sb.AppendLine("\tself.super.super.gsParam = " + mClassName + "." + fileData.mGsParam + ";"); for (int n = 0; n < ctorStringList.Count; ++n) { sb.AppendLine("\t" + ctorStringList[n]); } sb.AppendLine("end"); sb.AppendLine(); sb.AppendLine("function " + mClassName + ":UnPack(byteArray)"); sb.AppendLine("\tself.super:UnPack(byteArray);"); for (int m = 0; m < unpackStringList.Count; ++m) { sb.AppendLine("\t" + unpackStringList[m]); } sb.Append("\tself:ReleaseByteBuffer();\n"); sb.AppendLine("end"); sb.AppendLine(); sb.AppendLine("return " + mClassName); }
/// <summary> /// 发包 /// </summary> public void sWriteLuaFileContent_C(StringBuilder sb, CmdStructFileData fileData, List <string> declareStringList, List <string> packStringList) { sb.AppendLine("local " + fileData.mFatherClassName + " = require('NetCmd." + LuaScriptParserTool.CmdBaseDirectory + "." + fileData.mFatherClassName + "')"); sb.AppendLine(); string ClassName = fileData.mClassName + "_C"; sb.AppendLine(ClassName + " = class(\"" + ClassName + "\"," + fileData.mFatherClassName + ");"); sb.AppendLine(); string target = "{0}.{1} = {2};"; sb.AppendFormat(target, ClassName, fileData.mGsParam, fileData.mNum);; sb.Append("\n"); for (int j = 0; j < declareStringList.Count; ++j) { sb.AppendLine(declareStringList[j].Replace("self", ClassName)); } sb.AppendLine(); sb.AppendLine("function " + ClassName + ":ctor()"); sb.AppendLine("\tself.super:ctor()"); sb.AppendLine("\tself.super.super.gsParam = " + ClassName + "." + fileData.mGsParam + ";"); sb.AppendLine("end"); sb.AppendLine(); sb.AppendLine("function " + ClassName + ":Pack()"); sb.AppendLine("\tself.super:Pack();"); for (int k = 0; k < packStringList.Count; ++k) { sb.AppendLine("\t" + packStringList[k]); } sb.AppendLine("end"); sb.AppendLine(); sb.AppendLine("function " + ClassName + ":UnPack(byteArray)"); sb.AppendLine("\tself.super:UnPack(byteArray);"); sb.AppendLine("end"); sb.AppendLine(); sb.AppendLine("return " + ClassName); }
/// <summary> /// 接口实现 /// 解析消息XML /// </summary> public void ParserXml(string filePath, bool isOneFile = false) { XmlDocument doc = new XmlDocument(); doc.Load(filePath); CmdStructFileData targetFileData = new CmdStructFileData(); //文件名 XmlNode fileNameNode = doc.SelectSingleNode(NetCmdXmlParser.fileNameNodeStr); targetFileData.mClassName = fileNameNode.InnerText; //父类名 XmlNode fileFatherNameNode = doc.SelectSingleNode(cmdFatherDesNodeStr); targetFileData.mFatherClassName = fileFatherNameNode.InnerText; //文件名注释 XmlNode commentNode = doc.SelectSingleNode(cmdDesNodeStr); targetFileData.mDescribe = commentNode.InnerText; //协议消息名 XmlNode gscmd = doc.SelectSingleNode(cmdGsParamNodeStr); targetFileData.mGsParam = gscmd.InnerText; //自己消息ID XmlNode num = doc.SelectSingleNode(cmdNumNodeStr); targetFileData.mNum = num.InnerText; //父类消息ID XmlNode fathernum = doc.SelectSingleNode(cmdFatherNumNodeStr); if (fathernum == null) { Debug.LogError("父类消息值字段解析为空" + targetFileData.mClassName); } else { targetFileData.mFatherNum = fathernum.InnerText; } //路径文件夹名字 XmlNode pathname = doc.SelectSingleNode(cmdPathNameStr); if (pathname == null) { targetFileData.mPathName = ""; } else { targetFileData.mPathName = pathname.InnerText; } //是否需要解包 XmlNode isunpack = doc.SelectSingleNode(cmdIsUnPackNodeStr); targetFileData.mIsUnPack = isunpack.InnerText; //是否需要发包 XmlNode ispack = doc.SelectSingleNode(cmdIsPackNodeStr); targetFileData.mIsPack = ispack.InnerText; //是否需要Handler包 XmlNode ishandler = doc.SelectSingleNode(cmdIsHandlerNodeStr); if (ishandler == null) { targetFileData.mIsHandler = isunpack.InnerText; //不填默认看是否解包 } else { targetFileData.mIsHandler = ishandler.InnerText; } //是否需要lua XmlNode isneedlua = doc.SelectSingleNode(cmdIsNeedLuaNodeStr); targetFileData.mIsNeedLua = isneedlua.InnerText; //是否需要C XmlNode isneedc = doc.SelectSingleNode(cmdIsNeedCNodeStr); targetFileData.mIsNeedC = isneedc.InnerText; //常量 XmlNode cmdNode = doc.SelectSingleNode(cmdNodeStr); XmlNodeList cmdNodeList = cmdNode.ChildNodes; for (int i = 0; i < cmdNode.ChildNodes.Count; i++) { if (cmdNodeList[i].Name == cmdNodeNameStr) { XmlElement element = (XmlElement)cmdNodeList[i]; ParamData targetCmd = new ParamData(); targetCmd.mType = element.GetAttribute("type"); targetCmd.mName = element.GetAttribute("name"); targetCmd.mValue = element.GetAttribute("value"); targetCmd.mComment = element.GetAttribute("comment"); targetCmd.mStringLen = element.GetAttribute("strLen"); targetCmd.mArrayLen = element.GetAttribute("arrayLen"); targetCmd.mArrayDynLen = element.GetAttribute("arrayDymanicLen"); targetCmd.ParseParamType(); targetFileData.mCmdList.Add(targetCmd); } } bool isunpack_bool = false; bool ispack_bool = false; bool ishandler_bool = false; bool islua_bool = false; bool isc_bool = false; if (targetFileData.mIsUnPack == "true") { isunpack_bool = true; } if (targetFileData.mIsPack == "true") { ispack_bool = true; } if (targetFileData.mIsHandler == "true") { ishandler_bool = true; } if (targetFileData.mIsNeedC == "true") { isc_bool = true; } if (targetFileData.mIsNeedLua == "true") { islua_bool = true; } sWriteFile(isunpack_bool, ispack_bool, ishandler_bool, islua_bool, isc_bool, targetFileData); //存入数据,方便生成总的handle文件 if (ishandler_bool && !isOneFile) { if (isunpack_bool) { CmdHandlerFileTool.CmdSmallTypeData smallType = new CmdHandlerFileTool.CmdSmallTypeData(); smallType.mGsClassName = targetFileData.mClassName; smallType.mGsParamName = targetFileData.mGsParam; smallType.mIsCS = isc_bool; smallType.mIsLua = islua_bool; smallType.isNeedLua = islua_bool; CmdHandlerFileTool.CmdBigTypeData ownerBigType = CmdHandlerFileTool.GetBigType(targetFileData.mFatherClassName); ownerBigType.AddSubSmallType(smallType); } } }
public void sWriteLuaFileContent(string fileType, CmdStructFileData fileData) { StringBuilder sb = new StringBuilder(); NetCmdXmlParser.sWriteLuaFileHeadComment(sb, fileData.mClassName, fileData.mDescribe); //生成注释的文件头 //所需XML数据 List <string> declareStringList = new List <string>(); List <string> packStringList = new List <string>(); List <string> unpackStringList = new List <string>(); List <string> ctorStringList = new List <string>(); //初始化字符串 for (int i = 0; i < fileData.mCmdList.Count; ++i) { ParamDataOutString outString = CmdParserComUitls.CmdParamParserDeclare_Lua(fileData.mCmdList[i], fileData.mClassName, true); declareStringList.AddRange(outString.mOutDeclareString.ToArray()); packStringList.AddRange(outString.mOutPackString.ToArray()); unpackStringList.AddRange(outString.mOutUnpackString.ToArray()); ctorStringList.AddRange(outString.mOutCtorString.ToArray()); } //lua的文件直接生成到对应根目录下,防止lua打包时生成过多零碎文件 /* * string filePathName = ""; * if (fileData.mPathName != null) * { * filePathName = fileData.mPathName + "/"; * } */ string outFilePath = ""; //生成文件位置 bool _isWrite = false; switch (fileType) { case "Lua_C": outFilePath = NetCmdXmlParser.targetLuaFileBasePath + cmdOutFilePath_C + fileData.mClassName + "_C.lua"; sWriteLuaFileContent_C(sb, fileData, declareStringList, packStringList); _isWrite = true; break; case "Lua_S": outFilePath = NetCmdXmlParser.targetLuaFileBasePath + cmdOutFilePath_S + fileData.mClassName + "_S.lua"; LuaScriptParserTool.AddLuaRequireString(cmdOutFilePathName_S + "." + fileData.mClassName + "_S"); sWriteLuaFileContent_S(sb, fileData, declareStringList, unpackStringList, ctorStringList); _isWrite = true; break; case "Lua_Handler": outFilePath = NetCmdXmlParser.targetLuaFileBasePath + cmdOutFilePath_Handler + fileData.mClassName + "_Handler.lua"; LuaScriptParserTool.AddLuaRequireString(cmdOutFilePathName_Handler + "." + fileData.mClassName + "_Handler"); if (!File.Exists(outFilePath)) { sWriteLuaFileContent_Handler(sb, fileData); _isWrite = true; } else { return; } break; } if (_isWrite) { NetCmdXmlParser.sWriteStringToFile(outFilePath, sb); } }
void sWriteCSFileContent(string fileType, CmdStructFileData fileData) { StringBuilder sb = new StringBuilder(); NetCmdXmlParser.sWriteFileHeadComment(sb, fileData.mClassName, fileData.mDescribe); //生成注释的文件头 NetCmdXmlParser.sWriteFileHeadNameSpace(sb); //生成命名空间 //所需XML数据 List <string> declareStringList = new List <string>(); List <string> packStringList = new List <string>(); List <string> unpackStringList = new List <string>(); List <string> ctorStringList = new List <string>(); //初始化字符串 for (int i = 0; i < fileData.mCmdList.Count; ++i) { ParamDataOutString outString = CmdParserComUitls.CmdParamParserDeclare_CS(fileData.mCmdList[i], fileData.mClassName, true); declareStringList.AddRange(outString.mOutDeclareString.ToArray()); packStringList.AddRange(outString.mOutPackString.ToArray()); unpackStringList.AddRange(outString.mOutUnpackString.ToArray()); ctorStringList.AddRange(outString.mOutCtorString.ToArray()); } string filePathName = ""; if (fileData.mPathName != null) { filePathName = fileData.mPathName + "/"; } string outFilePath = ""; //生成文件位置 bool _isWrite = false; switch (fileType) { case "C#_C": outFilePath = NetCmdXmlParser.targetFileBasePath + cmdOutFilePath_C + filePathName + fileData.mClassName + "_C.cs"; sWriteCSFileContent_C(sb, fileData, declareStringList, packStringList); _isWrite = true; break; case "C#_S": outFilePath = NetCmdXmlParser.targetFileBasePath + cmdOutFilePath_S + filePathName + fileData.mClassName + "_S.cs"; sWriteCSFileContent_S(sb, fileData, declareStringList, unpackStringList, ctorStringList); _isWrite = true; break; case "C#_Handler": outFilePath = NetCmdXmlParser.targetFileBasePath + cmdOutFilePath_Handler + filePathName + fileData.mClassName + "_Handler.cs"; if (!File.Exists(outFilePath)) { sWriteCSFileContent_Handler(sb, fileData); _isWrite = true; } else { return; } break; } if (_isWrite) { NetCmdXmlParser.sWriteStringToFile(outFilePath, sb); } }
//----------------------内部调用------------------------- #region 内部调用 /// <summary> /// 生成消息脚本 /// </summary> void sWriteFile(bool isCreatUnPack, bool isCreatPack, bool isCreatHandler, bool isCreatLua, bool isCreatC, CmdStructFileData fileData) { if (isCreatPack) { if (isCreatC) { sWriteCSFileContent("C#_C", fileData); } if (isCreatLua) { sWriteLuaFileContent("Lua_C", fileData); } } if (isCreatUnPack) { if (isCreatC) { sWriteCSFileContent("C#_S", fileData); } if (isCreatLua) { sWriteLuaFileContent("Lua_S", fileData); } } if (isCreatHandler) { if (isCreatC) { sWriteCSFileContent("C#_Handler", fileData); } if (isCreatLua) { sWriteLuaFileContent("Lua_Handler", fileData); } } }