bool ossim_hdf5::getGroupAttributeValue( H5::H5File* file, const std::string& group, const std::string& key, std::string& value ) { static const char MODULE[] = "ossim_hdf5::getGroupAttributeValue"; bool result = false; if ( file ) { try // HDF5 library throws exceptions so wrap with try{}catch... { // Open the root group: H5::Group* h5Group = new H5::Group( file->openGroup( group ) ); // Lookw for key: H5::Attribute attr = h5Group->openAttribute( key ); std::string name = attr.getName(); H5::DataType type = attr.getDataType(); H5T_class_t typeClass = attr.getTypeClass(); if ( ( name == key ) && ( typeClass == H5T_STRING ) ) { attr.read( type, value ); result = true; } // Cleanup: attr.close(); h5Group->close(); delete h5Group; h5Group = 0; } catch( const H5::Exception& e ) { if (traceDebug()) { ossimNotify(ossimNotifyLevel_WARN) << MODULE << " WARNING: Caught exception!\n" << e.getDetailMsg() << std::endl; } } catch( ... ) { ossimNotify(ossimNotifyLevel_WARN) << MODULE << " WARNING: Caught unknown exception!" << std::endl; } } return result; } // End: ossim_hdf5::getGroupAttributeValue
bool ossim_hdf5::getDatasetAttributeValue( H5::H5File* file, const std::string& objectName, const std::string& key, std::string& value ) { static const char MODULE[] = "ossim_hdf5::getDatasetAttributeValue"; bool result = false; if ( file ) { try // HDF5 library throws exceptions so wrap with try{}catch... { // Open the dataset: H5::DataSet dataset = file->openDataSet( objectName ); // Lookw for key: H5::Attribute attr = dataset.openAttribute( key ); std::string name = attr.getName(); H5::DataType type = attr.getDataType(); H5T_class_t typeClass = attr.getTypeClass(); if ( ( name == key ) && ( typeClass == H5T_STRING ) ) { attr.read( type, value ); result = true; } // Cleanup: attr.close(); dataset.close(); } catch( const H5::Exception& e ) { ossimNotify(ossimNotifyLevel_WARN) << MODULE << " WARNING: Caught exception!\n" << e.getDetailMsg() << std::endl; } catch( ... ) { ossimNotify(ossimNotifyLevel_WARN) << MODULE << " WARNING: Caught unknown exception!" << std::endl; } } return result; } // End: ossim_hdf5::getDatasetAttributeValue
void ossim_hdf5::printAttribute( const H5::Attribute& attr, const std::string& prefix, std::ostream& out ) { std::string name = attr.getName(); H5::DataType type = attr.getDataType(); H5T_class_t typeClass = attr.getTypeClass(); size_t size = type.getSize(); std::string value; // Initialized below. if ( ( typeClass == H5T_INTEGER ) || ( typeClass == H5T_FLOAT ) ) { H5::IntType intType = attr.getIntType(); ossimScalarType scalar = ossim_hdf5::getScalarType( intType.getId() ); ossimByteOrder order = ossim_hdf5::getByteOrder( &attr ); ossimEndian* endian = 0; if ( ( size > 1 ) && ( order != ossim::byteOrder() ) ) { endian = new ossimEndian(); // If set used as flag to byte swap. } if ( typeClass == H5T_INTEGER ) { switch ( scalar ) { case OSSIM_UINT8: { if ( size == 1 ) { ossim_uint8 i; attr.read( type, (void*)&i ); value = ossimString::toString( ossim_int32(i) ).string(); } break; } case OSSIM_SINT8: { if ( size == 1 ) { ossim_sint8 i; attr.read( type, (void*)&i ); value = ossimString::toString( ossim_int32(i) ).string(); } break; } case OSSIM_UINT16: { if ( size == 2 ) { ossim_uint16 i; attr.read( type, (void*)&i ); if ( endian ) { endian->swap( i ); } value = ossimString::toString( i ).string(); } break; } case OSSIM_SINT16: { if ( size == 2 ) { ossim_sint16 i; attr.read( type, (void*)&i ); if ( endian ) { endian->swap( i ); } value = ossimString::toString( i ).string(); } break; } case OSSIM_UINT32: { if ( size == 4 ) { ossim_uint32 i; attr.read( type, (void*)&i ); if ( endian ) { endian->swap( i ); } value = ossimString::toString( i ).string(); } break; } case OSSIM_SINT32: { if ( size == 4 ) { ossim_sint32 i; attr.read( type, (void*)&i ); if ( endian ) { endian->swap( i ); } value = ossimString::toString( i ).string(); } break; } case OSSIM_UINT64: { if ( size == 8 ) { ossim_uint64 i; attr.read( type, (void*)&i ); if ( endian ) { endian->swap( i ); } value = ossimString::toString( i ).string(); } break; } case OSSIM_SINT64: { if ( size == 8 ) { ossim_sint32 i; attr.read( type, (void*)&i ); if ( endian ) { endian->swap( i ); } value = ossimString::toString( i ).string(); } break; } default: break; } } else if ( typeClass == H5T_FLOAT ) { if ( scalar == OSSIM_FLOAT32 ) { if ( size == 4 ) { ossim_float32 f; attr.read( type, (void*)&f ); if ( endian ) { endian->swap( f ); } value = ossimString::toString( f ).string(); } } if ( scalar == OSSIM_FLOAT64 ) { if ( size == 8 ) { ossim_float64 f; attr.read( type, (void*)&f ); if ( endian ) { endian->swap( f ); } value = ossimString::toString( f ).string(); } } } if ( endian ) { delete endian; endian = 0; } } else if ( typeClass == H5T_STRING ) { attr.read( type, value ); } else { ossimNotify(ossimNotifyLevel_DEBUG) << "ossimH5Util::printAttribute WARN: Unhandled type class: " << typeClass << std::endl; } out << prefix << "." << name << ": " << value << std::endl; } // End: ossim_hdf5::printAttribute