Exemple #1
0
static void
_register(struct pbc_env *p, struct pbc_rmessage * file, struct _stringpool *pool) {
	int package_sz;
	const char *package = pbc_rmessage_string(file, "package", 0, &package_sz);

	pbc_array queue;
	_pbcA_open(queue);

	int enum_count = pbc_rmessage_size(file, "enum_type");
	int i;

	for (i=0;i<enum_count;i++) {
		struct pbc_rmessage * enum_type = pbc_rmessage_message(file, "enum_type", i);
		_register_enum(p,  pool , enum_type, package, package_sz);
	}

	int message_count = pbc_rmessage_size(file, "message_type");
	for (i=0;i<message_count;i++) {
		struct pbc_rmessage * message_type = pbc_rmessage_message(file, "message_type", i);
		_register_message(p, pool, message_type, package, package_sz, queue);
	}

	_register_extension(p, pool, package, package_sz, file , queue);

	_pbcB_register_fields(p, queue);

	_pbcA_close(queue);
}
Exemple #2
0
static struct pbc_wmessage *
_wmessage_new(struct _message *msg) {
	struct pbc_wmessage * m = malloc(sizeof(*m));
	m->type = msg;
	m->buffer = malloc(WMESSAGE_SIZE);
	m->ptr = m->buffer;
	m->endptr = m->buffer + WMESSAGE_SIZE;
	_pbcA_open(m->sub);
	m->packed = NULL;

	return m;
}
Exemple #3
0
static int
register_internal(struct pbc_env * p, void *buffer, int size) {
	struct pbc_pattern * FIELD_T =  _pbcP_new(8);
	F(0,name,string);
	F(1,id,int32);
	F(2,label,int32);
	F(3,type,int32);
	F(4,type_name,string);
	F(5,default_integer,int32);
	F(6,default_string,string);
	F(7,default_real,double);

	struct pbc_pattern * FILE_T =  _pbcP_new(10);

	D(0,name,string);
	D(1,dependency,string_array);
	D(2,message_name,string_array);
	D(3,message_size,int32_array);
	D(4,message_field,message_array);
	D(5,enum_name,string_array);
	D(6,enum_size,int32_array);
	D(7,enum_string,string_array);
	D(8,enum_id,int32_array);

	int ret = 0;

	struct file_t file;
	int r = pbc_pattern_unpack(FILE_T, buffer, size, &file);
	if (r != 0) {
		ret = 1;
		goto _return;
	}

	_pbcM_sp_insert(p->files , file.name->s.str, NULL);

	pbc_array queue;
	_pbcA_open(queue);

	set_enums(p, &file);
	set_msgs(FIELD_T, p, &file, queue);
	_pbcB_register_fields(p, queue);

	_pbcA_close(queue);
	pbc_pattern_close_arrays(FILE_T, &file);

_return:
	free(FIELD_T);
	free(FILE_T);
	return ret;
}
Exemple #4
0
static void
_pbc_rmessage_new(struct pbc_rmessage * ret , struct _message * type , void *buffer, int size) {
	pbc_ctx _ctx;
	if (_pbcC_open(_ctx,buffer,size) <=0) {
		memset(ret , 0, sizeof(*ret));
		return;
	}
	struct context * ctx = (struct context *)_ctx;

	ret->msg = type;
	ret->index = _pbcM_sp_new();

	int i;

	for (i=0;i<ctx->number;i++) {
		int id = ctx->a[i].id;
		struct _field * f = _pbcM_ip_query(type->id , id);
		if (f) {
			if (f->label == LABEL_REPEATED || f->label == LABEL_PACKED) {
				struct value * v;
				void ** vv = _pbcM_sp_query_insert(ret->index, f->name);
				if (*vv == NULL) {
					v = malloc(SIZE_ARRAY);
					v->type = f;
					_pbcA_open(v->v.array);
					*vv = v;
				} else {
					v= *vv;
				}
				if (f->label == LABEL_PACKED) {
					push_value_packed(v->v.array , f , &(ctx->a[i]), buffer);
				} else {
					push_value_array(v->v.array , f, &(ctx->a[i]), buffer);
				}
			} else {
				struct value * v = read_value(f, &(ctx->a[i]), buffer);
				if (v) {
					_pbcM_sp_insert(ret->index, f->name, v);
				}
			}
		}
	}

	_pbcC_close(_ctx);
}
Exemple #5
0
static void
set_default(struct pbc_pattern *pat, uint8_t * output) {
	int i;
	for (i=0;i<pat->count;i++) {
		if (pat->f[i].ctype == CTYPE_ARRAY || pat->f[i].ctype == CTYPE_PACKED) {
			struct _pbc_array *array = (struct _pbc_array *)(output + pat->f[i].offset);
			_pbcA_open(array);
			continue;
		} else if (pat->f[i].ptype == PTYPE_MESSAGE) {
			struct _pbc_ctx *ctx = (struct _pbc_ctx *)(output + pat->f[i].offset);
			_pbcC_open(ctx , NULL , 0);			
			continue;
		} else if (pat->f[i].ptype == PTYPE_ENUM) {
			pbc_var defv;
			defv->integer.low = pat->f[i].defv->e.id;
			defv->integer.hi = 0;
			set_default_v(output + pat->f[i].offset, pat->f[i].ctype, defv);
			continue;
		}
		set_default_v(output + pat->f[i].offset, pat->f[i].ctype, pat->f[i].defv);
	}
}