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

📄 stateinterface.cxx

📁 Vovida 社区开源的 SIP 协议源码
💻 CXX
字号:
/* ==================================================================== * The Vovida Software License, Version 1.0  *  * Copyright (c) 2000 Vovida Networks, Inc.  All rights reserved. *  * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: *  * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. *  * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in *    the documentation and/or other materials provided with the *    distribution. *  * 3. The names "VOCAL", "Vovida Open Communication Application Library", *    and "Vovida Open Communication Application Library (VOCAL)" must *    not be used to endorse or promote products derived from this *    software without prior written permission. For written *    permission, please contact vocal@vovida.org. * * 4. Products derived from this software may not be called "VOCAL", nor *    may "VOCAL" appear in their name, without prior written *    permission of Vovida Networks, Inc. *  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND * NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL VOVIDA * NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES * IN EXCESS OF $1,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. *  * ==================================================================== *  * This software consists of voluntary contributions made by Vovida * Networks, Inc. and many individuals on behalf of Vovida Networks, * Inc.  For more information on Vovida Networks, Inc., please see * <http://www.vovida.org/>. * */static const char* const StateInterface_cxx_Version =     "$Id: StateInterface.cxx,v 1.2 2001/08/10 04:02:04 icahoon Exp $";#include "global.h"#include <cassert>#include "StateInterface.hxx"#include "Stimulus.hxx"#include "Action.hxx"#include "VLog.hxx"using Vocal::Behavioral::StateInterface;using Vocal::Behavioral::Stimulus;using Vocal::Behavioral::Action;using Vocal::Logging::VLog;using Vocal::ReturnCode;StateInterface::StateInterface(    const char      *	name,    Action  	    *	onEntry,    Action  	    *	onExit)    :	myName(name ? name : "NullState"),    	myEntry(onEntry),    	myExit(onExit){    const string    fn("StateInterface::StateInterface");    VLog    	    log(fn);        VDEBUG(log) << fn << ": " << *this << VDEBUG_END(log);}StateInterface::~StateInterface(){    const string    fn("StateInterface::~StateInterface");    VLog    	    log(fn);        VDEBUG(log) << fn << ": " << myName << VDEBUG_END(log);}void		    StateInterface::addAction(    const Stimulus 	    &	stimulus,    Action  	    	    &	action,    StateInterface          &	nextState){    const string    fn("StateInterface::addAction");    VLog    	    log(fn);    bool rc =	stimulusTable_.insert(    	    	    StimulusPair(stimulus, StimulusData(action, nextState, 0))	      	).second;    assert( rc );    VDEBUG(log) << fn     	    	<< "\n\tState          :\t" << myName    	    	<< "\n\tStimulus       :\t" << stimulus	    	<< "\n\tAction         :\t" << action	    	<< "\n\tNextState      :\t" << nextState.name()		<< VDEBUG_END(log);}void		    StateInterface::addAction(    const Stimulus 	    &	stimulus,    Action  	    	    &	action,    StateInterface          &	nextState,    StateInterface          &	nextStateOnFail){    const string    fn("StateInterface::addAction");    VLog    	    log(fn);    bool rc =	stimulusTable_.insert(    	    	    StimulusPair(stimulus, StimulusData(action, nextState, &nextStateOnFail))	      	).second;    assert( rc );    VDEBUG(log) << fn     	    	<< "\n\tState          :\t" << myName    	    	<< "\n\tStimulus       :\t" << stimulus	    	<< "\n\tAction         :\t" << action	    	<< "\n\tNextState      :\t" << nextState.name()	    	<< "\n\tNextStateOnFail:\t" << nextStateOnFail.name()		<< VDEBUG_END(log);}void        	    StateInterface::entryAction(Action & onEntry){    myEntry = &onEntry;}void        	    StateInterface::exitAction(Action & onExit){    myExit = &onExit;}void        	    StateInterface::enter() throw (){    const string    fn("StateInterface::enter");    VLog    	    log(fn);    if ( myEntry )    {    	VDEBUG(log) << fn << ": State: " << myName	    	    << ": Action: " << *myEntry << VDEBUG_END(log);	    	myEntry->action();    }}StateInterface &    StateInterface::stimulate(    const Stimulus  &   stimulus) throw (){    const string    fn("StateInterface::stimuluate");    VLog    	    log(fn);    VDEBUG(log) << fn     	    	<< "\n\tState: " << myName    	    	<< ",\t\tStimulus: " << stimulus 		<< VDEBUG_END(log);		    // Lookup the stimulus in the stimulus table.     //    StimulusTable::iterator it = stimulusTable_.find(stimulus);        // If it doesn't exist, do nothing.    //    if ( it == stimulusTable_.end() )    {    	VDEBUG(log) << fn     	    	<< "\n\tState: " << myName    	    	<< ",\t\tAction: No Action" 		<< VDEBUG_END(log);    	return ( *this );    }        // If the stimulus exists first perform the exit action on this state,     // then perform the action associated with the stimulus, and finally    // perform the entry action on the next state.    //    // Note that the exit action, the action associated with this stimulus,     // and the entry action of the next state may throw an exception.    //    exit();    Action  &	action = (*it).second.action_;        VDEBUG(log) << fn     	    	<< "\n\tState: " << myName    	    	<< ",\t\tAction: " << action 		<< VDEBUG_END(log);    ReturnCode	rc = action.action(stimulus);        StateInterface  	&   nextState =     	( rc != SUCCESS && (*it).second.nextStateOnFail_	    ? *(*it).second.nextStateOnFail_	    : (*it).second.nextState_     	);    VDEBUG(log) << fn     	    	<< "\n\tState: " << myName    	    	<< ",\t\tNext State: " << nextState.name() 		<< VDEBUG_END(log);        nextState.enter();        return ( nextState );}void        	    StateInterface::exit() throw (){    const string    fn("StateInterface::enter");    VLog    	    log(fn);    if ( myExit )    {    	VDEBUG(log) << fn 	    	    << "\n\tState: " << myName	    	    << ",\t\tAction: " << *myExit 		    << VDEBUG_END(log);		        	myExit->action();    }}ostream &           StateInterface::writeTo(ostream & out) const{    out << name()     	<< "\n\tEntry:\t" << ( myEntry ? *myEntry : Action() )	<< "\n\tExit:\t" << ( myExit  ? *myExit  : Action() )	<< "\n\tStimuli:\n\t{";        for (   StimulusTable::const_iterator it = stimulusTable_.begin();    	    it != stimulusTable_.end();	    it++	)    {    	out << "\n\t\tStimulus       :\t" << (*it).first	    << "\n\t\tAction         :\t" << (*it).second.action_	    << "\n\t\tNextState      :\t" << (*it).second.nextState_.name();    	if ( (*it).second.nextStateOnFail_ )	{	    out << "\n\t\tNextStateOnFail:\t"  << (*it).second.nextStateOnFail_->name();	}	out << '\n';    }        return ( out << "\n\t}" );}const string &StateInterface::name() const{    return ( myName );}StateInterface::StimulusData::StimulusData(    Action  	    	&   action,    StateInterface      &   nextState,    StateInterface      *   nextStateOnFail)       :   action_(action),    	nextState_(nextState),	nextStateOnFail_(nextStateOnFail){}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -