]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
better implement Q931Uie_GenericDigits.
authorMichael Jerris <mike@jerris.com>
Tue, 29 May 2007 02:42:32 +0000 (02:42 +0000)
committerMichael Jerris <mike@jerris.com>
Tue, 29 May 2007 02:42:32 +0000 (02:42 +0000)
git-svn-id: http://svn.openzap.org/svn/openzap/trunk@172 a93c3328-9c30-0410-af19-c9cd2b2d52af

libs/openzap/src/isdn/Q931.c
libs/openzap/src/isdn/Q931ie.c
libs/openzap/src/isdn/include/Q931.h
libs/openzap/src/isdn/include/Q931ie.h

index 29fff862845a28282eba452242d36eeb4579c6ca..533e10c4df26b899978e48019989132d4520c46a 100644 (file)
@@ -710,6 +710,7 @@ static const char *q931_error_names[] = {
        "Q931E_RESTARTIND",                             /* -3027 */
        "Q931E_SEGMENT",                                /* -3028 */
        "Q931E_SIGNAL",                                 /* -3029 */
+       "Q931E_GENERIC_DIGITS"                  /* -3030 */
 
 };
 
index 75531cad82dbb44a575a35cde78bcb0e64ac32b1..c25a8f47dd428f3be87bb813d2e45d2dc2cc8295 100644 (file)
@@ -2998,27 +2998,64 @@ L3INT Q931Uie_GenericDigits(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *pMsg, L3U
 {\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
+    L3INT Off = 0;
+    L3INT Octet = 0;
+    L3INT x;
+    L3INT IESize;
+
+    *pIE=0;
+
+    /* Octet 1 */
+    pie->IEId        = IBuf[Octet];
+    Octet ++;
+
+    /* Octet 2 */
+    IESize = IBuf[Octet ++]; 
+
+    /* Octet 3 */
+    pie->Type = (IBuf[Octet]) & 0x1F;
+    pie->Encoding = (IBuf[Octet] >> 5) & 0x07;
+    Octet ++;
+    
+    /* Octet 4*/
+       if (pie->Type == 0) { /* BCD Even */
+               x = 0;
+               do {
+                       pie->Digit[x++] = IBuf[Octet+Off] & 0x0f;
+                       pie->Digit[x++] = (IBuf[Octet+Off] >> 4) & 0x0f;
+                       Off++;
+               } while (Q931MoreIE());
+       } else if (pie->Type == 1) { /* BCD Odd */
+               x = 0;
+               do {
+                       pie->Digit[x++] = IBuf[Octet+Off] & 0x0f;
+                       if (Q931MoreIE()) {
+                               pie->Digit[x] = (IBuf[Octet+Off] >> 4) & 0x0f;
+                       }
+                       x++;
+                       Off++;
+               } while (Q931MoreIE());
+       } else if (pie->Type == 2) { /* IA5 */
+               x = 0;
+               do {
+                       pie->Digit[x++] = IBuf[Octet+Off] & 0x7f;
+                       Off++;
+               } while (Q931MoreIE());
+       } else {
+               /* Binary encoding type unkown */
+               Q931SetError(pTrunk, Q931E_GENERIC_DIGITS, Octet, Off);
+               return Q931E_GENERIC_DIGITS;
+       }
+
+    Q931IESizeTest(Q931E_GENERIC_DIGITS);
+
+    Q931SetIE(*pIE, *OOff);
+
+    *IOff = (*IOff) + Octet + Off;
+    *OOff = (*OOff) + sizeof(Q931ie_CallingSub) + x -1;
+    pie->Size = (L3UCHAR)(sizeof(Q931ie_CallingSub) + x -1);
+
+    return Q931E_NO_ERROR;
 }\r
 \r
 /*****************************************************************************\r
@@ -3036,7 +3073,7 @@ L3INT Q931Uie_GenericDigits(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *pMsg, L3U
 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
+    OBuf[(*Octet)++] = 0;\r
 \r
     return Q931E_NO_ERROR;\r
 }\r
index 346460a2baa1580074dadab173c11ccf5f7d83fa..87f0bb8d627c1e685fcdd4840d051957a3eba845 100644 (file)
@@ -153,7 +153,8 @@ typedef enum {
        Q931E_PROGIND               =   -3026,
        Q931E_RESTARTIND            =   -3027,
        Q931E_SEGMENT               =   -3028,
-       Q931E_SIGNAL                =   -3029
+       Q931E_SIGNAL                =   -3029,
+       Q931E_GENERIC_DIGITS            =       -3030
 
 } q931_error_t;
 
index c5e4a31534d58bddebf53831a1d5b1abebe028ad..4f498670da95edc3ea0a80e15e17d6b49da15dba 100644 (file)
@@ -1077,6 +1077,9 @@ typedef struct
 {
     L3UCHAR IEId;                   /* 00110111                             */
     L3UCHAR Size;                   /* Length of Information Element        */
+    L3UCHAR Type;                                      /* Type of number                       */
+    L3UCHAR Encoding;                          /* Encoding of number                   */
+    L3UCHAR Digit[1];                          /* Number digits (IA5)                  */
 } Q931ie_GenericDigits;