From e8e19a39df19a76b361afdc81bc97515bf034235 Mon Sep 17 00:00:00 2001 From: Stefan Sayer Date: Thu, 3 May 2007 00:23:07 +0000 Subject: [PATCH] corrected AmArg ownership of ArgObject. use explicit setBorrowedPointer method to make an AmArg containing a ArgObject*. git-svn-id: http://svn.berlios.de/svnroot/repos/sems/trunk@325 8eb893ce-cfd4-0310-b710-fb5ebe64c474 --- apps/registrar_client/SIPRegistrarClient.cpp | 50 ++++++++++++-------- core/AmArg.h | 25 +++++----- core/plug-in/uac_auth/UACAuth.cpp | 2 + 3 files changed, 44 insertions(+), 33 deletions(-) diff --git a/apps/registrar_client/SIPRegistrarClient.cpp b/apps/registrar_client/SIPRegistrarClient.cpp index a0cee40d..d590b273 100644 --- a/apps/registrar_client/SIPRegistrarClient.cpp +++ b/apps/registrar_client/SIPRegistrarClient.cpp @@ -389,27 +389,35 @@ void SIPRegistration::onSipReply(AmSipReply& reply) { void SIPRegistrarClient::onNewRegistration(SIPNewRegistrationEvent* new_reg) { - SIPRegistration* reg = new SIPRegistration(new_reg->handle, new_reg->info, - new_reg->sess_link); - - if (uac_auth_i != NULL) { - DBG("enabling UAC Auth for new registration.\n"); - - // get a sessionEventHandler from uac_auth - AmArgArray di_args,ret; - di_args.push(reg); - di_args.push(reg); - uac_auth_i->invoke("getHandler", di_args, ret); - ArgObject* p = ret.get(0).asObject(); - if (p != NULL) { - AmSessionEventHandler* h = dynamic_cast(p); - if (h != NULL) - reg->setSessionEventHandler(h); - } - } - - add_reg(new_reg->handle, reg); - reg->doRegistration(); + SIPRegistration* reg = new SIPRegistration(new_reg->handle, new_reg->info, + new_reg->sess_link); + + if (uac_auth_i != NULL) { + DBG("enabling UAC Auth for new registration.\n"); + + // get a sessionEventHandler from uac_auth + AmArgArray di_args,ret; + AmArg a; + a.setBorrowedPointer(reg); + di_args.push(a); + di_args.push(a); + DBG("arg type is %d\n", a.getType()); + + uac_auth_i->invoke("getHandler", di_args, ret); + if (!ret.size()) { + ERROR("Can not add auth handler to new registration!\n"); + } else { + ArgObject* p = ret.get(0).asObject(); + if (p != NULL) { + AmSessionEventHandler* h = dynamic_cast(p); + if (h != NULL) + reg->setSessionEventHandler(h); + } + } + } + + add_reg(new_reg->handle, reg); + reg->doRegistration(); } void SIPRegistrarClient::onRemoveRegistration(SIPRemoveRegistrationEvent* new_reg) { diff --git a/core/AmArg.h b/core/AmArg.h index 8660b3e5..e0baffbc 100644 --- a/core/AmArg.h +++ b/core/AmArg.h @@ -38,7 +38,6 @@ using std::vector; class ArgObject { public: ArgObject() { } - virtual ArgObject* clone() { return new ArgObject(*this); } virtual ~ArgObject() { } }; @@ -63,12 +62,11 @@ class AmArg // value union { - int v_int; double v_double; const char* v_cstr; - ArgObject* v_obj; - void* v_ptr; + ArgObject* v_obj; + void* v_ptr; }; public: @@ -79,12 +77,16 @@ class AmArg case Int: v_int = v.v_int; break; case Double: v_double = v.v_double; break; case CStr: v_cstr = strdup(v.v_cstr); break; - case AObject: v_obj = v.v_obj->clone(); break; + case AObject: v_obj = v.v_obj; break; case APointer: v_ptr = v.v_ptr; break; default: assert(0); } } + AmArg() + : type(Undef) + {} + AmArg(const int& v) : type(Int), v_int(v) @@ -101,12 +103,6 @@ class AmArg v_cstr = strdup(v); } - AmArg(ArgObject* v) - : type(AObject) - { - v_obj = v->clone(); - } - AmArg(void* v) : type(APointer), v_ptr(v) @@ -114,11 +110,16 @@ class AmArg ~AmArg() { if(type == CStr) free((void*)v_cstr); - else if(type == AObject) delete v_obj; } short getType() const { return type; } + void setBorrowedPointer(ArgObject* v) { + type = AObject; + v_obj = v; + } + + int asInt() const { return v_int; } double asDouble() const { return v_double; } const char* asCStr() const { return v_cstr; } diff --git a/core/plug-in/uac_auth/UACAuth.cpp b/core/plug-in/uac_auth/UACAuth.cpp index b50c41bb..4b205ed3 100644 --- a/core/plug-in/uac_auth/UACAuth.cpp +++ b/core/plug-in/uac_auth/UACAuth.cpp @@ -56,6 +56,8 @@ void UACAuthFactory::invoke(const string& method, const AmArgArray& args, AmArgA if ((c!=NULL)&&(cc!=NULL)) { ret.push(getHandler(cc->getDlg(), c)); } else { + ERROR("wrong types in call to getHandler. (c=%ld, cc= %ld)\n", + (unsigned long)c, (unsigned long)cc); } } else