138 lines
3.9 KiB
C++
138 lines
3.9 KiB
C++
struct chunkpack {
|
|
unsigned char chunktype;
|
|
unsigned int cs_id;
|
|
unsigned int timestamp;
|
|
unsigned int len;
|
|
unsigned int real_len;
|
|
unsigned int len_left;
|
|
unsigned char msg_type_id;
|
|
unsigned int msg_stream_id;
|
|
unsigned char * data;
|
|
};//chunkpack
|
|
|
|
unsigned int chunk_rec_max = 128;
|
|
|
|
//clean a chunk so that it may be re-used without memory leaks
|
|
void scrubChunk(struct chunkpack c){
|
|
if (c.data){free(c.data);}
|
|
c.data = 0;
|
|
c.real_len = 0;
|
|
}//scrubChunk
|
|
|
|
//get a chunk from standard input
|
|
struct chunkpack getChunk(struct chunkpack prev){
|
|
struct chunkpack ret;
|
|
unsigned char temp;
|
|
fread(&(ret.chunktype), 1, 1, stdin);
|
|
fprintf(stderr, "Got chunkstream ID %hhi\n", ret.chunktype & 0x3F);
|
|
switch (ret.chunktype & 0x3F){
|
|
case 0:
|
|
fread(&temp, 1, 1, stdin);
|
|
ret.cs_id = temp + 64;
|
|
break;
|
|
case 1:
|
|
fread(&temp, 1, 1, stdin);
|
|
ret.cs_id = temp + 64;
|
|
fread(&temp, 1, 1, stdin);
|
|
ret.cs_id += temp * 256;
|
|
break;
|
|
default:
|
|
ret.cs_id = ret.chunktype & 0x3F;
|
|
break;
|
|
}
|
|
fprintf(stderr, "Got a type %hhi chunk\n", ret.chunktype & 0xC0);
|
|
switch (ret.chunktype & 0xC0){
|
|
case 0:
|
|
fread(&temp, 1, 1, stdin);
|
|
ret.timestamp = temp*256*256;
|
|
fread(&temp, 1, 1, stdin);
|
|
ret.timestamp += temp*256;
|
|
fread(&temp, 1, 1, stdin);
|
|
ret.timestamp += temp;
|
|
fread(&temp, 1, 1, stdin);
|
|
ret.len = temp*256*256;
|
|
fread(&temp, 1, 1, stdin);
|
|
ret.len += temp*256;
|
|
fread(&temp, 1, 1, stdin);
|
|
ret.len += temp;
|
|
ret.len_left = 0;
|
|
fread(&temp, 1, 1, stdin);
|
|
ret.msg_type_id = temp;
|
|
fread(&temp, 1, 1, stdin);
|
|
ret.msg_stream_id = temp*256*256;
|
|
fread(&temp, 1, 1, stdin);
|
|
ret.msg_stream_id += temp*256;
|
|
fread(&temp, 1, 1, stdin);
|
|
ret.msg_stream_id += temp;
|
|
break;
|
|
case 1:
|
|
fread(&temp, 1, 1, stdin);
|
|
ret.timestamp = temp*256*256;
|
|
fread(&temp, 1, 1, stdin);
|
|
ret.timestamp += temp*256;
|
|
fread(&temp, 1, 1, stdin);
|
|
ret.timestamp += temp;
|
|
ret.timestamp += prev.timestamp;
|
|
fread(&temp, 1, 1, stdin);
|
|
ret.len = temp*256*256;
|
|
fread(&temp, 1, 1, stdin);
|
|
ret.len += temp*256;
|
|
fread(&temp, 1, 1, stdin);
|
|
ret.len += temp;
|
|
ret.len_left = 0;
|
|
fread(&temp, 1, 1, stdin);
|
|
ret.msg_type_id = temp;
|
|
ret.msg_stream_id = prev.msg_stream_id;
|
|
break;
|
|
case 2:
|
|
fread(&temp, 1, 1, stdin);
|
|
ret.timestamp = temp*256*256;
|
|
fread(&temp, 1, 1, stdin);
|
|
ret.timestamp += temp*256;
|
|
fread(&temp, 1, 1, stdin);
|
|
ret.timestamp += temp;
|
|
ret.timestamp += prev.timestamp;
|
|
ret.len = prev.len;
|
|
ret.len_left = prev.len_left;
|
|
ret.msg_type_id = prev.msg_type_id;
|
|
ret.msg_stream_id = prev.msg_stream_id;
|
|
break;
|
|
case 3:
|
|
ret.timestamp = prev.timestamp;
|
|
ret.len = prev.len;
|
|
ret.len_left = prev.len_left;
|
|
ret.msg_type_id = prev.msg_type_id;
|
|
ret.msg_stream_id = prev.msg_stream_id;
|
|
break;
|
|
}
|
|
fprintf(stderr, "Timestamp: %i\n", ret.timestamp);
|
|
fprintf(stderr, "Length: %i\n", ret.len);
|
|
fprintf(stderr, "Message type ID: %hhi\n", ret.msg_type_id);
|
|
fprintf(stderr, "Message stream ID: %i\n", ret.msg_stream_id);
|
|
if (ret.len_left > 0){
|
|
ret.real_len = ret.len_left;
|
|
ret.len_left -= ret.real_len;
|
|
}else{
|
|
ret.real_len = ret.len;
|
|
}
|
|
if (ret.real_len > chunk_rec_max){
|
|
ret.len_left += ret.real_len - chunk_rec_max;
|
|
}
|
|
if (ret.timestamp == 0x00ffffff){
|
|
fread(&temp, 1, 1, stdin);
|
|
ret.timestamp = temp*256*256*256;
|
|
fread(&temp, 1, 1, stdin);
|
|
ret.timestamp += temp*256*256;
|
|
fread(&temp, 1, 1, stdin);
|
|
ret.timestamp += temp*256;
|
|
fread(&temp, 1, 1, stdin);
|
|
ret.timestamp += temp;
|
|
}
|
|
if (ret.real_len > 0){
|
|
ret.data = (unsigned char*)malloc(ret.real_len);
|
|
fread(ret.data, 1, ret.real_len, stdin);
|
|
}else{
|
|
ret.data = 0;
|
|
}
|
|
return ret;
|
|
}
|