[Asterisk-cvs] asterisk-addons/asterisk-ooh323c/ooh323c/src Makefile.am, 1.3, 1.4 Makefile.in, 1.3, 1.4 dlist.h, 1.1, 1.2 eventHandler.h, 1.1, 1.2 ooCalls.h, 1.2, 1.3 ooCapability.c, 1.2, 1.3 ooCapability.h, 1.4, 1.5 ooGkClient.c, 1.1, 1.2 ooGkClient.h, 1.2, 1.3 ooLogChan.c, 1.1, 1.2 ooSocket.c, 1.2, 1.3 ooSocket.h, 1.2, 1.3 ooStackCmds.h, 1.3, 1.4 ooasn1.h, 1.2, 1.3 oochannels.c, 1.4, 1.5 oochannels.h, 1.4, 1.5 ooh245.c, 1.4, 1.5 ooh245.h, 1.2, 1.3 ooh323.c, 1.3, 1.4 ooh323.h, 1.2, 1.3 ooh323ep.h, 1.3, 1.4 ooports.c, 1.2, 1.3 ooports.h, 1.2, 1.3 ooq931.c, 1.3, 1.4 ooq931.h, 1.3, 1.4 ootrace.c, 1.2, 1.3 ootrace.h, 1.2, 1.3 ootypes.h, 1.3, 1.4 rtctype.h, 1.1, 1.2

vphirke at lists.digium.com vphirke at lists.digium.com
Thu Jun 16 15:40:03 CDT 2005


Update of /usr/cvsroot/asterisk-addons/asterisk-ooh323c/ooh323c/src
In directory mongoose.digium.com:/tmp/cvs-serv25841/ooh323c/src

Modified Files:
	Makefile.am Makefile.in dlist.h eventHandler.h ooCalls.h 
	ooCapability.c ooCapability.h ooGkClient.c ooGkClient.h 
	ooLogChan.c ooSocket.c ooSocket.h ooStackCmds.h ooasn1.h 
	oochannels.c oochannels.h ooh245.c ooh245.h ooh323.c ooh323.h 
	ooh323ep.h ooports.c ooports.h ooq931.c ooq931.h ootrace.c 
	ootrace.h ootypes.h rtctype.h 
Log Message:
Updated stack source

Index: Makefile.am
===================================================================
RCS file: /usr/cvsroot/asterisk-addons/asterisk-ooh323c/ooh323c/src/Makefile.am,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- Makefile.am	3 Jun 2005 14:54:06 -0000	1.3
+++ Makefile.am	16 Jun 2005 19:41:23 -0000	1.4
@@ -1,9 +1,9 @@
 AUTOMAKE_OPTIONS = gnu
 CFLAGS = @OOH323CFLAGS@
 
-noinst_LIBRARIES = liboostk.a
-#liboostk_la_LDFLAGS = -version-info 1:1:0
-liboostk_a_SOURCES = ooLogChan.h ooLogChan.c ooUtils.c ooUtils.h ooGkClient.h ooGkClient.c context.c ooCommon.h ooDateTime.h ooDateTime.c decode.c dlist.c encode.c errmgmt.c memheap.c memheap.h ooasn1.h  ootrace.h ootrace.c oochannels.c oochannels.h ooh245.c ooh245.h oohdr.h ooper.h ooports.c ooports.h ooq931.c ooq931.h ooCapability.c ooCapability.h ooSocket.c ooSocket.h ootypes.h perutil.c eventHandler.c eventHandler.h ooCalls.c ooCalls.h ooStackCmds.c ooStackCmds.h ooh323.c ooh323.h ooh323ep.c ooh323ep.h printHandler.c printHandler.h rtctype.c rtctype.h ooTimer.c ooTimer.h h323/H235-SECURITY-MESSAGESDec.c h323/H235-SECURITY-MESSAGESEnc.c h323/H235-SECURITY-MESSAGES.h h323/H323-MESSAGES.c h323/H323-MESSAGESDec.c h323/H323-MESSAGESEnc.c h323/H323-MESSAGES.h h323/MULTIMEDIA-SYSTEM-CONTROL.c h323/MULTIMEDIA-SYSTEM-CONTROLDec.c h323/MULTIMEDIA-SYSTEM-CONTROLEnc.c h323/MULTIMEDIA-SYSTEM-CONTROL.h
+noinst_LIBRARIES = libooh323c.a
+
+libooh323c_a_SOURCES = ooLogChan.h ooLogChan.c ooUtils.c ooUtils.h ooGkClient.h ooGkClient.c context.c ooCommon.h ooDateTime.h ooDateTime.c decode.c dlist.c encode.c errmgmt.c memheap.c memheap.h ooasn1.h  ootrace.h ootrace.c oochannels.c oochannels.h ooh245.c ooh245.h oohdr.h ooper.h ooports.c ooports.h ooq931.c ooq931.h ooCapability.c ooCapability.h ooSocket.c ooSocket.h ootypes.h perutil.c eventHandler.c eventHandler.h ooCalls.c ooCalls.h ooStackCmds.c ooStackCmds.h ooh323.c ooh323.h ooh323ep.c ooh323ep.h printHandler.c printHandler.h rtctype.c rtctype.h ooTimer.c ooTimer.h h323/H235-SECURITY-MESSAGESDec.c h323/H235-SECURITY-MESSAGESEnc.c h323/H235-SECURITY-MESSAGES.h h323/H323-MESSAGES.c h323/H323-MESSAGESDec.c h323/H323-MESSAGESEnc.c h323/H323-MESSAGES.h h323/MULTIMEDIA-SYSTEM-CONTROL.c h323/MULTIMEDIA-SYSTEM-CONTROLDec.c h323/MULTIMEDIA-SYSTEM-CONTROLEnc.c h323/MULTIMEDIA-SYSTEM-CONTROL.h
 
 INCLUDES = -Ih323
 

Index: Makefile.in
===================================================================
RCS file: /usr/cvsroot/asterisk-addons/asterisk-ooh323c/ooh323c/src/Makefile.in,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- Makefile.in	3 Jun 2005 14:54:06 -0000	1.3
+++ Makefile.in	16 Jun 2005 19:41:23 -0000	1.4
@@ -89,9 +89,9 @@
 AUTOMAKE_OPTIONS = gnu
 CFLAGS = @OOH323CFLAGS@
 
-noinst_LIBRARIES = liboostk.a
-#liboostk_la_LDFLAGS = -version-info 1:1:0
-liboostk_a_SOURCES = ooLogChan.h ooLogChan.c ooUtils.c ooUtils.h ooGkClient.h ooGkClient.c context.c ooCommon.h ooDateTime.h ooDateTime.c decode.c dlist.c encode.c errmgmt.c memheap.c memheap.h ooasn1.h  ootrace.h ootrace.c oochannels.c oochannels.h ooh245.c ooh245.h oohdr.h ooper.h ooports.c ooports.h ooq931.c ooq931.h ooCapability.c ooCapability.h ooSocket.c ooSocket.h ootypes.h perutil.c eventHandler.c eventHandler.h ooCalls.c ooCalls.h ooStackCmds.c ooStackCmds.h ooh323.c ooh323.h ooh323ep.c ooh323ep.h printHandler.c printHandler.h rtctype.c rtctype.h ooTimer.c ooTimer.h h323/H235-SECURITY-MESSAGESDec.c h323/H235-SECURITY-MESSAGESEnc.c h323/H235-SECURITY-MESSAGES.h h323/H323-MESSAGES.c h323/H323-MESSAGESDec.c h323/H323-MESSAGESEnc.c h323/H323-MESSAGES.h h323/MULTIMEDIA-SYSTEM-CONTROL.c h323/MULTIMEDIA-SYSTEM-CONTROLDec.c h323/MULTIMEDIA-SYSTEM-CONTROLEnc.c h323/MULTIMEDIA-SYSTEM-CONTROL.h
+noinst_LIBRARIES = libooh323c.a
+
+libooh323c_a_SOURCES = ooLogChan.h ooLogChan.c ooUtils.c ooUtils.h ooGkClient.h ooGkClient.c context.c ooCommon.h ooDateTime.h ooDateTime.c decode.c dlist.c encode.c errmgmt.c memheap.c memheap.h ooasn1.h  ootrace.h ootrace.c oochannels.c oochannels.h ooh245.c ooh245.h oohdr.h ooper.h ooports.c ooports.h ooq931.c ooq931.h ooCapability.c ooCapability.h ooSocket.c ooSocket.h ootypes.h perutil.c eventHandler.c eventHandler.h ooCalls.c ooCalls.h ooStackCmds.c ooStackCmds.h ooh323.c ooh323.h ooh323ep.c ooh323ep.h printHandler.c printHandler.h rtctype.c rtctype.h ooTimer.c ooTimer.h h323/H235-SECURITY-MESSAGESDec.c h323/H235-SECURITY-MESSAGESEnc.c h323/H235-SECURITY-MESSAGES.h h323/H323-MESSAGES.c h323/H323-MESSAGESDec.c h323/H323-MESSAGESEnc.c h323/H323-MESSAGES.h h323/MULTIMEDIA-SYSTEM-CONTROL.c h323/MULTIMEDIA-SYSTEM-CONTROLDec.c h323/MULTIMEDIA-SYSTEM-CONTROLEnc.c h323/MULTIMEDIA-SYSTEM-CONTROL.h
 
 INCLUDES = -Ih323
 
@@ -104,9 +104,9 @@
 CONFIG_CLEAN_FILES =
 LIBRARIES = $(noinst_LIBRARIES)
 
-liboostk_a_AR = $(AR) cru
-liboostk_a_LIBADD =
-am_liboostk_a_OBJECTS = ooLogChan.$(OBJEXT) ooUtils.$(OBJEXT) \
+libooh323c_a_AR = $(AR) cru
+libooh323c_a_LIBADD =
+am_libooh323c_a_OBJECTS = ooLogChan.$(OBJEXT) ooUtils.$(OBJEXT) \
 	ooGkClient.$(OBJEXT) context.$(OBJEXT) ooDateTime.$(OBJEXT) \
 	decode.$(OBJEXT) dlist.$(OBJEXT) encode.$(OBJEXT) \
 	errmgmt.$(OBJEXT) memheap.$(OBJEXT) ootrace.$(OBJEXT) \
@@ -121,7 +121,7 @@
 	MULTIMEDIA-SYSTEM-CONTROL.$(OBJEXT) \
 	MULTIMEDIA-SYSTEM-CONTROLDec.$(OBJEXT) \
 	MULTIMEDIA-SYSTEM-CONTROLEnc.$(OBJEXT)
-liboostk_a_OBJECTS = $(am_liboostk_a_OBJECTS)
+libooh323c_a_OBJECTS = $(am_libooh323c_a_OBJECTS)
 
 DEFS = @DEFS@
 DEFAULT_INCLUDES =  -I. -I$(srcdir) -I$(top_builddir)
@@ -159,9 +159,9 @@
 CCLD = $(CC)
 LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
 	$(AM_LDFLAGS) $(LDFLAGS) -o $@
-DIST_SOURCES = $(liboostk_a_SOURCES)
+DIST_SOURCES = $(libooh323c_a_SOURCES)
 DIST_COMMON = Makefile.am Makefile.in
-SOURCES = $(liboostk_a_SOURCES)
+SOURCES = $(libooh323c_a_SOURCES)
 
 all: all-am
 
@@ -187,10 +187,10 @@
 	h323/MULTIMEDIA-SYSTEM-CONTROLDec.c
 MULTIMEDIA-SYSTEM-CONTROLEnc.$(OBJEXT): \
 	h323/MULTIMEDIA-SYSTEM-CONTROLEnc.c
-liboostk.a: $(liboostk_a_OBJECTS) $(liboostk_a_DEPENDENCIES) 
-	-rm -f liboostk.a
-	$(liboostk_a_AR) liboostk.a $(liboostk_a_OBJECTS) $(liboostk_a_LIBADD)
-	$(RANLIB) liboostk.a
+libooh323c.a: $(libooh323c_a_OBJECTS) $(libooh323c_a_DEPENDENCIES) 
+	-rm -f libooh323c.a
+	$(libooh323c_a_AR) libooh323c.a $(libooh323c_a_OBJECTS) $(libooh323c_a_LIBADD)
+	$(RANLIB) libooh323c.a
 
 mostlyclean-compile:
 	-rm -f *.$(OBJEXT) core *.core

Index: dlist.h
===================================================================
RCS file: /usr/cvsroot/asterisk-addons/asterisk-ooh323c/ooh323c/src/dlist.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- dlist.h	26 May 2005 16:50:41 -0000	1.1
+++ dlist.h	16 Jun 2005 19:41:23 -0000	1.2
@@ -47,13 +47,13 @@
 #endif
 
 #ifndef EXTERN
-#ifdef ASN1DLL
+#if defined (MAKE_DLL)
 #define EXTERN __declspec(dllexport)
 #elif defined (USEASN1DLL)
 #define EXTERN __declspec(dllimport)
 #else
 #define EXTERN
-#endif /* ASN1DLL */
+#endif /* MAKE_DLL */
 #endif /* EXTERN */
 
 /**

Index: eventHandler.h
===================================================================
RCS file: /usr/cvsroot/asterisk-addons/asterisk-ooh323c/ooh323c/src/eventHandler.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- eventHandler.h	23 May 2005 21:03:55 -0000	1.1
+++ eventHandler.h	16 Jun 2005 19:41:23 -0000	1.2
@@ -35,11 +35,11 @@
 
 
 #ifndef EXTERN
-#ifdef _WIN32
+#if define (MAKE_DLL)
 #define EXTERN __declspec(dllexport)
 #else
 #define EXTERN
-#endif /* _WIN32 */
+#endif /* MAKE_DLL */
 #endif /* EXTERN */
 
 

Index: ooCalls.h
===================================================================
RCS file: /usr/cvsroot/asterisk-addons/asterisk-ooh323c/ooh323c/src/ooCalls.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- ooCalls.h	3 Jun 2005 14:54:06 -0000	1.2
+++ ooCalls.h	16 Jun 2005 19:41:23 -0000	1.3
@@ -41,12 +41,13 @@
 */
 
 
-#define OO_M_ENDPOINTCREATED    0x00800000
-#define OO_M_ENDSESSION_BUILT   0x00400000
-#define OO_M_RELEASE_BUILT      0x00200000
-#define OO_M_GKROUTED           0x00100000
-#define OO_M_AUTOANSWER         0x08000000
-#define OO_M_TUNNELING	        0x04000000
+#define OO_M_ENDPOINTCREATED    0x00010000
+#define OO_M_ENDSESSION_BUILT   0x00800000
+#define OO_M_RELEASE_BUILT      0x00400000
+#define OO_M_GKROUTED           0x00200000
+#define OO_M_AUTOANSWER         0x00100000
+#define OO_M_TUNNELING	        0x08000000
+#define OO_M_FASTSTARTANSWERED  0x04000000
 #define OO_M_FASTSTART	        0x02000000 
 #define OO_M_DISABLEGK          0x01000000
 

Index: ooCapability.c
===================================================================
RCS file: /usr/cvsroot/asterisk-addons/asterisk-ooh323c/ooh323c/src/ooCapability.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- ooCapability.c	3 Jun 2005 14:54:06 -0000	1.2
+++ ooCapability.c	16 Jun 2005 19:41:23 -0000	1.3
@@ -1514,7 +1514,7 @@
                                                    sizeof(ooH323EpCapability));
          params = (OOH263CapParams*) memAlloc(call->pctxt, 
                                                       sizeof(OOH263CapParams));
-         if(!epCap && !params)
+         if(!epCap || !params)
          {
 	   OOTRACEERR3("Error:Memory - ooIsVideoDataTypeH263Supported - "
                        "epCap/params. (%s, %s)\n", call->callType, 
@@ -1543,7 +1543,7 @@
                                                   sizeof(ooH323EpCapability));
       params = (OOH263CapParams*) memAlloc(call->pctxt, 
                                                       sizeof(OOH263CapParams));
-      if(!epCap && !params)
+      if(!epCap || !params)
       {
          OOTRACEERR3("Error:Memory - ooIsVideoDataTypeH263Supported - "
                      "epCap/params. (%s, %s)\n", call->callType, 
@@ -1573,6 +1573,7 @@
                   call->callToken);
       return epCap;
    }
+   return NULL;
 
 }
 

Index: ooCapability.h
===================================================================
RCS file: /usr/cvsroot/asterisk-addons/asterisk-ooh323c/ooh323c/src/ooCapability.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- ooCapability.h	3 Jun 2005 14:54:06 -0000	1.4
+++ ooCapability.h	16 Jun 2005 19:41:23 -0000	1.5
@@ -22,6 +22,7 @@
 #include "ootypes.h"
 #include "ooasn1.h"
 
+
 #define OO_GSMFRAMESIZE 33 /* standard frame size for gsm is 33 bytes */
 
 #define OORX      (1<<0)
@@ -176,11 +177,11 @@
 
 
 #ifndef EXTERN
-#ifdef _WIN32
+#if defined (MAKE_DLL)
 #define EXTERN __declspec(dllexport)
 #else
 #define EXTERN
-#endif /* _WIN32 */
+#endif /* MAKE_DLL */
 #endif /* EXTERN */
 
 /** 
@@ -359,9 +360,8 @@
  *
  * @return                    OO_OK, on success. OO_FAILED, otherwise.
  */
-int ooAddRemoteAudioCapability(struct OOH323CallData *call, 
-			       H245AudioCapability *audioCap,
-                               int dir);
+int ooAddRemoteAudioCapability(struct OOH323CallData *call,
+                               H245AudioCapability *audioCap, int dir);
 
 
 /**
@@ -396,6 +396,7 @@
  * @param call           Handle to the call
  * @param videoCap       Remote video capability which will be tested for 
  *                       compatibility.
+ * @param dir            Direction of the capability
  *
  * @return               returns OO_OK, if updated else OO_FAILED;  
  */
@@ -411,6 +412,7 @@
  * @param call           Handle to the call
  * @param pH263Cap       Remote H263 video capability which will be tested for 
  *                       compatibility.
+ * @param dir            Direction of the H263 capability
  *
  * @return               returns OO_OK, if updated else OO_FAILED;  
  */
@@ -557,6 +559,7 @@
  * @param call       Handle to the call.
  * @param pH263Cap   Handle to the H263 video capability.
  * @param dir        Direction in which support is desired. 
+ * @param picFormat  Picture type(cif, qcif etc.)
  *
  * @return          Handle to the copy of capability which supports H263 
  *                  capability, Null if none found

Index: ooGkClient.c
===================================================================
RCS file: /usr/cvsroot/asterisk-addons/asterisk-ooh323c/ooh323c/src/ooGkClient.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- ooGkClient.c	23 May 2005 21:03:55 -0000	1.1
+++ ooGkClient.c	16 Jun 2005 19:41:23 -0000	1.2
@@ -34,7 +34,7 @@
 #include "ooh323.h"
 #include "ooh323ep.h"
 #include "ooTimer.h"
-
+#include "ooSocket.h"
 /** Global endpoint structure */
 extern OOH323EndPoint gH323ep;
 
@@ -60,6 +60,8 @@
    initContext(&(pGkClient->msgCtxt));
    pGkClient->rrqRetries = 0;
    pGkClient->grqRetries = 0;
+
+   strcpy(pGkClient->localRASIP, gH323ep.signallingIP);
    
    if(OO_OK != ooGkClientSetGkMode(pGkClient, eGkMode, szGkAddr, iGkPort))
    {
@@ -224,14 +226,9 @@
    }
    if(pGkClient->localRASPort)
    {
-      ret= ooSocketStrToAddr (gH323ep.signallingIP, &ipaddrs);
+      ret= ooSocketStrToAddr (pGkClient->localRASIP, &ipaddrs);
       if( (ret=ooSocketBind( pGkClient->rasSocket, ipaddrs, 
-           pGkClient->localRASPort))==ASN_OK ) 
-      {
-         OOTRACEINFO1("H323 RAS channel creation - successful\n");
-         return OO_OK;
-      }
-      else
+           pGkClient->localRASPort))!=ASN_OK ) 
       {
          OOTRACEERR1("ERROR:Failed to create RAS channel\n");
          pGkClient->state = GkClientFailed;
@@ -246,9 +243,29 @@
          pGkClient->state = GkClientFailed;
          return OO_FAILED;
       }
-      OOTRACEINFO1("H323 RAS channel creation - successful\n");
       pGkClient->localRASPort = ret;
    }
+   /* Test Code NOTE- This doesn't work..:(( Have to fix this */
+   /* If multihomed, get ip from socket */
+   if(!strcmp(pGkClient->localRASIP, "0.0.0.0"))
+   {
+      OOTRACEDBGA1("Determining ip address for RAS channel "
+                   "multihomed mode. \n");
+      ret = ooSocketGetIpAndPort(pGkClient->rasSocket, pGkClient->localRASIP, 
+                                 20, &pGkClient->localRASPort);
+      if(ret != ASN_OK)
+      {
+         OOTRACEERR1("Error:Failed to retrieve local ip and port from "
+                     "socket for RAS channel(multihomed).\n");
+         pGkClient->state = GkClientFailed;
+         return OO_FAILED;
+      }
+      OOTRACEDBGA3("Using local ip %s and port %d for RAS channel"
+                   "(multihomedMode).\n", pGkClient->localRASIP, 
+                   pGkClient->localRASPort);
+   }
+   /* End of Test code */
+   OOTRACEINFO1("H323 RAS channel creation - successful\n");
    return OO_OK;
 }
 
@@ -434,6 +451,8 @@
       break;
    case T_H225RasMessage_admissionReject:
       OOTRACEINFO1("Admission Reject (ARJ) message received.\n");
+      iRet = ooGkClientHandleAdmissionReject(pGkClient, 
+                                                   pRasMsg->u.admissionReject);
       break;
    case T_H225RasMessage_disengageConfirm:
       iRet = ooGkClientHandleDisengageConfirm(pGkClient, 
@@ -592,7 +611,7 @@
    }
 
  
-   ooConvertIpToNwAddr(gH323ep.signallingIP, pRasAddress->ip.data);
+   ooSocketConvertIpToNwAddr(pGkClient->localRASIP, pRasAddress->ip.data);
 
    pRasAddress->ip.numocts = 4;
    pRasAddress->port = pGkClient->localRASPort;
@@ -840,7 +859,7 @@
    }
    pTransportAddress->t = T_H225TransportAddress_ipAddress;
    pTransportAddress->u.ipAddress = pIpAddress;
-   ooConvertIpToNwAddr(gH323ep.signallingIP, pIpAddress->ip.data);
+   ooSocketConvertIpToNwAddr(pGkClient->localRASIP, pIpAddress->ip.data);
    pIpAddress->ip.numocts = 4;
    pIpAddress->port = gH323ep.listenPort;
    
@@ -867,7 +886,7 @@
    pTransportAddress->t = T_H225TransportAddress_ipAddress;
    pTransportAddress->u.ipAddress = pIpAddress;
    
-   ooConvertIpToNwAddr(gH323ep.signallingIP, pIpAddress->ip.data);
+   ooSocketConvertIpToNwAddr(pGkClient->localRASIP, pIpAddress->ip.data);
 
    pIpAddress->ip.numocts = 4;
    pIpAddress->port = pGkClient->localRASPort;
@@ -1238,7 +1257,7 @@
    }
    pTransportAddress->t = T_H225TransportAddress_ipAddress;
    pTransportAddress->u.ipAddress = pIpAddress;
-   ooConvertIpToNwAddr(gH323ep.signallingIP, pIpAddress->ip.data);
+   ooSocketConvertIpToNwAddr(pGkClient->localRASIP, pIpAddress->ip.data);
    pIpAddress->ip.numocts = 4;
    pIpAddress->port = gH323ep.listenPort;
    
@@ -1436,14 +1455,14 @@
       pGkClient->state = GkClientFailed;
       return OO_FAILED;
    }
-   ooConvertIpToNwAddr(gH323ep.signallingIP, pIpAddressLocal->ip.data);
+   ooSocketConvertIpToNwAddr(pGkClient->localRASIP, pIpAddressLocal->ip.data);
 
    pIpAddressLocal->ip.numocts = 4;
    pIpAddressLocal->port = gH323ep.listenPort;
 
    if(strlen(call->remoteIP))
    {
-      ooConvertIpToNwAddr(call->remoteIP, pIpAddressRemote->ip.data);
+      ooSocketConvertIpToNwAddr(call->remoteIP, pIpAddressRemote->ip.data);
       pIpAddressRemote->ip.numocts = 4;
       pIpAddressRemote->port = call->remotePort;
    }
@@ -1768,6 +1787,85 @@
 }
 
 
+int ooGkClientHandleAdmissionReject
+   (ooGkClient *pGkClient, H225AdmissionReject *pAdmissionReject)
+{
+   RasCallAdmissionInfo* pCallAdmInfo=NULL;
+   unsigned int x;
+   DListNode *pNode=NULL;
+   OOH323CallData *call=NULL;
+
+   /* Search call in pending calls list */
+   for(x=0 ; x<pGkClient->callsPendingList.count; x++)
+   {
+      pNode = dListFindByIndex(&pGkClient->callsPendingList, x);
+      pCallAdmInfo = (RasCallAdmissionInfo*) pNode->data;
+      if(pCallAdmInfo->requestSeqNum == pAdmissionReject->requestSeqNum)
+         break;
+      pNode = NULL;
+      pCallAdmInfo = NULL;
+   }
+
+   if(!pCallAdmInfo)
+   {
+      OOTRACEWARN2("Received admission reject with request number %d can not"
+                   " be matched with any pending call.\n", 
+                   pAdmissionReject->requestSeqNum);
+      return OO_OK;
+   }else{
+      call = pCallAdmInfo->call;
+      dListRemove(&pGkClient->callsPendingList, pNode);
+      memFreePtr(&pGkClient->ctxt, pCallAdmInfo);
+      memFreePtr(&pGkClient->ctxt, pNode);
+   }
+
+   OOTRACEINFO4("Admission Reject message received with reason code %d for "
+                "(%s, %s)\n", pAdmissionReject->rejectReason.t, call->callType,
+                 call->callToken);
+   
+   call->callState = OO_CALL_CLEAR;
+
+   switch(pAdmissionReject->rejectReason.t)
+   {
+      case T_H225AdmissionRejectReason_calledPartyNotRegistered:
+         call->callEndReason = OO_REASON_GK_NOCALLEDUSER;
+         break;
+      case T_H225AdmissionRejectReason_invalidPermission:
+      case T_H225AdmissionRejectReason_requestDenied:
+      case T_H225AdmissionRejectReason_undefinedReason:
+         call->callEndReason = OO_REASON_GK_CLEARED;
+         break;
+      case T_H225AdmissionRejectReason_callerNotRegistered:
+         call->callEndReason = OO_REASON_GK_NOCALLERUSER;
+         break;
+      case T_H225AdmissionRejectReason_exceedsCallCapacity:
+      case T_H225AdmissionRejectReason_resourceUnavailable:
+         call->callEndReason = OO_REASON_GK_NORESOURCES;
+         break;
+      case T_H225AdmissionRejectReason_noRouteToDestination:
+      case T_H225AdmissionRejectReason_unallocatedNumber:
+         call->callEndReason = OO_REASON_GK_UNREACHABLE;
+         break;
+      case T_H225AdmissionRejectReason_routeCallToGatekeeper:
+      case T_H225AdmissionRejectReason_invalidEndpointIdentifier:
+      case T_H225AdmissionRejectReason_securityDenial:
+      case T_H225AdmissionRejectReason_qosControlNotSupported:
+      case T_H225AdmissionRejectReason_incompleteAddress:
+      case T_H225AdmissionRejectReason_aliasesInconsistent:
+      case T_H225AdmissionRejectReason_routeCallToSCN:
+      case T_H225AdmissionRejectReason_collectDestination:
+      case T_H225AdmissionRejectReason_collectPIN:
+      case T_H225AdmissionRejectReason_genericDataReason:
+      case T_H225AdmissionRejectReason_neededFeatureNotSupported:
+      case T_H225AdmissionRejectReason_securityErrors:
+      case T_H225AdmissionRejectReason_securityDHmismatch:
+      case T_H225AdmissionRejectReason_extElem1:
+         call->callEndReason = OO_REASON_GK_CLEARED;
+         break;
+   }
+
+   return OO_OK;   
+}
 
 /**
  * This function is invoked to request call disengage to gatekeeper. 

Index: ooGkClient.h
===================================================================
RCS file: /usr/cvsroot/asterisk-addons/asterisk-ooh323c/ooh323c/src/ooGkClient.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- ooGkClient.h	3 Jun 2005 14:54:06 -0000	1.2
+++ ooGkClient.h	16 Jun 2005 19:41:23 -0000	1.3
@@ -33,7 +33,7 @@
 #endif
 
 #ifndef EXTERN
-#ifdef _WIN32
+#ifdef MAKE_DLL
 #define EXTERN __declspec(dllexport)
 #else
 #define EXTERN
@@ -133,16 +133,34 @@
 
 struct OOAliases;
 
-/** GkClient callbacks:
- *  The first parameter is the message received. The second parameter provides
- *  updated list of aliases after the message was processed by the stack.
+/**
+ * NOTE- This functionality is not yet fully completed.
+ * This is a callback function which is triggered when registration confirm 
+ * message is received from the gatekeeper. The first parameter is the message
+ * received. The second parameter provides updated list of aliases after the 
+ * message was processed by the stack.
+ * @param rcf  Handle to the received registration confirm message
  */
 typedef int (*cb_OnReceivedRegistrationConfirm)
      (H225RegistrationConfirm *rcf, struct OOAliases *aliases);
 
+
+/**
+ * NOTE- This functionality is not yet fully completed.
+ * This is a callback function which is triggered when unregistration confirm 
+ * message is received. The first parameter is the message received. The second
+ * parameter provides updated list of aliases after the message was processed 
+ * by the stack.
+ */
 typedef int (*cb_OnReceivedUnregistrationConfirm)
      (H225UnregistrationConfirm *ucf, struct OOAliases *aliases);
 
+/**
+ * NOTE- This functionality is not yet fully completed.
+ * This is a callback function which is triggered when unregistration request 
+ * message is received. The first parameter is the message received. The second
+ * parameter provides the list of aliases requested to be unregistered.
+ */
 typedef int (*cb_OnReceivedUnregistrationRequest)
      (H225UnregistrationRequest *urq, struct OOAliases *aliases);
 
@@ -152,13 +170,18 @@
    cb_OnReceivedUnregistrationRequest onReceivedUnregistrationRequest;
 }OOGKCLIENTCALLBACKS;
 
-
+/**
+ * Structure to store all the configuration information for the gatekeeper
+ * client. Gatekeeper client is responsible for all the communication with
+ * a gatekeeper.
+ */
 typedef struct ooGkClient{
    ASN1BOOL discoveryComplete;
    OOCTXT ctxt;
    OOCTXT msgCtxt;
    OOSOCKET rasSocket;
    int localRASPort;
+   char localRASIP[20];
    char gkRasIP[20];
    char gkCallSignallingIP[20];
    RasGatekeeperInfo gkInfo;
@@ -187,7 +210,9 @@
 struct OOH323CallData;
 
 /**
- * This function is used to initialize the Gatekeeper client.
+ * This function is used to initialize the Gatekeeper client.If an application
+ * wants to use gatekeeper services, it should call this function immediately
+ * after initializing the H323 EndPoint.
  * @param eGkMode          Gatekeeper mode.
  * @param szGkAddr         Dotted gk ip address, if gk has to be specified.
  * @param iGkPort          Gk port.
@@ -200,7 +225,7 @@
 
 /**
  * This function is used to print the gatekeeper client configuration 
- * information.
+ * information to log.
  * @param pGkClient        Handle to gatekeeper client.
  */
 EXTERN void ooGkClientPrintConfig(ooGkClient *pGkClient);
@@ -418,6 +443,19 @@
 EXTERN int ooGkClientHandleAdmissionConfirm
    (ooGkClient *pGkClient, H225AdmissionConfirm *pAdmissionConfirm);
 
+
+/**
+ * This function is used to handle a received Admission Reject message. It 
+ * finds the associated call and marks it for cleaning with appropriate 
+ * call end reason code.
+ * @param pGkClient         Handle to Gatekeeper client.
+ * @param pAdmissionReject  Handle to received admission reject message.
+ *
+ * @return                  OO_OK, on success. OO_FAILED, on failure.
+ */
+EXTERN int ooGkClientHandleAdmissionReject
+   (ooGkClient *pGkClient, H225AdmissionReject *pAdmissionReject);
+
 /**
  * This function is invoked to request call disengage to gatekeeper. 
  * @param pGkClient  Gatekeeper client to be used.
@@ -501,14 +539,13 @@
    (ooGkClient *pGkClient, H225_SeqOfH225AliasAddress *pAddresses, 
     OOBOOL registered);
 
-
 /**
- * This function is used to set callbacks for a gatekeeper client. It is never
- * directly called by applications. Applications use 
- * ooH323EpSetGkClientCallbacks(..), which in turn calls this function.
- * @param callbacks            Structure holding callback values.
- * 
- * @return                     OO_OK, on success. OO_FAILED, otherwise.
+ * This function is used internally to set Gatekeeper Clients callbacks.
+ * Note: This functionality is not yet fully supported
+ * @param pGkClient  Handle to the GK client.
+ * @param callbacks  Callback structure contatining various gatekeeper client
+ *                   callbacks.
+ * @return           OO_OK, on success. OO_FAILED, on failure.
  */
 int ooGkClientSetCallbacks
    (ooGkClient *pGkClient, OOGKCLIENTCALLBACKS callbacks);

Index: ooLogChan.c
===================================================================
RCS file: /usr/cvsroot/asterisk-addons/asterisk-ooh323c/ooh323c/src/ooLogChan.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- ooLogChan.c	3 Jun 2005 14:54:06 -0000	1.1
+++ ooLogChan.c	16 Jun 2005 19:41:23 -0000	1.2
@@ -76,7 +76,13 @@
 		  call->callToken);
       pNewChannel->localRtpPort = pMediaInfo->lMediaPort;
       pNewChannel->localRtcpPort = pMediaInfo->lMediaCntrlPort;
-      strcpy(pNewChannel->localIP, pMediaInfo->lMediaIP);
+      /* If user application has not specified a specific ip and is using 
+         multihomed mode, substitute appropriate ip.
+      */
+      if(!strcmp(pMediaInfo->lMediaIP, "0.0.0.0"))
+         strcpy(pNewChannel->localIP, call->localIP);
+      else
+         strcpy(pNewChannel->localIP, pMediaInfo->lMediaIP);
    }else{
       OOTRACEDBGC3("Using default media info (%s, %s)\n", call->callType,
 		  call->callToken);

Index: ooSocket.c
===================================================================
RCS file: /usr/cvsroot/asterisk-addons/asterisk-ooh323c/ooh323c/src/ooSocket.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- ooSocket.c	26 May 2005 13:34:36 -0000	1.2
+++ ooSocket.c	16 Jun 2005 19:41:23 -0000	1.3
@@ -272,17 +272,45 @@
    return ASN_OK;
 }
 
-#ifdef _WIN32
-int ooGetSockName(OOSOCKET socket, struct sockaddr_in *name, int *size)
+
+int ooSocketGetSockName(OOSOCKET socket, struct sockaddr_in *name, int *size)
 {
    int ret;
    ret = getsockname(socket, (struct sockaddr*)name, size);
    if(ret == 0)
       return ASN_OK;
-   else
+   else{
+      OOTRACEERR1("Error:ooSocketGetSockName - getsockname\n");
       return ASN_E_INVSOCKET;
+   }
+}
+
+int ooSocketGetIpAndPort(OOSOCKET socket, char *ip, int len, int *port)
+{
+   int ret=ASN_OK, size;
+   struct sockaddr_in addr;
+   char *host=NULL;
+
+   size = sizeof(addr);
+
+   ret = ooSocketGetSockName(socket, &addr, &size);
+   if(ret != 0)
+      return ASN_E_INVSOCKET;
+
+   host = inet_ntoa(addr.sin_addr);
+
+   if(host && strlen(host) < (unsigned)len)
+      strcpy(ip, host);   
+   else{
+     OOTRACEERR1("Error:Insufficient buffer for ip address - "
+                 "ooSocketGetIpAndPort\n");
+      return -1;
+   }
+   
+   *port = addr.sin_port;
+
+   return ASN_OK;
 }
-#endif
 
 int ooSocketListen (OOSOCKET socket, int maxConnection) 
 {
@@ -470,7 +498,7 @@
    return ASN_OK;
 }
 
-int ooConvertIpToNwAddr(char *inetIp, char *netIp)
+int ooSocketConvertIpToNwAddr(char *inetIp, char *netIp)
 {
   int ret=0;
    struct sockaddr_in sin = {0};
@@ -524,12 +552,12 @@
    return ASN_OK;
 }
 
-long ooHTONL(long val)
+long ooSocketHTONL(long val)
 {
    return htonl(val);
 }
 
-short ooHTONS(short val)
+short ooSocketHTONS(short val)
 {
    return htons(val);
 }

Index: ooSocket.h
===================================================================
RCS file: /usr/cvsroot/asterisk-addons/asterisk-ooh323c/ooh323c/src/ooSocket.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- ooSocket.h	26 May 2005 13:34:36 -0000	1.2
+++ ooSocket.h	16 Jun 2005 19:41:23 -0000	1.3
@@ -46,13 +46,13 @@
 #endif
 
 #ifndef EXTERN
-#ifdef ASN1DLL
+#ifdef MAKE_DLL
 #define EXTERN __declspec(dllexport)
 #elif defined (USEASN1DLL)
 #define EXTERN __declspec(dllimport)
 #else
 #define EXTERN
-#endif /* ASN1DLL */
+#endif /* MAKE_DLL */
 #endif /* EXTERN */
 
 /** 
@@ -346,7 +346,7 @@
  * @return             Completion status of operation: 0 (ASN_OK) = success,
  *                     negative return value is error.
  */
-int ooConvertIpToNwAddr(char *inetIp, char *netIp);
+EXTERN int ooSocketConvertIpToNwAddr(char *inetIp, char *netIp);
 
 /**
  * This function retrives the IP address of the local host.
@@ -358,13 +358,27 @@
  */
 EXTERN int ooGetLocalIPAddress(char * pIPAddrs);
 
-#ifdef _WIN32
-EXTERN int ooGetSockName(OOSOCKET socket, struct sockaddr_in *name, int *size);
-#endif
 
-EXTERN long ooHTONL(long val);
+EXTERN int ooSocketGetSockName(OOSOCKET socket, struct sockaddr_in *name, 
+                                                      int *size);
 
-EXTERN short ooHTONS(short val);
+
+EXTERN long ooSocketHTONL(long val);
+
+EXTERN short ooSocketHTONS(short val);
+
+/**
+ * This function is used to retrieve the ip and port number used by the socket
+ * passed as parameter. It internally uses getsockname system call for this 
+ * purpose.
+ * @param socket  Socket for which ip and port has to be determined.
+ * @param ip      Buffer in which ip address will be returned.
+ * @param len     Length of the ip address buffer.
+ * @param port    Pointer to integer in which port number will be returned.
+ *
+ * @return        ASN_OK, on success; -ve on failed.
+ */
+EXTERN int ooSocketGetIpAndPort(OOSOCKET socket, char *ip, int len, int *port);
 /** 
  * @} 
  */

Index: ooStackCmds.h
===================================================================
RCS file: /usr/cvsroot/asterisk-addons/asterisk-ooh323c/ooh323c/src/ooStackCmds.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- ooStackCmds.h	3 Jun 2005 14:54:06 -0000	1.3
+++ ooStackCmds.h	16 Jun 2005 19:41:23 -0000	1.4
@@ -29,11 +29,11 @@
 #endif
 
 #ifndef EXTERN
-#ifdef _WIN32
+#if defined (MAKE_DLL)
 #define EXTERN __declspec(dllexport)
 #else
 #define EXTERN
-#endif /* _WIN32 */
+#endif /* MAKE_DLL */
 #endif /* EXTERN */
 /** 
  * @defgroup stackcmds Stack Control Commands

Index: ooasn1.h
===================================================================
RCS file: /usr/cvsroot/asterisk-addons/asterisk-ooh323c/ooh323c/src/ooasn1.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- ooasn1.h	26 May 2005 13:34:36 -0000	1.2
+++ ooasn1.h	16 Jun 2005 19:41:23 -0000	1.3
@@ -535,13 +535,13 @@
 #endif
 
 #ifndef EXTERN
-#ifdef ASN1DLL
+#ifdef MAKE_DLL
 #define EXTERN __declspec(dllexport)
 #elif defined (USEASN1DLL)
 #define EXTERN __declspec(dllimport)
 #else
 #define EXTERN
-#endif /* ASN1DLL */
+#endif /* MAKE_DLL */
 #endif /* EXTERN */
 
 #ifndef _NO_MALLOC

Index: oochannels.c
===================================================================
RCS file: /usr/cvsroot/asterisk-addons/asterisk-ooh323c/ooh323c/src/oochannels.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- oochannels.c	3 Jun 2005 14:54:06 -0000	1.4
+++ oochannels.c	16 Jun 2005 19:41:23 -0000	1.5
@@ -229,7 +229,6 @@
 {
    int ret=0;
    OOSOCKET channelSocket=0;
-
    if((ret=ooSocketCreate (&channelSocket))!=ASN_OK)
    {
       OOTRACEERR3("Failed to create socket for transmit H2250 channel (%s, %s)"
@@ -286,12 +285,37 @@
          OOTRACEINFO3("H2250 transmiter channel creation - succesful "
                       "(%s, %s)\n", call->callType, call->callToken);
 
+         /* If multihomed, get ip from socket */
+         if(!strcmp(call->localIP, "0.0.0.0"))
+         {
+            OOTRACEDBGA3("Determining ip address for outgoing call in "
+                         "multihomed mode. (%s, %s)\n", call->callType, 
+                          call->callToken);
+            ret = ooSocketGetIpAndPort(channelSocket, call->localIP, 20, 
+                                       &call->pH225Channel->port);
+            if(ret != ASN_OK)
+            {
+               OOTRACEERR3("Error:Failed to retrieve local ip and port from "
+                           "socket for multihomed mode.(%s, %s)\n", 
+                            call->callType, call->callToken);
+               if(call->callState < OO_CALL_CLEAR)
+               {  /* transport failure */
+                  call->callState = OO_CALL_CLEAR;
+                  call->callEndReason = OO_REASON_TRANSPORTFAILURE;
+               }
+               return OO_FAILED;
+            }
+            OOTRACEDBGA4("Using local ip %s for outgoing call(multihomedMode)."
+                         " (%s, %s)\n", call->localIP, call->callType, 
+                         call->callToken);
+         }
          return OO_OK;
       }
       else
       {
          OOTRACEERR3("ERROR:Failed to connect to remote destination for "
-                    "transmit H2250 channel\n",call->callType,call->callToken);
+                    "transmit H2250 channel(%s, %s)\n",call->callType,
+                     call->callToken);
          if(call->callState < OO_CALL_CLEAR)
          {  /* No one is listening at remote end */
             call->callState = OO_CALL_CLEAR;
@@ -378,7 +402,32 @@
       memAllocZ (call->pctxt, sizeof(OOH323Channel));
 
    call->pH225Channel->sock = h225Channel;
-  
+
+   /* If multihomed, get ip from socket */
+   if(!strcmp(call->localIP, "0.0.0.0"))
+   {
+      OOTRACEDBGA3("Determining IP address for incoming call in multihomed "
+                   "mode (%s, %s)\n", call->callType, call->callToken);
+
+      ret = ooSocketGetIpAndPort(h225Channel, call->localIP, 20, 
+                                       &call->pH225Channel->port);
+      if(ret != ASN_OK)
+      {
+         OOTRACEERR3("Error:Failed to retrieve local ip and port from "
+                     "socket for multihomed mode.(%s, %s)\n", 
+                      call->callType, call->callToken);
+         if(call->callState < OO_CALL_CLEAR)
+         {  /* transport failure */
+            call->callState = OO_CALL_CLEAR;
+            call->callEndReason = OO_REASON_TRANSPORTFAILURE;
+         }
+         return OO_FAILED;
+      }
+      OOTRACEDBGA4("Using Local IP address %s for incoming call in multihomed "
+                   "mode. (%s, %s)\n", call->localIP, call->callType, 
+                    call->callToken);
+   }
+
    return OO_OK;
 }
 
@@ -746,7 +795,8 @@
       ooCloseH225Connection(call);
       if(call->callState < OO_CALL_CLEARED)
       {
-         call->callEndReason = OO_REASON_TRANSPORTFAILURE;
+         if(call->callState < OO_CALL_CLEAR)
+            call->callEndReason = OO_REASON_TRANSPORTFAILURE;
          call->callState = OO_CALL_CLEARED;
          
       }
@@ -830,7 +880,7 @@
       }
    }
 
-   OOTRACEDBGC3("Received H.2250 message: (%s, %s)\n", 
+   OOTRACEDBGC3("Received Q.931 message: (%s, %s)\n", 
                 call->callType, call->callToken);
 
    initializePrintHandler(&printHandler, "Received H.2250 Message");

Index: oochannels.h
===================================================================
RCS file: /usr/cvsroot/asterisk-addons/asterisk-ooh323c/ooh323c/src/oochannels.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- oochannels.h	3 Jun 2005 14:54:06 -0000	1.4
+++ oochannels.h	16 Jun 2005 19:41:23 -0000	1.5
@@ -36,11 +36,11 @@
 #endif
 
 #ifndef EXTERN
-#ifdef _WIN32
+#ifdef MAKE_DLL
 #define EXTERN __declspec(dllexport)
 #else
 #define EXTERN
-#endif /* _WIN32 */
+#endif /* MAKE_DLL */
 #endif /* EXTERN */
 
 struct OOH323CallData;

Index: ooh245.c
===================================================================
RCS file: /usr/cvsroot/asterisk-addons/asterisk-ooh323c/ooh323c/src/ooh245.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- ooh245.c	3 Jun 2005 14:54:06 -0000	1.4
+++ ooh245.c	16 Jun 2005 19:41:23 -0000	1.5
@@ -310,17 +310,18 @@
 int ooSendTermCapMsg(OOH323CallData *call)
 {
    int ret;
-   H245RequestMessage * request;
-   OOCTXT *pctxt;
-   ooH323EpCapability *epCap;
-   H245TerminalCapabilitySet *termCap;
-   H245AudioCapability *audioCap;
+   H245RequestMessage *request=NULL;
+   OOCTXT *pctxt=NULL;
+   ooH323EpCapability *epCap=NULL;
+   H245TerminalCapabilitySet *termCap=NULL;
+   H245AudioCapability *audioCap=NULL;
    H245AudioTelephonyEventCapability *ateCap=NULL;
-   H245CapabilityTableEntry *entry;
-   H245AlternativeCapabilitySet *altSet;
+   H245CapabilityTableEntry *entry=NULL;
+   H245AlternativeCapabilitySet *altSet=NULL;
    DListNode * curNode=NULL;
-   H245CapabilityDescriptor *capDesc;
+   H245CapabilityDescriptor *capDesc=NULL;
    H245Message *ph245msg=NULL;
+   H245VideoCapability *videoCap=NULL;
 
    int i=0, j=0, k=0;
  
@@ -378,54 +379,122 @@
          continue;
       }
 
-      /* Create audio capability. If capability supports receive, we only add
-         it as receive capability in TCS. However, if it supports only 
-         transmit, we add it as transmit capability in TCS.
-      */
-      if((epCap->dir & OORX))
+      if(epCap->capType == OO_CAP_TYPE_AUDIO)
       {
-         OOTRACEDBGC4("Sending receive capability %d in TCS.(%s, %s)\n",
-                       epCap->cap, call->callType, call->callToken);
-         audioCap = ooCapabilityCreateAudioCapability(epCap, pctxt, OORX);
-         if(!audioCap)
+
+         /* Create audio capability. If capability supports receive, we only 
+            add it as receive capability in TCS. However, if it supports only 
+            transmit, we add it as transmit capability in TCS.
+         */
+         if((epCap->dir & OORX))
          {
-            OOTRACEWARN3("WARN:Failed to create audio capability (%s, %s)", 
-                        call->callType, call->callToken);
+
+            OOTRACEDBGC4("Sending receive capability %s in TCS.(%s, %s)\n",
+                ooGetCapTypeText(epCap->cap), call->callType, call->callToken);
+
+            audioCap = ooCapabilityCreateAudioCapability(epCap, pctxt, OORX);
+            if(!audioCap)
+            {
+               OOTRACEWARN4("WARN:Failed to create audio capability %s "
+                            "(%s, %s)\n", ooGetCapTypeText(epCap->cap), 
+                            call->callType, call->callToken);
+               continue;
+            }
+         }else if(epCap->dir & OOTX)
+         {
+            OOTRACEDBGC4("Sending transmit capability %s in TCS.(%s, %s)\n",
+                ooGetCapTypeText(epCap->cap), call->callType, call->callToken);
+            audioCap = ooCapabilityCreateAudioCapability(epCap, pctxt, OOTX);
+            if(!audioCap)
+            {
+               OOTRACEWARN4("WARN:Failed to create audio capability %s "
+                            "(%s, %s)\n", ooGetCapTypeText(epCap->cap),
+                            call->callType, call->callToken);
+               continue;
+            }     
+         }else{
+            OOTRACEWARN3("Warn:Capability is not RX/TX/RXANDTX. Symmetric "
+                         "capabilities are not supported.(%s, %s)\n", 
+                         call->callType, call->callToken);
             continue;
          }
-      }else if(epCap->dir & OOTX)
+         /* Add  Capabilities to Capability Table */
+         entry = (H245CapabilityTableEntry*) memAlloc(pctxt,
+                         sizeof(H245CapabilityTableEntry));
+         if(!entry)
+         {
+            OOTRACEERR3("Error:Memory - ooSendTermCapMsg - entry(audio Cap)."
+                        "(%s, %s)\n", call->callType, call->callToken);
+            return OO_FAILED;
+         }
+         memset(entry, 0, sizeof(H245CapabilityTableEntry));
+         entry->m.capabilityPresent = 1;
+         if((epCap->dir & OORX))
+         {
+            entry->capability.t = T_H245Capability_receiveAudioCapability;
+            entry->capability.u.receiveAudioCapability = audioCap;
+         }else{
+            entry->capability.t = T_H245Capability_transmitAudioCapability;
+            entry->capability.u.transmitAudioCapability = audioCap;
+         }
+         entry->capabilityTableEntryNumber = i+1;
+         dListAppend(pctxt , &(termCap->capabilityTable), entry);
+         i++;
+      }else if(epCap->capType == OO_CAP_TYPE_VIDEO)
       {
-         OOTRACEDBGC4("Sending transmit capability %d in TCS.(%s, %s)\n",
-                       epCap->cap, call->callType, call->callToken);
-         audioCap = ooCapabilityCreateAudioCapability(epCap, pctxt, OOTX);
-         if(!audioCap)
+         if((epCap->dir & OORX))
          {
-            OOTRACEWARN3("WARN:Failed to create audio capability (%s, %s)", 
-                        call->callType, call->callToken);
+            OOTRACEDBGC4("Sending receive capability %s in TCS.(%s, %s)\n",
+                ooGetCapTypeText(epCap->cap), call->callType, call->callToken);
+            videoCap = ooCapabilityCreateVideoCapability(epCap, pctxt, OORX);
+            if(!videoCap)
+            {
+               OOTRACEWARN4("WARN:Failed to create Video capability %s "
+                            "(%s, %s)\n", ooGetCapTypeText(epCap->cap),
+                           call->callType, call->callToken);
+               continue;
+            }
+         }else if(epCap->dir & OOTX)
+         {
+            OOTRACEDBGC4("Sending transmit capability %s in TCS.(%s, %s)\n",
+                ooGetCapTypeText(epCap->cap), call->callType, call->callToken);
+            videoCap = ooCapabilityCreateVideoCapability(epCap, pctxt, OOTX);
+            if(!videoCap)
+            {
+               OOTRACEWARN4("WARN:Failed to create video capability %s "
+                            "(%s, %s)\n", ooGetCapTypeText(epCap->cap),
+                           call->callType, call->callToken);
+               continue;
+            }     
+         }else{
+            OOTRACEWARN3("Warn:Capability is not RX/TX/RXANDTX. Symmetric "
+                         "capabilities are not supported.(%s, %s)\n", 
+                         call->callType, call->callToken);
             continue;
-         }     
-      }else{
-         OOTRACEWARN3("Warn:Capability is not RX/TX/RXANDTX. Symmetric "
-                      "capabilities are not supported.(%s, %s)\n", 
-                      call->callType, call->callToken);
-	  continue;
-      }
-      /* Add  Capabilities to Capability Table */
-      entry = (H245CapabilityTableEntry*) memAlloc(pctxt,
-                      sizeof(H245CapabilityTableEntry));
-      memset(entry, 0, sizeof(H245CapabilityTableEntry));
-      entry->m.capabilityPresent = 1;
-      if((epCap->dir & OORX))
-      {
-         entry->capability.t = T_H245Capability_receiveAudioCapability;
-         entry->capability.u.receiveAudioCapability = audioCap;
-      }else{
-         entry->capability.t = T_H245Capability_transmitAudioCapability;
-         entry->capability.u.transmitAudioCapability = audioCap;
+         }
+         /* Add Video capabilities to Capability Table */
+         entry = (H245CapabilityTableEntry*) memAlloc(pctxt,
+                            sizeof(H245CapabilityTableEntry));
+         if(!entry)
+         {
+            OOTRACEERR3("Error:Memory - ooSendTermCapMsg - entry(video Cap)."
+                        "(%s, %s)\n", call->callType, call->callToken);
+            return OO_FAILED;
+         }
+         memset(entry, 0, sizeof(H245CapabilityTableEntry));
+         entry->m.capabilityPresent = 1;
+         if((epCap->dir & OORX))
+         {
+            entry->capability.t = T_H245Capability_receiveVideoCapability;
+            entry->capability.u.receiveVideoCapability = videoCap;
+         }else{
+            entry->capability.t = T_H245Capability_transmitVideoCapability;
+            entry->capability.u.transmitVideoCapability = videoCap;
+         }
+         entry->capabilityTableEntryNumber = i+1;
+         dListAppend(pctxt , &(termCap->capabilityTable), entry);
+         i++;
       }
-      entry->capabilityTableEntryNumber = i+1;
-      dListAppend(pctxt , &(termCap->capabilityTable), entry);
-      i++;
    }
    /* Add dtmf capability, if any */
    if(call->dtmfmode & OO_CAP_DTMF_RFC2833)
@@ -1066,7 +1135,7 @@
                   "(%s, %s)\n", call->callType, call->callToken);
       return OO_FAILED;
    }
-   ooConvertIpToNwAddr(call->localIP, iPAddress->network.data);
+   ooSocketConvertIpToNwAddr(call->localIP, iPAddress->network.data);
 
    iPAddress->network.numocts = 4;
    iPAddress->tsapIdentifier = pLogicalChannel->localRtpPort;
@@ -1085,7 +1154,7 @@
    iPAddress1 = unicastAddrs1->u.iPAddress;
    memset(iPAddress1, 0, sizeof(H245UnicastAddress_iPAddress));
 
-   ooConvertIpToNwAddr(call->localIP, iPAddress1->network.data);
+   ooSocketConvertIpToNwAddr(call->localIP, iPAddress1->network.data);
 
    iPAddress1->network.numocts = 4;
    iPAddress1->tsapIdentifier = pLogicalChannel->localRtcpPort;
@@ -2756,7 +2825,7 @@
    iPAddress = unicastAddrs->u.iPAddress;
    memset(iPAddress, 0, sizeof(H245UnicastAddress_iPAddress));
 
-   ooConvertIpToNwAddr(pLogicalChannel->localIP, iPAddress->network.data);
+   ooSocketConvertIpToNwAddr(pLogicalChannel->localIP,iPAddress->network.data);
 
    iPAddress->network.numocts = 4;
    iPAddress->tsapIdentifier = pLogicalChannel->localRtcpPort;
@@ -2881,7 +2950,7 @@
          memset(pUniIpAddrs, 0, sizeof(H245UnicastAddress_iPAddress));
          pUniAddrs->u.iPAddress = pUniIpAddrs;
      
-         ooConvertIpToNwAddr(pLogicalChannel->localIP, 
+         ooSocketConvertIpToNwAddr(pLogicalChannel->localIP, 
                                                 pUniIpAddrs->network.data);
 
          pUniIpAddrs->network.numocts = 4;
@@ -2900,7 +2969,8 @@
       memset(pIpAddrs, 0, sizeof(H245UnicastAddress_iPAddress));
       pUnicastAddrs->u.iPAddress = pIpAddrs;
      
-       ooConvertIpToNwAddr(pLogicalChannel->localIP, pIpAddrs->network.data);
+       ooSocketConvertIpToNwAddr(pLogicalChannel->localIP, 
+                                                      pIpAddrs->network.data);
 
       pIpAddrs->network.numocts = 4;
       pIpAddrs->tsapIdentifier = pLogicalChannel->localRtcpPort;
@@ -2974,7 +3044,8 @@
          memset(pIpAddrs, 0, sizeof(H245UnicastAddress_iPAddress));
          pUnicastAddrs->u.iPAddress = pIpAddrs;      
 
-         ooConvertIpToNwAddr(pLogicalChannel->localIP, pIpAddrs->network.data);
+         ooSocketConvertIpToNwAddr(pLogicalChannel->localIP, 
+                                                       pIpAddrs->network.data);
 
          pIpAddrs->network.numocts = 4;
          pIpAddrs->tsapIdentifier = pLogicalChannel->localRtpPort;
@@ -2993,7 +3064,8 @@
       memset(pUniIpAddrs, 0, sizeof(H245UnicastAddress_iPAddress));
       pUniAddrs->u.iPAddress = pUniIpAddrs; 
 
-      ooConvertIpToNwAddr(pLogicalChannel->localIP, pUniIpAddrs->network.data);
+      ooSocketConvertIpToNwAddr(pLogicalChannel->localIP, 
+                                                    pUniIpAddrs->network.data);
       pUniIpAddrs->network.numocts = 4;
       pUniIpAddrs->tsapIdentifier = pLogicalChannel->localRtcpPort;
           
@@ -3267,7 +3339,8 @@
       pUniAddrs->t = T_H245UnicastAddress_iPAddress;
       pUniAddrs->u.iPAddress = pUniIpAddrs;
      
-      ooConvertIpToNwAddr(pLogicalChannel->localIP, pUniIpAddrs->network.data);
+      ooSocketConvertIpToNwAddr(pLogicalChannel->localIP, 
+                                                    pUniIpAddrs->network.data);
 
       pUniIpAddrs->network.numocts = 4;
       pUniIpAddrs->tsapIdentifier = pLogicalChannel->localRtpPort;
@@ -3292,7 +3365,8 @@
       
       pUnicastAddrs->u.iPAddress = pIpAddrs;
      
-      ooConvertIpToNwAddr(pLogicalChannel->localIP, pIpAddrs->network.data);
+      ooSocketConvertIpToNwAddr(pLogicalChannel->localIP, 
+                                                       pIpAddrs->network.data);
 
       pIpAddrs->network.numocts = 4;
       pIpAddrs->tsapIdentifier = pLogicalChannel->localRtcpPort;
@@ -3328,7 +3402,8 @@
 
       pUniAddrs->u.iPAddress = pUniIpAddrs; 
 
-      ooConvertIpToNwAddr(pLogicalChannel->localIP, pUniIpAddrs->network.data);
+      ooSocketConvertIpToNwAddr(pLogicalChannel->localIP, 
+                                                    pUniIpAddrs->network.data);
       pUniIpAddrs->network.numocts = 4;
       pUniIpAddrs->tsapIdentifier = pLogicalChannel->localRtcpPort;
           

Index: ooh245.h
===================================================================
RCS file: /usr/cvsroot/asterisk-addons/asterisk-ooh323c/ooh323c/src/ooh245.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- ooh245.h	3 Jun 2005 14:54:06 -0000	1.2
+++ ooh245.h	16 Jun 2005 19:41:23 -0000	1.3
@@ -34,11 +34,11 @@
 #endif
 
 #ifndef EXTERN
-#ifdef _WIN32
+#ifdef MAKE_DLL
 #define EXTERN __declspec(dllexport)
 #else
 #define EXTERN
-#endif /* _WIN32 */
+#endif /* MAKE_DLL */
 #endif /* EXTERN */
 
 struct OOH323CallData;

Index: ooh323.c
===================================================================
RCS file: /usr/cvsroot/asterisk-addons/asterisk-ooh323c/ooh323c/src/ooh323.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- ooh323.c	3 Jun 2005 14:54:06 -0000	1.3
+++ ooh323.c	16 Jun 2005 19:41:23 -0000	1.4
@@ -365,16 +365,393 @@
    return OO_OK;
 }
 
+
+
+int ooOnReceivedCallProceeding(OOH323CallData *call, Q931Message *q931Msg)
+{
+   H225CallProceeding_UUIE *callProceeding=NULL;
+   H245OpenLogicalChannel* olc;
+   ASN1OCTET msgbuf[MAXMSGLEN];
+   ooLogicalChannel * pChannel = NULL;
+   H245H2250LogicalChannelParameters * h2250lcp = NULL;  
+   int i=0, ret=0;
+
+   if(!q931Msg->userInfo)
+   {
+      OOTRACEERR3("ERROR:No User-User IE in received CallProceeding message."
+                  " (%s, %s)\n", call->callType, call->callToken);
+      return OO_FAILED;
+   }
+   callProceeding = 
+             q931Msg->userInfo->h323_uu_pdu.h323_message_body.u.callProceeding;
+   if(callProceeding == NULL)
+   {
+      OOTRACEERR3("Error: Received CallProceeding message does not have "
+                  "CallProceeding UUIE (%s, %s)\n", call->callType, 
+                  call->callToken);
+      /* Mark call for clearing */
+      if(call->callState < OO_CALL_CLEAR)
+      {
+         call->callEndReason = OO_REASON_INVALIDMESSAGE;
+         call->callState = OO_CALL_CLEAR;
+      }
+      return OO_FAILED;
+   }
+   /*Handle fast-start */
+   if(OO_TESTFLAG (call->flags, OO_M_FASTSTART))
+   {
+      if(callProceeding->m.fastStartPresent)
+      {
+         /* For printing the decoded message to log, initialize handler. */
+         initializePrintHandler(&printHandler, "FastStart Elements");
+
+         /* Set print handler */
+         setEventHandler (call->pctxt, &printHandler);
+
+         for(i=0; i<(int)callProceeding->fastStart.n; i++)
+         {
+            olc = NULL;
+
+            olc = (H245OpenLogicalChannel*)memAlloc(call->pctxt, 
+                                              sizeof(H245OpenLogicalChannel));
+            if(!olc)
+            {
+               OOTRACEERR3("ERROR:Memory - ooOnReceivedCallProceeding - olc"
+                           "(%s, %s)\n", call->callType, call->callToken);
+               /*Mark call for clearing */
+               if(call->callState < OO_CALL_CLEAR)
+               {
+                  call->callEndReason = OO_REASON_LOCAL_CLEARED;
+                  call->callState = OO_CALL_CLEAR;
+               }
+               return OO_FAILED;
+            }
+            memset(olc, 0, sizeof(H245OpenLogicalChannel));
+            memcpy(msgbuf, callProceeding->fastStart.elem[i].data, 
+                                    callProceeding->fastStart.elem[i].numocts);
+            setPERBuffer(call->pctxt, msgbuf, 
+                         callProceeding->fastStart.elem[i].numocts, 1);
+            ret = asn1PD_H245OpenLogicalChannel(call->pctxt, olc);
+            if(ret != ASN_OK)
+            {
+               OOTRACEERR3("ERROR:Failed to decode fast start olc element "
+                           "(%s, %s)\n", call->callType, call->callToken);
+               /* Mark call for clearing */
+               if(call->callState < OO_CALL_CLEAR)
+               {
+                  call->callEndReason = OO_REASON_INVALIDMESSAGE;
+                  call->callState = OO_CALL_CLEAR;
+               }
+               return OO_FAILED;
+            }
+
+            dListAppend(call->pctxt, &call->remoteFastStartOLCs, olc);
+
+            pChannel = ooFindLogicalChannelByOLC(call, olc);
+            if(!pChannel)
+            {
+               OOTRACEERR4("ERROR: Logical Channel %d not found. (%s, %s)\n",
+                            olc->forwardLogicalChannelNumber, call->callType, 
+                            call->callToken);
+               return OO_FAILED;
+            }
+            if(pChannel->channelNo != olc->forwardLogicalChannelNumber)
+            {
+               OOTRACEINFO5("Remote endpoint changed forwardLogicalChannel"
+                            "Number from %d to %d (%s, %s)\n", 
+                            pChannel->channelNo, 
+                            olc->forwardLogicalChannelNumber, call->callType, 
+                            call->callToken);
+               pChannel->channelNo = olc->forwardLogicalChannelNumber;
+            }
+            if(!strcmp(pChannel->dir, "transmit"))
+            {
+               if(olc->forwardLogicalChannelParameters.multiplexParameters.t !=
+                  T_H245OpenLogicalChannel_forwardLogicalChannelParameters_multiplexParameters_h2250LogicalChannelParameters)
+               {
+                  OOTRACEERR4("ERROR:Unknown multiplex parameter type for "
+                              "channel %d (%s, %s)\n", 
+                              olc->forwardLogicalChannelNumber, call->callType,
+                              call->callToken);
+                  continue;
+               }
+            
+               /* Extract the remote media endpoint address */
+               h2250lcp = olc->forwardLogicalChannelParameters.multiplexParameters.u.h2250LogicalChannelParameters;
+               if(!h2250lcp)
+               {
+                  OOTRACEERR3("ERROR:Invalid OLC received in fast start. No "
+                              "forward Logical Channel Parameters found. "
+                              "(%s, %s)\n", call->callType, call->callToken);
+                  return OO_FAILED;
+               }
+               if(!h2250lcp->m.mediaChannelPresent)
+               {
+                  OOTRACEERR3("ERROR:Invalid OLC received in fast start. No "
+                              "reverse media channel information found."
+                              "(%s, %s)\n", call->callType, call->callToken);
+                  return OO_FAILED;
+               }
+               ret = ooGetIpPortFromH245TransportAddress(call, 
+                                   &h2250lcp->mediaChannel, pChannel->remoteIP,
+                                   &pChannel->remoteMediaPort);
+               
+               if(ret != OO_OK)
+               {
+                  OOTRACEERR3("ERROR:Unsupported media channel address type "
+                              "(%s, %s)\n", call->callType, call->callToken);
+                  return OO_FAILED;
+               }
+       
+               if(!pChannel->chanCap->startTransmitChannel)
+               {
+                  OOTRACEERR3("ERROR:No callback registered to start transmit "
+                              "channel (%s, %s)\n",call->callType, 
+                              call->callToken);
+                  return OO_FAILED;
+               }
+               pChannel->chanCap->startTransmitChannel(call, pChannel);
+            }
+            /* Mark the current channel as established and close all other 
+               logical channels with same session id and in same direction.
+            */
+            ooOnLogicalChannelEstablished(call, pChannel);
+         }
+         finishPrint();
+         removeEventHandler(call->pctxt);
+         OO_SETFLAG(call->flags, OO_M_FASTSTARTANSWERED);
+      }
+      
+   }
+
+   /* Retrieve the H.245 control channel address from the connect msg */
+   if(callProceeding->m.h245AddressPresent)
+   {
+      if (OO_TESTFLAG (call->flags, OO_M_TUNNELING))
+      {
+         OO_CLRFLAG (call->flags, OO_M_TUNNELING);
+         OOTRACEINFO3("Tunneling is disabled for call as H245 address is "
+                      "provided in callProceeding message (%s, %s)\n", 
+                      call->callType, call->callToken);
+      }
+      ret = ooH323GetIpPortFromH225TransportAddress(call, 
+                                  &callProceeding->h245Address, call->remoteIP,
+                                  &call->remoteH245Port);
+      if(ret != OO_OK)
+      {
+         OOTRACEERR3("Error: Unknown H245 address type in received "
+                     "CallProceeding message (%s, %s)", call->callType, 
+                     call->callToken);
+         /* Mark call for clearing */
+         if(call->callState < OO_CALL_CLEAR)
+         {
+            call->callEndReason = OO_REASON_INVALIDMESSAGE;
+            call->callState = OO_CALL_CLEAR;
+         }
+         return OO_FAILED;
+      }
+   }
+   return OO_OK;
+}
+
+
+int ooOnReceivedAlerting(OOH323CallData *call, Q931Message *q931Msg)
+{
+   H225Alerting_UUIE *alerting=NULL;
+   H245OpenLogicalChannel* olc;
+   ASN1OCTET msgbuf[MAXMSGLEN];
+   ooLogicalChannel * pChannel = NULL;
+   H245H2250LogicalChannelParameters * h2250lcp = NULL;  
+   int i=0, ret=0;
+
+
+   if(!q931Msg->userInfo)
+   {
+      OOTRACEERR3("ERROR:No User-User IE in received Alerting message."
+                  " (%s, %s)\n", call->callType, call->callToken);
+      return OO_FAILED;
+   }
+   alerting = q931Msg->userInfo->h323_uu_pdu.h323_message_body.u.alerting;
+   if(alerting == NULL)
+   {
+      OOTRACEERR3("Error: Received Alerting message does not have "
+                  "alerting UUIE (%s, %s)\n", call->callType, 
+                  call->callToken);
+      /* Mark call for clearing */
+      if(call->callState < OO_CALL_CLEAR)
+      {
+         call->callEndReason = OO_REASON_INVALIDMESSAGE;
+         call->callState = OO_CALL_CLEAR;
+      }
+      return OO_FAILED;
+   }
+   /*Handle fast-start */
+   if(OO_TESTFLAG (call->flags, OO_M_FASTSTART) &&
+      !OO_TESTFLAG(call->flags, OO_M_FASTSTARTANSWERED))
+   {
+      if(alerting->m.fastStartPresent)
+      {
+         /* For printing the decoded message to log, initialize handler. */
+         initializePrintHandler(&printHandler, "FastStart Elements");
+
+         /* Set print handler */
+         setEventHandler (call->pctxt, &printHandler);
+
+         for(i=0; i<(int)alerting->fastStart.n; i++)
+         {
+            olc = NULL;
+
+            olc = (H245OpenLogicalChannel*)memAlloc(call->pctxt, 
+                                              sizeof(H245OpenLogicalChannel));
+            if(!olc)
+            {
+               OOTRACEERR3("ERROR:Memory - ooOnReceivedAlerting - olc"
+                           "(%s, %s)\n", call->callType, call->callToken);
+               /*Mark call for clearing */
+               if(call->callState < OO_CALL_CLEAR)
+               {
+                  call->callEndReason = OO_REASON_LOCAL_CLEARED;
+                  call->callState = OO_CALL_CLEAR;
+               }
+               return OO_FAILED;
+            }
+            memset(olc, 0, sizeof(H245OpenLogicalChannel));
+            memcpy(msgbuf, alerting->fastStart.elem[i].data, 
+                                    alerting->fastStart.elem[i].numocts);
+            setPERBuffer(call->pctxt, msgbuf, 
+                         alerting->fastStart.elem[i].numocts, 1);
+            ret = asn1PD_H245OpenLogicalChannel(call->pctxt, olc);
+            if(ret != ASN_OK)
+            {
+               OOTRACEERR3("ERROR:Failed to decode fast start olc element "
+                           "(%s, %s)\n", call->callType, call->callToken);
+               /* Mark call for clearing */
+               if(call->callState < OO_CALL_CLEAR)
+               {
+                  call->callEndReason = OO_REASON_INVALIDMESSAGE;
+                  call->callState = OO_CALL_CLEAR;
+               }
+               return OO_FAILED;
+            }
+
+            dListAppend(call->pctxt, &call->remoteFastStartOLCs, olc);
+
+            pChannel = ooFindLogicalChannelByOLC(call, olc);
+            if(!pChannel)
+            {
+               OOTRACEERR4("ERROR: Logical Channel %d not found. (%s, %s)\n",
+                            olc->forwardLogicalChannelNumber, call->callType, 
+                            call->callToken);
+               return OO_FAILED;
+            }
+            if(pChannel->channelNo != olc->forwardLogicalChannelNumber)
+            {
+               OOTRACEINFO5("Remote endpoint changed forwardLogicalChannel"
+                            "Number from %d to %d (%s, %s)\n", 
+                            pChannel->channelNo, 
+                            olc->forwardLogicalChannelNumber, call->callType, 
+                            call->callToken);
+               pChannel->channelNo = olc->forwardLogicalChannelNumber;
+            }
+            if(!strcmp(pChannel->dir, "transmit"))
+            {
+               if(olc->forwardLogicalChannelParameters.multiplexParameters.t !=
+                  T_H245OpenLogicalChannel_forwardLogicalChannelParameters_multiplexParameters_h2250LogicalChannelParameters)
+               {
+                  OOTRACEERR4("ERROR:Unknown multiplex parameter type for "
+                              "channel %d (%s, %s)\n", 
+                              olc->forwardLogicalChannelNumber, call->callType,
+                              call->callToken);
+                  continue;
+               }
+            
+               /* Extract the remote media endpoint address */
+               h2250lcp = olc->forwardLogicalChannelParameters.multiplexParameters.u.h2250LogicalChannelParameters;
+               if(!h2250lcp)
+               {
+                  OOTRACEERR3("ERROR:Invalid OLC received in fast start. No "
+                              "forward Logical Channel Parameters found. "
+                              "(%s, %s)\n", call->callType, call->callToken);
+                  return OO_FAILED;
+               }
+               if(!h2250lcp->m.mediaChannelPresent)
+               {
+                  OOTRACEERR3("ERROR:Invalid OLC received in fast start. No "
+                              "reverse media channel information found."
+                              "(%s, %s)\n", call->callType, call->callToken);
+                  return OO_FAILED;
+               }
+               ret = ooGetIpPortFromH245TransportAddress(call, 
+                                   &h2250lcp->mediaChannel, pChannel->remoteIP,
+                                   &pChannel->remoteMediaPort);
+               
+               if(ret != OO_OK)
+               {
+                  OOTRACEERR3("ERROR:Unsupported media channel address type "
+                              "(%s, %s)\n", call->callType, call->callToken);
+                  return OO_FAILED;
+               }
+       
+               if(!pChannel->chanCap->startTransmitChannel)
+               {
+                  OOTRACEERR3("ERROR:No callback registered to start transmit "
+                              "channel (%s, %s)\n",call->callType, 
+                              call->callToken);
+                  return OO_FAILED;
+               }
+               pChannel->chanCap->startTransmitChannel(call, pChannel);
+            }
+            /* Mark the current channel as established and close all other 
+               logical channels with same session id and in same direction.
+            */
+            ooOnLogicalChannelEstablished(call, pChannel);
+         }
+         finishPrint();
+         removeEventHandler(call->pctxt);
+         OO_SETFLAG(call->flags, OO_M_FASTSTARTANSWERED);
+      }
+      
+   }
+
+   /* Retrieve the H.245 control channel address from the connect msg */
+   if(alerting->m.h245AddressPresent)
+   {
+      if (OO_TESTFLAG (call->flags, OO_M_TUNNELING))
+      {
+         OO_CLRFLAG (call->flags, OO_M_TUNNELING);
+         OOTRACEINFO3("Tunneling is disabled for call as H245 address is "
+                      "provided in Alerting message (%s, %s)\n", 
+                      call->callType, call->callToken);
+      }
+      ret = ooH323GetIpPortFromH225TransportAddress(call, 
+                                  &alerting->h245Address, call->remoteIP,
+                                  &call->remoteH245Port);
+      if(ret != OO_OK)
+      {
+         OOTRACEERR3("Error: Unknown H245 address type in received "
+                     "Alerting message (%s, %s)", call->callType, 
+                     call->callToken);
+         /* Mark call for clearing */
+         if(call->callState < OO_CALL_CLEAR)
+         {
+            call->callEndReason = OO_REASON_INVALIDMESSAGE;
+            call->callState = OO_CALL_CLEAR;
+         }
+         return OO_FAILED;
+      }
+   }
+   return OO_OK;
+}
+   
+
 int ooOnReceivedSignalConnect(OOH323CallData* call, Q931Message *q931Msg)
 {
    int ret, i;
-   H225TransportAddress *h245Address;
    H225Connect_UUIE *connect;
    H245OpenLogicalChannel* olc;
    ASN1OCTET msgbuf[MAXMSGLEN];
    ooLogicalChannel * pChannel = NULL;
    H245H2250LogicalChannelParameters * h2250lcp = NULL;  
-   H245UnicastAddress *unicastAddress;
 
    if(!q931Msg->userInfo)
    {
@@ -404,7 +781,8 @@
    }
 
    /*Handle fast-start */
-   if (OO_TESTFLAG (call->flags, OO_M_FASTSTART))
+   if(OO_TESTFLAG (call->flags, OO_M_FASTSTART) && 
+      !OO_TESTFLAG (call->flags, OO_M_FASTSTARTANSWERED))
    {
       if(!connect->m.fastStartPresent)
       {
@@ -416,7 +794,8 @@
       }
    }
 
-   if (connect->m.fastStartPresent)
+   if (connect->m.fastStartPresent && 
+       !OO_TESTFLAG(call->flags, OO_M_FASTSTARTANSWERED))
    {
       /* For printing the decoded message to log, initialize handler. */
       initializePrintHandler(&printHandler, "FastStart Elements");
@@ -506,27 +885,20 @@
                            "\n", call->callType, call->callToken);
                return OO_FAILED;
             }
-            if(h2250lcp->mediaChannel.t != 
-                                         T_H245TransportAddress_unicastAddress)
+
+            ret = ooGetIpPortFromH245TransportAddress(call, 
+                                   &h2250lcp->mediaChannel, pChannel->remoteIP,
+                                   &pChannel->remoteMediaPort);
+            if(ret != OO_OK)
             {
                OOTRACEERR3("ERROR:Unsupported media channel address type "
                            "(%s, %s)\n", call->callType, call->callToken);
                return OO_FAILED;
             }
-      
-            unicastAddress = h2250lcp->mediaChannel.u.unicastAddress;
-            if(unicastAddress->t != T_H245UnicastAddress_iPAddress)
-            {
-               OOTRACEERR3("ERROR:media channel address type is not IP"
-                           "(%s, %s)\n", call->callType, call->callToken);
-               return OO_FAILED;
-            }
-            pChannel->remoteMediaPort = 
-                                  unicastAddress->u.iPAddress->tsapIdentifier;
             if(!pChannel->chanCap->startTransmitChannel)
             {
                OOTRACEERR3("ERROR:No callback registered to start transmit "
-                           "channel (%s, %s)\n",call->callType, call->callToken);
+                         "channel (%s, %s)\n",call->callType, call->callToken);
                return OO_FAILED;
             }
             pChannel->chanCap->startTransmitChannel(call, pChannel);
@@ -538,6 +910,7 @@
       }
       finishPrint();
       removeEventHandler(call->pctxt);
+      OO_SETFLAG(call->flags, OO_M_FASTSTARTANSWERED);
    }
 
    /* Retrieve the H.245 control channel address from the connect msg */
@@ -550,8 +923,9 @@
                       "provided in connect message (%s, %s)\n", 
                       call->callType, call->callToken);
       }
-      h245Address = &(connect->h245Address);
-      if(h245Address->t != T_H225TransportAddress_ipAddress)
+      ret = ooH323GetIpPortFromH225TransportAddress(call, 
+                 &connect->h245Address, call->remoteIP, &call->remoteH245Port);
+      if(ret != OO_OK)
       {
          OOTRACEERR3("Error: Unknown H245 address type in received Connect "
                      "message (%s, %s)", call->callType, call->callToken);
@@ -563,13 +937,11 @@
          }
          return OO_FAILED;
       }
-      sprintf(call->remoteIP, "%d.%d.%d.%d", 
-              h245Address->u.ipAddress->ip.data[0], 
-              h245Address->u.ipAddress->ip.data[1],
-              h245Address->u.ipAddress->ip.data[2],
-              h245Address->u.ipAddress->ip.data[3]);
-      call->remoteH245Port = h245Address->u.ipAddress->port;
-      /* Create an H.245 connection. 
+   }
+
+   if(call->remoteH245Port != 0)
+   {
+       /* Create an H.245 connection. 
       */
       if(ooCreateH245Connection(call)== OO_FAILED)
       {
@@ -684,6 +1056,7 @@
       case Q931CallProceedingMsg:/* Call proceeding message is received */
          OOTRACEINFO3("H.225 Call Proceeding message received (%s, %s)\n",
                       call->callType, call->callToken);
+         ooOnReceivedCallProceeding(call, q931Msg);
 
          ooFreeQ931Message(q931Msg);
          break;
@@ -691,6 +1064,8 @@
          OOTRACEINFO3("H.225 Alerting message received (%s, %s)\n", 
                       call->callType, call->callToken);
 
+         ooOnReceivedAlerting(call, q931Msg);
+
          if(gH323ep.h323Callbacks.onAlerting && call->callState<OO_CALL_CLEAR)
             gH323ep.h323Callbacks.onAlerting(call);
          ooFreeQ931Message(q931Msg);
@@ -1398,3 +1773,21 @@
    *pAliasList= newAlias;
    return newAlias;
 }
+
+int ooH323GetIpPortFromH225TransportAddress(struct OOH323CallData *call, 
+   H225TransportAddress *h225Address, char *ip, int *port)
+{
+   if(h225Address->t != T_H225TransportAddress_ipAddress)
+   {
+      OOTRACEERR3("Error: Unknown H225 address type. (%s, %s)", call->callType,
+                   call->callToken);
+      return OO_FAILED;
+   }
+   sprintf(ip, "%d.%d.%d.%d", 
+              h225Address->u.ipAddress->ip.data[0], 
+              h225Address->u.ipAddress->ip.data[1],
+              h225Address->u.ipAddress->ip.data[2],
+              h225Address->u.ipAddress->ip.data[3]);
+   *port = h225Address->u.ipAddress->port;
+   return OO_OK;
+}

Index: ooh323.h
===================================================================
RCS file: /usr/cvsroot/asterisk-addons/asterisk-ooh323c/ooh323c/src/ooh323.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- ooh323.h	3 Jun 2005 14:54:06 -0000	1.2
+++ ooh323.h	16 Jun 2005 19:41:23 -0000	1.3
@@ -32,11 +32,11 @@
 #endif
 
 #ifndef EXTERN
-#ifdef _WIN32
+#ifdef MAKE_DLL
 #define EXTERN __declspec(dllexport)
 #else
 #define EXTERN
-#endif /* _WIN32 */
+#endif /* MAKE_DLL */
 #endif /* EXTERN */
 
 struct OOH323CallData;
@@ -158,6 +158,20 @@
 (OOAliases **pAliasList, OOCTXT *pctxt, H225AliasAddress *pAliasAddress);
 
 /**
+ * This function is used to retrieve ip address and port number from an
+ * H225TransportAddress structure.
+ * @param call          Handle to the associated call.
+ * @param h225Address   Pointer to H225TransportAddress structure
+ * @param ip            Pointer to the buffer in which dotted ip address will
+ *                      be returned.
+ * @param port          Pointer to the integer in which port value will be 
+ *                      returned.
+ *
+ * @return              OO_OK, on success; OO_FAILED, on failure.
+ */
+int ooH323GetIpPortFromH225TransportAddress(struct OOH323CallData *call, 
+   H225TransportAddress *h225Address, char *ip, int *port);
+/**
  * @}
  */
 #ifdef __cplusplus

Index: ooh323ep.h
===================================================================
RCS file: /usr/cvsroot/asterisk-addons/asterisk-ooh323c/ooh323c/src/ooh323ep.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- ooh323ep.h	3 Jun 2005 14:54:06 -0000	1.3
+++ ooh323ep.h	16 Jun 2005 19:41:23 -0000	1.4
@@ -45,11 +45,11 @@
 #endif
 
 #ifndef EXTERN
-#ifdef _WIN32
+#ifdef MAKE_DLL
 #define EXTERN __declspec(dllexport)
 #else
 #define EXTERN
-#endif /* _WIN32 */
+#endif /* MAKE_DLL */
 #endif /* EXTERN */
 
 struct OOCapPrefs;

Index: ooports.c
===================================================================
RCS file: /usr/cvsroot/asterisk-addons/asterisk-ooh323c/ooh323c/src/ooports.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- ooports.c	26 May 2005 13:34:36 -0000	1.2
+++ ooports.c	16 Jun 2005 19:41:23 -0000	1.3
@@ -86,17 +86,14 @@
 int ooBindOSAllocatedPort(OOSOCKET socket)
 {
    OOIPADDR ipAddrs;
-/*   char localip[40];*/
    int size, ret;
    struct sockaddr_in name;
    size = sizeof(struct sockaddr_in);
-   /*ooGetLocalIPAddress(localip);
-   ret= ooSocketStrToAddr (localip, &ipAddrs);*/
    ret= ooSocketStrToAddr (gH323ep.signallingIP, &ipAddrs);
    if((ret=ooSocketBind(socket, ipAddrs, 
                      0))==ASN_OK)
    {
-      ret = ooGetSockName(socket, &name, &size);
+      ret = ooSocketGetSockName(socket, &name, &size);
       if(ret == ASN_OK)
       {
          return name.sin_port;

Index: ooports.h
===================================================================
RCS file: /usr/cvsroot/asterisk-addons/asterisk-ooh323c/ooh323c/src/ooports.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- ooports.h	26 May 2005 13:34:36 -0000	1.2
+++ ooports.h	16 Jun 2005 19:41:23 -0000	1.3
@@ -34,11 +34,11 @@
 #endif
 
 #ifndef EXTERN
-#ifdef _WIN32
+#ifdef MAKE_DLL
 #define EXTERN __declspec(dllexport)
 #else
 #define EXTERN
-#endif /* _WIN32 */
+#endif /* MAKE_DLL */
 #endif /* EXTERN */
 
 /**

Index: ooq931.c
===================================================================
RCS file: /usr/cvsroot/asterisk-addons/asterisk-ooh323c/ooh323c/src/ooq931.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- ooq931.c	3 Jun 2005 14:54:06 -0000	1.3
+++ ooq931.c	16 Jun 2005 19:41:23 -0000	1.4
@@ -52,11 +52,14 @@
       return Q931_E_TOOSHORT;
 
    msg->protocolDiscriminator = data[0];
-
+   OOTRACEDBGB2("   protocolDiscriminator = %d\n", msg->protocolDiscriminator);
    if (data[1] != 2) /* Call reference must be 2 bytes long */
       return Q931_E_INVCALLREF;
 
    msg->callReference = ((data[2] & 0x7f) << 8) | data[3];
+
+   OOTRACEDBGB2("   callReference = %d\n", msg->callReference);
+
    msg->fromDestination = (data[2] & 0x80) != 0;
 
    msg->messageType = data[4];
@@ -133,41 +136,50 @@
       
       /* Extract calling party number TODO:Give respect to presentation and 
          screening indicators ;-) */
-      if(ie->discriminator == Q931CallingPartyNumberIE && 
-         !call->callingPartyNumber)
+      if(ie->discriminator == Q931CallingPartyNumberIE)
       {
+	 OOTRACEDBGB1("   CallingPartyNumber IE = {\n");
          if(ie->length < OO_MAX_NUMBER_LENGTH)
          {
             int numoffset=1; 
             if(!(0x80 & ie->data[0])) numoffset = 2;
             memcpy(number, ie->data+numoffset,ie->length-numoffset);
             number[ie->length-numoffset]='\0';
-            ooCallSetCallingPartyNumber(call, number);
+            OOTRACEDBGB2("      %s\n", number);
+            if(!call->callingPartyNumber)
+               ooCallSetCallingPartyNumber(call, number);
          }else{
             OOTRACEERR3("Error:Calling party number too long. (%s, %s)\n", 
                            call->callType, call->callToken);
          }
+         OOTRACEDBGB1("   }\n");
       }
 
       /* Extract called party number */
-      if(ie->discriminator == Q931CalledPartyNumberIE &&
-         !call->calledPartyNumber)
+      if(ie->discriminator == Q931CalledPartyNumberIE)
       {
+         OOTRACEDBGB1("   CalledPartyNumber IE = {\n");
          if(ie->length < OO_MAX_NUMBER_LENGTH)
          {
             memcpy(number, ie->data+1,ie->length-1);
             number[ie->length-1]='\0';
-            ooCallSetCalledPartyNumber(call, number);
+            OOTRACEDBGB2("      %s\n", number);
+            if(!call->calledPartyNumber)
+               ooCallSetCalledPartyNumber(call, number);
          }else{
             OOTRACEERR3("Error:Calling party number too long. (%s, %s)\n", 
                            call->callType, call->callToken);
          }
+         OOTRACEDBGB1("   }\n");
       }
 
       /* Handle Cause ie */
       if(ie->discriminator == Q931CauseIE)
       {
          msg->causeIE = ie;
+         OOTRACEDBGB1("   Cause IE = {\n");
+         OOTRACEDBGB2("      %s\n", ooGetQ931CauseValueText(ie->data[1]&0x7f));
+         OOTRACEDBGB1("   }\n");
       }
 
       /* TODO: Get rid of ie list.*/
@@ -372,7 +384,7 @@
 
 /* CallReference is a two octet field, thus max value can be 0xffff
    or 65535 decimal. We restrict max value to 32760, however, this should
-   not cause any problems as there won't be those many simultaneous calls
+   not cause any problems as there won't be those many simultaneous calls
    CallRef has to be locally unique and generated by caller.
 */
 ASN1USINT ooGenerateCallReference()
@@ -394,8 +406,12 @@
    else
       lastCallRef++;
 
-   if(lastCallRef>=32760)
-      lastCallRef=0;
+   /* Note callReference can be at the most 15 bits that is from 0 to 32767.
+      if we generate number bigger than that, bring it in range.
+   */
+   if(lastCallRef>=32766)
+      lastCallRef=1;
+
    newCallRef = lastCallRef;
 #ifdef _WIN32
    LeaveCriticalSection(&gCallRefMutex);
@@ -566,7 +582,7 @@
    Q931Message q931Msg;
    int ret;
 
-   initializePrintHandler(&printHandler, "H.2250 Message");
+   initializePrintHandler(&printHandler, "Q931 Message");
 
    /* Set event handler */
    setEventHandler (pctxt, &printHandler);
@@ -778,6 +794,8 @@
       return OO_FAILED;
    }
    
+   q931msg->callReference = call->callReference;
+
    q931msg->userInfo = (H225H323_UserInformation*)memAlloc(pctxt,
                              sizeof(H225H323_UserInformation));
    if(!q931msg->userInfo)
@@ -864,7 +882,9 @@
                   "Alerting message\n");
       return OO_FAILED;
    }
-   
+
+   q931msg->callReference = call->callReference;
+
    q931msg->userInfo = (H225H323_UserInformation*)memAlloc(pctxt,
                              sizeof(H225H323_UserInformation));
    if(!q931msg->userInfo)
@@ -977,6 +997,9 @@
 	  call->callType, call->callToken);
       return OO_FAILED;
    }
+
+   pQ931Msg->callReference = call->callReference;
+
    pQ931Msg->userInfo = (H225H323_UserInformation*)memAlloc(pctxt,
                              sizeof(H225H323_UserInformation));
    if(!pQ931Msg->userInfo)
@@ -1053,6 +1076,9 @@
       }
       return OO_FAILED;
    }
+
+   q931msg->callReference = call->callReference;
+
    q931msg->userInfo = (H225H323_UserInformation*)memAlloc(pctxt,
                              sizeof(H225H323_UserInformation));
    if(!q931msg->userInfo)
@@ -1134,7 +1160,7 @@
    H225VendorIdentifier *vendor;
    Q931Message *q931msg=NULL;
    DListNode *pNode = NULL;
-   H245OpenLogicalChannel *olc = NULL;
+   H245OpenLogicalChannel *olc = NULL, printOlc;
    ooH323EpCapability *epCap = NULL;
    ASN1DynOctStr *pFS=NULL;
    OOCTXT *pctxt = &gH323ep.msgctxt;   
@@ -1148,6 +1174,7 @@
                   "Connect message\n");
       return OO_FAILED;
    }
+   q931msg->callReference = call->callReference;
 
    /* Set bearer capability */
    if(OO_OK != ooSetBearerCapabilityIE(q931msg, Q931CCITTStd, 
@@ -1485,6 +1512,28 @@
             return OO_FAILED;
          }
          pFS[j].data = encodeGetMsgPtr(pctxt, &(pFS[j].numocts));
+
+         /* Dump faststart element in logfile for debugging purpose */
+         setPERBuffer(pctxt,  (char*)pFS[j].data, pFS[j].numocts, 1);
+         initializePrintHandler(&printHandler, "FastStart Element");
+         setEventHandler (pctxt, &printHandler);
+         memset(&printOlc, 0, sizeof(printOlc));
+         ret = asn1PD_H245OpenLogicalChannel(pctxt, &(printOlc));
+         if(ret != ASN_OK)
+         {
+            OOTRACEERR3("Error: Failed decoding FastStart Element (%s, %s)\n", 
+                        call->callType, call->callToken);
+            ooFreeQ931Message(q931msg);
+            if(call->callState < OO_CALL_CLEAR)
+            {
+               call->callEndReason = OO_REASON_LOCAL_CLEARED;
+               call->callState = OO_CALL_CLEAR;
+            }
+            return OO_FAILED;
+         }
+         finishPrint();
+         removeEventHandler(pctxt); 
+
          olc = NULL;
          j++;
          epCap = NULL;
@@ -1507,8 +1556,8 @@
       }
    }
 
-    /* Add h245 listener address. Do not add H245 listener address in case
-       of fast-start. */
+   /* Add h245 listener address. Do not add H245 listener address in case
+      of fast-start. */
    if ((!OO_TESTFLAG(call->flags, OO_M_FASTSTART) || 
         call->remoteFastStartOLCs.count == 0) &&
        !OO_TESTFLAG (call->flags, OO_M_TUNNELING))
@@ -1525,7 +1574,7 @@
                      "(%s, %s)\n", call->callType, call->callToken);
 	return OO_FAILED;
       }
-      ooConvertIpToNwAddr(gH323ep.signallingIP, h245IpAddr->ip.data);
+      ooSocketConvertIpToNwAddr(call->localIP, h245IpAddr->ip.data);
       h245IpAddr->ip.numocts=4;
       h245IpAddr->port = *(call->h245listenport);
       connect->h245Address.u.ipAddress = h245IpAddr;
@@ -1770,7 +1819,7 @@
    ooH323EpCapability *epCap=NULL;
    DListNode *curNode = NULL;
    OOCTXT *pctxt = NULL;
-   H245OpenLogicalChannel *olc;
+   H245OpenLogicalChannel *olc, printOlc;
    ASN1BOOL aligned = 1;
    H225AliasAddress * pAliasAddress=NULL;
    pctxt = &gH323ep.msgctxt;
@@ -1824,17 +1873,22 @@
    setup->protocolIdentifier = gProtocolID;
    
    /* Populate Alias Address.*/
-   setup->m.sourceAddressPresent = TRUE;
-   
-   if(call->ourAliases)
-     ret = ooPopulateAliasList(pctxt, call->ourAliases, &setup->sourceAddress);
-   else
-     ret =  ooPopulateAliasList(pctxt, gH323ep.aliases, &setup->sourceAddress);
-   if(OO_OK != ret)
-   {
-      OOTRACEERR1("Error:Failed to populate alias list in SETUP message\n");
-      memReset(pctxt);
-      return OO_FAILED;
+
+   if(call->ourAliases || gH323ep.aliases)
+   {   
+      setup->m.sourceAddressPresent = TRUE;
+      if(call->ourAliases)
+         ret = ooPopulateAliasList(pctxt, call->ourAliases, 
+                                                       &setup->sourceAddress);
+      else if(gH323ep.aliases)
+         ret =  ooPopulateAliasList(pctxt, gH323ep.aliases, 
+                                                       &setup->sourceAddress);
+      if(OO_OK != ret)
+      {
+         OOTRACEERR1("Error:Failed to populate alias list in SETUP message\n");
+         memReset(pctxt);
+         return OO_FAILED;
+      }
    }
    setup->m.presentationIndicatorPresent = TRUE;
    setup->presentationIndicator.t = 
@@ -1901,7 +1955,7 @@
                  call->callToken);
       return OO_FAILED;
    }
-   ooConvertIpToNwAddr(call->remoteIP, destCallSignalIpAddress->ip.data);
+   ooSocketConvertIpToNwAddr(call->remoteIP, destCallSignalIpAddress->ip.data);
 
    destCallSignalIpAddress->ip.numocts=4;
    destCallSignalIpAddress->port = call->remotePort;
@@ -1920,7 +1974,7 @@
                   "(%s, %s)\n", call->callType, call->callToken);
       return OO_FAILED;
    }
-   ooConvertIpToNwAddr(gH323ep.signallingIP, srcCallSignalIpAddress->ip.data);
+   ooSocketConvertIpToNwAddr(call->localIP, srcCallSignalIpAddress->ip.data);
 
    srcCallSignalIpAddress->ip.numocts=4;
    srcCallSignalIpAddress->port= call->pH225Channel->port;
@@ -2019,6 +2073,30 @@
                return OO_FAILED;
             }
             pFS[i].data = encodeGetMsgPtr(pctxt, &(pFS[i].numocts));
+
+
+            /* Dump faststart element in logfile for debugging purpose */
+            setPERBuffer(pctxt,  (char*)pFS[i].data, pFS[i].numocts, 1);
+            initializePrintHandler(&printHandler, "FastStart Element");
+            setEventHandler (pctxt, &printHandler);
+            memset(&printOlc, 0, sizeof(printOlc));
+            ret = asn1PD_H245OpenLogicalChannel(pctxt, &(printOlc));
+            if(ret != ASN_OK)
+            {
+               OOTRACEERR3("Error: Failed decoding FastStart Element."
+                           "(%s, %s)\n", call->callType, call->callToken);
+               ooFreeQ931Message(q931msg);
+               if(call->callState < OO_CALL_CLEAR)
+               {
+                  call->callEndReason = OO_REASON_LOCAL_CLEARED;
+                  call->callState = OO_CALL_CLEAR;
+               }
+               return OO_FAILED;
+            }
+            finishPrint();
+            removeEventHandler(pctxt); 
+
+
             olc = NULL;
             i++;
             OOTRACEDBGC5("Added RX fs element %d with capability %s(%s, %s)\n",
@@ -2063,6 +2141,29 @@
                return OO_FAILED;
             }
             pFS[i].data = encodeGetMsgPtr(pctxt, &(pFS[i].numocts));
+
+            /* Dump faststart element in logfile for debugging purpose */
+            setPERBuffer(pctxt,  (char*)pFS[i].data, pFS[i].numocts, 1);
+            initializePrintHandler(&printHandler, "FastStart Element");
+            setEventHandler (pctxt, &printHandler);
+            memset(&printOlc, 0, sizeof(printOlc));
+            ret = asn1PD_H245OpenLogicalChannel(pctxt, &(printOlc));
+            if(ret != ASN_OK)
+            {
+               OOTRACEERR3("Error: Failed decoding FastStart Element."
+                           "(%s, %s)\n", call->callType, call->callToken);
+               ooFreeQ931Message(q931msg);
+               if(call->callState < OO_CALL_CLEAR)
+               {
+                  call->callEndReason = OO_REASON_LOCAL_CLEARED;
+                  call->callState = OO_CALL_CLEAR;
+               }
+               return OO_FAILED;
+            }
+            finishPrint();
+            removeEventHandler(pctxt); 
+
+
             olc = NULL;
             i++;
             OOTRACEDBGC5("Added TX fs element %d with capability %s(%s, %s)\n",
@@ -2189,6 +2290,9 @@
           "(%s, %s)\n", call->callType, call->callToken);
       return OO_FAILED;
    }
+
+   pQ931Msg->callReference = call->callReference;
+
    pQ931Msg->userInfo = (H225H323_UserInformation*)memAlloc(pctxt,
                              sizeof(H225H323_UserInformation));
    if(!pQ931Msg->userInfo)
@@ -2241,7 +2345,7 @@
                      "(%s, %s)\n", call->callType, call->callToken);
          return OO_FAILED;
       }
-      ooConvertIpToNwAddr(call->pCallFwdData->ip, 
+      ooSocketConvertIpToNwAddr(call->pCallFwdData->ip, 
                                           fwdCallSignalIpAddress->ip.data);
 
       fwdCallSignalIpAddress->ip.numocts=4;
@@ -2616,6 +2720,9 @@
                   "(%s, %s)\n", call->callType, call->callToken);
       return OO_FAILED;
    }
+
+   pQ931Msg->callReference = call->callReference;
+
    pQ931Msg->userInfo = (H225H323_UserInformation*)memAlloc(pctxt,
                              sizeof(H225H323_UserInformation));
    if(!pQ931Msg->userInfo)

Index: ooq931.h
===================================================================
RCS file: /usr/cvsroot/asterisk-addons/asterisk-ooh323c/ooh323c/src/ooq931.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- ooq931.h	3 Jun 2005 14:54:06 -0000	1.3
+++ ooq931.h	16 Jun 2005 19:41:23 -0000	1.4
@@ -30,11 +30,11 @@
 #endif
 
 #ifndef EXTERN
-#ifdef _WIN32
+#ifdef MAKE_DLL
 #define EXTERN __declspec(dllexport)
 #else
 #define EXTERN
-#endif /* _WIN32 */
+#endif /* MAKE_DLL */
 #endif /* EXTERN */
 
 /** 

Index: ootrace.c
===================================================================
RCS file: /usr/cvsroot/asterisk-addons/asterisk-ooh323c/ooh323c/src/ootrace.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- ootrace.c	3 Jun 2005 14:54:06 -0000	1.2
+++ ootrace.c	16 Jun 2005 19:41:23 -0000	1.3
@@ -176,6 +176,67 @@
    return ooGetText (idx, msgTypeText, OONUMBEROF(msgTypeText));
 }
 
+const char* ooGetQ931CauseValueText(int val)
+{
+   switch(val)
+   {
+      case Q931UnallocatedNumber:   
+         return "Q931UnallocatedNumber";
+      case Q931NoRouteToNetwork:
+         return "Q931NoRouteToNetwork";
+      case Q931NoRouteToDestination:
+         return "Q931NoRouteToDestination";
+      case Q931ChannelUnacceptable: 
+         return "Q931ChannelUnacceptable";
+      case Q931NormalCallClearing:
+         return "Q931NormalCallClearing";
+      case Q931UserBusy:
+         return "Q931UserBusy";
+      case Q931NoResponse:
+         return "Q931NoResponse";
+      case Q931NoAnswer:
+         return "Q931NoAnswer";
+      case Q931SubscriberAbsent:
+         return "Q931SubscriberAbsent";
+      case Q931CallRejected:
+         return "Q931CallRejected";
+      case Q931NumberChanged:
+         return "Q931NumberChanged";
+      case Q931Redirection:
+         return "Q931Redirection";
+      case Q931DestinationOutOfOrder:
+         return "Q931DestinationOutOfOrder";
+      case Q931InvalidNumberFormat:
+         return "Q931InvalidNumberFormat";
+      case Q931NormalUnspecified:
+         return "Q931NormalUnspecified";
+      case Q931StatusEnquiryResponse:
+         return "Q931StatusEnquiryResponse";
+      case Q931NoCircuitChannelAvailable:
+         return "Q931NoCircuitChannelAvailable";
+      case Q931NetworkOutOfOrder:
+         return "Q931NetworkOutOfOrder";
+      case Q931TemporaryFailure:
+         return "Q931TemporaryFailure";
+      case Q931Congestion:
+         return "Q931Congestion";
+      case Q931RequestedCircuitUnAvailable:
+         return "Q931RequestedCircuitUnavailable";
+      case Q931ResourcesUnavailable:
+         return "Q931ResourcesUnavailable";
+      case Q931IncompatibleDestination:
+         return "Q931IncompatibleDestination";
+      case Q931ProtocolErrorUnspecified:
+         return "Q931ProtocolErrorUnspecified";
+      case Q931RecoveryOnTimerExpiry:
+         return "Q931RecoveryOnTimerExpiry";
+      case Q931InvalidCallReference:
+         return "Q931InvaliedCallReference";
+      default:
+         return "Unsupported Cause Type";
+   }
+   return "Unsupported Cause Type";
+}
 
 void ooSetTraceThreshold(OOUINT32 traceLevel)
 {

Index: ootrace.h
===================================================================
RCS file: /usr/cvsroot/asterisk-addons/asterisk-ooh323c/ooh323c/src/ootrace.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- ootrace.h	3 Jun 2005 14:54:06 -0000	1.2
+++ ootrace.h	16 Jun 2005 19:41:23 -0000	1.3
@@ -103,13 +103,14 @@
 #endif
 
 #ifndef EXTERN
-#ifdef _WIN32
+#ifdef MAKE_DLL
 #define EXTERN __declspec(dllexport)
 #else
 #define EXTERN
-#endif /* _WIN32 */
+#endif /* MAKE_DLL */
 #endif /* EXTERN */
 
+
 /**
  * This function is used to retrieve the description text for a reason
  * code.
@@ -146,6 +147,15 @@
 const char* ooGetCapTypeText(int cap);
 
 /**
+ * This function is used to retrieve the text description for a Q931 Cause
+ * value in Cause IE.
+ * @param val     Q931 Cause value
+ * @return        The text description string
+ */
+const char* ooGetQ931CauseValueText(int val);
+
+
+/**
  * This function is used to set the trace level.
  * @param traceLevel  New trace level. Various values are: OOTRCLVLERR, 
  *                    OOTRCLVLWARN, OOTRCLVLINFO, OOTRCLVLDBGA, OOTRCLVLDBGB,

Index: ootypes.h
===================================================================
RCS file: /usr/cvsroot/asterisk-addons/asterisk-ooh323c/ooh323c/src/ootypes.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- ootypes.h	3 Jun 2005 14:54:07 -0000	1.3
+++ ootypes.h	16 Jun 2005 19:41:23 -0000	1.4
@@ -22,7 +22,8 @@
  * H.245 logical channel operations, and Registration, Admission, and Status 
  * (RAS) messaging for Gatekeeper communications.
  *
- * The categories of user functions provided are as follows:<UL>
+ * The categories of user functions provided are as follows:
+ * <UL>
  * <LI>Stack command functions.  These are high level functions used to 
  * initiate common H.323 telephony operations (for example, to make a 
  * call).</LI>
@@ -57,11 +58,11 @@
 #define OOH323C_VERSION "vxx.aa"
 
 #ifndef EXTERN
-#ifdef _WIN32
+#ifdef MAKE_DLL
 #define EXTERN __declspec(dllexport)
 #else
 #define EXTERN
-#endif /* _WIN32 */
+#endif /* MAKE_DLL */
 #endif /* EXTERN */
 
 /** 

Index: rtctype.h
===================================================================
RCS file: /usr/cvsroot/asterisk-addons/asterisk-ooh323c/ooh323c/src/rtctype.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- rtctype.h	23 May 2005 21:03:55 -0000	1.1
+++ rtctype.h	16 Jun 2005 19:41:23 -0000	1.2
@@ -68,11 +68,11 @@
 #endif
 
 #ifndef EXTERN
-#ifdef _WIN32
+#ifdef MAKE_DLL
 #define EXTERN __declspec(dllexport)
 #else
 #define EXTERN
-#endif /* _WIN32 */
+#endif /* MAKE_DLL */
 #endif /* EXTERN */
 /* ctype module table */
 




More information about the svn-commits mailing list