[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [labplot] src/backend/datasources/filters: HDF filter: improved error handling
From:       Stefan Gerlach <stefan.gerlach () uni-konstanz ! de>
Date:       2015-05-31 21:18:21
Message-ID: E1YzAcf-0007SF-7u () scm ! kde ! org
[Download RAW message or body]

Git commit 16679b11d7ad17ace9d2c20a3ff8081fbf792763 by Stefan Gerlach.
Committed on 31/05/2015 at 21:18.
Pushed by sgerlach into branch 'master'.

HDF filter: improved error handling

M  +165  -54   src/backend/datasources/filters/HDFFilter.cpp
M  +2    -0    src/backend/datasources/filters/HDFFilterPrivate.h

http://commits.kde.org/labplot/16679b11d7ad17ace9d2c20a3ff8081fbf792763

diff --git a/src/backend/datasources/filters/HDFFilter.cpp \
b/src/backend/datasources/filters/HDFFilter.cpp index f142a3f..bfb2fdc 100644
--- a/src/backend/datasources/filters/HDFFilter.cpp
+++ b/src/backend/datasources/filters/HDFFilter.cpp
@@ -153,6 +153,12 @@ HDFFilterPrivate::HDFFilterPrivate(HDFFilter* owner) :
 }
 
 #ifdef HAVE_HDF5
+void HDFFilterPrivate::handleError(int status, QString function, QString arg) {
+	if (status < 0) {
+		qDebug()<<"ERROR"<<status<<":"<<function<<"() - "<<arg;
+	}
+}
+
 QString HDFFilterPrivate::translateHDFOrder(H5T_order_t o) {
 	QString order;
         switch(o) {
@@ -262,10 +268,14 @@ QStringList HDFFilterPrivate::readHDFCompound(hid_t tid) {
 	
 	dataString<<"COMPOUND("<<QString::number(typeSize)<<"):(";
 	int members = H5Tget_nmembers(tid);
+	handleError(members,"H5Tget_nmembers");
 	for(int i=0;i<members;i++) {
 		H5T_class_t mclass = H5Tget_member_class(tid,i);
+		handleError((int)mclass,"H5Tget_member_class");
 		hid_t mtype = H5Tget_member_type(tid,i); 
+		handleError((int)mtype,"H5Tget_member_type");
 		size_t size = H5Tget_size(mtype);
+		handleError((int)size,"H5Tget_size");
 		QString typeString=translateHDFClass(mclass);
 		if(mclass == H5T_INTEGER || mclass == H5T_FLOAT )
 			typeString=translateHDFType(mtype);
@@ -274,7 +284,8 @@ QStringList HDFFilterPrivate::readHDFCompound(hid_t tid) {
 			dataString<<")";
 		else
 			dataString<<",";
-		H5Tclose(mtype);
+		status = H5Tclose(mtype);
+		handleError(status,"H5Tclose");
 	}
 	dataString<<"\n";
 
@@ -288,7 +299,8 @@ QStringList HDFFilterPrivate::readHDFData1D(hid_t dataset, hid_t \
type, int rows,  
 	T* data = (T*) malloc(rows*sizeof(T));
 
-	H5Dread(dataset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, data);
+	status = H5Dread(dataset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, data);
+	handleError(status,"H5Dread");
 	for (int i=startRow-1; i < qMin(endRow,lines+startRow-1); i++) {
 		if (dataPointer)
 			dataPointer->operator[](i-startRow+1) = data[i];
@@ -303,13 +315,18 @@ QStringList HDFFilterPrivate::readHDFData1D(hid_t dataset, \
hid_t type, int rows,  
 QStringList HDFFilterPrivate::readHDFCompoundData1D(hid_t dataset, hid_t tid, int \
rows, int lines, QVector< QVector<double>* >& dataPointer) {  int members = \
H5Tget_nmembers(tid); +	handleError(members,"H5Tget_nmembers");
 
 	QStringList data[members];
 	for(int m=0;m<members;m++) {
 		hid_t mtype = H5Tget_member_type(tid,m);
+		handleError((int)mtype,"H5Tget_member_type");
                 size_t msize = H5Tget_size(mtype);
+		handleError((int)msize,"H5Tget_size");
 		hid_t ctype = H5Tcreate(H5T_COMPOUND, msize);
-		H5Tinsert(ctype, H5Tget_member_name(tid,m), 0, mtype);
+		handleError((int)ctype,"H5Tcreate");
+		status = H5Tinsert(ctype, H5Tget_member_name(tid,m), 0, mtype);
+		handleError(status,"H5Tinsert");
 
 		QVector<double>* dataP=NULL;
 		if(dataPointer.size()>0)
@@ -343,6 +360,7 @@ QStringList HDFFilterPrivate::readHDFCompoundData1D(hid_t \
dataset, hid_t tid, in  data[m]=readHDFData1D<long \
double>(dataset,ctype,rows,lines,dataP);  else {
 			H5T_class_t mclass = H5Tget_member_class(tid,m);
+			handleError((int)mclass,"H5Tget_member_class");
 			qDebug()<<"	not supported type of class"<<translateHDFClass(mclass);
 		}
 
@@ -380,7 +398,8 @@ QStringList HDFFilterPrivate::readHDFData2D(hid_t dataset, hid_t \
type, int rows,  data[0] = (T*)malloc( cols*rows*sizeof(T) );
 	for (int i=1; i < rows; i++) data[i] = data[0]+i*cols;
 
-	H5Dread(dataset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, &data[0][0]);
+	status = H5Dread(dataset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, &data[0][0]);
+	handleError(status,"H5Dread");
 
 	for (int i=0; i < qMin(rows,lines); i++) {
 		for (int j=0; j < cols; j++) {
@@ -399,13 +418,18 @@ QStringList HDFFilterPrivate::readHDFData2D(hid_t dataset, \
hid_t type, int rows,  
 QStringList HDFFilterPrivate::readHDFCompoundData2D(hid_t dataset, hid_t tid, int \
rows, int cols, int lines) {  int members = H5Tget_nmembers(tid);
+	handleError(members,"H5Tget_nmembers");
 
 	QStringList data[members];
 	for(int m=0;m<members;m++) {
 		hid_t mtype = H5Tget_member_type(tid,m);
+		handleError((int)mtype,"H5Tget_member_type");
                 size_t msize = H5Tget_size(mtype);
+		handleError((int)msize,"H5Tget_size");
 		hid_t ctype = H5Tcreate(H5T_COMPOUND,msize);
-		H5Tinsert(ctype, H5Tget_member_name(tid,m), 0, mtype);
+		handleError((int)ctype,"H5Tcreate");
+		status = H5Tinsert(ctype, H5Tget_member_name(tid,m), 0, mtype);
+		handleError(status,"H5Tinsert");
 
 		QVector< QVector<double>* > dummy;
 		if(H5Tequal(mtype,H5T_STD_I8LE) || H5Tequal(mtype,H5T_STD_I8BE))
@@ -439,7 +463,8 @@ QStringList HDFFilterPrivate::readHDFCompoundData2D(hid_t \
dataset, hid_t tid, in  qDebug()<<"	not supported class"<<translateHDFClass(mclass);
 		}
 
-		H5Tclose(ctype);
+		status = H5Tclose(ctype);
+		handleError(status,"H5Tclose");
 	}
 	
 	// create dataString from data
@@ -468,58 +493,75 @@ QStringList HDFFilterPrivate::readHDFAttr(hid_t aid) {
 	QStringList attr;
 
         char name[MAXNAMELENGTH];
-        H5Aget_name(aid, MAXNAMELENGTH, name );
+        status = H5Aget_name(aid, MAXNAMELENGTH, name );
+	handleError(status,"H5Aget_name");
 	attr << QString(name);
 
         hid_t aspace = H5Aget_space(aid); // the dimensions of the attribute data
+	handleError((int)aspace,"H5Aget_space");
         hid_t atype  = H5Aget_type(aid);
+	handleError((int)atype,"H5Aget_type");
         hid_t aclass = H5Tget_class(atype);
+	handleError((int)aclass,"H5Aget_class");
 
 	if (aclass == H5T_STRING) {
 		hid_t amem = H5Tget_native_type(atype, H5T_DIR_ASCEND);
-		H5Aread(aid, amem, name);
+		handleError((int)amem,"H5Tget_native_type");
+		status = H5Aread(aid, amem, name);
+		handleError(status,"H5Aread");
 		attr<<"="<<QString(name);
-		H5Tclose(amem);
+		status = H5Tclose(amem);
+		handleError(status,"H5Tclose");
 	}else if(aclass == H5T_INTEGER) {
 		if(H5Tequal(atype,H5T_STD_I8LE) || H5Tequal(atype,H5T_STD_I8BE)) {
 			char value;
-			H5Aread(aid, H5T_NATIVE_CHAR, &value);
+			status = H5Aread(aid, H5T_NATIVE_CHAR, &value);
+			handleError(status,"H5Aread");
 			attr<<"="<<QString::number(value);
 		} else if(H5Tequal(atype,H5T_STD_U8LE) || H5Tequal(atype,H5T_STD_U8BE)) {
 			unsigned char value;
-			H5Aread(aid, H5T_NATIVE_UCHAR, &value);
+			status = H5Aread(aid, H5T_NATIVE_UCHAR, &value);
+			handleError(status,"H5Aread");
 			attr<<"="<<QString::number(value);
 		} else if(H5Tequal(atype,H5T_STD_I16LE) || H5Tequal(atype,H5T_STD_I16BE)) {
 			short value;
-			H5Aread(aid, H5T_NATIVE_SHORT, &value);
+			status = H5Aread(aid, H5T_NATIVE_SHORT, &value);
+			handleError(status,"H5Aread");
 			attr<<"="<<QString::number(value);
 		} else if(H5Tequal(atype,H5T_STD_U16LE) || H5Tequal(atype,H5T_STD_U16BE)) {
 			unsigned short value;
-			H5Aread(aid, H5T_NATIVE_USHORT, &value);
+			status = H5Aread(aid, H5T_NATIVE_USHORT, &value);
+			handleError(status,"H5Aread");
 			attr<<"="<<QString::number(value);
 		} else if(H5Tequal(atype,H5T_STD_I32LE) || H5Tequal(atype,H5T_STD_I32BE)) {
 			int value;
-			H5Aread(aid, H5T_NATIVE_INT, &value);
+			status = H5Aread(aid, H5T_NATIVE_INT, &value);
+			handleError(status,"H5Aread");
 			attr<<"="<<QString::number(value);
 		} else if(H5Tequal(atype,H5T_STD_U32LE) || H5Tequal(atype,H5T_STD_U32BE)) {
 			unsigned int value;
-			H5Aread(aid, H5T_NATIVE_UINT, &value);
+			status = H5Aread(aid, H5T_NATIVE_UINT, &value);
+			handleError(status,"H5Aread");
 			attr<<"="<<QString::number(value);
 		} else if(H5Tequal(atype,H5T_NATIVE_LONG)) {
 			long value;
-			H5Aread(aid, H5T_NATIVE_LONG, &value);
+			status = H5Aread(aid, H5T_NATIVE_LONG, &value);
+			handleError(status,"H5Aread");
 			attr<<"="<<QString::number(value);
 		} else if(H5Tequal(atype,H5T_NATIVE_ULONG)) {
 			unsigned long value;
-			H5Aread(aid, H5T_NATIVE_ULONG, &value);
+			status = H5Aread(aid, H5T_NATIVE_ULONG, &value);
+			handleError(status,"H5Aread");
 			attr<<"="<<QString::number(value);
 		} else if(H5Tequal(atype,H5T_STD_I64LE) || H5Tequal(atype,H5T_STD_I64BE)) {
 			long long value;
-			H5Aread(aid, H5T_NATIVE_LLONG, &value);
+			status = H5Aread(aid, H5T_NATIVE_LLONG, &value);
+			handleError(status,"H5Aread");
 			attr<<"="<<QString::number(value);
 		} else if(H5Tequal(atype,H5T_STD_U64LE) || H5Tequal(atype,H5T_STD_U64BE)) {
 			unsigned long long value;
-			H5Aread(aid, H5T_NATIVE_ULLONG, &value);
+			status = H5Aread(aid, H5T_NATIVE_ULLONG, &value);
+			handleError(status,"H5Aread");
 			attr<<"="<<QString::number(value);
 		} else {
 			attr<<" (unknown integer)";
@@ -527,23 +569,28 @@ QStringList HDFFilterPrivate::readHDFAttr(hid_t aid) {
 	}else if(aclass == H5T_FLOAT) {
 		if(H5Tequal(atype,H5T_IEEE_F32LE) || H5Tequal(atype,H5T_IEEE_F32BE)) {
 			float value;
-			H5Aread(aid, H5T_NATIVE_FLOAT, &value);
+			status = H5Aread(aid, H5T_NATIVE_FLOAT, &value);
+			handleError(status,"H5Aread");
 			attr<<"="<<QString::number(value);
 		} else if(H5Tequal(atype,H5T_IEEE_F64LE) || H5Tequal(atype,H5T_IEEE_F64BE)) {
 			double value;
-			H5Aread(aid, H5T_NATIVE_DOUBLE, &value);
+			status = H5Aread(aid, H5T_NATIVE_DOUBLE, &value);
+			handleError(status,"H5Aread");
 			attr<<"="<<QString::number(value);
 		} else if(H5Tequal(atype,H5T_NATIVE_LDOUBLE)) {
 			long double value;
-			H5Aread(aid, H5T_NATIVE_LDOUBLE, &value);
+			status = H5Aread(aid, H5T_NATIVE_LDOUBLE, &value);
+			handleError(status,"H5Aread");
 			attr<<"="<<QString::number((double)value);
 		} else {
 			attr<<" (unknown float)";
 		}
 	}
 
-        H5Tclose(atype);
-        H5Sclose(aspace);
+        status = H5Tclose(atype);
+	handleError(status,"H5Tclose");
+        status = H5Sclose(aspace);
+	handleError(status,"H5Sclose");
 
 	return attr;
 }
@@ -552,13 +599,16 @@ QStringList HDFFilterPrivate::scanHDFAttrs(hid_t oid) {
 	QStringList attr;
 
 	int numAttr = H5Aget_num_attrs(oid);
+	handleError(numAttr,"H5Aget_num_attrs");
 
         for (int i = 0; i < numAttr; i++) {
                 hid_t aid = H5Aopen_idx(oid, i);
+		handleError((int)aid,"H5Aopen_idx");
                 attr<<readHDFAttr(aid);
 		if(i != numAttr-1)
 			attr<<", ";
-                H5Aclose(aid);
+                status = H5Aclose(aid);
+		handleError(status,"H5Aclose");
         }
 
 	return attr;
@@ -566,6 +616,7 @@ QStringList HDFFilterPrivate::scanHDFAttrs(hid_t oid) {
 
 QStringList HDFFilterPrivate::readHDFDataType(hid_t tid) {
 	H5T_class_t typeClass = H5Tget_class(tid);
+	handleError((int)typeClass,"H5Tget_class");
 
 	QStringList typeProps;
 	QString typeString = translateHDFClass(typeClass);
@@ -577,12 +628,14 @@ QStringList HDFFilterPrivate::readHDFDataType(hid_t tid) {
 	typeProps<<" ("<<QString::number(size)<<") ";
 
 	H5T_order_t order = H5Tget_order(tid);
+	handleError((int)order,"H5Tget_order");
 	typeProps<<translateHDFOrder(order);
 
 	// type specific props
 	switch(typeClass) {
 	case H5T_STRING: {
 		H5T_cset_t cset = H5Tget_cset (tid);
+		handleError((int)cset,"H5Tget_cset");
 		switch(cset) {
 		case  H5T_CSET_ASCII:
 			typeProps<<", ASCII";
@@ -590,6 +643,7 @@ QStringList HDFFilterPrivate::readHDFDataType(hid_t tid) {
 			break;
 		}
 		H5T_str_t strpad = H5Tget_strpad(tid);
+		handleError((int)strpad,"H5Tget_strpad");
 		switch(strpad) {
 		case H5T_STR_NULLTERM:
 			typeProps<<" NULLTERM";
@@ -629,10 +683,12 @@ QStringList HDFFilterPrivate::readHDFPropertyList(hid_t pid) {
 	hsize_t chunk_dims_out[2];
 	if(H5D_CHUNKED == H5Pget_layout(pid)){
                 int rank_chunk = H5Pget_chunk(pid, 2, chunk_dims_out);
+		handleError(rank_chunk,"H5Pget_chunk");
 		props<<"chunk rank="<<QString::number(rank_chunk)<<", \
dimension="<<QString::number(chunk_dims_out[0])<<QString::number(chunk_dims_out[1]);  \
}  
 	int nfilters = H5Pget_nfilters(pid);
+	handleError(nfilters,"H5Pget_nfilters");
 	props<<" "<<QString::number(nfilters)<<" filter";
         for (int i = 0; i < nfilters; i++) {
 		size_t cd_nelmts = 32;
@@ -640,6 +696,7 @@ QStringList HDFFilterPrivate::readHDFPropertyList(hid_t pid) {
 		unsigned int cd_values[32];
 		char f_name[MAXNAMELENGTH];
                 H5Z_filter_t filtn = H5Pget_filter(pid, (unsigned)i, &filt_flags, \
&cd_nelmts, cd_values,(size_t)MAXNAMELENGTH, f_name, &filt_conf); \
+		handleError((int)filtn,"H5Pget_filter");  
 		switch (filtn) {
 		case H5Z_FILTER_DEFLATE:  /* AKA GZIP compression */
@@ -666,7 +723,8 @@ QStringList HDFFilterPrivate::readHDFPropertyList(hid_t pid) {
 
 	props<<", ALLOC_TIME:";
 	H5D_alloc_time_t at;
-        H5Pget_alloc_time(pid, &at);
+        status = H5Pget_alloc_time(pid, &at);
+	handleError(status,"H5Pget_alloc_time");
 
         switch (at) {
 	case H5D_ALLOC_TIME_EARLY:
@@ -685,7 +743,8 @@ QStringList HDFFilterPrivate::readHDFPropertyList(hid_t pid) {
 
 	props<<", FILL_TIME:";
         H5D_fill_time_t ft;
-	H5Pget_fill_time(pid, &ft);
+	status = H5Pget_fill_time(pid, &ft);
+	handleError(status,"H5Pget_fill_time");
         switch ( ft ) {
 	case H5D_FILL_TIME_ALLOC:
 		props<<" ALLOW";
@@ -702,7 +761,8 @@ QStringList HDFFilterPrivate::readHDFPropertyList(hid_t pid) {
         }
 
 	H5D_fill_value_t fvstatus;
-	H5Pfill_value_defined(pid, &fvstatus);
+	status = H5Pfill_value_defined(pid, &fvstatus);
+	handleError(status,"H5Pfill_value_defined");
         if (fvstatus == H5D_FILL_VALUE_UNDEFINED) {
 		props<<" No fill value defined";
         } else {
@@ -721,7 +781,8 @@ void HDFFilterPrivate::scanHDFDataType(hid_t tid, char \
*dataSetName, QTreeWidget  QString attr = scanHDFAttrs(tid).join(" ");
 
 	char link[MAXNAMELENGTH];
-        H5Iget_name(tid, link, MAXNAMELENGTH);
+        status = H5Iget_name(tid, link, MAXNAMELENGTH);
+	handleError(status,"H5Iget_name");
 
 	QTreeWidgetItem *dataTypeItem = new QTreeWidgetItem((QTreeWidget*)0, \
QStringList()<<QString(dataSetName)<<QString(link)<<i18n("data \
type")<<typeProps.join("")<<attr);  \
dataTypeItem->setIcon(0,QIcon(KIcon("accessories-calculator"))); @@ -733,27 +794,34 \
@@ void HDFFilterPrivate::scanHDFDataSet(hid_t did, char *dataSetName, QTreeWidgetI  \
QString attr = scanHDFAttrs(did).join("");  
 	char link[MAXNAMELENGTH];
-        H5Iget_name(did, link, MAXNAMELENGTH);
+        status = H5Iget_name(did, link, MAXNAMELENGTH);
+	handleError(status,"H5Iget_name");
 
 	QStringList dataSetProps;
 	hsize_t size = H5Dget_storage_size(did);
+	handleError((int)size,"H5Dget_storage_size");
 	hid_t datatype  = H5Dget_type(did);
+	handleError((int)datatype,"H5Dget_type");
 	size_t typeSize  = H5Tget_size(datatype);
+	handleError((int)typeSize,"H5Dget_size");
 
 	dataSetProps<<readHDFDataType(datatype);
 
 	hid_t dataspace = H5Dget_space(did);
 	int rank = H5Sget_simple_extent_ndims(dataspace);
+	handleError(rank,"H5Sget_simple_extent_ndims");
 	if(rank == 2) {
 		hsize_t dims_out[2];
-    		H5Sget_simple_extent_dims(dataspace, dims_out, NULL);
+    		status = H5Sget_simple_extent_dims(dataspace, dims_out, NULL);
+		handleError(status,"H5Sget_simple_extent_dims");
 		unsigned int rows = dims_out[0];
 		unsigned int cols = dims_out[1];
 		dataSetProps<<", "<<QString::number(rows)<<"x"<<QString::number(cols)<<" \
("<<QString::number(size/typeSize)<<")";  }
 	else if(rank == 3) {
 		hsize_t dims_out[3];
-    		H5Sget_simple_extent_dims(dataspace, dims_out, NULL);
+    		status = H5Sget_simple_extent_dims(dataspace, dims_out, NULL);
+		handleError(status,"H5Sget_simple_extent_dims");
 		unsigned int rows = dims_out[0];
 		unsigned int cols = dims_out[1];
 		unsigned int regs = dims_out[2];
@@ -761,6 +829,7 @@ void HDFFilterPrivate::scanHDFDataSet(hid_t did, char \
*dataSetName, QTreeWidgetI  }
 
 	hid_t pid = H5Dget_create_plist(did);
+	handleError((int)pid,"H5Dget_create_plist");
 	dataSetProps<<", "<<readHDFPropertyList(pid).join("");
 
 	QTreeWidgetItem *dataSetItem = new QTreeWidgetItem((QTreeWidget*)0, \
QStringList()<<QString(dataSetName)<<QString(link)<<i18n("data \
set")<<dataSetProps.join("")<<attr); @@ -771,7 +840,8 @@ void \
HDFFilterPrivate::scanHDFDataSet(hid_t did, char *dataSetName, QTreeWidgetI  
 void HDFFilterPrivate::scanHDFLink(hid_t gid, char *linkName, QTreeWidgetItem* \
parentItem) {  char target[MAXNAMELENGTH];
-        H5Gget_linkval(gid, linkName, MAXNAMELENGTH, target) ;
+        status = H5Gget_linkval(gid, linkName, MAXNAMELENGTH, target) ;
+	handleError(status,"H5Gget_linkval");
 
 	QTreeWidgetItem *linkItem = new QTreeWidgetItem((QTreeWidget*)0, \
QStringList()<<QString(linkName)<<" "<<i18n("symbolic link")<<i18n("link to \
")+QString(target));  linkItem->setIcon(0,QIcon(KIcon("emblem-symbolic-link")));
@@ -781,8 +851,9 @@ void HDFFilterPrivate::scanHDFLink(hid_t gid, char *linkName, \
QTreeWidgetItem* p  void HDFFilterPrivate::scanHDFGroup(hid_t gid, char *groupName, \
QTreeWidgetItem* parentItem) {  
 	//check for hard link
-	H5G_stat_t  statbuf;
-	H5Gget_objinfo(gid, ".", TRUE, &statbuf);
+	H5G_stat_t statbuf;
+	status = H5Gget_objinfo(gid, ".", TRUE, &statbuf);
+	handleError(status,"H5Gget_objinfo");
 	if (statbuf.nlink > 1) {
 		if(multiLinkList.contains(statbuf.objno[0])) {
 			QTreeWidgetItem *objectItem = new QTreeWidgetItem((QTreeWidget*)0, \
QStringList()<<QString(groupName)<<" "<<i18n("hard link")); @@ -796,7 +867,8 @@ void \
HDFFilterPrivate::scanHDFGroup(hid_t gid, char *groupName, QTreeWidgetItem*  }
 
 	char link[MAXNAMELENGTH];
-        H5Iget_name(gid, link, MAXNAMELENGTH);
+        status = H5Iget_name(gid, link, MAXNAMELENGTH);
+	handleError(status,"H5Iget_name");
 
 	QString attr = scanHDFAttrs(gid).join(" ");
 
@@ -805,13 +877,16 @@ void HDFFilterPrivate::scanHDFGroup(hid_t gid, char *groupName, \
QTreeWidgetItem*  parentItem->addChild(groupItem);
 
 	hsize_t numObj;
-	H5Gget_num_objs(gid, &numObj);
+	status = H5Gget_num_objs(gid, &numObj);
+	handleError(status,"H5Gget_num_objs");
 
 	for (unsigned int i = 0; i < numObj; i++) {
                 char memberName[MAXNAMELENGTH];
-                H5Gget_objname_by_idx(gid, (hsize_t)i, memberName, \
(size_t)MAXNAMELENGTH ); +                status = H5Gget_objname_by_idx(gid, \
(hsize_t)i, memberName, (size_t)MAXNAMELENGTH ); \
+		handleError(status,"H5Gget_objname_by_idx");  
                 int otype =  H5Gget_objtype_by_idx(gid, (size_t)i );
+		handleError(otype,"H5Gget_objtype_by_idx");
                 switch(otype) {
                 case H5G_LINK: {
                         scanHDFLink(gid,memberName, groupItem);
@@ -819,20 +894,26 @@ void HDFFilterPrivate::scanHDFGroup(hid_t gid, char *groupName, \
QTreeWidgetItem*  }
                 case H5G_GROUP: {
                         hid_t grpid = H5Gopen(gid,memberName, H5P_DEFAULT);
+			handleError((int)grpid,"H5Gopen");
                         scanHDFGroup(grpid, memberName, groupItem);
-                        H5Gclose(grpid);
+                        status = H5Gclose(grpid);
+			handleError(status,"H5Gclose");
                         break;
                 }
                 case H5G_DATASET: {
                         hid_t dsid = H5Dopen(gid,memberName, H5P_DEFAULT);
+			handleError((int)dsid,"H5Dopen");
                         scanHDFDataSet(dsid, memberName, groupItem);
-                        H5Dclose(dsid);
+                        status = H5Dclose(dsid);
+			handleError(status,"H5Dclose");
                         break;
                 }
                 case H5G_TYPE: {
                         hid_t tid = H5Topen(gid,memberName, H5P_DEFAULT);
+			handleError((int)tid,"H5Topen");
                         scanHDFDataType(tid, memberName, groupItem);
-                        H5Tclose(tid);
+                        status = H5Tclose(tid);
+			handleError(status,"H5Tclose");
 			break;
                 }
                 default:
@@ -849,14 +930,20 @@ void HDFFilterPrivate::scanHDFGroup(hid_t gid, char *groupName, \
                QTreeWidgetItem*
 */
 void HDFFilterPrivate::parse(const QString & fileName, QTreeWidgetItem* rootItem) {
 #ifdef HAVE_HDF5
+	int status;
+
 	QByteArray bafileName = fileName.toLatin1();
 	hid_t file = H5Fopen(bafileName.data(), H5F_ACC_RDONLY, H5P_DEFAULT);
+	handleError((int)file,"H5Fopen",fileName);
 	char rootName[]="/";
 	hid_t group = H5Gopen(file, rootName, H5P_DEFAULT);
+	handleError((int)group,"H5Gopen",rootName);
 	multiLinkList.clear();
 	scanHDFGroup(group,rootName, rootItem);
-	H5Gclose(group);
-	H5Fclose(file);
+	status = H5Gclose(group);
+	handleError(status,"H5Gclose","");
+	status = H5Fclose(file);
+	handleError(status,"H5Fclose","");
 #else
 	Q_UNUSED(fileName)
 	Q_UNUSED(rootItem)
@@ -867,6 +954,7 @@ void HDFFilterPrivate::parse(const QString & fileName, \
                QTreeWidgetItem* rootItem
     reads the content of the date set in the file \c fileName to a string (for \
                preview) or to the data source.
 */
 QString HDFFilterPrivate::readCurrentDataSet(const QString & fileName, \
AbstractDataSource* dataSource, AbstractFileFilter::ImportMode mode, int lines){ \
+	int status;  QStringList dataString;
 
 	if(currentDataSet.isEmpty())
@@ -878,16 +966,23 @@ QString HDFFilterPrivate::readCurrentDataSet(const QString & \
fileName, AbstractD  #ifdef HAVE_HDF5
 	QByteArray bafileName = fileName.toLatin1();
 	hid_t file = H5Fopen(bafileName.data(), H5F_ACC_RDONLY, H5P_DEFAULT);
+	handleError((int)file,"H5Fopen",fileName);
 	QByteArray badataSet = currentDataSet.toLatin1();
 	hid_t dataset = H5Dopen2(file, badataSet.data(), H5P_DEFAULT);
+	handleError((int)file,"H5Dopen2",currentDataSet);
 
 	// Get datatype and dataspace
 	hid_t dtype = H5Dget_type(dataset);
+	handleError((int)dtype,"H5Dget_type");
 	H5T_class_t dclass = H5Tget_class(dtype);
+	handleError((int)dclass,"H5Dget_class");
 	size_t typeSize = H5Tget_size(dtype);
+	handleError((int)(typeSize-1),"H5Dget_size");
 
 	hid_t dataspace = H5Dget_space(dataset);
+	handleError((int)dataspace,"H5Dget_space");
 	int rank = H5Sget_simple_extent_ndims(dataspace);
+	handleError(rank,"H5Dget_simple_extent_ndims");
 
 	int columnOffset = 0;	// offset to import data
 	int actualRows=0, actualCols=0;	// rows and cols to read
@@ -902,9 +997,12 @@ QString HDFFilterPrivate::readCurrentDataSet(const QString & \
fileName, AbstractD  case H5T_STRING: {
 			char* data = (char *) malloc(typeSize * sizeof (char));
 			hid_t memtype = H5Tcopy(H5T_C_S1);
-			H5Tset_size(memtype, typeSize);
+			handleError((int)memtype,"H5Tcopy");
+			status = H5Tset_size(memtype, typeSize);
+			handleError(status,"H5Tset_size");
 
-			H5Dread(dataset, memtype, H5S_ALL, H5S_ALL, H5P_DEFAULT, data);
+			status = H5Dread(dataset, memtype, H5S_ALL, H5S_ALL, H5P_DEFAULT, data);
+			handleError(status,"H5Tread");
 			dataString<<data<<"\n";
 			free(data);
 			break;
@@ -920,7 +1018,8 @@ QString HDFFilterPrivate::readCurrentDataSet(const QString & \
fileName, AbstractD  }
 	case 1: {
 		hsize_t size, maxSize;
-		H5Sget_simple_extent_dims(dataspace, &size, &maxSize);
+		status = H5Sget_simple_extent_dims(dataspace, &size, &maxSize);
+		handleError(status,"H5Sget_simple_extent_dims");
 		int rows=size;
 		if(endRow == -1)
 			endRow=rows;
@@ -930,6 +1029,7 @@ QString HDFFilterPrivate::readCurrentDataSet(const QString & \
fileName, AbstractD  actualCols=1;
 #ifdef QT_DEBUG
 		H5T_order_t order = H5Tget_order(dtype);
+		handleError((int)order,"H5Sget_order");
 		qDebug()<<translateHDFClass(dclass)<<"("<<typeSize<<")"<<translateHDFOrder(order)<<", \
rows:"<<rows<<" max:"<<maxSize;  #endif
 		if(dataSource != NULL)
@@ -945,9 +1045,12 @@ QString HDFFilterPrivate::readCurrentDataSet(const QString & \
fileName, AbstractD  data[i] = data[0] + i * typeSize;
 
 			hid_t memtype = H5Tcopy(H5T_C_S1);
-			H5Tset_size(memtype, typeSize);
+			handleError((int)memtype,"H5Tcopy");
+			status = H5Tset_size(memtype, typeSize);
+			handleError((int)memtype,"H5Tset_size");
 
-			H5Dread(dataset, memtype, H5S_ALL, H5S_ALL, H5P_DEFAULT, data[0]);
+			status = H5Dread(dataset, memtype, H5S_ALL, H5S_ALL, H5P_DEFAULT, data[0]);
+			handleError(status,"H5Dread");
 
 			for (int i=startRow-1; i<qMin(endRow,lines+startRow-1); i++)
 				dataString<<data[i]<<"\n";
@@ -1000,6 +1103,7 @@ QString HDFFilterPrivate::readCurrentDataSet(const QString & \
fileName, AbstractD  case H5T_COMPOUND: {
 			// read compound data into dataPointers
 			int members = H5Tget_nmembers(dtype);
+			handleError(members,"H5Tget_nmembers");
 			if(dataSource != NULL) {
 				dataPointers.clear();
 				dataSource->create(dataPointers, mode, actualRows, members);
@@ -1010,15 +1114,17 @@ QString HDFFilterPrivate::readCurrentDataSet(const QString & \
fileName, AbstractD  \
dataString<<readHDFCompoundData1D(dataset,dtype,rows,lines,dataPointers);  break;
 		}
-		default:
+		default: {
 			dataString<<"rank = 1 not implemented yet for type "<<translateHDFClass(dclass);
 			qDebug()<<dataString.join("");
 		}
+		}
 		break;
 	}
 	case 2: {
 		hsize_t dims_out[2];
-		H5Sget_simple_extent_dims(dataspace, dims_out, NULL);
+		status = H5Sget_simple_extent_dims(dataspace, dims_out, NULL);
+		handleError(status,"H5Sget_simple_extent_dims");
 		int rows = dims_out[0];
 		int cols = dims_out[1];
 
@@ -1033,6 +1139,7 @@ QString HDFFilterPrivate::readCurrentDataSet(const QString & \
fileName, AbstractD  
 #ifdef QT_DEBUG
 		H5T_order_t order = H5Tget_order(dtype);
+		handleError((int)order,"H5Tget_order");
 		qDebug()<<translateHDFClass(dclass)<<"("<<typeSize<<")"<<translateHDFOrder(order)<<","<<rows<<"x"<<cols;
  qDebug()<<"startRow/endRow"<<startRow<<endRow;
 		qDebug()<<"startColumn/endColumn"<<startColumn<<endColumn;
@@ -1111,10 +1218,14 @@ QString HDFFilterPrivate::readCurrentDataSet(const QString & \
fileName, AbstractD  qDebug()<<dataString.join("");
 	}
 
-	H5Sclose(dataspace);
-	H5Tclose(dtype);
-	H5Dclose(dataset);
-	H5Fclose(file);
+	status = H5Sclose(dataspace);
+	handleError(status,"H5Sclose");
+	status = H5Tclose(dtype);
+	handleError(status,"H5Tclose");
+	status = H5Dclose(dataset);
+	handleError(status,"H5Dclose");
+	status = H5Fclose(file);
+	handleError(status,"H5Fclose");
 
 	// set column comments in spreadsheet
 	if (dataSource != NULL && dataSource->inherits("Spreadsheet")) {
diff --git a/src/backend/datasources/filters/HDFFilterPrivate.h \
b/src/backend/datasources/filters/HDFFilterPrivate.h index 3ab5113..d930ca8 100644
--- a/src/backend/datasources/filters/HDFFilterPrivate.h
+++ b/src/backend/datasources/filters/HDFFilterPrivate.h
@@ -57,6 +57,8 @@ class HDFFilterPrivate {
 		const static int MAXNAMELENGTH=1024;
 		QList<unsigned long> multiLinkList;	// used to find hard links
 #ifdef HAVE_HDF5
+		int status;
+		void handleError(int status, QString function, QString arg=QString());
 		QString translateHDFOrder(H5T_order_t);
 		QString translateHDFType(hid_t);
 		QString translateHDFClass(H5T_class_t);


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic