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
00261 dba_err bufrex_msg_get_datadesc(bufrex_msg msg, struct _bufrex_opcode** res);
00262
00273 dba_err bufrex_msg_append_datadesc(bufrex_msg msg, dba_varcode varcode);
00274
00284 dba_err bufrex_msg_generate_datadesc(bufrex_msg msg);
00285
00289 dba_err bufrex_msg_decode_header(bufrex_msg msg, dba_rawmsg raw);
00290
00294 dba_err bufrex_msg_decode(bufrex_msg msg, dba_rawmsg raw);
00295
00299 dba_err bufrex_msg_encode(bufrex_msg msg, dba_rawmsg* raw);
00300
00301
00312 dba_err bufr_encoder_encode(bufrex_msg in, dba_rawmsg out);
00313
00324 dba_err bufr_decoder_decode_header(dba_rawmsg in, bufrex_msg out);
00325
00336 dba_err bufr_decoder_decode(dba_rawmsg in, bufrex_msg out);
00337
00348 dba_err crex_encoder_encode(bufrex_msg in, dba_rawmsg out);
00349
00360 dba_err crex_decoder_decode(dba_rawmsg in, bufrex_msg out);
00361
00372 dba_err crex_decoder_decode_header(dba_rawmsg in, bufrex_msg out);
00373
00377 void bufrex_msg_print(bufrex_msg msg, FILE* out);
00378
00382 void bufrex_msg_diff(bufrex_msg msg1, bufrex_msg msg2, int* diffs, FILE* out);
00383
00384 #ifdef __cplusplus
00385 }
00386 #endif
00387
00388
00389 #endif