⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 set.cpp

📁 HP公司的SNMP++的Win32版本源码
💻 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 + -