コード例 #1
0
ファイル: CSGenerator.cs プロジェクト: NoeCalmness/CoreFrame
    public string[] Generate(PacketDef pkt, ProtocolGenerator g)
    {
        var code = ParseComment(pkt.comment);
        var pn   = ParsePacketName(pkt.name);

        //code += string.Format("[PacketInfo(group = {0}, ID = {1}, early = {2})]\r\npublic class {3} : PacketObject<{3}>\r\n{{\r\n", pkt.group, pkt.id, pkt.earlySend ? "true" : "false", ParsePacketName(pkt.name));
        code += string.Format("[PacketInfo(group = {0}, ID = {1})]\r\npublic class {2} : PacketObject<{2}>\r\n{{\r\n", pkt.group, pkt.id, ParsePacketName(pkt.name));

        string rc = "", wc = "", dc0 = "", dc1 = "", cc0 = "", cc1 = "";

        var fs = pkt.fields;

        foreach (var f in fs)
        {
            code += string.IsNullOrEmpty(f.comment) ? "" : "    /// <summary>\r\n    /// " + f.comment + "\r\n    /// </summary>\r\n";
            code += string.Format("    public {0} {1};\r\n", f.custom ? ParsePacketName(f.type) : ParseType(f.type), f.name);

            rc += string.Format("        {0, -" + (pkt.fl[1] + 2) + "} = p.Read{1}();\r\n", f.name, ParseReadName(f));
            wc += "        p.Write(" + f.name + ");\r\n";
            if (f.custom || f.array)
            {
                dc0 += f.custom && f.array ? string.Format("        BackArray({0});\r\n", f.name) : "";
                dc1 += string.Format("        {0, -" + (pkt.fl[2] + 2) + "} = null;\r\n", f.name);
            }

            if (!f.custom)
            {
                cc0 += string.Format("        dst.{0, -" + (pkt.fl[1] + 2) + "} = {0};\r\n", f.name);
            }
            else
            {
                cc1 += string.Format("        if ({0, -" + (pkt.fl[2] + 1) + "} != null) {0}.CopyTo(ref dst.{0});\r\n", f.name);
            }
        }

        var dc = dc0 + (string.IsNullOrEmpty(dc0) || string.IsNullOrEmpty(dc1) ? "" : "\r\n") + dc1;
        var cc = cc0 + (string.IsNullOrEmpty(cc0) || string.IsNullOrEmpty(cc1) ? "" : "\r\n") + cc1;

        if (!string.IsNullOrEmpty(cc))
        {
            cc = "\r\n" + cc;
        }

        code += (fs.Length > 0 ? "\r\n" : "") + "    private " + pn + "() { }\r\n";
        code += string.IsNullOrEmpty(rc) ? "" : "\r\n    public override void ReadFromPacket(Packet p)\r\n    {\r\n" + rc + "    }\r\n";
        code += string.IsNullOrEmpty(wc) ? "" : "\r\n    public override void WriteToPacket(Packet p)\r\n    {\r\n" + wc + "    }\r\n";
        code += string.IsNullOrEmpty(cc) ? "" : "\r\n    public override void CopyTo(ref " + pn + " dst)\r\n    {\r\n        base.CopyTo(ref dst);\r\n" + cc + "    }\r\n";
        code += string.IsNullOrEmpty(dc) ? "" : "\r\n    public override void Clear()\r\n    {\r\n" + dc + "    }\r\n";
        code += "}\r\n";

        return(new string[] { code });
    }
コード例 #2
0
    private void _ParseFields(PacketDef pkt)
    {
        var r     = new Regex(@"((?:(?:[u]?int(?:8|16|32|64))|bool|single|double|string" + m_cts + @")(?:\[\])?)\s+(\w{1,30})\s*;(?:(?:\s*\/\*\s?((?!\r?\n).+?)\*\/)|(?:\s*\/\/\s?((?!\r?\n).+)))?");
        var match = r.Match(pkt.content);

        var fields = new List <FieldDef>();

        int tl = 0, nl = 0, dl = 0;

        while (match.Success)
        {
            var def    = match.Groups[1].Value;
            var t      = def.Replace("[]", "");
            var cpkt   = GetPacket(0, t);
            var custom = cpkt != null;

            var fn = match.Groups[2].Value;
            if (fields.FindIndex(f => f.name == fn) > -1)
            {
                Logger.LogError("Packet field name duplicated. Packet: [group: {0}, id: {1}, name:{2}, filed: {3}]", pkt.group, pkt.id, pkt.name, fn);
                match = match.NextMatch();
                continue;
            }

            var comment = !string.IsNullOrEmpty(match.Groups[3].Value) ? match.Groups[3].Value : !string.IsNullOrEmpty(match.Groups[4].Value) ? match.Groups[4].Value : "";
            comment = Regex.Replace(comment, @"[\r\n]*", "").TrimStart(' ');

            var field = new FieldDef(def, fn, comment, custom, cpkt != null ? cpkt.group : 0, cpkt != null ? cpkt.groupName : "");
            fields.Add(field);

            if (def.Length > tl)
            {
                tl = def.Length;
            }
            if (fn.Length > nl)
            {
                nl = fn.Length;
            }
            if (fn.Length > dl && (field.custom || field.array))
            {
                dl = fn.Length;
            }

            match = match.NextMatch();
        }

        pkt.fl     = new int[] { tl, nl, dl };
        pkt.fields = fields.ToArray();
    }
コード例 #3
0
    public string[] Generate(PacketDef pkt, ProtocolGenerator g)
    {
        var code = ParseComment(pkt.comment);

        code += string.Format("message {0}[id={1}{2}]\r\n{{\r\n", pkt.name, pkt.id, string.IsNullOrEmpty(pkt.router) ? "" : ", route=" + pkt.router);

        var fs = pkt.fields;

        for (var i = 0; i < fs.Length; ++i)
        {
            var f = fs[i];
            code += string.Format("    {0}    {1,-" + (pkt.fl[0] + 2) + "} {2,-" + (pkt.fl[1] + 2) + "} = " + (string.IsNullOrEmpty(f.comment) ? "{3}" : "{3, -8}// ") + "{4}\r\n", f.array ? "repeated" : "required", f.custom? f.typeName: ParseType(f.type), f.name, (i + 1) + ";", f.comment);
        }

        code += "}\r\n";

        return(new string[] { code });
    }
コード例 #4
0
    private void ParsePackets()
    {
        m_pkts.Clear();

        var r     = new Regex(@"((?:\/\*(?:(?!\*\/)(?:\s|.))+\*\/(?:\r?\n)+)|(?:\s*\/{2,}.*(?:\r?\n)+)*)?protocol\s+(\w{1,50})\[(\d+)(?:,\s*(\w+))?(?:,\s*(\w+))?\](?:\r?\n?\{)([^\}]*)\}");
        var match = r.Match(m_data);

        if (!match.Success)
        {
            Logger.LogWarning("Could not find any packet definition!");
            return;
        }

        m_cts = "";
        while (match.Success)
        {
            var id = Util.Parse <int>(match.Groups[3].Value);
            var p0 = match.Groups[4].Value;
            var p1 = match.Groups[5].Value;

            string       route     = "";
            var          earlySend = false;
            const string mark      = "early";
            if (!string.IsNullOrEmpty(p0) && !string.IsNullOrEmpty(p1))
            {
                route     = p0 == mark ? p1 : p0;
                earlySend = p0 == mark || p1 == mark;
            }
            else if (!string.IsNullOrEmpty(p0))
            {
                if (p0 == mark)
                {
                    earlySend = true;
                }
                else
                {
                    route = p0;
                }
            }
            else if (!string.IsNullOrEmpty(p1))
            {
                if (p1 == mark)
                {
                    earlySend = true;
                }
                else
                {
                    route = p1;
                }
            }

            if (string.IsNullOrWhiteSpace(route))
            {
                route = "";
            }

            var pname = match.Groups[2].Value;
            if (id < 1 || id > ushort.MaxValue)
            {
                Logger.LogError("Packt id invalid, packet id must int [1, 65535]. Packet: [group: {0}, id: {1}, name:{2]", group, id, pname);
                match = match.NextMatch();
                continue;
            }

            var op = GetPacket(id, pname);
            if (op != null)
            {
                Logger.LogError("Packt name or id duplicated. Old packet: [file: {0}, group: {1}, id: {2}, name:{3}], New packet: [file: {4}, group: {5}, id: {6}, name:{7}]", op.file, op.group, op.id, op.name, file, group, id, pname);
                match = match.NextMatch();
                continue;
            }

            var comment = Regex.Replace(Regex.Replace(match.Groups[1].Value, @"(\r?\n)+", "\n"), @"^[\n\s]*(?:\/\*)?((?:.|\s)*?)(?:[\s\n]*\*\/)?[\n\s]*$", "$1", RegexOptions.Multiline);
            var pkt     = new PacketDef(file, pname, group, Util.FirstUpper(name), id, route, earlySend, comment, match.Groups[6].Value, null);
            m_cts += "|" + pkt.name;

            m_pkts.Add(pkt);
            match = match.NextMatch();
        }

        ParseFields();
    }
コード例 #5
0
ファイル: CPPGenerator.cs プロジェクト: NoeCalmness/CoreFrame
    public string[] Generate(PacketDef pkt, ProtocolGenerator g)
    {
        var code = ParseComment(pkt.comment).Replace("{", "{{").Replace("}", "}}");;
        var pn   = ParsePacketName(pkt.name);
        var sp   = pn.StartsWith("Sc");
        var cpp  = sp ? "" : string.Format("void WorldSession::Handle{0}({1} &packet)\r\n{{{{\r\n}}}}\r\n", pn.Replace("Cs", ""), pn);
        var refs = "";

        code += string.Format("    class {0} final : public {1}\r\n    {{{{\r\n", pn, sp ? "ServerPacket" : "ClientPacket");

        string rc = "", wc = "", dc = "";

        var fs     = pkt.fields;
        var nl     = pkt.fl[0];
        var i      = 0;
        var ct     = -1;
        var custom = false;

        foreach (var f in fs)
        {
            var fieldType = f.custom ? f.array ? "std::vector<" + ParsePacketName(f.typeName, pkt.groupName, f.groupName) + "*>" : ParsePacketName(f.typeName, pkt.groupName, f.groupName) + "*" : ParseType(f.type);
            if (fieldType.Length > nl)
            {
                nl = fieldType.Length;
            }

            if (f.custom && f.groupName != pkt.groupName)
            {
                var mk = f.groupName + ":" + ParsePacketName(f.typeName);
                if (!refs.Contains(mk))
                {
                    refs += mk + "\r\n";
                }
            }

            if (!custom && f.custom)
            {
                custom = true;
            }
        }

        foreach (var f in fs)
        {
            if (i == 0)
            {
                code += "        public:\r\n";
            }

            var fieldType = f.custom ? f.array ? "std::vector<" + ParsePacketName(f.typeName, pkt.groupName, f.groupName) + "*>" : ParsePacketName(f.typeName, pkt.groupName, f.groupName) + "*" : ParseType(f.type);
            code += string.Format("            {0,-" + (nl + 4) + "} {1, -" + (pkt.fl[1] + 4) + "}{2}\r\n", fieldType, f.name + ";", string.IsNullOrEmpty(f.comment) ? "" : "// " + f.comment);

            var t = f.custom ? 1 : 0;
            if (t == 1 && ct == 0 || ct < 0)
            {
                rc += string.Format("{0}{1} ", i == 0 ? "                " : ";\r\n                ", "w");
                wc += string.Format("{0}{1} ", i == 0 ? "                " : ";\r\n                ", "w");
            }
            ct = t;

            rc += string.Format(">> {0}{1}{2}", f.custom && !f.array ? "&" : "", f.name, i == fs.Length - 1 ? ";\r\n" : " ");
            wc += string.Format("<< {0}{1}", f.name, i == fs.Length - 1 ? ";\r\n" : " ");
            if (f.custom || f.array)
            {
                dc += string.Format("    {0}({1});\r\n", f.custom ? f.array ? "VECTOR_DELETE" : "SAFE_DELETE" : "VECTOR_CLEAR", f.name);
            }

            ++i;
        }

        code += string.Format("{0}        public:\r\n            {1}() : {2}({3}) {{{{ }}}}\r\n", fs.Length > 0 ? "\r\n" : "", pn, sp ? "ServerPacket" : "ClientPacket", pkt.id);
        code += string.Format("            {0}{1}\r\n", string.IsNullOrEmpty(dc) ? "" : "~" + pn + "()", string.IsNullOrEmpty(dc) ? "" : custom ? ";\r\n" : "\r\n            {{\r\n" + dc.Replace("    ", "                ") + "            }}\r\n");
        code += "            void Read(WorldPacket &w) override" + (string.IsNullOrEmpty(rc) ? " {{ }}\r\n\r\n" : "\r\n            {{\r\n" + rc + "            }}\r\n\r\n");
        code += "            void Write(WorldPacket &w) const override" + (string.IsNullOrEmpty(wc) ? " {{ }}\r\n" : "\r\n            {{\r\n" + wc + "            }}\r\n");
        des  += !custom || string.IsNullOrEmpty(dc) ? "" : pn + "::~" + pn + "()\r\n{\r\n" + dc + "}\r\n\r\n";
        code += "    }};\r\n";

        return(new string[] { code, cpp, refs });
    }