本文整理汇总了C++中TransactionEntry::MTCSendTrying方法的典型用法代码示例。如果您正苦于以下问题:C++ TransactionEntry::MTCSendTrying方法的具体用法?C++ TransactionEntry::MTCSendTrying怎么用?C++ TransactionEntry::MTCSendTrying使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类TransactionEntry
的用法示例。
在下文中一共展示了TransactionEntry::MTCSendTrying方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: checkInvite
bool SIPInterface::checkInvite( osip_message_t * msg)
{
LOG(DEBUG);
// This code dispatches new transactions coming from the network-side SIP interface.
// All transactions originating here are going to be mobile-terminated.
// Yes, this method is too long and needs to be broken up into smaller steps.
// Is there even a method?
const char *method = msg->sip_method;
if (!method) return false;
// Check for INVITE or MESSAGE methods.
// Check channel availability now, too.
GSM::ChannelType requiredChannel;
bool channelAvailable = false;
GSM::L3CMServiceType serviceType;
// pretty sure strings are garbage collected
string proxy = get_return_address(msg);
if (strcmp(method,"INVITE") == 0) {
// INVITE is for MTC.
// Set the required channel type to match the assignment style.
if (gConfig.defines("Control.VEA")) {
// Very early assignment.
requiredChannel = GSM::TCHFType;
channelAvailable = gBTS.TCHAvailable();
} else {
// Early assignment
requiredChannel = GSM::SDCCHType;
channelAvailable = gBTS.SDCCHAvailable() && gBTS.TCHAvailable();
}
serviceType = L3CMServiceType::MobileTerminatedCall;
}
else if (strcmp(method,"MESSAGE") == 0) {
// MESSAGE is for MTSMS.
requiredChannel = GSM::SDCCHType;
channelAvailable = gBTS.SDCCHAvailable();
serviceType = L3CMServiceType::MobileTerminatedShortMessage;
}
else {
// Not a method handled here.
LOG(DEBUG) << "non-initiating SIP method " << method;
return false;
}
// Get request username (IMSI) from invite.
const char* IMSI = extractIMSI(msg);
if (!IMSI) {
// FIXME -- Send appropriate error (404) on SIP interface.
LOG(WARNING) << "Incoming INVITE/MESSAGE with no IMSI";
return false;
}
L3MobileIdentity mobileID(IMSI);
// Get the SIP call ID.
const char * callIDNum = extractCallID(msg);
if (!callIDNum) {
// FIXME -- Send appropriate error on SIP interface.
LOG(WARNING) << "Incoming INVITE/MESSAGE with no call ID";
return false;
}
// Find any active transaction for this IMSI with an assigned TCH or SDCCH.
GSM::LogicalChannel *chan = gTransactionTable.findChannel(mobileID);
if (chan) {
// If the type is TCH and the service is SMS, get the SACCH.
// Otherwise, for now, just say chan=NULL.
if (serviceType==L3CMServiceType::MobileTerminatedShortMessage && chan->type()==FACCHType) {
chan = chan->SACCH();
} else {
// FIXME -- This will change to support multiple transactions.
chan = NULL;
}
}
// Check SIP map. Repeated entry? Page again.
if (mSIPMap.map().readNoBlock(callIDNum) != NULL) {
TransactionEntry* transaction= gTransactionTable.find(mobileID,callIDNum);
// There's a FIFO but no trasnaction record?
if (!transaction) {
LOG(WARNING) << "repeated INVITE/MESSAGE with no transaction record";
// Delete the bogus FIFO.
mSIPMap.remove(callIDNum);
return false;
}
// There is transaction already. Send trying, if appropriate.
if (serviceType!=L3CMServiceType::MobileTerminatedShortMessage) transaction->MTCSendTrying();
// And if no channel is established yet, page again.
if (!chan) {
LOG(INFO) << "repeated SIP INVITE/MESSAGE, repaging for transaction " << *transaction;
gBTS.pager().addID(mobileID,requiredChannel,*transaction);
}
return false;
}
// So we will need a new channel.
// Check gBTS for channel availability.
if (!chan && !channelAvailable) {
// FIXME -- Send 503 "Service Unavailable" response on SIP interface.
//.........这里部分代码省略.........