Changeset 3684


Ignore:
Timestamp:
12/19/07 10:34:34 (5 years ago)
Author:
erin_yueh
Message:

gsmd: set and get Voicemail number (Erin Yueh)

Location:
trunk/src/target/gsm
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/target/gsm/include/libgsmd/misc.h

    r3636 r3684  
    3434/* Get Signal Strehngth (Chapter 8.5) */ 
    3535extern int lgsm_signal_quality(struct lgsm_handle *h); 
    36  
    37 /* Set voice mail number */ 
    38 extern int lgsm_voicemail_set(struct lgsm_handle *lh, 
    39                               struct lgsm_addr *addr); 
    40  
    41 /* Get currently configured voice mail number */ 
    42 extern int lgsm_voicemail_get(struct lgsm_handle *lh, 
    43                               struct lgsm_addr *addr); 
    4436 
    4537/* Operator Selection, Network Registration */ 
  • trunk/src/target/gsm/include/libgsmd/sms.h

    r3201 r3684  
    8080                enum ts0705_mem_type mem1, enum ts0705_mem_type mem2, 
    8181                enum ts0705_mem_type mem3); 
     82extern int lgsm_number2addr(struct gsmd_addr *dst, const char *src, 
     83        int skipplus); 
    8284 
    8385/* Retrieve current default service centre address */ 
  • trunk/src/target/gsm/src/gsmd/usock.c

    r3657 r3684  
    521521{ 
    522522        struct gsmd_user *gu = ctx; 
    523         struct gsmd_voicemail *vmail; 
    524         struct gsmd_ucmd *ucmd; 
    525         char *comma; 
    526  
    527         DEBUGP("entering(cmd=%p, gu=%p)\n", cmd, gu); 
    528  
    529         ucmd = ucmd_alloc(sizeof(*vmail)); 
    530         if (!ucmd) 
    531                 return -ENOMEM; 
    532          
    533         /* FIXME: pass error values back somehow */ 
    534         ucmd->hdr.version = GSMD_PROTO_VERSION; 
    535         ucmd->hdr.msg_type = GSMD_MSG_NETWORK; 
    536         ucmd->hdr.len = sizeof(*vmail); 
    537         ucmd->hdr.id = cmd->id; 
     523        struct gsmd_voicemail vmail; 
     524        struct gsm_extrsp *er; 
     525        int rc; 
     526        int ret = cmd->ret; 
     527 
     528        DEBUGP("cmd = '%s', resp: '%s'\n", cmd->buf, resp); 
    538529 
    539530        if (cmd->buf[7] == '=') { 
    540531                /* response to set command */ 
    541                 ucmd->hdr.msg_subtype = GSMD_NETWORK_VMAIL_SET; 
    542                 /* FIXME: */ 
    543                 return 0; 
     532                rc = gsmd_ucmd_submit(gu, GSMD_MSG_NETWORK,  
     533                                GSMD_NETWORK_VMAIL_SET,cmd->id, sizeof(ret), &ret); 
    544534        } else { 
    545535                /* response to get command */ 
    546                 char *tok = strtok(resp, ","); 
    547                 if (!tok) 
    548                         goto out_free_einval; 
    549                 ucmd->hdr.msg_subtype = GSMD_NETWORK_VMAIL_GET; 
    550                 vmail->enable = atoi(tok); 
    551  
    552                 tok = strtok(NULL, ","); 
    553                 if (!tok) 
    554                         goto out_free_einval; 
    555                 strncpy(vmail->addr.number, tok, GSMD_ADDR_MAXLEN); 
    556                 vmail->addr.number[GSMD_ADDR_MAXLEN] = '\0'; 
    557  
    558                 tok = strtok(NULL, ","); 
    559                 if (!tok) 
    560                         goto out_free_einval; 
    561                 vmail->addr.type = atoi(tok); 
    562         } 
    563  
    564         usock_cmd_enqueue(ucmd, gu); 
    565  
    566         return 0; 
    567  
    568 out_free_einval: 
    569         gsmd_log(GSMD_ERROR, "can't understand voicemail response\n"); 
    570         talloc_free(ucmd); 
    571         return -EINVAL; 
     536                if (strncmp(resp, "+CSVM: ", 7)) 
     537                        return -EINVAL; 
     538                resp += 7; 
     539                er = extrsp_parse(gsmd_tallocs, resp); 
     540                if(!er) 
     541                        return -ENOMEM; 
     542                if(er->num_tokens == 3 && 
     543                        er->tokens[0].type == GSMD_ECMD_RTT_NUMERIC && 
     544                        er->tokens[1].type == GSMD_ECMD_RTT_STRING && 
     545                        er->tokens[2].type == GSMD_ECMD_RTT_NUMERIC) { 
     546                                vmail.enable = er->tokens[0].u.numeric; 
     547                                strcpy(vmail.addr.number, er->tokens[1].u.string); 
     548                                vmail.addr.type = er->tokens[2].u.numeric; 
     549                } 
     550                rc = gsmd_ucmd_submit(gu, GSMD_MSG_NETWORK, GSMD_NETWORK_VMAIL_GET, 
     551                        cmd->id, sizeof(vmail), &vmail); 
     552                talloc_free(er); 
     553        } 
     554        return rc; 
    572555} 
    573556 
     
    814797                break; 
    815798        case GSMD_NETWORK_VMAIL_SET: 
    816                 cmd = atcmd_fill("AT+CSVM=", 8+1, &network_vmail_cb, gu, 0, NULL); 
     799                cmdlen = sprintf(buffer, "AT+CSVM=1,\"%s\",%d", 
     800                        vmail->addr.number, vmail->addr.type); 
     801                cmd = atcmd_fill(buffer, cmdlen + 1, &network_vmail_cb, gu, 0, NULL); 
    817802                break; 
    818803        case GSMD_NETWORK_SIGQ_GET: 
  • trunk/src/target/gsm/src/libgsmd/libgsmd_network.c

    r2733 r3684  
    2727#include <libgsmd/libgsmd.h> 
    2828#include <libgsmd/misc.h> 
     29#include <libgsmd/sms.h> 
    2930 
    3031#include <gsmd/usock.h> 
     
    134135        return lgsm_send_simple(lh, GSMD_MSG_NETWORK, GSMD_NETWORK_GET_NUMBER); 
    135136} 
     137 
     138int lgsm_voicemail_set(struct lgsm_handle *lh, const char *number) 
     139{ 
     140        struct gsmd_msg_hdr *gmh; 
     141        struct gsmd_voicemail *vmail; 
     142        int rc; 
     143 
     144        gmh = lgsm_gmh_fill(GSMD_MSG_NETWORK, 
     145                        GSMD_NETWORK_VMAIL_SET, sizeof(*vmail)); 
     146        if (!gmh) 
     147                return -ENOMEM; 
     148 
     149        vmail = (struct gsmd_voicemail *) gmh->data; 
     150        vmail->enable = 1; 
     151        if (lgsm_number2addr(&vmail->addr, number, 0)){ 
     152                lgsm_gmh_free(gmh); 
     153                return -EINVAL; 
     154        } 
     155 
     156        if (lgsm_send(lh, gmh) < gmh->len + sizeof(*gmh)) { 
     157                lgsm_gmh_free(gmh); 
     158                return -EIO; 
     159        } 
     160 
     161        lgsm_gmh_free(gmh); 
     162        return 0; 
     163} 
     164 
     165/* Get currently configured voice mail number */ 
     166int lgsm_voicemail_get(struct lgsm_handle *lh) 
     167{ 
     168        return lgsm_send_simple(lh, GSMD_MSG_NETWORK, GSMD_NETWORK_VMAIL_GET); 
     169} 
  • trunk/src/target/gsm/src/util/shell.c

    r3657 r3684  
    286286        const struct gsmd_own_number *num = (struct gsmd_own_number *) 
    287287                ((void *) gmh + sizeof(*gmh)); 
     288        const struct gsmd_voicemail *vmail = (struct gsmd_voicemail *) 
     289                ((void *) gmh + sizeof(*gmh)); 
     290        int result = *(int *) gmh->data; 
    288291        static const char *oper_stat[] = { 
    289292                [GSMD_OPER_UNKNOWN] = "of unknown status", 
     
    340343                                (num->service == GSMD_SERVICE_UNKNOWN) ? 
    341344                                "" : " services"); 
     345                pending_responses --; 
     346                break; 
     347        case GSMD_NETWORK_VMAIL_SET: 
     348                if (result) 
     349                        printf("Set voicemail error %i\n", result); 
     350                else 
     351                        printf("Set voicemail OK \n"); 
     352                pending_responses --; 
     353                break; 
     354        case GSMD_NETWORK_VMAIL_GET: 
     355                if(vmail->addr.number) 
     356                        printf ("voicemail number is %s \n",vmail->addr.number); 
    342357                pending_responses --; 
    343358                break; 
     
    482497                "\tsc\tSMS Show Service Centre\n" 
    483498                "\tsC\tSMS Set Service Centre (sC=number)\n" 
     499                "\tgvm\tGet Voicemail number\n" 
     500                "\tsvm\tSet Voicemail number(svm=number)\n" 
    484501                "\tim\tGet imsi\n" 
    485502                "\tcs\tGet Call status\n" 
     
    767784                                lgsm_get_subscriber_num(lgsmh); 
    768785                                pending_responses ++; 
     786                        } else if ( !strncmp(buf, "gvm", 3)) { 
     787                                printf("Get Voicemail Number\n"); 
     788                                lgsm_voicemail_get(lgsmh); 
     789                                pending_responses ++; 
     790                        } else if ( !strncmp(buf, "svm", 3)) { 
     791                                printf("Set Voicemail Number\n"); 
     792                                ptr = strchr(buf, '='); 
     793                                if (!ptr || strlen(ptr) < 3) 
     794                                        printf("No.\n"); 
     795                                else 
     796                                        lgsm_voicemail_set(lgsmh, ptr + 1); 
     797                                pending_responses ++; 
    769798                        } else if (!strncmp(buf, "im", 2)) { 
    770799                                printf("Get imsi\n"); 
Note: See TracChangeset for help on using the changeset viewer.