Hi,

I tried sipxCallRedirect these days. It happens that the uri specified in the 
szForwardURL parameter doesn't match the Contact header in the 302 message.

I check out "http://scm.sipfoundry.org/rep/sipX/branches/sipXtapi"; at version 
8101, run OnDo Server at 192.168.0.176:5060, run my sipXtapi based Win32 
console program at 192.168.0.178:5080 (register as sip:[EMAIL PROTECTED]), run 
XXX soft phone at 192.168.0.178:9873 (register as sip:[EMAIL PROTECTED]) and 
run another XXX soft phone at 192.168.0.104:9208 (register as sip:[EMAIL 
PROTECTED]). I let my Win32 console program redirect all incoming calls to 
"sip:[EMAIL PROTECTED]". But when test3 call test1, test1 redirect test3 to 
"[EMAIL PROTECTED]:5080" (see the Contact header in the 10th packet in the 
attachment). 

========= here is my sipXtapi based Win32 console program ======
#include <stdio.h>
#include "tapi/sipXtapi.h"
#include "tapi/sipXtapiEvents.h"

SIPX_CALL g_hCall = 0;

bool EventCallbackProc(
                SIPX_EVENT_CATEGORY category,
                void *pInfo,
                void *pUserData
                )
{
        SIPX_RESULT result;

        char szText[1024];
        sipxEventToString(category, pInfo, szText, 1020);
        ::strcat(szText, "\r\n");
        ::printf(szText);

        switch (category) {
                case EVENT_CATEGORY_CALLSTATE: {
                        SIPX_CALLSTATE_INFO* pCallInfo = (SIPX_CALLSTATE_INFO*) 
pInfo;
                        printf("hCall %d\n", g_hCall = pCallInfo->hCall);
                        char szInfo[1024];
                        szInfo[0]=0;
                        result = sipxCallGetRequestURI(g_hCall, szInfo, 1024);
                        printf("sipxCallGetRequestURI(%s) = %d\n", szInfo, 
result);
                        result = sipxCallGetRemoteUserAgent(g_hCall, szInfo, 
1024);
                        printf("sipxCallGetRemoteUserAgent(%s) = %d\n", szInfo, 
result);
                        result = sipxCallGetRemoteID(g_hCall, szInfo, 1024);
                        printf("sipxCallGetRemoteID(%s) = %d\n", szInfo, 
result);
                        result = sipxCallGetRemoteContact(g_hCall, szInfo, 
1024);
                        printf("sipxCallGetRemoteContact(%s) = %d\n", szInfo, 
result);
                        result = sipxCallGetLocalID(g_hCall, szInfo, 1024);
                        printf("sipxCallGetLocalID(%s) = %d\n", szInfo, result);
                        result = sipxCallGetID(g_hCall, szInfo, 1024);
                        printf("sipxCallGetID(%s) = %d\n", szInfo, result);
                        switch (pCallInfo->event) {
                        case CALLSTATE_OFFERING:
                                sipxCallRedirect(pCallInfo->hCall, "sip:[EMAIL 
PROTECTED]:5060");
                                break;
                        case CALLSTATE_ALERTING:
                                sipxCallAnswer(pCallInfo->hCall);
                                break;
                        case CALLSTATE_CONNECTED:
                                break;
                        case CALLSTATE_DISCONNECTED:
                                result = sipxCallDestroy(pCallInfo->hCall);
                                printf("CALLSTATE_DISCONNECTED = %d\n", result);
                                break;
                        }
                        break;
                }
        }
        return true;
}


int main()
{
        SIPX_RESULT result;

        SIPX_INST hInst;
        SIPX_LINE hLine;
        
        result = sipxInitialize(&hInst, 5080, 5080, -1, -2);

        {
                result = sipxEventListenerAdd(hInst, EventCallbackProc, NULL);
                result = sipxConfigEnableRport(hInst, true);

                // dumpLocalContacts
                {
                        SIPX_CONTACT_ADDRESS contacts[10] ;
                        size_t nContacts;

                        SIPX_RESULT status = sipxConfigGetLocalContacts(
                                hInst,
                                contacts,
                                10,
                                nContacts) ;
                        if (status == SIPX_RESULT_SUCCESS)
                        {
                                for (size_t i = 0; i<nContacts; i++)
                                {
                                        const char* szType = "UNKNOWN" ;
                                        switch (contacts[i].eContactType)
                                        {
                                                case CONTACT_LOCAL:
                                                        szType = "LOCAL" ;
                                                        break ;
                                                case CONTACT_NAT_MAPPED:
                                                        szType = "NAT_MAPPED" ;
                                                        break ;
                                                case CONTACT_RELAY:
                                                        szType = "RELAY" ;
                                                        break ;
                                                case CONTACT_CONFIG:
                                                        szType = "CONFIG" ;
                                                        break ;
                                        }
                                        printf("<-> Type %s, Interface: %s, Ip 
%s, Port %d\n",
                                                        szType, 
contacts[i].cInterface, contacts[i].cIpAddress,
                                                        contacts[i].iPort) ;
                                }
                        }
                        else
                        {
                                printf("<-> Unable to query local contact 
addresses\n") ;
                        }
                }

                result = sipxConfigSetOutboundProxy(hInst, "192.168.0.176");

                {
                        result = sipxLineAdd(hInst, "[EMAIL PROTECTED]", 
&hLine);
                        ::Sleep(500);
                        result = sipxLineAddCredential( hLine,
                                        "user1", "password1",
                                        "");
                        printf("\nregister\n");
                        result = sipxLineRegister(hLine, true);
                        ::Sleep(6000);

                        {
                                printf("\nCall me\n");
                                ::Sleep(20000);
                                printf("sipxCallDestroy(%d) =", g_hCall);
                                result = sipxCallDestroy(g_hCall);
                                printf("%d\n", result);
                                ::Sleep(1000);
                        }

                        printf("\nunregister\n");
                        result = sipxLineRegister(hLine, false);
                        ::Sleep(1000);

                        result = sipxLineRemove(hLine);
                        ::Sleep(1000);
                }

                result = sipxEventListenerRemove(hInst, EventCallbackProc, 
NULL);
                ::Sleep(1000);
        }

        result = sipxUnInitialize(hInst);
        ::Sleep(1000);


        return 0;
}
=============================================================

when i run it, it says:
<-> Type LOCAL, Interface: eth0, Ip 192.168.0.178, Port 5080
<-> Type LOCAL, Interface: eth0, Ip 192.168.0.178, Port 5080
EVENT_CATEGORY_LINESTATE::PROVISIONED::PROVISIONED_NORMAL

register
EVENT_CATEGORY_LINESTATE::REGISTERING::REGISTERING_NORMAL
EVENT_CATEGORY_LINESTATE::REGISTERED::REGISTERED_NORMAL

Call me
EVENT_CATEGORY_CALLSTATE::NEWCALL::CAUSE_NORMAL
hCall 1
sipxCallGetRequestURI(sip:[EMAIL PROTECTED]:5080) = 0
sipxCallGetRemoteUserAgent(CounterPath eyeBeam release 3013o stamp 23916) = 0
sipxCallGetRemoteID("test3"<sip:[EMAIL PROTECTED]>) = 0
sipxCallGetRemoteContact(sip:) = 0
sipxCallGetLocalID(<sip:[EMAIL PROTECTED]:5060>;tag=9851) = 0
sipxCallGetID([EMAIL PROTECTED]) = 0
EVENT_CATEGORY_CALLSTATE::OFFERING::CAUSE_NORMAL
hCall 1
sipxCallGetRequestURI(sip:[EMAIL PROTECTED]:5080) = 0
sipxCallGetRemoteUserAgent(CounterPath eyeBeam release 3013o stamp 23916) = 0
sipxCallGetRemoteID("test3"<sip:[EMAIL PROTECTED]>) = 0
sipxCallGetRemoteContact(sip:) = 0
sipxCallGetLocalID(<sip:[EMAIL PROTECTED]:5060>;tag=9851) = 0
sipxCallGetID([EMAIL PROTECTED]) = 0
EVENT_CATEGORY_CALLSTATE::DISCONNECTED::CAUSE_REDIRECTED
hCall 1
sipxCallGetRequestURI(sip:[EMAIL PROTECTED]:5080) = 0
sipxCallGetRemoteUserAgent(CounterPath eyeBeam release 3013o stamp 23916) = 0
sipxCallGetRemoteID("test3"<sip:[EMAIL PROTECTED]>;tag=025b9425) = 0
sipxCallGetRemoteContact(sip:) = 0
sipxCallGetLocalID(<sip:[EMAIL PROTECTED]:5060>;tag=9851) = 0
sipxCallGetID([EMAIL PROTECTED]) = 0
CALLSTATE_DISCONNECTED = 0
EVENT_CATEGORY_CALLSTATE::DESTROYED::CAUSE_NORMAL
hCall 1
sipxCallGetRequestURI() = 0
sipxCallGetRemoteUserAgent() = 1
sipxCallGetRemoteID() = 1
sipxCallGetRemoteContact() = 1
sipxCallGetLocalID() = 1
sipxCallGetID() = 1
EVENT_CATEGORY_CALLSTATE::NEWCALL::CAUSE_NORMAL
hCall 2
sipxCallGetRequestURI(sip:[EMAIL PROTECTED]:5080) = 0
sipxCallGetRemoteUserAgent(CounterPath eyeBeam release 3013o stamp 23916) = 0
sipxCallGetRemoteID("test3"<sip:[EMAIL PROTECTED]>) = 0
sipxCallGetRemoteContact(sip:) = 0
sipxCallGetLocalID(<sip:[EMAIL PROTECTED]>;tag=20817) = 0
sipxCallGetID([EMAIL PROTECTED]) = 0
EVENT_CATEGORY_CALLSTATE::OFFERING::CAUSE_NORMAL
hCall 2
sipxCallGetRequestURI(sip:[EMAIL PROTECTED]:5080) = 0
sipxCallGetRemoteUserAgent(CounterPath eyeBeam release 3013o stamp 23916) = 0
sipxCallGetRemoteID("test3"<sip:[EMAIL PROTECTED]>) = 0
sipxCallGetRemoteContact(sip:) = 0
sipxCallGetLocalID(<sip:[EMAIL PROTECTED]>;tag=20817) = 0
sipxCallGetID([EMAIL PROTECTED]) = 0
EVENT_CATEGORY_CALLSTATE::DISCONNECTED::CAUSE_REDIRECTED
hCall 2
sipxCallGetRequestURI(sip:[EMAIL PROTECTED]:5080) = 0
sipxCallGetRemoteUserAgent(CounterPath eyeBeam release 3013o stamp 23916) = 0
sipxCallGetRemoteID("test3"<sip:[EMAIL PROTECTED]>;tag=025b9425) = 0
sipxCallGetRemoteContact(sip:) = 0
sipxCallGetLocalID(<sip:[EMAIL PROTECTED]>;tag=20817) = 0
sipxCallGetID([EMAIL PROTECTED]) = 0
CALLSTATE_DISCONNECTED = 0
EVENT_CATEGORY_CALLSTATE::DESTROYED::CAUSE_NORMAL
hCall 2
sipxCallDestroy(2) =0

unregister
sipxCallGetRequestURI() = 0
sipxCallGetRemoteUserAgent() = 1
sipxCallGetRemoteID() = 1
sipxCallGetRemoteContact() = 1
sipxCallGetLocalID() = 1
sipxCallGetID() = 1


anything wrong with my code?




yuhang

Attachment: CapturedPackets.rar
Description: Binary data

Attachment: MyWinConsoleProgram.rar
Description: Binary data

_______________________________________________
sipxtapi-dev mailing list
[email protected]
List Archive: http://list.sipfoundry.org/archive/sipxtapi-dev/

Reply via email to