Update IAX2 parser for sending caller info
authorMark Spencer <markster@digium.com>
Wed, 1 Oct 2003 22:59:06 +0000 (22:59 +0000)
committerMark Spencer <markster@digium.com>
Wed, 1 Oct 2003 22:59:06 +0000 (22:59 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@1599 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_iax2.c
channels/iax2-parser.c
channels/iax2-parser.h
channels/iax2.h

index 4de1bbf..fa63524 100755 (executable)
@@ -1577,6 +1577,22 @@ static int auto_congest(void *nothing)
        return 0;
 }
 
+static unsigned int iax2_datetime(void)
+{
+       time_t t;
+       struct tm tm;
+       unsigned int tmp;
+       time(&t);
+       localtime_r(&t, &tm);
+       tmp  = (tm.tm_sec >> 1) & 0x1f;   /* 5 bits of seconds */
+       tmp |= (tm.tm_min & 0x3f) << 5;   /* 6 bits of minutes */
+       tmp |= (tm.tm_hour & 0x1f) << 11;   /* 5 bits of hours */
+       tmp |= (tm.tm_mday & 0x1f) << 16; /* 5 bits of day of month */
+       tmp |= ((tm.tm_mon + 1) & 0xf) << 21; /* 4 bits of month */
+       tmp |= ((tm.tm_year - 100) & 0x7f) << 25; /* 7 bits of year */
+       return tmp;
+}
+
 static int iax2_call(struct ast_channel *c, char *dest, int timeout)
 {
        struct sockaddr_in sin;
@@ -1697,6 +1713,7 @@ static int iax2_call(struct ast_channel *c, char *dest, int timeout)
        iax_ie_append_int(&ied, IAX_IE_FORMAT, c->nativeformats);
        iax_ie_append_int(&ied, IAX_IE_CAPABILITY, p->capability);
        iax_ie_append_short(&ied, IAX_IE_ADSICPE, c->adsicpe);
+       iax_ie_append_int(&ied, IAX_IE_DATETIME, iax2_datetime());
        /* Transmit the string in a "NEW" request */
 #if 0
        /* XXX We have no equivalent XXX */
index 4d9244b..5b78a50 100755 (executable)
@@ -119,6 +119,7 @@ static struct iax2_ie {
        { IAX_IE_RDNIS, "REFERRING DNIS", dump_string },
        { IAX_IE_PROVISIONING, "PROVISIONING" },
        { IAX_IE_AESPROVISIONING, "AES PROVISIONING" },
+       { IAX_IE_DATETIME, "DATE TIME", dump_int },
 };
 
 const char *iax_ie2str(int ie)
@@ -499,6 +500,13 @@ int iax_parse_ies(struct iax_ies *ies, unsigned char *data, int datalen)
                        } else
                                ies->transferid = ntohl(*((unsigned int *)(data + 2)));
                        break;
+               case IAX_IE_DATETIME:
+                       if (len != sizeof(unsigned int)) {
+                               snprintf(tmp, sizeof(tmp), "Expecting date/time to be %d bytes long but was %d\n", sizeof(unsigned int), len);
+                               errorf(tmp);
+                       } else
+                               ies->datetime = ntohl(*((unsigned int *)(data + 2)));
+                       break;
                default:
                        snprintf(tmp, sizeof(tmp), "Ignoring unknown information element '%s' (%d) of length %d\n", iax_ie2str(ie), ie, len);
                        errorf(tmp);
index 9f20a18..0e74df3 100755 (executable)
@@ -43,6 +43,7 @@ struct iax_ies {
        int autoanswer;
        int musiconhold;
        unsigned int transferid;
+       unsigned int datetime;
 };
 
 #define DIRECTION_INGRESS 1
index 36b127b..c9cf280 100755 (executable)
 #define IAX_IE_RDNIS                           28              /* Referring DNIS -- string */
 #define IAX_IE_PROVISIONING                    29              /* Provisioning info */
 #define IAX_IE_AESPROVISIONING                 30              /* AES Provisioning info */
+#define IAX_IE_DATETIME                                31              /* Date/Time */
 
 #define IAX_AUTH_PLAINTEXT                     (1 << 0)
 #define IAX_AUTH_MD5                           (1 << 1)