rollback transfer support...not properly implemented
authorJeremy McNamara <jj@nufone.net>
Mon, 22 Sep 2003 06:21:03 +0000 (06:21 +0000)
committerJeremy McNamara <jj@nufone.net>
Mon, 22 Sep 2003 06:21:03 +0000 (06:21 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@1537 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_h323.c
channels/h323/ast_h323.cpp
channels/h323/chan_h323.h

index 825f609..135de63 100755 (executable)
@@ -232,6 +232,8 @@ static struct oh323_user *build_user(char *name, struct ast_variable *v)
                                strncpy(user->context, v->value, sizeof(user->context)-1);
                        } else if (!strcasecmp(v->name, "bridge")) {
                                user->bridge = ast_true(v->value);
+                      } else if (!strcasecmp(v->name, "nat")) {
+                              user->nat = ast_true(v->value);
                        } else if (!strcasecmp(v->name, "noFastStart")) {
                                user->noFastStart = ast_true(v->value);
                        } else if (!strcasecmp(v->name, "noH245Tunneling")) {
@@ -497,6 +499,14 @@ static struct ast_frame *oh323_rtp_read(struct oh323_pvt *p)
        /* Retrieve audio/etc from channel.  Assumes p->lock is already held. */
        struct ast_frame *f;
        static struct ast_frame null_frame = { AST_FRAME_NULL, };
+
+      /* Only apply it for the first packet, we just need the correct ip/port */
+      if(p->nat)
+      {
+              ast_rtp_setnat(p->rtp,p->nat);
+              p->nat = 0;
+      }
+
        f = ast_rtp_read(p->rtp);
        /* Don't send RFC2833 if we're not supposed to */
        if (f && (f->frametype == AST_FRAME_DTMF) && !(p->dtmfmode & H323_DTMF_RFC2833))
@@ -1031,6 +1041,7 @@ int setup_incoming_call(call_details_t cd)
                        }
                        strncpy(p->context, user->context, sizeof(p->context)-1);
                        p->bridge = user->bridge;
+                      p->nat = user->nat;
 
                        if (strlen(user->callerid)) 
                                strncpy(p->callerid, user->callerid, sizeof(p->callerid) - 1);
@@ -1056,9 +1067,7 @@ int setup_incoming_call(call_details_t cd)
 /* I know this is horrid, don't kill me saddam */
 exit:
        /* allocate a channel and tell asterisk about it */
-       printf("exten b4: %s\n", p->exten);
        c = oh323_new(p, AST_STATE_RINGING, cd.call_token);
-
        if (!c) {
                ast_log(LOG_ERROR, "Couldn't create channel. This is bad\n");
                return 0;
@@ -1089,61 +1098,6 @@ if (!p) {
 }
 #endif
 
-
-/* Call-back function that gets called on transfer
- *
- * Returns 1 on success
- */
-int setup_transfer_call(unsigned call_reference, const char *extension)
-{
-       struct oh323_pvt *p;
-       struct ast_channel *c = NULL;
-       char exten[AST_MAX_EXTENSION];
-       char *context;
-       p = find_call(call_reference);
-       if (!p) {
-               ast_log(LOG_WARNING, "No such call %d.\n", call_reference);
-               return -1;
-       }
-       if (!p->owner) {
-               ast_log(LOG_WARNING, "Call %d has no owner.\n", call_reference);
-               return -1;
-       }
-       
-       memcpy(exten, extension, sizeof(exten));
-       c = p->owner;
-       if (c && c->bridge) {
-               strncpy(exten, extension, sizeof(exten) - 1);
-               context = strchr(exten, '@');
-               if (context) {
-                       *context = '\0';
-                       context++;
-               } else
-                       context = c->context;
-               if (!strlen(context))
-                       context = c->bridge->context;
-               if (ast_exists_extension(c->bridge, context, exten, 1, c->bridge->callerid)) {
-                       
-                       ast_log(LOG_NOTICE, "Transfering call %s to %s@%s.\n", c->bridge->name, exten, context);
-                       
-                       if (!ast_async_goto(c->bridge, context, exten, 1, 1))
-                               return 1;
-                       ast_log(LOG_WARNING, "Failed to transfer.\n");
-               } else {
-                       ast_log(LOG_WARNING, "No such extension '%s' exists.\n", exten);
-               }
-       } else {
-               ast_log(LOG_WARNING, "There is no call to transfer\n");
-       }
-       return 0;
-}
-
-
 /**
   * Call-back function that gets called for each rtp channel opened 
   *
@@ -1768,8 +1722,7 @@ int load_module()
                
                /* Register our callback functions */
                h323_callback_register(setup_incoming_call, 
-                                                          setup_outgoing_call, 
-                                                          setup_transfer_call,
+                                                          setup_outgoing_call,                                                  
                                                           create_connection, 
                                                           setup_rtp_connection, 
                                                           cleanup_connection, 
index 6ee771a..87d767c 100755 (executable)
@@ -407,49 +407,6 @@ H323Connection * MyH323EndPoint::CreateConnection(unsigned callReference, void *
        return new MyH323Connection(*this, callReference, options);
 }
 
-H323Connection * MyH323EndPoint::SetupTransfer(const PString & token,
-                                                                                          const PString & callIdentity,
-                                                                                          const PString & remoteParty,
-                                                                                          PString & newToken,
-                                                                                          void * userData)
-{
-       PString alias;
-       H323TransportAddress address;
-       
-       H323Connection * connection; 
-       if (h323debug) {
-               cout << " -- Setup transfer of  " << callIdentity << ":" << endl;
-               cout << "       -- Call from    " << token << endl;
-               cout << "       -- Remote Party " << remoteParty << endl;
-       }
-       connection = FindConnectionWithLock(token);
-       if (connection != NULL) {
-               unsigned int old_call_reference = connection->GetCallReference();
-               if (h323debug)
-                       cout << " -- Old call reference " << old_call_reference << endl;
-               connection->Unlock();
-               if (on_transfer_call(old_call_reference, remoteParty)) {
-                       if (h323debug)
-                               cout << "       -- Transfer succeded " << endl;
-                       if (connection->ClearCall(H323Connection::EndedByCallForwarded))
-                                       return NULL;
-                       return NULL;
-               }
-       }
-       if (h323debug)
-               cout << "       -- Transfer failed " << endl;
-       if (connection != NULL) {
-               return connection;
-       }
-       return NULL;
-}
-
 /* MyH323Connection */    
 MyH323Connection::MyH323Connection(MyH323EndPoint & ep,
                                                                                   unsigned callReference,
@@ -796,7 +753,6 @@ void h323_debug(int flag, unsigned level)
 /** Installs the callback functions on behalf of the PBX application  */
 void h323_callback_register(setup_incoming_cb  ifunc,
                                                        setup_outbound_cb  sfunc,
-                                                       setup_transfer_cb  tfunc,
                                                        on_connection_cb   confunc,
                                                        start_logchan_cb   lfunc,
                                                        clear_con_cb       clfunc,
@@ -805,7 +761,6 @@ void h323_callback_register(setup_incoming_cb  ifunc,
 {
        on_incoming_call = ifunc;
        on_outgoing_call = sfunc;
-       on_transfer_call = tfunc;
        on_create_connection = confunc;
        on_start_logical_channel = lfunc;
        on_connection_cleared = clfunc;
index c1f5a90..78d7fd4 100755 (executable)
@@ -131,11 +131,6 @@ setup_incoming_cb          on_incoming_call;
 typedef int (*setup_outbound_cb)(call_details_t);
 setup_outbound_cb      on_outgoing_call; 
 
-/* This is a callback prototype function, called upon
-    a transfer. */
-typedef int (*setup_transfer_cb)(unsigned int, const char *);
-setup_transfer_cb      on_transfer_call;
-
 /* This is a callback prototype function, called when the openh323 
    OnStartLogicalChannel is invoked. */
 typedef void (*start_logchan_cb)(unsigned int, const char *, int);
@@ -171,7 +166,6 @@ extern "C" {
        /* callback function handler*/
        void h323_callback_register(setup_incoming_cb,
                                                                setup_outbound_cb,
-                                                               setup_transfer_cb,
                                                                on_connection_cb,
                                                                start_logchan_cb,
                                                                clear_con_cb,