Set.cpp
资源名称:hp_snmp3.zip [点击查看]
上传用户:czjinwang
上传日期:2007-01-12
资源大小:2484k
文件大小:14k
源码类别:
SNMP编程
开发平台:
Visual C++
- /*============================================================================
- Copyright (c) 1996
- Hewlett-Packard Company
- ATTENTION: USE OF THIS SOFTWARE IS SUBJECT TO THE FOLLOWING TERMS.
- Permission to use, copy, modify, distribute and/or sell this software
- and/or its documentation is hereby granted without fee. User agrees
- to display the above copyright notice and this license notice in all
- copies of the software and any documentation of the software. User
- agrees to assume all liability for the use of the software; Hewlett-Packard
- makes no representations about the suitability of this software for any
- purpose. It is provided "AS-IS without warranty of any kind,either express
- or implied. User hereby grants a royalty-free license to any and all
- derivatives based upon this software code base.
- =============================================================================*/
- #include "stdafx.h"
- #include "browser.h"
- #include "set.h"
- #include "db_cls.h"
- #include "tarinc.h"
- #include "oidtable.h"
- #include "vbopts.h"
- #include "tarfact.h"
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
- /////////////////////////////////////////////////////////////////////////////
- // Set dialog
- Set::Set(CWnd* pParent /*=NULL*/)
- : CDialog(Set::IDD, pParent)
- {
- //{{AFX_DATA_INIT(Set)
- m_read_community = _T("");
- m_write_community = _T("");
- m_retries = _T("");
- m_timeouts = _T("");
- m_mgmt_proto = _T("");
- m_net_proto = _T("");
- m_oid = _T("");
- m_output = _T("");
- //}}AFX_DATA_INIT
- int cstatus = Create(IDD, pParent);
- // create a snmp++ object
- int status;
- snmp = new Snmp( status);
- if ( status != SNMP_CLASS_SUCCESS)
- {
- AfxMessageBox("Unable To Create Snmp Object!");
- snmp = NULL;
- }
- // load up the target list
- CComboBox * target_cb = ( CComboBox *) GetDlgItem( IDC_TARGETS);
- target_cb->ResetContent();
- // get the db file name from the ini file
- CString filename = theApp.GetProfileString( BROWSER_VALUE,DB_NAME,DEF_DB_NAME);
- // access the target database
- Db target_db;
- TargetDb_Rec db_rec;
- target_db.set_attributtes( filename, sizeof( TargetDb_Rec));
- int nr = target_db.get_num_recs();
- if ( nr==0)
- AfxMessageBox("You Have No Targets Definedn Please Define a Target");
- // for all records, get and display
- for (int i=1;i<=nr;i++)
- {
- if ((status = target_db.retrieve((long int) (i-1), &db_rec))!= DB_OK)
- {
- MessageBox("Unable to Read Target DB Record", ERR_MSG,MB_ICONSTOP);
- return;
- }
- CString target_name;
- if ( strcmp( db_rec.alias,"") ==0)
- target_cb->AddString((char*) db_rec.key);
- else
- {
- target_name = db_rec.alias;
- target_name += " @ ";
- target_name += db_rec.key;
- target_cb->AddString(target_name);
- }
- if ( i==1)
- {
- target_cb->SetCurSel(0);
- load_target_attribs( db_rec);
- }
- }
- }
- // load the current target view
- void Set::load_target_attribs( TargetDb_Rec db_rec)
- {
- char buffer[20];
- m_read_community = db_rec.read_community;
- m_write_community = db_rec.write_community;
- sprintf( buffer,"%d",db_rec.retries);
- m_retries = buffer;
- sprintf( buffer,"%d",db_rec.timeout);
- m_timeouts = buffer;
- m_mgmt_proto = (db_rec.snmp_type == SNMPV1) ? V1 :V2C;
- m_net_proto = (db_rec.address_type == IP_TYPE) ? "IP" : "IPX";
- UpdateData( FALSE);
- };
- // load up the Ctree control with the MIB table
- void Set::load_mib_view( CTreeCtrl *tree)
- {
- CString name;
- Oid current_oid, parent_oid, next_oid,prev_parent_oid,*oid_ptr;
- HTREEITEM new_node, parent_node, previous_parent;
- parent_node = previous_parent = TVI_ROOT;
- for (int x=0;x<MAXMIBVALS; x++)
- {
- name = MIBVals[x][0];
- current_oid = MIBVals[x][2];
- next_oid = ((x+1)==MAXMIBVALS)?"":MIBVals[x+1][2];
- if ( current_oid.len() <= parent_oid.len())
- {
- parent_node = previous_parent;
- parent_oid = prev_parent_oid;
- }
- // add the node
- new_node = tree->InsertItem( name,parent_node);
- oid_ptr = new Oid( current_oid);
- if ( strcmp(MIBVals[x][1],SCALAR)==0)
- (*oid_ptr)+="0";
- tree->SetItemData( new_node, (DWORD) oid_ptr);
- if ( name == "sysDescr")
- tree->SelectItem( new_node);
- if (( current_oid.len() > parent_oid.len()) && ( current_oid.len() < next_oid.len()))
- {
- previous_parent = parent_node;
- parent_node = new_node;
- prev_parent_oid = parent_oid;
- parent_oid = current_oid;
- }
- };
- };
- // enable the controls
- void Set::enable_controls( int state)
- {
- CWnd *control;
- control = GetDlgItem( IDC_TARGETS);
- control->EnableWindow( state ? TRUE : FALSE);
- control = GetDlgItem( IDC_MIBTREE);
- control->EnableWindow( state ? TRUE : FALSE);
- control = GetDlgItem( IDC_ADD);
- control->EnableWindow( state ? TRUE : FALSE);
- control = GetDlgItem( IDC_REMOVE);
- control->EnableWindow( state ? TRUE : FALSE);
- control = GetDlgItem( IDC_PDU);
- control->EnableWindow( state ? TRUE : FALSE);
- control = GetDlgItem( IDC_OID);
- control->EnableWindow( state ? TRUE : FALSE);
- control = GetDlgItem( IDC_ADDOID);
- control->EnableWindow( state ? TRUE : FALSE);
- control = GetDlgItem( IDC_ALL_DETAILS);
- control->EnableWindow( state ? TRUE : FALSE);
- control = GetDlgItem( IDC_EDIT);
- control->EnableWindow( state ? TRUE : FALSE);
- };
- // recursive delete of CtreeCtrl Items
- void Set::delete_nodes( CTreeCtrl *tree, HTREEITEM node)
- {
- HTREEITEM next_node;
- Oid * oid_ptr;
- next_node = tree->GetChildItem( node);
- if ( next_node != NULL)
- delete_nodes( tree, next_node);
- next_node = tree->GetNextSiblingItem( node);
- if ( next_node != NULL)
- delete_nodes( tree, next_node);
- oid_ptr = (Oid *) tree->GetItemData( node);
- if ( oid_ptr != NULL)
- delete oid_ptr;
- }
- void Set::DoDataExchange(CDataExchange* pDX)
- {
- CDialog::DoDataExchange(pDX);
- //{{AFX_DATA_MAP(Set)
- DDX_Text(pDX, IDC_READ_COMMUNITY, m_read_community);
- DDX_Text(pDX, IDC_WRITE_COMMUNITY, m_write_community);
- DDX_Text(pDX, IDC_RETRIES, m_retries);
- DDX_Text(pDX, IDC_TIMEOUTS, m_timeouts);
- DDX_Text(pDX, IDC_MGMTPROTO, m_mgmt_proto);
- DDX_Text(pDX, IDC_NETPROTO, m_net_proto);
- DDX_Text(pDX, IDC_OID, m_oid);
- DDV_MaxChars(pDX, m_oid, 200);
- DDX_Text(pDX, IDC_OUTPUT, m_output);
- //}}AFX_DATA_MAP
- }
- BEGIN_MESSAGE_MAP(Set, CDialog)
- //{{AFX_MSG_MAP(Set)
- ON_CBN_SELCHANGE(IDC_TARGETS, OnSelchangeTargets)
- ON_WM_DESTROY()
- ON_BN_CLICKED(IDC_ADD, OnAdd)
- ON_BN_CLICKED(IDC_ADDOID, OnAddoid)
- ON_BN_CLICKED(IDC_EDIT, OnEdit)
- ON_BN_CLICKED(IDC_REMOVE, OnRemove)
- ON_BN_CLICKED(IDSET, OnSet)
- ON_LBN_DBLCLK(IDC_PDU, OnDblclkPdu)
- ON_NOTIFY(NM_DBLCLK, IDC_MIBTREE, OnDblclkMibtree)
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
- /////////////////////////////////////////////////////////////////////////////
- // Set message handlers
- void Set::OnDestroy()
- {
- CDialog::OnDestroy();
- CTreeCtrl *tree;
- tree = (CTreeCtrl *) GetDlgItem( IDC_MIBTREE);
- delete_nodes( tree, tree->GetRootItem());
- }
- BOOL Set::OnInitDialog()
- {
- CDialog::OnInitDialog();
- CenterWindow();
- // load up the MIB tree control
- CTreeCtrl *tree;
- tree = (CTreeCtrl *) GetDlgItem( IDC_MIBTREE);
- load_mib_view( tree);
- // clear the pdu table
- CListBox *lb;
- lb= ( CListBox*) GetDlgItem( IDC_PDU);
- lb->ResetContent();
- return TRUE; // return TRUE unless you set the focus to a control
- // EXCEPTION: OCX Property Pages should return FALSE
- }
- void Set::OnAdd()
- {
- CTreeCtrl *tree;
- HTREEITEM node;
- Oid *oid_ptr;
- tree = (CTreeCtrl *) GetDlgItem( IDC_MIBTREE);
- node = tree->GetSelectedItem();
- oid_ptr = (Oid *) tree->GetItemData( node);
- if ( (*oid_ptr)[ oid_ptr->len() -1 ] != 0)
- {
- AfxMessageBox("You Must Select A Scalar MIB Object");
- return;
- }
- Oid addoid( oid_ptr->get_printable());
- VbOpts vb_options;
- vb_options.m_vboid = addoid.get_printable();
- int status;
- status = vb_options.DoModal();
- if ( vb_options.my_vb.valid())
- {
- CListBox *lb;
- lb = ( CListBox*) GetDlgItem( IDC_PDU);
- CString scalar;
- scalar += addoid.get_printable();
- int spot = lb->InsertString( lb->GetCount(),scalar);
- if ( spot >= MAX_SET_VBS)
- AfxMessageBox("Exeeded Maximum Set Vbs!");
- else
- set_vbs[ spot ] = vb_options.my_vb;
- }
- }
- void Set::OnAddoid()
- {
- UpdateData( TRUE);
- Oid oid( m_oid);
- if ( oid.valid())
- {
- VbOpts vb_options;
- vb_options.m_vboid = oid.get_printable();
- int status;
- status = vb_options.DoModal();
- if ( vb_options.my_vb.valid()) {
- CListBox *lb;
- lb = ( CListBox*) GetDlgItem( IDC_PDU);
- CString item;
- item += oid.get_printable();
- int spot = lb->InsertString( lb->GetCount(),item);
- if ( spot >= MAX_SET_VBS)
- AfxMessageBox("Exeeded Maximum Set Vbs!");
- else
- set_vbs[spot] = vb_options.my_vb;
- }
- }
- else
- AfxMessageBox("Invalid Custom MIB Object Identifier");
- }
- void Set::OnEdit()
- {
- CListBox *lb;
- int selection;
- char item_data[100];
- lb = ( CListBox*) GetDlgItem( IDC_PDU);
- UpdateData( TRUE);
- // make sure we have an item selected
- if((selection = lb->GetCurSel()) == LB_ERR)
- {
- AfxMessageBox("You Must Select an Item to Edit");
- return;
- }
- // get the item text
- if ( (lb->GetText( selection, item_data)) == LB_ERR)
- {
- AfxMessageBox("Can Not Obtain List Box Selection");
- return;
- }
- Oid addoid( item_data);
- VbOpts vb_options;
- vb_options.m_vboid = addoid.get_printable();
- vb_options.m_vbvalue = set_vbs[selection].get_printable_value();
- int status;
- status = vb_options.DoModal();
- if ( vb_options.my_vb.valid())
- {
- CString scalar;
- scalar += addoid.get_printable();
- lb->DeleteString( selection);
- lb->InsertString( selection,scalar);
- // update the pdu's vb
- set_vbs[selection] = vb_options.my_vb;
- }
- }
- void Set::OnRemove()
- {
- CListBox *lb;
- int selection;
- lb = ( CListBox*) GetDlgItem( IDC_PDU);
- int count = lb->GetCount();
- // delete it
- if((selection = lb->GetCurSel()) != LB_ERR)
- lb->DeleteString( selection);
- // relink the set vb list if needed
- for (int x=selection;x<(count-1);x++)
- set_vbs[x] = set_vbs[x+1];
- }
- void Set::OnSelchangeTargets()
- {
- // access the target database
- Db target_db;
- TargetDb_Rec db_rec;
- char key[80];
- char *ptr,*address;
- int status;
- CComboBox * target_cb = ( CComboBox *) GetDlgItem( IDC_TARGETS);
- target_cb->GetLBText( target_cb->GetCurSel() , key);
- // trim off alias, if present
- address = key;
- ptr = key;
- while (*ptr != 0)
- {
- if ( *ptr == '@')
- address = ptr+2;
- ptr++;
- }
- // get the db file name from the ini file
- CString filename = theApp.GetProfileString( BROWSER_VALUE,DB_NAME,DEF_DB_NAME);
- target_db.set_attributtes( filename, sizeof( TargetDb_Rec));
- strcpy( db_rec.key,address);
- status = target_db.read( &db_rec);
- if ( status != DB_OK)
- {
- MessageBox( "Unable to Read Target Record",ERR_MSG,MB_ICONSTOP);
- return;
- }
- load_target_attribs( db_rec);
- }
- void Set::OnSet()
- {
- CListBox *lb;
- lb = ( CListBox*) GetDlgItem( IDC_PDU);
- Pdu pdu;
- int vb_count = lb->GetCount();
- if ( vb_count == 0)
- {
- AfxMessageBox("You have No Variable Bindings to Set");
- return;
- }
- pdu.set_vblist( set_vbs, vb_count);
- // make a SnmpTarget using the Target_Factory
- CComboBox *cb = ( CComboBox *) GetDlgItem( IDC_TARGETS);
- char key[80];
- if ( cb->GetCurSel() == CB_ERR)
- {
- AfxMessageBox("No Target Selected!");
- return;
- }
- cb->GetLBText( cb->GetCurSel(), key);
- // get a target from the target factory
- SnmpTarget *target = target_factory( key);
- if ( target == NULL)
- {
- AfxMessageBox("Unable To find Target");
- return;
- }
- m_output = "SNMP++ Set in Progress...";
- UpdateData( FALSE);
- enable_controls( FALSE);
- // Invoke a SNMP++ Get for the Pdu requested
- // from the target created
- int status = snmp->set( pdu,
- *target);
- // display the response
- display_response( status, pdu, *target, snmp);
- enable_controls( TRUE);
- delete target;
- }
- // display the response value
- void Set::display_response( int status, Pdu &pdu, SnmpTarget &target, Snmp * snmp)
- {
- GenAddress address; // SNMP++ generic Address
- char buffer[100]; // each output line up to 1000 chars in length
- Vb vb;
- // show the status
- m_output = "";
- m_output +="Status = ";
- m_output += snmp->error_msg( status);
- m_output += "rn";
- // show the details if check box is selected
- CButton * all_details = (CButton*) GetDlgItem( IDC_ALL_DETAILS);
- if ( all_details->GetCheck())
- {
- target.get_address( address);
- m_output += "Response from ";
- m_output += address.get_printable();
- m_output += "rn";
- sprintf( buffer,"Error Status = %d ,",pdu.get_error_status());
- m_output += buffer;
- m_output += snmp->error_msg( pdu.get_error_status());
- m_output += "rn";
- sprintf( buffer,"Error Index = %drn", pdu.get_error_index());
- m_output += buffer;
- sprintf( buffer,"Request ID = %ldrn",pdu.get_request_id());
- m_output += buffer;
- sprintf( buffer,"Variable Binding Count = %drn",pdu.get_vb_count());
- m_output += buffer;
- }
- // show the Vbs
- for ( int x=0;x<pdu.get_vb_count();x++)
- {
- pdu.get_vb( vb,x);
- sprintf( buffer,"Vb #%drn",x+1);
- m_output += buffer;
- m_output += " Oid = ";
- m_output += vb.get_printable_oid();
- m_output += "rn";
- m_output += " Value = ";
- m_output += vb.get_printable_value();
- m_output += "rn";
- }
- // update the output display
- UpdateData( FALSE);
- };
- void Set::OnDblclkPdu()
- {
- OnEdit();
- }
- void Set::OnDblclkMibtree(NMHDR* pNMHDR, LRESULT* pResult)
- {
- OnAdd();
- *pResult = 0;
- }
- void Set::OnCancel()
- {
- DestroyWindow();
- }