Added setting for printing debug messages when mandatory parameters are missing.

git-svn-id: http://voip.null.ro/svn/yate@4724 acf43c95-373e-0410-b603-e72c3f656dc1
This commit is contained in:
oana 2011-11-25 11:35:14 +00:00
parent 0ac5de0981
commit 6fd3227b6b
2 changed files with 60 additions and 10 deletions

View File

@ -5,7 +5,14 @@
; This file keeps the configuration for the module which translates MAP/CAMEL protocol data to XML and vice versa.
; Each section configures a separate translator
; Each one the sections defined below except 'general' configures a separate translator
[general]
;This section configures global settings of the module
; show-missing: bool: Print debug messages when a mandatory MAP/CAMEL parameter is missing. This option is applicable on reload.
;show-missing=true
;[tcap map]
; This section configures a TCAP User MAP/CAMEL protocol translator

View File

@ -337,6 +337,8 @@ public:
virtual void initialize();
// uninstall relays and message handlers
bool unload();
inline bool showMissing()
{ return m_showMissing; }
protected:
// inherited methods
virtual bool received(Message& msg, int id);
@ -349,6 +351,7 @@ private:
bool m_init;
Mutex m_usersMtx;
ObjList m_users;
bool m_showMissing;
};
INIT_PLUGIN(TcapXModule);
@ -360,6 +363,16 @@ UNLOAD_PLUGIN(unloadNow)
return true;
}
void printMissing(const char* missing, const char* parent, bool atEncoding = true)
{
if (__plugin.showMissing())
Debug(&__plugin,DebugMild,
(atEncoding ?
"Missing mandatory child '%s' in XML parent '%s'" :
"Missing mandatory parameter '%s' in payload for '%s'"),
missing,parent);
}
const String s_namespace = "http://yate.null.ro/xml/tcap/v1";
static const String s_msgTag = "m";
@ -559,10 +572,8 @@ static bool encodeParam(const Parameter* param, DataBlock& data, XmlElement* ele
else {
XmlElement* child = (elem->getTag() == s_component ? elem->findFirstChild(&param->name) : elem);
if (!child) {
if (!param->isOptional) {
err = TcapXApplication::DataMissing;
if (!param->isOptional)
return false;
}
return true;
}
ok = type->encode(param,type,data,child,err);
@ -988,6 +999,8 @@ static bool decodeSeq(const Parameter* param, MapCamelType* type, AsnTag& tag, D
AsnTag::decode(childTag,data);
if (!decodeParam(params,childTag,data,child,addEnc,err)) {
if (!params->isOptional) {
if (err != TcapXApplication::DataMissing)
printMissing(params->name.c_str(),param->name.c_str(),false);
err = TcapXApplication::DataMissing;
return false;
}
@ -1015,6 +1028,7 @@ static bool encodeSeq(const Parameter* param, MapCamelType* type, DataBlock& dat
XmlElement* child = elem->findFirstChild(&name);
if (!child) {
if (!params->isOptional) {
printMissing(params->name.c_str(),param->name.c_str());
err = TcapXApplication::DataMissing;
return false;
}
@ -1065,6 +1079,8 @@ static bool decodeSeqOf(const Parameter* param, MapCamelType* type, AsnTag& tag,
AsnTag::decode(childTag,data);
if (!decodeParam(params,childTag,data,child,addEnc,err)) {
if (!param->isOptional) {
if (err != TcapXApplication::DataMissing)
printMissing(params->name.c_str(),param->name.c_str(),false);
err = TcapXApplication::DataMissing;
return false;
}
@ -1090,6 +1106,7 @@ static bool encodeSeqOf(const Parameter* param, MapCamelType* type, DataBlock& d
if (!(child->getTag() == params->name)) {
if (!param->isOptional) {
TelEngine::destruct(child);
printMissing(params->name.c_str(),param->name.c_str());
err = TcapXApplication::DataMissing;
return false;
}
@ -1140,10 +1157,15 @@ static bool decodeChoice(const Parameter* param, MapCamelType* type, AsnTag& tag
params++;
continue;
}
break;
return true;
}
if (err != TcapXApplication::DataMissing) {
if (__plugin.showMissing())
Debug(&__plugin,DebugNote,"No valid choice in payload for '%s'",child->tag());
err = TcapXApplication::DataMissing;
}
}
return true;
return false;
}
static bool encodeChoice(const Parameter* param, MapCamelType* type, DataBlock& data, XmlElement* elem, int& err)
@ -1174,6 +1196,11 @@ static bool encodeChoice(const Parameter* param, MapCamelType* type, DataBlock&
}
TelEngine::destruct(child);
}
if (err != TcapXApplication::DataMissing) {
if (__plugin.showMissing())
Debug(&__plugin,DebugNote,"No valid choice was given for parent '%s'",elem->tag());
err = TcapXApplication::DataMissing;
}
return false;
}
@ -5709,8 +5736,15 @@ bool TcapToXml::decodeOperation(Operation* op, XmlElement* elem, DataBlock& data
AsnTag tag;
AsnTag::decode(tag,data);
if (!decodeParam(param,tag,data,elem,m_app->addEncoding(),err)) {
if (!param->isOptional)
err = TcapXApplication::DataMissing;
if (!param->isOptional && (err != TcapXApplication::DataMissing)) {
if (opTag == s_noTag) {
const Parameter* tmp = param;
if ((++tmp) && TelEngine::null(tmp->name))
printMissing(param->name.c_str(),elem->tag(),false);
}
else
printMissing(param->name.c_str(),elem->tag(),false);
}
}
else if (opTag == s_noTag) // should be only one child
break;
@ -5859,9 +5893,17 @@ void XmlToTcap::encodeOperation(Operation* op, XmlElement* elem, DataBlock& payl
AsnTag opTag = (searchArgs ? op->argTag : op->retTag);
while (param && !TelEngine::null(param->name)) {
DataBlock db;
err = TcapXApplication::NoError;
if (!encodeParam(param,db,elem,err)) {
if (!param->isOptional)
err = TcapXApplication::DataMissing;
if (!param->isOptional && (err != TcapXApplication::DataMissing)) {
if (opTag == s_noTag) {
const Parameter* tmp = param;
if ((++tmp) && TelEngine::null(tmp->name))
printMissing(param->name.c_str(),elem->tag());
}
else
printMissing(param->name.c_str(),elem->tag());
}
}
else {
payload.append(db);
@ -6887,6 +6929,7 @@ void TcapXModule::initialize()
Configuration cfg(Engine::configFile(name()));
installRelay(Halt);
cfg.load();
m_showMissing = cfg.getBoolValue(YSTRING("general"),YSTRING("show-missing"),true);
initUsers(cfg);
}