Send commitlog mailing list submissions to
        [email protected]

To subscribe or unsubscribe via the World Wide Web, visit
        http://lists.openmoko.org/mailman/listinfo/commitlog
or, via email, send a message with subject or body 'help' to
        [EMAIL PROTECTED]

You can reach the person managing the list at
        [EMAIL PROTECTED]

When replying, please edit your Subject line so it is more specific
than "Re: Contents of commitlog digest..."
Today's Topics:

   1. r3198 - branches/src/target/kernel/2.6.23.x/patches
      ([EMAIL PROTECTED])
   2. r3199 - trunk/src/target/gsm/src/util ([EMAIL PROTECTED])
   3. r3200 - in trunk/src/target/gsm/src: gsmd util
      ([EMAIL PROTECTED])
   4. r3201 - in trunk/src/target/gsm: include/gsmd include/libgsmd
      src/gsmd src/libgsmd src/util ([EMAIL PROTECTED])
   5. r3202 - in trunk/src/target/gsm: include/gsmd include/libgsmd
      src/gsmd src/libgsmd ([EMAIL PROTECTED])
--- Begin Message ---
Author: shoragan
Date: 2007-10-16 20:03:00 +0200 (Tue, 16 Oct 2007)
New Revision: 3198

Modified:
   branches/src/target/kernel/2.6.23.x/patches/arm-atag-kexec.patch
Log:
Port arm-atag-kexec.patch to 2.6.23

Modified: branches/src/target/kernel/2.6.23.x/patches/arm-atag-kexec.patch
===================================================================
--- branches/src/target/kernel/2.6.23.x/patches/arm-atag-kexec.patch    
2007-10-16 17:54:28 UTC (rev 3197)
+++ branches/src/target/kernel/2.6.23.x/patches/arm-atag-kexec.patch    
2007-10-16 18:03:00 UTC (rev 3198)
@@ -29,9 +29,10 @@
 Signed-off-by: Mike Westerhof <mwester at dls.net>
 ---
 
-diff -uprN linux-2.6.22.5.orig/arch/arm/kernel/relocate_kernel.S 
linux-2.6.22.5/arch/arm/kernel/relocate_kernel.S
---- linux-2.6.22.5.orig/arch/arm/kernel/relocate_kernel.S      2007-08-22 
18:23:54.000000000 -0500
-+++ linux-2.6.22.5/arch/arm/kernel/relocate_kernel.S   2007-08-27 
20:31:32.000000000 -0500
+Index: linux-2.6.23/arch/arm/kernel/relocate_kernel.S
+===================================================================
+--- linux-2.6.23.orig/arch/arm/kernel/relocate_kernel.S
++++ linux-2.6.23/arch/arm/kernel/relocate_kernel.S
 @@ -7,6 +7,23 @@
        .globl relocate_new_kernel
  relocate_new_kernel:
@@ -56,7 +57,7 @@
        ldr     r0,kexec_indirection_page
        ldr     r1,kexec_start_address
  
-@@ -50,7 +67,7 @@ relocate_new_kernel:
+@@ -50,7 +67,7 @@
        mov lr,r1
        mov r0,#0
        ldr r1,kexec_mach_type
@@ -65,7 +66,7 @@
        mov pc,lr
  
        .globl kexec_start_address
-@@ -65,6 +82,16 @@ kexec_indirection_page:
+@@ -65,6 +82,16 @@
  kexec_mach_type:
        .long   0x0
  
@@ -82,18 +83,19 @@
  relocate_new_kernel_end:
  
        .globl relocate_new_kernel_size
-diff -uprN linux-2.6.22.5.orig/arch/arm/kernel/setup.c 
linux-2.6.22.5/arch/arm/kernel/setup.c
---- linux-2.6.22.5.orig/arch/arm/kernel/setup.c        2007-08-22 
18:23:54.000000000 -0500
-+++ linux-2.6.22.5/arch/arm/kernel/setup.c     2007-08-27 20:31:32.000000000 
-0500
-@@ -23,6 +23,7 @@
- #include <linux/cpu.h>
+Index: linux-2.6.23/arch/arm/kernel/setup.c
+===================================================================
+--- linux-2.6.23.orig/arch/arm/kernel/setup.c
++++ linux-2.6.23/arch/arm/kernel/setup.c
+@@ -24,6 +24,7 @@
  #include <linux/interrupt.h>
  #include <linux/smp.h>
+ #include <linux/fs.h>
 +#include <linux/kexec.h>
  
  #include <asm/cpu.h>
  #include <asm/elf.h>
-@@ -767,6 +768,23 @@ static int __init customize_machine(void
+@@ -770,6 +771,23 @@
  }
  arch_initcall(customize_machine);
  
@@ -117,8 +119,8 @@
  void __init setup_arch(char **cmdline_p)
  {
        struct tag *tags = (struct tag *)&init_tags;
-@@ -783,6 +801,13 @@ void __init setup_arch(char **cmdline_p)
-       if (mdesc->boot_params)
+@@ -788,6 +806,13 @@
+       else if (mdesc->boot_params)
                tags = phys_to_virt(mdesc->boot_params);
  
 +#ifdef CONFIG_KEXEC
@@ -131,9 +133,10 @@
        /*
         * If we have the old style parameters, convert them to
         * a tag list.
-diff -uprN linux-2.6.22.5.orig/include/asm-arm/kexec.h 
linux-2.6.22.5/include/asm-arm/kexec.h
---- linux-2.6.22.5.orig/include/asm-arm/kexec.h        2007-08-22 
18:23:54.000000000 -0500
-+++ linux-2.6.22.5/include/asm-arm/kexec.h     2007-08-27 20:31:32.000000000 
-0500
+Index: linux-2.6.23/include/asm-arm/kexec.h
+===================================================================
+--- linux-2.6.23.orig/include/asm-arm/kexec.h
++++ linux-2.6.23/include/asm-arm/kexec.h
 @@ -14,6 +14,8 @@
  
  #define KEXEC_ARCH KEXEC_ARCH_ARM




--- End Message ---
--- Begin Message ---
Author: jserv
Date: 2007-10-17 06:30:24 +0200 (Wed, 17 Oct 2007)
New Revision: 3199

Modified:
   trunk/src/target/gsm/src/util/shell.c
Log:
http://bugzilla.openmoko.org/cgi-bin/bugzilla/show_bug.cgi?id=834               
    

From: Kristian Mueller <[EMAIL PROTECTED]>
Subject: [PATCH] libgsmd-tool does not allow sms with more than one word

libgsmd-tool only allows for command strings without spaces.
SMS messages with more than one word will be parsed as multible commands.
The patch introduces SMS message text in bracket and fixes a NULL pointer
reference on mailformed "ss" commands.


Modified: trunk/src/target/gsm/src/util/shell.c
===================================================================
--- trunk/src/target/gsm/src/util/shell.c       2007-10-16 18:03:00 UTC (rev 
3198)
+++ trunk/src/target/gsm/src/util/shell.c       2007-10-17 04:30:24 UTC (rev 
3199)
@@ -389,7 +389,7 @@
                "\tsd\tSMS Delete (sd=index,delflg)\n"
                "\tsl\tSMS List (sl=stat)\n"
                "\tsr\tSMS Read (sr=index)\n"
-               "\tss\tSMS Send (ss=number,text)\n"
+               "\tss\tSMS Send (ss=number,text|[\"text\"])\n"
                "\tsw\tSMS Write (sw=stat,number,text)\n"
                "\tsm\tSMS Storage stats\n"
                "\tsM\tSMS Set preferred storage (sM=mem1,mem2,mem3)\n"
@@ -612,16 +612,36 @@
                                        
                                lgsm_sms_read(lgsmh, atoi(ptr+1));              
                
                        } else if ( !strncmp(buf, "ss", 2)) {
-                               printf("Send SMS\n");           
                                struct lgsm_sms sms;
 
                                ptr = strchr(buf, '=');
                                fcomma = strchr(buf, ',');
-                               strncpy(sms.addr, ptr+1, fcomma-ptr-1);
-                               sms.addr[fcomma-ptr-1] = '\0';
-                               packing_7bit_character(fcomma+1, &sms);
+                               if (!ptr || !fcomma) {
+                                       printf("Wrong command format\n");
+                               } else {
+                                       strncpy(sms.addr, ptr+1, fcomma-ptr-1);
+                                       sms.addr[fcomma-ptr-1] = '\0';
 
-                               lgsm_sms_send(lgsmh, &sms);
+                                       /* todo define \" to allow " in text */
+                                       if (fcomma[1] == '"' &&
+                                               !strchr(fcomma+2, '"')) {
+                                               /* read until closing '"' */
+                                               rc = fscanf(stdin, "%[^\"]\"",
+                                                       fcomma+strlen(fcomma));
+                                               if (rc == EOF) {
+                                                       printf("EOF\n");
+                                                       return -1;
+                                               }
+                                               /* remove brackets */
+                                               fcomma++;
+                                               fcomma[strlen(fcomma)] = '\0';
+                                       }
+
+                                       printf("Send SMS\n");
+                                       packing_7bit_character(fcomma+1, &sms);
+
+                                       lgsm_sms_send(lgsmh, &sms);
+                               }
                        } else if ( !strncmp(buf, "sw", 2)) {   
                                printf("Write SMS\n");                          
                                struct lgsm_sms_write sms_write;




--- End Message ---
--- Begin Message ---
Author: jserv
Date: 2007-10-17 08:10:26 +0200 (Wed, 17 Oct 2007)
New Revision: 3200

Modified:
   trunk/src/target/gsm/src/gsmd/sms_pdu.c
   trunk/src/target/gsm/src/util/event.c
Log:
SMS status report

From: Erin Yueh <[EMAIL PROTECTED]>
Subject: [PATCH] SMS status report

I made a patch for SMS status report. It can change SMS-Submit messages
and ask for a status report. When  the destination address receives our
message, the service center will send a SMS-STATUS-REPORT to us. We can
tell what messages we sent by TP-MR (message reference number) value and
can know the sending result by TP-ST (Status) value from status report
messages.


Modified: trunk/src/target/gsm/src/gsmd/sms_pdu.c
===================================================================
--- trunk/src/target/gsm/src/gsmd/sms_pdu.c     2007-10-17 04:30:24 UTC (rev 
3199)
+++ trunk/src/target/gsm/src/gsmd/sms_pdu.c     2007-10-17 06:10:26 UTC (rev 
3200)
@@ -139,6 +139,17 @@
                /* Skip TP-PID */
                len -= 9;
                src += 9;
+
+               /* TP-UDL */
+               dst->payload.length = src[0];
+               i = sms_data_bytelen(dst->payload.coding_scheme, src[0]);
+
+               /* TP-UD */
+               if (len < 1 + i || i > GSMD_SMS_DATA_MAXLEN)
+                       return 1;
+               memcpy(dst->payload.data, src + 1, i);
+               dst->payload.data[i] = 0;
+
                break;
        case GSMD_SMS_TP_MTI_SUBMIT:
                if (len < 4)
@@ -179,24 +190,45 @@
                src += vpf ? 3 : 2;
 
                memset(dst->time_stamp, 0, 7);
+
+               /* TP-UDL */
+               dst->payload.length = src[0];
+               i = sms_data_bytelen(dst->payload.coding_scheme, src[0]);
+
+               /* TP-UD */
+               if (len < 1 + i || i > GSMD_SMS_DATA_MAXLEN)
+                       return 1;
+               memcpy(dst->payload.data, src + 1, i);
+               dst->payload.data[i] = 0;
                break;
        case GSMD_SMS_TP_MTI_STATUS_REPORT:
-               /* TODO */
+               if (len < 3)
+                       return 1;
+
+               /* TP-MR set it gsmd_sms_list.index*/
+               dst->index = (int) src[1];
+               /* TP-STATUS set it to coding_scheme */
+               dst->payload.coding_scheme = (int) src[len-1];
+               /* TP-RA */
+               i = sms_number_bytelen(src[3], src[2]);
+               if (len < 13 + i)
+                       return 1;
+               if (sms_address2ascii(&dst->addr, src + 2))
+                       return 1;
+               len -= 4 + i;
+               src += 4 + i;
+               /* TP-SCTS */
+               memcpy(dst->time_stamp, src, 7);
+               /* TP-UD  */
+               dst->payload.length = 0;
+               dst->payload.data[0] = 0;
+               break;
        default:
                /* Unknown PDU type */
                return 1;
        }
 
-       /* TP-UDL */
-       dst->payload.length = src[0];
-       i = sms_data_bytelen(dst->payload.coding_scheme, src[0]);
 
-       /* TP-UD */
-       if (len < 1 + i || i > GSMD_SMS_DATA_MAXLEN)
-               return 1;
-       memcpy(dst->payload.data, src + 1, i);
-       dst->payload.data[i] = 0;
-
        return 0;
 }
 
@@ -215,7 +247,7 @@
                GSMD_SMS_TP_MTI_SUBMIT |
                (0 << 2) |              /* Reject Duplicates: 0 */
                GSMD_SMS_TP_VPF_NOT_PRESENT |
-               GSMD_SMS_TP_SRR_NOT_REQUEST |
+               GSMD_SMS_TP_SRR_STATUS_REQUEST |
                (src->payload.has_header ? GSMD_SMS_TP_UDHI_WITH_HEADER :
                 GSMD_SMS_TP_UDHI_NO_HEADER) |
                GSMD_SMS_TP_RP_NOT_SET;

Modified: trunk/src/target/gsm/src/util/event.c
===================================================================
--- trunk/src/target/gsm/src/util/event.c       2007-10-17 04:30:24 UTC (rev 
3199)
+++ trunk/src/target/gsm/src/util/event.c       2007-10-17 06:10:26 UTC (rev 
3200)
@@ -128,8 +128,12 @@
 static int inds_handler(struct lgsm_handle *lh, int evt,
                struct gsmd_evt_auxdata *aux)
 {
-       if (aux->u.ds.inlined)
+       if (aux->u.ds.inlined) {
+               struct gsmd_sms_list *sms;
+               sms = (struct gsmd_sms_list *) aux->data;
                printf("EVENT: Incoming Status Report\n");
+               printf("message ref = %d, status = %d\n", 
sms->index,sms->payload.coding_scheme);
+       }
        else
                printf("EVENT: Incoming Status Report stored at location %i\n",
                                aux->u.ds.index);




--- End Message ---
--- Begin Message ---
Author: jserv
Date: 2007-10-17 08:14:20 +0200 (Wed, 17 Oct 2007)
New Revision: 3201

Modified:
   trunk/src/target/gsm/include/gsmd/usock.h
   trunk/src/target/gsm/include/libgsmd/sms.h
   trunk/src/target/gsm/src/gsmd/sms_pdu.c
   trunk/src/target/gsm/src/libgsmd/libgsmd_sms.c
   trunk/src/target/gsm/src/util/shell.c
Log:
Added 'Ask Status report' option in shell.

From: Andrzej Zaborowski <[EMAIL PROTECTED]>

I also moved the .ask_ds field from struct gsmd_sms into struct
gsmd_sms_submit because it seemed more logical being a property
of SMS-SUBMIT PDU.


Modified: trunk/src/target/gsm/include/gsmd/usock.h
===================================================================
--- trunk/src/target/gsm/include/gsmd/usock.h   2007-10-17 06:10:26 UTC (rev 
3200)
+++ trunk/src/target/gsm/include/gsmd/usock.h   2007-10-17 06:14:20 UTC (rev 
3201)
@@ -330,6 +330,7 @@
 struct gsmd_sms_submit {
        struct gsmd_addr addr;
        struct gsmd_sms payload;
+       int ask_ds;
 };
 
 /* Refer to GSM 07.05 subclause 4.4 */

Modified: trunk/src/target/gsm/include/libgsmd/sms.h
===================================================================
--- trunk/src/target/gsm/include/libgsmd/sms.h  2007-10-17 06:10:26 UTC (rev 
3200)
+++ trunk/src/target/gsm/include/libgsmd/sms.h  2007-10-17 06:14:20 UTC (rev 
3201)
@@ -46,6 +46,7 @@
        enum gsmd_sms_alphabet alpha;
        u_int8_t data[LGSM_SMS_DATA_MAXLEN+1];
        int length;
+       int ask_ds;
 };
 
 /* GSM 03.40 subclause 9.2.2.2 and GSM 07.05 subclause 4.4 and subclause 3.1 */

Modified: trunk/src/target/gsm/src/gsmd/sms_pdu.c
===================================================================
--- trunk/src/target/gsm/src/gsmd/sms_pdu.c     2007-10-17 06:10:26 UTC (rev 
3200)
+++ trunk/src/target/gsm/src/gsmd/sms_pdu.c     2007-10-17 06:14:20 UTC (rev 
3201)
@@ -247,7 +247,8 @@
                GSMD_SMS_TP_MTI_SUBMIT |
                (0 << 2) |              /* Reject Duplicates: 0 */
                GSMD_SMS_TP_VPF_NOT_PRESENT |
-               GSMD_SMS_TP_SRR_STATUS_REQUEST |
+               (src->ask_ds ? GSMD_SMS_TP_SRR_STATUS_REQUEST :
+                GSMD_SMS_TP_SRR_NOT_REQUEST) |
                (src->payload.has_header ? GSMD_SMS_TP_UDHI_WITH_HEADER :
                 GSMD_SMS_TP_UDHI_NO_HEADER) |
                GSMD_SMS_TP_RP_NOT_SET;

Modified: trunk/src/target/gsm/src/libgsmd/libgsmd_sms.c
===================================================================
--- trunk/src/target/gsm/src/libgsmd/libgsmd_sms.c      2007-10-17 06:10:26 UTC 
(rev 3200)
+++ trunk/src/target/gsm/src/libgsmd/libgsmd_sms.c      2007-10-17 06:14:20 UTC 
(rev 3201)
@@ -126,6 +126,7 @@
        if (lgsm_number2addr(&gss->addr, sms->addr, 1))
                return -EINVAL;
 
+       gss->ask_ds = sms->ask_ds;
        gss->payload.has_header = 0;
        gss->payload.length = sms->length;
        gss->payload.coding_scheme = sms->alpha;
@@ -161,6 +162,7 @@
        if (lgsm_number2addr(&gsw->sms.addr, sms_write->sms.addr, 1))
                return -EINVAL;
 
+       gsw->sms.ask_ds = sms_write->sms.ask_ds;
        gsw->sms.payload.has_header = 0;
        gsw->sms.payload.length = sms_write->sms.length;
        gsw->sms.payload.coding_scheme = sms_write->sms.alpha;

Modified: trunk/src/target/gsm/src/util/shell.c
===================================================================
--- trunk/src/target/gsm/src/util/shell.c       2007-10-17 06:10:26 UTC (rev 
3200)
+++ trunk/src/target/gsm/src/util/shell.c       2007-10-17 06:14:20 UTC (rev 
3201)
@@ -389,7 +389,7 @@
                "\tsd\tSMS Delete (sd=index,delflg)\n"
                "\tsl\tSMS List (sl=stat)\n"
                "\tsr\tSMS Read (sr=index)\n"
-               "\tss\tSMS Send (ss=number,text|[\"text\"])\n"
+               "\tss\tSMS Send (ss=ask_ds,number,text|[\"text\"])\n"
                "\tsw\tSMS Write (sw=stat,number,text)\n"
                "\tsm\tSMS Storage stats\n"
                "\tsM\tSMS Set preferred storage (sM=mem1,mem2,mem3)\n"
@@ -615,33 +615,29 @@
                                struct lgsm_sms sms;
 
                                ptr = strchr(buf, '=');
+                               sms.ask_ds = atoi(ptr+1);
                                fcomma = strchr(buf, ',');
-                               if (!ptr || !fcomma) {
-                                       printf("Wrong command format\n");
-                               } else {
-                                       strncpy(sms.addr, ptr+1, fcomma-ptr-1);
-                                       sms.addr[fcomma-ptr-1] = '\0';
-
-                                       /* todo define \" to allow " in text */
-                                       if (fcomma[1] == '"' &&
-                                               !strchr(fcomma+2, '"')) {
+                               lcomma = strchr(fcomma+1, ',');
+                               strncpy(sms.addr, fcomma+1, lcomma-fcomma-1);
+                               sms.addr[lcomma-fcomma-1] = '\0';
+                               /* todo define \" to allow " in text */
+                               if (lcomma[1]=='"' &&
+                                               !strchr(lcomma+2, '"')) {
                                                /* read until closing '"' */
                                                rc = fscanf(stdin, "%[^\"]\"",
-                                                       fcomma+strlen(fcomma));
+                                                       lcomma+strlen(lcomma));
                                                if (rc == EOF) {
                                                        printf("EOF\n");
                                                        return -1;
                                                }
                                                /* remove brackets */
-                                               fcomma++;
-                                               fcomma[strlen(fcomma)] = '\0';
-                                       }
-
-                                       printf("Send SMS\n");
-                                       packing_7bit_character(fcomma+1, &sms);
-
-                                       lgsm_sms_send(lgsmh, &sms);
+                                               lcomma++;
+                                               lcomma[strlen(lcomma)] = '\0';
                                }
+                               printf("Send SMS\n");
+                               packing_7bit_character(lcomma+1, &sms);
+
+                               lgsm_sms_send(lgsmh, &sms);
                        } else if ( !strncmp(buf, "sw", 2)) {   
                                printf("Write SMS\n");                          
                                struct lgsm_sms_write sms_write;
@@ -655,6 +651,7 @@
                                sms_write.sms.addr[lcomma-fcomma-1] = '\0';
                                packing_7bit_character(
                                                lcomma+1, &sms_write.sms);
+                               sms_write.sms.ask_ds = 0;
 
                                lgsm_sms_write(lgsmh, &sms_write);
                        } else if (!strncmp(buf, "sm", 2)) {




--- End Message ---
--- Begin Message ---
Author: jserv
Date: 2007-10-17 08:18:34 +0200 (Wed, 17 Oct 2007)
New Revision: 3202

Modified:
   trunk/src/target/gsm/include/gsmd/gsmd.h
   trunk/src/target/gsm/include/gsmd/usock.h
   trunk/src/target/gsm/include/libgsmd/phonebook.h
   trunk/src/target/gsm/src/gsmd/usock.c
   trunk/src/target/gsm/src/libgsmd/libgsmd_phonebook.c
Log:
Improvement for find and read phonebooks in gsmd.

From: Sean Chiang <[EMAIL PROTECTED]>
Subject: [PATCH] Improvement for find and read phonebooks in gsmd

This patch is an improvement for find and read phonebooks.
After clients make a request to find / read phonebooks, then clients
should make a request to retrieve all the records.


Modified: trunk/src/target/gsm/include/gsmd/gsmd.h
===================================================================
--- trunk/src/target/gsm/include/gsmd/gsmd.h    2007-10-17 06:14:20 UTC (rev 
3201)
+++ trunk/src/target/gsm/include/gsmd/gsmd.h    2007-10-17 06:18:34 UTC (rev 
3202)
@@ -92,6 +92,9 @@
        struct gsmd *gsmd;
        struct gsmd_fd gfd;                             /* the socket */
        u_int32_t subscriptions;                /* bitmaks of subscribed event 
groups */
+
+       struct llist_head pb_readrg_list;       /* our READRG phonebook list */
+       struct llist_head pb_find_list;         /* our FIND phonebook list */
 };
 
 #define GSMD_DEBUG     1       /* debugging information */

Modified: trunk/src/target/gsm/include/gsmd/usock.h
===================================================================
--- trunk/src/target/gsm/include/gsmd/usock.h   2007-10-17 06:14:20 UTC (rev 
3201)
+++ trunk/src/target/gsm/include/gsmd/usock.h   2007-10-17 06:18:34 UTC (rev 
3202)
@@ -194,6 +194,8 @@
        GSMD_PHONEBOOK_GET_SUPPORT      = 6,
        GSMD_PHONEBOOK_LIST_STORAGE     = 7,
        GSMD_PHONEBOOK_SET_STORAGE      = 8,
+       GSMD_PHONEBOOK_RETRIEVE_READRG  = 9,
+       GSMD_PHONEBOOK_RETRIEVE_FIND    = 10,
 };
 
 /* Type-of-Address, Numbering-Plan-Identification field, GSM 03.40, 9.1.2.5 */
@@ -432,7 +434,6 @@
        char text[GSMD_PB_TEXT_MAXLEN+1];
 } __attribute__ ((packed));
 
-
 /* Refer to GSM 07.07 subclause 8.13 */
 /* FIXME: the tlength depends on SIM, use +CPBR=? to get */ 
 struct gsmd_phonebook_find {   
@@ -472,8 +473,18 @@
        char opname_longalpha[16];
 };
 
+/* Refer to GSM 07.07 subclause 8.11 */
+struct gsmd_phonebook_mem {
+       u_int8_t type[3];
+       u_int8_t pad;
+       u_int16_t used;
+       u_int16_t total;
+} __attribute__ ((packed));
+
 struct gsmd_phonebook_storage {
-       char storage[3];
+       /* FIXME the amount of phonebook storage should be dynamic */
+       u_int8_t num;
+       struct gsmd_phonebook_mem mem[20];
 } __attribute__ ((packed));
 
 /* Subscriber number information from 3GPP TS 07.07, Clause 7.1 */
@@ -518,6 +529,11 @@
        char buf[];
 } __attribute__ ((packed));
 
+struct gsmd_phonebooks {
+       struct llist_head list;
+       struct gsmd_phonebook pb;
+} __attribute__ ((packed));
+
 extern struct gsmd_ucmd *ucmd_alloc(int extra_size);
 extern int usock_init(struct gsmd *g);
 extern void usock_cmd_enqueue(struct gsmd_ucmd *ucmd, struct gsmd_user *gu);

Modified: trunk/src/target/gsm/include/libgsmd/phonebook.h
===================================================================
--- trunk/src/target/gsm/include/libgsmd/phonebook.h    2007-10-17 06:14:20 UTC 
(rev 3201)
+++ trunk/src/target/gsm/include/libgsmd/phonebook.h    2007-10-17 06:18:34 UTC 
(rev 3202)
@@ -106,4 +106,10 @@
 /* Get the location range/nlength/tlength supported */
 extern int lgsm_pb_get_support(struct lgsm_handle *lh);
 
+/* Retrieve the records of READRG request */
+extern int lgsm_pb_retrieve_readrg(struct lgsm_handle *lh, int num);
+
+/* Retrieve the records of FIND request */
+extern int lgsm_pb_retrieve_find(struct lgsm_handle *lh, int num);
+
 #endif

Modified: trunk/src/target/gsm/src/gsmd/usock.c
===================================================================
--- trunk/src/target/gsm/src/gsmd/usock.c       2007-10-17 06:14:20 UTC (rev 
3201)
+++ trunk/src/target/gsm/src/gsmd/usock.c       2007-10-17 06:18:34 UTC (rev 
3202)
@@ -41,7 +41,7 @@
 #include <gsmd/ts0707.h>
 #include <gsmd/sms.h>
 
-static void *__ucmd_ctx, *__gu_ctx;
+static void *__ucmd_ctx, *__gu_ctx, *__pb_ctx;
 
 struct gsmd_ucmd *ucmd_alloc(int extra_size)
 {
@@ -1035,21 +1035,56 @@
 
 static int phonebook_find_cb(struct gsmd_atcmd *cmd, void *ctx, char *resp)
 {
-       struct gsmd_user *gu = ctx;     
-       struct gsmd_ucmd *ucmd;                 
-       
+       struct gsmd_user *gu = ctx;
+       struct gsmd_ucmd *ucmd;
+       struct gsmd_phonebooks *gps;
+       char *fcomma, *lcomma, *ptr1, *ptr2 = NULL;
+       int *num;
+
        DEBUGP("resp: %s\n", resp);
 
-       /* FIXME: using link list, also we need to handle the case of
-        * no query result */
-       ucmd = gsmd_ucmd_fill(strlen(resp) + 1, GSMD_MSG_PHONEBOOK,
+       /*
+        * [+CPBF: <index1>,<number>,<type>,<text>[[...]
+        * <CR><LF>+CPBF: <index2>,<unmber>,<type>,<text>]]
+        */
+       ucmd = gsmd_ucmd_fill(sizeof(int), GSMD_MSG_PHONEBOOK,
                              GSMD_PHONEBOOK_FIND, 0);
        if (!ucmd)
                return -ENOMEM; 
 
-       strcpy(ucmd->buf, resp);
+       num = (int*) ucmd->buf;
 
+       *num = 0;
+
+       ptr1 = strtok(resp, "\n");
+
+       while (ptr1) {
+               gps = talloc(__pb_ctx, struct gsmd_phonebooks);
+               ptr2 = strchr(ptr1, ' ');
+               gps->pb.index = atoi(ptr2+1);
+
+               fcomma = strchr(ptr1, '"');
+               lcomma = strchr(fcomma+1, '"');
+               strncpy(gps->pb.numb, fcomma + 1, (lcomma-fcomma-1));
+               gps->pb.numb[(lcomma - fcomma) - 1] = '\0';
+
+               gps->pb.type = atoi(lcomma + 2);
+
+               ptr2 = strrchr(ptr1, ',');
+               fcomma = ptr2 + 1;
+               lcomma = strchr(fcomma + 1, '"');
+               strncpy(gps->pb.text, fcomma + 1, (lcomma - fcomma - 1));
+               gps->pb.text[(lcomma - fcomma) - 1] = '\0';
+
+               llist_add_tail(&gps->list, &gu->pb_find_list);
+
+               (*num)++;
+
+               ptr1 = strtok(NULL, "\n");
+       }
+
        usock_cmd_enqueue(ucmd, gu);
+       talloc_free(__pb_ctx);
        return 0;
 }
 
@@ -1102,25 +1137,54 @@
 {
        struct gsmd_user *gu = ctx;
        struct gsmd_ucmd *ucmd;
+       struct gsmd_phonebooks *gps;
+       char *fcomma, *lcomma, *ptr1, *ptr2 = NULL;
+       int *num;
 
        DEBUGP("resp: %s\n", resp);
 
        /*
-        * +CPBR: 4,"1234",129,"6C5F745E7965"
-        * +CPBR: 5,"5678",129,"800062115BB6"
-        * +CPBR: 6,"7890",129,"810280AA591A"
-        * +CPBR: 8,"36874",129,"005300650061006E"
-        *
+        * [+CPBR: <index1>,<number>,<type>,<text>[[...]
+        * <CR><LF>+CPBR: <index2>,<unmber>,<type>,<text>]]
         */
-       ucmd = gsmd_ucmd_fill(strlen(resp)+1, GSMD_MSG_PHONEBOOK,
+       ucmd = gsmd_ucmd_fill(sizeof(int), GSMD_MSG_PHONEBOOK,
                              GSMD_PHONEBOOK_READRG, 0);
        if (!ucmd)
                return -ENOMEM; 
 
-       strcpy(ucmd->buf, resp);
+       num = (int*) ucmd->buf;
 
+       *num = 0;
+
+       ptr1 = strtok(resp, "\n");
+
+       while (ptr1) {
+               gps = talloc(__pb_ctx, struct gsmd_phonebooks);
+               ptr2 = strchr(ptr1, ' ');
+               gps->pb.index = atoi(ptr2+1);
+
+               fcomma = strchr(ptr1, '"');
+               lcomma = strchr(fcomma+1, '"');
+               strncpy(gps->pb.numb, fcomma + 1, (lcomma-fcomma-1));
+               gps->pb.numb[(lcomma - fcomma) - 1] = '\0';
+
+               gps->pb.type = atoi(lcomma + 2);
+
+               ptr2 = strrchr(ptr1, ',');
+               fcomma = ptr2 + 1;
+               lcomma = strchr(fcomma + 1, '"');
+               strncpy(gps->pb.text, fcomma + 1, (lcomma - fcomma - 1));
+               gps->pb.text[(lcomma - fcomma) - 1] = '\0';
+
+               llist_add_tail(&gps->list, &gu->pb_readrg_list);
+
+               (*num)++;
+
+               ptr1 = strtok(NULL, "\n");
+       }
+
        usock_cmd_enqueue(ucmd, gu);
-
+       talloc_free(__pb_ctx);
        return 0;
 }
 
@@ -1209,23 +1273,39 @@
 static int phonebook_list_storage_cb(struct gsmd_atcmd *cmd,
                void *ctx, char *resp)
 {
-       /* +CPBS: ("EN","BD","FD","DC","LD","RC","LR","MT","AD",
-        *         "SM","SD","MC","LM","AF","ON","UD") */
        /* TODO; using link list ; need to handle command error */
        struct gsmd_user *gu = ctx;
        struct gsmd_ucmd *ucmd;
+       struct gsmd_phonebook_storage *gps;
+       char *ptr;
 
        DEBUGP("resp: %s\n", resp);
 
-       ucmd = gsmd_ucmd_fill(strlen(resp) + 1,
+       /*
+        * +CPBS: (<storage>s)
+        */
+
+       ucmd = gsmd_ucmd_fill(sizeof(*gps),
                        GSMD_MSG_PHONEBOOK,
                        GSMD_PHONEBOOK_LIST_STORAGE, 0);
 
         if (!ucmd)
                return -ENOMEM;
 
-       strcpy(ucmd->buf, resp);
+       gps = (struct gsmd_phonebook_storage *) ucmd->buf;
+       gps->num = 0;
 
+       if (!strncmp(resp, "+CPBS", 5)) {
+               char* delim = "(,";
+               ptr = strpbrk(resp, delim);
+               while ( ptr ) {
+                       strncpy(gps->mem[gps->num].type, ptr+2, 2);
+                       gps->mem[gps->num].type[2] = '\0';
+                       ptr = strpbrk(ptr+2, delim);
+                       gps->num++;
+               }
+       }
+
        usock_cmd_enqueue(ucmd, gu);
 
        return 0;
@@ -1235,11 +1315,13 @@
                struct gsmd_msg_hdr *gph,int len)
 {      
        struct gsmd_atcmd *cmd = NULL;
+       struct gsmd_ucmd *ucmd = NULL;
        struct gsmd_phonebook_readrg *gpr;
        struct gsmd_phonebook *gp;
        struct gsmd_phonebook_find *gpf;
-       int *index;
-       int atcmd_len;
+       struct gsmd_phonebooks *cur, *cur2;
+       int *index, *num;
+       int atcmd_len, i;
        char *storage;
        char buf[1024];
 
@@ -1343,6 +1425,66 @@
                cmd = atcmd_fill("AT+CPBR=?", 9+1,
                                 &phonebook_get_support_cb, gu, gph->id);
                break;
+       case GSMD_PHONEBOOK_RETRIEVE_READRG:
+               if (len < sizeof(*gph) + sizeof(int))
+                       return -EINVAL;
+
+               num = (int *) ((void *)gph + sizeof(*gph));
+
+               ucmd = gsmd_ucmd_fill(sizeof(struct gsmd_phonebook)*(*num),
+                               GSMD_MSG_PHONEBOOK,
+                               GSMD_PHONEBOOK_RETRIEVE_READRG, 0);
+               if (!ucmd)
+                       return -ENOMEM;
+
+               gp = (struct gsmd_phonebook*) ucmd->buf;
+
+               if (!llist_empty(&gu->pb_readrg_list)) {
+
+                       llist_for_each_entry_safe(cur, cur2,
+                                       &gu->pb_readrg_list, list) {
+                               gp->index = cur->pb.index;
+                               strcpy(gp->numb, cur->pb.numb);
+                               gp->type = cur->pb.type;
+                               strcpy(gp->text, cur->pb.text);
+                               gp++;
+
+                               llist_del(&cur->list);
+                               free(cur);
+                       }
+               }
+
+               usock_cmd_enqueue(ucmd, gu);
+
+               break;
+       case GSMD_PHONEBOOK_RETRIEVE_FIND:
+               if (len < sizeof(*gph) + sizeof(int))
+                       return -EINVAL;
+
+               num = (int *) ((void *)gph + sizeof(*gph));
+
+               ucmd = gsmd_ucmd_fill(sizeof(struct gsmd_phonebook)*(*num), 
GSMD_MSG_PHONEBOOK,
+                                     GSMD_PHONEBOOK_RETRIEVE_FIND, 0);
+               if (!ucmd)
+                       return -ENOMEM;
+
+               gp = (struct gsmd_phonebook*) ucmd->buf;
+
+               if (!llist_empty(&gu->pb_find_list)) {
+                       llist_for_each_entry_safe(cur, cur2, &gu->pb_find_list, 
list) {
+                               gp->index = cur->pb.index;
+                               strcpy(gp->numb, cur->pb.numb);
+                               gp->type = cur->pb.type;
+                               strcpy(gp->text, cur->pb.text);
+                               gp++;
+
+                               llist_del(&cur->list);
+                               free(cur);
+                       }
+               }
+
+               usock_cmd_enqueue(ucmd, gu);
+               break;
        default:
                return -EINVAL;
        }       
@@ -1468,6 +1610,8 @@
                newuser->gsmd = g;
                newuser->subscriptions = 0xffffffff;
                INIT_LLIST_HEAD(&newuser->finished_ucmds);
+               INIT_LLIST_HEAD(&newuser->pb_readrg_list);
+               INIT_LLIST_HEAD(&newuser->pb_find_list);
 
                llist_add(&newuser->list, &g->users);
                gsmd_register_fd(&newuser->gfd);

Modified: trunk/src/target/gsm/src/libgsmd/libgsmd_phonebook.c
===================================================================
--- trunk/src/target/gsm/src/libgsmd/libgsmd_phonebook.c        2007-10-17 
06:14:20 UTC (rev 3201)
+++ trunk/src/target/gsm/src/libgsmd/libgsmd_phonebook.c        2007-10-17 
06:18:34 UTC (rev 3202)
@@ -33,7 +33,7 @@
        gmh->data[2] = '\0';
 
        rc = lgsm_send(lh, gmh);
-       if (rc < gmh->len + 3) {
+       if (rc < gmh->len + sizeof(*gmh)) {
                lgsm_gmh_free(gmh);
                return -EIO;
        }
@@ -177,3 +177,49 @@
 {
        return lgsm_send_simple(lh, GSMD_MSG_PHONEBOOK, 
GSMD_PHONEBOOK_GET_SUPPORT);
 }
+
+int lgsm_pb_retrieve_readrg(struct lgsm_handle *lh, int num)
+{
+       struct gsmd_msg_hdr *gmh;
+       int rc;
+
+       gmh = lgsm_gmh_fill(GSMD_MSG_PHONEBOOK,
+                       GSMD_PHONEBOOK_RETRIEVE_READRG, sizeof(int));
+       if (!gmh)
+               return -ENOMEM;
+
+       *(int *)(gmh->data) = num;
+
+       rc = lgsm_send(lh, gmh);
+       if (rc < gmh->len + sizeof(*gmh)) {
+               lgsm_gmh_free(gmh);
+               return -EIO;
+       }
+
+       lgsm_gmh_free(gmh);
+
+       return 0;
+}
+
+int lgsm_pb_retrieve_find(struct lgsm_handle *lh, int num)
+{
+       struct gsmd_msg_hdr *gmh;
+       int rc;
+
+       gmh = lgsm_gmh_fill(GSMD_MSG_PHONEBOOK,
+                       GSMD_PHONEBOOK_RETRIEVE_FIND, sizeof(int));
+       if (!gmh)
+               return -ENOMEM;
+
+       *(int *)(gmh->data) = num;
+
+       rc = lgsm_send(lh, gmh);
+       if (rc < gmh->len + sizeof(*gmh)) {
+               lgsm_gmh_free(gmh);
+               return -EIO;
+       }
+
+       lgsm_gmh_free(gmh);
+
+       return 0;
+}




--- End Message ---
_______________________________________________
commitlog mailing list
[email protected]
http://lists.openmoko.org/mailman/listinfo/commitlog

Reply via email to