00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef DBALLE_BUFREX_MSG_H
00023 #define DBALLE_BUFREX_MSG_H
00024
00025 #ifdef __cplusplus
00026 extern "C" {
00027 #endif
00028
00035 #include <dballe/core/var.h>
00036 #include <dballe/core/rawmsg.h>
00037 #include <dballe/bufrex/dtable.h>
00038 #include <dballe/bufrex/subset.h>
00039
00043 enum _bufrex_type {
00045 BUFREX_BUFR,
00047 BUFREX_CREX
00048 };
00050 typedef enum _bufrex_type bufrex_type;
00051
00052 struct _bufrex_opcode;
00053
00055 struct _bufrex_bufr_info {
00057 int centre;
00059 int subcentre;
00061 int master_table;
00063 int local_table;
00064
00066 int compression;
00068 int has_optional;
00070 int subsets;
00071 };
00073 struct _bufrex_crex_info {
00075 int master_table;
00077 int table;
00079 int has_check_digit;
00080 };
00081
00085 struct _bufrex_msg
00086 {
00092 int _refcount;
00093
00095 bufrex_type encoding_type;
00096
00098 union {
00099 struct _bufrex_crex_info crex;
00100 struct _bufrex_bufr_info bufr;
00101 } opt;
00102
00104 int type;
00106 int subtype;
00108 int localsubtype;
00109
00111 int edition;
00112
00115 int rep_year;
00116 int rep_month;
00117 int rep_day;
00118 int rep_hour;
00119 int rep_minute;
00120 int rep_second;
00124 dba_vartable btable;
00126 bufrex_dtable dtable;
00127
00129 bufrex_subset* subsets;
00131 size_t subsets_count;
00133 size_t subsets_alloclen;
00134
00136 bufrex_opcode datadesc;
00141 bufrex_opcode* datadesc_last;
00142 };
00144 typedef struct _bufrex_msg* bufrex_msg;
00145
00156 dba_err bufrex_msg_create(bufrex_type type, bufrex_msg* msg);
00157
00164 void bufrex_msg_delete(bufrex_msg msg);
00165
00175 void bufrex_msg_reset(bufrex_msg msg);
00176
00193 dba_err bufrex_msg_get_subset(bufrex_msg msg, int subsection, bufrex_subset* vars);
00194
00204 dba_err bufrex_msg_get_table_id(bufrex_msg msg, const char** id);
00205
00209 dba_err bufrex_msg_load_tables(bufrex_msg msg);
00210
00224 dba_err bufrex_msg_query_btable(bufrex_msg msg, dba_varcode code, dba_varinfo* info);
00225
00239 dba_err bufrex_msg_query_dtable(bufrex_msg msg, dba_varcode code, struct _bufrex_opcode** res);
00240
00247 void bufrex_msg_reset_datadesc(bufrex_msg msg);
00248
00257 void bufrex_msg_reset_sections(bufrex_msg msg);
00258
00271 dba_err bufrex_msg_get_datadesc(bufrex_msg msg, struct _bufrex_opcode** res);
00272
00283 dba_err bufrex_msg_append_datadesc(bufrex_msg msg, dba_varcode varcode);
00284
00294 dba_err bufrex_msg_generate_datadesc(bufrex_msg msg);
00295
00299 dba_err bufrex_msg_decode_header(bufrex_msg msg, dba_rawmsg raw);
00300
00304 dba_err bufrex_msg_decode(bufrex_msg msg, dba_rawmsg raw);
00305
00309 dba_err bufrex_msg_encode(bufrex_msg msg, dba_rawmsg* raw);
00310
00311
00322 dba_err bufr_encoder_encode(bufrex_msg in, dba_rawmsg out);
00323
00334 dba_err bufr_decoder_decode_header(dba_rawmsg in, bufrex_msg out);
00335
00346 dba_err bufr_decoder_decode(dba_rawmsg in, bufrex_msg out);
00347
00358 dba_err crex_encoder_encode(bufrex_msg in, dba_rawmsg out);
00359
00370 dba_err crex_decoder_decode(dba_rawmsg in, bufrex_msg out);
00371
00382 dba_err crex_decoder_decode_header(dba_rawmsg in, bufrex_msg out);
00383
00387 void bufrex_msg_print(bufrex_msg msg, FILE* out);
00388
00392 void bufrex_msg_diff(bufrex_msg msg1, bufrex_msg msg2, int* diffs, FILE* out);
00393
00411 dba_err bufrex_msg_parse_template(const char* str, int* cat, int* subcat, int* localsubcat);
00412
00413 #ifdef __cplusplus
00414 }
00415 #endif
00416
00417
00418 #endif