OSSIM - Open Source Software Image Map  Version 1.9.0 (20180803)
ossimNitfHistoaTag.cpp
Go to the documentation of this file.
1 //----------------------------------------------------------------------------
2 //
3 // License: See top level LICENSE.txt file.
4 //
5 // Author: Garrett Potts
6 //
7 // Description: HISTOA tag class definition.
8 //
9 //----------------------------------------------------------------------------
10 // $Id: ossimNitfHistoaTag.cpp 23245 2015-04-08 20:53:04Z rashadkm $
11 
13 #include <ossim/base/ossimCommon.h>
14 #include <ossim/base/ossimString.h>
15 #include <iomanip>
16 
18 {
19  clearFields();
20 }
21 
23 {
25 
26  if ( (*m_nIpcom != '0') && m_comment.size() )
27  {
28  sizeInBytes += ( m_comment.size() * IPCOM_SIZE );
29  }
30 
31  sizeInBytes += (IBPP_SIZE + IPVTYPE_SIZE + INBWC_SIZE +
33 
34  if(*m_rotFlag == '1')
35  {
36  sizeInBytes += ROT_ANGLE_SIZE;
37  }
38 
39  sizeInBytes += ASYM_FLAG_SIZE;
40  if(*m_asymFlag == '1')
41  {
42  sizeInBytes += (ZOOMROW_SIZE + ZOOMCOL_SIZE);
43  }
44 
45  sizeInBytes += ( PROJ_FLAG_SIZE + SHARP_FLAG_SIZE );
46  if(*m_sharpFlag == '1')
47  {
48  sizeInBytes += (SHARPFAM_SIZE + SHARPMEM_SIZE);
49  }
50 
51  sizeInBytes += MAG_FLAG_SIZE;
52  if(*m_magFlag == '1')
53  {
54  sizeInBytes += MAG_LEVEL_SIZE;
55  }
56 
57  sizeInBytes += DRA_FLAG_SIZE;
58  if(*m_draFlag == '1')
59  {
60  sizeInBytes += (DRA_MULT_SIZE + DRA_SUB_SIZE);
61  }
62 
63  sizeInBytes += TTC_FLAG_SIZE;
64  if(*m_ttcFlag == '1')
65  {
66  sizeInBytes += (TTCFAM_SIZE + TTCMEM_SIZE);
67  }
68 
70 
71  return sizeInBytes;
72 }
73 
75 {
76  clearFields();
77 
78  in.read(m_pdate, PDATE_SIZE);
79  in.read(m_psite, PSITE_SIZE);
80  in.read(m_pas, PAS_SIZE);
81  in.read(m_nIpcom, NIPCOM_SIZE);
83  if(nIpcom < 10)
84  {
85  ossim_uint32 idx = 0;
86  for(;idx < nIpcom;++idx)
87  {
88  char tempBuf[IPCOM_SIZE+1];
89  in.read(tempBuf, IPCOM_SIZE);
90  tempBuf[IPCOM_SIZE] = '\0';
91 
92  // m_comment += std::string(tempBuf, tempBuf + 80);
93 
94  m_comment.push_back( std::string(tempBuf) );
95  }
96  }
97  in.read(m_ibpp, IBPP_SIZE);
98  in.read(m_ipvType, IPVTYPE_SIZE);
99 
100  in.read(m_inbwc, INBWC_SIZE);
101  in.read(m_dispFlag, DISP_FLAG_SIZE);
102  in.read(m_rotFlag, ROT_FLAG_SIZE);
103  if(*m_rotFlag =='1')
104  {
105  in.read(m_rotAngle, ROT_ANGLE_SIZE);
106  }
107 
108  in.read(m_asymFlag, ASYM_FLAG_SIZE);
109  if(ossimString(m_asymFlag).toBool())
110  {
111  in.read(m_zoomRow, ZOOMROW_SIZE);
112  in.read(m_zoomCol, ZOOMCOL_SIZE);
113  }
114 
115  in.read(m_projFlag, PROJ_FLAG_SIZE);
116  in.read(m_sharpFlag, SHARP_FLAG_SIZE);
117  if(ossimString(m_sharpFlag).toBool())
118  {
119  in.read(m_sharpFam, SHARPFAM_SIZE);
120  in.read(m_sharpMem, SHARPMEM_SIZE);
121  }
122 
123  in.read(m_magFlag, MAG_FLAG_SIZE);
124  if(ossimString(m_magFlag).toBool())
125  {
126  in.read(m_magLevel, MAG_LEVEL_SIZE);
127  }
128 
129  in.read(m_draFlag, DRA_FLAG_SIZE);
130  if(ossimString(m_draFlag).toBool())
131  {
132  in.read(m_draMult, DRA_MULT_SIZE);
133  in.read(m_draSub, DRA_SUB_SIZE);
134  }
135 
136  in.read(m_ttcFlag, TTC_FLAG_SIZE);
137  if(ossimString(m_ttcFlag).toBool())
138  {
139  in.read(m_ttcFam, TTCFAM_SIZE);
140  in.read(m_ttcMem, TTCMEM_SIZE);
141  }
142 
143  in.read(m_devLutFlag, DEVLUT_FLAG_SIZE);
144  in.read(m_obpp, OBPP_SIZE);
145  in.read(m_opvType, OPVTYPE_SIZE);
146  in.read(m_outBwc, OUTBWC_SIZE);
147 }
148 
150 {
151  out.write(m_pdate, PDATE_SIZE);
152  out.write(m_psite, PSITE_SIZE);
153  out.write(m_pas, PAS_SIZE);
154  out.write(m_nIpcom, NIPCOM_SIZE);
156  if( (nIpcom > 0) && (nIpcom < 10) )
157  {
158  for( ossim_uint32 i = 0; i < nIpcom; ++i )
159  {
160  // Should size check std::string or make set method that ensures 80 chars.
161  out.write( m_comment[i].data(), IPCOM_SIZE );
162  }
163  }
164  out.write(m_ibpp, IBPP_SIZE);
165  out.write(m_ipvType, IPVTYPE_SIZE);
166 
167  out.write(m_inbwc, INBWC_SIZE);
168  out.write(m_dispFlag, DISP_FLAG_SIZE);
169  out.write(m_rotFlag, ROT_FLAG_SIZE);
170  if(*m_rotFlag =='1')
171  {
172  out.write(m_rotAngle, ROT_ANGLE_SIZE);
173  }
174  out.write(m_asymFlag, ASYM_FLAG_SIZE);
175  if(*m_asymFlag == '1')
176  {
177  out.write(m_zoomRow, ZOOMROW_SIZE);
178  out.write(m_zoomCol, ZOOMCOL_SIZE);
179  }
180  out.write(m_projFlag, PROJ_FLAG_SIZE);
181  out.write(m_sharpFlag, SHARP_FLAG_SIZE);
182  if(*m_sharpFlag == '1')
183  {
184  out.write(m_sharpFam, SHARPFAM_SIZE);
185  out.write(m_sharpMem, SHARPMEM_SIZE);
186  }
187  out.write(m_magFlag, MAG_FLAG_SIZE);
188  if(*m_magFlag == '1')
189  {
190  out.write(m_magLevel, MAG_LEVEL_SIZE);
191  }
192  out.write(m_draFlag, DRA_FLAG_SIZE);
193  if(*m_draFlag == '1')
194  {
195  out.write(m_draMult, DRA_MULT_SIZE);
196  out.write(m_draSub, DRA_SUB_SIZE);
197  }
198  out.write(m_ttcFlag, TTC_FLAG_SIZE);
199  if(*m_ttcFlag == '1')
200  {
201  out.write(m_ttcFam, TTCFAM_SIZE);
202  out.write(m_ttcMem, TTCMEM_SIZE);
203  }
204  out.write(m_devLutFlag, DEVLUT_FLAG_SIZE);
205  out.write(m_obpp, OBPP_SIZE);
206  out.write(m_opvType, OPVTYPE_SIZE);
207  out.write(m_outBwc, OUTBWC_SIZE);
208 }
209 
211  const std::string& prefix) const
212 {
213  std::string pfx = prefix;
214  pfx += ".";
215 
216  out << setiosflags(std::ios::left)
217  << pfx << std::setw(24) << "PDATE:" << m_pdate << "\n"
218  << pfx << std::setw(24) << "PSITE:" << m_psite << "\n"
219  << pfx << std::setw(24) << "PAS:" << m_pas << "\n"
220  << pfx << std::setw(24) << "NIPCOM:" << m_nIpcom << "\n";
222  if( ( nIpcom > 0 ) && ( nIpcom < 10 ) )
223  {
224  for( ossim_uint32 i = 0; i < nIpcom; ++i )
225  {
226  std::string s = "IPCOM";
227 
228  //---
229  // NOTE:
230  // Doing s += ossimString::toString( i ).string() core dumping linux gcc version 4.7.0.
231  //---
232  std::string s2 = ossimString::toString( i ).string();
233  s += s2;
234  s += ":";
235  out << pfx << std::setw(24) << s.c_str();
236  out.write( m_comment[i].data(), IPCOM_SIZE );
237  out << "\n";
238  }
239  }
240 
241  out << setiosflags(std::ios::left)
242  << pfx << std::setw(24) << "IBPP:" << m_ibpp << "\n"
243  << pfx << std::setw(24) << "IPVTYPE:" << m_ipvType << "\n"
244  << pfx << std::setw(24) << "INBWC:" << m_inbwc << "\n"
245  << pfx << std::setw(24) << "DISP_FLAG:" << m_dispFlag << "\n"
246  << pfx << std::setw(24) << "ROT_FLAG:" << m_rotFlag << "\n";
247  if(*m_rotFlag == '1')
248  {
249  out<< pfx << std::setw(24) << "ROT_ANGLE:" << m_rotAngle << "\n";
250  }
251 
252  out<< pfx << std::setw(24) << "ASYM_FLAG:" << m_asymFlag << "\n";
253 
254  if(*m_asymFlag=='1')
255  {
256  out<< pfx << std::setw(24) << "ZOOMROW:" << m_zoomRow << "\n";
257  out<< pfx << std::setw(24) << "ZOOMCOL:" << m_zoomCol << "\n";
258  }
259  out<< pfx << std::setw(24) << "PROJ_FLAG:" << m_projFlag << "\n";
260  out<< pfx << std::setw(24) << "SHARP_FLAG:" << *m_sharpFlag << "\n";
261  if(*m_sharpFlag == '1')
262  {
263  out<< pfx << std::setw(24) << "SHARPFAM:" << m_sharpFam << "\n";
264  out<< pfx << std::setw(24) << "SHARPMEM:" << m_sharpMem << "\n";
265  }
266  out<< pfx << std::setw(24) << "MAG_FLAG:" << *m_magFlag << "\n";
267  if(*m_magFlag == '1')
268  {
269  out<< pfx << std::setw(24) << "MAG_LEVEL:" << m_magLevel << "\n";
270  }
271  out<< pfx << std::setw(24) << "DRA_FLAG:" << *m_draFlag << "\n";
272  if(*m_draFlag=='1')
273  {
274  out<< pfx << std::setw(24) << "DRA_MULT:" << m_draMult << "\n";
275  out<< pfx << std::setw(24) << "DRA_SUB:" << m_draSub << "\n";
276  }
277  out<< pfx << std::setw(24) << "TTC_FLAG:" << *m_ttcFlag << "\n";
278  if(*m_ttcFlag == '1')
279  {
280  out<< pfx << std::setw(24) << "TTCFAM:" << m_ttcFam << "\n";
281  out<< pfx << std::setw(24) << "TTCMEM:" << m_ttcMem << "\n";
282  }
283  out<< pfx << std::setw(24) << "DEVLUT_FLAG:" << *m_devLutFlag << "\n";
284  out<< pfx << std::setw(24) << "OBPP:" << m_obpp << "\n";
285  out<< pfx << std::setw(24) << "OPVTYPE:" << m_opvType << "\n";
286  out<< pfx << std::setw(24) << "OUTBWC:" << m_outBwc << "\n";
287 
288  return out;
289 }
290 
292 {
293  memset(m_pdate, ' ', PDATE_SIZE+1);
294  memset(m_psite, ' ', PSITE_SIZE+1);
295  memset(m_pas, ' ', PAS_SIZE+1);
296  memset(m_nIpcom, ' ', NIPCOM_SIZE+1);
297  memset(m_ibpp, ' ', IBPP_SIZE+1);
298  memset(m_ipvType, ' ', IPVTYPE_SIZE+1);
299 
300  memset(m_inbwc, ' ', INBWC_SIZE);
301  memset(m_dispFlag, 0, DISP_FLAG_SIZE);
302  memset(m_rotFlag, 0, DISP_FLAG_SIZE);
303  memset(m_rotAngle, 0, ROT_ANGLE_SIZE);
304  m_rotAngle[3]='.';
305  memset(m_projFlag, 0, PROJ_FLAG_SIZE);
306  memset(m_asymFlag, 0, ASYM_FLAG_SIZE);
307  memset(m_zoomRow, 0, ZOOMROW_SIZE);
308  m_zoomRow[2]='.';
309  memset(m_zoomCol, 0, ZOOMCOL_SIZE);
310  m_zoomCol[2]='.';
311  memset(m_sharpFlag, 0, SHARP_FLAG_SIZE);
312  memset(m_sharpFam, ' ', SHARPFAM_SIZE);
313  memset(m_sharpMem, ' ', SHARPMEM_SIZE);
314  memset(m_magFlag, 0, MAG_FLAG_SIZE);
315  memset(m_magLevel, ' ', MAG_LEVEL_SIZE);
316  memset(m_draFlag, 0, DRA_FLAG_SIZE);
317  memset(m_draMult, ' ', DRA_MULT_SIZE);
318 
319  memset(m_draSub, ' ', DRA_SUB_SIZE);
320  memset(m_ttcFlag, 0, TTC_FLAG_SIZE);
321  memset(m_ttcFam, ' ', TTCFAM_SIZE);
322  memset(m_ttcMem, ' ', TTCMEM_SIZE);
323  memset(m_obpp, ' ', OBPP_SIZE);
324  memset(m_opvType, ' ', OPVTYPE_SIZE);
325  memset(m_outBwc, ' ', OUTBWC_SIZE);
326 
327  m_pdate[PDATE_SIZE] = '\0';
328  m_psite[PSITE_SIZE] = '\0';
329  m_pas[PAS_SIZE] = '\0';
330  m_nIpcom[NIPCOM_SIZE] = '\0';
331  m_ibpp[IBPP_SIZE] = '\0';
332  m_ipvType[IPVTYPE_SIZE] = '\0';
333 
334  m_comment.clear();
335 
336  m_inbwc[INBWC_SIZE] = '\0';
337  m_dispFlag[DISP_FLAG_SIZE] = '\0';
338  m_rotFlag[ROT_FLAG_SIZE] = '\0';
339  m_rotAngle[ROT_ANGLE_SIZE] = '\0';
340  m_projFlag[PROJ_FLAG_SIZE] = '\0';
341  m_asymFlag[ASYM_FLAG_SIZE] = '\0';
342  m_zoomRow[ZOOMROW_SIZE] = '\0';
343  m_zoomCol[ZOOMCOL_SIZE] = '\0';
345  m_sharpFam[SHARPFAM_SIZE] = '\0';
346  m_sharpMem[SHARPMEM_SIZE] = '\0';
347  m_magFlag[MAG_FLAG_SIZE] = '\0';
348  m_magLevel[MAG_LEVEL_SIZE] = '\0';
349  m_draFlag[DRA_FLAG_SIZE] = '\0';
350  m_draMult[DRA_MULT_SIZE] = '\0';
351  m_draSub[DRA_SUB_SIZE] = '\0';
352  m_ttcFlag[TTC_FLAG_SIZE] = '\0';
353  m_ttcFam[TTCFAM_SIZE] = '\0';
354  m_ttcMem[TTCMEM_SIZE] = '\0';
355  m_obpp[OBPP_SIZE] = '\0';
356  m_opvType[OPVTYPE_SIZE] = '\0';
357  m_outBwc[OUTBWC_SIZE] = '\0';
358 }
359 
361  : ossimNitfRegisteredTag( std::string("HISTOA"), 0 )
362 {
363 }
364 
366 {
367  clearFields();
368 
369  in.read(m_systype, SYSTYPE_SIZE);
370  in.read(m_pc, PC_SIZE);
371  in.read(m_pe, PE_SIZE);
372  in.read(m_remapFlag, REMAP_FLAG_SIZE);
373  in.read(m_lutid, LUTID_SIZE);
374  in.read(m_nEvents, NEVENTS_SIZE);
375 
377  if(nEvents < 100)
378  {
379  for(ossim_uint32 idx = 0; idx < nEvents; ++idx)
380  {
382  evt.parseStream(in);
383  m_eventList.push_back(evt);
384  }
385  }
386 
387  // Set the tag length in base for the getTagLenth method.
389 }
390 
392 {
393  out.write(m_systype, SYSTYPE_SIZE);
394  out.write(m_pc, PC_SIZE);
395  out.write(m_pe, PE_SIZE);
396  out.write(m_remapFlag, REMAP_FLAG_SIZE);
397  out.write(m_lutid, LUTID_SIZE);
398  out.write(m_nEvents, NEVENTS_SIZE);
399  ossim_uint32 idx = 0;
401  if(nEvents < 100)
402  {
403  for(;idx < nEvents; ++idx)
404  {
405  m_eventList[idx].writeStream(out);
406  }
407  }
408 }
409 
411 {
412  // Make this dynamic for constructed HISTOA tags instead of using theTagLength.
413  ossim_uint32 sizeInBytes = (SYSTYPE_SIZE + PC_SIZE + PE_SIZE +
415 
416  for ( ossim_uint32 idx = 0; idx < m_eventList.size(); ++idx)
417  {
418  sizeInBytes += m_eventList[idx].getSizeInBytes();
419  }
420 
421  return sizeInBytes;
422 }
423 
425 {
426  memset(m_systype, ' ', SYSTYPE_SIZE);
427  memset(m_pc, ' ', PC_SIZE);
428  memset(m_pe, ' ', PE_SIZE);
429  memset(m_remapFlag, ' ', REMAP_FLAG_SIZE);
430  memset(m_lutid, '0', LUTID_SIZE);
431  memset(m_nEvents, '0', NEVENTS_SIZE);
432 
433  m_systype[SYSTYPE_SIZE] = '\0';
434  m_pc[PC_SIZE] = '\0';
435  m_pe[PE_SIZE] = '\0';
437  m_lutid[LUTID_SIZE] = '\0';
438  m_nEvents[NEVENTS_SIZE] = '\0';
439  m_eventList.clear();
440 
441  // Clear the tag length in base.
442  setTagLength(0);
443 }
444 
446  const std::string& prefix) const
447 {
448  std::string pfx = prefix;
449  pfx += getTagName();
450  pfx += ".";
451 
452  out << setiosflags(std::ios::left)
453  << pfx << std::setw(24) << "CETAG:"
454  << getTagName() << "\n"
455  << pfx << std::setw(24) << "CEL:"
456  << getSizeInBytes() << "\n"
457  << pfx << std::setw(24) << "SYSTYPE:" << m_systype << "\n"
458  << pfx << std::setw(24) << "PC:" << m_pc << "\n"
459  << pfx << std::setw(24) << "PE:" << m_pe << "\n"
460  << pfx << std::setw(24) << "REMAP_FLAG:" << m_remapFlag << "\n"
461  << pfx << std::setw(24) << "LUTID:" << m_lutid << "\n"
462  << pfx << std::setw(24) << "NEVENTS:" << m_nEvents << "\n";
463  for ( ossim_uint32 idx = 0; idx < m_eventList.size(); ++idx )
464  {
465  m_eventList[idx].print(out, pfx+"EVENT"+ossimString::toString(idx));
466  }
467 
468  return out;
469 }
470 
char m_projFlag[PROJ_FLAG_SIZE+1]
Field: PROJ_FLAG.
char m_remapFlag[REMAP_FLAG_SIZE+1]
Field: REMAP_FLAG.
virtual const std::string & getTagName() const
This will return the name of the registered tag for this user defined header.
virtual void writeStream(std::ostream &out)
char m_draFlag[DRA_FLAG_SIZE+1]
Field: DRA_FLAG.
void parseStream(std::istream &in)
std::vector< ossimNitfHistoaProcessingEvent > m_eventList
char m_asymFlag[ASYM_FLAG_SIZE+1]
Field: ASYM_FLAG.
char m_magFlag[MAG_FLAG_SIZE+1]
Field MAG_FLAG.
char m_sharpFlag[SHARP_FLAG_SIZE+1]
Field: SHARP_FLAG.
static ossimString toString(bool aValue)
Numeric to string methods.
char m_pe[PE_SIZE+1]
Field: PE.
char m_magLevel[MAG_LEVEL_SIZE+1]
Field MAG_LEVEL.
char m_nEvents[NEVENTS_SIZE+1]
Field: NEVENTS.
ossim_uint32 toUInt32() const
char m_nIpcom[NIPCOM_SIZE+1]
Field: NIPCOM.
char m_ttcFam[TTCFAM_SIZE+1]
Field: TTCFAM.
virtual void setTagLength(ossim_uint32 length)
Set the tag length.
virtual ossim_uint32 getSizeInBytes() const
Returns the length in bytes of the tag from the CEL or REL field.
char m_ipvType[IPVTYPE_SIZE+1]
Field IPVTYPE.
char m_dispFlag[DISP_FLAG_SIZE+1]
Field DISPLAY_FLAG.
char m_zoomRow[ZOOMROW_SIZE+1]
Field: ZOOMROW.
std::vector< std::string > m_comment
Field IPCOM.
char m_ttcFlag[TTC_FLAG_SIZE+1]
Field: TTC_FLAG.
char m_zoomCol[ZOOMCOL_SIZE+1]
Field: ZOOMCOL.
virtual void clearFields()
char m_rotAngle[ROT_ANGLE_SIZE+1]
Field: ROT_ANGLE.
char m_draSub[DRA_SUB_SIZE+1]
Field: DRA_SUB.
char m_devLutFlag[DEVLUT_FLAG_SIZE+1]
Field: DEVLUT_FLAG.
unsigned int ossim_uint32
All comments in this document were taken from the online resource found at:
char m_sharpMem[SHARPMEM_SIZE+1]
Field: SHARPMEM.
void writeStream(std::ostream &out)
virtual void parseStream(std::istream &in)
This will allow the user defined data to parse the stream.
char m_outBwc[OUTBWC_SIZE+1]
Field: OUTBWC.
char m_inbwc[INBWC_SIZE+1]
Field INBWC.
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.
char m_pc[PC_SIZE+1]
Field: PC.
char m_pas[PAS_SIZE+1]
Field: PAS.
std::basic_istream< char > istream
Base class for char input streams.
Definition: ossimIosFwd.h:20
char m_lutid[LUTID_SIZE+1]
Field: LUTID.
char m_rotFlag[ROT_FLAG_SIZE+1]
Field ROT_FLAG.
std::ostream & print(std::ostream &out, const std::string &prefix=std::string()) const
char m_sharpFam[SHARPFAM_SIZE+1]
Field: SHARPFAM.
char m_pdate[PDATE_SIZE+1]
Field: PDATE.
char m_opvType[OPVTYPE_SIZE+1]
Field: OPVTYPE.
char m_ibpp[IBPP_SIZE+1]
Field: IBPP.
char m_draMult[DRA_MULT_SIZE+1]
Field: DRA_MULT.
char m_systype[SYSTYPE_SIZE+1]
Field: SYSTYPE.
std::basic_ostream< char > ostream
Base class for char output streams.
Definition: ossimIosFwd.h:23
char m_psite[PSITE_SIZE+1]
Field: PSITE.
const std::string & string() const
Definition: ossimString.h:414
char m_ttcMem[TTCMEM_SIZE+1]
Field: TTCMEM.
char m_obpp[OBPP_SIZE+1]
Field OBPP.