📄 set.cpp
字号:
/*============================================================================
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 Defined\n 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 += "\r\n";
// 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 += "\r\n";
sprintf( buffer,"Error Status = %d ,",pdu.get_error_status());
m_output += buffer;
m_output += snmp->error_msg( pdu.get_error_status());
m_output += "\r\n";
sprintf( buffer,"Error Index = %d\r\n", pdu.get_error_index());
m_output += buffer;
sprintf( buffer,"Request ID = %ld\r\n",pdu.get_request_id());
m_output += buffer;
sprintf( buffer,"Variable Binding Count = %d\r\n",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 #%d\r\n",x+1);
m_output += buffer;
m_output += " Oid = ";
m_output += vb.get_printable_oid();
m_output += "\r\n";
m_output += " Value = ";
m_output += vb.get_printable_value();
m_output += "\r\n";
}
// update the output display
UpdateData( FALSE);
};
void Set::OnDblclkPdu()
{
OnEdit();
}
void Set::OnDblclkMibtree(NMHDR* pNMHDR, LRESULT* pResult)
{
OnAdd();
*pResult = 0;
}
void Set::OnCancel()
{
DestroyWindow();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -