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

SNMP编程

开发平台:

Visual C++

  1. /*============================================================================
  2.   
  3.  Copyright (c) 1996
  4.   Hewlett-Packard Company
  5.   ATTENTION: USE OF THIS SOFTWARE IS SUBJECT TO THE FOLLOWING TERMS.
  6.   Permission to use, copy, modify, distribute and/or sell this software 
  7.   and/or its documentation is hereby granted without fee. User agrees 
  8.   to display the above copyright notice and this license notice in all 
  9.   copies of the software and any documentation of the software. User 
  10.   agrees to assume all liability for the use of the software; Hewlett-Packard 
  11.   makes no representations about the suitability of this software for any 
  12.   purpose. It is provided "AS-IS without warranty of any kind,either express 
  13.   or implied. User hereby grants a royalty-free license to any and all 
  14.   derivatives based upon this software code base. 
  15. =============================================================================*/
  16. #include "stdafx.h"
  17. #include "browser.h"
  18. #include "set.h"
  19. #include "db_cls.h"
  20. #include "tarinc.h"
  21. #include "oidtable.h"
  22. #include "vbopts.h"
  23. #include "tarfact.h"
  24. #ifdef _DEBUG
  25. #define new DEBUG_NEW
  26. #undef THIS_FILE
  27. static char THIS_FILE[] = __FILE__;
  28. #endif
  29. /////////////////////////////////////////////////////////////////////////////
  30. // Set dialog
  31. Set::Set(CWnd* pParent /*=NULL*/)
  32. : CDialog(Set::IDD, pParent)
  33. {
  34. //{{AFX_DATA_INIT(Set)
  35. m_read_community = _T("");
  36. m_write_community = _T("");
  37. m_retries = _T("");
  38. m_timeouts = _T("");
  39. m_mgmt_proto = _T("");
  40. m_net_proto = _T("");
  41. m_oid = _T("");
  42. m_output = _T("");
  43. //}}AFX_DATA_INIT
  44. int cstatus = Create(IDD, pParent);
  45. // create a snmp++ object
  46. int status;
  47. snmp = new Snmp( status);
  48. if ( status != SNMP_CLASS_SUCCESS)
  49. {
  50. AfxMessageBox("Unable To Create Snmp Object!");
  51. snmp = NULL;
  52. }
  53. // load up the target list
  54.     CComboBox * target_cb = ( CComboBox *) GetDlgItem( IDC_TARGETS);
  55.     target_cb->ResetContent();
  56.     // get the db file name from the ini file
  57.     CString filename = theApp.GetProfileString( BROWSER_VALUE,DB_NAME,DEF_DB_NAME);
  58. // access the target database
  59.     Db target_db;
  60. TargetDb_Rec db_rec;
  61.     target_db.set_attributtes( filename, sizeof( TargetDb_Rec));
  62.     int nr = target_db.get_num_recs();
  63. if ( nr==0)
  64. AfxMessageBox("You Have No Targets Definedn Please Define a Target");
  65. // for all records, get and display
  66.     for (int i=1;i<=nr;i++)
  67.     {
  68.        if ((status = target_db.retrieve((long int) (i-1), &db_rec))!= DB_OK)
  69.        {
  70.           MessageBox("Unable to Read Target DB Record", ERR_MSG,MB_ICONSTOP);
  71.           return;
  72.        }
  73.    CString target_name;
  74.    if ( strcmp( db_rec.alias,"") ==0)
  75.          target_cb->AddString((char*)  db_rec.key);
  76.    else
  77.    {
  78.  target_name = db_rec.alias;
  79.  target_name += " @ ";
  80.  target_name += db_rec.key;
  81.  target_cb->AddString(target_name);
  82.    }
  83.        if ( i==1)
  84.        {
  85.           target_cb->SetCurSel(0);
  86.           load_target_attribs( db_rec);
  87.        }
  88. }
  89. }
  90. // load the current target view
  91. void Set::load_target_attribs( TargetDb_Rec db_rec)
  92. {
  93.    char buffer[20];
  94.    m_read_community = db_rec.read_community;
  95.    m_write_community = db_rec.write_community;
  96.    sprintf( buffer,"%d",db_rec.retries);
  97.    m_retries = buffer;
  98.    sprintf( buffer,"%d",db_rec.timeout);
  99.    m_timeouts = buffer;
  100.    m_mgmt_proto = (db_rec.snmp_type == SNMPV1) ? V1 :V2C;
  101.    m_net_proto =  (db_rec.address_type == IP_TYPE) ? "IP" : "IPX";
  102.    UpdateData( FALSE);
  103. };
  104. // load up the Ctree control with the MIB table
  105. void Set::load_mib_view( CTreeCtrl *tree)
  106. {
  107.  CString name;
  108.  Oid current_oid, parent_oid, next_oid,prev_parent_oid,*oid_ptr;
  109.  HTREEITEM new_node, parent_node, previous_parent;
  110.  parent_node = previous_parent = TVI_ROOT;
  111.  for (int x=0;x<MAXMIBVALS; x++)
  112.  {
  113.     name = MIBVals[x][0];   
  114. current_oid = MIBVals[x][2];   
  115. next_oid = ((x+1)==MAXMIBVALS)?"":MIBVals[x+1][2];   
  116. if ( current_oid.len() <= parent_oid.len())
  117. {
  118. parent_node = previous_parent;
  119. parent_oid = prev_parent_oid;
  120. }
  121. // add the node
  122. new_node = tree->InsertItem( name,parent_node);
  123. oid_ptr = new Oid( current_oid);
  124. if ( strcmp(MIBVals[x][1],SCALAR)==0)
  125.    (*oid_ptr)+="0";
  126. tree->SetItemData( new_node, (DWORD) oid_ptr);
  127. if ( name == "sysDescr")
  128.    tree->SelectItem( new_node);
  129. if (( current_oid.len() > parent_oid.len()) && ( current_oid.len() < next_oid.len()))
  130. {
  131.    previous_parent = parent_node;  
  132.    parent_node = new_node;         
  133.    prev_parent_oid = parent_oid;
  134.    parent_oid = current_oid;        
  135. }
  136.  };
  137. };
  138. // enable the controls
  139. void Set::enable_controls( int state)
  140. {
  141.    CWnd *control;
  142.    control = GetDlgItem( IDC_TARGETS);
  143.    control->EnableWindow( state ? TRUE : FALSE);
  144.    control = GetDlgItem( IDC_MIBTREE);
  145.    control->EnableWindow( state ? TRUE : FALSE);
  146.    control = GetDlgItem( IDC_ADD);
  147.    control->EnableWindow( state ? TRUE : FALSE);
  148.    control = GetDlgItem( IDC_REMOVE);
  149.    control->EnableWindow( state ? TRUE : FALSE);
  150.    control = GetDlgItem( IDC_PDU);
  151.    control->EnableWindow( state ? TRUE : FALSE);
  152.    control = GetDlgItem( IDC_OID);
  153.    control->EnableWindow( state ? TRUE : FALSE);
  154.    control = GetDlgItem( IDC_ADDOID);
  155.    control->EnableWindow( state ? TRUE : FALSE);
  156.    control = GetDlgItem( IDC_ALL_DETAILS);
  157.    control->EnableWindow( state ? TRUE : FALSE);
  158.    control = GetDlgItem( IDC_EDIT);
  159.    control->EnableWindow( state ? TRUE : FALSE);
  160. };
  161. // recursive delete of CtreeCtrl Items
  162. void Set::delete_nodes( CTreeCtrl *tree, HTREEITEM node)
  163. {
  164.     HTREEITEM next_node;
  165. Oid * oid_ptr;
  166.     next_node = tree->GetChildItem( node);
  167. if ( next_node != NULL)
  168. delete_nodes( tree, next_node);
  169. next_node = tree->GetNextSiblingItem( node);
  170. if ( next_node != NULL)
  171. delete_nodes( tree, next_node);
  172. oid_ptr = (Oid *) tree->GetItemData( node);
  173. if ( oid_ptr != NULL)
  174.    delete oid_ptr;
  175. }
  176. void Set::DoDataExchange(CDataExchange* pDX)
  177. {
  178. CDialog::DoDataExchange(pDX);
  179. //{{AFX_DATA_MAP(Set)
  180. DDX_Text(pDX, IDC_READ_COMMUNITY, m_read_community);
  181. DDX_Text(pDX, IDC_WRITE_COMMUNITY, m_write_community);
  182. DDX_Text(pDX, IDC_RETRIES, m_retries);
  183. DDX_Text(pDX, IDC_TIMEOUTS, m_timeouts);
  184. DDX_Text(pDX, IDC_MGMTPROTO, m_mgmt_proto);
  185. DDX_Text(pDX, IDC_NETPROTO, m_net_proto);
  186. DDX_Text(pDX, IDC_OID, m_oid);
  187. DDV_MaxChars(pDX, m_oid, 200);
  188. DDX_Text(pDX, IDC_OUTPUT, m_output);
  189. //}}AFX_DATA_MAP
  190. }
  191. BEGIN_MESSAGE_MAP(Set, CDialog)
  192. //{{AFX_MSG_MAP(Set)
  193. ON_CBN_SELCHANGE(IDC_TARGETS, OnSelchangeTargets)
  194. ON_WM_DESTROY()
  195. ON_BN_CLICKED(IDC_ADD, OnAdd)
  196. ON_BN_CLICKED(IDC_ADDOID, OnAddoid)
  197. ON_BN_CLICKED(IDC_EDIT, OnEdit)
  198. ON_BN_CLICKED(IDC_REMOVE, OnRemove)
  199. ON_BN_CLICKED(IDSET, OnSet)
  200. ON_LBN_DBLCLK(IDC_PDU, OnDblclkPdu)
  201. ON_NOTIFY(NM_DBLCLK, IDC_MIBTREE, OnDblclkMibtree)
  202. //}}AFX_MSG_MAP
  203. END_MESSAGE_MAP()
  204. /////////////////////////////////////////////////////////////////////////////
  205. // Set message handlers
  206. void Set::OnDestroy() 
  207. {
  208. CDialog::OnDestroy();
  209. CTreeCtrl *tree;
  210. tree = (CTreeCtrl *) GetDlgItem( IDC_MIBTREE);
  211. delete_nodes( tree, tree->GetRootItem());
  212. }
  213. BOOL Set::OnInitDialog() 
  214. {
  215. CDialog::OnInitDialog();
  216. CenterWindow();
  217. // load up the MIB tree control
  218. CTreeCtrl *tree;
  219. tree = (CTreeCtrl *) GetDlgItem( IDC_MIBTREE);
  220. load_mib_view( tree);
  221. // clear the pdu table
  222. CListBox *lb;
  223. lb= ( CListBox*) GetDlgItem( IDC_PDU);
  224. lb->ResetContent();
  225. return TRUE;  // return TRUE unless you set the focus to a control
  226.               // EXCEPTION: OCX Property Pages should return FALSE
  227. }
  228. void Set::OnAdd() 
  229. {
  230. CTreeCtrl *tree;
  231. HTREEITEM node;
  232. Oid *oid_ptr;
  233. tree = (CTreeCtrl *) GetDlgItem( IDC_MIBTREE);
  234. node = tree->GetSelectedItem();
  235. oid_ptr = (Oid *) tree->GetItemData( node);
  236. if ( (*oid_ptr)[ oid_ptr->len() -1 ] != 0)
  237. {
  238. AfxMessageBox("You Must Select A Scalar MIB Object");
  239. return;
  240. }
  241. Oid addoid( oid_ptr->get_printable());
  242. VbOpts vb_options;
  243. vb_options.m_vboid = addoid.get_printable();
  244. int status;
  245. status = vb_options.DoModal();
  246. if ( vb_options.my_vb.valid())
  247. {
  248.    CListBox *lb;
  249.    lb = ( CListBox*) GetDlgItem( IDC_PDU);
  250.    CString scalar;
  251.    scalar += addoid.get_printable();
  252.    int spot = lb->InsertString( lb->GetCount(),scalar);
  253.    if ( spot >= MAX_SET_VBS)
  254.    AfxMessageBox("Exeeded Maximum Set Vbs!");
  255.    else
  256.       set_vbs[ spot ] =  vb_options.my_vb;
  257. }
  258. }
  259. void Set::OnAddoid() 
  260. {
  261. UpdateData( TRUE);
  262. Oid oid( m_oid);
  263. if ( oid.valid())
  264. {
  265.    VbOpts vb_options;
  266.    vb_options.m_vboid = oid.get_printable();
  267.    int status;
  268.    status = vb_options.DoModal();
  269.    if ( vb_options.my_vb.valid()) {
  270.       CListBox *lb;
  271.       lb = ( CListBox*) GetDlgItem( IDC_PDU);
  272.       CString item;
  273.       item += oid.get_printable();
  274.           int spot = lb->InsertString( lb->GetCount(),item);
  275.   if ( spot >= MAX_SET_VBS)
  276.      AfxMessageBox("Exeeded Maximum Set Vbs!");
  277.       else
  278.      set_vbs[spot] = vb_options.my_vb;
  279.    }
  280. }
  281. else
  282. AfxMessageBox("Invalid Custom MIB Object Identifier");
  283. }
  284. void Set::OnEdit() 
  285. {
  286. CListBox *lb;
  287. int selection;
  288. char item_data[100];
  289. lb = ( CListBox*) GetDlgItem( IDC_PDU);
  290. UpdateData( TRUE);
  291. // make sure we have an item selected
  292. if((selection = lb->GetCurSel()) == LB_ERR)
  293. {
  294. AfxMessageBox("You Must Select an Item to Edit");
  295.     return;
  296. }
  297. // get the item text
  298. if ( (lb->GetText( selection, item_data)) == LB_ERR)
  299.     {
  300.        AfxMessageBox("Can Not Obtain List Box Selection");
  301.        return;
  302.     }
  303. Oid addoid( item_data);
  304. VbOpts vb_options;
  305. vb_options.m_vboid = addoid.get_printable();
  306. vb_options.m_vbvalue =  set_vbs[selection].get_printable_value();
  307. int status;
  308. status = vb_options.DoModal();
  309. if ( vb_options.my_vb.valid())
  310. {
  311.    CString scalar;
  312.    scalar += addoid.get_printable();
  313.    lb->DeleteString( selection);
  314.    lb->InsertString( selection,scalar);
  315.    // update the pdu's vb
  316.    set_vbs[selection] =  vb_options.my_vb;
  317. }
  318. }
  319. void Set::OnRemove() 
  320. {
  321. CListBox *lb;
  322. int selection;
  323. lb = ( CListBox*) GetDlgItem( IDC_PDU);
  324. int count = lb->GetCount();
  325. // delete it
  326. if((selection = lb->GetCurSel()) != LB_ERR)
  327. lb->DeleteString( selection);
  328. // relink the set vb list if needed
  329. for (int x=selection;x<(count-1);x++)
  330. set_vbs[x] = set_vbs[x+1];
  331. }
  332. void Set::OnSelchangeTargets() 
  333. {
  334. // access the target database
  335.     Db target_db;
  336. TargetDb_Rec db_rec;
  337. char key[80];
  338. char *ptr,*address;
  339. int status;
  340.  
  341.     CComboBox * target_cb = ( CComboBox *) GetDlgItem( IDC_TARGETS);
  342. target_cb->GetLBText( target_cb->GetCurSel() , key);
  343. // trim off alias, if present
  344. address = key;
  345. ptr = key;
  346. while (*ptr != 0)
  347. {
  348. if ( *ptr == '@')
  349.    address = ptr+2;
  350.    ptr++;
  351. }
  352.     // get the db file name from the ini file
  353.     CString filename = theApp.GetProfileString( BROWSER_VALUE,DB_NAME,DEF_DB_NAME);
  354. target_db.set_attributtes( filename, sizeof( TargetDb_Rec));
  355.     strcpy( db_rec.key,address);
  356.     status = target_db.read( &db_rec);
  357.     if ( status != DB_OK)
  358.     {
  359.        MessageBox( "Unable to Read Target Record",ERR_MSG,MB_ICONSTOP);
  360.        return;
  361.     }
  362.     load_target_attribs( db_rec);
  363. }
  364. void Set::OnSet() 
  365. {
  366. CListBox *lb;
  367. lb = ( CListBox*) GetDlgItem( IDC_PDU);
  368. Pdu pdu;
  369. int vb_count = lb->GetCount();
  370. if ( vb_count == 0)
  371. {
  372. AfxMessageBox("You have No Variable Bindings to Set");
  373. return;
  374. }
  375. pdu.set_vblist( set_vbs, vb_count);
  376. // make a SnmpTarget using the Target_Factory
  377. CComboBox *cb = ( CComboBox *) GetDlgItem( IDC_TARGETS);
  378. char key[80];
  379.     if ( cb->GetCurSel() == CB_ERR)
  380.     {
  381.        AfxMessageBox("No Target Selected!");
  382.        return;
  383.     }
  384. cb->GetLBText( cb->GetCurSel(), key); 
  385. // get a target from the target factory
  386. SnmpTarget *target = target_factory( key);
  387. if ( target == NULL)
  388. {
  389. AfxMessageBox("Unable To find Target");
  390. return;
  391. }
  392. m_output = "SNMP++ Set in Progress...";
  393. UpdateData( FALSE);
  394. enable_controls( FALSE);
  395. // Invoke a SNMP++ Get for the Pdu requested
  396. // from the target created
  397. int status = snmp->set( pdu,
  398.                             *target);
  399. // display the response
  400. display_response( status, pdu, *target, snmp);
  401. enable_controls( TRUE);
  402. delete target;
  403. }
  404. // display the response value
  405. void Set::display_response( int status, Pdu &pdu, SnmpTarget &target, Snmp * snmp)
  406. {
  407.    GenAddress address;   // SNMP++ generic Address
  408.    char buffer[100];      // each output line up to 1000 chars in length
  409.    Vb vb;
  410.    // show the status
  411.    m_output = "";
  412.    m_output +="Status = ";
  413.    m_output += snmp->error_msg( status);
  414.    m_output += "rn";
  415.    // show the details if check box is selected
  416.    CButton * all_details = (CButton*) GetDlgItem( IDC_ALL_DETAILS);
  417.    if ( all_details->GetCheck())
  418.    {
  419.       target.get_address( address);
  420.       m_output += "Response from ";
  421.   m_output += address.get_printable();
  422.   m_output += "rn";
  423.       sprintf( buffer,"Error Status = %d ,",pdu.get_error_status());
  424.       m_output += buffer;
  425.   m_output += snmp->error_msg( pdu.get_error_status());
  426.   m_output += "rn";
  427.       sprintf( buffer,"Error Index = %drn", pdu.get_error_index());
  428.       m_output += buffer;
  429.   sprintf( buffer,"Request ID = %ldrn",pdu.get_request_id());
  430.   m_output += buffer;
  431.       sprintf( buffer,"Variable Binding Count = %drn",pdu.get_vb_count());
  432.       m_output += buffer;
  433.    }
  434.    // show the Vbs
  435.    for ( int x=0;x<pdu.get_vb_count();x++)
  436.    {
  437.       pdu.get_vb( vb,x);
  438.   sprintf( buffer,"Vb #%drn",x+1);
  439.   m_output += buffer;
  440.   m_output += "  Oid   = ";
  441.   m_output += vb.get_printable_oid();
  442.   m_output += "rn";
  443.   m_output += "  Value = ";
  444.   m_output += vb.get_printable_value();
  445.   m_output += "rn";
  446.    }
  447.    // update the output display
  448.    UpdateData( FALSE);
  449. };
  450. void Set::OnDblclkPdu() 
  451. {
  452. OnEdit();
  453. }
  454. void Set::OnDblclkMibtree(NMHDR* pNMHDR, LRESULT* pResult) 
  455. {
  456. OnAdd();
  457. *pResult = 0;
  458. }
  459. void Set::OnCancel() 
  460. {
  461. DestroyWindow();
  462. }