NotifyReceive.cpp
上传用户:czjinwang
上传日期:2007-01-12
资源大小:2484k
文件大小:7k
源码类别:

SNMP编程

开发平台:

Visual C++

  1. /*============================================================================
  2.   Copyright (c) 1996
  3.   Hewlett-Packard Company
  4.   ATTENTION: USE OF THIS SOFTWARE IS SUBJECT TO THE FOLLOWING TERMS.
  5.   Permission to use, copy, modify, distribute and/or sell this software 
  6.   and/or its documentation is hereby granted without fee. User agrees 
  7.   to display the above copyright notice and this license notice in all 
  8.   copies of the software and any documentation of the software. User 
  9.   agrees to assume all liability for the use of the software; Hewlett-Packard 
  10.   makes no representations about the suitability of this software for any 
  11.   purpose. It is provided "AS-IS without warranty of any kind,either express 
  12.   or implied. User hereby grants a royalty-free license to any and all 
  13.   derivatives based upon this software code base. 
  14. =============================================================================*/
  15. #include "stdafx.h"
  16. #include "browser.h"
  17. #include "NotifyReceive.h"
  18. #include "NotifyFilter.h"
  19. #ifdef _DEBUG
  20. #define new DEBUG_NEW
  21. #undef THIS_FILE
  22. static char THIS_FILE[] = __FILE__;
  23. #endif
  24. /////////////////////////////////////////////////////////////////////////////
  25. // NotifyReceive dialog
  26. void my_trap_callback ( int reason, 
  27.                         Snmp* session,                 // session handle
  28.                         Pdu & pdu,                     // trap pdu
  29.                         SnmpTarget & target,           // source of the trap
  30.                         unsigned long callback_data)   // optional callback data
  31. {
  32.   NotifyReceive *me;
  33.   me = (NotifyReceive *) callback_data;
  34.   CTreeCtrl *tree;
  35.   tree = (CTreeCtrl *) me->GetDlgItem( IDC_NOTIFIES);
  36.   CString outbuff;
  37.   HTREEITEM new_node, vb_node;
  38.   Oid coldStart("1.3.6.1.6.3.1.1.5.1");
  39.       Oid warmStart("1.3.6.1.6.3.1.1.5.2");
  40.       Oid linkUp("1.3.6.1.6.3.1.1.5.4");
  41.       Oid linkDown("1.3.6.1.6.3.1.1.5.3");
  42.       Oid authenticationFailure("1.3.6.1.6.3.1.1.5.5");
  43.       Oid egpNeighborLoss("1.3.6.1.6.3.1.1.5.6");
  44.   // get the address
  45.   GenAddress genaddress;
  46.   target.get_address( genaddress);
  47.   // determine the type of trap
  48.   Oid trapid;
  49.   pdu.get_notify_id( trapid);
  50.   if ( trapid == coldStart)
  51.         outbuff = "ColdStart ";
  52.       else if ( trapid == warmStart)
  53.         outbuff = "WarmStart ";
  54.       else if ( trapid == linkUp)
  55.         outbuff = "LinkUp ";
  56.       else  if ( trapid == linkDown)
  57.         outbuff = "LinkDown ";
  58.       else if ( trapid == authenticationFailure)
  59.         outbuff = "AuthFail ";
  60.       else if ( trapid ==  egpNeighborLoss)
  61.         outbuff = "EgpLoss ";
  62.       else
  63.       {
  64.         outbuff = "Enterprise Specific (";
  65.         outbuff += trapid.get_printable();
  66.         outbuff += ") ";
  67.       }
  68.   
  69.   // display where the trap came from
  70.   outbuff += " From ";
  71.   outbuff += genaddress.get_printable();
  72.   new_node = tree->InsertItem( outbuff);
  73.   // show the timestamp
  74.   outbuff = "TimeStamp = ";
  75.   TimeTicks timestamp;
  76.   pdu.get_notify_timestamp( timestamp);
  77.   outbuff += timestamp.get_printable();
  78.   tree->InsertItem( outbuff, new_node);
  79.   // show the enterprise
  80.   outbuff = "Enterprise = ";
  81.   Oid enterprise;
  82.   pdu.get_notify_enterprise( enterprise);
  83.   outbuff += enterprise.get_printable();
  84.   // don't show if we don't have one
  85.   if ( enterprise != "0.0")
  86.     tree->InsertItem( outbuff, new_node);
  87.   
  88.   // show all the vbs in the trap payload
  89.   if ( pdu.get_vb_count() >0)
  90.   {
  91.   outbuff = "Payload";
  92.   new_node = tree->InsertItem( outbuff, new_node);
  93.   }
  94.   char vbname[40];
  95.   Vb vb;
  96.   for (int x=0;x<pdu.get_vb_count();x++)
  97.   {
  98.   sprintf( vbname,"Variable Binding #%d",x+1);
  99.      vb_node = tree->InsertItem( vbname, new_node);
  100.   pdu.get_vb( vb,x);
  101.   outbuff = "Oid = ";
  102.   outbuff += vb.get_printable_oid();
  103.   tree->InsertItem(outbuff,vb_node);
  104.   outbuff = "Value = ";
  105.   outbuff += vb.get_printable_value();
  106.   tree->InsertItem( outbuff, vb_node);
  107.   }
  108. };
  109. NotifyReceive::NotifyReceive(CWnd* pParent /*=NULL*/)
  110. : CDialog(NotifyReceive::IDD, pParent)
  111. {
  112. //{{AFX_DATA_INIT(NotifyReceive)
  113. // NOTE: the ClassWizard will add member initialization here
  114. //}}AFX_DATA_INIT
  115. int cstatus = Create(IDD, pParent);
  116. // create a snmp++ object
  117. int status;
  118. TargetCollection targets;  // empty get all from all targets
  119. snmp = new Snmp( status);
  120. if ( status != SNMP_CLASS_SUCCESS)
  121. {
  122. AfxMessageBox("Unable To Create Snmp Object!");
  123. snmp = NULL;
  124. }
  125. // start out with all filters enabled
  126. Oid coldStart("1.3.6.1.6.3.1.1.5.1");
  127. my_filters += coldStart;
  128.     Oid warmStart("1.3.6.1.6.3.1.1.5.2");
  129. my_filters += warmStart;
  130.     Oid linkUp("1.3.6.1.6.3.1.1.5.4");
  131. my_filters += linkUp;
  132.     Oid linkDown("1.3.6.1.6.3.1.1.5.3");
  133. my_filters += linkDown;
  134.     Oid authenticationFailure("1.3.6.1.6.3.1.1.5.5");
  135. my_filters += authenticationFailure;
  136.     Oid egpNeighborLoss("1.3.6.1.6.3.1.1.5.6");
  137. my_filters += egpNeighborLoss;
  138. status = snmp->notify_register( my_filters,targets, 
  139.                                     (snmp_callback) &my_trap_callback,
  140.                                     (void *) this);
  141.     if ( status != SNMP_CLASS_SUCCESS)
  142.            AfxMessageBox("Unable to Regsiter For Traps");
  143. }
  144. void NotifyReceive::DoDataExchange(CDataExchange* pDX)
  145. {
  146. CDialog::DoDataExchange(pDX);
  147. //{{AFX_DATA_MAP(NotifyReceive)
  148. // NOTE: the ClassWizard will add DDX and DDV calls here
  149. //}}AFX_DATA_MAP
  150. }
  151. BEGIN_MESSAGE_MAP(NotifyReceive, CDialog)
  152. //{{AFX_MSG_MAP(NotifyReceive)
  153. ON_BN_CLICKED(IDC_CLEAR, OnClear)
  154. ON_BN_CLICKED(IDC_FILTERS, OnFilters)
  155. //}}AFX_MSG_MAP
  156. END_MESSAGE_MAP()
  157. /////////////////////////////////////////////////////////////////////////////
  158. // NotifyReceive message handlers
  159. void NotifyReceive::OnClear() 
  160. {
  161. // TODO: Add your control notification handler code here
  162. // TODO: Add extra initialization here
  163. CTreeCtrl *tree;
  164. tree = (CTreeCtrl *) GetDlgItem( IDC_NOTIFIES);
  165. tree->DeleteAllItems();
  166. }
  167. BOOL NotifyReceive::OnInitDialog() 
  168. {
  169. CDialog::OnInitDialog();
  170. // clear the tree control
  171. OnClear();
  172. return TRUE;  // return TRUE unless you set the focus to a control
  173.               // EXCEPTION: OCX Property Pages should return FALSE
  174. }
  175. void NotifyReceive::OnCancel() 
  176. {
  177. // TODO: Add extra cleanup here
  178. DestroyWindow();
  179. }
  180. void NotifyReceive::OnFilters() 
  181. {
  182. // TODO: Add your control notification handler code here
  183. NotifyFilter nf;
  184. // assign the dialog class filters my_filters
  185. nf.filters = my_filters;
  186. // invoke as modal 
  187. nf.DoModal();
  188. // get the filters back
  189. my_filters = nf.filters;
  190. // reset the snmp++ filtering
  191. TargetCollection targets;
  192. // use another temporary collection
  193. // if all selected then use an empty set to denote all
  194. int status = snmp->notify_register( my_filters,targets, 
  195.                                         (snmp_callback) &my_trap_callback,
  196.                                         (void *) this);
  197.     if ( status != SNMP_CLASS_SUCCESS)
  198.            AfxMessageBox("Unable to Register For Traps");
  199. }