[asterisk-scf-commits] asterisk-scf/integration/sip.git branch "registrar-bugs" created.
Commits to the Asterisk SCF project code repositories
asterisk-scf-commits at lists.digium.com
Thu Dec 8 16:03:41 CST 2011
branch "registrar-bugs" has been created
at 3dcea8b184feec0f4e8b6f45835135c2d9d00fa8 (commit)
- Log -----------------------------------------------------------------
commit 3dcea8b184feec0f4e8b6f45835135c2d9d00fa8
Author: Mark Michelson <mmichelson at digium.com>
Date: Thu Dec 8 15:59:56 2011 -0600
s/BindingDict/BindingsDict/g
diff --git a/slice/AsteriskSCF/Replication/SipSessionManager/SipStateReplicationIf.ice b/slice/AsteriskSCF/Replication/SipSessionManager/SipStateReplicationIf.ice
index f9eab87..4e3467d 100644
--- a/slice/AsteriskSCF/Replication/SipSessionManager/SipStateReplicationIf.ice
+++ b/slice/AsteriskSCF/Replication/SipSessionManager/SipStateReplicationIf.ice
@@ -179,7 +179,7 @@ module V1
/**
* The bindings whose states are being set/removed
*/
- AsteriskSCF::SIP::Registration::V1::BindingDict bindings;
+ AsteriskSCF::SIP::Registration::V1::BindingsDict bindings;
/**
* In the case of setting state, this distinguishes if
* the bindings are new. If not, then the bindings are
diff --git a/src/PJSipRegistrarModule.cpp b/src/PJSipRegistrarModule.cpp
index 188d682..c8447b8 100644
--- a/src/PJSipRegistrarModule.cpp
+++ b/src/PJSipRegistrarModule.cpp
@@ -243,12 +243,12 @@ public:
void execute()
{
- BindingDict returnedBindings;
+ BindingsDict returnedBindings;
//XXX
//This is suboptimal. What may work better is to maintain
//parallel maps of BindingWrappers and Bindings so that
//we can quickly return the appropriate information instead of
- //having to construct a BindingDict on each call.
+ //having to construct a BindingsDict on each call.
BindingWrapperDict& regBindings = mRegistrar->getBindings();
for (BindingWrapperDict::iterator iter = regBindings.begin();
@@ -360,7 +360,7 @@ ContactDict RegistrarI::createContactDict(const BindingWrapperDict& bindings)
return dict;
}
-BindingDict RegistrarI::createBindingDict(const std::string& aor, const BindingWrapperSeq& bindings)
+BindingsDict RegistrarI::createBindingsDict(const std::string& aor, const BindingWrapperSeq& bindings)
{
BindingSeq returnedBindings;
for (BindingWrapperSeq::const_iterator seqIter = bindings.begin();
@@ -368,7 +368,7 @@ BindingDict RegistrarI::createBindingDict(const std::string& aor, const BindingW
{
returnedBindings.push_back((*seqIter)->mBinding);
}
- BindingDict dict;
+ BindingsDict dict;
dict.insert(make_pair(aor, returnedBindings));
return dict;
}
@@ -412,7 +412,7 @@ public:
{
if (!mNewBindings.empty())
{
- BindingDict newDict = mRegistrar->createBindingDict(mAOR, mNewBindings);
+ BindingsDict newDict = mRegistrar->createBindingsDict(mAOR, mNewBindings);
SipRegistrarStateItemPtr newItem(new SipRegistrarStateItem(mAOR, mAOR, newDict, true));
SipStateItemSeq items;
items.push_back(newItem);
@@ -421,7 +421,7 @@ public:
if (!mExistingBindings.empty())
{
- BindingDict existingDict = mRegistrar->createBindingDict(mAOR, mExistingBindings);
+ BindingsDict existingDict = mRegistrar->createBindingsDict(mAOR, mExistingBindings);
SipRegistrarStateItemPtr existingItem(new SipRegistrarStateItem(mAOR, mAOR, existingDict, false));
SipStateItemSeq items;
items.push_back(existingItem);
@@ -430,7 +430,7 @@ public:
if (!mRemovedBindings.empty())
{
- BindingDict removedDict = mRegistrar->createBindingDict(mAOR, mRemovedBindings);
+ BindingsDict removedDict = mRegistrar->createBindingsDict(mAOR, mRemovedBindings);
SipRegistrarStateItemPtr removedItem(new SipRegistrarStateItem(mAOR, mAOR, removedDict, false));
SipStateItemSeq items;
items.push_back(removedItem);
diff --git a/src/PJSipRegistrarModule.h b/src/PJSipRegistrarModule.h
index d64ec6d..0d5d4e4 100644
--- a/src/PJSipRegistrarModule.h
+++ b/src/PJSipRegistrarModule.h
@@ -77,7 +77,7 @@ public:
BindingWrapperSeq& bindings);
- AsteriskSCF::SIP::Registration::V1::BindingDict createBindingDict(const std::string& aor, const BindingWrapperSeq& bindings);
+ AsteriskSCF::SIP::Registration::V1::BindingsDict createBindingsDict(const std::string& aor, const BindingWrapperSeq& bindings);
AsteriskSCF::SIP::Registration::V1::ContactDict createContactDict(const BindingWrapperDict& bindings);
std::vector<AsteriskSCF::SIP::Registration::V1::RegistrarListenerPrx>& getListeners();
diff --git a/src/SipStateReplicatorListener.cpp b/src/SipStateReplicatorListener.cpp
index 7f5e01b..1a0ff69 100644
--- a/src/SipStateReplicatorListener.cpp
+++ b/src/SipStateReplicatorListener.cpp
@@ -111,7 +111,7 @@ public:
const PJSipRegistrarModulePtr& regModule,
const SipRegistrarStateItemPtr& regItem)
{
- for (BindingDict::iterator dictIter = regItem->bindings.begin();
+ for (BindingsDict::iterator dictIter = regItem->bindings.begin();
dictIter != regItem->bindings.end(); ++dictIter)
{
BindingSeq bindings = dictIter->second;
@@ -217,7 +217,7 @@ public:
{
//For new registrations, we need to create a sequence of BindingWrappers and call the registrar's
//addAndRemoveBindings() function.
- for (BindingDict::iterator dictIter = regItem->bindings.begin();
+ for (BindingsDict::iterator dictIter = regItem->bindings.begin();
dictIter != regItem->bindings.end(); ++dictIter)
{
BindingSeq bindings = dictIter->second;
@@ -235,7 +235,7 @@ public:
void setExistingRegistrationState(const PJSipRegistrarModulePtr& regModule, const SipRegistrarStateItemPtr& regItem)
{
- for (BindingDict::iterator dictIter = regItem->bindings.begin();
+ for (BindingsDict::iterator dictIter = regItem->bindings.begin();
dictIter != regItem->bindings.end(); ++dictIter)
{
BindingWrapperSeq& bindings = regModule->getRegistrar()->getAORBindingWrappers(dictIter->first);
commit 0d797e41516ab19f437456fe7714425d441382d3
Author: Mark Michelson <mmichelson at digium.com>
Date: Thu Dec 8 15:19:18 2011 -0600
ASTSCF-400: Use an IceUtil::TimerTask in the registrar.
diff --git a/src/PJSipRegistrarModule.cpp b/src/PJSipRegistrarModule.cpp
index e7494ab..188d682 100644
--- a/src/PJSipRegistrarModule.cpp
+++ b/src/PJSipRegistrarModule.cpp
@@ -42,12 +42,17 @@ namespace AsteriskSCF
namespace SipSessionManager
{
-class RegistrationExpired : public Work
+class RegistrationExpired : public Work, public IceUtil::TimerTask
{
public:
RegistrationExpired(const BindingWrapperPtr& wrapper)
: mWrapper(wrapper) { }
+ void runTimerTask()
+ {
+ mWrapper->mRegModule->getRegistrar()->getQueue()->enqueueWork(this);
+ }
+
void execute()
{
lg(Debug) << "Detected expiration of binding " << mWrapper->mBinding->contact;
@@ -79,32 +84,18 @@ private:
BindingWrapperPtr mWrapper;
};
-static void registrationExpired(pj_timer_heap_t *, struct pj_timer_entry *entry)
-{
- BindingWrapper *wrapper = static_cast<BindingWrapper *>(entry->user_data);
- wrapper->mRegModule->getRegistrar()->getQueue()->enqueueWork(new RegistrationExpired(wrapper));
-}
-
-static int expirationId;
-
BindingWrapper::BindingWrapper(
int expiration,
const BindingPtr& binding,
const PJSipRegistrarModulePtr& regModule,
pjsip_endpoint *endpt,
const std::string& aor)
- : mRegModule(regModule), mBinding(binding), mEndpoint(endpt), mAOR(aor)
+ : mRegModule(regModule), mBinding(binding), mEndpoint(endpt), mAOR(aor), mTimer(new IceUtil::Timer)
{
- pj_timer_entry_init(&mEntry, expirationId++, this, registrationExpired);
lg(Debug) << "Scheduling binding " << mBinding->contact << " for expiration in " << expiration << " seconds.";
scheduleRegistrationExpiration(expiration);
}
-BindingWrapper::~BindingWrapper()
-{
- cancelRegistrationExpiration();
-}
-
bool BindingWrapper::operator==(const BindingWrapper& rhs)
{
return (mBinding->contact == rhs.mBinding->contact) || rhs.mBinding->contact == "*" || mBinding->contact == "*";
@@ -117,13 +108,14 @@ bool BindingWrapper::operator==(const BindingPtr& rhs)
void BindingWrapper::cancelRegistrationExpiration()
{
- pjsip_endpt_cancel_timer(mEndpoint, &mEntry);
+ mTimer->cancel(mTimerTask);
+ mTimerTask = 0;
}
void BindingWrapper::scheduleRegistrationExpiration(int expiration)
{
- pj_time_val delay = {expiration, 0};
- pjsip_endpt_schedule_timer(mEndpoint, &mEntry, &delay);
+ mTimerTask = new RegistrationExpired(this);
+ mTimer->schedule(mTimerTask, IceUtil::Time::seconds(expiration));
}
class UpdateBinding : public Work
@@ -344,6 +336,7 @@ void RegistrarI::removeBinding(BindingWrapperSeq& currentBindings, BindingWrappe
{
lg(Debug) << "Removing binding " << wrapper->mBinding->contact;
currentBindings.erase(std::remove(currentBindings.begin(), currentBindings.end(), wrapper), currentBindings.end());
+ wrapper->cancelRegistrationExpiration();
}
void RegistrarI::removeAOR(const std::string& aor)
@@ -707,11 +700,9 @@ public:
: mTsx(tsx), mTdata(tdata), mAOR(aor), mRegistrar(registrar) { }
void execute()
{
- lg(Debug) << "In the Response thing";
BindingWrapperSeq wrappers = mRegistrar->getAORBindingWrappers(mAOR);
for (BindingWrapperSeq::const_iterator iter = wrappers.begin(); iter != wrappers.end(); ++iter)
{
- lg(Debug) << "Should be adding contact " << (*iter)->mBinding->contact;
pjsip_contact_hdr *contact = pjsip_contact_hdr_create(mTdata->pool);
contact->uri = pjsip_parse_uri(mTdata->pool, (char*) (*iter)->mBinding->contact.c_str(), (*iter)->mBinding->contact.size(), PJSIP_URI_IN_FROMTO_HDR);
contact->expires = (*iter)->mBinding->expiration - time(0);
diff --git a/src/PJSipRegistrarModule.h b/src/PJSipRegistrarModule.h
index b86edf2..d64ec6d 100644
--- a/src/PJSipRegistrarModule.h
+++ b/src/PJSipRegistrarModule.h
@@ -177,8 +177,6 @@ public:
pjsip_endpoint *endpt,
const std::string& aor);
- ~BindingWrapper();
-
/**
* Called when a binding expires.
*/
@@ -204,8 +202,9 @@ public:
PJSipRegistrarModulePtr mRegModule;
AsteriskSCF::SIP::Registration::V1::BindingPtr mBinding;
pjsip_endpoint *mEndpoint;
- pj_timer_entry mEntry;
const std::string mAOR;
+ IceUtil::TimerPtr mTimer;
+ IceUtil::TimerTaskPtr mTimerTask;
};
void registrarAuthTimeout(pj_timer_heap_t *timer_heap, struct pj_timer_entry *entry);
diff --git a/src/SipRegistrarListener.cpp b/src/SipRegistrarListener.cpp
index be963a2..4400925 100644
--- a/src/SipRegistrarListener.cpp
+++ b/src/SipRegistrarListener.cpp
@@ -102,7 +102,7 @@ void SipDefaultRegistrarListener::contactsRemoved(const BindingUpdateSeq& contac
for (SipEndpointSeq::iterator endpointIter = endpoints.begin();
endpointIter != endpoints.end(); ++endpointIter)
{
- lg(Debug) << "Removing contacts " << " from AoR " << iter->aor;
+ lg(Debug) << "Removing contacts from AoR " << iter->aor;
//Setting the endpoint's target address to be empty is the method we currently use
//to make the endpoint inaccessible. Once endpoints can support multiple addresses,
//it'll be a bit less hacky since we can just remove a specific contact from the list.
commit 9a5e2f42a121488eb42ae79b59856d0481bf459c
Author: Mark Michelson <mmichelson at digium.com>
Date: Thu Dec 8 11:04:21 2011 -0600
Fixes for ASTSCF-403, ASTSCF-402, and ASTSCF-401
* Add Contact header(s) to outgoing 200 OK responses
* Match a '*' contact to all stored contacts.
* Notify RegistrarListeners of bindings removed due to expiration.
diff --git a/src/PJSipRegistrarModule.cpp b/src/PJSipRegistrarModule.cpp
index f25624e..e7494ab 100644
--- a/src/PJSipRegistrarModule.cpp
+++ b/src/PJSipRegistrarModule.cpp
@@ -59,6 +59,17 @@ public:
{
registrar->removeAOR(mWrapper->mAOR);
}
+
+ BindingWrapperSeq wrappers(1, mWrapper);
+ BindingUpdateSeq removedBindingUpdateSeq(registrar->createBindingUpdateSeq(mWrapper->mAOR, wrappers));
+ std::vector<RegistrarListenerPrx>& listeners = registrar->getListeners();
+ for (std::vector<RegistrarListenerPrx>::iterator iter = listeners.begin();
+ iter != listeners.end(); ++iter)
+ {
+ lg(Debug) << "Alerting listener " << (*iter)->ice_getIdentity().name << " about removal of binding due to expiration.";
+ (*iter)->contactsRemoved(removedBindingUpdateSeq);
+ }
+
BindingWrapperSeq emptySeq;
BindingWrapperSeq toRemove;
toRemove.push_back(mWrapper);
@@ -96,12 +107,12 @@ BindingWrapper::~BindingWrapper()
bool BindingWrapper::operator==(const BindingWrapper& rhs)
{
- return mBinding->contact == rhs.mBinding->contact;
+ return (mBinding->contact == rhs.mBinding->contact) || rhs.mBinding->contact == "*" || mBinding->contact == "*";
}
bool BindingWrapper::operator==(const BindingPtr& rhs)
{
- return mBinding->contact == rhs->contact;
+ return (mBinding->contact == rhs->contact) || rhs->contact == "*" || mBinding->contact == "*";
}
void BindingWrapper::cancelRegistrationExpiration()
@@ -692,15 +703,27 @@ BindingWrapperPtr PJSipRegistrarModule::createNewBinding(pjsip_contact_hdr *cont
class Response : public Work
{
public:
- Response(pjsip_transaction *tsx, pjsip_tx_data *tdata)
- : mTsx(tsx), mTdata(tdata) { }
+ Response(pjsip_transaction *tsx, pjsip_tx_data *tdata, const std::string& aor, const RegistrarIPtr& registrar)
+ : mTsx(tsx), mTdata(tdata), mAOR(aor), mRegistrar(registrar) { }
void execute()
{
+ lg(Debug) << "In the Response thing";
+ BindingWrapperSeq wrappers = mRegistrar->getAORBindingWrappers(mAOR);
+ for (BindingWrapperSeq::const_iterator iter = wrappers.begin(); iter != wrappers.end(); ++iter)
+ {
+ lg(Debug) << "Should be adding contact " << (*iter)->mBinding->contact;
+ pjsip_contact_hdr *contact = pjsip_contact_hdr_create(mTdata->pool);
+ contact->uri = pjsip_parse_uri(mTdata->pool, (char*) (*iter)->mBinding->contact.c_str(), (*iter)->mBinding->contact.size(), PJSIP_URI_IN_FROMTO_HDR);
+ contact->expires = (*iter)->mBinding->expiration - time(0);
+ pjsip_msg_add_hdr(mTdata->msg, (pjsip_hdr*) contact);
+ }
pjsip_tsx_send_msg(mTsx, mTdata);
}
private:
pjsip_transaction *mTsx;
pjsip_tx_data *mTdata;
+ const std::string mAOR;
+ RegistrarIPtr mRegistrar;
};
bool PJSipRegistrarModule::checkAuth(pjsip_rx_data *rdata, pjsip_transaction *tsx, RequestType type)
@@ -811,7 +834,7 @@ pj_bool_t PJSipRegistrarModule::on_rx_request(pjsip_rx_data *rdata)
// our internal bindings.
pjsip_tx_data *tdata;
pjsip_endpt_create_response(tsx->endpt, rdata, 200, NULL, &tdata);
- mRegistrar->getQueue()->enqueueWork(new Response(tsx, tdata));
+ mRegistrar->getQueue()->enqueueWork(new Response(tsx, tdata, aor, mRegistrar));
replicateState(aor, existingBindings, newBindings, removedBindings);
-----------------------------------------------------------------------
--
asterisk-scf/integration/sip.git
More information about the asterisk-scf-commits
mailing list