core/vil/file_formats/vil_nitf2_des.cxx
Go to the documentation of this file.
00001 // vil_nitf2: Written by Rob Radtke (rob@) and Harry Voorhees (hlv@) of
00002 // Stellar Science Ltd. Co. (stellarscience.com) for
00003 // Air Force Research Laboratory, 2005.
00004 
00005 #include "vil_nitf2_des.h"
00006 #include "vil_nitf2_field_definition.h"
00007 #include "vil_nitf2_typed_field_formatter.h"
00008 
00009 
00010 vil_nitf2_des::field_definition_map&
00011   vil_nitf2_des::all_definitions()
00012 {
00013   class field_definition_map_t: public vil_nitf2_des::field_definition_map
00014   {
00015    public:
00016     ~field_definition_map_t()
00017     {
00018       for (iterator it = begin(), last = end();
00019            it != last; it++ )
00020       {
00021         delete it->second;
00022       }
00023     }
00024   };
00025 
00026   static field_definition_map_t field_definitions;
00027   return field_definitions;
00028 }
00029 
00030 
00031 vil_nitf2_field_definitions&
00032 vil_nitf2_des::define(vcl_string desId )
00033 {
00034   if (all_definitions().find(desId) != all_definitions().end()) {
00035     throw("des with that name already defined.");
00036   }
00037   vil_nitf2_field_definitions* definition = new vil_nitf2_field_definitions();
00038   all_definitions().insert( vcl_make_pair(desId, definition) );
00039   return *definition;
00040 }
00041 
00042 vil_nitf2_des::vil_nitf2_des( vil_nitf2_classification::file_version version, int data_width )
00043   : m_field_sequence1( 0 ),
00044     m_field_sequence2( 0 )
00045 {
00046   m_field_sequence1 = new vil_nitf2_field_sequence( *create_field_definitions( version, data_width ) );
00047 }
00048 
00049 bool vil_nitf2_des::read(vil_stream* stream)
00050 {
00051   if ( m_field_sequence1->read(*stream) ) {
00052     vcl_string desId;
00053     m_field_sequence1->get_value( "DESID", desId );
00054     if ( desId == "TRE_OVERFLOW" ){
00055       return true;
00056     } else {
00057       field_definition_map::iterator it = all_definitions().find( desId );
00058       if ( it != all_definitions().end() ) {
00059         if ( m_field_sequence2 ) delete m_field_sequence2;
00060         m_field_sequence2 = new vil_nitf2_field_sequence( *((*it).second) );
00061         return m_field_sequence2->read(*stream);
00062       }
00063     }
00064   }
00065   return true;
00066 }
00067 
00068 vil_nitf2_field_definitions* vil_nitf2_des::create_field_definitions( vil_nitf2_classification::file_version ver, int data_width )
00069 {
00070   vil_nitf2_field_definitions* field_definitions = new vil_nitf2_field_definitions();
00071   add_shared_field_defs_1(field_definitions);
00072   vil_nitf2_classification::add_field_defs(field_definitions, ver, "I", "Image");
00073   add_shared_field_defs_2(field_definitions, data_width);
00074   return field_definitions;
00075 }
00076 
00077 void vil_nitf2_des::add_shared_field_defs_1( vil_nitf2_field_definitions* defs )
00078 {
00079   (*defs)
00080     .field( "DE", "Data Extension Subheader", NITF_ENUM( 2, vil_nitf2_enum_values().value( "DE" ) ), false, 0, 0 )
00081     .field( "DESID", "Unique DES Type Identifier", NITF_STR( 25 ),
00082             false, 0, 0 )
00083     .field( "DESVER", "Version of the Data Definition", NITF_INT( 2, false ), false, 0, 0 );
00084 }
00085 
00086 void vil_nitf2_des::add_shared_field_defs_2( vil_nitf2_field_definitions* defs, int data_width )
00087 {
00088   vil_nitf2_enum_values overflow_enum;
00089   overflow_enum.value( "UDHD", "User Defined Header Data" )
00090                .value( "UDID" "User Defined Image Data" )
00091                .value( "XHD", "Extended Header Data" )
00092                .value( "IXSHD", "Image Extended Subheader Data" )
00093                .value( "SXSHD", "Graphic Extended Subheader Data" )
00094                .value( "TXSHD", "Text Extended Subheader Data" );
00095   (*defs)
00096     .field( "DESOFLW", "Overflowed Header Type", NITF_ENUM( 6, overflow_enum ),
00097             false, 0, new vil_nitf2_field_value_one_of<vcl_string>( "DESID", "TRE_OVERFLOW" ) )
00098     .field( "DESITEM", "Data Item Overflowed", NITF_INT( 3, false ),
00099             false, 0, new vil_nitf2_field_value_one_of<vcl_string>( "DESID", "TRE_OVERFLOW" ))
00100     .field( "DESSHL", "Length of DES-Defined Subheader Fields", NITF_INT( 4, false ), false, 0, 0 )
00101     .field( "DESDATA", "DES-Defined Data Field", NITF_TRES(), false,
00102             new vil_nitf2_max_field_value_plus_offset_and_threshold( "DESSHL", data_width, 0, -1 ),
00103             new vil_nitf2_field_value_one_of<vcl_string>( "DESID", "TRE_OVERFLOW" ) )
00104     .end();
00105 }
00106 
00107 vil_nitf2_field::field_tree* vil_nitf2_des::get_tree( int i ) const
00108 {
00109   vil_nitf2_field::field_tree* t = new vil_nitf2_field::field_tree;
00110   vcl_stringstream name_stream;
00111   name_stream << "Data Extension Segment";
00112   if ( i > 0 ) name_stream << " #" << i;
00113   t->columns.push_back( name_stream.str() );
00114   vcl_string desId;
00115   if ( m_field_sequence1->get_value( "DESID", desId ) ) {
00116     t->columns.push_back( desId );
00117   }
00118   m_field_sequence1->get_tree( t );
00119   if ( m_field_sequence2 ) m_field_sequence2->get_tree( t );
00120   return t;
00121 }
00122 
00123 vil_nitf2_des::~vil_nitf2_des()
00124 {
00125   if ( m_field_sequence1 ) delete m_field_sequence1;
00126   if ( m_field_sequence2 ) delete m_field_sequence2;
00127 }