Ejemplo n.º 1
0
        public void generate(string protocolFolderPath, string templateXmlPath, string codeFolderPath)
        {

            var template = XElement.Load(templateXmlPath);
            codeTemplate = new CodeTemplate();
            codeTemplate.load(template);

            singleMode = codeTemplate.getConfig("singleMode") == "true";

            voFolder = codeTemplate.getConfig("voFolder");

            codeFolderPath += "/";
            this.codeFolderPath = codeFolderPath;

            if (Directory.Exists(codeFolderPath))
            {
                try
                {
                    Directory.Delete(codeFolderPath, true);
                }
                catch (Exception e)
                {
                    Console.WriteLine("删除目录失败,重试..");
                    Thread.Sleep(50);
                    Directory.Delete(codeFolderPath, true);
                }
            }
            Thread.Sleep(50);
            Directory.CreateDirectory(codeFolderPath);

            if (!singleMode)
            {
                if (String.IsNullOrEmpty(voFolder))
                    this.voFolderPath = this.codeFolderPath;
                else
                {
                    this.voFolderPath = codeFolderPath + voFolder + "/";
                    if (Directory.Exists(voFolderPath))
                        Directory.Delete(voFolderPath, true);

                    Directory.CreateDirectory(voFolderPath);
                }
            }


            var text = "";

            var list_ptlFile = Directory.GetFiles(protocolFolderPath, "*.ptl");
            foreach (var filePath in list_ptlFile)
            {
                text += File.ReadAllText(filePath, Encoding.UTF8);
                text += @"
";
            }
            text = clearComment(text);

            var match_structs = reg_struct.Matches(text);
            for (int m = 0; m < match_structs.Count; m++)
            {
                var match_struct = match_structs[m];
                var protoStruct = new ProtocolStruct()
                {
                    isMessage = false,
                    comment = cleanComment(match_struct.Groups[1].Value),
                    type = match_struct.Groups[2].Value,
                };
                protoStruct.memberList = parseMembers(match_struct.Groups[3].Value);

                if (dic_struct.ContainsKey(protoStruct.type))
                    throw new Exception("重复的struct定义:" + protoStruct.type);
                dic_struct.Add(protoStruct.type, protoStruct);

                // text += readParams(item);
            }

            match_structs = reg_message.Matches(text);
            for (int m = 0; m < match_structs.Count; m++)
            {
                var match_struct = match_structs[m];
                var protoStruct = new ProtocolStruct()
                {
                    isMessage = true,
                    comment = cleanComment(match_struct.Groups[1].Value),
                    type = match_struct.Groups[2].Value,
                };
                protoStruct.memberList = parseMembers(match_struct.Groups[4].Value);

                var idStr = match_struct.Groups[3].Value;
                try
                {
                    protoStruct.id = Convert.ToInt32(idStr);
                }
                catch
                {
                    throw new Exception(String.Format("转换消息id:{0} 失败", idStr));
                }

                if (dic_message.ContainsKey(protoStruct.id))
                    throw new Exception("重复的消息号定义:" + protoStruct.id);
                dic_message.Add(protoStruct.id, protoStruct);

                if (dic_struct.ContainsKey(protoStruct.type))
                    throw new Exception("重复的struct定义:" + protoStruct.type);
                dic_struct.Add(protoStruct.type, protoStruct);

                // text += readParams(item);
            }

            match_structs = reg_enum.Matches(text);
            for (int m = 0; m < match_structs.Count; m++)
            {
                var match_struct = match_structs[m];
                var protoStruct = new ProtocolEnum()
                {
                    comment = cleanComment(match_struct.Groups[1].Value),
                    type = match_struct.Groups[2].Value,
                };
                protoStruct.memberList = parseEnumMembers(match_struct.Groups[3].Value);

                if (dic_enum.ContainsKey(protoStruct.type))
                    throw new Exception("重复的enum定义:" + protoStruct.type);
                dic_enum.Add(protoStruct.type, protoStruct);

                // text += readParams(item);
            }

            var singleText = "";
            foreach (var item in dic_struct.Values)
            {
                singleText += generaterStruct(item);
            }

            foreach (var item in dic_enum.Values)
            {
                singleText += generaterEnum(item);
            }

            //Console.ReadLine();

            if (singleMode)
                FileUtil.writeFile(codeFolderPath + codeTemplate.element_SingleProtocolFile.Attribute("fileName").Value, Encoding.UTF8.GetBytes(codeTemplate.getSingleFileText(singleText)));


            var list_message = dic_message.Values.ToList();
            list_message = (from item in list_message orderby item.id select item).ToList();
            var str_enum = "";
            var str_registerMessage = "";
            var str_createMessage = "";
            var str_dispatchMessage = "";

            str_enum += codeTemplate.getEnumDefinition("None", "0", "");

            for (int i = 0; i < list_message.Count; i++)
            {
                var msg = list_message[i];
                str_enum += codeTemplate.getEnumDefinition(msg.type, msg.id.ToString(), msg.comment);

                str_registerMessage += codeTemplate.getMessageRegister(msg.type, msg.type);

                str_createMessage += codeTemplate.getMessageCreater(msg.type);
                str_dispatchMessage += codeTemplate.getMessageDispatcher(msg.type);
            }
            str_enum = codeTemplate.getProtocolEnumClass(codeTemplate.ProtocolEnumName, str_enum, "");
            str_registerMessage = codeTemplate.getMessageRegisterClass(str_registerMessage, str_createMessage, str_dispatchMessage);

            FileUtil.writeFile(codeFolderPath + codeTemplate.ProtocolEnumName + codeTemplate.ClassExtension, Encoding.UTF8.GetBytes(str_enum));
            FileUtil.writeFile(codeFolderPath + codeTemplate.element_MessageRegisterClass.Attribute("fileName").Value, Encoding.UTF8.GetBytes(str_registerMessage));


            var copyFiles = template.Element("CopyFiles");
            if (copyFiles != null)
            {
                var list_copy = copyFiles.Elements("CopyFile");
                foreach (var item in list_copy)
                {
                    var fileName = item.Attribute("fileName").Value.Trim();
                    var content = item.Value;
                    FileUtil.writeFile(codeFolderPath + fileName, Encoding.UTF8.GetBytes(content));
                }
            }

            var templateFileInfo = new FileInfo(templateXmlPath);
            var copyDirInfo = new DirectoryInfo(templateFileInfo.Directory + "/CopyFiles");
            if (copyDirInfo.Exists)
                FileUtil.copyFolder(copyDirInfo.FullName, codeFolderPath);


            Console.WriteLine("已生成代码至{0}", codeFolderPath);

        }
Ejemplo n.º 2
0
        public string generaterStruct(ProtocolStruct protoStruct)
        {
            if (dic_name.ContainsKey(protoStruct.type))
            {
                throw new Exception(String.Format("重复的类名:{0}", protoStruct.type));
            }

            dic_name.Add(protoStruct.type, true);

            string text = "";
            string singleVOText = "";

            var isMessage = protoStruct.isMessage;

            var pathName = protoStruct.type;

            string str_definition = "";
            string str_encode = "";
            string str_decode = "";

            var list_param = protoStruct.memberList;
            for (int i = 0; i < list_param.Count; i++)
            {
                var param = list_param[i];
                var memberName = param.name;
                var type = param.type;

                var menberType = ProtocolMemberType.Normal;
                if (dic_struct.ContainsKey(type))
                    menberType = ProtocolMemberType.Struct;
                if (dic_enum.ContainsKey(type))
                    menberType = ProtocolMemberType.Enum;

                var className = type;
                if (menberType == ProtocolMemberType.Normal)
                    className = codeTemplate.getClassName(type);

                if (param.isList == false)
                {
                    str_decode += codeTemplate.getDecode(menberType, type, memberName, className);
                    str_encode += codeTemplate.getEncode(menberType, type, memberName, className);
                    str_definition += codeTemplate.getDefinition(className, memberName, param.comment);
                }
                else
                {
                    str_decode += codeTemplate.getListDecode(menberType, type, memberName, className);
                    str_encode += codeTemplate.getListEncode(menberType, type, memberName, className);
                    str_definition += codeTemplate.getArrayDefinition(className, memberName, param.comment);
                }

            }

            var fileClassName = codeTemplate.getFinalClassName(pathName);

            var typeName = protoStruct.type;
            if (protoStruct.isMessage == false)
                typeName = "None";
            singleVOText = codeTemplate.getProtocolVOText(fileClassName, str_definition, typeName, str_decode, str_encode, protoStruct.comment);

            //if (isMessage)
            //    singleVOText = codeTemplate.getProtocolVOText(fileClassName, str_definition, protoStruct.type, str_decode, str_encode, protoStruct.comment);
            //else
            //    singleVOText = codeTemplate.getStructText(fileClassName, str_definition, str_decode, str_encode, protoStruct.comment);

            if (singleMode)
                text += singleVOText;
            else
                FileUtil.writeFile(voFolderPath + fileClassName + codeTemplate.ClassExtension, Encoding.UTF8.GetBytes(singleVOText));

            return text;
        }