]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
Start of support for codesets and shift operation in messages.
authorMichael Jerris <mike@jerris.com>
Mon, 28 May 2007 22:48:13 +0000 (22:48 +0000)
committerMichael Jerris <mike@jerris.com>
Mon, 28 May 2007 22:48:13 +0000 (22:48 +0000)
git-svn-id: http://svn.openzap.org/svn/openzap/trunk@170 a93c3328-9c30-0410-af19-c9cd2b2d52af

libs/freetdm/src/isdn/Q931.c
libs/freetdm/src/isdn/Q931ie.c
libs/freetdm/src/isdn/include/Q931.h
libs/freetdm/src/isdn/include/Q931ie.h
libs/freetdm/src/isdn/nationalmes.c

index d522db0cc4a464d0050da0868db605047861ea4e..29fff862845a28282eba452242d36eeb4579c6ca 100644 (file)
@@ -334,6 +334,9 @@ L3INT Q931Rx23(Q931_TrunkInfo_t *pTrunk, L3UCHAR * buf, L3INT Size)
     /* Message Type */
     m->MesType = Mes[IOff++];
 
+    /* Starting Codeset */
+       m->codeset = Q931_CODESET_0;
+
     /* Call table proc to unpack codec message */
        RetCode = Q931Umes[pTrunk->Dialect][m->MesType](pTrunk, Mes, (Q931mes_Generic *)pTrunk->L3Buf, Q931L4HeaderSpace + IOff , Size - Q931L4HeaderSpace - IOff + 1);
 
index 87069633c3749e43aaa36a35f8f5cdd32d950c99..75531cad82dbb44a575a35cde78bcb0e64ac32b1 100644 (file)
@@ -2977,3 +2977,66 @@ L3INT Q931Pie_UserUser(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L
     return rc;
 }
 
+/*****************************************************************************\r
+\r
+  Function:     Q931Uie_GenericDigits\r
+\r
+  Parameters:   pIE[OUT]        ptr to Information Element id.\r
+                IBuf[IN]        ptr to a packed ie.\r
+                OBuf[OUT]       ptr to buffer for Unpacked ie.\r
+                IOff[IN\OUT]    Input buffer offset\r
+                OOff[IN\OUT]    Output buffer offset\r
+\r
+\r
+                Ibuf and OBuf points directly to buffers. The IOff and OOff\r
+                must be updated, but are otherwise not used in the ie unpack.\r
+\r
+  Return Value: Error Message\r
+\r
+*****************************************************************************/\r
+L3INT Q931Uie_GenericDigits(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *pMsg, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff)\r
+{\r
+    Q931ie_GenericDigits * pie = (Q931ie_GenericDigits*)OBuf;\r
+       ie *pIE = &pMsg->GenericDigits;\r
+    L3INT Off = 0;\r
+    L3INT Octet = 0;\r
+    L3INT x=0;\r
+    L3INT IESize;\r
+\r
+    *pIE=0;\r
+\r
+    /* Octet 1 */\r
+    pie->IEId        = IBuf[Octet++];\r
+\r
+    /* Octet 2 */\r
+    IESize = IBuf[Octet++]; \r
+\r
+    Q931SetIE(*pIE, *OOff);\r
+\r
+       *IOff = (*IOff) + Octet + Off;\r
+    *OOff = (*OOff) + sizeof(Q931ie_GenericDigits) + x -1;\r
+    \r
+       pie->Size = (L3UCHAR)(sizeof(Q931ie_GenericDigits) + x -1);\r
+\r
+    return Q931E_NO_ERROR;\r
+}\r
+\r
+/*****************************************************************************\r
+\r
+  Function:     Q931Pie_GenericDigits\r
+\r
+  Parameters:   IBuf[IN]        Ptr to struct.\r
+                OBuf[OUT]        Ptr tp packed output buffer.\r
+                Octet[IN/OUT]    Offset into OBuf.\r
+\r
+  Return Value:    Error code, 0 = OK\r
+\r
+*****************************************************************************/\r
+\r
+L3INT Q931Pie_GenericDigits(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet)\r
+{\r
+       OBuf[(*Octet)++] = (Q931ie_GENERIC_DIGITS & 0xFF);\r
+    OBuf[(*Octet)++] = 2;\r
+\r
+    return Q931E_NO_ERROR;\r
+}\r
index 6c580d8bb6383c3f24c9353b875a2eef1999d935..346460a2baa1580074dadab173c11ccf5f7d83fa 100644 (file)
@@ -420,6 +420,7 @@ typedef struct
        ie                              Switchhook;
        ie                              FeatAct;
        ie                              FeatInd;
+       ie                              GenericDigits;
 
        L3UCHAR                 buf[1];                 /* Buffer for IE's                                              */
 
index 27e292d1f96fbe0d7560a4b42e46e8859b97ddba..76633e1882f71a1b6bb2147518dd036f998ab5bb 100644 (file)
@@ -96,7 +96,9 @@ typedef enum {
 #define Q931ie_USER_USER                        0x7e /* 0111 1110       */
 #define Q931ie_ESCAPE_FOR_EX                    0x7f /* 0111 1111       */
 
-#define Q931ie_GENERIC_DIGITS               0x37 /* 0011 0111       */
+/* Variable Length Codeset 6 Information Elements */
+
+#define Q931ie_GENERIC_DIGITS  Q931_CODESET_6 | 0x37 /* 0011 0111       */
 
 
 
index b256a318d67fc8361e4c14236a873aa163c7de73..a0b4f195bdd7dcaadd889f1c4a678f9e54e226ad 100644 (file)
@@ -56,10 +56,22 @@ L3INT nationalUmes_Setup(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generi
        L3INT ir=0;
        L3INT OOff=0;
        L3INT rc=Q931E_NO_ERROR;
+       L3UINT last_codeset = mes->codeset;
+       L3UCHAR shift_lock = 1;
 
        while(IOff < Size)
        {
-               switch(IBuf[IOff])
+               if (!shift_lock) {
+                       mes->codeset = last_codeset;
+               }
+
+               if ((IBuf[IOff] & 0xF0) == Q931ie_SHIFT ) {
+                       mes->codeset = ((IBuf[IOff] & 0x07) << 8);
+                       shift_lock = (IBuf[IOff] & 0x08);
+                       IOff++;
+               }
+
+               switch(mes->codeset | IBuf[IOff])
                {
                case Q931ie_SENDING_COMPLETE:
                case Q931ie_BEARER_CAPABILITY:
@@ -93,10 +105,6 @@ L3INT nationalUmes_Setup(Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, Q931mes_Generi
                        /* TODO: Implement this ie */
                        IOff = IOff + 4;
                        break;
-               case Q931ie_SHIFT:
-                       /* TODO: Implement this ie */
-                       IOff++;
-                       break;
                default:
                        return Q931E_ILLEGAL_IE;
                        break;