Leaked source code of windows server 2003
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
//***************************************************************************
//
// File:
//
// Module: MS SNMP Provider
//
// Purpose:
//
// Copyright (c) 1997-2001 Microsoft Corporation, All Rights Reserved
//
//***************************************************************************
/*---------------------------------------------------------
Filename: frame.cpp Written By: B.Rajeev ----------------------------------------------------------*/
#include "precomp.h"
#include "common.h"
#include "sync.h"
#include "flow.h"
#include "frame.h"
#include "idmap.h"
#include "vblist.h"
#include "sec.h"
#include "pdu.h"
#include "ssent.h"
#include "dummy.h"
#include "opreg.h"
#include "session.h"
SessionFrameId FrameRegistry::GenerateSessionFrameId(void) { SessionFrameId session_frame_id = next_session_frame_id++;
if ( next_session_frame_id == ILLEGAL_SESSION_FRAME_ID ) next_session_frame_id++;
return session_frame_id; }
void FrameRegistry::RegisterFrame(IN const SessionFrameId session_frame_id, IN WaitingMessage &waiting_message) { mapping[session_frame_id] = &waiting_message;
DebugMacro4(
SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine (
__FILE__,__LINE__, L"frame %d registered\n" ,session_frame_id ) ; )
}
// returns NULL if no such waiting message
WaitingMessage *FrameRegistry::GetWaitingMessage(IN const SessionFrameId session_frame_id) { WaitingMessage *waiting_message; BOOL found = mapping.Lookup(session_frame_id, waiting_message);
if ( found ) return waiting_message; else return NULL; }
void FrameRegistry::DeregisterFrame(IN const SessionFrameId session_frame_id) { if ( !mapping.RemoveKey(session_frame_id) ) throw GeneralException(Snmp_Error, Snmp_Local_Error,__FILE__,__LINE__);
DebugMacro4(
SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine (
__FILE__,__LINE__, L"frame %d removed\n" ,session_frame_id ) ; ) }
// if the specified waiting message is found,
// cancel the <TransportFrameId, SessionFrameId> association,
// ensure that no sent message notifications shall be passed to the operation
// remove any buffered responses for the waiting message
// inform the flow control mechanism
// otherwise, the message is still in the flow control queue
// inform the flow control mechanism
void FrameRegistry::CancelFrameNotification(IN const SessionFrameId session_frame_id) { WaitingMessage *waiting_message; BOOL found = mapping.Lookup(session_frame_id, waiting_message);
// obtain corresponding waiting_message
if ( found ) { // ensure that sent message notifications shall not
// be passed on to the operation
session->id_mapping.DisassociateSessionFrameId(session_frame_id);
// remove any SnmpErrorReport for an attempt to send the message
session->store.Remove(session_frame_id);
// inform flow control mechanism
// it advances window and destroys the waiting_message
session->flow_control.AdvanceWindow(*waiting_message); } else // the frame must still be in the flow control message queue
session->flow_control.DeleteMessage(session_frame_id); }
// destroy each stored waiting message in the local store and
// remove all associations
FrameRegistry::~FrameRegistry(void) { // get the first position
POSITION current = mapping.GetStartPosition();
// while the position isn't null
while ( current != NULL ) { SessionFrameId id; WaitingMessage *waiting_message;
// get the next pair
mapping.GetNextAssoc(current, id, waiting_message);
// delete the ptr
delete waiting_message; }
// remove all the keys
mapping.RemoveAll(); }
|