text: //***************************************************************************
  
  //
  
  //  File:	
  
  //
  
  //  Module: MS SNMP Provider
  
  //
  
  //  Purpose: 
  
  //
  
  // Copyright (c) 1997-2001 Microsoft Corporation, All Rights Reserved
  //
  //***************************************************************************
  
  #if _MSC_VER >= 1100
  template<> DllImportExport UINT AFXAPI HashKey <SnmpObjectIdentifierType&> (SnmpObjectIdentifierType &key) ;
  #else
  DllImportExport UINT HashKey (SnmpObjectIdentifierType &key) ;
  #endif
  
  #if _MSC_VER >= 1100
  template<> DllImportExport BOOL AFXAPI CompareElements <SnmpObjectIdentifierType , SnmpObjectIdentifierType >( 
  
  	 const SnmpObjectIdentifierType* pElement1, 
  	 const SnmpObjectIdentifierType* pElement2 
  ) ;
  #else
  DllImportExport BOOL CompareElements ( 
  
  	 SnmpObjectIdentifierType* pElement1, 
  	 SnmpObjectIdentifierType* pElement2 
  ) ;
  #endif
  
  class VarBindObject 
  {
  private:
  
  	SnmpObjectIdentifier reply ;
  	SnmpValue *value ;
  
  protected:
  public:
  
  	VarBindObject ( const SnmpObjectIdentifier &replyArg , const SnmpValue &valueArg ) ;
  	virtual ~VarBindObject () ;
  
  	SnmpObjectIdentifier &GetObjectIdentifier () ;
  	SnmpValue &GetValue () ;
  } ;
  
  class VarBindQueue 
  {
  private:
  
  	CList <VarBindObject *, VarBindObject *&> queue ;
  
  protected:
  public:
  
  	VarBindQueue () ;
  	virtual ~VarBindQueue () ;
  
  	void Add ( VarBindObject *varBindObject ) ;
  	VarBindObject *Get () ;
  	VarBindObject *Delete () ;
  } ;
  
  class VarBindObjectRequest 
  {
  private:
  
  	BOOL repeatRequest ;
  	VarBindQueue varBindResponseQueue ;
  	SnmpObjectIdentifierType varBind ;
  	SnmpObjectIdentifierType requested ;
  
  protected:
  public:
  
  	VarBindObjectRequest ( const SnmpObjectIdentifierType &varBindArg ) ;
  	VarBindObjectRequest ( 
  
  		const SnmpObjectIdentifierType &varBindArg ,
  		const SnmpObjectIdentifierType &requestedVarBindArg 
  	) ;
  
  	VarBindObjectRequest () ;
  	virtual ~VarBindObjectRequest () ;
  
  	const SnmpObjectIdentifierType &GetRequested () const ;
  	const SnmpObjectIdentifierType &GetVarBind () const ;
  	
  	void AddQueuedObject ( VarBindObject *object ) ;
  	VarBindObject *GetQueuedObject () ;
  	VarBindObject *DeleteQueueudObject () ;
  
  	void SetRequested ( const SnmpObjectIdentifierType &requestedArg ) ;
  	void SetVarBind ( const SnmpObjectIdentifierType &varBindArg ) ;
  
  	BOOL GetRepeatRequest () { return repeatRequest ; }
  	void SetRepeatRequest ( BOOL repeatRequestArg = TRUE ) { repeatRequest = repeatRequestArg ; }
  } ;
  
  
  class GetNextOperation ;
  class DllImportExport SnmpAutoRetrieveOperation 
  {
  friend GetNextOperation ;
  private:
  
  	BOOL status ;
  	GetNextOperation *operation ;
  
  protected:
  
  	SnmpAutoRetrieveOperation (SnmpSession &snmp_session);
  
  	virtual void ReceiveResponse() {} ;
  
  	virtual void ReceiveRowResponse () {} ;
  
  	virtual void ReceiveRowVarBindResponse(
  
  		IN const ULONG &var_bind_index,
  		IN const SnmpVarBind &requestVarBind ,
  		IN const SnmpVarBind &replyVarBind ,
  		IN const SnmpErrorReport &error) {}
  
  	virtual void ReceiveVarBindResponse(
  		IN const ULONG &var_bind_index,
  		IN const SnmpVarBind &requestVarBind ,
  		IN const SnmpVarBind &replyVarBind ,
  		IN const SnmpErrorReport &error) {}
  
  	virtual void ReceiveErroredVarBindResponse(
  		IN const ULONG &var_bind_index,
  		IN const SnmpVarBind &requestVarBind  ,
  		IN const SnmpErrorReport &error) {}
  
  	virtual LONG EvaluateNextRequest (
  
  		IN const ULONG &var_bind_index,
  		IN const SnmpVarBind &requestVarBind ,
  		IN const SnmpVarBind &replyVarBind ,
  		IN SnmpVarBind &sendVarBind
  
  	) { return 0 ; }
  
  	virtual void FrameTooBig() {}
  
  	virtual void FrameOverRun() {}
  
  	void DestroyOperation () ;
  
  public:
  
  
  	virtual ~SnmpAutoRetrieveOperation() ;
  
  	virtual void SendRequest (
  
  		IN SnmpVarBindList &scopeVarBindList , 
  		IN SnmpVarBindList &varBindList 
  	);
  
  	virtual void SendRequest (
  
  		IN SnmpVarBindList &varBindList 
  	);
  
  	void CancelRequest();
  
  	void ReceiveFrame(IN const SessionFrameId session_frame_id,
  					  IN const SnmpPdu &snmpPdu,
  					  IN const SnmpErrorReport &errorReport) {} ;
  
  	virtual void SentFrame(IN const SessionFrameId session_frame_id,
  						   IN const SnmpErrorReport &error_report) {} ;
  
  	void *operator()(void) const ;
  
  } ;
  
  
  
  class DllImportExport GetNextOperation : public SnmpGetNextOperation
  {
  private:
  
  	ULONG m_RequestContainerLength ;
  	VarBindObjectRequest **m_RequestContainer ;
  	ULONG *m_RequestIndexContainer ;
  
  	BOOL cancelledRequest ;
  	SnmpObjectIdentifier minimumInstance ;
  	SnmpAutoRetrieveOperation *operation ;
  
  	void Cleanup () ;
  	BOOL ProcessRow () ;
  	void Send () ;
  
  protected:
  
  	void ReceiveResponse () ;
  
  	void ReceiveVarBindResponse (
  
  		IN const ULONG &var_bind_index,
  		IN const SnmpVarBind &requestVarBind ,
  		IN const SnmpVarBind &replyVarBind ,
  		IN const SnmpErrorReport &error
  	) ;
  
  	void ReceiveErroredVarBindResponse(	
  
  		IN const ULONG &var_bind_index,
  		IN const SnmpVarBind &requestVarBind  ,
  		IN const SnmpErrorReport &error
  	) ;
  
  	void FrameTooBig() ;
  
  	void FrameOverRun() ;
  
  	void SentFrame(
  
  		IN const SessionFrameId session_frame_id,
  		IN const SnmpErrorReport &error_report
  	);
  
  public:
  
  	GetNextOperation (IN SnmpSession &session, SnmpAutoRetrieveOperation &autoRetrieveOperation ) ;
  	~GetNextOperation () ;
  
  	void SendRequest ( 
  
  		SnmpVarBindList &varBindList , 
  		SnmpVarBindList &startVarBindList 
  	) ;
  
  	void SendRequest ( SnmpVarBindList &varBindList ) ;
  	void CancelRequest () ;
  
  	void DestroyOperation () ;
  };
  