core/vil/file_formats/vil_nitf2_tagged_record_definition.cxx
Go to the documentation of this file.
00001 // vil_nitf2: Written by Harry Voorhees (hlv@) and Rob Radtke (rob@) of
00002 // Stellar Science Ltd. Co. (stellarscience.com) for
00003 // Air Force Research Laboratory, 2005.
00004 
00005 #include "vil_nitf2_tagged_record_definition.h"
00006 #include "vil_nitf2_field_definition.h"
00007 #include "vil_nitf2_typed_field_formatter.h"
00008 #include <vcl_iostream.h>
00009 #include <vcl_utility.h>
00010 
00011 
00012 vil_nitf2_tagged_record_definition::tagged_record_definition_map&
00013   vil_nitf2_tagged_record_definition::all_definitions()
00014 {
00015   class tagged_record_definition_map_t: public vil_nitf2_tagged_record_definition::tagged_record_definition_map
00016   {
00017    public:
00018     ~tagged_record_definition_map_t()
00019     {
00020       for (iterator it = begin(), last = end(); it != last; it++) {
00021         delete it->second;
00022       }
00023     }
00024   };
00025 
00026   static tagged_record_definition_map_t tagged_record_definitions;
00027   return tagged_record_definitions;
00028 }
00029 
00030 
00031 vil_nitf2_tagged_record_definition::vil_nitf2_tagged_record_definition(
00032   vcl_string name, vcl_string pretty_name, vil_nitf2_field_definitions* defs)
00033   : m_name(name),
00034     m_pretty_name(pretty_name),
00035     m_field_definitions(defs ? defs : new vil_nitf2_field_definitions()),
00036     m_definition_completed(false)
00037 {
00038 }
00039 
00040 vil_nitf2_tagged_record_definition& vil_nitf2_tagged_record_definition::define(
00041   vcl_string name, vcl_string pretty_name)
00042 {
00043   vil_nitf2_tagged_record_definition* definition =
00044     new vil_nitf2_tagged_record_definition(name, pretty_name);
00045   if (all_definitions().find(name) != all_definitions().end()) {
00046     throw("vil_nitf2_tagged_record_definition already defined.");
00047   }
00048   all_definitions().insert(vcl_make_pair(name, definition));
00049   return *definition;
00050 }
00051 
00052 bool vil_nitf2_tagged_record_definition::undefine(vcl_string name)
00053 {
00054   tagged_record_definition_map::iterator definition = all_definitions().find(name);
00055   if (definition == all_definitions().end()) {
00056     return false;
00057   }
00058   delete definition->second;
00059   all_definitions().erase(definition);
00060   return true;
00061 }
00062 
00063 vil_nitf2_tagged_record_definition& vil_nitf2_tagged_record_definition::field(
00064     vcl_string tag,
00065     vcl_string pretty_name,
00066     vil_nitf2_field_formatter* formatter,
00067     bool blanks_ok,
00068     vil_nitf2_field_functor<int>* width_functor,
00069     vil_nitf2_field_functor<bool>* condition_functor,
00070     vcl_string units,
00071     vcl_string description)
00072 {
00073   if (m_definition_completed) {
00074     vcl_cerr << "vil_nitf2_tagged_record_definition:field() failed; definition already complete.";
00075   } else {
00076     vil_nitf2_field_definition* field_definition = new vil_nitf2_field_definition(
00077       tag, pretty_name, formatter, blanks_ok,
00078       width_functor, condition_functor, units, description);
00079     m_field_definitions->push_back(field_definition);
00080   }
00081   return *this;
00082 }
00083 
00084 vil_nitf2_tagged_record_definition&
00085 vil_nitf2_tagged_record_definition::repeat(vil_nitf2_field_functor<int>* repeat_functor,
00086                                            vil_nitf2_field_definitions& field_definitions)
00087 {
00088   if (m_definition_completed) {
00089     vcl_cerr << "vil_nitf2_tagged_record_definition:repeat() failed; definition already complete.";
00090   } else {
00091     m_field_definitions->push_back(
00092       new vil_nitf2_field_definition_repeat_node(
00093         repeat_functor,
00094         new vil_nitf2_field_definitions(field_definitions)));
00095   }
00096   return *this;
00097 }
00098 
00099 void vil_nitf2_tagged_record_definition::end()
00100 {
00101   m_definition_completed = true;
00102 }
00103 
00104 vil_nitf2_tagged_record_definition* vil_nitf2_tagged_record_definition::find(vcl_string name)
00105 {
00106   tagged_record_definition_map::iterator definition = all_definitions().find(name);
00107   if (definition == all_definitions().end()) return 0;
00108   return definition->second;
00109 }
00110 
00111 vil_nitf2_tagged_record_definition::~vil_nitf2_tagged_record_definition()
00112 {
00113   delete m_field_definitions;
00114 }
00115 
00116 vil_nitf2_tagged_record_definition& vil_nitf2_tagged_record_definition::repeat(
00117   vcl_string int_tag, vil_nitf2_field_definitions& field_definitions)
00118 {
00119   return repeat(new vil_nitf2_field_value<int>(int_tag), field_definitions);
00120 }
00121 
00122 vil_nitf2_tagged_record_definition& vil_nitf2_tagged_record_definition::repeat(
00123   int repeat_count, vil_nitf2_field_definitions& field_definitions)
00124 {
00125   return repeat(new vil_nitf2_constant_functor<int>(repeat_count), field_definitions);
00126 }
00127 
00128 void vil_nitf2_tagged_record_definition::register_test_tre()
00129 {
00130   define("PIAIMB", "Profile for Imagery Archives Image" )
00131     .field("CLOUDCVR",   "Cloud Cover",            NITF_INT(3),  true)
00132     .field("SRP",        "Standard Radiometric Product", NITF_CHAR(), true)
00133     .field("SENSMODE",   "Sensor Mode",            NITF_STR(12), true)
00134     .field("SENSNAME",   "Sensor Name",            NITF_STR(18), true)
00135     .field("SOURCE",     "Source",                 NITF_STR(255), true)
00136     .field("COMGEN",     "Compression Generation", NITF_INT(2), true)
00137     .field("SUBQUAL",    "Subjective Quality",     NITF_CHAR(), true)
00138     .field("PIAMSNNUM",  "PIA Mission Number",     NITF_STR(7), true)
00139     .field("CAMSPECS",   "Camera Specs",           NITF_STR(32), true)
00140     .field("PROJID",     "Project ID Code",        NITF_STR(2), true)
00141     .field("GENERATION", "Generation",             NITF_INT(1), true)
00142     .field("ESD",        "Exploitation Support Data", NITF_CHAR(), true)
00143     .field("OTHERCOND",  "Other Conditions",       NITF_STR(2), true)
00144     .end();
00145 }