Added helper class to keep extra account parameters for calls and registration.

Added extra account parameters handling to SIP channel.


git-svn-id: http://voip.null.ro/svn/yate@6066 acf43c95-373e-0410-b603-e72c3f656dc1
This commit is contained in:
paulc 2015-11-18 14:20:00 +00:00
parent 8c420d6d11
commit 747e32afd8
3 changed files with 146 additions and 16 deletions

View File

@ -1809,4 +1809,58 @@ void Router::cleanup()
destruct(m_msg);
}
void CallAccount::pickAccountParams(const NamedList& params)
{
NamedIterator iter(params);
Lock mylock(m_mutex);
m_inbParams.clearParams();
m_outParams.clearParams();
m_regParams.clearParams();
while (const NamedString* n = iter.get()) {
if (n->name().length() <= 4)
continue;
String name = n->name().substr(4).trimSpaces();
if (n->name().startsWith("reg:"))
m_regParams.setParam(name,*n);
else if (n->name().startsWith("inb:"))
m_inbParams.setParam(name,*n);
else if (n->name().startsWith("out:"))
m_outParams.setParam(name,*n);
}
}
void CallAccount::setInboundParams(NamedList& params)
{
Lock mylock(m_mutex);
NamedIterator iter(m_inbParams);
while (const NamedString* n = iter.get()) {
String tmp(*n);
params.replaceParams(tmp);
params.setParam(n->name(),tmp);
}
}
void CallAccount::setOutboundParams(NamedList& params)
{
Lock mylock(m_mutex);
NamedIterator iter(m_outParams);
while (const NamedString* n = iter.get()) {
String tmp(*n);
params.replaceParams(tmp);
params.setParam(n->name(),tmp);
}
}
void CallAccount::setRegisterParams(NamedList& params)
{
Lock mylock(m_mutex);
NamedIterator iter(m_regParams);
while (const NamedString* n = iter.get()) {
String tmp(*n);
params.replaceParams(tmp);
params.setParam(n->name(),tmp);
}
}
/* vi: set ts=8 sw=4 sts=4 noet: */

View File

@ -663,7 +663,7 @@ private:
bool m_foreignAuth;
};
class YateSIPLine : public String, public Mutex, public YateSIPPartyHolder
class YateSIPLine : public String, public Mutex, public CallAccount, public YateSIPPartyHolder
{
YCLASS(YateSIPLine,String)
public:
@ -5910,6 +5910,8 @@ YateSIPConnection::YateSIPConnection(SIPEvent* ev, SIPTransaction* tr)
DDebug(this,DebugAll,"RTP addr '%s' [%p]",m_rtpAddr.c_str(),this);
if (reason)
m->addParam("reason",reason);
if (line)
line->setInboundParams(*m);
m_route = m;
Message* s = message("chan.startup");
s->addParam("caller",m_uri.getUser());
@ -5931,10 +5933,17 @@ YateSIPConnection::YateSIPConnection(Message& msg, const String& uri, const char
m_honorDtmfDetect(s_honorDtmfDetect),
m_referring(false), m_reInviting(ReinviteNone), m_lastRseq(0), m_revert("")
{
m_ipv6 = msg.getBoolValue(YSTRING("ipv6_support"),s_ipv6);
setSdpDebug(this,this);
Debug(this,DebugAll,"YateSIPConnection::YateSIPConnection(%p,'%s') [%p]",
&msg,uri.c_str(),this);
m_line = msg.getValue(YSTRING("line"));
YateSIPLine* line = 0;
if (m_line) {
line = plugin.findLine(m_line);
if (line)
line->setOutboundParams(msg);
}
m_ipv6 = msg.getBoolValue(YSTRING("ipv6_support"),s_ipv6);
setSdpDebug(this,this);
m_targetid = target;
setReason();
m_checkAllowInfo = msg.getBoolValue(YSTRING("ocheck_allow_info"),m_checkAllowInfo);
@ -5954,20 +5963,15 @@ YateSIPConnection::YateSIPConnection(Message& msg, const String& uri, const char
setRfc2833(msg.getParam(YSTRING("rfc2833")));
m_rtpForward = msg.getBoolValue(YSTRING("rtp_forward"));
m_user = msg.getValue(YSTRING("user"));
m_line = msg.getValue(YSTRING("line"));
String tmp;
YateSIPLine* line = 0;
if (m_line) {
line = plugin.findLine(m_line);
if (line) {
if (uri.find('@') < 0 && !uri.startsWith("tel:")) {
if (!uri.startsWith("sip:"))
tmp = "sip:";
tmp << uri << "@";
SocketAddr::appendAddr(tmp,line->domain());
}
m_externalAddr = line->getLocalAddr();
if (line) {
if (uri.find('@') < 0 && !uri.startsWith("tel:")) {
if (!uri.startsWith("sip:"))
tmp = "sip:";
tmp << uri << "@";
SocketAddr::appendAddr(tmp,line->domain());
}
m_externalAddr = line->getLocalAddr();
}
if (tmp.null()) {
if (!(uri.startsWith("tel:") || uri.startsWith("sip:"))) {
@ -8066,7 +8070,7 @@ bool YateSIPConnection::sendTone(Message& msg, const char* tone, int meth, bool&
YateSIPLine::YateSIPLine(const String& name)
: String(name), Mutex(true,"YateSIPLine"),
: String(name), Mutex(true,"YateSIPLine"), CallAccount(this),
m_resend(0), m_keepalive(0), m_interval(0), m_alive(0),
m_flags(-1), m_trans(-1), m_tr(0), m_marked(false), m_valid(false),
m_localPort(0), m_partyPort(0), m_localDetect(false),
@ -8172,6 +8176,7 @@ SIPMessage* YateSIPLine::buildRegister(int expires)
*hl = display + " " + *hl;
}
}
copySipHeaders(*m,registerParams());
return m;
}
@ -8432,6 +8437,7 @@ bool YateSIPLine::update(const Message& msg)
setParty();
return true;
}
pickAccountParams(msg);
bool chg = updateProto(msg);
bool transChg = chg;
transChg = updateLocalAddr(msg) || transChg;

View File

@ -2471,6 +2471,76 @@ protected:
{ return m_id; }
};
/**
* This helper class holds generic account parameters that are applied to calls
* @short Settings for an account handling calls
*/
class YATE_API CallAccount
{
YNOCOPY(CallAccount);
private:
Mutex* m_mutex;
NamedList m_inbParams;
NamedList m_outParams;
NamedList m_regParams;
public:
/**
* Make a copy of the inbound and outbound parameter templates
* @param params List of parameters to copy from
*/
void pickAccountParams(const NamedList& params);
/**
* Patch the inbound call parameters
* @param params List of parameters to be patched
*/
void setInboundParams(NamedList& params);
/**
* Patch the outbound call parameters
* @param params List of parameters to be patched
*/
void setOutboundParams(NamedList& params);
/**
* Patch registration parameters
* @param params List of parameters to be patched
*/
void setRegisterParams(NamedList& params);
/**
* Accessor for the inbound call parameters list
* @return Reference to the inbound call parameters
*/
inline const NamedList& inboundParams() const
{ return m_inbParams; }
/**
* Accessor for the outbound call parameters list
* @return Reference to the outbound call parameters
*/
inline const NamedList& outboundParams() const
{ return m_outParams; }
/**
* Accessor for the registration parameters list
* @return Reference to the registration parameters
*/
inline const NamedList& registerParams() const
{ return m_regParams; }
protected:
/**
* Constructor
* @param mutex The mutex that is used to lock object's variables
*/
inline CallAccount(Mutex* mutex)
: m_mutex(mutex), m_inbParams(""), m_outParams(""), m_regParams("")
{ }
};
/**
* Find if a string appears to be an E164 phone number
* @param str String to check