tm: added export structure for extra API
authorDaniel-Constantin Mierla <miconda@gmail.com>
Wed, 17 Nov 2010 11:53:18 +0000 (12:53 +0100)
committerDaniel-Constantin Mierla <miconda@gmail.com>
Wed, 17 Nov 2010 11:53:18 +0000 (12:53 +0100)
- used for not-so-common inter-module API functions
- initial tm API structure got quite big and not all functions are very
  used

modules/tm/tm.c
modules/tm/tm_load.c
modules/tm/tm_load.h

index e5ca753..e8ef946 100644 (file)
@@ -292,12 +292,12 @@ static int t_branch_timeout(struct sip_msg* msg, char*, char*);
 static int t_branch_replied(struct sip_msg* msg, char*, char*);
 static int t_any_timeout(struct sip_msg* msg, char*, char*);
 static int t_any_replied(struct sip_msg* msg, char*, char*);
-static int t_is_canceled(struct sip_msg* msg, char*, char*);
+static int w_t_is_canceled(struct sip_msg* msg, char*, char*);
 static int t_is_expired(struct sip_msg* msg, char*, char*);
 static int t_grep_status(struct sip_msg* msg, char*, char*);
 static int w_t_drop_replies(struct sip_msg* msg, char* foo, char* bar);
 static int w_t_save_lumps(struct sip_msg* msg, char* foo, char* bar);
-static int t_check_trans(struct sip_msg* msg, char* foo, char* bar);
+static int w_t_check_trans(struct sip_msg* msg, char* foo, char* bar);
 
 
 /* by default the fr timers avps are not set, so that the avps won't be
@@ -448,7 +448,7 @@ static cmd_export_t cmds[]={
                        REQUEST_ROUTE|TM_ONREPLY_ROUTE|FAILURE_ROUTE|BRANCH_ROUTE },
        {"t_any_replied",     t_any_replied,            0, 0, 
                        REQUEST_ROUTE|TM_ONREPLY_ROUTE|FAILURE_ROUTE|BRANCH_ROUTE },
-       {"t_is_canceled",     t_is_canceled,            0, 0,
+       {"t_is_canceled",     w_t_is_canceled,          0, 0,
                        REQUEST_ROUTE|TM_ONREPLY_ROUTE|FAILURE_ROUTE|BRANCH_ROUTE },
        {"t_is_expired",      t_is_expired,             0, 0,
                        REQUEST_ROUTE|TM_ONREPLY_ROUTE|FAILURE_ROUTE|BRANCH_ROUTE },
@@ -460,7 +460,7 @@ static cmd_export_t cmds[]={
                        FAILURE_ROUTE},
        {"t_save_lumps",      w_t_save_lumps,           0, 0,
                        REQUEST_ROUTE},
-       {"t_check_trans",       t_check_trans,                          0, 0,
+       {"t_check_trans",         w_t_check_trans,                      0, 0,
                        REQUEST_ROUTE|TM_ONREPLY_ROUTE|BRANCH_ROUTE },
 
        {"t_load_contacts", t_load_contacts,            0, 0,
@@ -470,6 +470,7 @@ static cmd_export_t cmds[]={
 
        /* not applicable from the script */
        {"load_tm",            (cmd_function)load_tm,           NO_SCRIPT,   0, 0},
+       {"load_xtm",           (cmd_function)load_xtm,          NO_SCRIPT,   0, 0},
        {0,0,0,0,0}
 };
 
@@ -1755,7 +1756,7 @@ int t_branch_replied(struct sip_msg* msg, char* foo, char* bar)
 
 
 /* script function, returns: 1 if the transaction was canceled, -1 if not */
-int t_is_canceled(struct sip_msg* msg, char* foo, char* bar)
+int t_is_canceled(struct sip_msg* msg)
 {
        struct cell *t;
        int ret;
@@ -1773,6 +1774,11 @@ int t_is_canceled(struct sip_msg* msg, char* foo, char* bar)
        return ret;
 }
 
+static int w_t_is_canceled(struct sip_msg* msg, char* foo, char* bar)
+{
+       return t_is_canceled(msg);
+}
+
 /* script function, returns: 1 if the transaction lifetime interval has already elapsed, -1 if not */
 int t_is_expired(struct sip_msg* msg, char* foo, char* bar)
 {
@@ -1937,7 +1943,7 @@ int w_t_reply_wrp(struct sip_msg *m, unsigned int code, char *txt)
  *       reliable: if the ACK  is delayed the proxied transaction might
  *       be already deleted when it reaches the proxy (wait_timeout))
  */
-static int t_check_trans(struct sip_msg* msg, char* foo, char* bar)
+int t_check_trans(struct sip_msg* msg)
 {
        struct cell* t;
        
@@ -1976,6 +1982,11 @@ static int t_check_trans(struct sip_msg* msg, char* foo, char* bar)
        return -1;
 }
 
+static int w_t_check_trans(struct sip_msg* msg, char* foo, char* bar)
+{
+       return t_check_trans(msg);
+}
+
 static int hexatoi(str *s, unsigned int* result)
 {
        int i, xv, fact;
index 58fd440..d57fd45 100644 (file)
@@ -145,3 +145,22 @@ int load_tm( struct tm_binds *tmb)
 #endif
        return 1;
 }
+
+int load_xtm(tm_xapi_t *xapi)
+{
+       if(xapi==NULL)
+       {
+               LM_ERR("invalid parameter\n");
+               return -1;
+       }
+
+       memset(xapi, 0, sizeof(tm_xapi_t));
+
+       xapi->t_on_failure    = t_on_negative;
+       xapi->t_on_branch     = t_on_branch;
+       xapi->t_on_reply      = t_on_reply;
+       xapi->t_check_trans   = t_check_trans;
+       xapi->t_is_canceled   = t_is_canceled;
+
+       return 0;
+}
index e4829ac..aad979b 100644 (file)
@@ -163,4 +163,45 @@ static inline int tm_load_api(tm_api_t *tmb)
        return load_tm_api(tmb);
 }
 
+/**
+ * eXtra API - not common used in other modules
+ */
+
+typedef void (*t_on_route_f)(unsigned int);
+typedef int (*t_no_param_f)(struct sip_msg *);
+
+int t_check_trans(struct sip_msg* msg);
+int t_is_canceled(struct sip_msg* msg);
+
+typedef struct tm_xbinds {
+       t_on_route_f t_on_failure;
+       t_on_route_f t_on_branch;
+       t_on_route_f t_on_reply;
+       t_no_param_f t_check_trans;
+       t_no_param_f t_is_canceled;
+} tm_xapi_t;
+
+typedef int(*load_xtm_f)( tm_xapi_t *xtmb );
+int load_xtm(tm_xapi_t *xtmb);
+
+static inline int tm_load_xapi(tm_xapi_t *xtmb)
+{
+       load_xtm_f load_xtm;
+
+       /* import the TM auto-loading function */
+       load_xtm = (load_xtm_f)find_export("load_xtm", NO_SCRIPT, 0);
+
+       if (load_tm == NULL) {
+               LOG(L_WARN, "Cannot import load_xtm function from tm module\n");
+               return -1;
+       }
+
+       /* let the auto-loading function load all extra TM stuff */
+       if (load_xtm(xtmb) < 0) {
+               LOG(L_WARN, "Cannot bind xapi from tm module\n");
+               return -1;
+       }
+       return 0;
+}
+
 #endif