OSSIM - Open Source Software Image Map  Version 1.9.0 (20180803)
ossimNitfEngrdaTag.cpp
Go to the documentation of this file.
1 //----------------------------------------------------------------------------
2 //
3 // License: LGPL
4 //
5 // See LICENSE.txt file in the top level directory for more details.
6 //
7 // Author: David Burken
8 //
9 // Description: ENGRDA - Engineering Data tag class declaration.
10 //
11 // See document STDI-0002 (version 3), Appendix N for more info.
12 //
13 //----------------------------------------------------------------------------
14 // $Id
15 
16 #include <cstring>
17 #include <istream>
18 #include <iostream>
19 #include <iomanip>
20 #include <sstream>
21 
23 #include <ossim/base/ossimNotify.h>
24 #include <ossim/base/ossimTrace.h>
25 
26 static const ossimTrace traceDebug(ossimString("ossimNitfEngrda:debug"));
27 
29 
31  : ossimNitfRegisteredTag(std::string("ENGRDA"), 0)
32 {
33  clearFields();
34 }
35 
37 {
38 }
39 
41 {
42  clearFields();
43 
44  in.read(m_reSrc, RESRC_SIZE);
45  in.read(m_reCnt, RECNT_SIZE);
46 
47  const ossim_uint16 ELEMENT_COUNT = ossimString(m_reCnt).toUInt16();
48 
49  for (ossim_uint16 i = 0; i < ELEMENT_COUNT; ++i)
50  {
51  ossimString os;
52  ossim_uint32 size(0);
53 
54  char buf[TMP_BUF_SIZE];
55 
56  ossimEngDataElement element;
57 
58  // ENGLN - label length field
59  in.read(element.m_engLn, ENGLN_SIZE);
60  element.m_engLn[ENGLN_SIZE] = '\0';
61 
62  // ENGLBL - label field
63  os = element.m_engLn;
64  size = os.toUInt16();
65  in.read(buf, size);
66  buf[size] = '\0';
67  element.m_engLbl = buf;
68 
69  // ENGMTXC - data column count
70  in.read(element.m_engMtxC, ENGMTXC_SIZE);
71  element.m_engMtxC[ENGMTXC_SIZE] = '\0';
72 
73  // ENGMTXR - data row count
74  in.read(element.m_engMtxR, ENGMTXR_SIZE);
75  element.m_engMtxR[ENGMTXR_SIZE] = '\0';
76 
77  // ENGTYP - Value Type of Engineering Data Element.
78  in.get( element.m_engTyp );
79 
80  // ENGDTS - Engineering Data Element Size
81  in.get( element.m_engDts );
82  os = element.m_engDts;
83  ossim_uint32 engDataElementSize = os.toUInt32();
84 
85  // ENGDATU - Engineering Data Units.
86  in.read( element.m_engDatU, ENGDATU_SIZE );
87  element.m_engDatU[ENGDATU_SIZE] = '\0';
88 
89  // ENGDATC - Engineering Data Count
90  in.read(element.m_engDatC, ENGDATC_SIZE);
91  element.m_engDatC[ENGDATC_SIZE] = '\0';
92  os = element.m_engDatC;
93  ossim_uint32 engDataCount = os.toUInt32();
94 
95  // ENGDATA - Engineering Data
96  size = engDataElementSize * engDataCount;
97  element.m_engDat.resize(size);
98  in.read((char*)&(element.m_engDat.front()), size);
99 
100  m_data.push_back(element);
101 
102  } // Matches: for (ossim_uint16 i = 0; i < ELEMENT_COUNT; ++i)
103 }
104 
106 {
107  //out.write(theAcMsnId, AC_MSN_ID_SIZE);
108  // out.write(theAcTailNo, AC_TAIL_NO_SIZE);
109 
110  out.write(m_reSrc, RESRC_SIZE);
111  out.write(m_reCnt, RECNT_SIZE);
112 
113  const ossim_uint16 ELEMENT_COUNT = ossimString(m_reCnt).toUInt16();
114 
115  for (ossim_uint16 i = 0; i < ELEMENT_COUNT; ++i)
116  {
117  // ENGLN - label length field
118  out.write(m_data[i].m_engLn, ENGLN_SIZE);
119 
120  // ENGLBL - label field
121  out.write(m_data[i].m_engLbl.data(), (std::streamsize)m_data[i].m_engLbl.size());
122 
123  // ENGMTXC - data column count
124  out.write(m_data[i].m_engMtxC, ENGMTXC_SIZE );
125 
126  // ENGMTXR - data row count
127  out.write(m_data[i].m_engMtxR, ENGMTXR_SIZE );
128 
129  // ENGTYP - Value Type of Engineering Data Element.
130  out.write( (char*)(&m_data[i].m_engTyp), ENGTYP_SIZE );
131 
132  // ENGDTS - Engineering Data Element Size
133  out.write((char*)(&m_data[i].m_engDts), ENGDTS_SIZE );
134 
135  // ENGDATU - Engineering Data Units.
136  out.write( m_data[i].m_engDatU, ENGDATU_SIZE );
137 
138  // ENGDATC - Engineering Data Count
139  out.write( m_data[i].m_engDatC, ENGDATC_SIZE );
140 
141  // ENGDATA - Engineering Data NOTE: should be big endian...
142  out.write((char*)&(m_data[i].m_engDat.front()),
143  (std::streamsize)m_data[i].m_engDat.size());
144 
145  } // Matches: for (ossim_uint16 i = 0; i < ELEMENT_COUNT; ++i)
146 
147 }
148 
150 {
151  // BCS-N's to '0's, BCS-A's to ' '(spaces)
152 
153  // clear
154  memset(m_reSrc, ' ', RESRC_SIZE);
155  memset(m_reCnt, ' ', RECNT_SIZE);
156  m_data.clear();
157 
158  // null terminate
159  m_reSrc[RESRC_SIZE] = '\0';
160  m_reCnt[RECNT_SIZE] = '\0';
161 }
162 
164  std::ostream& out, const std::string& prefix) const
165 {
166  std::string pfx = prefix;
167  pfx += getTagName();
168  pfx += ".";
169 
170  const ossim_uint32 W = 17;
171 
172  out << setiosflags(std::ios::left)
173  << pfx << std::setw(W) << "CETAG:"
174  << getTagName() << "\n"
175  << pfx << std::setw(W) << "CEL:" << getSizeInBytes() << "\n"
176  << pfx << std::setw(W) << "RESRC:" << m_reSrc << "\n"
177  << pfx << std::setw(W) << "RECNT:" << m_reCnt << "\n";
178 
179  for (ossim_uint32 i = 0; i < m_data.size(); ++i)
180  {
181  out << pfx << "ENGLN[" << i << std::setw(W-7) << "]:"
182  << m_data[i].m_engLn << "\n"
183  << pfx << "ENGLBL[" << i << std::setw(W-8) << "]:"
184  << m_data[i].m_engLbl << "\n"
185  << pfx << "ENGMTXC[" << i << std::setw(W-9) << "]:"
186  << m_data[i].m_engMtxC << "\n"
187  << pfx << "ENGMTXR[" << i << std::setw(W-9) << "]:"
188  << m_data[i].m_engMtxR << "\n"
189  << pfx << "ENGTYP[" << i << std::setw(W-8) << "]:"
190  << std::string(1, m_data[i].m_engTyp) << "\n"
191  << pfx << "ENGDTS[" << i << std::setw(W-8) << "]:"
192  << std::string(1, m_data[i].m_engDts) << "\n"
193  << pfx << "ENGDATU[" << i << std::setw(W-9) << "]:"
194  << m_data[i].m_engDatU << "\n"
195  << pfx << "ENGDATC[" << i << std::setw(W-9) << "]:"
196  << m_data[i].m_engDat.size() << "\n";
197 
198  printData(out, m_data[i], i, pfx);
199  }
200 
201  return out;
202 }
203 
205  const ossimEngDataElement& element,
206  ossim_uint32 elIndex,
207  const std::string& prefix ) const
208 {
209  if (element.m_engTyp == 'A')
210  {
211  out << prefix << "ENGDATA[" << elIndex << std::setw(8) << "]:";
212 
213  std::vector<ossim_uint8>::const_iterator i = element.m_engDat.begin();
214  while (i != element.m_engDat.end())
215  {
216  out << static_cast<ossim_int8>(*i);
217  ++i;
218  }
219  out << "\n";
220  }
221  else
222  {
223  out << prefix << "ENGDATA[" << elIndex << std::setw(8) << "]: NOT DISPLAYED\n";
224  if ( traceDebug() )
225  {
227  << "ossimNitfEngrdaTag::printData WARNING unhandled data type."
228  << "Data type = " << (char)element.m_engTyp << "\n"
229  << std::endl;
230  }
231  }
232  return out;
233 }
234 
235 template <class T>
237  T v, ossim_uint16 w, std::string& s) const
238 {
240  os << std::setw(w) << std::setfill('0') << setiosflags(ios::right) << v;
241  s = os.str();
242 }
243 
virtual const std::string & getTagName() const
This will return the name of the registered tag for this user defined header.
virtual void clearFields()
Method to clear all fields including null terminating.
std::basic_ostringstream< char > ostringstream
Class for char output memory streams.
Definition: ossimIosFwd.h:35
char m_reCnt[RECNT_SIZE+1]
FIELD: RECNT.
char m_engLn[ENGLN_SIZE+1]
FIELD: ENGLN.
std::vector< ossimEngDataElement > m_data
ossim_uint32 toUInt32() const
unsigned short ossim_uint16
char m_engDatC[ENGDATC_SIZE+1]
FIELD: ENGDATC.
std::vector< ossim_uint8 > m_engDat
ENGDATA - data.
Container class for an Engineering Data Element Record.
ossimNitfEngrdaTag()
default constructor
char m_reSrc[RESRC_SIZE+1]
Type R = Required Type <R> = BCS spaces allowed for entire field.
virtual ~ossimNitfEngrdaTag()
destructor
std::ostream & printData(std::ostream &out, const ossimEngDataElement &element, ossim_uint32 elIndex, const std::string &prefix) const
Method to print out a ossimEngDataElement object.
yy_size_t size
void getValueAsString(T v, ossim_uint16 w, std::string &s) const
Method to convert value to a string, padding with zero&#39;s, left justified.
unsigned int ossim_uint32
char m_engDatU[ENGDATU_SIZE+1]
FIELD: ENGDATU.
RTTI_DEF1(ossimNitfEngrdaTag, "ossimNitfEngrdaTag", ossimNitfRegisteredTag)
virtual void parseStream(std::istream &in)
Method to parse data from stream.
ossim_uint16 toUInt16() const
virtual std::ostream & print(std::ostream &out, const std::string &prefix=std::string()) const
Print method that outputs a key/value type format adding prefix to keys.
std::basic_istream< char > istream
Base class for char input streams.
Definition: ossimIosFwd.h:20
virtual ossim_uint32 getSizeInBytes() const
Returns the length in bytes of the tag from the CEL or REL field.
char m_engMtxR[ENGMTXR_SIZE+1]
FIELD: ENGMTXR.
char m_engMtxC[ENGMTXC_SIZE+1]
FIELD: ENGMTXC.
virtual void writeStream(std::ostream &out)
Method to write data to stream.
OSSIMDLLEXPORT std::ostream & ossimNotify(ossimNotifyLevel level=ossimNotifyLevel_WARN)
std::basic_ostream< char > ostream
Base class for char output streams.
Definition: ossimIosFwd.h:23