本文整理汇总了C++中Url::getFieldParameter方法的典型用法代码示例。如果您正苦于以下问题:C++ Url::getFieldParameter方法的具体用法?C++ Url::getFieldParameter怎么用?C++ Url::getFieldParameter使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Url
的用法示例。
在下文中一共展示了Url::getFieldParameter方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: isNewRemoteTransaction
UtlBoolean SipDialogMgr::isNewRemoteTransaction(const SipMessage& message)
{
UtlBoolean matchesTransaction = FALSE;
UtlString handle;
SipDialog::getDialogHandle(message, handle);
UtlString callId;
UtlString fromTag;
UtlString toTag;
Url fromField;
Url toField;
message.getFromUrl(fromField);
message.getToUrl(toField);
message.getCallIdField(callId);
fromField.getFieldParameter("tag", fromTag);
toField.getFieldParameter("tag", toTag);
lock();
// Looking for any dialog that matches this handle
SipDialog* dialog = findDialog(handle,
TRUE, // if established, match early dialog
TRUE); // if early, match established dialog
if(dialog &&
dialog->isTransactionRemotelyInitiated(callId, fromTag, toTag) &&
dialog->isNextRemoteCseq(message))
{
matchesTransaction = TRUE;
}
unlock();
return(matchesTransaction);
}
示例2: getDiscriminatingTagValue
UtlString SessionContext::getDiscriminatingTagValue( const SipMessage& message ) const
{
UtlString discriminatingTag;
Url tempUrl;
// We do not know the directionality of the message. In this case
// we cannot tell if the discriminating tag will come from the From:
// or To: header. Return the one that does not match the dialog's
// original From-tag.
// Look at the To-Tag first
message.getToUrl( tempUrl );
tempUrl.getFieldParameter( "tag", discriminatingTag );
if( discriminatingTag == mDialogOriginalFromTag )
{
message.getFromUrl( tempUrl );
tempUrl.getFieldParameter( "tag", discriminatingTag );
}
return discriminatingTag;
}
示例3: isLastLocalTransaction
UtlBoolean SipDialogMgr::isLastLocalTransaction(const SipMessage& message,
const char* dialogHandle)
{
UtlBoolean matchesTransaction = FALSE;
UtlString handle(dialogHandle ? dialogHandle : "");
// If the dialog handle was not set, get it from the message
if(handle.isNull())
{
SipDialog::getDialogHandle(message, handle);
}
UtlString callId;
UtlString fromTag;
UtlString toTag;
Url fromField;
Url toField;
message.getFromUrl(fromField);
message.getToUrl(toField);
message.getCallIdField(callId);
fromField.getFieldParameter("tag", fromTag);
toField.getFieldParameter("tag", toTag);
lock();
// Looking for any dialog that matches this handle
SipDialog* dialog = findDialog(handle,
TRUE, // if established, match early dialog
TRUE); // if early, match established dialog
if(dialog &&
dialog->isTransactionLocallyInitiated(callId, fromTag, toTag) &&
dialog->isSameLocalCseq(message))
{
matchesTransaction = TRUE;
}
unlock();
return(matchesTransaction);
}
示例4: isSameDialog
UtlBoolean SipDialog::isSameDialog(const SipMessage& message) const
{
UtlString messageCallId;
message.getCallIdField(&messageCallId);
UtlBoolean isSameDialog = FALSE;
if(messageCallId.compareTo(*this, UtlString::ignoreCase) == 0)
{
Url messageFromUrl;
message.getFromUrl(messageFromUrl);
UtlString messageFromTag;
messageFromUrl.getFieldParameter("tag", messageFromTag);
if(messageFromTag.compareTo(mLocalTag, UtlString::ignoreCase) == 0)
{
Url messageToUrl;
message.getToUrl(messageToUrl);
UtlString messageToTag;
messageToUrl.getFieldParameter("tag", messageToTag);
if(messageToTag.compareTo(mRemoteTag, UtlString::ignoreCase) == 0)
{
isSameDialog = TRUE;
}
}
else if(messageFromTag.compareTo(mRemoteTag, UtlString::ignoreCase) == 0)
{
Url messageToUrl;
message.getToUrl(messageToUrl);
UtlString messageToTag;
messageToUrl.getFieldParameter("tag", messageToTag);
if(messageToTag.compareTo(mLocalTag, UtlString::ignoreCase) == 0)
{
isSameDialog = TRUE;
}
}
}
return(isSameDialog);
}
示例5: mIsValidIdentity
/// Decode the identity from a message.
SipXauthIdentity::SipXauthIdentity(const SipMessage& message,
const HeaderName headerName,
DialogRule bindRule
)
: mIsValidIdentity(FALSE)
{
UtlString callId;
UtlString fromTag;
Url fromUrl;
message.getCallIdField(&callId);
message.getFromUrl(fromUrl);
fromUrl.getFieldParameter("tag", fromTag);
decode(headerName, message, callId, fromTag, bindRule);
}
示例6: insert
/// Add identity info to a message.
bool SipXauthIdentity::insert(SipMessage & message,
HeaderName headerName,
const OsDateTime * timestamp)
{
// Don't proceed if the encapsulated identity is invalid
if (!mIsValidIdentity)
{
Os::Logger::instance().log(FAC_SIP, PRI_CRIT,
"SipXauthIdentity::insert: "
"encapsulated SipXauthIdentity is invalid");
}
else
{
// make sure no existing identity in the message
remove(message, headerName);
// set Call-Id and from-tag for the signature calculation
UtlString callId;
UtlString fromTag;
Url fromUrl;
message.getCallIdField(&callId);
message.getFromUrl(fromUrl);
fromUrl.getFieldParameter("tag", fromTag);
OsDateTime now;
OsDateTime::getCurTime(now);
if (NULL==timestamp)
{
timestamp = &now;
}
UtlString value;
encode(value, callId, fromTag, *timestamp);
// Insert displayName if it is an P-Asserted-Identity header.
if (headerName == SipXauthIdentity::PAssertedIdentityHeaderName)
{
UtlString displayName;
fromUrl.getDisplayName(displayName);
value.prepend(displayName.data());
}
message.addHeaderField(headerName, value.data());
}
return mIsValidIdentity;
}
示例7: encodeUri
/// Encode identity info into a URL
bool SipXauthIdentity::encodeUri(Url & uri,
const char* pCallId,
const Url fromUrl,
const OsDateTime * timestamp)
{
// Don't proceed if the encapsulated identity is invalid
if (!mIsValidIdentity)
{
Os::Logger::instance().log(FAC_SIP, PRI_CRIT,
"SipXauthIdentity::encodeUri[no msg]: "
"encapsulated SipXauthIdentity is invalid");
}
else
{
// make sure no existing identity in the URI
uri.removeHeaderParameter(SipXauthIdentity::PAssertedIdentityHeaderName);
// set Call-Id and from-tag for the signature calculation
UtlString callId(pCallId);
UtlString fromTag;
fromUrl.getFieldParameter("tag", fromTag);
OsDateTime now;
OsDateTime::getCurTime(now);
if (NULL==timestamp)
{
timestamp = &now;
}
UtlString value;
encode(value, callId, fromTag, *timestamp);
uri.setHeaderParameter(SipXauthIdentity::PAssertedIdentityHeaderName, value.data());
Os::Logger::instance().log(FAC_SIP, PRI_DEBUG,
"SipXauthIdentity::encodeUri[o msg] "
"encoded URI '%s'",
uri.toString().data()
);
}
return mIsValidIdentity;
}
示例8: if
/// Decode the identity from a message by searching for SipXauthIdentity then P-Asserted-Identity
SipXauthIdentity::SipXauthIdentity( const SipMessage& message,
UtlString& matchedHeaderName,
bool bSipXauthIdentityTakesPrecedence,
DialogRule bindRule )
: mIsValidIdentity(FALSE)
{
UtlString callId;
UtlString fromTag;
Url fromUrl;
message.getCallIdField(&callId);
message.getFromUrl(fromUrl);
fromUrl.getFieldParameter("tag", fromTag);
matchedHeaderName.remove(0);
HeaderName firstHeaderToTest;
HeaderName secondHeaderToTest;
if( bSipXauthIdentityTakesPrecedence == true )
{
firstHeaderToTest = AuthIdentityHeaderName;
secondHeaderToTest = PAssertedIdentityHeaderName;
}
else
{
firstHeaderToTest = PAssertedIdentityHeaderName;
secondHeaderToTest = AuthIdentityHeaderName;
}
if( decode(firstHeaderToTest, message, callId, fromTag, bindRule) )
{
matchedHeaderName = firstHeaderToTest;
}
else if( decode(secondHeaderToTest, message, callId, fromTag, bindRule) )
{
matchedHeaderName = secondHeaderToTest;
}
}
示例9: updateDialogData
void SipDialog::updateDialogData(const SipMessage& message)
{
UtlString messageCallId;
message.getCallIdField(&messageCallId);
Url messageFromUrl;
message.getFromUrl(messageFromUrl);
UtlString messageFromTag;
messageFromUrl.getFieldParameter("tag", messageFromTag);
Url messageToUrl;
message.getToUrl(messageToUrl);
UtlString messageToTag;
messageToUrl.getFieldParameter("tag", messageToTag);
int cSeq;
UtlString method;
message.getCSeqField(&cSeq, &method);
int responseCode = message.getResponseStatusCode();
// Figure out if the request is from the local or
// the remote side
if(isTransactionLocallyInitiated(messageCallId,
messageFromTag,
messageToTag))
{
// This message is part of a transaction initiated by
// the local side of the dialog
if(cSeq > mLastLocalCseq)
{
mLastLocalCseq = cSeq;
}
if(cSeq >= mLastLocalCseq)
{
// Always update the contact if it is set
UtlString messageContact;
// Get the Contact value, but as an addr-spec.
if(message.getContactUri(0, &messageContact) &&
!messageContact.isNull())
{
if(message.isResponse())
{
mRemoteContact.fromString(messageContact, TRUE);
}
else
{
mLocalContact.fromString(messageContact, TRUE);
}
}
}
// Cannot assume that we only establish a dialog with the
// initial cseq. For example if there is an authentication
// challenge, the dialog will not be established until the
// second transaction.
if(cSeq == mLastLocalCseq)
{
// A successful response to an INVITE or SUBSCRIBE
// make this early dialog a set up dialog
if(mLocalInitiatedDialog &&
message.isResponse() &&
responseCode >= SIP_2XX_CLASS_CODE && // successful dialog setup
responseCode < SIP_3XX_CLASS_CODE &&
mRemoteTag.isNull() && // tag not set
mRouteSet.isNull()) // have not yet set the route set
{
// Change this early dialog to a set up dialog.
// The tag gets set in the 2xx response
// so we need to update the URL
message.getToUrl(mRemoteField);
mRemoteField.getFieldParameter("tag", mRemoteTag);
// Need to get the route set as well
// Make sure the Request Method is allowed to set Record-Routes
if(message.isRecordRouteAccepted())
{
message.buildRouteField(&mRouteSet);
}
}
}
}
else if(isTransactionRemotelyInitiated(messageCallId,
messageFromTag,
messageToTag))
{
int prevRemoteCseq = mLastRemoteCseq;
// This message is part of a transaction initiated by
// the callee/destination of the session
if(cSeq > mLastRemoteCseq)
{
mLastRemoteCseq = cSeq;
}
if(cSeq >= mLastRemoteCseq)
{
// Always update the contact if it is set
UtlString messageContact;
// Get the Contact value, but as an addr-spec.
if(message.getContactUri(0, &messageContact) &&
//.........这里部分代码省略.........
示例10: getMessageData
void getMessageData(UtlString& content,
UtlBoolean isOutgoing,
UtlString& date,
UtlString& hostname,
UtlString& eventCount,
int outputFileDescriptor)
{
UtlString remoteHost;
UtlString remoteAddress;
UtlString remotePort;
UtlString remoteSourceAddress;
UtlString message;
UtlString branchId;
UtlString transactionId;
UtlString method;
UtlString responseCode;
UtlString responseText;
UtlBoolean failed = FALSE;
int hostIndex = content.index("----Remote Host:");
if(hostIndex > 0)
{
hostIndex += 16;
int hostEnd = content.index("----", hostIndex);
remoteHost.append(&(content.data()[hostIndex]),
hostEnd - hostIndex);
remoteAddress = remoteHost;
remoteHost.append(":");
int portIndex = hostEnd + 11;
int portEnd = content.index("----", portIndex);
remotePort.append(&(content.data()[portIndex]),
portEnd - portIndex);
remoteHost.append(remotePort);
int messageIndex = portEnd + 5;
size_t messageEnd;
if(isOutgoing)
{
messageEnd = content.index("--------------------END", messageIndex);
// Record whether the send failed or not.
failed = (content.index("User Agent failed to send message") !=
UTL_NOT_FOUND);
}
else
{
messageEnd = content.index("====================END", messageIndex);
}
if ( UTL_NOT_FOUND == messageEnd )
{
messageEnd = content.length();
}
message.append(&(content.data()[messageIndex]),
messageEnd - messageIndex);
SipMessage sipMsg(message);
remoteSourceAddress = remoteHost;
if(sipMsg.isResponse())
{
sipMsg.getFirstHeaderLinePart(1, &responseCode);
if (failed)
{
responseCode = responseCode + " FAILED";
}
sipMsg.getFirstHeaderLinePart(2, &responseText);
}
else
{
// Get the method.
sipMsg.getRequestMethod(&method);
// If it is a re-INVITE, make that clear.
if (method.compareTo("INVITE", UtlString::ignoreCase) == 0)
{
Url to;
sipMsg.getToUrl(to);
UtlString toTag;
to.getFieldParameter("tag", toTag);
if (!toTag.isNull())
{
method = "re-INVITE";
}
}
// Prepend FAILED if it is a failed transmission.
if (failed)
{
method = "FAILED " + method;
}
//We can derive the source entity from the via in
// incoming requests
if(!isOutgoing)
{
UtlString viaAddress;
//.........这里部分代码省略.........
示例11: terminateSubscriptionOnErrorTimeout
// XECS-1810: Verify that subscription is *not* terminated when NOTIFY
// returns a Timeout error.
void terminateSubscriptionOnErrorTimeout()
{
// Test MWI messages
const char* mwiSubscribe =
"SUBSCRIBE sip:[email protected] SIP/2.0\r\n"
"From: <sip:[email protected]ple.com>;tag=1612c1612\r\n"
"To: <sip:[email protected]>\r\n"
"Cseq: 1 SUBSCRIBE\r\n"
"Event: message-summary\r\n"
"Accept: application/simple-message-summary\r\n"
"Expires: 3600\r\n"
"Date: Tue, 4 Nov 2008 15:59:30 GMT\r\n"
"Max-Forwards: 20\r\n"
"User-Agent: Pingtel/2.2.0 (VxWorks)\r\n"
"Accept-Language: en\r\n"
"Supported: sip-cc, sip-cc-01, timer, replaces\r\n"
"Content-Length: 0\r\n"
"\r\n";
// Send a SUBSCRIBE to ourselves
SipMessage mwiSubscribeRequest(mwiSubscribe);
{
UtlString c;
CallId::getNewCallId(c);
mwiSubscribeRequest.setCallIdField(c);
}
mwiSubscribeRequest.setSipRequestFirstHeaderLine(SIP_SUBSCRIBE_METHOD,
aor,
SIP_PROTOCOL_VERSION);
mwiSubscribeRequest.setContactField(aor_name_addr);
mwiSubscribeRequest.incrementCSeqNumber();
CPPUNIT_ASSERT(userAgentp->send(mwiSubscribeRequest));
// We should get a 202 response and a NOTIFY request in the queue
// Send a Timeout error response to the NOTIFY.
OsTime messageTimeout(1, 0); // 1 second
{
const SipMessage* subscribeResponse;
const SipMessage* notifyRequest;
runListener(incomingClientMsgQueue,
*userAgentp,
messageTimeout,
messageTimeout,
notifyRequest,
subscribeResponse,
SIP_REQUEST_TIMEOUT_CODE,
FALSE,
0,
NULL);
// We should have received a SUBSCRIBE response and a NOTIFY request.
CPPUNIT_ASSERT(subscribeResponse);
CPPUNIT_ASSERT(subscribeResponse->getResponseStatusCode() == SIP_ACCEPTED_CODE);
CPPUNIT_ASSERT(notifyRequest);
// Extract the to-tag in the response, apply it to mwiSubscribeRequest.
// This allows the re-SUBSCRIBE below to be applied to the existing dialog.
Url toUrl;
subscribeResponse->getToUrl(toUrl);
UtlString toTag;
toUrl.getFieldParameter("tag", toTag);
mwiSubscribeRequest.setToFieldTag(toTag);
}
// Send a re-SUBSCRIBE in the existing dialog, to find out if the
// subscription was terminated or not.
mwiSubscribeRequest.incrementCSeqNumber();
// Leave the Expires header with the default value.
CPPUNIT_ASSERT(userAgentp->send(mwiSubscribeRequest));
// We should get a 202 response and a NOTIFY, because the Timeout
// error suppresses the termination of the subscription.
{
const SipMessage* subscribeResponse;
const SipMessage* notifyRequest;
runListener(incomingClientMsgQueue,
*userAgentp,
messageTimeout,
messageTimeout,
notifyRequest,
subscribeResponse,
SIP_OK_CODE,
FALSE,
0,
NULL);
// We should have received a SUBSCRIBE response and no NOTIFY request.
CPPUNIT_ASSERT(subscribeResponse);
CPPUNIT_ASSERT(notifyRequest);
CPPUNIT_ASSERT(subscribeResponse->getResponseStatusCode() == SIP_ACCEPTED_CODE);
}
}
示例12: handleMessage
UtlBoolean SipXProxyCseObserver::handleMessage(OsMsg& eventMessage)
{
int msgType = eventMessage.getMsgType();
switch (msgType)
{
case OsMsg::OS_EVENT:
switch (eventMessage.getMsgSubType())
{
case OsEventMsg::NOTIFY:
if (mpWriter)
{
mpWriter->flush();
}
break;
}
break ;
case OsMsg::PHONE_APP:
{
SipMessage* sipMsg;
if(SipMessageEvent::TRANSPORT_ERROR == ((SipMessageEvent&)eventMessage).getMessageStatus())
{
Os::Logger::instance().log(FAC_SIP, PRI_ERR,
"SipXProxyCseObserver::handleMessage transport error");
}
else if((sipMsg = (SipMessage*)((SipMessageEvent&)eventMessage).getMessage()))
{
UtlString method;
int rspStatus = 0;
UtlString rspText;
UtlString contact;
UtlString toTag;
enum
{
UnInteresting,
aCallRequest,
aCallSetup,
aCallFailure,
aCallEnd,
aCallTransfer
} thisMsgIs = UnInteresting;
Url toUrl;
sipMsg->getToUrl(toUrl);
// explicitly, an INVITE Request
toUrl.getFieldParameter("tag", toTag);
if (!sipMsg->isResponse())
{
// sipMsg is a Request
sipMsg->getRequestMethod(&method);
if (0==method.compareTo(SIP_INVITE_METHOD, UtlString::ignoreCase))
{
if (toTag.isNull())
{
sipMsg->getContactEntry(0, &contact);
thisMsgIs = aCallRequest;
}
}
else if (0==method.compareTo(SIP_REFER_METHOD, UtlString::ignoreCase))
{
thisMsgIs = aCallTransfer;
sipMsg->getContactEntry(0, &contact);
}
else if (0==method.compareTo(SIP_BYE_METHOD, UtlString::ignoreCase))
{
thisMsgIs = aCallEnd; // no additional information needed
}
else
{
// other request methods are not interesting
}
}
else // this is a response
{
int seq;
if (sipMsg->getCSeqField(&seq, &method)) // get the method out of cseq field
{
if (0==method.compareTo(SIP_INVITE_METHOD, UtlString::ignoreCase))
{
// Responses to INVITES are handled differently based on whether
// or not the INVITE is dialog-forming. If dialog-forming,
// any final response above 400 is considered a failure for CDR
// purposes. If not dialog-forming, then any final response above 400
// except 401 Unauthorized, 407 Proxy Authentication Required and
// 408 Request Timeout will terminate. If we're in a dialog then
// only 408 (Request Timeout) and 481 (Call/Transaction does not exist)
// will terminate the dialog.
rspStatus = sipMsg->getResponseStatusCode();
if (rspStatus >= SIP_4XX_CLASS_CODE) // any failure
{
// a failure code - this is a potential CallFailure - Call Resolver will determine.
thisMsgIs = aCallFailure;
//.........这里部分代码省略.........
示例13: mailboxUrl
UtlBoolean
SubscribeServerThread::isAuthenticated (
const SipMessage* message,
SipMessage *responseMessage,
UtlString& authenticatedUser,
UtlString& authenticatedRealm )
{
UtlBoolean isAuthorized = FALSE;
// if we are not using a database we must assume authenticated
if ( !mIsCredentialDB )
{
OsSysLog::add(FAC_AUTH, PRI_DEBUG, "SubscribeServerThread::isAuthenticated() "
":: No Credential DB - request is always AUTHENTICATED");
isAuthorized = TRUE;
} else
{
// realm and auth type should be default for server
// if URI not defined in DB, the user is not authorized to modify bindings -
OsSysLog::add( FAC_AUTH, PRI_DEBUG, "SubscribeServerThread::isAuthenticated():TRUE realm=\"%s\" ",
mRealm.data());
UtlString requestNonce;
UtlString requestRealm;
UtlString requestUser;
UtlString requestUserBase;
UtlString requestUriParam;
int requestAuthIndex = 0;
// can have multiphe authorization / authorization-proxy headers
// headers search for a realm match
while ( message->getDigestAuthorizationData (
&requestUser,
&requestRealm,
&requestNonce,
NULL,
NULL,
&requestUriParam,
HttpMessage::SERVER,
requestAuthIndex,
&requestUserBase) )
{
OsSysLog::add(FAC_AUTH, PRI_DEBUG, "SubscribeServerThread::isAuthenticated() "
"- Authorization header set in message, validate it.\n"
"- reqRealm=\"%s\", reqUser=\"%s\", reqUserBase=\"%s\"",
requestRealm.data(), requestUser.data(),
requestUserBase.data());
// case sensitive comparison of realm
if ( mRealm.compareTo( requestRealm ) == 0 )
{
OsSysLog::add(FAC_AUTH, PRI_DEBUG, "SubscribeServerThread::isAuthenticated()"
"- Realm matches, now validate userid/password");
// See if the nonce is valid - see net/SipNonceDb.cpp
UtlString reqUri;
message->getRequestUri(&reqUri);
Url mailboxUrl(reqUri);
UtlString authTypeDB;
UtlString passTokenDB;
UtlString callId;
UtlString fromTag;
long nonceExpires = (5*60); // five minutes
Url fromUrl;
message->getFromUrl(fromUrl);
fromUrl.getFieldParameter("tag", fromTag);
message->getCallIdField(&callId);
if (mNonceDb.isNonceValid(requestNonce, callId, fromTag,
mRealm, nonceExpires))
{
// then get the credentials for this realm
if (CredentialDB::getInstance()->
getCredentialByUserid(
mailboxUrl,
mRealm,
requestUserBase,
passTokenDB,
authTypeDB))
{
// the Digest Password is calculated from the request
// user, passtoken, nonce and request URI
isAuthorized =
message->verifyMd5Authorization(requestUser.data(),
passTokenDB.data(),
requestNonce,
requestRealm.data(),
requestUriParam.data());
if (isAuthorized)
{
// can have multiple credentials for same realm so only break out
// when we have a positive match
OsSysLog::add(FAC_AUTH, PRI_DEBUG, "SubscribeServerThread::isAuthenticated() "
"- request is AUTHENTICATED");
// copy the authenticated user/realm for subsequent authorization
authenticatedUser = requestUserBase;
authenticatedRealm = requestRealm;
//.........这里部分代码省略.........
示例14: 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;
}
示例15: handleMessage
UtlBoolean SipXProxyCseObserver::handleMessage(OsMsg& eventMessage)
{
int msgType = eventMessage.getMsgType();
switch (msgType)
{
case OsMsg::OS_EVENT:
switch (eventMessage.getMsgSubType())
{
case OsEventMsg::NOTIFY:
if (mpWriter)
{
mpWriter->flush();
}
break;
}
break ;
case OsMsg::PHONE_APP:
{
SipMessage* sipMsg;
if(SipMessageEvent::TRANSPORT_ERROR == ((SipMessageEvent&)eventMessage).getMessageStatus())
{
OsSysLog::add(FAC_SIP, PRI_ERR,
"SipXProxyCseObserver::handleMessage transport error");
}
else if((sipMsg = (SipMessage*)((SipMessageEvent&)eventMessage).getMessage()))
{
UtlString method;
int rspStatus = 0;
UtlString rspText;
UtlString contact;
UtlString toTag;
enum
{
UnInteresting,
aCallRequest,
aCallSetup,
aCallFailure,
aCallEnd,
aCallTransfer
} thisMsgIs = UnInteresting;
Url toUrl;
sipMsg->getToUrl(toUrl);
// explicitly, an INVITE Request
toUrl.getFieldParameter("tag", toTag);
if (!sipMsg->isResponse())
{
// sipMsg is a Request
sipMsg->getRequestMethod(&method);
if (0==method.compareTo(SIP_INVITE_METHOD, UtlString::ignoreCase))
{
if (toTag.isNull())
{
thisMsgIs = aCallRequest;
}
}
else if (0==method.compareTo(SIP_REFER_METHOD, UtlString::ignoreCase))
{
thisMsgIs = aCallTransfer;
sipMsg->getContactEntry(0, &contact);
}
else if (0==method.compareTo(SIP_BYE_METHOD, UtlString::ignoreCase))
{
thisMsgIs = aCallEnd; // no additional information needed
}
else
{
// other request methods are not interesting
}
}
else // this is a response
{
int seq;
if (sipMsg->getCSeqField(&seq, &method)) // get the method out of cseq field
{
if (0==method.compareTo(SIP_INVITE_METHOD, UtlString::ignoreCase))
{
// Responses to INVITES are handled differently based on whether
// or not the INVITE is dialog-forming. If dialog-forming,
// any final response above 400 is considered a failure for CDR
// purposes. If not dialog-forming, then any final response above 400
// except 401 Unauthorized, 407 Proxy Authentication Required and
// 408 Request Timeout will terminate. If we're in a dialog then
// only 408 (Request Timeout) and 481 (Call/Transaction does not exist)
// will terminate the dialog.
rspStatus = sipMsg->getResponseStatusCode();
if (rspStatus >= SIP_4XX_CLASS_CODE) // any failure
{
// a failure code - this is a potential CallFailure - Call Resolver will determine.
thisMsgIs = aCallFailure;
sipMsg->getResponseStatusText(&rspText);
}
else if ( ( rspStatus >= SIP_2XX_CLASS_CODE )
//.........这里部分代码省略.........