Example #1
0
const void*
rpacket_read_binary(rpacket *r,uint16_t *len)
{
	void *addr = 0;
	uint16_t size = rpacket_read_uint16(r);
	if(size == 0 || size > r->data_remain) return NULL;
	if(len) *len = size;
	if(reader_check_size(&r->reader,size)){
		addr = &r->reader.cur->data[r->reader.pos];
		r->reader.pos += size;
		r->data_remain -= size;
		if(r->data_remain && r->reader.pos >= r->reader.cur->size)
			buffer_reader_init(&r->reader,r->reader.cur->next,0);
	}else{
		if(!r->binbuf){
			r->binbuf = bytebuffer_new(((packet*)r)->len_packet);
			r->binpos = 0;
		}
		addr = r->binbuf->data + r->binpos;
		while(size)
		{
			uint32_t copy_size = r->reader.cur->size - r->reader.pos;
			copy_size = copy_size >= size ? size:copy_size;
			memcpy(r->binbuf->data + r->binpos,r->reader.cur->data + r->reader.pos,copy_size);
			size -= copy_size;
			r->reader.pos += copy_size;
			r->data_remain -= copy_size;
			r->binpos += copy_size;
			if(r->data_remain && r->reader.pos >= r->reader.cur->size)
				buffer_reader_init(&r->reader,r->reader.cur->next,0);
		}		
	}
	return addr;
}
Example #2
0
packet*
wpacket_makeread(packet *p)
{
	if(p->type == WPACKET){
		rpacket *r = rpacket_new(NULL,0);
		((packet*)r)->head = p->head;
		refobj_inc((refobj*)p->head);
		((packet*)r)->spos = p->spos;
		buffer_reader_init(&r->reader,p->head,p->spos + SIZE_HEAD);
		((packet*)r)->len_packet = p->len_packet;
		r->data_remain = p->len_packet - SIZE_HEAD;
		INIT_CONSTROUCTOR(r);		
		return (packet*)r;		
	}
	return NULL;
}
Example #3
0
rpacket*
rpacket_new(bytebuffer *b,uint32_t start_pos)
{
	rpacket *r = (rpacket*)CALLOC(g_rpk_allocator,1,sizeof(*r));
	((packet*)r)->type = RPACKET;
	if(b){
		((packet*)r)->head = b;
		((packet*)r)->spos = start_pos;
		refobj_inc((refobj*)b);
		buffer_reader_init(&r->reader,b,start_pos);
		buffer_read(&r->reader,&r->data_remain,sizeof(r->data_remain));		
		((packet*)r)->len_packet = r->data_remain + SIZE_HEAD;
	}
	INIT_CONSTROUCTOR(r);
	return r;
}
Example #4
0
static packet*
rpacket_clone(packet *p)
{
	rpacket *ori = (rpacket*)p;
	if(p->type == RPACKET){
		rpacket *r = rpacket_new(NULL,0);
		((packet*)r)->head = p->head;
		refobj_inc((refobj*)p->head);
		((packet*)r)->spos = p->spos;
		buffer_reader_init(&r->reader,ori->reader.cur,ori->reader.pos);
		((packet*)r)->len_packet =  p->len_packet;
		r->data_remain = p->len_packet - SIZE_HEAD;
		INIT_CONSTROUCTOR(r);	
		return (packet*)r;
	}
	return NULL;
}
Example #5
0
void pt_srv_receive(struct pt_sclient *user, struct pt_buffer *buff)
{
    buffer_reader reader;
    struct net_header hdr;
    
    buffer_reader_init(&reader, buff);
    buffer_reader_read(&reader, (unsigned char*)&hdr, sizeof(hdr));
    buffer_reader_ignore_bytes(&reader, 4);
    
    char *s = (char*)buffer_reader_cur_pos(&reader);
    
    printf("%s\n",s);
    
    //printf("pt_srv_receive => %d\n",user->serial);
    
    pt_srv_send(user);
}
Example #6
0
static packet*
rpk_unpack(decoder *d,int32_t *err)
{
	TYPE_HEAD     pk_len;
	uint32_t      pk_total,size;
	buffer_reader reader;
	rpacket      *rpk;
	if(err) *err = 0;

	if(d->size <= SIZE_HEAD)
		return NULL;

	buffer_reader_init(&reader,d->buff,d->pos);
	if(SIZE_HEAD != buffer_read(&reader,(char*)&pk_len,SIZE_HEAD))
		return NULL;
	pk_len = _ntoh16(pk_len);
	pk_total = pk_len + SIZE_HEAD;
	if(pk_total > d->max_packet_size){
		if(err) *err = DERR_TOOLARGE;
		return NULL;
	}
	if(pk_total > d->size)
		return NULL;

	rpk = rpacket_new(d->buff,d->pos);

	do{
		size = d->buff->size - d->pos;
		size = pk_total > size ? size:pk_total;
		d->pos    += size;
		pk_total  -= size;
		d->size -= size;
		if(d->pos >= d->buff->cap)
		{
			bytebuffer_set(&d->buff,d->buff->next);
			d->pos = 0;
			if(!d->buff){
				assert(pk_total == 0);
				break;
			}
		}
	}while(pk_total);
	return (packet*)rpk;
}