Andrea/Oded/All

Patch attached to add CMTI support to the AT2 driver. You'll need to add a 
new definition to your configuration file specifying that the init string 
for the phones you want to use this is AT+CNMI=1,1,0,0,0 rather than 
1,2,0,0,0 and then define your smsc.

Here's the excerpts from my config file

group=smsc
smsc=at2
smsc-id=Motorola1
modemtype=motorola_p7389i
device=/dev/com1

...

group = modems
id = motorola_p7389i
name = "Motorola P7389i"
detect-string = "960"
speed = 57600
init-string = "AT+CNMI=1,1,0,0,0"
need-sleep = true

I'm running this here (ran out of Wavecom's!) and it is fine however I 
would appreciate people testing it and giving me feedback.

Cheers

Alex

-- 
Alex Judd
http://www.skywire.co.uk
Index: smsc_at2.c
===================================================================
RCS file: /home/cvs/gateway/gw/smsc_at2.c,v
retrieving revision 1.35
diff -u -r1.35 smsc_at2.c
--- smsc_at2.c  17 Mar 2002 16:03:37 -0000      1.35
+++ smsc_at2.c  30 Apr 2002 14:49:24 -0000
@@ -257,6 +257,7 @@
     int count;
     fd_set read_fd;
     struct timeval tv;
+    int wait = 30;
  
     if(privdata->fd == -1)
     {
@@ -279,6 +280,7 @@
     if (ret == -1) {
        if (! (errno == EINTR || errno == EAGAIN))
            error(errno, "AT2[%s]: error on select",octstr_get_cstr(privdata->name));
+            gwthread_sleep(wait);
        return;
     }
 
@@ -654,6 +656,7 @@
     time_t cur_time;
     Msg        *msg;
     int len;
+    char *buf, *buf2 = NULL;
  
     time(&end_time);
     if(timeout == 0)
@@ -743,6 +746,48 @@
                 }
                continue;
           }
+           if (-1 != octstr_search(line, octstr_imm("+CMTI:"), 0))
+          {
+                buf = gw_malloc(5);
+                buf2 = gw_malloc(20);
+
+                octstr_get_many_chars(buf, line, octstr_len(line) - 3, 3); /* work 
+out which message to read */
+                buf[3] = '\0';
+                sprintf(buf2, "%s%s", "AT+CMGR=", buf);
+                at2_write_line(privdata, buf2);                            /* display 
+message contents */
+                line = at2_wait_line(privdata,1,0);                        /* read 
+header */
+                line2 = at2_wait_line(privdata,1,0);                       /* read 
+PDU */
+
+                if(line2 == NULL)
+                {
+                    error(0,"AT2[%s]: got +CMTI but waiting for next line timed out", 
+octstr_get_cstr(privdata->name));
+                }
+                else
+                { 
+                    octstr_append_cstr(line,"\n");
+                    octstr_append(line,line2);
+                    at2_pdu_extract(privdata, &pdu, line);
+
+                    if(pdu == NULL)
+                    {
+                        error(0,"AT2[%s]: got +CMTI but pdu_extract failed", 
+octstr_get_cstr(privdata->name));
+                    }
+                    else
+                    {
+                        msg = at2_pdu_decode(pdu, privdata);
+                        if(msg != NULL)
+                        {
+                           msg->sms.smsc_id = octstr_duplicate(privdata->conn->id);
+                           bb_smscconn_receive(privdata->conn, msg);
+                        }
+                        sprintf(buf2, "%s%s", "AT+CMGD=", buf);             /* delete 
+SMS */
+                        at2_write_line(privdata, buf2);
+                        line = at2_wait_line(privdata,1,0);                 /* read 
+response */
+                    } 
+               }
+               gw_free(buf);
+               gw_free(buf2);
+           }
  
            if (-1 != octstr_search(line, octstr_imm("ERROR"), 0))
            {
@@ -1130,30 +1175,31 @@
     Octstr *buffer;
     long len = 0;
     int pos = 0;
-    int tmp;
+    int tmp = 0;
 
     buffer = octstr_duplicate(line);
-    /* find the beginning of a message from the modem*/ 
-    pos = octstr_search(buffer, octstr_imm("+CMT:"), 0);
-    if(pos == -1) 
-       goto nomsg;
-    pos += 5;
-
-    tmp = octstr_search(buffer, octstr_imm(","), pos);
-    if(! privdata->modem->broken && tmp == -1)
-       goto nomsg;
-    if(tmp != -1)
-       pos=tmp + 1;
-
-    /* The message length is after the comma */
-    pos = octstr_parse_long(&len, buffer, pos, 10);
-    if(pos == -1)
-       goto nomsg;
+
+    if(octstr_search(buffer, octstr_imm("+CMT:"),0) || octstr_search(buffer, 
+octstr_imm("+CMGR:"),0))
+    {
+        /* find the length of the message */
+        while (tmp > -1) {
+            pos = tmp;
+            tmp =  octstr_search(buffer, octstr_imm(","), pos + 1);
+        }
+        if(! privdata->modem->broken && pos == -1)
+           goto nomsg;
+        pos = octstr_parse_long(&len, buffer, pos+1, 10);
+        if (pos < 0)
+            goto nomsg;
+
+    } else {
+        goto nomsg;
+    }
 
     /* skip the spaces and line return */
     while( isspace(octstr_get_char(buffer, pos)))
-       pos++;
-    
+        pos++;
+
     /* skip the SMSC address on some modem types */
     if(! privdata->modem->no_smsc)
     {

Reply via email to