libwreport  3.23
bulletin.h
1 #ifndef WREPORT_BULLETIN_H
2 #define WREPORT_BULLETIN_H
3 
4 #include <wreport/var.h>
5 #include <wreport/subset.h>
6 #include <wreport/opcodes.h>
7 #include <wreport/tables.h>
8 #include <wreport/fwd.h>
9 #include <vector>
10 #include <memory>
11 
12 namespace wreport {
13 struct DTable;
14 
30 struct Bulletin
31 {
39  std::string fname;
40 
48  off_t offset = 0;
49 
60  uint8_t master_table_number = 0;
61 
63  uint8_t data_category = 0xff;
64 
66  uint8_t data_subcategory = 0xff;
67 
82  uint8_t data_subcategory_local = 0xff;
83 
88  uint16_t originating_centre = 0xffff;
89 
94  uint16_t originating_subcentre = 0xffff;
95 
101 
109  uint16_t rep_year = 0;
110  uint8_t rep_month = 0;
111  uint8_t rep_day = 0;
112  uint8_t rep_hour = 0;
113  uint8_t rep_minute = 0;
114  uint8_t rep_second = 0;
117  Tables tables;
119 
121  std::vector<Varcode> datadesc;
122 
124  std::vector<Subset> subsets;
125 
126 
127  Bulletin();
128  virtual ~Bulletin();
129 
131  virtual void clear();
132 
134  virtual const char* encoding_name() const throw () = 0;
135 
145  Subset& obtain_subset(unsigned subsection);
146 
155  const Subset& subset(unsigned subsection) const;
156 
158  virtual void load_tables() = 0;
159 
161  virtual std::string encode() const = 0;
162 
164  void print(FILE* out) const;
165 
167  void print_structured(FILE* out) const;
168 
170  virtual void print_details(FILE* out) const;
171 
180  void print_datadesc(FILE* out, unsigned indent=0) const;
181 
193  virtual unsigned diff(const Bulletin& msg) const;
194 
196  virtual unsigned diff_details(const Bulletin& msg) const;
197 };
198 
199 
202 {
212  bool decode_adds_undef_attrs = false;
213 
221  static std::unique_ptr<BufrCodecOptions> create();
222 
223 protected:
224  BufrCodecOptions();
225 };
226 
227 
229 struct BufrBulletin : public Bulletin
230 {
232  uint8_t edition_number = 4;
233 
241  uint8_t master_table_version_number = 19;
242 
251  uint8_t master_table_version_number_local = 0;
252 
255 
261  std::string optional_section;
262 
268  unsigned section_end[6] = { 0, 0, 0, 0, 0, 0 };
269 
270 
271  virtual ~BufrBulletin();
272 
273  void clear();
274  const char* encoding_name() const throw () override { return "BUFR"; }
275  void load_tables() override;
276  std::string encode() const override;
277  void print_details(FILE* out) const override;
278  unsigned diff_details(const Bulletin& msg) const override;
279 
294  static bool read(FILE* in, std::string& buf, const char* fname=0, off_t* offset=0);
295 
306  static void write(const std::string& buf, FILE* out, const char* fname=0);
307 
312  static std::unique_ptr<BufrBulletin> create();
313 
326  static std::unique_ptr<BufrBulletin> decode_header(const std::string& raw, const char* fname="(memory)", size_t offset=0);
327 
342  static std::unique_ptr<BufrBulletin> decode_header(const std::string& raw, const BufrCodecOptions& opts, const char* fname="(memory)", size_t offset=0);
343 
356  static std::unique_ptr<BufrBulletin> decode(const std::string& raw, const char* fname="(memory)", size_t offset=0);
357 
372  static std::unique_ptr<BufrBulletin> decode_verbose(const std::string& raw, FILE* out, const char* fname="(memory)", size_t offset=0);
373 
388  static std::unique_ptr<BufrBulletin> decode(const std::string& raw, const BufrCodecOptions& opts, const char* fname="(memory)", size_t offset=0);
389 
390 protected:
391  BufrBulletin();
392 };
393 
394 
396 struct CrexBulletin : public Bulletin
397 {
399  uint8_t edition_number = 2;
400 
407  uint8_t master_table_version_number = 19;
408 
420  uint8_t master_table_version_number_bufr = 19;
421 
430  uint8_t master_table_version_number_local = 0;
431 
433  bool has_check_digit = false;
434 
435 
436  void clear();
437  const char* encoding_name() const throw () override { return "CREX"; }
438  void load_tables() override;
439  std::string encode() const override;
440  void print_details(FILE* out) const override;
441  unsigned diff_details(const Bulletin& msg) const override;
442 
457  static bool read(FILE* in, std::string& buf, const char* fname=0, off_t* offset=0);
458 
469  static void write(const std::string& buf, FILE* out, const char* fname=0);
470 
475  static std::unique_ptr<CrexBulletin> create();
476 
489  static std::unique_ptr<CrexBulletin> decode_header(const std::string& raw, const char* fname="(memory)", size_t offset=0);
490 
503  static std::unique_ptr<CrexBulletin> decode(const std::string& raw, const char* fname="(memory)", size_t offset=0);
504 
519  static std::unique_ptr<CrexBulletin> decode_verbose(const std::string& raw, FILE* out, const char* fname="(memory)", size_t offset=0);
520 
521 protected:
522  CrexBulletin();
523 };
524 
525 
535 namespace bulletin {
536 }
537 
538 }
539 #endif
uint16_t originating_subcentre
Identification of originating/generating sub-centre (allocated by originating/generating centre - see...
Definition: bulletin.h:94
uint8_t data_category
Data category (BUFR or CREX Table A)
Definition: bulletin.h:63
void print_structured(FILE *out) const
Dump the contents of this bulletin, in a more structured way.
uint8_t update_sequence_number
Update sequence number (zero for original messages and for messages containing only delayed reports; ...
Definition: bulletin.h:100
Tables tables
Varcode and opcode tables used for encoding or decoding.
Definition: bulletin.h:118
Options used to configure BUFR decoding.
Definition: bulletin.h:201
virtual unsigned diff(const Bulletin &msg) const
Compute the differences between two bulletins.
std::string optional_section
Raw optional section of the message.
Definition: bulletin.h:261
void print_datadesc(FILE *out, unsigned indent=0) const
Pretty-print the data descriptor section.
uint8_t rep_hour
Most typical time for the BUFR message contents.
Definition: bulletin.h:112
void print(FILE *out) const
Dump the contents of this bulletin.
std::vector< Subset > subsets
Decoded variables.
Definition: bulletin.h:124
STL namespace.
uint8_t master_table_number
BUFR Master table number.
Definition: bulletin.h:60
uint8_t data_subcategory
International data sub-category (see Common Code table C-13)
Definition: bulletin.h:66
const char * encoding_name() const override
Type of source/target encoding.
Definition: bulletin.h:274
virtual void load_tables()=0
Load a new set of tables to use for encoding this message.
virtual void clear()
Reset the bulletin.
Collection of BUFR/CREX tables used to work on a bulletin.
Definition: tables.h:17
virtual std::string encode() const =0
Encode the message.
Storage for the decoded data of a BUFR or CREX message.
Definition: bulletin.h:30
uint8_t rep_month
Most typical time for the BUFR message contents.
Definition: bulletin.h:110
const Subset & subset(unsigned subsection) const
Get a Subset from the message.
uint8_t data_subcategory_local
Local data sub-category, defined locally by automatic data-processing (ADP) centres.
Definition: bulletin.h:82
uint16_t rep_year
Most typical time for the BUFR message contents.
Definition: bulletin.h:109
uint16_t originating_centre
Identification of originating/generating centre (see Common Code table C-11)
Definition: bulletin.h:88
virtual void print_details(FILE *out) const
Print format-specific details.
CREX bulletin implementation.
Definition: bulletin.h:396
String functions.
Definition: benchmark.h:13
off_t offset
File offset of the start of the message.
Definition: bulletin.h:48
uint8_t rep_second
Most typical time for the BUFR message contents.
Definition: bulletin.h:114
uint8_t rep_minute
Most typical time for the BUFR message contents.
Definition: bulletin.h:113
virtual unsigned diff_details(const Bulletin &msg) const
Diff format-specific details.
bool compression
Whether the message is compressed.
Definition: bulletin.h:254
const char * encoding_name() const override
Type of source/target encoding.
Definition: bulletin.h:437
uint8_t rep_day
Most typical time for the BUFR message contents.
Definition: bulletin.h:111
Represent a BUFR/CREX data subset as a list of decoded variables.
Definition: subset.h:13
std::string fname
Input file name (optional).
Definition: bulletin.h:39
Subset & obtain_subset(unsigned subsection)
Get a Subset from the message.
BUFR bulletin implementation.
Definition: bulletin.h:229
std::vector< Varcode > datadesc
Parsed data descriptor section.
Definition: bulletin.h:121
virtual const char * encoding_name() const =0
Type of source/target encoding.