110 if (nul == -1 && (
octstr_len(os) - *pos) > 1) {
136 pdu = gw_malloc(
sizeof(*pdu));
140 #define NONTERMINATED(name) p->name = NULL; 141 #define COMATERMINATED(name) p->name = NULL; 142 #define PDU(name, id, fields) \ 144 struct name *p = &pdu->u.name; \ 145 pdu->type_name = #name; \ 146 pdu->needs_hyphen = (id < SMASI_HYPHEN_ID ? 1 : 0); \ 151 warning(0,
"Unknown SMASI_PDU type, internal error.");
166 #define NONTERMINATED(name) octstr_destroy(p->name); 167 #define COMATERMINATED(name) octstr_destroy(p->name); 168 #define PDU(name, id, fields) \ 169 case id: { struct name *p = &pdu->u.name; fields } break; 172 error(0,
"Unknown SMASI_PDU type, internal error while destroying.");
189 #define NONTERMINATED(name) p = *(&p); 190 #define COMATERMINATED(name) p = *(&p); 191 #define PDU(name, id, fields) \ 192 case id: { struct name *p = &pdu->u.name; fields } break; 195 error(0,
"Unknown SMASI_PDU type, internal error while packing.");
199 #define NONTERMINATED(name) p = *(&p); 200 #define COMATERMINATED(name) \ 201 if (p->name != NULL) { octstr_append_cstr(os, #name); \ 202 octstr_append_char(os, '='); \ 203 octstr_append(os, p->name); \ 204 octstr_append_char(os, ','); } 205 #define PDU(name, id, fields) \ 206 case id: { struct name *p = &pdu->u.name; fields } break; 209 error(0,
"Unknown SMASI_PDU type, internal error while packing.");
229 unsigned long type = 0;
235 if (strcmp(type_name,
"dummy") == 0)
type = 0;
236 #define NONTERMINATED(name) p = *(&p); 237 #define COMATERMINATED(name) p = *(&p); 238 #define PDU(name, id, fields) \ 239 else if (strcmp(type_name, #name) == 0) type = id; 241 else warning(0,
"unknown SMASI PDU type");
244 if (pdu == NULL)
return NULL;
250 #define NONTERMINATED(name) p = *(&p); 251 #define COMATERMINATED(name) \ 252 if (octstr_str_compare(field_name, #name) == 0 && field_value != NULL) \ 253 p->name = octstr_duplicate(field_value); 254 #define PDU(name, id, fields) \ 256 Octstr * field_name = NULL; \ 257 Octstr * field_value = NULL; \ 258 struct name *p = &pdu->u.name; \ 259 while (pos < octstr_len(data_without_len)) { \ 260 field_name = copy_until_assign(data_without_len, &pos); \ 261 if (field_name == NULL) break; \ 262 field_value = copy_until_coma(data_without_len, &pos); \ 263 if (field_value == NULL) continue; \ 265 octstr_destroy(field_name); \ 266 octstr_destroy(field_value); \ 271 warning(0,
"Unknown SMASI_PDU type, internal error while unpacking.");
282 debug(
"sms.smasi", 0,
"SMASI PDU %p dump:", (
void *) pdu);
283 debug(
"sms.smasi", 0,
" type_name: %s", pdu->type_name);
285 #define NONTERMINATED(name) p = *(&p); 286 #define COMATERMINATED(name) \ 287 octstr_dump_short(p->name, 2, #name); 288 #define PDU(name, id, fields) \ 289 case id: { struct name *p = &pdu->u.name; fields } break; 292 warning(0,
"Unknown SMASI_PDU type, internal error.");
295 debug(
"sms.smasi", 0,
"SMASI PDU dump ends.");
void smasi_pdu_dump(SMASI_PDU *pdu)
Octstr * conn_read_line(Connection *conn)
void error(int err, const char *fmt,...)
unsigned int needs_hyphen
static Octstr * decode_type(Octstr *os)
static Octstr * copy_until_coma(Octstr *os, long *pos)
void octstr_append_char(Octstr *ostr, int ch)
void octstr_append_cstr(Octstr *ostr, const char *cstr)
SMASI_PDU * smasi_pdu_create(unsigned long type)
#define octstr_get_cstr(ostr)
#define octstr_copy(ostr, from, len)
long octstr_search_char(const Octstr *ostr, int ch, long pos)
Octstr * smasi_pdu_pack(SMASI_PDU *pdu)
void octstr_insert(Octstr *ostr1, const Octstr *ostr2, long pos)
SMASI_PDU * smasi_pdu_unpack(Octstr *data_without_len)
static void skip_until_after_colon(Octstr *os, long *pos)
Octstr * smasi_pdu_read(Connection *conn)
void warning(int err, const char *fmt,...)
void octstr_destroy(Octstr *ostr)
#define octstr_create(cstr)
static Octstr * copy_until_assign(Octstr *os, long *pos)
long octstr_len(const Octstr *ostr)
void debug(const char *place, int err, const char *fmt,...)
void smasi_pdu_destroy(SMASI_PDU *pdu)