protected void OutputCPPOfProtocol(ProMeta pm)
        {
            cur_stream_.WriteString(String.Format("//-----------------------------{0}-------------------------------//", pm.Name), 0);

            cur_stream_.WriteString(String.Format("{0}::{0}():inherit( {1})", pm.Name, pm.ProID), 0);
            if (AppUtil.IsEmptyString(pm.ConstructBlockC))
            {
                cur_stream_.WriteString("{}", 0);
            }
            else
            {
                cur_stream_.WriteString("{", 0);
                cur_stream_.WriteString(pm.ConstructBlockC, 1);
                cur_stream_.WriteString("}", 0);
            }

            cur_stream_.WriteEmptyLine();

            cur_stream_.WriteString(String.Format("{0}::~{0}()", pm.Name), 0);
            if (AppUtil.IsEmptyString(pm.DestructBlockC))
            {
                cur_stream_.WriteString("{}", 0);
            }
            else
            {
                cur_stream_.WriteString("{", 0);
                cur_stream_.WriteString(pm.DestructBlockC, 1);
                cur_stream_.WriteString("}", 0);
            }

            cur_stream_.WriteEmptyLine();
        }
 protected void OutputCloneLogic(ProMeta pm)
 {
     foreach (ProMetaMember p in pm.Members)
     {
         if (p.Type == ProMetaConst.DATATYPE_LOCALSTRUCT)
         {
             if (p.IsList)
             {
                 cur_stream_.WriteString(String.Format("CLONE_LIST_PRO( proo, {0} )", p.Name), 2);
             }
             else
             {
                 cur_stream_.WriteString(String.Format("CLONE_VAR_PRO( proo, {0} )", p.Name), 2);
             }
         }
         else if (p.Type == ProMetaConst.DATATYPE_GLOBALSTRUCT)
         {
             if (p.IsList)
             {
                 cur_stream_.WriteString(String.Format("CLONE_LIST_PRO( proo, {0} )", p.Name), 2);
             }
             else
             {
                 cur_stream_.WriteString(String.Format("CLONE_VAR_PRO( proo, {0} )", p.Name), 2);
             }
         }
         else if (p.Type == ProMetaConst.DATATYPE_SERIALIZEOBJ)
         {
             if (p.IsList)
             {
                 cur_stream_.WriteString(String.Format("CLONE_SERIALIZEOBJ_LIST_PRO( proo, {0} )", p.Name), 2);
             }
             else
             {
                 cur_stream_.WriteString(String.Format("CLONE_OBJECT_PRO( proo, {0} )", p.Name), 2);
             }
         }
         else
         {
             if (p.IsBaseArray)
             {
                 string ctype = DataType2CType(p);
                 cur_stream_.WriteString(String.Format("CLONE_ARRAY_PRO( proo, sizeof({0}), {1}, {2})", ctype, p.Name, p.ArrayRef), 2);
             }
             else
             {
                 cur_stream_.WriteString(String.Format("CLONE_VAR_PRO( proo, {0} )", p.Name), 2);
             }
         }
     }
 }
        protected void OutputSaveLogic(ProMeta pm)
        {
            foreach (ProMetaMember p in pm.Members)
            {
                if (p.Type == ProMetaConst.DATATYPE_LOCALSTRUCT)
                {
                    if (p.IsList)
                    {
                        cur_stream_.WriteString(String.Format("SAVE_LIST_PRO_BEGIN( pdata, buflen, len, {0}, {1} )", p.Name, p.RefLocalStruct.Name), 2);

                        foreach (StructMember sm in p.RefLocalStruct.Members)
                        {
                            OutputSaveLogicItem(true, sm, 3, null);
                        }

                        cur_stream_.WriteString(String.Format("SAVE_LIST_PRO_END()"), 2);
                    }
                    else
                    {
                        foreach (StructMember sm in p.RefLocalStruct.Members)
                        {
                            OutputSaveLogicItem(false, sm, 2, p.Name);
                        }
                    }
                }
                else if (p.Type == ProMetaConst.DATATYPE_GLOBALSTRUCT)
                {
                    if (p.IsList)
                    {
                        cur_stream_.WriteString(String.Format("SAVE_LIST_PRO_BEGIN( pdata, buflen, len, {0}, {1} )", p.Name, p.RefGlobalStruct.Name), 2);

                        foreach (StructMember sm in p.RefGlobalStruct.Members)
                        {
                            OutputSaveLogicItem(true, sm, 3, null);
                        }

                        cur_stream_.WriteString(String.Format("SAVE_LIST_PRO_END()"), 2);
                    }
                    else
                    {
                        foreach (StructMember sm in p.RefGlobalStruct.Members)
                        {
                            OutputSaveLogicItem(false, sm, 2, p.Name);
                        }
                    }
                }
                else if (p.Type == ProMetaConst.DATATYPE_SERIALIZEOBJ)
                {
                    if (p.IsList)
                    {
                        cur_stream_.WriteString(String.Format("SAVE_SERIALIZEOBJ_LIST_BEGIN( pdata, buflen, len, {0} )", p.Name), 2);
                        cur_stream_.WriteString(String.Format("SAVE_OBJECT_PRO( pdata, buflen, len, _item)"), 3);
                        cur_stream_.WriteString(String.Format("SAVE_SERIALIZEOBJ_LIST_END()"), 2);
                    }
                    else
                    {
                        cur_stream_.WriteString(String.Format("SAVE_OBJECT_PRO( pdata, buflen, len, {0} )", p.Name), 2);
                    }
                }
                else
                {
                    OutputSaveLogicItem(false, p, 2, null);
                }
            }
        }
        protected void OutputHOfProtocol(ProMeta pm)
        {
            if (!AppUtil.IsEmptyString(pm.Desc))
            {
                cur_stream_.WriteClassDesc(pm.Name, pm.Desc);
            }

            // class header
            cur_stream_.WriteString(String.Format("class {0} : public AppProtocol<{0}>", pm.Name), 0);
            cur_stream_.WriteString("{", 0);
            cur_stream_.WriteString(String.Format("typedef AppProtocol<{0}> inherit;", pm.Name), 1);
            cur_stream_.WriteEmptyLine();
            cur_stream_.WriteString("public:", 0);
            cur_stream_.WriteString(String.Format("{0}();", pm.Name), 1);
            cur_stream_.WriteString(String.Format("~{0}();", pm.Name), 1);
            cur_stream_.WriteEmptyLine();

            // defined local struct
            if (pm.DefinedLocalStruct)
            {
                cur_stream_.WriteString("public:", 0);

                foreach (LocalStruct ls in pm.LocalStructs)
                {
                    OutputLocalStruct(ls);
                    cur_stream_.WriteEmptyLine();
                }
            }

            //-------------------------protected function-----------------------------
            cur_stream_.WriteString("protected:", 0);

            //BEGIN_LOAD_PRO
            cur_stream_.WriteString(String.Format("BEGIN_LOAD_PRO( pdata, totlen, ext)"), 1);
            OutputLoadLogic(pm);
            cur_stream_.WriteString(String.Format("END_LOAD_PRO()"), 1);

            cur_stream_.WriteEmptyLine();

            //BEGIN_SAVE_PRO
            cur_stream_.WriteString(String.Format("BEGIN_SAVE_PRO( pdata, buflen, len, ext)"), 1);
            OutputSaveLogic(pm);
            cur_stream_.WriteString(String.Format("END_SAVE_PRO()"), 1);

            cur_stream_.WriteEmptyLine();

            //BEGIN_CLONE_PRO
            cur_stream_.WriteString(String.Format("BEGIN_CLONE_PRO( {0}, proo)", pm.Name), 1);
            OutputCloneLogic(pm);
            cur_stream_.WriteString(String.Format("END_CLONE_PRO()"), 1);

            cur_stream_.WriteEmptyLine();

            //-------------------------defined members------------------------------------
            cur_stream_.WriteString("public:", 0);

            foreach (ProMetaMember p in pm.Members)
            {
                if (!AppUtil.IsEmptyString(p.Desc))
                {
                    cur_stream_.WriteComment(p.Desc, 1);
                }

                if (p.IsBaseArray)
                {
                    string sname = "";
                    if (p.MacroLen != null)
                    {
                        sname = String.Format("{0}[{1}]", p.Name, p.MacroLen.Name);
                    }
                    else
                    {
                        sname = String.Format("{0}[{1}]", p.Name, p.ILen);
                    }

                    cur_stream_.WriteString(String.Format("{0}    {1};", DataType2CType(p), sname), 1);
                }
                else
                {
                    cur_stream_.WriteString(String.Format("{0}    {1};", DataType2CType(p), p.Name), 1);
                }
            }

            cur_stream_.WriteEmptyLine();

            //---------------------------------custom function-----------------------------------------
            if (!AppUtil.IsEmptyString(pm.CustomFunctionC))
            {
                cur_stream_.WriteString("public:", 0);
                cur_stream_.WriteString(pm.CustomFunctionC, 1);

                cur_stream_.WriteEmptyLine();
            }

            //------------------------------------------------------------------------
            cur_stream_.WriteString("};", 0);
            cur_stream_.WriteEmptyLine();
        }