OSSIM - Open Source Software Image Map  Version 1.9.0 (20180803)
ossimNitfDesInformation.cpp
Go to the documentation of this file.
1 //*******************************************************************
2 //
3 // LICENSE: LGPL see top level LICENSE.txt
4 //
5 // Author:
6 // Description: Nitf support class
7 //
8 //********************************************************************
9 // $Id: ossimNitfDesInformation.cpp 23569 2015-10-05 19:32:00Z dburken $
10 
12 #include <ossim/base/ossimCommon.h>
13 #include <ossim/base/ossimNotify.h>
16 #include <sstream>
17 #include <iomanip>
18 #include <cstring> // for memset
19 
21 {
22  clearFields();
23  setDesData(desData);
24 }
25 
27 {
28 }
29 
31 {
32  if(in)
33  {
34  clearFields();
35  m_desOffset = in.tellg();
36  in.read(m_de, DE_SIZE);
37  in.read(m_desid, DESID_SIZE);
38  in.read(m_desver, DESVER_SIZE);
39  in.read(m_declas, DECLAS_SIZE);
40  in.read(m_desclsy, DESCLSY_SIZE);
41  in.read(m_descode, DESCODE_SIZE);
42  in.read(m_desctlh, DESCTLH_SIZE);
43  in.read(m_desrel, DESREL_SIZE);
44  in.read(m_desdctp, DESDCTP_SIZE);
45  in.read(m_desdcdt, DESDCDT_SIZE);
46  in.read(m_desdcxm, DESDCXM_SIZE);
47  in.read(m_desdg, DESDG_SIZE);
48  in.read(m_desdgdt, DESDGDT_SIZE);
49  in.read(m_descltx, DESCLTX_SIZE);
50  in.read(m_descatp, DESCATP_SIZE);
51  in.read(m_descaut, DESCAUT_SIZE);
52  in.read(m_descrsn, DESCRSN_SIZE);
53  in.read(m_dessrdt, DESSRDT_SIZE);
54  in.read(m_desctln, DESCTLN_SIZE);
55  if (getDesId() == "TRE_OVERFLOW")
56  {
57  in.read(m_desoflw, DESOFLW_SIZE);
58  in.read(m_desitem, DESITEM_SIZE);
59  }
60  in.read(m_desshl, DESSHL_SIZE);
61 
62  m_desDataOffset = in.tellg();
63 
65 
66  if (m_desData.valid())
67  {
68  /*
69  if (m_desData->getClassName() == "ossimNitfUnknownDes")
70  {
71  // Unknown des doesn't know his des name yet.
72  m_desData->setDesName( getDesId() );
73  }
74  */
75 
76  //---
77  // Dess with dynamic des length construct with 0 length.
78  // Set if 0.
79  //---
80  if ( m_desData->getDesLength() == 0 )
81  {
82  m_desData->setDesLength( dataLength );
83  }
84  // Sanity check fixed length in code with length from CEL field:
85  else if ( m_desData->getDesLength() != getDesLength() )
86  {
88  << "ossimNitfDesInformation::parseStream WARNING!"
89  << "\nCEL field length does not match fixed des length for des: "
90  << m_desData->getDesName().c_str()
91  << "\nCEL: " << getDesLength()
92  << "\nDes: " << m_desData->getDesLength()
93  << std::endl;
94  }
95 
97  }
98  else
99  {
101  }
102  }
103 }
104 
106 {
107  m_desOffset = out.tellp(); // Capture the offset.
108 
109  out.write(m_de, DE_SIZE);
110  out.write(m_desid, DESID_SIZE);
111  out.write(m_desver, DESVER_SIZE);
112  out.write(m_declas, DECLAS_SIZE);
113  out.write(m_desclsy, DESCLSY_SIZE);
114  out.write(m_descode, DESCODE_SIZE);
115  out.write(m_desctlh, DESCTLH_SIZE);
116  out.write(m_desrel, DESREL_SIZE);
117  out.write(m_desdctp, DESDCTP_SIZE);
118  out.write(m_desdcdt, DESDCDT_SIZE);
119  out.write(m_desdcxm, DESDCXM_SIZE);
120  out.write(m_desdg, DESDG_SIZE);
121  out.write(m_desdgdt, DESDGDT_SIZE);
122  out.write(m_descltx, DESCLTX_SIZE);
123  out.write(m_descatp, DESCATP_SIZE);
124  out.write(m_descaut, DESCAUT_SIZE);
125  out.write(m_descrsn, DESCRSN_SIZE);
126  out.write(m_dessrdt, DESSRDT_SIZE);
127  out.write(m_desctln, DESCTLN_SIZE);
128  if (getDesId() == "TRE_OVERFLOW")
129  {
130  out.write(m_desoflw, DESOFLW_SIZE);
131  out.write(m_desitem, DESITEM_SIZE);
132  }
133  out.write(m_desshl, DESSHL_SIZE);
134 
135 
136  //out.write(m_desLength, 5);
137  /*
138  if(m_desData.valid())
139  {
140  m_desData = out.tellp();
141  m_desData->writeStream(out);
142  }
143  */
144 }
145 
147 {
148  return (getDesLength() + (ossim_uint32)11);
149 }
150 
152 {
153  return ossimString(m_desLength).toUInt32();
154 }
155 
157 {
158  return m_desOffset;
159 }
160 
162 {
163  return m_desDataOffset;
164 }
165 
167 {
168  return ossimString(m_desid).trim();
169 }
170 
171 std::ostream& ossimNitfDesInformation::print(std::ostream& out, const std::string& prefix)const
172 {
173  bool typeinfo = ossimString(ossimPreferences::instance()->findPreference("kwl_type_info")).toBool();
174 
175  std::string pfx = prefix + getDesId() + ".";
176 
177  out << setiosflags(ios::left)
178  << pfx << std::setw(24) << "DE:" << ((typeinfo) ? "(string)" : "") << m_de << "\n"
179  << pfx << std::setw(24) << "DESID:" << ((typeinfo) ? "(string)" : "") << m_desid << "\n"
180  << pfx << std::setw(24) << "DESVER:" << ((typeinfo) ? "(string)" : "") << m_desver << "\n"
181  << pfx << std::setw(24) << "DECLAS:" << ((typeinfo) ? "(string)" : "") << m_declas << "\n"
182  << pfx << std::setw(24) << "DESCLSY:" << ((typeinfo) ? "(string)" : "") << m_desclsy << "\n"
183  << pfx << std::setw(24) << "DESCODE:" << ((typeinfo) ? "(string)" : "") << m_descode << "\n"
184  << pfx << std::setw(24) << "DESCTLH:" << ((typeinfo) ? "(string)" : "") << m_desctlh << "\n"
185  << pfx << std::setw(24) << "DESREL:" << ((typeinfo) ? "(string)" : "") << m_desrel << "\n"
186  << pfx << std::setw(24) << "DESDCTP:" << ((typeinfo) ? "(string)" : "") << m_desdctp << "\n"
187  << pfx << std::setw(24) << "DESDCDT:" << ((typeinfo) ? "(string)" : "") << m_desdcdt << "\n"
188  << pfx << std::setw(24) << "DESDCXM:" << ((typeinfo) ? "(string)" : "") << m_desdcxm << "\n"
189  << pfx << std::setw(24) << "DESDG:" << ((typeinfo) ? "(string)" : "") << m_desdg << "\n"
190  << pfx << std::setw(24) << "DESDGDT:" << ((typeinfo) ? "(string)" : "") << m_desdgdt << "\n"
191  << pfx << std::setw(24) << "DESCLTX:" << ((typeinfo) ? "" : "") << m_descltx << "\n"
192  << pfx << std::setw(24) << "DESCATP:" << ((typeinfo) ? "(string)" : "") << m_descatp << "\n"
193  << pfx << std::setw(24) << "DESCAUT:" << ((typeinfo) ? "(string)" : "") << m_descaut << "\n"
194  << pfx << std::setw(24) << "DESCRSN:" << ((typeinfo) ? "(string)" : "") << m_descrsn << "\n"
195  << pfx << std::setw(24) << "DESSRDT:" << ((typeinfo) ? "(string)" : "") << m_dessrdt << "\n"
196  << pfx << std::setw(24) << "DESCTLN:" << ((typeinfo) ? "(string)" : "") << m_desctln << "\n"
197  ;
198  if (getDesId() == "TRE_OVERFLOW")
199  {
200  out
201  << pfx << std::setw(24) << "DESOFLW:" << ((typeinfo) ? "(string)" : "") << m_desoflw << "\n"
202  << pfx << std::setw(24) << "DESITEM:" << ((typeinfo) ? "(string)" : "") << m_desitem << "\n"
203  ;
204  }
205 
206  out
207  << pfx << std::setw(24) << "DESSHL:" << ((typeinfo) ? "(string)" : "") << m_desshl << "\n"
208  ;
209 
210  if (getDesData().valid())
211  {
212  getDesData()->print(out, prefix);
213  }
214 
215  return out;
216 }
217 
219 {
220  memset(m_de, ' ', DE_SIZE);
221  m_de[DE_SIZE] = '\0';
222  memset(m_desid, ' ', DESID_SIZE);
223  m_desid[DESID_SIZE] = '\0';
224  memset(m_desver, ' ', DESVER_SIZE);
225  m_desver[DESVER_SIZE] = '\0';
226  memset(m_declas, ' ', DECLAS_SIZE);
227  m_declas[DECLAS_SIZE] = '\0';
228  memset(m_desclsy, ' ', DESCLSY_SIZE);
229  m_desclsy[DESCLSY_SIZE] = '\0';
230  memset(m_descode, ' ', DESCODE_SIZE);
231  m_descode[DESCODE_SIZE] = '\0';
232  memset(m_desctlh, ' ', DESCTLH_SIZE);
233  m_desctlh[DESCTLH_SIZE] = '\0';
234  memset(m_desrel, ' ', DESREL_SIZE);
235  m_desrel[DESREL_SIZE] = '\0';
236  memset(m_desdctp, ' ', DESDCTP_SIZE);
237  m_desdctp[DESDCTP_SIZE] = '\0';
238  memset(m_desdcdt, ' ', DESDCDT_SIZE);
239  m_desdcdt[DESDCDT_SIZE] = '\0';
240  memset(m_desdcxm, ' ', DESDCXM_SIZE);
241  m_desdcxm[DESDCXM_SIZE] = '\0';
242  memset(m_desdg, ' ', DESDG_SIZE);
243  m_desdg[DESDG_SIZE] = '\0';
244  memset(m_desdgdt, ' ', DESDGDT_SIZE);
245  m_desdgdt[DESDGDT_SIZE] = '\0';
246  memset(m_descltx, ' ', DESCLTX_SIZE);
247  m_descltx[DESCLTX_SIZE] = '\0';
248  memset(m_descatp, ' ', DESCATP_SIZE);
249  m_descatp[DESCATP_SIZE] = '\0';
250  memset(m_descaut, ' ', DESCAUT_SIZE);
251  m_descaut[DESCAUT_SIZE] = '\0';
252  memset(m_descrsn, ' ', DESCRSN_SIZE);
253  m_descrsn[DESCRSN_SIZE] = '\0';
254  memset(m_dessrdt, ' ', DESSRDT_SIZE);
255  m_dessrdt[DESSRDT_SIZE] = '\0';
256  memset(m_desctln, ' ', DESCTLN_SIZE);
257  m_desctln[DESCTLN_SIZE] = '\0';
258  memset(m_desoflw, ' ', DESOFLW_SIZE);
259  m_desoflw[DESOFLW_SIZE] = '\0';
260  memset(m_desitem, ' ', DESITEM_SIZE);
261  m_desitem[DESITEM_SIZE] = '\0';
262  memset(m_desshl, ' ', DESSHL_SIZE);
263  m_desshl[DESSHL_SIZE] = '\0';
264 
265  m_desOffset = 0;
266  m_desDataOffset = 0;
267 }
268 
270 {
271  memset(m_desid, ' ', DESID_SIZE);
272 
273  std::ostringstream out;
274 
275  out << std::setw(DESID_SIZE)
276  << std::setfill(' ')
277  << m_desid;
278  memcpy(m_desid, out.str().c_str(), DESID_SIZE);
279 }
280 
282 {
283  /*
284  memset(m_desLength, 0, 5);
285 
286  if(desLength > 99999)
287  {
288  desLength = 99999;
289  }
290 
291  std::ostringstream out;
292 
293  out << std::setw(5)
294  << std::setfill('0')
295  << desLength;
296 
297  memcpy(m_desLength, out.str().c_str(), 5);
298  */
299 }
300 
302 {
303  return m_desData;
304 }
305 
307 {
308  return m_desData;
309 }
310 
312 {
313  m_desData = desData;
314 
315  /*
316  memset(m_desid, ' ', DESID_SIZE);
317  memset(m_desLength, ' ', 5);
318 
319  if(m_desData.valid())
320  {
321  setDesName(m_desData->getRegisterDesName());
322  setDesLength(m_desData->getSizeInBytes());
323  }
324  */
325 }
virtual ossim_uint32 getDesLength() const
Returns the length in bytes of the des from the CEL or REL field.
std::basic_ostringstream< char > ostringstream
Class for char output memory streams.
Definition: ossimIosFwd.h:35
char m_descltx[DESCLTX_SIZE+1]
bool valid() const
Definition: ossimRefPtr.h:75
virtual std::ostream & print(std::ostream &out, const std::string &prefix) const
ossim_uint64 m_desOffset
This will hold the offset to the start of the above information This is just a work variable...
char m_dessrdt[DESSRDT_SIZE+1]
ossimRefPtr< ossimNitfRegisteredDes > getDesData()
ossim_uint32 toUInt32() const
virtual std::ostream & print(std::ostream &out, const std::string &prefix=std::string()) const
Pure virtual print method that outputs a key/value type format adding prefix to keys.
ossimRefPtr< ossimNitfRegisteredDes > m_desData
Used to hold the des data.
virtual void setDesLength(ossim_uint32 length)
Set the des length.
void setDesLength(ossim_uint32 desLength)
char m_descode[DESCODE_SIZE+1]
ossimRefPtr< ossimNitfRegisteredDes > create(const ossimString &desName) const
char m_descrsn[DESCRSN_SIZE+1]
bool toBool() const
String to numeric methods.
unsigned long long ossim_uint64
virtual const std::string & getDesName() const
This will return the name of the registered des for this user defined header.
unsigned int ossim_uint32
ossimString trim(const ossimString &valueToTrim=ossimString(" \\)) const
this will strip lead and trailing character passed in.
char m_desctln[DESCTLN_SIZE+1]
char m_desdgdt[DESDGDT_SIZE+1]
ossim_uint32 getDesLength() const
Should return the value of theDesLength which is the length of the data in bytes. ...
char m_desdctp[DESDCTP_SIZE+1]
char m_desoflw[DESOFLW_SIZE+1]
virtual void parseStream(std::istream &in, ossim_uint64 dataLength=0)
static ossimPreferences * instance()
static ossimNitfDesFactoryRegistry * instance()
char m_desdcdt[DESDCDT_SIZE+1]
char m_desitem[DESITEM_SIZE+1]
std::basic_istream< char > istream
Base class for char input streams.
Definition: ossimIosFwd.h:20
ossimNitfDesInformation(ossimRefPtr< ossimNitfRegisteredDes > desData=0)
char m_desdcxm[DESDCXM_SIZE+1]
char m_desclsy[DESCLSY_SIZE+1]
ossim_uint64 m_desDataOffset
This will hold the start to the data.
ossim_uint32 getTotalDesLength() const
Length of the 5 byte des length the 6 byte des name and the data length.
void setDesName(const ossimString &desName)
virtual void writeStream(std::ostream &out)
ossim_uint64 getDesDataOffset() const
virtual void parseStream(std::istream &in)=0
This will allow the user defined data to parse the stream.
char m_descatp[DESCATP_SIZE+1]
void setDesData(ossimRefPtr< ossimNitfRegisteredDes > desData)
char m_descaut[DESCAUT_SIZE+1]
OSSIMDLLEXPORT std::ostream & ossimNotify(ossimNotifyLevel level=ossimNotifyLevel_WARN)
std::basic_ostream< char > ostream
Base class for char output streams.
Definition: ossimIosFwd.h:23
char m_desctlh[DESCTLH_SIZE+1]