tsk_buffer_t* tmsrp_data_out_get(tmsrp_data_out_t* self) { tsk_buffer_t* ret = tsk_null; tsk_size_t toread; if(!self){ return tsk_null; } if(!(toread = self->size > TMSRP_MAX_CHUNK_SIZE ? TMSRP_MAX_CHUNK_SIZE : self->size)){ return tsk_null; } if(self->message){ ret = tsk_buffer_create(TSK_BUFFER_DATA(self->message), toread); tsk_buffer_remove(self->message, 0, toread); self->size = self->message->size; } else if(self->file){ // Buffer hack tsk_size_t read; ret = tsk_buffer_create_null(); ret->data = tsk_calloc(toread, sizeof(uint8_t)); ret->size = toread; if((read = fread(ret->data, sizeof(uint8_t), toread, self->file)) == toread){ self->size -= toread; } else{ TSK_OBJECT_SAFE_FREE(ret); } } return ret; }
/**@ingroup tsk_buffer_group * Appends new data to the buffer. * @param self The buffer to append to. The buffer should be created using @ref tsk_buffer_create or @ref tsk_buffer_create_null. * @param format A string with embedded tag to be substituted. * @param ... List of parameters. * @retval Zero if succeed and non-zero error code otherwise. * @sa @ref tsk_buffer_append. * * @code * tsk_buffer_t* buffer = tsk_buffer_create_null(); * tsk_buffer_append_2(buffer, "str1=%s, c1=%c and val1=%x", "str1", 'c', 0x2554); * printf(TSK_BUFFER_TO_STRING(buffer)); * TSK_OBJECT_SAFE_FREE(buffer); * @endcode */ int tsk_buffer_append_2(tsk_buffer_t* self, const char* format, ...) { /* * I suppose that sizeof(char) = 1-byte */ int len = 0; va_list ap; char *buffer; tsk_size_t oldsize; va_list ap2; if(!self){ return -1; } oldsize = self->size; buffer = (char*)TSK_BUFFER_DATA(self); /* initialize variable arguments (needed for 64bit platforms where vsnprintf will change the va_list) */ va_start(ap, format); va_start(ap2, format); /* compute destination len for windows mobile */ #if defined(_WIN32_WCE) { int n; len = (tsk_strlen(format)*2); buffer = (char*)tsk_realloc(buffer, (oldsize+len)); for(;;){ if( (n = vsnprintf((char*)(buffer + oldsize), len, format, ap)) >= 0 && (n<=len) ){ len = n; break; } else{ len += 10; buffer = (char*)tsk_realloc(buffer, (oldsize+len)); } } } #else len = vsnprintf(tsk_null, 0, format, ap); buffer = (char*)tsk_realloc(buffer, oldsize+len+1); vsnprintf((buffer + oldsize), len #if !defined(_MSC_VER) || defined(__GNUC__) +1 #endif , format, ap2); #endif /* reset variable arguments */ va_end(ap); va_end(ap2); self->data = buffer; self->size = (oldsize+len); return 0; }
char* tsdp_header_tostring(const tsdp_header_t *self) { tsk_buffer_t* output = tsk_buffer_create_null(); char* str = tsk_null; if(!(tsdp_header_serialize(self, output))) { str = tsk_strndup(TSK_BUFFER_DATA(output), TSK_BUFFER_SIZE(output)); } TSK_OBJECT_SAFE_FREE(output); return str; }
/** internal function used to serialize a SMS-DELIVER message. */ int _tsms_tpdu_deliver_serialize(const tsms_tpdu_deliver_t* self, tsk_buffer_t* output) { uint8_t _1byte; if(!self){ return -1; } /* SMSC address */ #if TSMS_TPDU_APPEND_SMSC tsms_address_serialize(self->smsc, output); #endif /* SMS-DELIVER first Octect: - TP-Message-Type-Indicator(2b) - TP-More-Messages-to-Send(1b) - TP-Loop-Prevention(1b) - TP-Reply-Path(1b) - TP-User-Data-Header-Indicator(1b) - TP-Status-Report-Indication(1b) +----+----+----+----+----+----+----+----+ | RP|UDHI|SRI | |LP |MMS | MTI | +----+----+----+----+----+----+----+----+ */ _1byte = (TSMS_TPDU_MESSAGE(self)->mti & 0xF3); /*2b*/ _1byte |= ((uint8_t)self->mms) << 2 /*1b*/ | ((uint8_t)self->lp) << 3 /*1b*/ /*1b (unused)*/ | ((uint8_t)self->sri) << 5 /*1b*/ | ((uint8_t)self->udhi) << 6 /*1b*/ | ((uint8_t)self->rp) << 7; /*1b*/ tsk_buffer_append(output, &_1byte, 1); /* 3GPP TS 23.040 ==> TP-Originating-Address (TP-OA)*/ tsms_address_serialize(self->oa, output); /* 3GPP TS 23.040 ==> 9.2.3.9 TP-Protocol-Identifier (TP-PID)*/ tsk_buffer_append(output, &TSMS_TPDU_MESSAGE(self)->pid, 1); /*1o*/ /* 3GPP TS 23.040 ==> 9.2.3.10 TP-Data-Coding-Scheme (TP-DCS)*/ tsk_buffer_append(output, &TSMS_TPDU_MESSAGE(self)->dcs, 1); /*1o*/ /* 3GPP TS 23.040 ==> TP-Service-Centre-Time-Stamp (TP-SCTS)*/ tsk_buffer_append(output, self->scts, sizeof(self->scts)); /*7o*/ /* 3GPP TS 23.040 ==> 9.2.3.16 TP-User-Data-Length (TP-UDL) */ tsk_buffer_append(output, &TSMS_TPDU_MESSAGE(self)->udl, 1); /*1o*/ /* 3GPP TS 23.040 ==> 9.2.3.24 TP-User Data (TP-UD) */ tsk_buffer_append(output, TSK_BUFFER_DATA(TSMS_TPDU_MESSAGE(self)->ud), TSK_BUFFER_SIZE(TSMS_TPDU_MESSAGE(self)->ud)); return 0; }
tmsrp_message_t* tmsrp_data_in_get(tmsrp_data_in_t* self) { tmsrp_message_t* ret; tsk_size_t msg_size; if(!self || !self->buffer || !TSK_BUFFER_DATA(self->buffer) || !TSK_BUFFER_SIZE(self->buffer)){ //...this is not an error return tsk_null; } if((ret = tmsrp_message_parse_2(self->buffer->data, self->buffer->size, &msg_size))){ tsk_buffer_remove(self->buffer, 0, msg_size); return ret; } return tsk_null; }