MibBrowserView.cpp
上传用户:hbytqc8
上传日期:2014-07-31
资源大小:527k
文件大小:36k
源码类别:

SNMP编程

开发平台:

Visual C++

  1. // MibBrowserView.cpp : implementation of the CMibBrowserView class
  2. //
  3. #include "stdafx.h"
  4. #include "MibBrowser.h"
  5. #include "Dlg_input.h"//输入OID对话框;
  6. #include "SetDig.h"//SET操作对话框;
  7. #include "MibBrowserDoc.h"
  8. #include "MibBrowserView.h"
  9. #include "MainFrm.h"
  10. #ifdef _DEBUG
  11. #define new DEBUG_NEW
  12. #undef THIS_FILE
  13. static char THIS_FILE[] = __FILE__;
  14. #endif
  15. /////////////////////////////////////////////////////////////////////////////
  16. // CMibBrowserView
  17. IMPLEMENT_DYNCREATE(CMibBrowserView, CFormView)
  18. BEGIN_MESSAGE_MAP(CMibBrowserView, CFormView)
  19. //{{AFX_MSG_MAP(CMibBrowserView)
  20. ON_COMMAND(ID_GET, OnGet)
  21. ON_COMMAND(ID_GETNEXT, OnGetnext)
  22. ON_COMMAND(ID_GETSUBTREE, OnGetsubtree)
  23. ON_COMMAND(ID_WALK, OnWalk)
  24. ON_WM_DESTROY()
  25. ON_NOTIFY(TVN_ITEMEXPANDED, IDC_TREE1, OnItemexpandedTree1)
  26. ON_NOTIFY(TVN_SELCHANGED, IDC_TREE1, OnSelchangedTree1)
  27. ON_COMMAND(ID_LOAD, OnLoad)
  28. ON_COMMAND(ID_OID, OnOid)
  29. ON_COMMAND(ID_SAVE, OnSave)
  30. ON_COMMAND(ID_SET, OnSet)
  31. //}}AFX_MSG_MAP
  32. // Standard printing commands
  33. ON_COMMAND(ID_FILE_PRINT, CFormView::OnFilePrint)
  34. ON_COMMAND(ID_FILE_PRINT_DIRECT, CFormView::OnFilePrint)
  35. ON_COMMAND(ID_FILE_PRINT_PREVIEW, CFormView::OnFilePrintPreview)
  36. END_MESSAGE_MAP()
  37. /////////////////////////////////////////////////////////////////////////////
  38. // CMibBrowserView construction/destruction
  39. CMibBrowserView::CMibBrowserView()
  40. : CFormView(CMibBrowserView::IDD)
  41. {
  42. //{{AFX_DATA_INIT(CMibBrowserView)
  43. m_edit1 = _T("");
  44. //}}AFX_DATA_INIT
  45. // TODO: add construction code here
  46. }
  47. CMibBrowserView::~CMibBrowserView()
  48. {
  49. }
  50. void CMibBrowserView::DoDataExchange(CDataExchange* pDX)
  51. {
  52. CFormView::DoDataExchange(pDX);
  53. //{{AFX_DATA_MAP(CMibBrowserView)
  54. DDX_Control(pDX, IDC_EDIT3, m_oid);
  55. DDX_Control(pDX, IDC_EDIT2, m_community);
  56. DDX_Control(pDX, IDC_IPADDRESS1, m_ipadd);
  57. DDX_Control(pDX, IDC_TREE1, m_tree);
  58. DDX_Control(pDX, IDC_LIST1, m_list);
  59. DDX_Text(pDX, IDC_EDIT1, m_edit1);
  60. //}}AFX_DATA_MAP
  61. }
  62. BOOL CMibBrowserView::PreCreateWindow(CREATESTRUCT& cs)
  63. {
  64. // TODO: Modify the Window class or styles here by modifying
  65. //  the CREATESTRUCT cs
  66. return CFormView::PreCreateWindow(cs);
  67. }
  68. //查找给定OID的叶子节点的函数,返回节点句柄;
  69. HTREEITEM CMibBrowserView::SearchNode(const CString &OidStr)
  70. {
  71.    MibNode *pData;
  72.    HTREEITEM hTv;
  73.    hTv=m_tree.GetRootItem();
  74.     //追踪节点OID,直到叶子节点;
  75.    while (hTv!=NULL)
  76.    {
  77.        pData=(MibNode*)m_tree.GetItemData(hTv);
  78.    if (pData!=NULL)
  79.    {   
  80.    //如果OID串不以该节点的OID串开始,移到它的兄弟节点;
  81.            if (OidStr.Find((LPCTSTR)(pData->POid+'.'))!=0)
  82.      hTv=m_tree.GetNextItem(hTv,TVGN_NEXT);
  83.    else
  84.            {
  85.             //否则,如果不是叶子节点,移到它的第一个子节点;
  86.     if (m_tree.ItemHasChildren(hTv))
  87.             hTv=m_tree.GetNextItem(hTv,TVGN_CHILD);
  88. //如果是叶子节点,返回节点句柄;
  89.             else
  90.              return hTv;
  91.    }
  92. }//if (pData!=NULL)  
  93. }//while (hTv!=NULL)
  94.    if (hTv==NULL) 
  95.    return NULL;
  96.    else
  97.      return hTv;
  98. }
  99. //处理数据类型为枚举型整数的函数,将其转化为字符串列表中的元素,
  100. //以下面的形式保存:
  101. //1
  102. //up
  103. //2
  104. //down
  105. //3
  106. //testing
  107. void CMibBrowserView::WorkOnInt(CString &str,CStringList* p)
  108. {
  109.    //截取大括号中的字符串,不包括大括号;
  110.    int n1=str.Find('{');
  111.    int n2=str.Find('}')-n1-1;
  112.    str=str.Mid(n1+1,n2)+',';
  113.    //AfxMessageBox((LPCTSTR)str);
  114.    while (str.GetLength()>3)
  115.    {
  116.    CString str1=str.Left(str.Find(','));
  117.        str=str.Mid(str.Find(',')+1);
  118.        int n3=str1.Find('(');
  119.        int n4=str1.Find(')')-n3-1;
  120.    CString list=str1.Mid(n3+1,n4);
  121.    list.TrimLeft();
  122.    list.TrimRight();
  123.     
  124.    p->AddTail(list);
  125.        list=str1.Left(n3);
  126.        list.TrimLeft();
  127.    list.TrimRight();
  128.       p->AddTail(list);
  129.   
  130.    }
  131. }
  132. //使用递归算法,遍历整个以hparent为根节点的子树,销毁Data中的对象;
  133. void CMibBrowserView::travl(HTREEITEM hparent)
  134. {
  135. MibNode* pnode;
  136. //如果节点存在,首先判断data是否为NULL,如否,则进一步判断PInteger
  137. //是否为NULL,如否,释放所指向的对象,然后释放data所指向的对象;
  138. if (hparent!=NULL)
  139. {
  140.     if ((pnode=(MibNode*)m_tree.GetItemData(hparent))!=NULL)
  141.    {
  142. if((pnode->PInteger)!=NULL)
  143. delete pnode->PInteger;
  144. delete pnode;
  145. }
  146. }
  147. hparent=m_tree.GetChildItem(hparent);
  148. do
  149. {
  150.    if (hparent!=NULL)
  151.    travl(hparent);
  152.    hparent=m_tree.GetNextSiblingItem(hparent);
  153.  } while(hparent!=NULL);
  154. }
  155. //根据给定的父,子节点名称在树中增加新节点的函数,并设置相应的图标;
  156. void CMibBrowserView::AddObject(HTREEITEM ht,CString &Parent_name,
  157.  CString &Child_name,CString &num,MibNode *p)
  158. {
  159.            CString OidStr;
  160.                Parent_name.TrimLeft();
  161.    Parent_name.TrimRight();
  162.    Child_name.TrimLeft();
  163.    Child_name.TrimRight();
  164.    //查找父节点位置;
  165.                HTREEITEM hParent=FindNode(ht,Parent_name);
  166.                if (hParent!=NULL)
  167.    {
  168.    //增加新节点;
  169.      HCurrent=m_tree.InsertItem(LPCTSTR(Child_name),3,3,hParent);
  170.                      //获取父节点OID;
  171.  MibNode* P_node=(MibNode*)m_tree.GetItemData(hParent);
  172.  OidStr=P_node->POid;
  173.  //生成子节点OID;
  174.  OidStr=OidStr+'.'+num;
  175.  p->POid=OidStr;
  176.  //设置子节点data属性;
  177.  m_tree.SetItemData(HCurrent,(DWORD)p);
  178.  //根据不同节点设置不同发图标;
  179.   if (IndexString.Find((LPCTSTR)Child_name)>0)
  180.                       m_tree.SetItemImage(HCurrent,4,4);
  181.                      if (Child_name.Find("Entry")>1)
  182.                      m_tree.SetItemImage(HCurrent,5,5);
  183.   if (Child_name.Find("Table")>1)
  184.                      m_tree.SetItemImage(HCurrent,6,6);
  185.    }
  186. }  
  187. //增加辅助节点。增加前,首先要查找树中父节点是否已经存在,如存在父节点,
  188. //生成节点对应的结构数据,将新节点增加为父节点的子节点。否则,说明新节
  189. //点为顶端节点,首先从TopOid中查找对应的OID,生成节点对应的结构数据,并
  190. //增加父节点。然后根据父节点的OID和参数&num生成子节点的OID,生成节点对
  191. //应的结构数据,并增加子节点;
  192. void CMibBrowserView::AddPlaceHolder(HTREEITEM ht,CString &Parent_name,
  193.  CString &Child_name,CString &num)
  194. {
  195. CString OidStr;
  196. Parent_name.TrimLeft();
  197. Parent_name.TrimRight();
  198. Child_name.TrimLeft();
  199. Child_name.TrimRight();
  200. //查找父节点;
  201. HTREEITEM hParent=FindNode(ht,Parent_name);
  202. if (hParent==NULL)
  203. {
  204. //父节点不存在;
  205. AfxMessageBox("请确认是否注册了顶端节点!");
  206.   return;
  207. }
  208. else
  209. {
  210. //父节点存在,只增加子节点;
  211. HCurrent=m_tree.InsertItem(LPCTSTR(Child_name),1,1,hParent);
  212. MibNode* P_node=(MibNode*)m_tree.GetItemData(hParent);
  213. OidStr=P_node->POid;
  214. OidStr=OidStr+'.'+num;
  215. P_node=new MibNode;
  216. InitNodeData(P_node);
  217. P_node->POid=OidStr;
  218. m_tree.SetItemData(HCurrent,(DWORD)P_node);
  219. }
  220. //装载MIB文件;
  221. bool CMibBrowserView::LoadMib(CString &filename)
  222. {   
  223.     MibNode* pNode;
  224. if (MibFile.Open((LPCTSTR)filename,CFile::modeRead)==false)
  225. {
  226. AfxMessageBox("打开MIB-II文件时失败");
  227.         return false;
  228. }
  229. IndexString=' ';
  230. //逐行读入并处理;
  231. while (MibFile.ReadString(Line))
  232. {
  233. //预处理读入的行;
  234. //空行,直接读下一行;
  235. if (Line.GetLength()==0) continue;
  236. //注释行,直接读下一行;
  237. if (Line.Find("--")==0) continue;
  238. //行的后面包含注释部分,去掉注释部分;
  239. if (Line.Find("--")>0)
  240. Line=Line.Left(Line.Find("--"));
  241. //除去行两端的空白字符;
  242. Line.TrimLeft();
  243. Line.TrimRight();
  244. //MIB模块名定义行;
  245. /* if (Line.Find("DEFINITIONS ::=")>0)
  246. {
  247.         Line=Line.Left(Line.Find("DEFINITIONS ::="));
  248.         HSecond= m_tree.InsertItem(LPCTSTR(Line) ,1,2,HRoot);
  249. continue;
  250.    };*/
  251. //辅助节点定义行;
  252. if (Line.Find("OBJECT IDENTIFIER ::=")>2)
  253. if ((Line.Find('{')>10)&&(Line.Find('}')>10))
  254. {
  255. CString ParentName,NodeName,Pos;
  256. NodeName=Line.Left(Line.Find("OBJECT IDENTIFIER ::="));
  257. int n1=Line.Find('{');
  258. int n2=Line.Find('}')-n1-1;
  259. Line=Line.Mid(n1+1,n2);
  260. Line.TrimLeft();
  261. Line.TrimRight();
  262. ParentName=Line.Left(Line.Find(' '));
  263. Pos=Line.Mid(Line.Find(' ')+1);
  264. AddPlaceHolder(HRoot,ParentName,NodeName,Pos);
  265. continue;
  266. }
  267. //辅助节点定义行;
  268. if ((Line.Find("MODULE-IDENTITY")>2)&&(Line.Find(',')==-1))
  269. {
  270. CString ParentName,NodeName,Pos;
  271. NodeName=Line.Left(Line.Find("MODULE-IDENTITY"));
  272.                 while (MibFile.ReadString(Line))
  273. {
  274. if (Line.GetLength()==0) continue;
  275. if (Line.Find("--")==0) continue;
  276. if (Line.Find("--")>0)
  277. Line=Line.Left(Line.Find("--"));
  278. Line.TrimLeft();
  279. Line.TrimRight();
  280. if ((Line.Find("::=")==0)&&(Line.Find('}')>3)&&(Line.Find('{')>1))
  281. {
  282. int n1=Line.Find('{');
  283. int n2=Line.Find('}')-n1-1;
  284. Line=Line.Mid(n1+1,n2);
  285. Line.TrimLeft();
  286. Line.TrimRight();
  287. ParentName=Line.Left(Line.Find(' '));
  288. Pos=Line.Mid(Line.Find(' ')+1);
  289. AddPlaceHolder(HRoot,ParentName,NodeName,Pos);
  290. break;
  291. }
  292. }// while (MibFile.ReadString(Line))
  293. continue;
  294. }
  295. //辅助节点定义行;
  296. if ((Line.Find("OBJECT-IDENTITY")>2)&&(Line.Find(',')==-1))
  297. {
  298. CString ParentName,NodeName,Pos;
  299. NodeName=Line.Left(Line.Find("OBJECT-IDENTITY"));
  300. int n1=Line.Find('{');
  301. int n2=Line.Find('}')-n1-1;
  302. Line=Line.Mid(n1+1,n2);
  303. Line.TrimLeft();
  304. Line.TrimRight();
  305. ParentName=Line.Left(Line.Find(' '));
  306. Pos=Line.Mid(Line.Find(' ')+1);
  307. AddPlaceHolder(HRoot,ParentName,NodeName,Pos);
  308. continue;
  309. }
  310. //被管理对象定义行;
  311. if ((Line.Find("OBJECT-TYPE")>2)&&(Line.Find(',')==-1))
  312. {   
  313. CString ParentName,NodeName,Pos;
  314. NodeName=Line.Left(Line.Find("OBJECT-TYPE"));
  315. NodeName.TrimLeft();
  316. NodeName.TrimRight();
  317. pNode=new MibNode;
  318. // pNode->PInteger=new CStringList();
  319. //  if (pNode->PInteger==NULL)  AfxMessageBox(" 1 Bad pointer!!");
  320. InitNodeData(pNode);
  321. //逐行读入后续的定义行;
  322. while (MibFile.ReadString(Line))
  323. {
  324. //读入行的预处理;
  325. if (Line.GetLength()==0) continue;
  326. if (Line.Find("--")==0) continue;
  327. if (Line.Find("--")>0)
  328. Line=Line.Left(Line.Find("--"));
  329. Line.TrimLeft();
  330. Line.TrimRight();
  331. if(Line.Find("SYNTAX")==0)
  332. {
  333. //整数类型;
  334. if (Line.Find("INTEGER")>0)
  335. {
  336. pNode->PSnytax="INTEGER";
  337. //一行中完成定义的枚举整数类型;
  338. if ((Line.Find('{')>10)&&(Line.Find('}')>10))
  339. {
  340. pNode->PInteger=new CStringList();
  341. WorkOnInt(Line,pNode->PInteger);
  342. }
  343. //枚举型整数定义的后两种形式;
  344. if ((Line.Find('{')>10)&&(Line.Find('}')==-1))
  345. {
  346. CString Line1='{';
  347. while (MibFile.ReadString(Line))
  348. {
  349. if (Line.GetLength()==0) continue;
  350. if (Line.Find("--")==0) continue;
  351. if (Line.Find("--")>0)
  352. Line=Line.Left(Line.Find("--"));
  353. Line.TrimLeft();
  354. Line.TrimRight();
  355. Line1+=Line;
  356. if (Line.Find('}')!=-1) break; 
  357. }
  358. pNode->PInteger=new CStringList();
  359. WorkOnInt(Line1,pNode->PInteger);
  360. }    
  361. }
  362. else
  363. //非INTEGER的其他类型;
  364. {
  365. Line=Line.Mid(6);
  366. Line.TrimLeft();
  367. Line.TrimRight();
  368. pNode->PSnytax=Line;
  369. }
  370. continue;
  371. }// if(Line.Find("SYNTAX")==0)
  372. //枚举型整数的第一种定义形式;
  373. if ((Line.Find('{')==0)&&(pNode->PSnytax.Find("INTEGER")==0))
  374. CString Line1=Line;
  375. while (MibFile.ReadString(Line))
  376. {
  377. if (Line.GetLength()==0) continue;
  378. if (Line.Find("--")==0) continue;
  379. if (Line.Find("--")>0)
  380. Line=Line.Left(Line.Find("--"));
  381. Line.TrimLeft();
  382. Line.TrimRight();
  383. Line1+=Line;
  384. if (Line.Find('}')!=-1) break; 
  385. }
  386. pNode->PInteger=new CStringList();
  387. WorkOnInt(Line1,pNode->PInteger);
  388. continue; 
  389. //定义访问权限的行;
  390. if ((Line.Find("ACCESS")==0)||(Line.Find("MAX-ACCESS")==0))
  391. {
  392. Line=Line.Mid(Line.Find(' '));
  393.                       Line.TrimLeft();
  394. Line.TrimRight();
  395. pNode->PAccess=Line;
  396. continue;
  397. }
  398. //定义对象状态的行;
  399. if ((Line.Find("STATUS")==0))
  400. {
  401. Line=Line.Mid(Line.Find(' '));
  402.                      Line.TrimLeft();
  403. Line.TrimRight();
  404. pNode->PStatus=Line;
  405. continue;
  406. }
  407. //定义表索引的行;
  408. if ((Line.Find("INDEX")==0))
  409. {
  410. Line=Line.Mid(Line.Find(' '));
  411. CString Line1=Line;
  412. if (Line.Find('}')==-1)
  413. {
  414. while (MibFile.ReadString(Line))
  415. {
  416. if (Line.GetLength()==0) continue;
  417. if (Line.Find("--")==0) continue;
  418. if (Line.Find("--")>0)
  419. Line=Line.Left(Line.Find("--"));
  420. Line.TrimLeft();
  421. Line.TrimRight();
  422. Line1=Line1+' '+Line;
  423. if (Line.Find('}')!=-1) break; 
  424. }
  425. }
  426. pNode->PIndex=Line1;
  427. IndexString=Line1;
  428. continue;
  429. }
  430. if  ((Line.Find("DESCRIPTION")==0))
  431. CString Line1;
  432. while (MibFile.ReadString(Line))
  433. {
  434. if (Line.GetLength()==0) continue;
  435. if (Line.Find("--")==0) continue;
  436. if (Line.Find("--")>0)
  437. Line=Line.Left(Line.Find("--"));
  438. Line.TrimLeft();
  439. Line.TrimRight();
  440. Line1+=Line;
  441. //第一个字符为‘“ ’,从第3个字符开始判断;
  442. if (Line.Find('"',2)>2) break; 
  443. }
  444. pNode->PDescr=Line1;
  445. continue;
  446. }
  447. //最后一行,退出;
  448. if ((Line.Find("::=")==0)&&(Line.Find('}')>3)&&(Line.Find('{')>1))
  449. {
  450. int n1=Line.Find('{');
  451. int n2=Line.Find('}')-n1-1;
  452. Line=Line.Mid(n1+1,n2);
  453. Line.TrimLeft();
  454. Line.TrimRight();
  455. ParentName=Line.Left(Line.Find(' '));
  456. Pos=Line.Mid(Line.Find(' ')+1);
  457. AddObject(HRoot,ParentName,NodeName,Pos,pNode);
  458. break;
  459. }
  460. }// while (MibFile.ReadString(Line)) 
  461. continue;
  462.   }
  463. }//while (MibFile.ReadString(Line))
  464. MibFile.Close();
  465.     return true;
  466. }
  467. //使用递归算法,遍历整个以hSubRoot为根节点的子树,查找是否存在label为&text
  468. //的节点,如存在,返回该节点的句柄,否则返回NULL;
  469. HTREEITEM CMibBrowserView::FindNode(HTREEITEM hSubRoot,const CString &text)
  470. {
  471.     if (hSubRoot==NULL) 
  472. return NULL;
  473. //判断是否符合条件,如是,返回该节点的举柄;
  474.     if (m_tree.GetItemText(hSubRoot)==text)
  475. return hSubRoot;
  476. hSubRoot=m_tree.GetChildItem(hSubRoot);
  477. do 
  478. {
  479.        HTREEITEM ht;
  480.    //递归调用FindNode;
  481.    if ((ht=FindNode(hSubRoot,text)) !=NULL)
  482.    return ht;
  483. } while ((hSubRoot=m_tree.GetNextSiblingItem(hSubRoot)) !=NULL);
  484.     return NULL;
  485. }
  486. //初始化一个结构数据,所有指针设置为NULL;
  487. void CMibBrowserView::InitNodeData(MibNode *Pnode)
  488. {
  489.     Pnode->PSnytax=' ';
  490.     Pnode->PAccess=' ';
  491.     Pnode->PDescr=' ';
  492.     Pnode->PIndex=' ';
  493.     Pnode->PStatus=' ';
  494. Pnode->POid=' ';
  495. Pnode->PInteger=NULL;
  496. }
  497. void CMibBrowserView::OnInitialUpdate()
  498. {
  499. CFormView::OnInitialUpdate();
  500. GetParentFrame()->RecalcLayout();
  501. ResizeParentToFit();
  502. //增加的代码;
  503.     CurrDir=_pgmptr;
  504. CurrDir.MakeReverse();
  505.     int path=CurrDir.Find('\');
  506. CurrDir.MakeReverse();
  507.     CurrDir=CurrDir.Left(CurrDir.GetLength()-path);
  508. //初始化列表控件;
  509. m_ipadd.SetAddress(127,0,0,1);
  510.     CString pass="public";
  511. m_community.SetWindowText(pass);
  512. pass="1.3.6.1.2.1.1.1.0";
  513. m_oid.SetWindowText(pass);
  514. m_list.InsertColumn(0,"     OID",LVCFMT_RIGHT,180,0);
  515. m_list.InsertColumn(1,"        Value",LVCFMT_LEFT,320,1);
  516. m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
  517. //初始化,装载图标;
  518. m_iImageList.Create(16, 16, TRUE,1, 0);
  519. HICON hIcon = NULL;
  520. //0,root;
  521. hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(), 
  522. MAKEINTRESOURCE(IDI_ROOT1), IMAGE_ICON, 32, 32, 0);
  523. m_iImageList.Add(hIcon);
  524. //1,closed box;
  525. hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(), 
  526. MAKEINTRESOURCE(IDI_CLOSE_BOX), IMAGE_ICON, 16, 16, 0);
  527. m_iImageList.Add(hIcon);
  528.     //2,opened box;
  529.     hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(), 
  530. MAKEINTRESOURCE(IDI_OPEN_BOX), IMAGE_ICON, 16, 16, 0);
  531. m_iImageList.Add(hIcon);
  532. //3,leaf node
  533.     hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(), 
  534. MAKEINTRESOURCE(IDI_LEAF), IMAGE_ICON, 16, 16, 0);
  535. m_iImageList.Add(hIcon);
  536. //4,key node
  537.     hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(), 
  538. MAKEINTRESOURCE(IDI_KEY), IMAGE_ICON, 16, 16, 0);
  539. m_iImageList.Add(hIcon);
  540. //5,entry;
  541.     hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(), 
  542. MAKEINTRESOURCE(IDI_ENTRY), IMAGE_ICON, 16, 16, 0);
  543. m_iImageList.Add(hIcon);
  544. //6,table;
  545.     hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(), 
  546. MAKEINTRESOURCE(IDI_TABLE), IMAGE_ICON, 16, 16, 0);
  547. m_iImageList.Add(hIcon);
  548. m_tree.SetImageList ( &m_iImageList,TVSIL_NORMAL );
  549.     //增加根节点;
  550.     MibNode* pNode;
  551. HRoot= m_tree.InsertItem("MIB",0,0,NULL);
  552.     pNode=new MibNode;
  553.     InitNodeData(pNode);
  554. pNode->POid="1.3.6.1";
  555. pNode->PAccess="not-accessable";
  556. //增加几个主要辅助节点;
  557. //mgmt
  558.     m_tree.SetItemData(HRoot,(DWORD)pNode);
  559.     HSecond= m_tree.InsertItem("mgmt",1,1,HRoot);
  560.     pNode=new MibNode;
  561.     InitNodeData(pNode);
  562. pNode->POid="1.3.6.1.2";
  563. pNode->PAccess="not-accessable";
  564.     m_tree.SetItemData(HSecond,(DWORD)pNode);
  565. //private;
  566.     HSecond= m_tree.InsertItem("private",1,1,HRoot);
  567.     pNode=new MibNode;
  568.     InitNodeData(pNode);
  569. pNode->POid="1.3.6.1.4";
  570. pNode->PAccess="not-accessable";
  571.     m_tree.SetItemData(HSecond,(DWORD)pNode);
  572. //enterprises;
  573.     HSecond= m_tree.InsertItem("enterprises",1,1,HSecond);
  574.     pNode=new MibNode;
  575.     InitNodeData(pNode);
  576. pNode->POid="1.3.6.1.4.1";
  577. pNode->PAccess="not-accessable";
  578.     m_tree.SetItemData(HSecond,(DWORD)pNode);
  579. //cisco
  580.     HSecond= m_tree.InsertItem("cisco",1,1,HSecond);
  581.     pNode=new MibNode;
  582.     InitNodeData(pNode);
  583. pNode->POid="1.3.6.1.4.1.9";
  584. pNode->PAccess="not-accessable";
  585.     m_tree.SetItemData(HSecond,(DWORD)pNode);
  586.     //ciscomgmt
  587.     HSecond=m_tree.InsertItem("ciscoMgmt",1,1,HSecond);
  588.     pNode=new MibNode;
  589.     InitNodeData(pNode);
  590. pNode->POid="1.3.6.1.4.1.9.9";
  591. pNode->PAccess="not-accessable";
  592.     m_tree.SetItemData(HSecond,(DWORD)pNode);
  593.     //microsoft
  594.     HSecond=m_tree.InsertItem("microsoft",
  595.     1,1,m_tree.GetParentItem(m_tree.GetParentItem(HSecond)));
  596.     pNode=new MibNode;
  597.     InitNodeData(pNode);
  598. pNode->POid="1.3.6.1.4.1.311";
  599. pNode->PAccess="not-accessable";
  600.     m_tree.SetItemData(HSecond,(DWORD)pNode);
  601.     //打开OID文件,将用户增加的辅助(顶端)节点增加的MIB树中;
  602. //每个顶端节点占3行,第一行为父节点名,第二行为辅助节点名,
  603. //第三行为它的OID;
  604. CString tempfile=CurrDir+"mib/oid.txt";
  605.    if (MibFile.Open((LPCTSTR)tempfile,CFile::modeRead)==false)
  606. {
  607. AfxMessageBox("打开oid文件时失败");
  608.         return;
  609. }
  610. //逐行读入并处理;
  611. while (MibFile.ReadString(Line))
  612. {
  613. CString n_name,o_name;
  614. Line.TrimLeft();
  615. Line.TrimRight();
  616. if (Line.GetLength()==0) continue;
  617.         HTREEITEM hr;
  618. hr=m_tree.GetRootItem();
  619.         HTREEITEM hp=FindNode(hr,Line);
  620. //读入节点名;
  621.     MibFile.ReadString(Line);
  622. n_name=Line;
  623. //OID;
  624.         MibFile.ReadString(Line);
  625. o_name=Line;
  626. if (hp!=NULL)
  627. {
  628. //插入新节点并设置data项;
  629.             hp=m_tree.InsertItem((LPCTSTR)n_name,1,1,hp);
  630.             MibNode *pNode=new MibNode;
  631.             InitNodeData(pNode);
  632.          pNode->POid=o_name;
  633.          pNode->PAccess="not-accessable";
  634.             m_tree.SetItemData(hp,(DWORD)pNode);
  635. }
  636.   }
  637. MibFile.Close();
  638.     //装载MIB,所有已装载MIB文件以txt格式保存在当前目录的mib子目
  639. //录下,搜索目录中所有MIB文件并依次装载。
  640. tempfile=CurrDir+"mib/*.txt";
  641.     CFileFind fileread;
  642.     BOOL nextfile=fileread.FindFile((LPCTSTR)tempfile);
  643.     while (nextfile)
  644. {
  645.       nextfile=fileread.FindNextFile();
  646.   //跳过oid.txt文件;
  647.   if (fileread.GetFileName()=="oid.txt") continue;
  648.   tempfile=fileread.GetFilePath();
  649.   //调用函数装载MIB文件;
  650.       if (LoadMib(tempfile)==false)
  651. AfxMessageBox("装载文件出错!");
  652. }
  653. }
  654. /////////////////////////////////////////////////////////////////////////////
  655. // CMibBrowserView printing
  656. BOOL CMibBrowserView::OnPreparePrinting(CPrintInfo* pInfo)
  657. {
  658. // default preparation
  659. return DoPreparePrinting(pInfo);
  660. }
  661. void CMibBrowserView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  662. {
  663. // TODO: add extra initialization before printing
  664. }
  665. void CMibBrowserView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  666. {
  667. // TODO: add cleanup after printing
  668. }
  669. void CMibBrowserView::OnPrint(CDC* pDC, CPrintInfo* /*pInfo*/)
  670. {
  671. // TODO: add customized printing code here
  672. }
  673. /////////////////////////////////////////////////////////////////////////////
  674. // CMibBrowserView diagnostics
  675. #ifdef _DEBUG
  676. void CMibBrowserView::AssertValid() const
  677. {
  678. CFormView::AssertValid();
  679. }
  680. void CMibBrowserView::Dump(CDumpContext& dc) const
  681. {
  682. CFormView::Dump(dc);
  683. }
  684. CMibBrowserDoc* CMibBrowserView::GetDocument() // non-debug version is inline
  685. {
  686. ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMibBrowserDoc)));
  687. return (CMibBrowserDoc*)m_pDocument;
  688. }
  689. #endif //_DEBUG
  690. /////////////////////////////////////////////////////////////////////////////
  691. // CMibBrowserView message handlers
  692. //GET操作;
  693. void CMibBrowserView::OnGet() 
  694. {
  695. HTREEITEM hNode;
  696. MibNode* pNodeData;
  697. CString ipadd,community,oidstr;
  698. m_ipadd.GetWindowText(ipadd);
  699. if(m_ipadd.IsBlank())  
  700. {
  701. AfxMessageBox("IP地址错误!");
  702. return ;
  703. }  
  704. m_ipadd.GetWindowText(ipadd);
  705. m_community.GetWindowText(community);
  706. m_oid.GetWindowText(oidstr);
  707. ipadd+=":161";
  708. Snmp::socket_startup(); 
  709. UdpAddress address((LPCTSTR)ipadd); 
  710. Oid oid((LPCTSTR)oidstr); 
  711. snmp_version version=version1;                 
  712. int status;
  713. Snmp snmp(status, 0, false);
  714.  Pdu pdu;                             
  715.  Vb vb;                           
  716.  vb.set_oid(oid);                    
  717.  pdu += vb;                           
  718.  CTarget ctarget(address); 
  719.  ctarget.set_version(version);         
  720.  ctarget.set_retry(1);           
  721.  ctarget.set_timeout(100); 
  722.  ctarget.set_readcommunity((LPCTSTR)community); 
  723.  SnmpTarget *target;
  724.  target = &ctarget;
  725.  status = snmp.get(pdu, *target); 
  726.  if (status == SNMP_CLASS_SUCCESS)   
  727.     {  
  728.      pdu.get_vb(vb,0);
  729.  CString reply_oid=vb.get_printable_oid();
  730.      CString reply_value=vb.get_printable_value();
  731.  hNode=SearchNode(reply_oid);
  732.  if (hNode!=NULL)
  733.  {
  734.   pNodeData=(MibNode*)m_tree.GetItemData(hNode);
  735.   reply_oid.Replace((LPCTSTR)pNodeData->POid,
  736.       (LPCTSTR)m_tree.GetItemText(hNode));
  737.      if (pNodeData->PInteger!=NULL)
  738.    {
  739.     POSITION index=pNodeData->PInteger->Find(reply_value);
  740.             if (index!=NULL)
  741. {
  742.                 pNodeData->PInteger->GetNext(index);
  743.                reply_value=pNodeData->PInteger->GetNext(index);
  744. }
  745.    }
  746.  }
  747.  if (m_list.GetItemCount()>0)
  748.       m_list.DeleteAllItems();
  749.      int row=m_list.InsertItem(1,reply_oid);
  750.  m_list.SetItemText(row,1,reply_value);
  751.     }
  752. Snmp::socket_cleanup(); 
  753. CMainFrame *pF=(CMainFrame *)AfxGetMainWnd();
  754. int num=m_list.GetItemCount();
  755. oidstr.Format("%d",num);
  756. oidstr="共取回 "+oidstr+" 个对象";
  757. pF->m_wndStatusBar.SetPaneText(0,oidstr);
  758. }
  759. void CMibBrowserView::OnGetnext() 
  760. {
  761. HTREEITEM hNode;
  762. MibNode* pNodeData;
  763. CString ipadd,community,oidstr;
  764. m_ipadd.GetWindowText(ipadd);
  765. if(m_ipadd.IsBlank())  
  766. {
  767. AfxMessageBox("IP地址错误!");
  768. return ;
  769. }  
  770. m_ipadd.GetWindowText(ipadd);
  771. ipadd+=":161";
  772. m_community.GetWindowText(community);
  773. m_oid.GetWindowText(oidstr);
  774. Snmp::socket_startup(); 
  775. UdpAddress address((LPCTSTR)ipadd); 
  776. Oid oid((LPCTSTR)oidstr); 
  777. snmp_version version=version1;                 
  778. int status;
  779. Snmp snmp(status, 0, false);
  780.  Pdu pdu;                             
  781.  Vb vb;                           
  782.  vb.set_oid(oid);                    
  783.  pdu += vb;                           
  784.  CTarget ctarget( address); 
  785.  ctarget.set_version( version);         
  786.  ctarget.set_retry(1);           
  787.  ctarget.set_timeout(100); 
  788.  ctarget.set_readcommunity((LPCTSTR)community); 
  789.  SnmpTarget *target;
  790.  target = &ctarget;
  791.  status = snmp.get_next(pdu, *target); 
  792.  if (status == SNMP_CLASS_SUCCESS)   
  793.     {  
  794.      pdu.get_vb(vb,0);
  795.  CString reply_oid=vb.get_printable_oid();
  796.      CString reply_value=vb.get_printable_value();
  797.  hNode=SearchNode(reply_oid);
  798.      if (hNode!=NULL)
  799.      {
  800.  pNodeData=(MibNode*)m_tree.GetItemData(hNode);
  801.  reply_oid.Replace((LPCTSTR)pNodeData->POid,
  802.  (LPCTSTR)m_tree.GetItemText(hNode));
  803.      if (pNodeData->PInteger!=NULL)
  804.    {
  805.     POSITION index=pNodeData->PInteger->Find(reply_value);
  806.             if (index!=NULL)
  807. {
  808.                 pNodeData->PInteger->GetNext(index);
  809.                reply_value=pNodeData->PInteger->GetNext(index);
  810. }
  811.    }
  812.  }
  813.  if (m_list.GetItemCount()>0)
  814.       m_list.DeleteAllItems();
  815.      int row=m_list.InsertItem(1,reply_oid);
  816.  m_list.SetItemText(row,1,reply_value);
  817.     }
  818.     else
  819.     AfxMessageBox("操作失败,请检查配置!");
  820. Snmp::socket_cleanup(); 
  821. CMainFrame *pF=(CMainFrame *)AfxGetMainWnd();
  822. int num=m_list.GetItemCount();
  823. oidstr.Format("%d",num);
  824. oidstr="共取回 "+oidstr+" 个对象";
  825. pF->m_wndStatusBar.SetPaneText(0,oidstr);
  826. }
  827. void CMibBrowserView::OnGetsubtree() 
  828. {
  829. CString ipadd,community,oidstr;
  830. m_ipadd.GetWindowText(ipadd);
  831. if(m_ipadd.IsBlank())  
  832. {
  833. AfxMessageBox("IP地址错误!");
  834. return ;
  835. }  
  836. m_ipadd.GetWindowText(ipadd);
  837. ipadd+=":161";
  838. m_community.GetWindowText(community);
  839. m_oid.GetWindowText(oidstr);
  840. Snmp::socket_startup(); 
  841. UdpAddress address((LPCTSTR)ipadd); 
  842. Oid Baseoid((LPCTSTR)oidstr); 
  843. snmp_version version=version1;                 
  844. int status;
  845. Snmp snmp(status, 0, false);
  846.  Pdu pdu;                             
  847.  Vb vb;                           
  848.  vb.set_oid(Baseoid);                    
  849.  pdu += vb;                           
  850.  CTarget ctarget( address); 
  851.  ctarget.set_version( version);         
  852.  ctarget.set_retry(1);           
  853.  ctarget.set_timeout(100); 
  854.  ctarget.set_readcommunity((LPCTSTR)community); 
  855.  SnmpTarget *target;
  856.  target = &ctarget;
  857.  Oid NextOid(Baseoid);
  858.  NextOid+=".1";
  859.  int number=1;
  860.  if (m_list.GetItemCount()>0) 
  861.  m_list.DeleteAllItems();
  862.  CString reply_oid;
  863.  CString reply_value;
  864.  MibNode* pNodeData;
  865.  HTREEITEM hNode=NULL;
  866.  //bool seek=true;
  867. while (Baseoid.nCompare(Baseoid.len(),NextOid)==0) 
  868. {
  869.  status = snmp.get_next(pdu, *target); 
  870.  if (status == SNMP_CLASS_SUCCESS)   
  871.     {  
  872.      pdu.get_vb(vb,0);
  873.  reply_oid=vb.get_printable_oid();
  874.  reply_value=vb.get_printable_value();
  875.  vb.get_oid(NextOid);
  876.      if (Baseoid.nCompare(Baseoid.len(),NextOid)==0)
  877.  {
  878.     hNode=SearchNode(reply_oid);
  879.       if (hNode!=NULL)
  880.   {
  881.      pNodeData=(MibNode*)m_tree.GetItemData(hNode);
  882.    if (reply_oid.Find((LPCTSTR)pNodeData->POid)==0)
  883.          reply_oid.Replace((LPCTSTR)pNodeData->POid,
  884.                     (LPCTSTR)m_tree.GetItemText(hNode));
  885.    if (pNodeData->PInteger!=NULL)
  886.    {
  887.     POSITION index=pNodeData->PInteger->Find(reply_value);
  888.             if (index!=NULL)
  889. {
  890.                 pNodeData->PInteger->GetNext(index);
  891.                reply_value=pNodeData->PInteger->GetNext(index);
  892. }
  893.    }
  894.     
  895. }
  896.      //在列表中显示;
  897.  int row=m_list.InsertItem(number,reply_oid);
  898.  m_list.SetItemText(row,1,reply_value);
  899.      number++;
  900.  }
  901.     }
  902.    vb.set_oid(NextOid);
  903.    vb.set_null();
  904.    pdu.set_vb(vb,0);
  905.    
  906.   }
  907. Snmp::socket_cleanup(); 
  908. CMainFrame *pF=(CMainFrame *)AfxGetMainWnd();
  909. int num=m_list.GetItemCount();
  910. oidstr.Format("%d",num);
  911. oidstr="共取回 "+oidstr+" 个对象";
  912. pF->m_wndStatusBar.SetPaneText(0,oidstr);
  913. }
  914. //遍历MIB的函数;
  915. void CMibBrowserView::OnWalk() 
  916. {
  917. CString ipadd,community,oidstr;
  918. m_ipadd.GetWindowText(ipadd);
  919. if(m_ipadd.IsBlank())  
  920. {
  921. AfxMessageBox("IP地址错误!");
  922. return ;
  923. }  
  924. m_ipadd.GetWindowText(ipadd);
  925. ipadd+=":161";
  926. m_community.GetWindowText(community);
  927. m_oid.GetWindowText(oidstr);
  928. Snmp::socket_startup(); 
  929. UdpAddress address((LPCTSTR)ipadd); 
  930. Oid BaseOid((LPCTSTR)oidstr); 
  931. snmp_version version=version1; 
  932. int status;
  933. Snmp snmp(status, 0, false);
  934.  Pdu pdu;                             
  935.  Vb vb;                           
  936.  vb.set_oid(BaseOid);                    
  937.  pdu += vb;                           
  938.  CTarget ctarget( address); 
  939.  ctarget.set_version( version);         
  940.  ctarget.set_retry(1);           
  941.  ctarget.set_timeout(100); 
  942.  ctarget.set_readcommunity((LPCTSTR)community); 
  943.  SnmpTarget *target;
  944.  target = &ctarget;
  945.  Oid NextOid(BaseOid);
  946.  int number=1;
  947.  if (m_list.GetItemCount()>0) 
  948.  m_list.DeleteAllItems();
  949.  CString reply_oid;
  950.  CString reply_value;
  951.  MibNode* pNodeData;
  952.  HTREEITEM hNode=NULL;
  953. // bool Seek=true;
  954. do
  955. {
  956.  BaseOid=NextOid;
  957.  status = snmp.get_next(pdu, *target); 
  958.  if (status == SNMP_CLASS_SUCCESS)   
  959.     {  
  960.      pdu.get_vb(vb,0);
  961.  reply_oid=vb.get_printable_oid();
  962.      reply_value=vb.get_printable_value();
  963.      hNode=SearchNode(reply_oid);
  964.      if (hNode!=NULL)
  965.  {
  966.      pNodeData=(MibNode*)m_tree.GetItemData(hNode);
  967.  if (reply_oid.Find((LPCTSTR)pNodeData->POid)==0)
  968.      reply_oid.Replace((LPCTSTR)pNodeData->POid,
  969.                     (LPCTSTR)m_tree.GetItemText(hNode));
  970.         if (pNodeData->PInteger!=NULL)
  971.    {
  972.     POSITION index=pNodeData->PInteger->Find(reply_value);
  973.             if (index!=NULL)
  974. {
  975.                 pNodeData->PInteger->GetNext(index);
  976.                reply_value=pNodeData->PInteger->GetNext(index);
  977. }
  978.    }
  979. }
  980.  vb.get_oid(NextOid);
  981.     int row=m_list.InsertItem(number,reply_oid);
  982.  m_list.SetItemText(row,1,reply_value);
  983.      number++;
  984.     }
  985.    vb.set_oid(NextOid);
  986.    vb.set_null();
  987.    pdu.set_vb(vb,0);
  988.  } while (BaseOid!=NextOid) ;
  989. Snmp::socket_cleanup(); 
  990. CMainFrame *pF=(CMainFrame *)AfxGetMainWnd();
  991. int num=m_list.GetItemCount();
  992. oidstr.Format("%d",num);
  993. oidstr="共取回 "+oidstr+" 个对象";
  994. pF->m_wndStatusBar.SetPaneText(0,oidstr);
  995. }
  996. //set;
  997. void CMibBrowserView::OnSet() 
  998. {
  999. CString ipadd,community,oidstr,n_value;
  1000. int n_type;
  1001. CSetDig set;
  1002. if(set.DoModal()==IDOK)
  1003. {
  1004.  n_value=set.m_value;
  1005.  n_type=set.m_type;
  1006. if ((n_value.GetLength()==0)||(n_type==-1))
  1007. {
  1008. AfxMessageBox("未选择对象类型或值!");
  1009. return;
  1010. }
  1011. m_ipadd.GetWindowText(ipadd);
  1012. if(m_ipadd.IsBlank())  
  1013. {
  1014. AfxMessageBox("IP地址错误!");
  1015. return ;
  1016. }  
  1017.  Pdu pdu;                             
  1018.  Vb vb;                           
  1019.  switch (n_type)
  1020.  {
  1021.  case 0:
  1022.  {
  1023.       unsigned long i;
  1024.       i = atol((LPCTSTR)n_value);
  1025.       long l;
  1026.       l = (long) i;
  1027.       vb.set_value(l);
  1028.  }
  1029.  case 1:
  1030.  {
  1031.       OctetStr octetstr((LPCTSTR)n_value);
  1032.       if ( octetstr.valid()) 
  1033.   vb.set_value(octetstr);
  1034.  }
  1035.  case 2:
  1036.  {
  1037.       Oid oid1((LPCTSTR)n_value);
  1038.       if ( oid1.valid()) 
  1039.       vb.set_value(oid1);
  1040.  }
  1041.  }
  1042. m_ipadd.GetWindowText(ipadd);
  1043. ipadd+=":161";
  1044. m_community.GetWindowText(community);
  1045. m_oid.GetWindowText(oidstr);
  1046.  Snmp::socket_startup();  
  1047. UdpAddress address((LPCTSTR)ipadd); 
  1048. Oid oid((LPCTSTR)oidstr);
  1049. vb.set_oid(oid); 
  1050. snmp_version version=version1;   
  1051. pdu += vb;                           
  1052.  CTarget ctarget(address); 
  1053.  ctarget.set_version(version);         
  1054.  ctarget.set_retry(1);           
  1055.  ctarget.set_timeout(100); 
  1056.  ctarget.set_writecommunity((LPCTSTR)community); 
  1057.  SnmpTarget *target;
  1058.  target = &ctarget;    
  1059.  int status;
  1060.  Snmp snmp(status, 0, false);
  1061.  if ( status != SNMP_CLASS_SUCCESS) 
  1062.  {
  1063.       AfxMessageBox("SNMP++ Session Create Failed");
  1064.       return ;
  1065.    }
  1066.  status=snmp.set(pdu, *target);
  1067.     if ( status == SNMP_CLASS_SUCCESS) 
  1068.   AfxMessageBox("设置操作成功!");
  1069. else
  1070.       AfxMessageBox(snmp.error_msg(status)); 
  1071. Snmp::socket_cleanup();  // Shut down socket subsystem
  1072. }
  1073. //增加的事件处理函数,在程序退出时销毁动态生成的对象;
  1074. void CMibBrowserView::OnDestroy() 
  1075. {
  1076. CFormView::OnDestroy();
  1077. HRoot=m_tree.GetRootItem();//从根节点开始;
  1078. travl(HRoot);//遍历整个树;
  1079. }
  1080. //在节点展开与闭合时改变节点图标;
  1081. void CMibBrowserView::OnItemexpandedTree1(NMHDR* pNMHDR, LRESULT* pResult) 
  1082. {
  1083. NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
  1084. // TODO: Add your control notification handler code here
  1085. HTREEITEM hnode=pNMTreeView->itemNew.hItem;
  1086. //不是叶子节点和根节点时才改变图标;
  1087. if ((m_tree.ItemHasChildren(hnode))&&(m_tree.GetRootItem()!=hnode))
  1088. {
  1089. if (pNMTreeView->itemNew.iImage==1)
  1090. m_tree.SetItemImage(hnode,2,2);
  1091. if (pNMTreeView->itemNew.iImage==2)
  1092.     m_tree.SetItemImage(hnode,1,1);
  1093. }//增加的代码
  1094. *pResult = 0;
  1095. }
  1096. void CMibBrowserView::OnSelchangedTree1(NMHDR* pNMHDR, LRESULT* pResult) 
  1097. {
  1098. NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
  1099. // TODO: Add your control notification handler code here
  1100.      HTREEITEM hnode=pNMTreeView->itemNew.hItem;
  1101. //二级节点,MIB文件名,返回;
  1102. // if (m_tree.GetParentItem(hnode)==m_tree.GetRootItem())
  1103. // return;
  1104. //不是根节点,显示节点详细信息;
  1105. if (m_tree.GetRootItem()!=hnode)
  1106. {
  1107. MibNode *pMibNode;
  1108. //获取节点data指针;
  1109. pMibNode=(MibNode *)m_tree.GetItemData(hnode);
  1110. CString str;
  1111. //获取节点语法信息;
  1112. str="SYNTAX: "+pMibNode->PSnytax+"rn";
  1113.         CString str1;
  1114. //如果是枚举型整数,获取保存在PInteger中的信息;
  1115. if (pMibNode->PInteger!=NULL)
  1116. {
  1117.            POSITION pos;
  1118.    CString str2;
  1119.    //遍历整个列表,第一项为数字,紧随的一项是数字的意义解释;
  1120.    for(pos=pMibNode->PInteger->GetHeadPosition(); pos!=NULL;)
  1121.    {
  1122.             str2=pMibNode->PInteger->GetNext(pos)+" : ";
  1123. str2=str2+pMibNode->PInteger->GetNext(pos)+"rn";
  1124. str1=str1+str2;
  1125.    }
  1126. }
  1127. str+=str1;
  1128.         str=str+"ACCESS:"+pMibNode->PAccess+"rn";
  1129.         str=str+"STATUS:"+pMibNode->PStatus+"rn";
  1130. //如果有INDEX信息,取出;
  1131. if (pMibNode->PIndex!=' ')
  1132.         str=str+"INDEX:"+pMibNode->PIndex+"rn";
  1133. str=str+"OID:"+pMibNode->POid+"rn";
  1134. str=str+"DESCRPTION:"+pMibNode->PDescr+"rn";
  1135. //在编辑控件中显示;
  1136. m_edit1=((LPCTSTR)str);
  1137.         m_oid.SetWindowText(pMibNode->POid);
  1138. UpdateData(FALSE);
  1139. }
  1140. //以上是增加的代码
  1141. *pResult = 0;
  1142. }
  1143. void CMibBrowserView::OnLoad() 
  1144. {
  1145. // TODO: Add your command handler code here
  1146. CString filename,Dfilename;
  1147. CFileDialog openfile(TRUE,NULL," *.txt",OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST,
  1148.  "MIB files");
  1149. openfile.DoModal();
  1150. Dfilename=openfile.GetFileName();
  1151. filename=openfile.GetPathName();
  1152. if (LoadMib(filename)==false)
  1153. AfxMessageBox("装载文件 "+filename+" 出错!");
  1154. else
  1155. {
  1156.     AfxMessageBox("装载成功!");
  1157.     Dfilename=CurrDir+"mib/"+Dfilename;
  1158.     CopyFile((LPCTSTR)filename,(LPCTSTR)Dfilename,false);
  1159. }
  1160. }
  1161. //注册节点,需要输入父节点,新增加节点以及新节点OID。每次
  1162. //注册成功的节点同时写入OID.TXT文件,下次程序启动时候读入;
  1163. void CMibBrowserView::OnOid() 
  1164. {
  1165. // TODO: Add your command handler code here
  1166. CString parent;
  1167. CString name,oidstr;
  1168. CDlg_input inputD;
  1169. inputD.m_ParentName="enterprises";
  1170. if (inputD.DoModal()==IDOK)
  1171. {
  1172. parent=inputD.m_ParentName;
  1173. name=inputD.m_NodeName;
  1174. oidstr=inputD.m_NodeOid;
  1175. oidstr="1.3.6.1.4.1."+oidstr;
  1176. HTREEITEM hp,hr;
  1177. hr=m_tree.GetRootItem();
  1178. hp=FindNode(hr,parent);
  1179. if (hp!=NULL)
  1180. {
  1181. hr=m_tree.InsertItem((LPCTSTR)name,1,1,hp);
  1182. MibNode* pNode;
  1183. pNode=new MibNode;
  1184. InitNodeData(pNode);
  1185. pNode->POid=oidstr;
  1186. pNode->PAccess="not-accessable";
  1187. m_tree.SetItemData(hr,(DWORD)pNode);
  1188. AfxMessageBox("注册成功!");
  1189. CStdioFile OidFile;
  1190. if(OidFile.Open("mib/oid.txt",CFile::modeWrite))
  1191. {
  1192. OidFile.SeekToEnd();
  1193.                 OidFile.WriteString(parent+"rn");
  1194. OidFile.WriteString(name+"rn");
  1195. OidFile.WriteString(oidstr+"rn");
  1196. OidFile.Close();
  1197. }
  1198. else
  1199. AfxMessageBox("打开文件oid.txt错误!");
  1200. }
  1201. }
  1202. }
  1203. void CMibBrowserView::OnSave() 
  1204. {
  1205. // TODO: Add your command handler code here
  1206. CStdioFile kvFile;
  1207. CString line;
  1208.     CFileDialog openfile(FALSE,"*.txt","mib",
  1209.  OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
  1210.  "Text files(*.txt)|*.txt");
  1211. if (openfile.DoModal()==IDOK)
  1212. {
  1213. if(kvFile.Open(openfile.GetPathName(),
  1214.       CFile::modeWrite|CFile::modeCreate))
  1215. {
  1216.  int num=m_list.GetItemCount();
  1217.  for (int i=0;i<num;++i)
  1218.  {
  1219.           line=m_list.GetItemText(i,0);
  1220.   line=line+"="+m_list.GetItemText(i,1)+"rn";
  1221.           kvFile.WriteString(line);
  1222.  }
  1223.  
  1224.      }
  1225.     kvFile.Close();
  1226. }
  1227. }