00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include "h5File.h"
00017 #include "h5Dataset.h"
00018 #include "h5Object.h"
00019 #include "h5String.h"
00020 #include "hdf5.h"
00021 #include <assert.h>
00022 #include <stdio.h>
00023 #include <time.h>
00024
00025
00026 int H5Dataset_init(H5Dataset *d);
00027
00028
00029 int H5Dataset_value_to_string(H5Dataset *d, hid_t tid, hid_t sid);
00030
00031 void H5Dataset_readPalette(H5Dataset *d, hid_t did);
00032 void H5Dataset_check_image(H5Dataset *d, hid_t did);
00033
00034
00035
00036
00037
00038
00039
00040
00041 int H5Dataset_create(H5Dataset* d)
00042 {
00043 int ret_value = 0;
00044
00045 THROW_UNSUPPORTED_OPERATION(d->error,
00046 "H5Dataset_create(H5Dataset* d) is not implemented",
00047 ret_value, done);
00048
00049 done:
00050 return ret_value;
00051 }
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061 int H5Dataset_delete(H5Dataset* d)
00062 {
00063 int ret_value = 0;
00064
00065
00066 THROW_UNSUPPORTED_OPERATION(d->error,
00067 "H5Dataset_delete(H5Dataset* d) is not implemented.",
00068 ret_value, done);
00069
00070 done:
00071 return ret_value;
00072 }
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083 int H5Dataset_read(H5Dataset* ind, H5Dataset* outd)
00084 {
00085 int ret_value=0, i=0;
00086 hid_t did=-1, sid=-1, tid=-1, msid=-1, ftid=-1;
00087 unsigned int npoints=1;
00088 hsize_t start[H5S_MAX_RANK], stride[H5S_MAX_RANK], count[H5S_MAX_RANK], mdims[1];
00089 time_t t0=0, t1=0;
00090 H5Eclear();
00091
00092 if (ind->space.rank <=0 )
00093 H5Dataset_init(ind);
00094
00095 t0 = time(NULL);
00096
00097 if ( (did = H5Dopen(ind->fid, ind->fullpath)) < 0)
00098 THROW_H5LIBRARY_ERROR(ind->error,ret_value, done);
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108 ftid = H5Dget_type(did);
00109 tid = H5Tget_native_type(ftid, H5T_DIR_ASCEND);
00110 H5Tclose(ftid);
00111
00112
00113 if (ind->type.order != get_machine_endian())
00114 THROW_ERROR(ind->error,
00115 "H5Dataset_read", "The byte order is different between the server and client",
00116 ret_value, done);
00117
00118
00119 sid = msid = H5S_ALL;
00120 npoints = 1;
00121 for (i=0; i<ind->space.rank; i++)
00122 npoints *= ind->space.count[i];
00123 ind->space.npoints = npoints;
00124 mdims[0] = npoints;
00125
00126
00127
00128
00129 if ( (ind->space.rank>0) && (ind->space.rank * ind->space.dims[0]>1) )
00130 {
00131 sid = H5Dget_space(did);
00132 for (i=0; i<ind->space.rank; i++)
00133 {
00134 start[i] = ind->space.start[i];
00135 stride[i] = ind->space.stride[i];
00136 count[i] = ind->space.count[i];
00137 }
00138 if (H5Sselect_hyperslab(sid, H5S_SELECT_SET, start, stride, count, NULL)<0)
00139 THROW_H5LIBRARY_ERROR(ind->error,ret_value, done);
00140
00141 msid = H5Screate_simple(1, mdims, NULL);
00142 }
00143
00144 if (ind->value)
00145 H5Dataset_freeBuffer(ind->value, ind->space, ind->type, ind->nvalue);
00146
00147 if (NULL == (ind->value = malloc(npoints*ind->type.size)) )
00148 THROW_ERROR(ind->error, "H5Dataset_read",
00149 "unable to allocate memory to read data from file",
00150 ret_value, done);
00151
00152 ind->nvalue = npoints*ind->type.size;
00153 ind->tclass = ind->type.tclass;
00154 if ( H5Dread(did, tid, msid, sid, H5P_DEFAULT, ind->value) < 0)
00155 {
00156 free (ind->value);
00157 ind->value = NULL;
00158 THROW_H5LIBRARY_ERROR(ind->error,ret_value, done);
00159 }
00160
00161
00162
00163
00164 if ( (H5DATATYPE_VLEN == ind->type.tclass )
00165 || (H5DATATYPE_COMPOUND == ind->type.tclass)
00166 || (H5DATATYPE_STRING == ind->type.tclass )
00167 )
00168 {
00169 H5Dataset_value_to_string(ind, tid, msid);
00170 }
00171
00172 done:
00173 if (msid > 0) H5Sclose(msid);
00174 if (sid > 0 ) H5Sclose(sid);
00175 if (tid > 0 ) H5Tclose(tid);
00176 if (did > 0 ) H5Dclose(did);
00177
00178 t1 = time(NULL);
00179
00180 #ifndef HDF5_LOCAL
00181 memset (outd, 0, sizeof (H5Dataset));
00182
00183
00184 outd->nvalue = ind->nvalue;
00185 outd->value = ind->value;
00186 outd->tclass = ind->tclass;
00187 outd->error = ind->error;
00188 outd->time = (long)(t1-t0);
00189
00190 ind->value = NULL;
00191 ind->nvalue = 0;
00192 #endif
00193
00194 return ret_value;
00195 }
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205 int H5Dataset_write(H5Dataset* d)
00206 {
00207 int ret_value = 0;
00208
00209
00210 THROW_UNSUPPORTED_OPERATION(d->error,
00211 "H5Dataset_write(H5Dataset* d) is not implemented",
00212 ret_value, done);
00213
00214 done:
00215 return ret_value;
00216 }
00217
00218
00219
00220
00221
00222 int H5Dataset_init(H5Dataset *d)
00223 {
00224 int ret_value=0, i=0;
00225 hsize_t dims[H5S_MAX_RANK];
00226 hid_t did=-1, sid=-1, tid=-1, ftid=-1;
00227 unsigned int npoints;
00228
00229 assert (d);
00230 H5Eclear();
00231
00232 if (d->space.rank > 0)
00233 goto done;
00234
00235 if ( (did = H5Dopen(d->fid, d->fullpath)) < 0)
00236 THROW_H5LIBRARY_ERROR(d->error,ret_value, done);
00237
00238 ftid = H5Dget_type(did);
00239 tid = H5Tget_native_type(ftid, H5T_DIR_ASCEND);
00240 if ( ftid > 0) H5Tclose(ftid);
00241
00242 d->tclass = d->type.tclass = (H5Datatype_class_t)H5Tget_class(tid);
00243 d->type.size = H5Tget_size(tid);
00244
00245 if ( d->type.tclass == H5DATATYPE_INTEGER
00246 || d->type.tclass == H5DATATYPE_FLOAT
00247 || d->type.tclass == H5DATATYPE_BITFIELD
00248 || d->type.tclass == H5DATATYPE_REFERENCE
00249 || d->type.tclass == H5DATATYPE_ENUM )
00250 {
00251 d->type.order = (H5Datatype_order_t)H5Tget_order(tid);
00252
00253 if (d->type.tclass == H5DATATYPE_INTEGER)
00254 {
00255 d->type.sign = (H5Datatype_sign_t)H5Tget_sign(tid);
00256
00257
00258 H5Dataset_readPalette(d, did);
00259
00260 H5Dataset_check_image(d, did);
00261 }
00262 }
00263 else if (d->type.tclass == H5DATATYPE_COMPOUND) {
00264 d->type.nmembers = H5Tget_nmembers(tid );
00265 d->type.mnames = (char **)malloc(d->type.nmembers*sizeof(char*));
00266 d->type.mtypes = (int *)malloc(d->type.nmembers*sizeof(int));
00267 for (i=0; i<d->type.nmembers; i++) {
00268 hid_t mtid = -1;
00269 int mtype = 0, mclass, msign, msize;
00270 d->type.mnames[i] = H5Tget_member_name(tid, i);
00271 mtid = H5Tget_member_type(tid, i);
00272 mclass = H5Tget_class(mtid);
00273 msign = H5Tget_sign(mtid);
00274 msize = H5Tget_size(mtid);
00275 mtype = mclass<<28 | msign<<24 | msize;
00276 d->type.mtypes[i] = mtype;
00277 H5Tclose(mtid);
00278 }
00279 }
00280
00281 sid = H5Dget_space(did);
00282 d->space.rank = H5Sget_simple_extent_ndims(sid);
00283 if ( H5Sget_simple_extent_dims(sid, dims, NULL) < 0 )
00284 THROW_H5LIBRARY_ERROR(d->error,ret_value, done);
00285
00286 if (d->space.rank<=0)
00287 {
00288 d->space.rank = 1;
00289 dims[0] = 1;
00290 }
00291
00292 npoints = 1;
00293 for (i=0; i<d->space.rank; i++)
00294 {
00295 d->space.dims[i] = dims[i];
00296 d->space.start[i] = 0;
00297 d->space.stride[i] = 1;
00298 d->space.count[i] = dims[i];
00299 npoints *= dims[i];
00300 }
00301 d->space.npoints = npoints;
00302
00303 done:
00304 if (sid > 0 ) H5Sclose(sid);
00305 if (tid > 0 ) H5Tclose(tid);
00306 if (did > 0 ) H5Dclose(did);
00307 return ret_value;
00308 }
00309
00310
00311
00312
00313
00314
00315
00316
00317 int H5Dataset_value_to_string(H5Dataset *d, hid_t tid, hid_t sid)
00318 {
00319 int ret_value=0;
00320 unsigned int i=0;
00321 char **strs;
00322 unsigned char *vp=NULL;
00323 h5str_t h5str;
00324 size_t offset=0, tsize=0, valuelen=0;
00325 void *value;
00326
00327 assert(d);
00328 assert(d->value);
00329 value = d->value;
00330 vp = (unsigned char *)d->value;
00331 d->value = (char **)malloc(d->space.npoints*sizeof(char *));
00332 assert(d->value);
00333 strs = (char**)d->value;
00334
00335 offset = 0;
00336 tsize = H5Tget_size(tid);
00337 memset(&h5str, 0, sizeof(h5str_t));
00338 h5str_new(&h5str, 4*tsize);
00339
00340 d->nvalue = 0;
00341 for (i=0; i<d->space.npoints; i++)
00342 {
00343 h5str_empty(&h5str);
00344 ret_value = h5str_sprintf(&h5str, tid, vp + offset, " || ");
00345 if (ret_value > 0)
00346 {
00347 valuelen = strlen(h5str.s)+1;
00348 strs[i] = (char *)malloc(valuelen);
00349 strcpy(strs[i], h5str.s);
00350
00351 d->nvalue ++;
00352 }
00353 offset += tsize;
00354 }
00355 h5str_free(&h5str);
00356
00357
00358 if (H5Tdetect_class(tid, H5T_VLEN) > 0)
00359 H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, value);
00360 free (value);
00361
00362 return ret_value;
00363 }
00364
00365
00366 char* H5Dataset_read_attr_value(hid_t aid)
00367 {
00368 hid_t asid=-1, atid=-1;
00369 int i, rank;
00370 hsize_t *dims;
00371 size_t size=1;
00372 char *attr_buf=NULL;
00373
00374 asid = H5Aget_space(aid);
00375 atid = H5Aget_type(aid);
00376 rank = H5Sget_simple_extent_ndims(asid);
00377
00378 if (rank > 0) {
00379 dims = (hsize_t *)malloc(rank * sizeof(hsize_t));
00380 H5Sget_simple_extent_dims(asid, dims, NULL);
00381 for (i=0; i<rank; i++) {
00382 size *= (size_t)dims[i];
00383 free(dims);
00384 }
00385 size *= H5Tget_size(atid);
00386 attr_buf = (char *)malloc(size);
00387
00388 if (H5Aread( aid, atid, attr_buf) < 0) {
00389 free(attr_buf);
00390 attr_buf = NULL;
00391 }
00392
00393 }
00394
00395 if( atid > 0) H5Tclose(atid);
00396 if (asid > 0) H5Sclose(asid);
00397
00398 return attr_buf;
00399 }
00400
00401
00402
00403 void H5Dataset_check_image(H5Dataset *d, hid_t did)
00404 {
00405 hid_t aid=-1;
00406 char *buf;
00407
00408 if (!d)
00409 return;
00410
00411 aid = H5Aopen_name(did, "CLASS");
00412 if (aid > 0) {
00413 buf = (char *) H5Dataset_read_attr_value(aid);
00414 if (buf) {
00415 if(strncmp(buf, "IMAGE", 5)==0)
00416 d->time |= H5D_IMAGE_FLAG;
00417 free(buf);
00418 }
00419 H5Aclose(aid);
00420 }
00421
00422 aid = H5Aopen_name(did, "IMAGE_SUBCLASS");
00423 if (aid > 0) {
00424 buf = (char *) H5Dataset_read_attr_value(aid);
00425 if (buf) {
00426 if(strncmp(buf, "IMAGE_TRUECOLOR", 15)==0)
00427 d->time |= H5D_IMAGE_TRUECOLOR_FLAG;
00428 free(buf);
00429 }
00430 H5Aclose(aid);
00431 }
00432
00433 aid = H5Aopen_name(did, "INTERLACE_MODE");
00434 if (aid > 0) {
00435 buf = (char *) H5Dataset_read_attr_value(aid);
00436 if (buf) {
00437 if(strncmp(buf, "INTERLACE_PIXEL", 15)==0)
00438 d->time |= H5D_IMAGE_INTERLACE_PIXEL_FLAG;
00439 else if(strncmp(buf, "INTERLACE_PLANE", 15)==0)
00440 d->time |= H5D_IMAGE_INTERLACE_PLANE_FLAG;
00441 free(buf);
00442 }
00443 H5Aclose(aid);
00444 }
00445 }
00446
00447
00448
00449
00450
00451 hobj_ref_t* H5Dataset_get_paletteRef(hid_t did)
00452 {
00453 hid_t aid=-1;
00454 hobj_ref_t *ref_buf=NULL;
00455
00456 aid = H5Aopen_name(did, "PALETTE");
00457
00458 if (aid > 0) {
00459
00460 ref_buf = (hobj_ref_t *) H5Dataset_read_attr_value(aid);
00461 H5Aclose(aid);
00462 }
00463
00464 return ref_buf;
00465 }
00466
00467 void H5Dataset_readPalette(H5Dataset *d, hid_t did)
00468 {
00469 hid_t pal_id=-1, tid=-1;
00470 hobj_ref_t *refs;
00471
00472 if (!d || did<=0 ) return;
00473
00474 refs = H5Dataset_get_paletteRef(did);
00475 if (refs) {
00476
00477 pal_id = H5Rdereference(d->fid, H5R_OBJECT, refs);
00478 tid = H5Dget_type(pal_id);
00479 if (H5Dget_storage_size(pal_id) <= 768)
00480 {
00481 H5Attribute *attr;
00482 d->nattributes = 1;
00483 d->attributes = (H5Attribute*)malloc(sizeof(H5Attribute));
00484 attr = &(d->attributes[0]);
00485 H5Attribute_ctor(attr);
00486 attr->value = (unsigned char *)malloc(3*256);
00487 memset(attr->value, 0, 768);
00488 attr->nvalue = 768;
00489 attr->name = (char*)malloc(20);
00490 strcpy(attr->name, PALETTE_VALUE);
00491 H5Dread( pal_id, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, attr->value);
00492 }
00493
00494 if (tid > 0) H5Tclose(tid);
00495 if (pal_id > 0) H5Dclose(pal_id);
00496 free(refs);
00497 }
00498
00499 }
00500
00501 int H5Dataset_read_attribute(H5Dataset* ind, H5Dataset* outd)
00502 {
00503 int ret_value=0, i=0, n=0;
00504 hid_t did=-1;
00505
00506 if ( (did = H5Dopen(ind->fid, ind->fullpath)) < 0)
00507 THROW_H5LIBRARY_ERROR(ind->error,ret_value, done);
00508
00509 if ( (n = H5Aget_num_attrs(did)) <=0 )
00510 goto done;
00511
00512 ind->nattributes = n;
00513 ind->attributes = (H5Attribute *)malloc(n*sizeof(H5Attribute));
00514 for (i=0; i<n; i++) {
00515 H5Attribute_ctor(&(ind->attributes[i]));
00516 ind->attributes[i].fid = ind->fid;
00517 ind->attributes[i].obj_path = (char *)malloc(strlen(ind->fullpath)+1);
00518 strcpy(ind->attributes[i].obj_path, ind->fullpath);
00519 ind->attributes[i].obj_type = H5OBJECT_DATASET;
00520 }
00521
00522
00523 H5File_read_attribute(did, ind->attributes);
00524
00525 done:
00526 if (did > 0 ) H5Dclose(did);
00527
00528 #ifndef HDF5_LOCAL
00529 memset (outd, 0, sizeof (H5Dataset));
00530
00531
00532
00533 outd->tclass = ind->tclass;
00534 outd->error = ind->error;
00535 outd->nattributes = ind->nattributes;
00536 outd->attributes = ind->attributes;
00537
00538 ind->attributes = NULL;
00539 ind->nattributes = 0;
00540 #endif
00541
00542 return ret_value;
00543 }
00544