int CardDevice::at_response_creg(char* str, size_t len) { int d; char* lac; char* ci; m_commandQueue.append(new ATCommand("AT+COPS?", CMD_AT_COPS)); if(at_parse_creg(str, len, &d, &m_gsm_reg_status, &lac, &ci)) { Debug(DebugAll, "[%s] Error parsing CREG: '%.*s'", c_str(), (int) len, str); return 0; } if(d) m_gsm_registered = 1; else m_gsm_registered = 0; if(lac) m_location_area_code = lac; if(ci) m_cell_id = ci; return 0; }
#include <stdio.h> #include <string.h> #include <stdlib.h> #include "at_parse.h" /* at_parse_*() */ #include "mutils.h" /* ITEMS_OF() */ int ok = 0; int faults = 0; int test_strcmp(const char *pa, const char *pb) { int retval; if (pa == NULL) pa = ""; if (pb == NULL) pb = ""; retval = strcmp(pa,pb); if (retval != 0) { int x = 0; while (pa[x] == pb[x] && pa[x] != 0) { x++; } printf("String '%s' and '%s' differs at " "offset %d '%c' != '%c'\n", pa, pb, x, pa[x], pb[x]); } return (retval); } #/* */ void test_parse_cnum() { static const struct test_case { const char * input; const char * result; } cases[] = { { "+CNUM: \"*Subscriber Number\",\"+79139131234\",145", "+79139131234" }, { "+CNUM: \"Subscriber Number\",\"\",145", "" }, { "+CNUM: \"Subscriber Number\",,145", "" }, { "+CNUM: \"\",\"+79139131234\",145", "+79139131234" }, { "+CNUM: ,\"\",145", "" }, { "+CNUM: ,,145", "" }, { "+CNUM: \"\",+79139131234\",145", "+79139131234" }, { "+CNUM: \"\",+79139131234,145", "+79139131234" }, }; unsigned idx = 0; char * input; const char * res; const char * msg; for(; idx < ITEMS_OF(cases); ++idx) { input = strdup(cases[idx].input); fprintf(stderr, "%s(\"%s\")...", "at_parse_cnum", input); res = at_parse_cnum(input); if(test_strcmp(res, cases[idx].result) == 0) { msg = "OK"; ok++; } else { msg = "FAIL"; faults++; } fprintf(stderr, " = \"%s\"\t%s\n", res, msg); free(input); } fprintf(stderr, "\n"); } #/* */ void test_parse_cops() { static const struct test_case { const char * input; const char * result; } cases[] = { { "+COPS: 0,0,\"TELE2\",0", "TELE2" }, { "+COPS: 0,0,\"TELE2,0", "TELE2" }, { "+COPS: 0,0,TELE2,0", "TELE2" }, }; unsigned idx = 0; char * input; const char * res; const char * msg; for(; idx < ITEMS_OF(cases); ++idx) { input = strdup(cases[idx].input); fprintf(stderr, "%s(\"%s\")...", "at_parse_cops", input); res = at_parse_cops(input); if(test_strcmp(res, cases[idx].result) == 0) { msg = "OK"; ok++; } else { msg = "FAIL"; faults++; } fprintf(stderr, " = \"%s\"\t%s\n", res, msg); free(input); } fprintf(stderr, "\n"); } #/* */ void test_parse_creg() { struct result { int res; int gsm_reg; int gsm_reg_status; char * lac; char * ci; }; static const struct test_case { const char * input; struct result result; } cases[] = { { "+CREG: 2,1,9110,7E6", { 0, 1, 1, "9110", "7E6"} }, { "+CREG: 2,1,XXXX,AAAA", { 0, 1, 1, "XXXX", "AAAA"} }, }; unsigned idx = 0; char * input; struct result result; const char * msg; for(; idx < ITEMS_OF(cases); ++idx) { input = strdup(cases[idx].input); fprintf(stderr, "%s(\"%s\")...", "at_parse_creg", input); result.res = at_parse_creg(input, strlen(input), &result.gsm_reg, &result.gsm_reg_status, &result.lac, &result.ci); if(result.res == cases[idx].result.res && result.gsm_reg == cases[idx].result.gsm_reg && result.gsm_reg_status == cases[idx].result.gsm_reg_status && test_strcmp(result.lac, cases[idx].result.lac) == 0 && test_strcmp(result.ci, cases[idx].result.ci) == 0 ) { msg = "OK"; ok++; } else { msg = "FAIL"; faults++; } fprintf(stderr, " = %d (%d,%d,\"%s\",\"%s\")\t%s\n", result.res, result.gsm_reg, result.gsm_reg_status, result.lac, result.ci, msg); free(input); } fprintf(stderr, "\n"); }
static inline int at_response_creg (pvt_t* pvt, char* str, size_t len) { int d; char* lac; char* ci; if (at_send_cops (pvt) || at_fifo_queue_add (pvt, CMD_AT_COPS, RES_OK)) { ast_log (LOG_ERROR, "[%s] Error sending query for provider name\n", pvt->id); } if (at_parse_creg (pvt, str, len, &d, &pvt->gsm_reg_status, &lac, &ci)) { ast_verb (1, "[%s] Error parsing CREG: '%.*s'\n", pvt->id, (int) len, str); return 0; } if (d) { pvt->gsm_registered = 1; } else { pvt->gsm_registered = 0; } if (lac) { ast_string_field_set (pvt, location_area_code, lac); } if (ci) { ast_string_field_set (pvt, cell_id, ci); } return 0; }