Module: sems
Branch: master
Commit: 3af67ec695e9ca69346deda4b80b5b0dfae9b7cb
URL:    
http://git.sip-router.org/cgi-bin/gitweb.cgi/sems/?a=commit;h=3af67ec695e9ca69346deda4b80b5b0dfae9b7cb

Author: Raphael Coeffic <[email protected]>
Committer: Raphael Coeffic <[email protected]>
Date:   Mon Sep 27 12:54:03 2010 +0200

adds AmDynInvoke pointer to the supported payloads in AmArg.

---

 core/AmArg.cpp |    8 ++++++++
 core/AmArg.h   |   25 +++++++++++++++++++++----
 2 files changed, 29 insertions(+), 4 deletions(-)

diff --git a/core/AmArg.cpp b/core/AmArg.cpp
index 18c8c25..1940f21 100644
--- a/core/AmArg.cpp
+++ b/core/AmArg.cpp
@@ -37,6 +37,7 @@ const char* AmArg::t2str(int type) {
   case AmArg::Double:  return "Double";
   case AmArg::CStr:    return "CStr";
   case AmArg::AObject: return "AObject";
+  case AmArg::ADynInv: return "ADynInv";
   case AmArg::Blob:    return "Blob";
   case AmArg::Array:   return "Array";
   case AmArg::Struct:  return "Struct";
@@ -62,6 +63,7 @@ AmArg& AmArg::operator=(const AmArg& v) {
     case Double: { v_double = v.v_double; } break;
     case CStr:   { v_cstr = strdup(v.v_cstr); } break;
     case AObject:{ v_obj = v.v_obj; } break;
+    case ADynInv:{ v_inv = v.v_inv; } break;
     case Array:  { v_array = new ValueArray(*v.v_array); } break;
     case Struct: { v_struct = new ValueStruct(*v.v_struct); } break;
     case Blob:   {  v_blob = new ArgBlob(*v.v_blob); } break;
@@ -306,6 +308,7 @@ bool operator==(const AmArg& lhs, const AmArg& rhs) {
   case AmArg::Double: { return lhs.v_double == rhs.v_double; } break;
   case AmArg::CStr:   { return !strcmp(lhs.v_cstr,rhs.v_cstr); } break;
   case AmArg::AObject:{ return lhs.v_obj == rhs.v_obj; } break;
+  case AmArg::ADynInv:{ return lhs.v_inv == rhs.v_inv; } break;
   case AmArg::Array:  { return lhs.v_array == rhs.v_array;  } break;
   case AmArg::Struct: { return lhs.v_struct == rhs.v_struct;  } break;
   case AmArg::Blob:   {  return (lhs.v_blob->len == rhs.v_blob->len) &&  
@@ -363,6 +366,7 @@ void AmArg::assertArrayFmt(const char* format) const {
       case 'f': assertArgDouble(get(i)); got+='f'; break;
       case 's': assertArgCStr(get(i)); got+='s'; break;
       case 'o': assertArgAObject(get(i)); got+='o'; break;
+      case 'd': assertArgADynInv(get(i)); got+='d'; break;
       case 'a': assertArgArray(get(i)); got+='a'; break;
       case 'b': assertArgBlob(get(i)); got+='b'; break;
       case 'u': assertArgStruct(get(i)); got+='u'; break;
@@ -415,6 +419,10 @@ string AmArg::print(const AmArg &a) {
       return double2str(a.asDouble());
     case CStr:
       return "'" + string(a.asCStr()) + "'";
+    case AObject:
+      return "<Object>";
+    case ADynInv:
+      return "<DynInv>";
     case Array:
       s = "[";
       for (size_t i = 0; i < a.size(); i ++)
diff --git a/core/AmArg.h b/core/AmArg.h
index 0848e0b..6d6a410 100644
--- a/core/AmArg.h
+++ b/core/AmArg.h
@@ -49,11 +49,13 @@ class ArgObject {
   virtual ~ArgObject() { }
 };
 
-struct ArgBlob {  char* data;
+struct ArgBlob {  
+
+  char* data;
   int   len;
   
-ArgBlob() 
-: data(NULL),len(0)
+  ArgBlob() 
+  : data(NULL),len(0)
   {  
   }
 
@@ -74,6 +76,8 @@ ArgBlob()
   ~ArgBlob() { if (data) free(data); }
 };
 
+class AmDynInvoke;
+
 /** \brief variable type argument for DynInvoke APIs */
 class AmArg
 : public ArgObject
@@ -87,7 +91,8 @@ class AmArg
     Bool,
     Double,
     CStr,
-    AObject,           // for passing pointers to objects not owned by AmArg
+    AObject, // pointer to an object not owned by AmArg
+    ADynInv, // pointer to a AmDynInvoke (useful for call backs)
     Blob,
     
     Array,
@@ -116,6 +121,7 @@ class AmArg
     double         v_double;
     const char*    v_cstr;
     ArgObject*     v_obj;
+    AmDynInvoke*   v_inv;
     ArgBlob*       v_blob;
     ValueArray*    v_array;
     ValueStruct*   v_struct;
@@ -169,6 +175,11 @@ class AmArg
     v_obj(v) 
    { }
 
+  AmArg(AmDynInvoke* v) 
+    : type(ADynInv),
+    v_inv(v) 
+   { }
+
   // convenience constructors
   AmArg(vector<std::string>& v);
   AmArg(const vector<int>& v );
@@ -196,6 +207,7 @@ class AmArg
 #define isArgBool(a) (AmArg::Bool == a.getType())
 #define isArgCStr(a) (AmArg::CStr == a.getType())
 #define isArgAObject(a) (AmArg::AObject == a.getType())
+#define isArgADynInv(a) (AmArg::ADynInv == a.getType())
 #define isArgBlob(a) (AmArg::Blob == a.getType())
 
 #define _THROW_TYPE_MISMATCH(exp,got) \
@@ -222,6 +234,9 @@ class AmArg
 #define assertArgAObject(a)                    \
   if (!isArgAObject(a))                                \
        _THROW_TYPE_MISMATCH(AObject,a);
+#define assertArgADynInv(a)                    \
+  if (!isArgADynInv(a))                                \
+       _THROW_TYPE_MISMATCH(ADynInv,a);
 #define assertArgBlob(a)                       \
   if (!isArgBlob(a))                           \
        _THROW_TYPE_MISMATCH(Blob,a);
@@ -240,6 +255,7 @@ class AmArg
   double      asDouble() const { return v_double; }
   const char* asCStr()   const { return v_cstr; }
   ArgObject*  asObject() const { return v_obj; }
+  AmDynInvoke* asDynInv() const { return v_inv; }
   ArgBlob*    asBlob()   const { return v_blob; }
   ValueStruct* asStruct() const { return v_struct; }
 
@@ -304,6 +320,7 @@ class AmArg
    *   f  - double
    *   s  - cstr
    *   o  - object
+   *   d  - dyninvoke
    *   b  - blob
    *   a  - array
    *   u  - struct

_______________________________________________
Semsdev mailing list
[email protected]
http://lists.iptel.org/mailman/listinfo/semsdev

Reply via email to