00001
00002
00003
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 }