⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cplusbase.h

📁 一个很好的协议,数据包解码工具,可以分析7号(ISUP,MTP,...), TCP/UDP等各种协议,特别的是还能支持自定义的二进制数据报,可以通过插件无限扩充协议库.
💻 H
📖 第 1 页 / 共 2 页
字号:
    int   ObjectTypeId() { return 3; }
   
    void  setParam(DWORD param) { m_wParam=param; }
    DWORD getParam()  { return m_wParam; }
    
    int   GetVariableCount();
    
    void  Add(VariableDefinition* pObject,DWORD nParam=0);
    
    VariableDefinition* GetAt(int nIndex,DWORD* lpParam=NULL);
    VariableDefinition* GetVariableDefinition(char* name); 
    TObject*            Get_DefinitionObject(WORD nIdentifierId); 
    
    void  RemoveAll(bool bDeleteObject=true);
    
    bool  m_bLoopMark;

    virtual bool CompleteIt(OTSTR& strError);   // Check BitLen, and set BeginBit
    
    virtual bool GetIntegratedType(int* type=NULL) { return false; }
};

////////////////////////////////////////////////////
class CEnumItem: public CVarient, public TObject
{
public:
    CEnumItem() {}
   ~CEnumItem() {}

    int ObjectTypeId() { return 1; }
};

class EnumItemList: protected TObArray<CEnumItem>, public TObject
{
public:
    enum { COMMENT_OR=0, COMMENT_EQUAL=1 };

public:
    EnumItemList();
   ~EnumItemList();

    int    ObjectTypeId() { return 2; }
   
    void   setName(char* szName);
    OTSTR& getName();
    
    void   setDescription(char* szDescription);
    OTSTR& getDescription();
    
    /////////////////////////////////////////////////////
    int    GetSize();
    
    CEnumItem* AddItem(CEnumItem& EnumItem,bool bRepetitionCheck=true);
    int        FindItem(char* name);
    
    CEnumItem* GetAt(int nIndex);
    
    bool  Lookup_byName (char* name, long&  valReturn, char** szDescriptionReturn=NULL); 
    bool  Lookup_byValue(long value, OTSTR& strRetrun, char** szDescriptionReturn=NULL);
    
    void  RemoveAll();

    ////////////////////////////////////////////////////////////////
    bool  GetComments(long value,int nMode, OTSTR& strReturn,char* szDefault=NULL);
};

//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////
// RunTime Object
//

// DumpToList(nDisplayAttr)
enum 
{ 
    SH_INTEGRATE_STRUC=1, SH_SHOW_VALUE_ANYWAY=2,  SH_SHOW_COMMENT=4, 
    SH_SHOW_ELEMID    =8, SH_SHOW_LEADERMARK  =16, 
    SH_INDENT_ON      =32, // 缩进
};

#define COL_LOCATION     0
#define COL_BITMASK      1
#define COL_NAME         2
#define COL_DESCRIPTION  3
#define COL_COMMENT      4


class CStruct;
class RunEnv;
class NullSyntaxObject;

#ifdef _DLL_PROJECT
class CLASS_EXPORT CVariableItem: public TVarient
#else
class CVariableItem: public TVarient
#endif
{
    /////////////////////////////////////////
    // 注: TVarient中带的name,type,size无效, 由m_Attr替代
    
public:
    CVariableItem();     
    virtual ~CVariableItem();

    bool   Create(CStruct* pParentStruct,VariableDefinition* pVariableDefinition);  // 创建已定义的变量
    bool   Create(StructDefinition* pStructDefinition, char* varname, long size);   // 根据已定义的结构创建变量
    bool   Create(VariableItemAttr::type_ extype, char* varname, long size);        // 创建简单数据类型变量
    
    bool   init()    { return false; }  // this function not allowed

    //////////////////////////////////////////////////
    VariableItemAttr&   GetAttr() { return m_Attr; }
    VariableDefinition* GetDefinition() { return m_pVariableDefinition; }
    
    int    getType() { return m_Attr.getType(); }
    int    getSize() { return m_Attr.getSize(); }
    OTSTR& getName() { return m_Attr.getName(); }
    char*  getTypeName()    { return m_Attr.getTypeName(); }
    int    getBitLen()      { return m_Attr.getBitLen();   }
        
    void   setDescription(char* szDescription) { m_Attr.setDescription(szDescription); }
    OTSTR& getDescription() { return m_Attr.getDescription(); }

    OTSTR  GetVariableName();  // name[..]
    OTSTR  GetNameEx();        // structname.itemname
    
    ////////////////////////////////////////////////
//  void   setParam(DWORD param) { m_wParam=param; }
//  DWORD  getParam()  { return m_wParam; }

    long   GetId() { return m_Id; }
    
    ////////////////////////////////////////////////
    // 对T_PCHOICE和T_PSTRUCT适用

    bool   isStruct(bool bIncludeChoice=true);

    long   GetSubElemCount(int nStructIdx,bool bConsiderImplicitChoiceElem);
    
    CVariableItem* GetSubElemAt(int nStructIdx, int nSubItemIdx, bool bConsiderImplicitChoiceElem);   // 取第nStructIdx个结构元素的第nSubItemIdx个变量
    CVariableItem* FindFirstSubElembyId(int nStructIdx, long ElemId, bool bConsiderImplicitChoiceElem);   // 例: Structname DataA; 取结构DataA下的一个变量
    CVariableItem* FindFirstSubElem    (int nStructIdx, char* name,  bool bCaseSensitive,bool bConsiderImplicitChoiceElem); 
    CVariableItem* RemoveSubElemAt(int nStructIdx, int nSubItemIdx);

    ////////////////////////////////////////////////
    // T_PCHOICE是含有动态个数变量的特殊结构
    
    bool   isChoice();
    bool   isImplicitChoice();

    bool   AddChoiceElem(CVariableItem* pVariableItem, int ElemId, char* lpLeadChForDump=NULL); // 例: Choice DataA; 在空结构DataA下加一个变量(类型可为结构)
    long   GetChoiceElemCount(bool bConsiderImplicitChoiceElem);

    CVariableItem* GetChoiceElemAt(int nSubItemIdx,     bool bConsiderImplicitChoiceElem);       // Choice Index永远=0, size=1
    CVariableItem* FindFirstChoiceElembyId(long ElemId, bool bConsiderImplicitChoiceElem);       // 例: Choice DataA; 取结构DataA下的一个变量
    CVariableItem* FindFirstChoiceElem    (char* name,  bool bCaseSensitive, bool bConsiderImplicitChoiceElem); 
    
    ////////////////////////////////////////////////
    virtual bool Clone(CVariableItem& VariableItem, bool bCloneNameAlso);   // bCloneNameAlso=false, 表示保留原名
    virtual bool PassAddressClone(CVariableItem& SrcVariableItem,long nIndex,VariableDefinition* pVariableDefinition);  // 如果有相关的Definition,则需要检查类型匹配
    
    ////////////////////////////////////////////////
    // " (nIndex>= 0)||(size==1) szdata为单一元素= ..  
    //   (nIndex==-1)&&(size> 1)       为结构    ={ .. , .. [,] }"
    bool   sets(long nIndex,  char* szdata, RunEnv* pCurRunEnv=NULL);   // pCurRunEnv 为其间表达式运算的环境
    bool   sets(char* szdata, RunEnv* pCurRunEnv=NULL);                 // nIndex=0, 方便对size=1的元素的访问
    
    bool   setAt_WithBitsData(long nIndex, CVarient& VarientVal);
    bool   setAt_WithBitsData(long nIndex, unsigned  data);

    ////////////////////////////////////////////////
    // lastIdx=-1 mean noIdx or All array[], when lastIdx==NULL, 最后一个不能有[]

    // FOR CHOICE WITH NAME=NULL
    CVariableItem* GetItem(long nIdx,char* NextString, long* retlastIdx, RunEnv* pCurRunEnv=NULL);  
    CVariableItem* GetItem(char* NextString, long* retlastIdx, RunEnv* pCurRunEnv=NULL); 
    
    ////////////////////////////////////////////////
    bool   Dump(char* filename,bool bOverWrite);

    bool   DumpToList(VirtualList& List,TObject* pTranslater,WORD nDisplayAttr); // pTranslater used by GetValueComment()
    
protected:
    CStruct*            m_pParentStruct;
    VariableDefinition* m_pVariableDefinition;      // 描述变量定义, Defined VariableDefinition 
    StructDefinition*   m_pStructDefinition;        // 描述结构定义, 如果变量是结构类型则该项有效
    VariableItemAttr    m_Attr;
    long                m_Id;                       // 标识号, 可用于Choice下成员的ElemId
    DWORD               m_wParam;
    
    virtual CStruct* NewStruct();

    bool     SetStructItem(int nIndex,CStruct* pStruct);
    CStruct* GetStructItem(int nIndex);             // 注: VariableItem为T_PSTRUCT,T_PCHOICE类型, 指向CStruct
    
    bool Clone(CVariableItem& VariableItem,CStruct* pParentStruct, bool bCloneNameAlso);
    void Destroy();

    ///////////////////////////////////////////////////
    void Dump(FILE* fp, OTSTR strHeaderFormat);     // "%?ds  %?ds  %s"  (type name = data)

    bool DumpToList(CVariableItem* pParentObject,long MaxElemIdLen,VirtualList& List,long ParentItemId,TObject* pTranslater,WORD nDisplayAttr,long nSpaceLen, bool bOneOfMultiStructMember, bool bisFirstItemInStruct); 
    bool DumpStructToList(CVariableItem& VariableItem, int nIndex, VirtualList& List,long ParentItemId,TObject* pTranslater,WORD nDisplayAttr,long nSpaceLen,int nStructIndex,bool bShowChoiceItemMark); 
    
    bool SetListItemData(VirtualList& List,bool& bFirstRow, long& nItem, long nCol, DWORD Itemparam, char* szText);
    long GetMaxSubElemIdLen(int nStructIdx,bool bConsiderImplicitChoiceElem);
    
    virtual void DumpLocationMask(OTSTR& str) { str=""; }
    virtual bool DumpErrorFlag() { return false; }
    virtual bool ValueValid() { return true; }
    virtual bool DumpBitsMask(OTSTR& str) { str=""; return true; }

    ////////////////////////////////////////////////
    class InterData
    {
    public:
        char m_NameLeadCh;
        bool m_bisImplicitChoice;

    public:
        InterData()  { Clear(); }
       ~InterData()  {}
       
        void Clear()
        {
            m_NameLeadCh=' ';
            m_bisImplicitChoice=false;
        }
        void operator=(const InterData& right)
        {
            m_NameLeadCh=right.m_NameLeadCh;
            m_bisImplicitChoice=right.m_bisImplicitChoice;
        }
    };
    InterData  m_InterData;
    InterData* m_pPassAddressInterData;

public:
    void SetNameLeadCh(char Ch);
    char GetNameLeadCh() { return m_InterData.m_NameLeadCh; }

    ////////////////////////////////////////////////////////////
    // 值的Comment: VarDefinition_Dump > TypeOF's struct's Dump
    virtual bool isValueCommentValid() { return false; }  
    virtual int  GetValueComment(TObject* pTranslater,CVariableItem* pParentObject,int nArrIndex,OTSTR& strComment,char* szDefault=SHOW_WHEN_COMMENT_NOT_FOUND) { strComment=""; return 0; } // false表示未取得匹配的Comment ( or或者equal不匹配 , strComment可返回不匹配描述)

    ////////////////////////////////////////////////////////////
    // TypeOfData: 用以取得综合值的结构体
    virtual bool isTypeOfDataValid(WORD nDisplayAttr) { return false; }
    virtual CVariableItem* GetTypeOfData(int nIndex,WORD nDisplayAttr) { return NULL; } 
    
private:
    friend class RunTimeStk;
    friend class CStruct;
};


///////////////////////////////////////////
class CStruct: public TName
{
public:
    CStruct();
    virtual ~CStruct();

    int  GetItemCount(bool bConsiderImplicitChoiceElem);
   
    CVariableItem* GetVariable  (char* name, bool bCaseSensitive, bool bConsiderImplicitChoiceElem); 
    CVariableItem* GetVariableAt(int nIndex, bool bConsiderImplicitChoiceElem); 
    CVariableItem* RemoveVariableAt(int nIndex);
    
    bool sets(char* szdata,RunEnv* pCurRunEnv=NULL);    // " { .. } "  pCurRunEnv 为其间表达式运算的环境, 便于从环境中取得相应的数值

    ///////////////////////////////////////////////////
    // lastIdx=-1 mean noIdx or All array[], when lastIdx==NULL, 最后一个不能有[]

    // FOR CHOICE WITH NAME=NULL
    CVariableItem* GetItem(char* varString, long* retlastIdx,RunEnv* pCurRunEnv=NULL);  
    
    ////////////////////////////////////////////////
//  void   setParam(DWORD param) { m_wParam=param; }
//  DWORD  getParam()  { return m_wParam; }
    
protected:
    StructDefinition*       m_pStructDefinition;        // Defined StructDefinition
    TObArray<CVariableItem> m_VariableItemList;
    bool                    m_bHasImplicitChoiceElem;
    DWORD                   m_wParam;
    
    bool Create(StructDefinition* pStructDefinition,char* szName=NULL);
    bool Clone (CStruct& StructItem);

    void Destroy();
     
    bool AddVariable(CVariableItem* pVariableItem);     // can be used For Choice

    CVariableItem* GetVariablebyId(long Id, bool bConsiderImplicitChoiceElem);  // used by Choice Item
    
    ////////////////////////////////////////////////
    bool Dump(char* filename,bool bOverWrite);
    void Dump(FILE* fp, OTSTR strHeader);
    
    //////////////////////////////////////////////
    virtual CVariableItem*  NewVariableItem();
    
private:
    friend class RunTimeStk;
    friend class CVariableItem;

    static NullSyntaxObject NullObject;
};

/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
// RunTimeProc
enum
{
    CALLBACK_ASSIGNVALUE     =0,    // 单数据变量(非数组)赋值  A=value 
                                    // PARAM: IdentName
                                    //        Value(CVarient)
        
    CALLBACK_GET_IDENTVALUE  =1,    // 取单数据变量(非数组)的值 
                                    // Ident sample:  A
                                    //                A.B
                                    //                A.B[...].C[..].D ...
                                    //                A[Idx]
                                    //                Func()
                                    //                ConstA::B     -> 到相关的Program定义中取
                                    //                ConstA        -> 到相关的Program定义中取
                                    // PARAM: IdentName
                                    //        Return: Value(CVarient)
    CALLBACK_SETVALUE        =2,    // 单数据变量(可数组)赋值  A=szData 
                                    // PARAM: IdentName
                                    //        Value( (char*)szData)
        
};

/////////////////////////////////////////////////////
// SetExStyle(nExStyle)  // FOR CHOICE WHO NAME=NULL
enum 
{ 
    EN_IMPLICIT_CHOICE_ELEM = 1 , // 设置环境变量的该属性后, 当使用与该环境有关的GetItem等操作时, 自动(!!)使用隐式CHOICE的成员变量处理模式
};

#ifdef _DLL_PROJECT
class CLASS_EXPORT RunEnv // base
#else
class RunEnv // base
#endif
{
public:
    RunEnv() { m_nExStyle=0; }
    virtual ~RunEnv() {}

    void    setExStyle(WORD nExStyle)  { m_nExStyle=nExStyle; }
    
    virtual cCallback::tFunction GetRunTimeProc() { return NULL; }
    virtual CVariableItem* GetItem(char* varString,long* lastIdx=NULL) { return NULL; }

protected:
    WORD m_nExStyle;

    friend class CVariableItem;
    friend class CStruct;
};

////////////////////////////////////////////
static char* cDumpFormat[]=  
{
    0,          // NULL 表示采用Default的
    0,
    0,
    "0x%02X",
    "0x%04X",
    "0x%08X",
    0,
    0,
    0,
    0,
    0,
    0
};

static char* cDumpListFormat[]=  
{
    0,          // NULL 表示采用Default的
    0,
    0,
    "%02X",
    "%04X",
    "%08X",
    0,
    0,
    0,
    0,
    0,
    0
};


#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -