📄 mibbrowserview.cpp
字号:
// MibBrowserView.cpp : implementation of the CMibBrowserView class
//
#include "stdafx.h"
#include "MibBrowser.h"
#include "Dlg_input.h"//输入OID对话框;
#include "SetDig.h"//SET操作对话框;
#include "MibBrowserDoc.h"
#include "MibBrowserView.h"
#include "MainFrm.h"
#include "Users.h" //////zzzz
#include "UserManDlg.h" //////zzzz
#include "ChangePwdDlg.h"
extern CUsers curUser; /////////////////////////zzzzzzzzzzzzzzzzz
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMibBrowserView
IMPLEMENT_DYNCREATE(CMibBrowserView, CFormView)
BEGIN_MESSAGE_MAP(CMibBrowserView, CFormView)
//{{AFX_MSG_MAP(CMibBrowserView)
ON_COMMAND(ID_GET, OnGet)
ON_COMMAND(ID_GETNEXT, OnGetnext)
ON_COMMAND(ID_GETSUBTREE, OnGetsubtree)
ON_COMMAND(ID_WALK, OnWalk)
ON_WM_DESTROY()
ON_NOTIFY(TVN_ITEMEXPANDED, IDC_TREE1, OnItemexpandedTree1)
ON_NOTIFY(TVN_SELCHANGED, IDC_TREE1, OnSelchangedTree1)
ON_COMMAND(ID_LOAD, OnLoad)
ON_COMMAND(ID_OID, OnOid)
ON_COMMAND(ID_SAVE, OnSave)
ON_COMMAND(ID_SET, OnSet)
ON_COMMAND(IDR_USERMAN, OnUserman)
ON_COMMAND(IDR_PWDMAN, OnPwdman)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CFormView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CFormView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CFormView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMibBrowserView construction/destruction
CMibBrowserView::CMibBrowserView()
: CFormView(CMibBrowserView::IDD)
{
//{{AFX_DATA_INIT(CMibBrowserView)
m_edit1 = _T("");
//}}AFX_DATA_INIT
// TODO: add construction code here
}
CMibBrowserView::~CMibBrowserView()
{
}
void CMibBrowserView::DoDataExchange(CDataExchange* pDX)
{
CFormView::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMibBrowserView)
DDX_Control(pDX, IDC_EDIT3, m_oid);
DDX_Control(pDX, IDC_EDIT2, m_community);
DDX_Control(pDX, IDC_IPADDRESS1, m_ipadd);
DDX_Control(pDX, IDC_TREE1, m_tree);
DDX_Control(pDX, IDC_LIST1, m_list);
DDX_Text(pDX, IDC_EDIT1, m_edit1);
//}}AFX_DATA_MAP
}
BOOL CMibBrowserView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CFormView::PreCreateWindow(cs);
}
//查找给定OID的叶子节点的函数,返回节点句柄;
HTREEITEM CMibBrowserView::SearchNode(const CString &OidStr)
{
MibNode *pData;
HTREEITEM hTv;
hTv=m_tree.GetRootItem();
//追踪节点OID,直到叶子节点;
while (hTv!=NULL)
{
pData=(MibNode*)m_tree.GetItemData(hTv);
if (pData!=NULL)
{
//如果OID串不以该节点的OID串开始,移到它的兄弟节点;
if (OidStr.Find((LPCTSTR)(pData->POid+'.'))!=0)
hTv=m_tree.GetNextItem(hTv,TVGN_NEXT);
else
{
//否则,如果不是叶子节点,移到它的第一个子节点;
if (m_tree.ItemHasChildren(hTv))
hTv=m_tree.GetNextItem(hTv,TVGN_CHILD);
//如果是叶子节点,返回节点句柄;
else
return hTv;
}
}//if (pData!=NULL)
}//while (hTv!=NULL)
if (hTv==NULL)
return NULL;
else
return hTv;
}
//处理数据类型为枚举型整数的函数,将其转化为字符串列表中的元素,
//以下面的形式保存:
//1
//up
//2
//down
//3
//testing
void CMibBrowserView::WorkOnInt(CString &str,CStringList* p)
{
//截取大括号中的字符串,不包括大括号;
int n1=str.Find('{');
int n2=str.Find('}')-n1-1;
str=str.Mid(n1+1,n2)+',';
//AfxMessageBox((LPCTSTR)str);
while (str.GetLength()>3)
{
CString str1=str.Left(str.Find(','));
str=str.Mid(str.Find(',')+1);
int n3=str1.Find('(');
int n4=str1.Find(')')-n3-1;
CString list=str1.Mid(n3+1,n4);
list.TrimLeft();
list.TrimRight();
p->AddTail(list);
list=str1.Left(n3);
list.TrimLeft();
list.TrimRight();
p->AddTail(list);
}
}
//使用递归算法,遍历整个以hparent为根节点的子树,销毁Data中的对象;
void CMibBrowserView::travl(HTREEITEM hparent)
{
MibNode* pnode;
//如果节点存在,首先判断data是否为NULL,如否,则进一步判断PInteger
//是否为NULL,如否,释放所指向的对象,然后释放data所指向的对象;
if (hparent!=NULL)
{
if ((pnode=(MibNode*)m_tree.GetItemData(hparent))!=NULL)
{
if((pnode->PInteger)!=NULL)
delete pnode->PInteger;
delete pnode;
}
}
hparent=m_tree.GetChildItem(hparent);
do
{
if (hparent!=NULL)
travl(hparent);
hparent=m_tree.GetNextSiblingItem(hparent);
} while(hparent!=NULL);
}
//根据给定的父,子节点名称在树中增加新节点的函数,并设置相应的图标;
void CMibBrowserView::AddObject(HTREEITEM ht,CString &Parent_name,
CString &Child_name,CString &num,MibNode *p)
{
CString OidStr;
Parent_name.TrimLeft();
Parent_name.TrimRight();
Child_name.TrimLeft();
Child_name.TrimRight();
//查找父节点位置;
HTREEITEM hParent=FindNode(ht,Parent_name);
if (hParent!=NULL)
{
//增加新节点;
HCurrent=m_tree.InsertItem(LPCTSTR(Child_name),3,3,hParent);
//获取父节点OID;
MibNode* P_node=(MibNode*)m_tree.GetItemData(hParent);
OidStr=P_node->POid;
//生成子节点OID;
OidStr=OidStr+'.'+num;
p->POid=OidStr;
//设置子节点data属性;
m_tree.SetItemData(HCurrent,(DWORD)p);
//根据不同节点设置不同发图标;
if (IndexString.Find((LPCTSTR)Child_name)>0)
m_tree.SetItemImage(HCurrent,4,4);
if (Child_name.Find("Entry")>1)
m_tree.SetItemImage(HCurrent,5,5);
if (Child_name.Find("Table")>1)
m_tree.SetItemImage(HCurrent,6,6);
}
}
//增加辅助节点。增加前,首先要查找树中父节点是否已经存在,如存在父节点,
//生成节点对应的结构数据,将新节点增加为父节点的子节点。否则,说明新节
//点为顶端节点,首先从TopOid中查找对应的OID,生成节点对应的结构数据,并
//增加父节点。然后根据父节点的OID和参数&num生成子节点的OID,生成节点对
//应的结构数据,并增加子节点;
void CMibBrowserView::AddPlaceHolder(HTREEITEM ht,CString &Parent_name,
CString &Child_name,CString &num)
{
CString OidStr;
Parent_name.TrimLeft();
Parent_name.TrimRight();
Child_name.TrimLeft();
Child_name.TrimRight();
//查找父节点;
HTREEITEM hParent=FindNode(ht,Parent_name);
if (hParent==NULL)
{
//父节点不存在;
AfxMessageBox("请确认是否注册了顶端节点!");
return;
}
else
{
//父节点存在,只增加子节点;
HCurrent=m_tree.InsertItem(LPCTSTR(Child_name),1,1,hParent);
MibNode* P_node=(MibNode*)m_tree.GetItemData(hParent);
OidStr=P_node->POid;
OidStr=OidStr+'.'+num;
P_node=new MibNode;
InitNodeData(P_node);
P_node->POid=OidStr;
m_tree.SetItemData(HCurrent,(DWORD)P_node);
}
}
//装载MIB文件;
bool CMibBrowserView::LoadMib(CString &filename)
{
MibNode* pNode;
if (MibFile.Open((LPCTSTR)filename,CFile::modeRead)==false)
{
AfxMessageBox("打开MIB-II文件时失败");
return false;
}
IndexString=' ';
//逐行读入并处理;
while (MibFile.ReadString(Line))
{
//预处理读入的行;
//空行,直接读下一行;
if (Line.GetLength()==0) continue;
//注释行,直接读下一行;
if (Line.Find("--")==0) continue;
//行的后面包含注释部分,去掉注释部分;
if (Line.Find("--")>0)
Line=Line.Left(Line.Find("--"));
//除去行两端的空白字符;
Line.TrimLeft();
Line.TrimRight();
//MIB模块名定义行;
/* if (Line.Find("DEFINITIONS ::=")>0)
{
Line=Line.Left(Line.Find("DEFINITIONS ::="));
HSecond= m_tree.InsertItem(LPCTSTR(Line) ,1,2,HRoot);
continue;
};*/
//辅助节点定义行;
if (Line.Find("OBJECT IDENTIFIER ::=")>2)
if ((Line.Find('{')>10)&&(Line.Find('}')>10))
{
CString ParentName,NodeName,Pos;
NodeName=Line.Left(Line.Find("OBJECT IDENTIFIER ::="));
int n1=Line.Find('{');
int n2=Line.Find('}')-n1-1;
Line=Line.Mid(n1+1,n2);
Line.TrimLeft();
Line.TrimRight();
ParentName=Line.Left(Line.Find(' '));
Pos=Line.Mid(Line.Find(' ')+1);
AddPlaceHolder(HRoot,ParentName,NodeName,Pos);
continue;
}
//辅助节点定义行;
if ((Line.Find("MODULE-IDENTITY")>2)&&(Line.Find(',')==-1))
{
CString ParentName,NodeName,Pos;
NodeName=Line.Left(Line.Find("MODULE-IDENTITY"));
while (MibFile.ReadString(Line))
{
if (Line.GetLength()==0) continue;
if (Line.Find("--")==0) continue;
if (Line.Find("--")>0)
Line=Line.Left(Line.Find("--"));
Line.TrimLeft();
Line.TrimRight();
if ((Line.Find("::=")==0)&&(Line.Find('}')>3)&&(Line.Find('{')>1))
{
int n1=Line.Find('{');
int n2=Line.Find('}')-n1-1;
Line=Line.Mid(n1+1,n2);
Line.TrimLeft();
Line.TrimRight();
ParentName=Line.Left(Line.Find(' '));
Pos=Line.Mid(Line.Find(' ')+1);
AddPlaceHolder(HRoot,ParentName,NodeName,Pos);
break;
}
}// while (MibFile.ReadString(Line))
continue;
}
//辅助节点定义行;
if ((Line.Find("OBJECT-IDENTITY")>2)&&(Line.Find(',')==-1))
{
CString ParentName,NodeName,Pos;
NodeName=Line.Left(Line.Find("OBJECT-IDENTITY"));
int n1=Line.Find('{');
int n2=Line.Find('}')-n1-1;
Line=Line.Mid(n1+1,n2);
Line.TrimLeft();
Line.TrimRight();
ParentName=Line.Left(Line.Find(' '));
Pos=Line.Mid(Line.Find(' ')+1);
AddPlaceHolder(HRoot,ParentName,NodeName,Pos);
continue;
}
//被管理对象定义行;
if ((Line.Find("OBJECT-TYPE")>2)&&(Line.Find(',')==-1))
{
CString ParentName,NodeName,Pos;
NodeName=Line.Left(Line.Find("OBJECT-TYPE"));
NodeName.TrimLeft();
NodeName.TrimRight();
pNode=new MibNode;
// pNode->PInteger=new CStringList();
// if (pNode->PInteger==NULL) AfxMessageBox(" 1 Bad pointer!!");
InitNodeData(pNode);
//逐行读入后续的定义行;
while (MibFile.ReadString(Line))
{
//读入行的预处理;
if (Line.GetLength()==0) continue;
if (Line.Find("--")==0) continue;
if (Line.Find("--")>0)
Line=Line.Left(Line.Find("--"));
Line.TrimLeft();
Line.TrimRight();
if(Line.Find("SYNTAX")==0)
{
//整数类型;
if (Line.Find("INTEGER")>0)
{
pNode->PSnytax="INTEGER";
//一行中完成定义的枚举整数类型;
if ((Line.Find('{')>10)&&(Line.Find('}')>10))
{
pNode->PInteger=new CStringList();
WorkOnInt(Line,pNode->PInteger);
}
//枚举型整数定义的后两种形式;
if ((Line.Find('{')>10)&&(Line.Find('}')==-1))
{
CString Line1='{';
while (MibFile.ReadString(Line))
{
if (Line.GetLength()==0) continue;
if (Line.Find("--")==0) continue;
if (Line.Find("--")>0)
Line=Line.Left(Line.Find("--"));
Line.TrimLeft();
Line.TrimRight();
Line1+=Line;
if (Line.Find('}')!=-1) break;
}
pNode->PInteger=new CStringList();
WorkOnInt(Line1,pNode->PInteger);
}
}
else
//非INTEGER的其他类型;
{
Line=Line.Mid(6);
Line.TrimLeft();
Line.TrimRight();
pNode->PSnytax=Line;
}
continue;
}// if(Line.Find("SYNTAX")==0)
//枚举型整数的第一种定义形式;
if ((Line.Find('{')==0)&&(pNode->PSnytax.Find("INTEGER")==0))
{
CString Line1=Line;
while (MibFile.ReadString(Line))
{
if (Line.GetLength()==0) continue;
if (Line.Find("--")==0) continue;
if (Line.Find("--")>0)
Line=Line.Left(Line.Find("--"));
Line.TrimLeft();
Line.TrimRight();
Line1+=Line;
if (Line.Find('}')!=-1) break;
}
pNode->PInteger=new CStringList();
WorkOnInt(Line1,pNode->PInteger);
continue;
}
//定义访问权限的行;
if ((Line.Find("ACCESS")==0)||(Line.Find("MAX-ACCESS")==0))
{
Line=Line.Mid(Line.Find(' '));
Line.TrimLeft();
Line.TrimRight();
pNode->PAccess=Line;
continue;
}
//定义对象状态的行;
if ((Line.Find("STATUS")==0))
{
Line=Line.Mid(Line.Find(' '));
Line.TrimLeft();
Line.TrimRight();
pNode->PStatus=Line;
continue;
}
//定义表索引的行;
if ((Line.Find("INDEX")==0))
{
Line=Line.Mid(Line.Find(' '));
CString Line1=Line;
if (Line.Find('}')==-1)
{
while (MibFile.ReadString(Line))
{
if (Line.GetLength()==0) continue;
if (Line.Find("--")==0) continue;
if (Line.Find("--")>0)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -