--- /tmp/gnokii-0.6.0/common/phones/atgen.c 2004-02-22 23:44:27.000000000 +0100 +++ gnokii-0.6.0/common/phones/atgen.c 2004-03-13 10:31:26.000000000 +0100 @@ -238,6 +238,49 @@ return GN_ERR_NOTIMPLEMENTED; } +/* Functions to encode and decode strings */ + +int at_encode(int charset, char *dst, char *src, int len) { + switch (charset) { + case AT_CHAR_GSM: + len = char_ascii_encode(dst, src, len); + break; + case AT_CHAR_HEXGSM: + char_hex_encode(dst, src, len); + len *= 2; + break; + case AT_CHAR_UCS2: + char_ucs2_encode(dst, src, len); + len *= 4; + break; + default: + memcpy(dst, src, len); + break; + } + dst[len] = '\0'; + return len; +} + +void at_decode(int charset, char *dst, char *src, int len) { + switch (charset) { + case AT_CHAR_GSM: + char_ascii_decode(dst, src, len); + break; + case AT_CHAR_HEXGSM: + char_hex_decode(dst, src, len); + len *= 2; + break; + case AT_CHAR_UCS2: + char_ucs2_decode(dst, src, len); + len *= 4; + break; + default: + memcpy(dst, src, len); + break; + } + dst[len] = '\0'; +} + at_recv_function_type at_insert_recv_function(int type, at_recv_function_type func, struct gn_statemachine *state) { at_driver_instance *drvinst = AT_DRVINST(state); @@ -324,12 +367,14 @@ { at_driver_instance *drvinst = AT_DRVINST(state); gn_data data; - char req[32]; + char req[32], memtype[10]; + int len; gn_error ret = GN_ERR_NONE; if (mt != drvinst->memorytype) { - sprintf(req, "AT+CPBS=\"%s\"\r", memorynames[mt]); - ret = sm_message_send(13, GN_OP_Init, req, state); + len = at_encode(drvinst->charset, memtype, memorynames[mt], strlen(memorynames[mt])); + sprintf(req, "AT+CPBS=\"%s\"\r", memtype); + ret = sm_message_send(11 + len, GN_OP_Init, req, state); if (ret) return GN_ERR_NOTREADY; gn_data_clear(&data); @@ -551,7 +596,7 @@ { at_driver_instance *drvinst = AT_DRVINST(state); int len, ofs; - char req[256], *tmp; + char req[256], pnumber[256], *tmp; gn_error ret; ret = at_memory_type_set(data->phonebook_entry->memory_type, state); @@ -563,28 +608,14 @@ ret = state->driver.functions(GN_OP_AT_SetCharset, data, state); if (ret) return ret; + at_encode(drvinst->charset, pnumber, data->phonebook_entry->number, strlen(data->phonebook_entry->number)); ofs = sprintf(req, "AT+CPBW=%d,\"%s\",%s,\"", data->phonebook_entry->location+drvinst->memoryoffset, - data->phonebook_entry->number, + pnumber, data->phonebook_entry->number[0] == '+' ? "145" : "129"); len = strlen(data->phonebook_entry->name); tmp = req + ofs; - switch (drvinst->charset) { - case AT_CHAR_GSM: - len = char_ascii_encode(tmp, data->phonebook_entry->name, len); - break; - case AT_CHAR_HEXGSM: - char_hex_encode(tmp, data->phonebook_entry->name, 2 * len); - len *= 2; - break; - case AT_CHAR_UCS2: - char_ucs2_encode(tmp, data->phonebook_entry->name, len); - len *= 4; - break; - default: - memcpy(tmp, data->phonebook_entry->name, len); - break; - } + len = at_encode(drvinst->charset, tmp, data->phonebook_entry->name, len); tmp[len++] = '"'; tmp[len++] = '\r'; len += ofs; } @@ -907,7 +938,7 @@ endpos = strchr(++pos, '\"'); if (endpos) { *endpos = '\0'; - strcpy(data->phonebook_entry->number, pos); + at_decode(drvinst->charset, data->phonebook_entry->number, pos, strlen(pos)); } /* store name */ @@ -917,22 +948,7 @@ endpos = NULL; if (pos) { pos = strip_quotes(pos+1); - l = strlen(pos); - switch (drvinst->charset) { - case AT_CHAR_GSM: - char_ascii_decode(data->phonebook_entry->name, pos, l); - break; - case AT_CHAR_HEXGSM: - char_hex_decode(data->phonebook_entry->name, pos, l); - break; - case AT_CHAR_UCS2: - char_ucs2_decode(data->phonebook_entry->name, pos, l); - break; - default: - memcpy(data->phonebook_entry->name, pos, l); - *(data->phonebook_entry->name + l) = 0; - break; - } + at_decode(drvinst->charset, data->phonebook_entry->name, pos, strlen(pos)); } } return GN_ERR_NONE; @@ -1406,21 +1422,7 @@ pos = strings[2]; pos++; pos = strtok(pos, "\""); - l = strlen(pos); - switch (drvinst->charset) { - case AT_CHAR_GSM: - char_ascii_decode(tmp, pos, l); - break; - case AT_CHAR_HEXGSM: - char_hex_decode(tmp, pos, l); - break; - case AT_CHAR_UCS2: - char_ucs2_decode(tmp, pos, l); - break; - default: - memcpy(tmp, pos, l); - break; - } + at_decode(drvinst->charset, tmp, pos, strlen(pos)); snprintf(data->network_info->network_code, sizeof(data->network_info->network_code), gn_network_code_get(tmp)); break; case 2: /* network operator code given */