00001
00023 #ifndef INC_MI32_HDF4_H
00024 #define INC_MI32_HDF4_H
00025
00026 #ifndef INC_MI32_SIMPLEAR_H
00027 #include <mi32/simplear.h>
00028 #endif
00029
00030 #ifndef INC_MI32_FIXEDSTRCHAR_H
00031 #include <mi32/fixedstrchar.h>
00032 #endif
00033
00034
00035 #ifndef GENERATING_DOXYGEN_OUTPUT
00036 class FILEPATH;
00037 class BITSET;
00038 #endif
00039
00040
00042 enum HDF4_OBJTYPE {
00043 HDF4_OBJTYPE_Group = 0,
00044 HDF4_OBJTYPE_Array = 1,
00045 HDF4_OBJTYPE_Table = 2,
00046 HDF4_OBJTYPE_Raster = 3,
00047 HDF4_OBJTYPE_NUMTYPES
00048 };
00049
00051 enum HDF4_VALTYPE {
00052 HDF4_VALTYPE_None = 0,
00053 HDF4_VALTYPE_UCHAR8 = 3,
00054 HDF4_VALTYPE_CHAR8 = 4,
00055 HDF4_VALTYPE_FLOAT32 = 5,
00056 HDF4_VALTYPE_FLOAT64 = 6,
00057 HDF4_VALTYPE_INT8 = 20,
00058 HDF4_VALTYPE_UINT8 = 21,
00059 HDF4_VALTYPE_INT16 = 22,
00060 HDF4_VALTYPE_UINT16 = 23,
00061 HDF4_VALTYPE_INT32 = 24,
00062 HDF4_VALTYPE_UINT32 = 25,
00063 HDF4_VALTYPE_INT64 = 26,
00064 HDF4_VALTYPE_UINT64 = 27,
00065 };
00066
00067
00068 #ifndef GENERATING_DOXYGEN_OUTPUT
00069 class HDF4_FILE_PRIV;
00070 class HDF4_RECORD;
00071 #endif
00072
00073 class HDF4_NAME : public FIXEDSTRCHAR<256> {
00074 private:
00075 #ifndef GENERATING_DOXYGEN_OUTPUT
00077 char * GetStr () { return (m_String); }
00078
00079 friend class HDF4_GROUP;
00080 friend class HDF4_ARRAY;
00081 friend class HDF4_RASTER;
00082 friend class HDF4_TABLE;
00083 #endif // GENERATING_DOXYGEN_OUTPUT
00084 };
00085
00086 class HDF4_FILE {
00087 public:
00088
00090 HDF4_FILE (
00091 ): m_pPriv(0) { }
00092
00094 HDF4_FILE (
00095 const HDF4_FILE& rhs
00096 );
00097
00099 ~HDF4_FILE (
00100 );
00101
00103 HDF4_FILE& operator= (
00104 const HDF4_FILE& rhs
00105 );
00106
00108 void Close (
00109 );
00110
00112 bool IsOpen (
00113 ) const { return (m_pPriv != 0); };
00114
00116 ERRVALUE Open (
00117 const FILEPATH& filepath
00118 );
00119
00120 private:
00121 #ifndef GENERATING_DOXYGEN_OUTPUT
00122 HDF4_FILE_PRIV *m_pPriv;
00123
00124 friend class HDF4_GROUP;
00125 friend class HDF4_ARRAY;
00126 friend class HDF4_RASTER;
00127 friend class HDF4_TABLE;
00128 #endif // GENERATING_DOXYGEN_OUTPUT
00129 };
00130
00131
00132 class HDF4_ATTRIB {
00133 public:
00134
00136 HDF4_ATTRIB (
00137 );
00138
00140 int GetCount (
00141 ) const { return (m_count); }
00142
00144 const char *GetName (
00145 ) const { return (m_name); }
00146
00148 ERRVALUE GetString (
00149 SIMPLE_ARRAY<char>& string
00150 ) const;
00151
00153 HDF4_VALTYPE GetType (
00154 ) const { return (m_type); }
00155
00157 ERRVALUE GetValue (
00158 int pos,
00159 double& value
00160 ) const;
00161
00163 bool IsNumeric (
00164 ) const { return (m_type != HDF4_VALTYPE_None && m_type != HDF4_VALTYPE_UCHAR8 && m_type != HDF4_VALTYPE_CHAR8); }
00165
00167 bool IsString (
00168 ) const { return (m_type == HDF4_VALTYPE_UCHAR8 || m_type == HDF4_VALTYPE_CHAR8); }
00169
00170 private:
00171 #ifndef GENERATING_DOXYGEN_OUTPUT
00172 SIMPLE_ARRAY<char> m_buf;
00173 HDF4_NAME m_name;
00174 HDF4_VALTYPE m_type;
00175 int m_count;
00176
00177 ERRVALUE Set (
00178 int type,
00179 int count
00180 );
00181
00182 friend class HDF4_FILE;
00183 friend class HDF4_GROUP;
00184 friend class HDF4_ARRAY;
00185 friend class HDF4_RASTER;
00186 friend class HDF4_TABLE;
00187 #endif // GENERATING_DOXYGEN_OUTPUT
00188 };
00189
00190
00191 class HDF4_OBJECT {
00192 public:
00193
00195 HDF4_OBJECT (
00196 ) { }
00197
00199 virtual ~HDF4_OBJECT (
00200 ) = 0;
00201
00204 virtual int FindAttrib (
00205 const char *name
00206 ) const = 0;
00207
00209 virtual ERRVALUE GetAttrib (
00210 int index,
00211 HDF4_ATTRIB& attrib
00212 ) const = 0;
00213
00215 virtual ERRVALUE GetName (
00216 HDF4_NAME& name
00217 ) const = 0;
00218
00220 virtual int GetNumAttribs (
00221 ) const = 0;
00222
00224 bool IsOpen (
00225 ) const { return (m_file.IsOpen()); };
00226
00227 protected:
00228
00229 HDF4_FILE m_file;
00230
00231 private:
00232 #ifndef GENERATING_DOXYGEN_OUTPUT
00233 HDF4_OBJECT (const HDF4_OBJECT&);
00234 HDF4_OBJECT& operator= (const HDF4_OBJECT&);
00235 #endif // GENERATING_DOXYGEN_OUTPUT
00236 };
00237
00238
00239 class HDF4_GROUP : public HDF4_OBJECT {
00240 public:
00241
00243 HDF4_GROUP (
00244 );
00245
00247 virtual ~HDF4_GROUP (
00248 );
00249
00251 void Close (
00252 );
00253
00256 virtual int FindAttrib (
00257 const char *name
00258 ) const;
00259
00263 int FindObject (
00264 HDF4_OBJTYPE type,
00265 const char *path
00266 ) const;
00267
00270 int FindObjectByClass (
00271 HDF4_OBJTYPE type,
00272 const char *classname
00273 ) const;
00274
00276 virtual ERRVALUE GetAttrib (
00277 int index,
00278 HDF4_ATTRIB& attrib
00279 ) const;
00280
00282 ERRVALUE GetClass (
00283 HDF4_NAME& classname
00284 ) const;
00285
00287 virtual ERRVALUE GetName (
00288 HDF4_NAME& name
00289 ) const;
00290
00292 virtual int GetNumAttribs (
00293 ) const;
00294
00297 ERRVALUE GetObjIdxs (
00298 HDF4_OBJTYPE objtype,
00299 SIMPLE_ARRAY<INT32>& objidxs
00300 ) const;
00301
00303 ERRVALUE Open (
00304 const HDF4_FILE& file,
00305 int index
00306 );
00307
00309 ERRVALUE OpenRoot (
00310 const HDF4_FILE& file
00311 );
00312
00313 private:
00314 #ifndef GENERATING_DOXYGEN_OUTPUT
00315 int m_groupid;
00316 bool m_isroot;
00317
00318 ERRVALUE CheckInSubGroup (HDF4_OBJTYPE objtype, BITSET& bitset) const;
00319
00320 HDF4_GROUP (const HDF4_GROUP&);
00321 HDF4_GROUP& operator= (const HDF4_GROUP&);
00322 #endif // GENERATING_DOXYGEN_OUTPUT
00323 };
00324
00325
00326 class HDF4_ARRAY : public HDF4_OBJECT {
00327 public:
00328
00330 class INFO;
00331
00333 HDF4_ARRAY (
00334 );
00335
00337 virtual ~HDF4_ARRAY (
00338 );
00339
00341 void Close (
00342 );
00343
00346 virtual int FindAttrib (
00347 const char *name
00348 ) const;
00349
00351 virtual ERRVALUE GetAttrib (
00352 int index,
00353 HDF4_ATTRIB& attrib
00354 ) const;
00355
00357 ERRVALUE GetInfo (
00358 INFO& info
00359 ) const;
00360
00362 virtual ERRVALUE GetName (
00363 HDF4_NAME& name
00364 ) const;
00365
00367 virtual int GetNumAttribs (
00368 ) const;
00369
00371 ERRVALUE Open (
00372 const HDF4_FILE& file,
00373 int index
00374 );
00375
00377 ERRVALUE Read (
00378 const INT32 *start,
00379 const INT32 *stride,
00380 const INT32 *count,
00381 void *buffer
00382 ) const;
00383
00384 private:
00385 #ifndef GENERATING_DOXYGEN_OUTPUT
00386 int m_arrayid;
00387 int m_numdims;
00388 int m_valuesize;
00389
00390 HDF4_ARRAY (const HDF4_ARRAY&);
00391 HDF4_ARRAY& operator= (const HDF4_ARRAY&);
00392 #endif // GENERATING_DOXYGEN_OUTPUT
00393 };
00394
00396 class HDF4_ARRAY::INFO {
00397 public:
00398
00400 int GetDim (
00401 int axis
00402 ) const { return (m_dims[axis]); }
00403
00405 double GetNullValue (
00406 ) const { return (m_NullValue); }
00407
00409 int GetNumDims (
00410 ) const { return (m_dims.GetNumItems()); }
00411
00413 HDF4_VALTYPE GetType (
00414 ) const { return (m_valtype); }
00415
00417 bool HasNullValue (
00418 ) const { return (m_HasNull); }
00419
00420 private:
00421 #ifndef GENERATING_DOXYGEN_OUTPUT
00422 SIMPLE_ARRAY<INT32> m_dims;
00423 HDF4_VALTYPE m_valtype;
00424 bool m_HasNull;
00425 double m_NullValue;
00426 #endif // GENERATING_DOXYGEN_OUTPUT
00427
00428 friend class HDF4_ARRAY;
00429 };
00430
00431
00432 class HDF4_RASTER : public HDF4_OBJECT {
00433 public:
00434
00435 class INFO;
00436
00437 enum INTERLACE {
00438 INTERLACE_Pixel = 0,
00439 INTERLACE_Line = 1,
00440 INTERLACE_Component = 2
00441 };
00442
00444 HDF4_RASTER (
00445 );
00446
00448 virtual ~HDF4_RASTER (
00449 );
00450
00452 void Close (
00453 );
00454
00457 virtual int FindAttrib (
00458 const char *name
00459 ) const;
00460
00462 virtual ERRVALUE GetAttrib (
00463 int index,
00464 HDF4_ATTRIB& attrib
00465 ) const;
00466
00468 ERRVALUE GetInfo (
00469 INFO& info
00470 ) const;
00471
00473 virtual ERRVALUE GetName (
00474 HDF4_NAME& name
00475 ) const;
00476
00478 virtual int GetNumAttribs (
00479 ) const;
00480
00482 ERRVALUE Open (
00483 const HDF4_FILE& file,
00484 int index
00485 );
00486
00489 ERRVALUE Read (
00490 INT32 ystart,
00491 INT32 xstart,
00492 INT32 ycount,
00493 INT32 xcount,
00494 void *buffer
00495 ) const;
00496
00498 ERRVALUE SetInterlace (
00499 INTERLACE interlace
00500 );
00501
00502 private:
00503 #ifndef GENERATING_DOXYGEN_OUTPUT
00504 int m_rasterid;
00505 int m_valuesize;
00506
00507 HDF4_RASTER (const HDF4_RASTER&);
00508 HDF4_RASTER& operator= (const HDF4_RASTER&);
00509 #endif // GENERATING_DOXYGEN_OUTPUT
00510 };
00511
00512
00513 class HDF4_RASTER::INFO {
00514 public:
00515
00517 INT32 GetNumColumns (
00518 ) const { return (m_NumColumns); }
00519
00521 INT32 GetNumComponents (
00522 ) const { return (m_NumComponents); }
00523
00525 INT32 GetNumLines (
00526 ) const { return (m_NumLines); }
00527
00529 HDF4_VALTYPE GetType (
00530 ) const { return (m_valtype); }
00531
00532 private:
00533 #ifndef GENERATING_DOXYGEN_OUTPUT
00534 INT32 m_NumComponents;
00535 INT32 m_NumColumns;
00536 INT32 m_NumLines;
00537 HDF4_VALTYPE m_valtype;
00538 #endif // GENERATING_DOXYGEN_OUTPUT
00539
00540 friend class HDF4_RASTER;
00541 };
00542
00543
00544 class HDF4_TABLE : public HDF4_OBJECT {
00545 public:
00546
00548 class FIELDINFO {
00549 public:
00550
00552 const HDF4_NAME& GetName (
00553 ) const { return (m_name); }
00554
00556 int GetOffset (
00557 ) const { return (m_offset); }
00558
00560 int GetSize (
00561 ) const { return (m_size); }
00562
00564 HDF4_VALTYPE GetType (
00565 ) const { return (m_type); }
00566
00568 bool IsString (
00569 ) const { return (m_type == HDF4_VALTYPE_UCHAR8 || m_type == HDF4_VALTYPE_CHAR8); }
00570
00571 private:
00572 #ifndef GENERATING_DOXYGEN_OUTPUT
00573 HDF4_NAME m_name;
00574 HDF4_VALTYPE m_type;
00575 int m_size;
00576 int m_offset;
00577 #endif // GENERATING_DOXYGEN_OUTPUT
00578
00579 friend class HDF4_TABLE;
00580 };
00581
00583 HDF4_TABLE (
00584 );
00585
00587 virtual ~HDF4_TABLE (
00588 );
00589
00591 void Close (
00592 );
00593
00596 virtual int FindAttrib (
00597 const char *name
00598 ) const;
00599
00601 virtual ERRVALUE GetAttrib (
00602 int index,
00603 HDF4_ATTRIB& attrib
00604 ) const;
00605
00607 ERRVALUE GetClass (
00608 HDF4_NAME& classname
00609 ) const;
00610
00612 const SIMPLE_ARRAY<FIELDINFO>& GetFieldInfo (
00613 ) const { return (m_FieldInfo); }
00614
00616 const FIELDINFO& GetFieldInfo (
00617 int fieldnum
00618 ) const { return (m_FieldInfo[fieldnum]); }
00619
00621 virtual ERRVALUE GetName (
00622 HDF4_NAME& name
00623 ) const;
00624
00626 virtual int GetNumAttribs (
00627 ) const;
00628
00630 int GetNumFields (
00631 ) const { return (m_FieldInfo.GetNumItems()); }
00632
00634 int GetNumRecords (
00635 ) const { return (m_NumRecords); }
00636
00638 ERRVALUE Open (
00639 const HDF4_FILE& file,
00640 int index
00641 );
00642
00644 ERRVALUE Read (
00645 HDF4_RECORD& record
00646 ) const;
00647
00649 ERRVALUE Seek (
00650 int recordnum
00651 ) const;
00652
00653 private:
00654 #ifndef GENERATING_DOXYGEN_OUTPUT
00655 int m_tableid;
00656 int m_NumRecords;
00657 int m_RecSize;
00658 SIMPLE_ARRAY<FIELDINFO> m_FieldInfo;
00659
00660 HDF4_TABLE (const HDF4_TABLE&);
00661 HDF4_TABLE& operator= (const HDF4_TABLE&);
00662 #endif // GENERATING_DOXYGEN_OUTPUT
00663 };
00664
00665
00666 class HDF4_RECORD {
00667 public:
00668
00670 HDF4_RECORD (
00671 );
00672
00675 const char *GetString (
00676 INT32 FieldNum
00677 ) const;
00678
00681 double GetValue (
00682 INT32 FieldNum
00683 ) const;
00684
00685 private:
00686 #ifndef GENERATING_DOXYGEN_OUTPUT
00687 const HDF4_TABLE *m_pTable;
00688 SIMPLE_ARRAY<UINT8> m_buffer;
00689 #endif // GENERATING_DOXYGEN_OUTPUT
00690
00691 friend class HDF4_TABLE;
00692 };
00693
00694
00695
00696 #endif