本文整理汇总了C++中DialogTracker::handleRequest方法的典型用法代码示例。如果您正苦于以下问题:C++ DialogTracker::handleRequest方法的具体用法?C++ DialogTracker::handleRequest怎么用?C++ DialogTracker::handleRequest使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类DialogTracker
的用法示例。
在下文中一共展示了DialogTracker::handleRequest方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: handleRequest
bool SessionContext::handleRequest( SipMessage& message, const char* address, int port, bool bFromCallerToCallee )
{
// This routine steers incoming requests to the DialogTracker instance that is
// responsible for handling them based on the request's to- or from-tags depending
// on the directionality of the request.
ssize_t numberOfDialogTrackersEnteringRoutine = getNumberOfTrackedDialogs();
bool bTrackRequestResponse = false;
UtlString discriminatingTag = getDiscriminatingTagValue( message, bFromCallerToCallee );
// if a discriminating tag was found, try to find a DialogTracker for it.
if( !discriminatingTag.isNull() )
{
DialogTracker* pDialogTracker = 0;
if( ( pDialogTracker = getDialogTrackerForTag( discriminatingTag ) ) != 0 )
{
bTrackRequestResponse = pDialogTracker->handleRequest( message, address, port, bFromCallerToCallee );
}
else
{
OsSysLog::add(FAC_NAT, PRI_CRIT, "SessionContext[%s]::handleRequest: received in-dialog request with unknown discriminating tag: %s",
mHandle.data(), discriminatingTag.data() );
}
}
else
{
// The request does not yet have a discriminating tag. This is likely indicating a
// dialog-forming INVITE but to be sure, check that the request is indeed an
// INVITE in the caller->callee direction.
UtlString method;
message.getRequestMethod(&method);
if( bFromCallerToCallee && method.compareTo( SIP_INVITE_METHOD ) == 0 )
{
// The INVITE is dialog-forming. Check whether or not already have
// the reference dialog tracker for it.
if( !mpReferenceDialogTracker )
{
// This is the first time we see that dialog-forming request - create
// a reference dialog tracker that will serve as a template to create
// new DialogTracker objects for the dialogs that responses to the
// request will establish.
Url tempUrl;
char tempBuffer[50];
sprintf( tempBuffer, "%s-%s", mHandle.data(), "ref" );
if( ( mpReferenceDialogTracker = new DialogTracker( tempBuffer, mSystemIdentificationString, this ) ) )
{
mpReferenceDialogTracker->handleRequest( message, address, port, bFromCallerToCallee );
// save the From tag of the dialog-forming request. This will be used to identify
// the discriminating tag when the directionality of a message is unknown.
message.getFromUrl( tempUrl );
tempUrl.getFieldParameter( "tag", mDialogOriginalFromTag );
mDialogFormingInviteCseq.setValue( message );
bTrackRequestResponse = true;
}
}
else
{
// This dialog-forming request has already been seen - this is likely a
// retransmission. Present it to the reference dialog tracker so that
// it can handle the retransmission properly.
bTrackRequestResponse = mpReferenceDialogTracker->handleRequest( message, address, port, bFromCallerToCallee );
}
}
}
// Check if the processing of the request caused the last DialogTracker to be deleted.
// If so, the SessionContext is not required anymore therefore tell the CallTracker that
// we are ready for deletion
if( numberOfDialogTrackersEnteringRoutine &&
deleteDialogTrackersReadyForDeletion() == numberOfDialogTrackersEnteringRoutine )
{
mpOwningCallTracker->reportSessionContextReadyForDeletion( mHandle );
}
return bTrackRequestResponse;
}