vil_nitf2_des.cxx
Go to the documentation of this file.
1 // vil_nitf2: Written by Rob Radtke (rob@) and Harry Voorhees (hlv@) of
2 // Stellar Science Ltd. Co. (stellarscience.com) for
3 // Air Force Research Laboratory, 2005.
4 
5 #include <sstream>
6 #include "vil_nitf2_des.h"
9 #ifdef _MSC_VER
10 # include <vcl_msvc_warnings.h>
11 #endif
12 
15 {
16  class field_definition_map_t: public vil_nitf2_des::field_definition_map
17  {
18  public:
19  ~field_definition_map_t()
20  {
21  for (auto & it : *this)
22  {
23  delete it.second;
24  }
25  }
26  };
27 
28  static field_definition_map_t field_definitions;
29  return field_definitions;
30 }
31 
32 
34 vil_nitf2_des::define(std::string desId )
35 {
36  if (all_definitions().find(desId) != all_definitions().end()) {
37  throw("des with that name already defined.");
38  }
39  auto* definition = new vil_nitf2_field_definitions();
40  all_definitions().insert( std::make_pair(desId, definition) );
41  return *definition;
42 }
43 
45  : m_field_sequence1( nullptr ),
46  m_field_sequence2( nullptr )
47 {
49 }
50 
52 {
53  if ( m_field_sequence1->read(*stream) ) {
54  std::string desId;
55  m_field_sequence1->get_value( "DESID", desId );
56  if ( desId == "TRE_OVERFLOW" ){
57  return true;
58  }
59  else {
60  auto it = all_definitions().find( desId );
61  if ( it != all_definitions().end() ) {
63  m_field_sequence2 = new vil_nitf2_field_sequence( *((*it).second) );
64  return m_field_sequence2->read(*stream);
65  }
66  }
67  }
68  return true;
69 }
70 
72 {
73  auto* field_definitions = new vil_nitf2_field_definitions();
74  add_shared_field_defs_1(field_definitions);
75  vil_nitf2_classification::add_field_defs(field_definitions, ver, "I", "Image");
76  add_shared_field_defs_2(field_definitions, data_width);
77  return field_definitions;
78 }
79 
81 {
82  (*defs)
83  .field( "DE", "Data Extension Subheader", NITF_ENUM( 2, vil_nitf2_enum_values().value( "DE" ) ), false, nullptr, nullptr )
84  .field( "DESID", "Unique DES Type Identifier", NITF_STR( 25 ),
85  false, nullptr, nullptr )
86  .field( "DESVER", "Version of the Data Definition", NITF_INT( 2, false ), false, nullptr, nullptr );
87 }
88 
90 {
91  vil_nitf2_enum_values overflow_enum;
92  overflow_enum.value( "UDHD", "User Defined Header Data" )
93  .value( "UDID" "User Defined Image Data" )
94  .value( "XHD", "Extended Header Data" )
95  .value( "IXSHD", "Image Extended Subheader Data" )
96  .value( "SXSHD", "Graphic Extended Subheader Data" )
97  .value( "TXSHD", "Text Extended Subheader Data" );
98  (*defs)
99  .field( "DESOFLW", "Overflowed Header Type", NITF_ENUM( 6, overflow_enum ),
100  false, nullptr, new vil_nitf2_field_value_one_of<std::string>( "DESID", "TRE_OVERFLOW" ) )
101  .field( "DESITEM", "Data Item Overflowed", NITF_INT( 3, false ),
102  false, nullptr, new vil_nitf2_field_value_one_of<std::string>( "DESID", "TRE_OVERFLOW" ))
103  .field( "DESSHL", "Length of DES-Defined Subheader Fields", NITF_INT( 4, false ), false, nullptr, nullptr )
104  .field( "DESDATA", "DES-Defined Data Field", NITF_TRES(), false,
105  new vil_nitf2_max_field_value_plus_offset_and_threshold( "DESSHL", data_width, 0, -1 ),
106  new vil_nitf2_field_value_one_of<std::string>( "DESID", "TRE_OVERFLOW" ) )
107  .end();
108 }
109 
111 {
112  auto* t = new vil_nitf2_field::field_tree;
113  std::stringstream name_stream;
114  name_stream << "Data Extension Segment";
115  if ( i > 0 ) name_stream << " #" << i;
116  t->columns.push_back( name_stream.str() );
117  std::string desId;
118  if ( m_field_sequence1->get_value( "DESID", desId ) ) {
119  t->columns.push_back( desId );
120  }
123  return t;
124 }
125 
127 {
128  if ( m_field_sequence1 ) delete m_field_sequence1;
129  if ( m_field_sequence2 ) delete m_field_sequence2;
130 }
Functor vil_nitf2_field_value_one_of defines a predicate that sets its out parameter to true iff the ...
static vil_nitf2_field_definitions & define(std::string desId)
Functor vil_nitf2_max_field_value_plus_offset_and_threshold defines a function that sets its out para...
bool read(vil_nitf2_istream &input, const vil_nitf2_field_definitions *field_defs=nullptr, const vil_nitf2_index_vector &indexes=vil_nitf2_index_vector())
#define NITF_INT
std::vector< std::string > columns
#define NITF_TRES
#define NITF_STR
static field_definition_map & all_definitions()
vil_nitf2_field_sequence * m_field_sequence2
Definition: vil_nitf2_des.h:73
static void add_field_defs(vil_nitf2_field_definitions *defs, const file_version &version, std::string prefix, const std::string &pretty_name_prefix)
static void add_shared_field_defs_1(vil_nitf2_field_definitions *defs)
static void add_shared_field_defs_2(vil_nitf2_field_definitions *defs, int data_width)
virtual vil_nitf2_field::field_tree * get_tree(int i=0) const
vil_nitf2_field_sequence * m_field_sequence1
Definition: vil_nitf2_des.h:72
Stream interface for VIL image loaders.
Definition: vil_stream.h:21
vil_nitf2_des(vil_nitf2_classification::file_version version, int data_width)
virtual bool read(vil_stream *stream)
read the des starting at stream's current position returns false if failed
virtual ~vil_nitf2_des()
static vil_nitf2_field_definitions * create_field_definitions(vil_nitf2_classification::file_version ver, int data_width)
bool get_value(std::string tag, int &out_value) const
virtual vil_nitf2_field::field_tree * get_tree(vil_nitf2_field::field_tree *tr=nullptr) const
std::map< std::string, vil_nitf2_field_definitions * > field_definition_map
Definition: vil_nitf2_des.h:65
#define NITF_ENUM
vil_nitf2_enum_values & value(std::string token, std::string pretty_name="")