HDF5: bug fix and improvements 32/9332/2
Calixte DENIZET [Sat, 29 Sep 2012 18:35:18 +0000 (20:35 +0200)]
Change-Id: I9f447111fab6a2d4f2bc1f6622b271d55764e910

42 files changed:
scilab/modules/hdf5/Makefile.am
scilab/modules/hdf5/Makefile.in
scilab/modules/hdf5/help/en_US/addchapter.sce [new file with mode: 0644]
scilab/modules/hdf5/help/en_US/h5open.xml [new file with mode: 0644]
scilab/modules/hdf5/includes/gw_hdf5.h
scilab/modules/hdf5/sci_gateway/c/gw_hdf5.c
scilab/modules/hdf5/sci_gateway/cpp/sci_h5get.cpp [new file with mode: 0644]
scilab/modules/hdf5/sci_gateway/cpp/sci_h5group.cpp
scilab/modules/hdf5/sci_gateway/cpp/sci_h5open.cpp
scilab/modules/hdf5/sci_gateway/cpp/sci_h5rm.cpp
scilab/modules/hdf5/sci_gateway/cpp/sci_percent_H5Object_e.cpp
scilab/modules/hdf5/sci_gateway/hdf5_gateway.xml
scilab/modules/hdf5/src/cpp/H5Attribute.cpp
scilab/modules/hdf5/src/cpp/H5AttributesList.cpp
scilab/modules/hdf5/src/cpp/H5BasicData.hxx
scilab/modules/hdf5/src/cpp/H5BitfieldData.hxx
scilab/modules/hdf5/src/cpp/H5CharData.hxx
scilab/modules/hdf5/src/cpp/H5CompoundData.hxx
scilab/modules/hdf5/src/cpp/H5Data.hxx
scilab/modules/hdf5/src/cpp/H5DataFactory.cpp
scilab/modules/hdf5/src/cpp/H5DataFactory.hxx
scilab/modules/hdf5/src/cpp/H5Dataset.cpp
scilab/modules/hdf5/src/cpp/H5Dataspace.cpp
scilab/modules/hdf5/src/cpp/H5Dataspace.hxx
scilab/modules/hdf5/src/cpp/H5EnumData.hxx
scilab/modules/hdf5/src/cpp/H5File.cpp
scilab/modules/hdf5/src/cpp/H5Group.cpp
scilab/modules/hdf5/src/cpp/H5Group.hxx
scilab/modules/hdf5/src/cpp/H5Object.cpp
scilab/modules/hdf5/src/cpp/H5Object.hxx
scilab/modules/hdf5/src/cpp/H5OpaqueData.hxx
scilab/modules/hdf5/src/cpp/H5ReferenceData.cpp
scilab/modules/hdf5/src/cpp/H5ReferenceData.hxx
scilab/modules/hdf5/src/cpp/H5StringData.cpp
scilab/modules/hdf5/src/cpp/H5StringData.hxx
scilab/modules/hdf5/src/cpp/H5TimeData.hxx
scilab/modules/hdf5/src/cpp/H5TransformedData.hxx
scilab/modules/hdf5/src/cpp/H5Type.cpp
scilab/modules/hdf5/src/cpp/H5UnsignedCharData.hxx
scilab/modules/hdf5/src/cpp/HDF5Scilab.cpp
scilab/modules/hdf5/src/cpp/HDF5Scilab.hxx
scilab/modules/helptools/etc/MAIN_CHAPTERS

index b2f531a..bfed567 100644 (file)
@@ -65,7 +65,8 @@ sci_gateway/cpp/sci_h5cp.cpp \
 sci_gateway/cpp/sci_h5isfoo.cpp \
 sci_gateway/cpp/sci_h5mount.cpp \
 sci_gateway/cpp/sci_h5umount.cpp \
-sci_gateway/cpp/sci_h5mv.cpp
+sci_gateway/cpp/sci_h5mv.cpp \
+sci_gateway/cpp/sci_h5get.cpp
 
 if GIWS
 BUILT_SOURCES=giws
index 740b71d..ac64103 100644 (file)
@@ -176,7 +176,8 @@ am__objects_3 = libscihdf5_la-sci_export_to_hdf5.lo \
        libscihdf5_la-sci_h5ln.lo libscihdf5_la-sci_h5readattr.lo \
        libscihdf5_la-sci_h5flush.lo libscihdf5_la-sci_h5cp.lo \
        libscihdf5_la-sci_h5isfoo.lo libscihdf5_la-sci_h5mount.lo \
-       libscihdf5_la-sci_h5umount.lo libscihdf5_la-sci_h5mv.lo
+       libscihdf5_la-sci_h5umount.lo libscihdf5_la-sci_h5mv.lo \
+       libscihdf5_la-sci_h5get.lo
 am__objects_4 = libscihdf5_la-gw_hdf5.lo
 am_libscihdf5_la_OBJECTS = $(am__objects_3) $(am__objects_4)
 libscihdf5_la_OBJECTS = $(am_libscihdf5_la_OBJECTS)
@@ -522,7 +523,8 @@ sci_gateway/cpp/sci_h5cp.cpp \
 sci_gateway/cpp/sci_h5isfoo.cpp \
 sci_gateway/cpp/sci_h5mount.cpp \
 sci_gateway/cpp/sci_h5umount.cpp \
-sci_gateway/cpp/sci_h5mv.cpp
+sci_gateway/cpp/sci_h5mv.cpp \
+sci_gateway/cpp/sci_h5get.cpp
 
 @GIWS_TRUE@BUILT_SOURCES = giws
 
@@ -823,6 +825,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscihdf5_la-sci_h5dataset.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscihdf5_la-sci_h5dump.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscihdf5_la-sci_h5flush.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscihdf5_la-sci_h5get.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscihdf5_la-sci_h5group.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscihdf5_la-sci_h5isfoo.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscihdf5_la-sci_h5ln.Plo@am__quote@
@@ -1218,6 +1221,13 @@ libscihdf5_la-sci_h5mv.lo: sci_gateway/cpp/sci_h5mv.cpp
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@ $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscihdf5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libscihdf5_la-sci_h5mv.lo `test -f 'sci_gateway/cpp/sci_h5mv.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_h5mv.cpp
 
+libscihdf5_la-sci_h5get.lo: sci_gateway/cpp/sci_h5get.cpp
+@am__fastdepCXX_TRUE@  $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscihdf5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libscihdf5_la-sci_h5get.lo -MD -MP -MF $(DEPDIR)/libscihdf5_la-sci_h5get.Tpo -c -o libscihdf5_la-sci_h5get.lo `test -f 'sci_gateway/cpp/sci_h5get.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_h5get.cpp
+@am__fastdepCXX_TRUE@  $(am__mv) $(DEPDIR)/libscihdf5_la-sci_h5get.Tpo $(DEPDIR)/libscihdf5_la-sci_h5get.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='sci_gateway/cpp/sci_h5get.cpp' object='libscihdf5_la-sci_h5get.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscihdf5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libscihdf5_la-sci_h5get.lo `test -f 'sci_gateway/cpp/sci_h5get.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_h5get.cpp
+
 mostlyclean-libtool:
        -rm -f *.lo
 
diff --git a/scilab/modules/hdf5/help/en_US/addchapter.sce b/scilab/modules/hdf5/help/en_US/addchapter.sce
new file mode 100644 (file)
index 0000000..54acc71
--- /dev/null
@@ -0,0 +1,10 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2011 - DIGITEO
+//
+// This file must be used under the terms of the CeCILL.
+// This source file is licensed as described in the file COPYING, which
+// you should have received as part of this distribution.  The terms
+// are also available at
+// http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+
+add_help_chapter("HDF5 Management",SCI+"/modules/hdf5/help/en_US",%T);
\ No newline at end of file
diff --git a/scilab/modules/hdf5/help/en_US/h5open.xml b/scilab/modules/hdf5/help/en_US/h5open.xml
new file mode 100644 (file)
index 0000000..0f52d91
--- /dev/null
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+* Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+* Copyright (C) 2012 - Scilab Enterprises - Calixte DENIZET
+*
+* This file must be used under the terms of the CeCILL.
+* This source file is licensed as described in the file COPYING, which
+* you should have received as part of this distribution.  The terms
+* are also available at
+* http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+*
+-->
+<refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svg="http://www.w3.org/2000/svg" xmlns:ns5="http://www.w3.org/1999/xhtml" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:db="http://docbook.org/ns/docbook" xmlns:scilab="http://www.scilab.org" xml:id="h5open" xml:lang="en">
+    <refnamediv>
+        <refname>h5open</refname>
+        <refpurpose>Open an HDF5 file</refpurpose>
+    </refnamediv>
+    <refsynopsisdiv>
+        <title>Calling Sequence</title>
+        <synopsis>
+            h5open(filename [, access])
+        </synopsis>
+    </refsynopsisdiv>
+    <refsection>
+        <title>Arguments</title>
+        <variablelist>
+            <varlistentry>
+                <term>filename</term>
+                <listitem>
+                    <para>a string giving the filename</para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>access</term>
+                <listitem>
+                    <para>access mode</para>
+                </listitem>
+            </varlistentry>
+        </variablelist>
+    </refsection>
+    <refsection>
+        <title>Description</title>
+        <para>Open an HDF5 file in using the access mode (by default "a").</para>
+        <para>The access mode is one of the five values:</para>
+        <simplelist type="inline">
+            <member>
+                "r": read only, the file must exist.
+            </member>
+            
+            <member>
+                "r+": read/write, the file must exist.
+            </member>
+            
+            <member>
+                "w": create file, truncate if exists.
+            </member>
+            
+            <member>
+                "w-": create file, fail if exists.
+            </member>
+            
+            <member>
+                "a": read/write if exists, create otherwise (default).
+            </member>
+            
+        </simplelist>
+    </refsection>
+    <refsection>
+        <title>Examples</title>
+        <programlisting role="example"><![CDATA[
+x=1:10;
+save(TMPDIR + "/x.sod", "x"); // SOD files are HDF5 ones       
+
+// Open the created file
+a=h5open(TMPDIR + "/x.sod");
+
+// Dump the file content
+h5dump(a);
+
+// list the contents of the root element.
+h5ls(a)
+
+// Get the SOD version
+a.root.SCILAB_sod_version.data
+
+// or if the name contains 'invalid' chars
+a.root("SCILAB_sod_version").data
+
+// Get the content of the dataset x
+a.root.x.data
+
+// Free all
+h5close(a);
+    ]]></programlisting>
+    </refsection>
+    <refsection role="see also">
+        <title>See Also</title>
+        <simplelist type="inline">
+            <member>
+            </member>
+        </simplelist>
+    </refsection>
+    <refsection>
+        <title>History</title>
+        <revhistory>
+            <revision>
+                <revnumber>5.5.0</revnumber>
+                <revremark>HDF5 module introduced.</revremark>
+            </revision>
+        </revhistory>
+    </refsection>
+</refentry>
index 8cdff62..5a9f868 100644 (file)
@@ -47,6 +47,7 @@ HDF5_SCILAB_IMPEXP int sci_h5isList(char *fname, unsigned long fname_len);
 HDF5_SCILAB_IMPEXP int sci_h5mount(char *fname, unsigned long fname_len);
 HDF5_SCILAB_IMPEXP int sci_h5umount(char *fname, unsigned long fname_len);
 HDF5_SCILAB_IMPEXP int sci_h5mv(char *fname, unsigned long fname_len);
+HDF5_SCILAB_IMPEXP int sci_h5get(char *fname, unsigned long fname_len);
 /*--------------------------------------------------------------------------*/
 #endif /* __GW_HDF5_H__ */
 /*--------------------------------------------------------------------------*/
index 13b09ef..eb5bb50 100644 (file)
@@ -53,6 +53,7 @@ static gw_generic_table Tab[] =
     {sci_h5mount, "h5mount"},
     {sci_h5umount, "h5umount"},
     {sci_h5mv, "h5mv"},
+    {sci_h5get, "h5get"},
 };
 /*--------------------------------------------------------------------------*/
 int gw_hdf5(void)
diff --git a/scilab/modules/hdf5/sci_gateway/cpp/sci_h5get.cpp b/scilab/modules/hdf5/sci_gateway/cpp/sci_h5get.cpp
new file mode 100644 (file)
index 0000000..8c7be5f
--- /dev/null
@@ -0,0 +1,107 @@
+/*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2012 - Scilab Enterprises - Calixte DENIZET
+ *
+ * This file must be used under the terms of the CeCILL.
+ * This source file is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution.  The terms
+ * are also available at
+ * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+ *
+ */
+
+#include <string>
+
+extern "C"
+{
+#include "gw_hdf5.h"
+#include "Scierror.h"
+#include "api_scilab.h"
+#include "localization.h"
+}
+
+#include "HDF5Scilab.hxx"
+
+using namespace org_modules_hdf5;
+
+/*
+  List the content of an object.
+  Scilab prototype:
+  - h5get(obj, name)
+/*
+
+/*--------------------------------------------------------------------------*/
+int sci_h5get(char *fname, unsigned long fname_len)
+{
+    H5Object * hobj = 0;
+    SciErr err;
+    int * addr = 0;
+    char * str = 0;
+    std::string name;
+    const int nbIn = nbInputArgument(pvApiCtx);
+
+    CheckOutputArgument(pvApiCtx, 1, 1);
+    CheckInputArgument(pvApiCtx, 2, 2);
+
+    err = getVarAddressFromPosition(pvApiCtx, 1, &addr);
+    if (err.iErr)
+    {
+        printError(&err, 0);
+        Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
+        return 0;
+    }
+
+    if (HDF5Scilab::isH5Object(addr, pvApiCtx))
+    {
+        hobj = HDF5Scilab::getH5Object(addr, pvApiCtx);
+        if (!hobj)
+        {
+            Scierror(999, _("%s: Invalid H5Object.\n"), fname);
+            return 0;
+        }
+    }
+    else
+    {
+        Scierror(999, _("%s: Wrong type for input argument #%d: A H5Object expected.\n"), fname, 1);
+        return 0;
+    }
+
+    err = getVarAddressFromPosition(pvApiCtx, 2, &addr);
+    if (err.iErr)
+    {
+        printError(&err, 0);
+        Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 2);
+        return 0;
+    }
+
+    if (!isStringType(pvApiCtx, addr) || !checkVarDimension(pvApiCtx, addr, 1, 1))
+    {
+        Scierror(999, gettext("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 2);
+        return 0;
+    }
+
+    if (getAllocatedSingleString(pvApiCtx, addr, &str) != 0)
+    {
+        Scierror(999, _("%s: No more memory.\n"), fname);
+        return 0;
+    }
+
+    name = std::string(str);
+    freeAllocatedSingleString(str);
+
+    try
+    {
+        HDF5Scilab::getObject(*hobj, name, nbIn + 1, pvApiCtx);
+    }
+    catch (const std::exception & e)
+    {
+        Scierror(999, _("%s: %s\n"), fname, e.what());
+        return 0;
+    }
+
+    AssignOutputVariable(pvApiCtx, 1) = nbIn + 1;
+    ReturnArguments(pvApiCtx);
+
+    return 0;
+}
+/*--------------------------------------------------------------------------*/
index 814e698..b7c0f24 100644 (file)
@@ -44,7 +44,6 @@ int sci_h5group(char *fname, unsigned long fname_len)
     char * expandedPath = 0;
     std::string _expandedPath;
     const int nbIn = nbInputArgument(pvApiCtx);
-    std::vector<std::string> v;
     int row, col;
 
     CheckOutputArgument(pvApiCtx, 1, 1);
@@ -115,27 +114,21 @@ int sci_h5group(char *fname, unsigned long fname_len)
         return 0;
     }
 
-    v = std::vector<std::string>();
-    v.reserve(row * col);
-    for (unsigned int i = 0; i < row * col; i++)
-    {
-        v.push_back(std::string(strs[i]));
-    }
-    freeAllocatedMatrixOfString(row, col, strs);
-
     try
     {
         if (hobj)
         {
-            HDF5Scilab::createGroup(*hobj, v);
+            HDF5Scilab::createGroup(*hobj, row * col, const_cast<const char **>(strs));
         }
         else
         {
-            HDF5Scilab::createGroup(_expandedPath, v);
+            HDF5Scilab::createGroup(_expandedPath, row * col, const_cast<const char **>(strs));
         }
+        freeAllocatedMatrixOfString(row, col, strs);
     }
     catch (const std::exception & e)
     {
+        freeAllocatedMatrixOfString(row, col, strs);
         Scierror(999, _("%s: %s\n"), fname, e.what());
         return 0;
     }
index f82a7be..e4d6e44 100644 (file)
@@ -31,98 +31,73 @@ int sci_h5open(char *fname, unsigned long fname_len)
     SciErr err;
     int * addr = 0;
     char * str = 0;
+    char * expandedPath = 0;
     std::string path;
-    std::string access;
-    std::string name;
-    char * args[3];
+    std::string access = "a";
     const int nbIn = nbInputArgument(pvApiCtx);
 
     CheckOutputArgument(pvApiCtx, 1, 1);
-    CheckInputArgument(pvApiCtx, 1, 3);
+    CheckInputArgument(pvApiCtx, 1, 2);
 
-    for (int i = 1; i <= nbIn; i++)
+    err = getVarAddressFromPosition(pvApiCtx, 1, &addr);
+    if (err.iErr)
     {
-        err = getVarAddressFromPosition(pvApiCtx, i, &addr);
+        Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
+        return 0;
+    }
+
+    if (!isStringType(pvApiCtx, addr) || !checkVarDimension(pvApiCtx, addr, 1, 1))
+    {
+        Scierror(999, gettext("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 1);
+        return 0;
+    }
+
+    if (getAllocatedSingleString(pvApiCtx, addr, &str) != 0)
+    {
+        Scierror(999, _("%s: No more memory.\n"), fname);
+        return 0;
+    }
+
+    expandedPath = expandPathVariable(str);
+    path = std::string(expandedPath);
+    FREE(expandedPath);
+    freeAllocatedSingleString(str);
+
+    if (nbIn == 2)
+    {
+        err = getVarAddressFromPosition(pvApiCtx, 2, &addr);
         if (err.iErr)
         {
-            for (int j = 0; j < i; j++)
-            {
-                freeAllocatedSingleString(args[j]);
-            }
-            printError(&err, 0);
-            Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, i);
+            Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 2);
             return 0;
         }
 
         if (!isStringType(pvApiCtx, addr) || !checkVarDimension(pvApiCtx, addr, 1, 1))
         {
-            for (int j = 0; j < i; j++)
-            {
-                freeAllocatedSingleString(args[j]);
-            }
-            Scierror(999, gettext("%s: Wrong type for input argument #%d: A string expected.\n"), fname, i);
+            Scierror(999, gettext("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 2);
             return 0;
         }
 
-        if (getAllocatedSingleString(pvApiCtx, addr, args + i - 1) != 0)
+        if (getAllocatedSingleString(pvApiCtx, addr, &str) != 0)
         {
-            for (int j = 0; j < i; j++)
-            {
-                freeAllocatedSingleString(args[j]);
-            }
             Scierror(999, _("%s: No more memory.\n"), fname);
             return 0;
         }
-    }
 
-    str = expandPathVariable(args[0]);
-    path = std::string(str);
-    FREE(str);
-
-    switch (nbIn)
-    {
-        case 1:
-            access = "a";
-            name = "/";
-            break;
-        case 2:
-            if (H5File::checkFileAccess(args[1]))
-            {
-                access = std::string(args[1]);
-                name = "/";
-            }
-            else
-            {
-                access = "a";
-                name = std::string(args[1]);
-            }
-            break;
-        case 3:
-            if (H5File::checkFileAccess(args[1]))
-            {
-                access = std::string(args[1]);
-                name = std::string(args[2]);
-            }
-            else if (H5File::checkFileAccess(args[2]))
-            {
-                name = std::string(args[1]);
-                access = std::string(args[2]);
-            }
-            else
-            {
-                name = std::string(args[1]);
-                access = "a";
-            }
-    }
+        if (!H5File::checkFileAccess(str))
+        {
+            Scierror(999, _("%s: Invalid access mode: %s.\n"), fname, str);
+            freeAllocatedSingleString(str);
+            return 0;
+        }
 
-    for (int i = 0; i < nbIn; i++)
-    {
-        freeAllocatedSingleString(args[i]);
+        access = std::string(str);
+        freeAllocatedSingleString(str);
     }
 
     try
     {
-        h5file = new H5File(path, name, access);
+        h5file = new H5File(path, "/", access);
     }
     catch (const std::exception & e)
     {
index 9b10623..af87e7a 100644 (file)
@@ -10,7 +10,6 @@
  *
  */
 
-#include <set>
 #include <string>
 
 extern "C"
@@ -42,7 +41,8 @@ int sci_h5rm(char *fname, unsigned long fname_len)
     SciErr err;
     int * addr = 0;
     char * str = 0;
-    std::string name;
+    char ** strs = 0;
+    int row, col;
     std::string file;
     const int nbIn = nbInputArgument(pvApiCtx);
 
@@ -68,6 +68,12 @@ int sci_h5rm(char *fname, unsigned long fname_len)
     }
     else
     {
+        if (nbIn == 1)
+        {
+            Scierror(999, gettext("%s: Wrong number of input arguments: 2 expected.\n"), fname, 1);
+            return 0;
+        }
+
         if (!isStringType(pvApiCtx, addr) || !checkVarDimension(pvApiCtx, addr, 1, 1))
         {
             Scierror(999, gettext("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 1);
@@ -94,32 +100,36 @@ int sci_h5rm(char *fname, unsigned long fname_len)
             return 0;
         }
 
-        if (!isStringType(pvApiCtx, addr) || !checkVarDimension(pvApiCtx, addr, 1, 1))
+        if (!isStringType(pvApiCtx, addr))
         {
             Scierror(999, gettext("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 2);
             return 0;
         }
 
-        if (getAllocatedSingleString(pvApiCtx, addr, &str) != 0)
+        if (getAllocatedMatrixOfString(pvApiCtx, addr, &row, &col, &strs) != 0)
         {
             Scierror(999, _("%s: No more memory.\n"), fname);
             return 0;
         }
-
-        name = std::string(str);
-        freeAllocatedSingleString(str);
     }
 
     try
     {
         if (hobj)
         {
-            HDF5Scilab::deleteObject(*hobj, name);
-            H5VariableScope::removeIdAndDelete(hobj->getScilabId());
+            if (strs)
+            {
+                HDF5Scilab::deleteObject(*hobj, row * col, const_cast<const char **>(strs));
+            }
+            else
+            {
+                HDF5Scilab::deleteObject(*hobj, std::string(""));
+                H5VariableScope::removeIdAndDelete(hobj->getScilabId());
+            }
         }
         else
         {
-            HDF5Scilab::deleteObject(file, name);
+            HDF5Scilab::deleteObject(file, row * col, const_cast<const char **>(strs));
         }
     }
     catch (const std::exception & e)
index 7881c3d..1ef811c 100644 (file)
@@ -146,14 +146,20 @@ int sci_percent_H5Object_e(char * fname, unsigned long fname_len)
         {
             obj->getAccessibleAttribute(_field, nbIn + 1, pvApiCtx);
         }
+        else if (obj->isReference())
+        {
+            H5ReferenceData * ref = reinterpret_cast<H5ReferenceData *>(obj);
+            H5Object & robj = ref->getReferencesObject(nbIn - 1, index);
+            robj.createOnScilabStack(nbIn + 1, pvApiCtx);
+        }
         else
         {
-            if (obj->isReference())
+            if (index)
             {
-                H5ReferenceData * ref = reinterpret_cast<H5ReferenceData *>(obj);
-                H5Object & robj = ref->getReferencesObject(nbIn - 1, index);
-                robj.createOnScilabStack(nbIn + 1, pvApiCtx);
+                delete[] index;
             }
+            Scierror(999, gettext("%s: Invalid field.\n"), fname);
+            return 0;
         }
     }
     catch (std::exception & e)
index ebca74a..6c84adc 100644 (file)
@@ -61,4 +61,5 @@
     <PRIMITIVE gatewayId="62" primitiveId="30" primitiveName="h5mount" />
     <PRIMITIVE gatewayId="62" primitiveId="31" primitiveName="h5umount" />
     <PRIMITIVE gatewayId="62" primitiveId="32" primitiveName="h5mv" />
+    <PRIMITIVE gatewayId="62" primitiveId="33" primitiveName="h5get" />
 </GATEWAY>
index ef68a2f..9ac770c 100644 (file)
@@ -128,14 +128,18 @@ std::string H5Attribute::toString(const unsigned int indentLevel) const
     std::ostringstream os;
     const std::string indentString = H5Object::getIndentString(indentLevel + 1);
     const H5Type & type = const_cast<H5Attribute *>(this)->getDataType();
+    const H5Dataspace & space = const_cast<H5Attribute *>(this)->getSpace();
 
     os << H5Object::getIndentString(indentLevel) << "HDF5 Attribute" << std::endl
-       << indentString << _("Filename") << ": " << getFile().getFileName() << std::endl
-       << indentString << _("Attribute name") << ": " << getName() << std::endl
-       << indentString << _("Attribute path") << ": " << getCompletePath() << std::endl
-       << indentString << _("Value class") << ": " << type.getClassName();
+       << indentString << "Filename" << ": " << getFile().getFileName() << std::endl
+       << indentString << "Name" << ": " << getName() << std::endl
+       << indentString << "Parent path" << ": " << getParent().getCompletePath() << std::endl
+       << indentString << "Type" << ": " << type.getTypeName() << std::endl
+       << indentString << "Dataspace" << ": " << space.getTypeName() << std::endl
+       << indentString << "Data" << ": " << space.getStringDims() << std::endl;
 
     delete &type;
+    delete &space;
 
     return os.str();
 }
index 17b0ab8..32b43f0 100644 (file)
@@ -118,7 +118,7 @@ std::string H5AttributesList::toString(const unsigned int indentLevel) const
     std::string indentString = H5Object::getIndentString(indentLevel);
 
     os << indentString << _("Filename") << ": " << getFile().getFileName() << std::endl
-       << indentString << _("Attributes") << ": [1 x " << getSize() << "]";
+       << indentString << _("Number of elements") << ": " << getSize();
 
     return os.str();
 }
index 93201ce..048e52c 100644 (file)
         SciErr err;                                                     \
         if (list)                                                       \
         {                                                               \
+            if (rows == 0 || cols == 0)                                 \
+            {                                                           \
+                createMatrixOfDoubleInList(pvApiCtx, position, list, listPosition, 0, 0, 0); \
+                return;                                                 \
+            }                                                           \
             err = createMatrixOf##NAME##InList(pvApiCtx, position, list, listPosition, rows, cols, ptr); \
         }                                                               \
         else                                                            \
         {                                                               \
+            if (rows == 0 || cols == 0)                                 \
+            {                                                           \
+                createEmptyMatrix(pvApiCtx, position);                  \
+                return;                                                 \
+            }                                                           \
             err = createMatrixOf##NAME(pvApiCtx, position, rows, cols, ptr); \
         }                                                               \
         if (err.iErr)                                                   \
-        {                                                              \
+        {                                                               \
             throw H5Exception(__LINE__, __FILE__, "Cannot allocate memory"); \
         }                                                               \
     }
@@ -46,7 +56,7 @@
             err = allocMatrixOf##NAME(pvApiCtx, position, rows, cols, ptr); \
         }                                                               \
         if (err.iErr)                                                   \
-        {                                                              \
+        {                                                               \
             throw H5Exception(__LINE__, __FILE__, "Cannot allocate memory"); \
         }                                                               \
     }
@@ -67,7 +77,7 @@ protected:
 
 public:
 
-    H5BasicData(H5Object & _parent, const hsize_t _totalSize, const hsize_t _dataSize, const hsize_t _ndims, const hsize_t * _dims, T * _data, const hsize_t _stride = -1, const size_t _offset = 0, const bool _dataOwner = true) : H5Data(_parent, _totalSize, _dataSize, _ndims, _dims, static_cast<void *>(_data), _stride, _offset, _dataOwner), transformedData(0)
+    H5BasicData(H5Object & _parent, const hsize_t _totalSize, const hsize_t _dataSize, const hsize_t _ndims, const hsize_t * _dims, const hsize_t _arank, const hsize_t * _adims, T * _data, const hsize_t _stride, const size_t _offset, const bool _dataOwner) : H5Data(_parent, _totalSize, _dataSize, _ndims, _dims, _arank, _adims, static_cast<void *>(_data), _stride, _offset, _dataOwner), transformedData(0)
     {
 
     }
@@ -82,7 +92,20 @@ public:
 
     virtual void printData(std::ostream & os, const unsigned int pos, const unsigned int indentLevel) const
     {
-        os << static_cast<T *>(getData())[pos];
+        if (adims)
+        {
+            os << "[ ";
+            const hsize_t _pos = pos * dataSize;
+            for (unsigned int i = 0; i < atotalSize - 1; i++)
+            {
+                os << static_cast<T *>(getData())[_pos + i] << ", ";
+            }
+            os << static_cast<T *>(getData())[_pos + atotalSize - 1] << " ]";
+        }
+        else
+        {
+            os << static_cast<T *>(getData())[pos];
+        }
     }
 
     virtual void copyData(T * dest) const
@@ -149,28 +172,40 @@ public:
     {
         SciErr err;
         T * newData = 0;
+        hsize_t _ndims = ndims;
+        hsize_t _totalSize = totalSize;
+        hsize_t * _dims = const_cast<hsize_t *>(dims);
 
-        if (ndims == 0)
+        if (adims)
+        {
+            _ndims += arank;
+            _totalSize *= atotalSize;
+            _dims = new hsize_t[_ndims];
+            memcpy(_dims, dims, sizeof(hsize_t) * ndims);
+            memcpy(_dims + ndims, adims, sizeof(hsize_t) * arank);
+        }
+
+        if (_ndims == 0)
         {
             create(pvApiCtx, lhsPosition, 1, 1, static_cast<T *>(getData()), parentList, listPosition);
         }
-        else if (ndims == 1)
+        else if (_ndims == 1)
         {
-            alloc(pvApiCtx, lhsPosition, 1, *dims, parentList, listPosition, &newData);
+            alloc(pvApiCtx, lhsPosition, 1, *_dims, parentList, listPosition, &newData);
             copyData(newData);
         }
         else
         {
-            if (ndims == 2)
+            if (_ndims == 2)
             {
-                alloc(pvApiCtx, lhsPosition, dims[0], dims[1], parentList, listPosition, &newData);
-                H5DataConverter::C2FHypermatrix(2, dims, 0, static_cast<T *>(getData()), newData);
+                alloc(pvApiCtx, lhsPosition, _dims[0], _dims[1], parentList, listPosition, &newData);
+                H5DataConverter::C2FHypermatrix(2, _dims, 0, static_cast<T *>(getData()), newData);
             }
             else
             {
                 int * list = getHypermatrix(pvApiCtx, lhsPosition, parentList, listPosition);
-                alloc(pvApiCtx, lhsPosition, 1, totalSize, list, 3, &newData);
-                H5DataConverter::C2FHypermatrix(ndims, dims, totalSize, static_cast<T *>(getData()), newData);
+                alloc(pvApiCtx, lhsPosition, 1, _totalSize, list, 3, &newData);
+                H5DataConverter::C2FHypermatrix(_ndims, _dims, _totalSize, static_cast<T *>(getData()), newData);
             }
         }
     }
@@ -180,6 +215,23 @@ public:
         return H5DataConverter::dump(alreadyVisited, indentLevel, ndims, dims, *this);
     }
 
+    static void putStringVectorOnStack(std::vector<std::string> & strs, const int rows, const int cols, const int pos, void * pvApiCtx)
+    {
+        if (rows * cols != strs.size())
+        {
+            throw H5Exception(__LINE__, __FILE__, _("Invalid dimensions."));
+        }
+
+        SciErr err;
+        std::vector<const char *> _strs;
+        _strs.reserve(strs.size());
+        for (unsigned int i = 0; i < strs.size(); i++)
+        {
+            _strs.push_back(strs[i].c_str());
+        }
+        create(pvApiCtx, pos, rows, cols, const_cast<char **>(&(_strs[0])), 0, 0);
+    }
+
     __SCILAB_ALLOCATORS_CREATORS__(double, Double)
     __SCILAB_ALLOCATORS_CREATORS__(char, Integer8)
     __SCILAB_ALLOCATORS_CREATORS__(unsigned char, UnsignedInteger8)
index 152c704..d55162b 100644 (file)
@@ -23,7 +23,7 @@ class H5Bitfield1Data : public H5BasicData<unsigned char>
 
 public:
 
-    H5Bitfield1Data(H5Object & _parent, const hsize_t _totalSize, const hsize_t _dataSize, const hsize_t _ndims, const hsize_t * _dims, unsigned char * _data, const hsize_t _stride = -1, const size_t _offset = 0, const bool _dataOwner = true) : H5BasicData(_parent, _totalSize, _dataSize, _ndims, _dims, _data, _stride, _offset, _dataOwner)
+    H5Bitfield1Data(H5Object & _parent, const hsize_t _totalSize, const hsize_t _dataSize, const hsize_t _ndims, const hsize_t * _dims, const hsize_t _arank, const hsize_t * _adims, unsigned char * _data, const hsize_t _stride, const size_t _offset, const bool _dataOwner) : H5BasicData(_parent, _totalSize, _dataSize, _ndims, _dims, _arank, _adims, _data, _stride, _offset, _dataOwner)
     {
 
     }
@@ -44,7 +44,7 @@ class H5Bitfield2Data : public H5BasicData<unsigned short>
 
 public:
 
-    H5Bitfield2Data(H5Object & _parent, const hsize_t _totalSize, const hsize_t _dataSize, const hsize_t _ndims, const hsize_t * _dims, unsigned short * _data, const hsize_t _stride = -1, const size_t _offset = 0, const bool _dataOwner = true) : H5BasicData(_parent, _totalSize, _dataSize, _ndims, _dims, _data, _stride, _offset, _dataOwner)
+    H5Bitfield2Data(H5Object & _parent, const hsize_t _totalSize, const hsize_t _dataSize, const hsize_t _ndims, const hsize_t * _dims, const hsize_t _arank, const hsize_t * _adims, unsigned short * _data, const hsize_t _stride, const size_t _offset, const bool _dataOwner) : H5BasicData(_parent, _totalSize, _dataSize, _ndims, _dims, _arank, _adims, _data, _stride, _offset, _dataOwner)
     {
 
     }
@@ -66,7 +66,7 @@ class H5Bitfield4Data : public H5BasicData<unsigned int>
 
 public:
 
-    H5Bitfield4Data(H5Object & _parent, const hsize_t _totalSize, const hsize_t _dataSize, const hsize_t _ndims, const hsize_t * _dims, unsigned int * _data, const hsize_t _stride = -1, const size_t _offset = 0, const bool _dataOwner = true) : H5BasicData(_parent, _totalSize, _dataSize, _ndims, _dims, _data, _stride, _offset, _dataOwner)
+    H5Bitfield4Data(H5Object & _parent, const hsize_t _totalSize, const hsize_t _dataSize, const hsize_t _ndims, const hsize_t * _dims, const hsize_t _arank, const hsize_t * _adims, unsigned int * _data, const hsize_t _stride, const size_t _offset, const bool _dataOwner) : H5BasicData(_parent, _totalSize, _dataSize, _ndims, _dims, _arank, _adims, _data, _stride, _offset, _dataOwner)
     {
 
     }
@@ -90,7 +90,7 @@ class H5Bitfield8Data : public H5BasicData<unsigned long>
 
 public:
 
-    H5Bitfield8Data(H5Object & _parent, const hsize_t _totalSize, const hsize_t _dataSize, const hsize_t _ndims, const hsize_t * _dims, unsigned long * _data, const hsize_t _stride = -1, const size_t _offset = 0, const bool _dataOwner = true) : H5BasicData(_parent, _totalSize, _dataSize, _ndims, _dims, _data, _stride, _offset, _dataOwner)
+    H5Bitfield8Data(H5Object & _parent, const hsize_t _totalSize, const hsize_t _dataSize, const hsize_t _ndims, const hsize_t * _dims, const hsize_t _arank, const hsize_t * _adims, unsigned long * _data, const hsize_t _stride, const size_t _offset, const bool _dataOwner) : H5BasicData(_parent, _totalSize, _dataSize, _ndims, _dims, _arank, _adims, _data, _stride, _offset, _dataOwner)
     {
 
     }
index deb51c8..faede5b 100644 (file)
@@ -23,7 +23,7 @@ class H5CharData : public H5BasicData<char>
 
 public:
 
-    H5CharData(H5Object & _parent, const hsize_t _totalSize, const hsize_t _dataSize, const hsize_t _ndims, const hsize_t * _dims, char * _data, const hsize_t _stride = -1, const size_t _offset = 0, const bool _dataOwner = true) : H5BasicData(_parent, _totalSize, _dataSize, _ndims, _dims, _data, _stride, _offset, _dataOwner)
+    H5CharData(H5Object & _parent, const hsize_t _totalSize, const hsize_t _dataSize, const hsize_t _ndims, const hsize_t * _dims, const hsize_t _arank, const hsize_t * _adims, char * _data, const hsize_t _stride, const size_t _offset, const bool _dataOwner) : H5BasicData(_parent, _totalSize, _dataSize, _ndims, _dims, _arank, _adims, _data, _stride, _offset, _dataOwner)
     {
 
     }
@@ -35,7 +35,20 @@ public:
 
     virtual void printData(std::ostream & os, const unsigned int pos, const unsigned int indentLevel) const
     {
-        os << (int)static_cast<char *>(getData())[pos];
+        if (adims)
+        {
+            os << "[ ";
+            const hsize_t _pos = pos * dataSize;
+            for (unsigned int i = 0; i < atotalSize - 1; i++)
+            {
+                os << (int)static_cast<char *>(getData())[_pos + i] << ", ";
+            }
+            os << (int)static_cast<char *>(getData())[_pos + atotalSize - 1] << " ]";
+        }
+        else
+        {
+            os << (int)static_cast<char *>(getData())[pos];
+        }
     }
 };
 }
index db60108..d690c6c 100644 (file)
@@ -27,7 +27,7 @@ class H5CompoundData : public H5BasicData<char>
 
 public:
 
-    H5CompoundData(H5Object & _parent, const hsize_t _totalSize, const hsize_t _dataSize, const hsize_t _ndims, const hsize_t * _dims, const unsigned int _nfields, std::string * _fieldsname, H5Data ** _fieldsvalue, char * _data, const bool _dataOwner) : H5BasicData(_parent, _totalSize, _dataSize, _ndims, _dims, _data, -1, 0, _dataOwner), nfields(_nfields), fieldsname(_fieldsname), fieldsvalue(_fieldsvalue)
+    H5CompoundData(H5Object & _parent, const hsize_t _totalSize, const hsize_t _dataSize, const hsize_t _ndims, const hsize_t * _dims, const hsize_t _arank, const hsize_t * _adims, const unsigned int _nfields, std::string * _fieldsname, H5Data ** _fieldsvalue, char * _data, const bool _dataOwner) : H5BasicData(_parent, _totalSize, _dataSize, _ndims, _dims, _arank, _adims, _data, -1, 0, _dataOwner), nfields(_nfields), fieldsname(_fieldsname), fieldsvalue(_fieldsvalue)
     {
 
     }
@@ -35,6 +35,10 @@ public:
     virtual ~H5CompoundData()
     {
         delete[] fieldsname;
+        for (unsigned int i = 0; i < nfields; i++)
+        {
+            delete fieldsvalue[i];
+        }
         delete[] fieldsvalue;
     }
 
index ef5fa9e..373b390 100644 (file)
@@ -28,15 +28,24 @@ protected:
     const hsize_t dataSize;
     const hsize_t ndims;
     const hsize_t * dims;
+    const hsize_t arank;
+    const hsize_t * adims;
+    hsize_t atotalSize;
     const hsize_t stride;
     const size_t offset;
     const bool dataOwner;
 
 public:
 
-    H5Data(H5Object & _parent, const hsize_t _totalSize, const hsize_t _dataSize, const hsize_t _ndims, const hsize_t * _dims, void * _data, const hsize_t _stride = -1, const size_t _offset = 0, const bool _dataOwner = true) : H5Object(_parent), totalSize(_totalSize), dataSize(_dataSize), ndims(_ndims), dims(_dims), data(_data), stride(_stride), offset(_offset), dataOwner(_dataOwner)
+    H5Data(H5Object & _parent, const hsize_t _totalSize, const hsize_t _dataSize, const hsize_t _ndims, const hsize_t * _dims, const hsize_t _arank, const hsize_t * _adims, void * _data, const hsize_t _stride, const size_t _offset, const bool _dataOwner) : H5Object(_parent), totalSize(_totalSize), dataSize(_dataSize), ndims(_ndims), dims(_dims), arank(_arank), adims(_adims), data(_data), stride(_stride), offset(_offset), dataOwner(_dataOwner), atotalSize(1)
     {
-
+        if (adims)
+        {
+            for (unsigned int i = 0; i < arank; i++)
+            {
+                atotalSize *= adims[i];
+            }
+        }
     }
 
     virtual ~H5Data()
@@ -45,6 +54,10 @@ public:
         {
             delete[] dims;
             delete[] static_cast<char *>(data);
+            if (adims)
+            {
+                delete[] adims;
+            }
         }
     }
 
index 5c13198..6718421 100644 (file)
@@ -17,142 +17,116 @@ namespace org_modules_hdf5
 
 H5Data & H5DataFactory::getData(H5Object & parent, const hid_t obj, H5Dataspace * space, hsize_t * selectdims, const bool isAttribute)
 {
+    hsize_t ndims;
+    hsize_t * dims = 0;
+    hsize_t arank = 0;
+    hsize_t * adims = 0;
+    hsize_t totalSize;
+    hsize_t dataSize;
+    void * data = 0;
+    const hid_t spaceId = space ? space->getH5Id() : -1;
     const hid_t type = isAttribute ? H5Aget_type(obj) : H5Dget_type(obj);
+    const hid_t nativeType = H5Tget_native_type(type, H5T_DIR_DEFAULT);
     if (type < 0)
     {
         throw H5Exception(__LINE__, __FILE__, _("Cannot get the data type"));
     }
-    H5Data * data = 0;
-    hid_t spaceId = space ? space->getH5Id() : -1;
 
     try
     {
-        switch (H5Tget_class(type))
-        {
-            case H5T_INTEGER:
-                data = &getIntegerData(parent, obj, spaceId, selectdims, type, isAttribute);
-                break;
-            case H5T_FLOAT:
-                data = &getFloatingData(parent, obj, spaceId, selectdims, type, isAttribute);
-                break;
-            case H5T_TIME:
-                data = &getTimeData(parent, obj, spaceId, selectdims, type, isAttribute);
-                break;
-            case H5T_STRING:
-                data = &getStringData(parent, obj, spaceId, selectdims, type, isAttribute);
-                break;
-            case H5T_BITFIELD:
-                data = &getBitfieldData(parent, obj, spaceId, selectdims, type, isAttribute);
-                break;
-            case H5T_OPAQUE:
-                data = &getOpaqueData(parent, obj, spaceId, selectdims, type, isAttribute);
-                break;
-            case H5T_COMPOUND:
-                data = &getCompoundData(parent, obj, spaceId, selectdims, type, isAttribute);
-                break;
-            case H5T_REFERENCE:
-                data = &getReferenceData(parent, obj, spaceId, selectdims, type, isAttribute);
-                break;
-            case H5T_ENUM:
-                data = &getEnumData(parent, obj, spaceId, selectdims, type, isAttribute);
-                break;
-            case H5T_VLEN:
-                //data = &getVlenData(parent, obj, spaceId, selectdims, type, isAttribute);
-                //break;
-            case H5T_ARRAY:
-                std::cout << "ARRAY" << std::endl;
-                //data = &getArrayData(parent, obj, type, isAttribute);
-                //break;
-            default:
-                throw H5Exception(__LINE__, __FILE__, _("Cannot get data from an unknown data type."));
-        }
+        getNativeData(obj, spaceId, selectdims, type, &totalSize, &dataSize, &ndims, &dims, &arank, &adims, &data, isAttribute);
+        H5Data & ret = getObjectData(parent, totalSize, dataSize, nativeType, ndims, dims, arank, adims, data, -1, 0, true);
+        H5Tclose(type);
+        H5Tclose(nativeType);
+
+        return ret;
     }
     catch (const H5Exception & e)
     {
         H5Tclose(type);
+        H5Tclose(nativeType);
+        if (dims)
+        {
+            delete[] dims;
+        }
+        if (adims)
+        {
+            delete[] adims;
+        }
+        if (data)
+        {
+            delete[] static_cast<char *>(data);
+        }
         throw;
     }
-
-    H5Tclose(type);
-
-    return *data;
 }
 
-H5Data & H5DataFactory::getData(H5Object & parent, const hsize_t totalSize, const hid_t type, hsize_t ndims, hsize_t * dims, void * data, const hsize_t stride, const size_t offset, const bool dataOwner)
+H5Data & H5DataFactory::getObjectData(H5Object & parent, const hsize_t totalSize, const hsize_t dataSize, const hid_t type, hsize_t ndims, hsize_t * dims, const hsize_t arank, const hsize_t * adims, void * data, const hsize_t stride, const size_t offset, const bool dataOwner)
 {
-    hsize_t dataSize = H5Tget_size(type);
-    if (H5Tget_class(type) == H5T_STRING && !H5Tis_variable_str(type))
-    {
-        // We have a C-string so it is null terminated
-        dataSize++;
-    }
-
     switch (H5Tget_class(type))
     {
         case H5T_INTEGER:
             if (H5Tequal(type, H5T_NATIVE_SCHAR))
             {
-                return *new H5CharData(parent, totalSize, dataSize, ndims, dims, (char *)data, stride, offset, false);
+                return *new H5CharData(parent, totalSize, dataSize, ndims, dims, arank, adims, (char *)data, stride, offset, dataOwner);
             }
             else if (H5Tequal(type, H5T_NATIVE_UCHAR))
             {
-                return *new H5UnsignedCharData(parent, totalSize, dataSize, ndims, dims, (unsigned char *)data, stride, offset, false);
+                return *new H5UnsignedCharData(parent, totalSize, dataSize, ndims, dims, arank, adims, (unsigned char *)data, stride, offset, dataOwner);
             }
             else if (H5Tequal(type, H5T_NATIVE_SHORT))
             {
-                return *new H5BasicData<short>(parent, totalSize, dataSize, ndims, dims, (short *)data, stride, offset, false);
+                return *new H5BasicData<short>(parent, totalSize, dataSize, ndims, dims, arank, adims, (short *)data, stride, offset, dataOwner);
             }
             else if (H5Tequal(type, H5T_NATIVE_USHORT))
             {
-                return *new H5BasicData<unsigned short>(parent, totalSize, dataSize, ndims, dims, (unsigned short *)data, stride, offset, false);
+                return *new H5BasicData<unsigned short>(parent, totalSize, dataSize, ndims, dims, arank, adims, (unsigned short *)data, stride, offset, dataOwner);
             }
             else if (H5Tequal(type, H5T_NATIVE_INT))
             {
-                return *new H5BasicData<int>(parent, totalSize, dataSize, ndims, dims, (int *)data, stride, offset, false);
+                return *new H5BasicData<int>(parent, totalSize, dataSize, ndims, dims, arank, adims, (int *)data, stride, offset, dataOwner);
             }
             else if (H5Tequal(type, H5T_NATIVE_UINT))
             {
-                return *new H5BasicData<unsigned int>(parent, totalSize, dataSize, ndims, dims, (unsigned int *)data, stride, offset, false);
+                return *new H5BasicData<unsigned int>(parent, totalSize, dataSize, ndims, dims, arank, adims, (unsigned int *)data, stride, offset, dataOwner);
             }
 
 #ifdef __SCILAB_INT64__
 
             else if (H5Tequal(type, H5T_NATIVE_LONG))
             {
-                return *new H5BasicData<long long>(parent, totalSize, dataSize, ndims, dims, (long long *)data, stride, offset, false);
+                return *new H5BasicData<long long>(parent, totalSize, dataSize, ndims, dims, arank, adims, (long long *)data, stride, offset, dataOwner);
             }
             else if (H5Tequal(type, H5T_NATIVE_ULONG))
             {
-                return *new H5BasicData<unsigned long long>(parent, totalSize, dataSize, ndims, dims, (unsigned long long *)data, stride, offset, false);
+                return *new H5BasicData<unsigned long long>(parent, totalSize, dataSize, ndims, dims, arank, adims, (unsigned long long *)data, stride, offset, dataOwner);
             }
 #else
 
             else if (H5Tequal(type, H5T_NATIVE_LONG))
             {
-                return *new H5TransformedData<long long, int>(parent, totalSize, dataSize, ndims, dims, (long long *)data, stride, offset, false);
+                return *new H5TransformedData<long long, int>(parent, totalSize, dataSize, ndims, dims, arank, adims, (long long *)data, stride, offset, dataOwner);
             }
             else if (H5Tequal(type, H5T_NATIVE_ULONG))
             {
-                return *new H5TransformedData<unsigned long long, unsigned int>(parent, totalSize, dataSize, ndims, dims, (unsigned long long *)data, stride, offset, false);
+                return *new H5TransformedData<unsigned long long, unsigned int>(parent, totalSize, dataSize, ndims, dims, arank, adims, (unsigned long long *)data, stride, offset, dataOwner);
             }
 
 #endif // __SCILAB_INT64__
 
             else
             {
-                H5Tclose(type);
                 throw H5Exception(__LINE__, __FILE__, _("Unknown integer datatype."));
             }
             break;
         case H5T_FLOAT:
             if (H5Tequal(type, H5T_NATIVE_FLOAT))
             {
-                //return *new H5FloatData(parent, totalSize, dataSize, ndims, dims, (float *)data, stride, offset, false);
-                return *new H5TransformedData<float, double>(parent, totalSize, dataSize, ndims, dims, (float *)data, stride, offset, false);
+                return *new H5TransformedData<float, double>(parent, totalSize, dataSize, ndims, dims, arank, adims, (float *)data, stride, offset, dataOwner);
             }
             else if (H5Tequal(type, H5T_NATIVE_DOUBLE))
             {
-                return *new H5BasicData<double>(parent, totalSize, dataSize, ndims, dims, (double *)data, stride, offset, false);
+                return *new H5BasicData<double>(parent, totalSize, dataSize, ndims, dims, arank, adims, (double *)data, stride, offset, dataOwner);
             }
             else
             {
@@ -160,34 +134,33 @@ H5Data & H5DataFactory::getData(H5Object & parent, const hsize_t totalSize, cons
             }
             break;
         case H5T_TIME:
-            return *new H5TimeData(parent, totalSize, dataSize, ndims, dims, (char *)data, stride, offset, false);
+            return *new H5TimeData(parent, totalSize, dataSize, ndims, dims, arank, adims, (char *)data, stride, offset, dataOwner);
         case H5T_STRING:
             if (H5Tis_variable_str(type))
             {
-                return *new H5StringData(parent, totalSize, dataSize, ndims, dims, (char **)data, stride, offset, false);
+                return *new H5StringData(parent, totalSize, dataSize, ndims, dims, arank, adims, (char **)data, stride, offset, dataOwner);
             }
             else
             {
-                return *new H5StringData(parent, totalSize, dataSize, ndims, dims, (char *)data, stride, offset, false);
+                return *new H5StringData(parent, totalSize, dataSize, ndims, dims, arank, adims, (char *)data, stride, offset, dataOwner);
             }
         case H5T_BITFIELD:
             switch (dataSize)
             {
                 case 1:
-                    return *new H5Bitfield1Data(parent, totalSize, dataSize, ndims, dims, static_cast<unsigned char *>(data), stride, offset, false);
+                    return *new H5Bitfield1Data(parent, totalSize, dataSize, ndims, dims, arank, adims, static_cast<unsigned char *>(data), stride, offset, dataOwner);
                 case 2:
-                    return *new H5Bitfield2Data(parent, totalSize, dataSize, ndims, dims, static_cast<unsigned short *>(data), stride, offset, false);
+                    return *new H5Bitfield2Data(parent, totalSize, dataSize, ndims, dims, arank, adims, static_cast<unsigned short *>(data), stride, offset, dataOwner);
                 case 4:
-                    return *new H5Bitfield4Data(parent, totalSize, dataSize, ndims, dims, static_cast<unsigned int *>(data), stride, offset, false);
+                    return *new H5Bitfield4Data(parent, totalSize, dataSize, ndims, dims, arank, adims, static_cast<unsigned int *>(data), stride, offset, dataOwner);
                 case 8:
                     //return *new H5BitfieldData<unsigned long long>(parent, totalSize, dataSize, ndims, dims, static_cast<unsigned long long *>(data), stride, offset, false);
                 default:
                     throw H5Exception(__LINE__, __FILE__, _("Bitfield is too big"));
             }
 
-            //return *new H5BitfieldData(parent, totalSize, dataSize, ndims, dims, (char *)data, stride, offset, false);
         case H5T_OPAQUE:
-            return *new H5OpaqueData(parent, totalSize, dataSize, ndims, dims, (unsigned char *)data, stride, offset, false);
+            return *new H5OpaqueData(parent, totalSize, dataSize, ndims, dims, arank, adims, (unsigned char *)data, stride, offset, dataOwner);
         case H5T_COMPOUND:
         {
             const unsigned int nmembers = (unsigned int)H5Tget_nmembers(type);
@@ -202,31 +175,45 @@ H5Data & H5DataFactory::getData(H5Object & parent, const hsize_t totalSize, cons
                 size_t offs = H5Tget_member_offset(type, i);
                 names[i] = std::string(mname);
                 free(mname);
-                fields[i] = &getData(parent, totalSize, mtype, ndims, dims, data, stride, offset + offs, false);
+                fields[i] = &getObjectData(parent, totalSize, dataSize, mtype, ndims, dims, arank, adims, data, stride, offset + offs, false);
             }
 
-            return *new H5CompoundData(parent, totalSize, dataSize, ndims, dims, nmembers, names, fields, (char *)data, dataOwner);
+            return *new H5CompoundData(parent, totalSize, dataSize, ndims, dims, arank, adims, nmembers, names, fields, (char *)data, dataOwner);
         }
         case H5T_REFERENCE:
             // TODO: virer le false
-            return *new H5ReferenceData(parent, false, totalSize, dataSize, ndims, dims, (char *)data, offset);
+            return *new H5ReferenceData(parent, false, totalSize, dataSize, ndims, dims, arank, adims, (char *)data, stride, offset, dataOwner);
         case H5T_ENUM:
         {
-            /*int nmembers = H5Tget_nmembers(type);
-              std::string * names = new std::string[nmembers];
+            int nmembers = H5Tget_nmembers(type);
+            std::string * names = nmembers > 0 ? new std::string[nmembers] : 0;
 
-              for (unsigned int i = 0; i < nmembers; i++)
-              {
-              char * mname = H5Tget_member_name(type, i);
-              names[i] = std::string(mname);
-              free(mname);
-              }
-              return *new H5EnumData(parent, totalSize, dataSize, ndims, dims, data, offset, names);*/
+            for (unsigned int i = 0; i < nmembers; i++)
+            {
+                char * mname = H5Tget_member_name(type, i);
+                names[i] = std::string(mname);
+                free(mname);
+            }
+
+            return *new H5EnumData(parent, totalSize, dataSize, ndims, dims, arank, adims, (unsigned int *)data, nmembers, names, stride, offset, dataOwner);
         }
         case H5T_VLEN:
             //return *new H5VlenData(parent, totalSize, dataSize, ndims, dims, data, offset);
         case H5T_ARRAY:
-            //return *new H5ArrayData(parent, totalSize, dataSize, ndims, dims, data, offset);
+        {
+            hid_t super = H5Tget_super(type);
+            try
+            {
+                H5Data & ret = getObjectData(parent, totalSize, dataSize, super, ndims, dims, arank, adims, data, stride, offset, dataOwner);
+                H5Tclose(super);
+                return ret;
+            }
+            catch (const H5Exception & e)
+            {
+                H5Tclose(super);
+                throw;
+            }
+        }
         default:
             throw H5Exception(__LINE__, __FILE__, _("Cannot get data from an unknown data type."));
     }
@@ -234,331 +221,7 @@ H5Data & H5DataFactory::getData(H5Object & parent, const hsize_t totalSize, cons
     throw H5Exception(__LINE__, __FILE__, _("Cannot get data from an unknown data type."));
 }
 
-H5Data & H5DataFactory::getIntegerData(H5Object & parent, const hid_t obj, const hid_t space, hsize_t * selectdims, const hid_t type, const bool isAttribute)
-{
-    hsize_t ndims;
-    hsize_t * dims = 0;
-    hsize_t totalSize;
-    hsize_t dataSize;
-    void * data = 0;
-    H5Data * dataObj = 0;
-    const hid_t nativeType = H5Tget_native_type(type, H5T_DIR_DEFAULT);
-
-    getNativeData(obj, space, selectdims, type, &totalSize, &dataSize, &ndims, &dims, &data, isAttribute);
-
-    if (H5Tequal(nativeType, H5T_NATIVE_SCHAR))
-    {
-        dataObj = new H5CharData(parent, totalSize, dataSize, ndims, dims, (char *)data);
-    }
-    else if (H5Tequal(nativeType, H5T_NATIVE_UCHAR))
-    {
-        dataObj = new H5UnsignedCharData(parent, totalSize, dataSize, ndims, dims, (unsigned char *)data);
-    }
-    else if (H5Tequal(nativeType, H5T_NATIVE_SHORT))
-    {
-        dataObj = new H5BasicData<short>(parent, totalSize, dataSize, ndims, dims, (short *)data);
-    }
-    else if (H5Tequal(nativeType, H5T_NATIVE_USHORT))
-    {
-        dataObj = new H5BasicData<unsigned short>(parent, totalSize, dataSize, ndims, dims, (unsigned short *)data);
-    }
-    else if (H5Tequal(nativeType, H5T_NATIVE_INT))
-    {
-        dataObj = new H5BasicData<int>(parent, totalSize, dataSize, ndims, dims, (int *)data);
-    }
-    else if (H5Tequal(nativeType, H5T_NATIVE_UINT))
-    {
-        dataObj = new H5BasicData<unsigned int>(parent, totalSize, dataSize, ndims, dims, (unsigned int *)data);
-    }
-
-#ifdef __SCILAB_INT64__
-
-    else if (H5Tequal(nativeType, H5T_NATIVE_LONG))
-    {
-        dataObj = new H5BasicData<long long>(parent, totalSize, dataSize, ndims, dims, (long long *)data);
-    }
-    else if (H5Tequal(nativeType, H5T_NATIVE_ULONG))
-    {
-        dataObj = new H5BasicData<unsigned long long>(parent, totalSize, dataSize, ndims, dims, (unsigned long long *)data);
-    }
-
-#else
-
-    else if (H5Tequal(nativeType, H5T_NATIVE_LONG))
-    {
-        dataObj = new H5TransformedData<long long, int>(parent, totalSize, dataSize, ndims, dims, (long long *)data);
-    }
-    else if (H5Tequal(nativeType, H5T_NATIVE_ULONG))
-    {
-        dataObj = new H5TransformedData<unsigned long long, unsigned int>(parent, totalSize, dataSize, ndims, dims, (unsigned long long *)data);
-    }
-
-#endif // __SCILAB_INT64__
-
-    else
-    {
-        H5Tclose(nativeType);
-        delete[] dims;
-        delete[] static_cast<char *>(data);
-        throw H5Exception(__LINE__, __FILE__, _("Unknown integer datatype."));
-    }
-
-    H5Tclose(nativeType);
-
-    return *dataObj;
-}
-
-H5Data & H5DataFactory::getFloatingData(H5Object & parent, const hid_t obj, const hid_t space, hsize_t * selectdims, const hid_t type, const bool isAttribute)
-{
-    hsize_t ndims;
-    hsize_t totalSize;
-    hsize_t dataSize;
-    hsize_t * dims = 0;
-    void * data = 0;
-    H5Data * dataObj = 0;
-    const hid_t nativeType = H5Tget_native_type(type, H5T_DIR_DEFAULT);
-
-    getNativeData(obj, space, selectdims, type, &totalSize, &dataSize, &ndims, &dims, &data, isAttribute);
-
-    if (H5Tequal(nativeType, H5T_NATIVE_FLOAT))
-    {
-        dataObj = new H5TransformedData<float, double>(parent, totalSize, dataSize, ndims, dims, (float *)data);
-    }
-    else if (H5Tequal(nativeType, H5T_NATIVE_DOUBLE))
-    {
-        dataObj = new H5BasicData<double>(parent, totalSize, dataSize, ndims, dims, (double *)data);
-    }
-    else
-    {
-        H5Tclose(nativeType);
-        delete[] dims;
-        delete[] static_cast<char *>(data);
-        throw H5Exception(__LINE__, __FILE__, _("Unknown floating-point datatype."));
-    }
-
-    H5Tclose(nativeType);
-
-    return *dataObj;
-}
-
-H5StringData & H5DataFactory::getStringData(H5Object & parent, const hid_t obj, const hid_t space, hsize_t * selectdims, const hid_t type, const bool isAttribute)
-{
-    hsize_t ndims;
-    hsize_t totalSize;
-    hsize_t dataSize;
-    hsize_t * dims = 0;
-    void * data = 0;
-
-    getNativeData(obj, space, selectdims, type, &totalSize, &dataSize, &ndims, &dims, &data, isAttribute);
-    if (H5Tis_variable_str(type))
-    {
-        return *new H5StringData(parent, totalSize, dataSize, ndims, dims, (char **)data);
-    }
-    else
-    {
-        return *new H5StringData(parent, totalSize, dataSize, ndims, dims, (char *)data);
-    }
-}
-
-H5TimeData & H5DataFactory::getTimeData(H5Object & parent, const hid_t obj, const hid_t space, hsize_t * selectdims, const hid_t type, const bool isAttribute)
-{
-    hsize_t ndims;
-    hsize_t totalSize;
-    hsize_t dataSize;
-    hsize_t * dims = 0;
-    void * data = 0;
-
-    getNativeData(obj, space, selectdims, type, &totalSize, &dataSize, &ndims, &dims, &data, isAttribute);
-
-    return *new H5TimeData(parent, totalSize, dataSize, ndims, dims, static_cast<char *>(data));
-}
-
-H5Data & H5DataFactory::getBitfieldData(H5Object & parent, const hid_t obj, const hid_t space, hsize_t * selectdims, const hid_t type, const bool isAttribute)
-{
-    hsize_t ndims;
-    hsize_t totalSize;
-    hsize_t dataSize;
-    hsize_t * dims = 0;
-    void * data = 0;
-
-    getNativeData(obj, space, selectdims, type, &totalSize, &dataSize, &ndims, &dims, &data, isAttribute);
-
-    switch (dataSize)
-    {
-        case 1:
-            return *new H5Bitfield1Data(parent, totalSize, dataSize, ndims, dims, static_cast<unsigned char *>(data));
-        case 2:
-            return *new H5Bitfield2Data(parent, totalSize, dataSize, ndims, dims, static_cast<unsigned short *>(data));
-        case 4:
-            return *new H5Bitfield4Data(parent, totalSize, dataSize, ndims, dims, static_cast<unsigned int *>(data));
-        case 8:
-            ///return *new H5BitfieldData<unsigned long long>(parent, totalSize, dataSize, ndims, dims, static_cast<unsigned long long *>(data));
-        default:
-            delete[] dims;
-            delete[] static_cast<char *>(data);
-            throw H5Exception(__LINE__, __FILE__, _("Bitfield is too big"));
-    }
-}
-
-H5OpaqueData & H5DataFactory::getOpaqueData(H5Object & parent, const hid_t obj, const hid_t space, hsize_t * selectdims, const hid_t type, const bool isAttribute)
-{
-    hsize_t ndims;
-    hsize_t totalSize;
-    hsize_t dataSize;
-    hsize_t * dims = 0;
-    void * data = 0;
-
-    getNativeData(obj, space, selectdims, type, &totalSize, &dataSize, &ndims, &dims, &data, isAttribute);
-
-    return *new H5OpaqueData(parent, totalSize, dataSize, ndims, dims, static_cast<unsigned char *>(data));
-}
-
-H5Data & H5DataFactory::getCompoundData(H5Object & parent, const hid_t obj, const hid_t space, hsize_t * selectdims, const hid_t type, const bool isAttribute)
-{
-    hsize_t ndims;
-    hsize_t totalSize;
-    hsize_t dataSize;
-    hsize_t * dims = 0;
-    void * data = 0;
-    const hid_t nativeType = H5Tget_native_type(type, H5T_DIR_DEFAULT);
-
-    getNativeData(obj, space, selectdims, type, &totalSize, &dataSize, &ndims, &dims, &data, isAttribute);
-
-    try
-    {
-        return getData(parent, totalSize, nativeType, ndims, dims, data, dataSize, 0, true);
-    }
-    catch (const H5Exception & e)
-    {
-        H5Tclose(nativeType);
-        throw;
-    }
-}
-
-H5ReferenceData & H5DataFactory::getReferenceData(H5Object & parent, const hid_t obj, const hid_t space, hsize_t * selectdims, const hid_t type, const bool isAttribute)
-{
-    hsize_t ndims;
-    hsize_t totalSize;
-    hsize_t dataSize;
-    hsize_t * dims = 0;
-    void * data = 0;
-
-    getNativeData(obj, space, selectdims, type, &totalSize, &dataSize, &ndims, &dims, &data, isAttribute);
-    return *new H5ReferenceData(parent, H5Tequal(type, H5T_STD_REF_DSETREG) > 0, totalSize, dataSize, ndims, dims, (char *)data);
-}
-
-H5EnumData & H5DataFactory::getEnumData(H5Object & parent, const hid_t obj, const hid_t space, hsize_t * selectdims, const hid_t type, const bool isAttribute)
-{
-    hsize_t ndims;
-    hsize_t totalSize;
-    hsize_t dataSize;
-    hsize_t * dims = 0;
-    void * data = 0;
-    int nmembers = H5Tget_nmembers(type);
-    std::string * names = nmembers > 0 ? new std::string[nmembers] : 0;
-
-    for (unsigned int i = 0; i < nmembers; i++)
-    {
-        char * mname = H5Tget_member_name(type, i);
-        names[i] = std::string(mname);
-        free(mname);
-    }
-
-    getNativeData(obj, space, selectdims, type, &totalSize, &dataSize, &ndims, &dims, &data, isAttribute);
-
-    return *new H5EnumData(parent, totalSize, dataSize, ndims, dims, static_cast<unsigned int *>(data), nmembers, names);
-}
-
-/*    H5VlenData & H5DataFactory::getVlenData(H5Object & parent, const hid_t obj, const hid_t space, hsize_t * selectdims, const hid_t type, const bool isAttribute)
-    {
-        hsize_t ndims;
-        hsize_t totalSize;
-        hsize_t dataSize;
-        hsize_t * dims = 0;
-        void * data = 0;
-
-        getNativeData(obj, space, selectdims, type, &totalSize, &dataSize, &ndims, &dims, &data, isAttribute);
-
-        return *new H5VlenData(parent, totalSize, dataSize, ndims, dims, static_cast<unsigned char *>(data));
-    }
-
-  H5ArrayData & H5DataFactory::getArrayData(H5Object & parent, const hid_t obj, const hid_t type, const bool isAttribute)
-    {
-    hsize_t ndims;
-    hsize_t totalSize;
-    hisze_t dataSize;
-    hsize_t * dims = 0;
-    void * data = 0;
-
-    getNativeData(obj, type, &totalSize, &dataSize, &ndims, &dims, &data, isAttribute);
-
-    return *new H5ArrayData(parent, totalSize, dataSize, ndims, dims, data);
-    }*/
-
-//  getNativeData(obj, type, &totalSize, &dataSize, &ndims, &dims, &data, isAttribute);
-
-//return *new H5StringData(parent, totalSize, dataSize, ndims, dims, data);
-
-/*void H5DataFactory::getNativeData(const hid_t obj, const hid_t type, hsize_t * totalSize, hsize_t * dataSize, hsize_t * ndims, hsize_t ** dims, void ** data, const bool isAttribute)
-  {
-  hid_t nativeType = H5Tget_native_type(type, H5T_DIR_DEFAULT);
-  const hid_t space = isAttribute ? H5Aget_space(obj) : H5Dget_space(obj);
-  hsize_t size = H5Tget_size(nativeType);
-  *totalSize = 1;
-  *dims = new hsize_t[__SCILAB_HDF5_MAX_DIMS__]();
-  *ndims = H5Sget_simple_extent_dims(space, *dims, 0);
-
-  if (H5Tget_class(nativeType) == H5T_STRING && !H5Tis_variable_str(nativeType))
-  {
-  // We have a C-string so it is null terminated
-  size++;
-  }
-
-  *dataSize = size;
-
-  for (unsigned int i = 0; i < *ndims; i++)
-  {
-  *totalSize *= (*dims)[i];
-  }
-
-  size *= *totalSize;
-
-  if ((hsize_t)((size_t)size) != size)
-  {
-  H5Tclose(type);
-  H5Tclose(nativeType);
-  H5Sclose(space);
-  delete[] *dims;
-  throw H5Exception(__LINE__, __FILE__, _("Memory to allocate is too big"));
-  }
-
-  *data = static_cast<void *>(new char[(size_t)size]());
-  if (!*data)
-  {
-  H5Tclose(type);
-  H5Tclose(nativeType);
-  H5Sclose(space);
-  delete[] *dims;
-  throw H5Exception(__LINE__, __FILE__, _("Cannot allocate memory to get the data"));
-  }
-
-  if ((isAttribute && H5Aread(obj, nativeType, *data) < 0)
-  || (!isAttribute && H5Dread(obj, nativeType, H5S_ALL, space, H5P_DEFAULT, *data) < 0))
-  {
-  H5Tclose(type);
-  H5Tclose(nativeType);
-  H5Sclose(space);
-  delete[] static_cast<char *>(*data);
-  delete[] *dims;
-  throw H5Exception(__LINE__, __FILE__, _("Cannot retrieve the data from the attribute"));
-  }
-
-  H5Tclose(nativeType);
-  H5Sclose(space);
-  }
-*/
-
-void H5DataFactory::getNativeData(const hid_t obj, const hid_t space, hsize_t * selectdims, const hid_t type, hsize_t * totalSize, hsize_t * dataSize, hsize_t * ndims, hsize_t ** dims, void ** data, const bool isAttribute)
+void H5DataFactory::getNativeData(const hid_t obj, const hid_t space, hsize_t * selectdims, const hid_t type, hsize_t * totalSize, hsize_t * dataSize, hsize_t * ndims, hsize_t ** dims, hsize_t * arank, hsize_t ** adims, void ** data, const bool isAttribute)
 {
     hid_t nativeType = H5Tget_native_type(type, H5T_DIR_DEFAULT);
     hid_t _space = space < 0 ? (isAttribute ? H5Aget_space(obj) : H5Dget_space(obj)) : space;
@@ -568,12 +231,21 @@ void H5DataFactory::getNativeData(const hid_t obj, const hid_t space, hsize_t *
     herr_t err;
     hsize_t * blockbuf = 0;
     bool hyperslab = false;
+    bool isString = false;
 
     *totalSize = 1;
     if (H5Tget_class(nativeType) == H5T_STRING && !H5Tis_variable_str(nativeType))
     {
         // We have a C-string so it is null terminated
         size++;
+        isString = true;
+    }
+
+    if (H5Tget_class(nativeType) == H5T_ARRAY)
+    {
+        *arank = H5Tget_array_ndims(nativeType);
+        *adims = new hsize_t[*arank];
+        H5Tget_array_dims(nativeType, *adims);
     }
 
     *dataSize = size;
@@ -622,7 +294,16 @@ void H5DataFactory::getNativeData(const hid_t obj, const hid_t space, hsize_t *
         throw H5Exception(__LINE__, __FILE__, _("Memory to allocate is too big"));
     }
 
-    *data = static_cast<void *>(new char[(size_t)size]());
+    if (isString)
+    {
+        *data = static_cast<void *>(new char[(size_t)size]());
+    }
+    else
+    {
+        // No need to initialize the array
+        *data = static_cast<void *>(new char[(size_t)size]);
+    }
+
     if (!*data)
     {
         H5Tclose(nativeType);
index 7f517e3..0229de4 100644 (file)
@@ -36,35 +36,13 @@ class H5DataFactory
 
 public:
 
-    static H5Data & getData(H5Object & parent, const hid_t obj, const bool isAttribute);
-
     static H5Data & getData(H5Object & parent, const hid_t obj, H5Dataspace * space, hsize_t * selectdims, const bool isAttribute);
 
 private:
 
-    static H5Data & getData(H5Object & parent, const hsize_t totalSize, const hid_t type, hsize_t ndims, hsize_t * dims, void * data, const hsize_t stride, const size_t offset, const bool dataOwner = false);
-
-    static H5Data & getIntegerData(H5Object & parent, const hid_t obj, const hid_t space, hsize_t * selectdims, const hid_t type, const bool isAttribute);
-
-    static H5Data & getFloatingData(H5Object & parent, const hid_t obj, const hid_t space, hsize_t * selectdims, const hid_t type, const bool isAttribute);
-
-    static H5StringData & getStringData(H5Object & parent, const hid_t obj, const hid_t space, hsize_t * selectdims, const hid_t type, const bool isAttribute);
-
-    static H5TimeData & getTimeData(H5Object & parent, const hid_t obj, const hid_t space, hsize_t * selectdims, const hid_t type, const bool isAttribute);
-
-    static H5Data & getBitfieldData(H5Object & parent, const hid_t obj, const hid_t space, hsize_t * selectdims, const hid_t type, const bool isAttribute);
-
-    static H5OpaqueData & getOpaqueData(H5Object & parent, const hid_t obj, const hid_t space, hsize_t * selectdims, const hid_t type, const bool isAttribute);
-
-    static H5Data & getCompoundData(H5Object & parent, const hid_t obj, const hid_t space, hsize_t * selectdims, const hid_t type, const bool isAttribute);
-
-    static H5ReferenceData & getReferenceData(H5Object & parent, const hid_t obj, const hid_t space, hsize_t * selectdims, const hid_t type, const bool isAttribute);
-
-    static H5EnumData & getEnumData(H5Object & parent, const hid_t obj, const hid_t space, hsize_t * selectdims, const hid_t type, const bool isAttribute);
-
-    //static H5VlenData & getVlenData(H5Object & parent, const hid_t obj, const hid_t space, hsize_t * selectdims, const hid_t type, const bool isAttribute);
+    static H5Data & getObjectData(H5Object & parent, const hsize_t totalSize, const hsize_t dataSize, const hid_t type, hsize_t ndims, hsize_t * dims, const hsize_t arank, const hsize_t * adims, void * data, const hsize_t stride, const size_t offset, const bool dataOwner);
 
-    static void getNativeData(const hid_t obj, const hid_t space, hsize_t * selectdims, const hid_t type, hsize_t * totalSize, hsize_t * dataSize, hsize_t * ndims, hsize_t ** dims, void ** data, const bool isAttribute);
+    static void getNativeData(const hid_t obj, const hid_t space, hsize_t * selectdims, const hid_t type, hsize_t * totalSize, hsize_t * dataSize, hsize_t * ndims, hsize_t ** dims, hsize_t * arank, hsize_t ** adims, void ** data, const bool isAttribute);
 };
 }
 
index ae852d1..dd01ec9 100644 (file)
@@ -109,21 +109,13 @@ void H5Dataset::getAccessibleAttribute(const std::string & _name, const int pos,
     SciErr err;
     std::string lower(_name);
 
-    try
-    {
-        H5Attribute * attr = new H5Attribute(*const_cast<H5Dataset *>(this), _name);
-        attr->createOnScilabStack(pos, pvApiCtx);
-
-        return;
-    }
-    catch (const H5Exception & e) { }
-
     std::transform(_name.begin(), _name.end(), lower.begin(), tolower);
 
     if (lower == "attributes")
     {
-        const H5AttributesList & attrs = const_cast<H5Dataset *>(this)->getAttributes();
-        attrs.createOnScilabStack(pos, pvApiCtx);
+        std::vector<std::string> names;
+        getNames(*this, names, ATTRIBUTE);
+        H5BasicData<char>::putStringVectorOnStack(names, names.size(), 1, pos, pvApiCtx);
 
         return;
     }
@@ -160,6 +152,16 @@ void H5Dataset::getAccessibleAttribute(const std::string & _name, const int pos,
 
         return;
     }
+    else
+    {
+        try
+        {
+            H5Object & obj = H5Object::getObject(*const_cast<H5Dataset *>(this), _name);
+            obj.createOnScilabStack(pos, pvApiCtx);
+            return;
+        }
+        catch (const H5Exception & e) { }
+    }
 
     H5Object::getAccessibleAttribute(_name, pos, pvApiCtx);
 }
@@ -208,7 +210,7 @@ std::string H5Dataset::dump(std::map<haddr_t, std::string> & alreadyVisited, con
 void H5Dataset::printLsInfo(std::ostringstream & os) const
 {
     const H5Dataspace & space = const_cast<H5Dataset *>(this)->getSpace();
-    std::vector<unsigned int> dims = space.getDims();
+    std::vector<unsigned int> dims = space.getDims(true);
     std::string str(getName());
     H5Object::getResizedString(str);
 
@@ -243,10 +245,7 @@ std::string H5Dataset::ls() const
 void H5Dataset::ls(std::vector<std::string> & name, std::vector<std::string> & type) const
 {
     herr_t err;
-    OpDataGetLs opdata;
-    opdata.parent = const_cast<H5Dataset *>(this);
-    opdata.name = &name;
-    opdata.type = &type;
+    OpDataGetLs opdata(const_cast<H5Dataset *>(this), &name, &type);
     hsize_t idx = 0;
 
     err = H5Aiterate(dataset, H5_INDEX_NAME, H5_ITER_INC, &idx, H5Object::getLsAttributes, &opdata);
@@ -264,11 +263,11 @@ std::string H5Dataset::toString(const unsigned int indentLevel) const
     const H5AttributesList & attrs = const_cast<H5Dataset *>(this)->getAttributes();
 
     os << H5Object::getIndentString(indentLevel) << "HDF5 Dataset" << std::endl
-       << indentString << _("Filename") << ": " << getParent().getFile().getFileName() << std::endl
-       << indentString << _("Name") << ": " << getName() << std::endl
-       << indentString << _("Path") << ": " << getCompletePath() << std::endl
-       << indentString << _("Elements type") << ": " << type.getTypeName() << std::endl
-       << indentString << _("Attributes") << ": [1 x " << attrs.getSize() << "]";
+       << indentString << "Filename" << ": " << getParent().getFile().getFileName() << std::endl
+       << indentString << "Name" << ": " << getName() << std::endl
+       << indentString << "Path" << ": " << getCompletePath() << std::endl
+       << indentString << "Type" << ": " << type.getTypeName() << std::endl
+       << indentString << "Attributes" << ": [1 x " << attrs.getSize() << "]";
 
     delete &type;
     delete &attrs;
index 293ef4a..84fd809 100644 (file)
@@ -51,10 +51,9 @@ std::string H5Dataspace::getTypeName() const
     }
 }
 
-std::vector<unsigned int> H5Dataspace::getDims() const
+std::vector<unsigned int> H5Dataspace::getDims(const bool b) const
 {
     hsize_t dims[__SCILAB_HDF5_MAX_DIMS__];
-    hsize_t maxdims[__SCILAB_HDF5_MAX_DIMS__];
     int ndims;
     std::vector<unsigned int> vdims;
     H5S_class_t _class = H5Sget_simple_extent_type(space);
@@ -65,7 +64,14 @@ std::vector<unsigned int> H5Dataspace::getDims() const
             vdims.push_back(1);
             break;
         case H5S_SIMPLE:
-            ndims = H5Sget_simple_extent_dims(space, (hsize_t *)dims, (hsize_t *)maxdims);
+            if (b)
+            {
+                ndims = H5Sget_simple_extent_dims(space, (hsize_t *)dims, 0);
+            }
+            else
+            {
+                ndims = H5Sget_simple_extent_dims(space, 0, (hsize_t *)dims);
+            }
             vdims.reserve(ndims);
             for (int i = 0; i < ndims; i++)
             {
@@ -98,9 +104,20 @@ void H5Dataspace::getAccessibleAttribute(const std::string & _name, const int po
     std::string lower(_name);
     std::transform(_name.begin(), _name.end(), lower.begin(), tolower);
 
-    if (lower == "dimensions")
+    if (lower == "dims")
     {
-        std::vector<unsigned int> dims = getDims();
+        std::vector<unsigned int> dims = getDims(true);
+        err = createMatrixOfUnsignedInteger32(pvApiCtx, pos, 1, dims.size(), &(dims[0]));
+        if (err.iErr)
+        {
+            throw H5Exception(__LINE__, __FILE__, _("Cannot create an array of integer on the stack."));
+        }
+
+        return;
+    }
+    else if (lower == "extents")
+    {
+        std::vector<unsigned int> dims = getDims(false);
         err = createMatrixOfUnsignedInteger32(pvApiCtx, pos, 1, dims.size(), &(dims[0]));
         if (err.iErr)
         {
@@ -182,6 +199,42 @@ std::string H5Dataspace::dump(std::map<haddr_t, std::string> & alreadyVisited, c
     return os.str();
 }
 
+std::string H5Dataspace::getStringDims() const
+{
+    H5S_class_t _class = H5Sget_simple_extent_type(space);
+    switch (_class)
+    {
+        case H5S_SCALAR:
+            return "[1 x 1]";
+        case H5S_SIMPLE:
+        {
+            const std::vector<unsigned int> dims = getDims(true);
+            std::ostringstream os;
+
+            if (dims.size() == 1)
+            {
+                os << "[1 x " << dims[0] << "]";
+                return os.str();
+            }
+
+            os << "[";
+            for (unsigned int i = 0; i < dims.size() - 1; i++)
+            {
+                os << dims[i] << " x ";
+            }
+            os << dims[dims.size() - 1] << "]";
+
+            return os.str();
+        }
+        case H5S_NULL:
+            return "[]";
+        case H5S_NO_CLASS:
+            return "?";
+        default:
+            return std::string(_("unknown dataspace"));
+    }
+}
+
 std::string H5Dataspace::toString(unsigned int indentLevel) const
 {
     std::ostringstream os;
@@ -189,14 +242,13 @@ std::string H5Dataspace::toString(unsigned int indentLevel) const
     std::string type = getTypeName();
 
     os << H5Object::getIndentString(indentLevel) << "HDF5 Dataspace" << std::endl
-       << indentString << _("Filename") << ": " << getParent().getFile().getFileName() << std::endl
-       << indentString << _("Name") << ": " << getName() << std::endl
-       << indentString << _("Path") << ": " << getCompletePath() << std::endl
-       << indentString << _("Type") << ": " << getTypeName();
+       << indentString << "Filename" << ": " << getParent().getFile().getFileName() << std::endl
+       << indentString << "Path" << ": " << getCompletePath() << std::endl
+       << indentString << "Type" << ": " << type;
 
     if (type == "simple")
     {
-        os << std::endl << indentString << _("Dimensions") << ": [1 x " << getDims().size() << "]";
+        os << std::endl << indentString << _("Dimensions") << ": [1 x " << getDims(true).size() << "]";
     }
 
     return os.str();
index d6ae956..0dbc08c 100644 (file)
@@ -29,11 +29,12 @@ public:
     ~H5Dataspace();
 
     virtual hid_t getH5Id();
-    virtual std::vector<unsigned int> getDims() const;
+    virtual std::vector<unsigned int> getDims(const bool b) const;
     virtual std::string getTypeName() const;
 
     virtual std::string dump(std::map<haddr_t, std::string> & alreadyVisited, const unsigned int indentLevel) const;
     virtual std::string toString(const unsigned int indentLevel) const;
+    virtual std::string getStringDims() const;
 
     virtual void getAccessibleAttribute(const std::string & name, const int pos, void * pvApiCtx) const;
 
index db302d6..106ca1f 100644 (file)
@@ -26,7 +26,7 @@ class H5EnumData : public H5BasicData<unsigned int>
 
 public:
 
-    H5EnumData(H5Object & _parent, const hsize_t _totalSize, const hsize_t _dataSize, const hsize_t _ndims, const hsize_t * _dims, unsigned int * _data, const int _nmembers, const std::string * _names, const hsize_t _stride = -1, const size_t _offset = 0, const bool _dataOwner = true) : H5BasicData(_parent, _totalSize, _dataSize, _ndims, _dims, _data, _stride, _offset, _dataOwner), nmembers(_nmembers), names(_names)
+    H5EnumData(H5Object & _parent, const hsize_t _totalSize, const hsize_t _dataSize, const hsize_t _ndims, const hsize_t * _dims, const hsize_t _arank, const hsize_t * _adims, unsigned int * _data, const int _nmembers, const std::string * _names, const hsize_t _stride, const size_t _offset, const bool _dataOwner) : H5BasicData(_parent, _totalSize, _dataSize, _ndims, _dims, _arank, _adims, _data, _stride, _offset, _dataOwner), nmembers(_nmembers), names(_names)
     {
 
     }
index da054df..4d2d059 100644 (file)
@@ -25,6 +25,8 @@ namespace org_modules_hdf5
 void H5File::init()
 {
     bool opened;
+    hid_t fapl = H5Pcreate(H5P_FILE_ACCESS);
+    H5Pset_fclose_degree(fapl, H5F_CLOSE_STRONG);
 
 #if !defined(__HDF5ERROR_PRINT__)
     H5Eset_auto(H5E_DEFAULT, 0, 0);
@@ -35,10 +37,12 @@ void H5File::init()
         case RDONLY:
             if (!FileExist(const_cast<char *>(filename.c_str())) || H5Fis_hdf5(filename.c_str()) <= 0)
             {
+                H5Pclose(fapl);
                 throw H5Exception(__LINE__, __FILE__, _("Invalid hdf5 file: %s"), filename.c_str());
             }
 
-            file = H5Fopen(filename.c_str(), H5F_ACC_RDONLY, H5P_DEFAULT);
+            file = H5Fopen(filename.c_str(), H5F_ACC_RDONLY, fapl);
+            H5Pclose(fapl);
             if (file < 0)
             {
                 throw H5Exception(__LINE__, __FILE__, _("Cannot open the given hdf5 file: %s"), filename.c_str());
@@ -49,10 +53,12 @@ void H5File::init()
         case RDWR:
             if (!FileExist(const_cast<char *>(filename.c_str())) || H5Fis_hdf5(filename.c_str()) <= 0)
             {
+                H5Pclose(fapl);
                 throw H5Exception(__LINE__, __FILE__, _("Invalid hdf5 file: %s"), filename.c_str());
             }
 
-            file = H5Fopen(filename.c_str(), H5F_ACC_RDWR, H5P_DEFAULT);
+            file = H5Fopen(filename.c_str(), H5F_ACC_RDWR, fapl);
+            H5Pclose(fapl);
             if (file < 0)
             {
                 throw H5Exception(__LINE__, __FILE__, _("Cannot open the given hdf5 file: %s"), filename.c_str());
@@ -61,7 +67,8 @@ void H5File::init()
             opened = true;
             break;
         case TRUNC:
-            file = H5Fcreate(filename.c_str(), H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+            file = H5Fcreate(filename.c_str(), H5F_ACC_TRUNC, H5P_DEFAULT, fapl);
+            H5Pclose(fapl);
             if (file < 0)
             {
                 throw H5Exception(__LINE__, __FILE__, _("Cannot create the given hdf5 file: %s"), filename.c_str());
@@ -69,7 +76,8 @@ void H5File::init()
 
             break;
         case EXCL:
-            file = H5Fcreate(filename.c_str(), H5F_ACC_EXCL, H5P_DEFAULT, H5P_DEFAULT);
+            file = H5Fcreate(filename.c_str(), H5F_ACC_EXCL, H5P_DEFAULT, fapl);
+            H5Pclose(fapl);
             if (file < 0)
             {
                 throw H5Exception(__LINE__, __FILE__, _("Cannot create the given hdf5 file: %s"), filename.c_str());
@@ -80,7 +88,8 @@ void H5File::init()
             {
                 if (H5Fis_hdf5(filename.c_str()) > 0)
                 {
-                    file = H5Fopen(filename.c_str(), H5F_ACC_RDWR, H5P_DEFAULT);
+                    file = H5Fopen(filename.c_str(), H5F_ACC_RDWR, fapl);
+                    H5Pclose(fapl);
                     if (file < 0)
                     {
                         throw H5Exception(__LINE__, __FILE__, _("Cannot open the given hdf5 file: %s"), filename.c_str());
@@ -90,17 +99,23 @@ void H5File::init()
                 }
                 else
                 {
+                    H5Pclose(fapl);
                     throw H5Exception(__LINE__, __FILE__, _("Cannot append the file (not HDF5): %s"), filename.c_str());
                 }
             }
             else
             {
-                file = H5Fcreate(filename.c_str(), H5F_ACC_EXCL, H5P_DEFAULT, H5P_DEFAULT);
+                file = H5Fcreate(filename.c_str(), H5F_ACC_EXCL, H5P_DEFAULT, fapl);
+                H5Pclose(fapl);
                 if (file < 0)
                 {
                     throw H5Exception(__LINE__, __FILE__, _("Cannot create the given hdf5 file: %s"), filename.c_str());
                 }
             }
+            break;
+        default:
+            H5Pclose(fapl);
+            throw H5Exception(__LINE__, __FILE__, _("Invalid flag."));
     }
 
     if (opened && path != "/" && H5Lexists(file, path.c_str(), H5P_DEFAULT) <= 0)
@@ -208,6 +223,32 @@ void H5File::getAccessibleAttribute(const std::string & _name, const int pos, vo
         catch (const H5Exception & e) { }
     */
 
+    if (H5Object::isEmptyPath(_name))
+    {
+        this->createOnScilabStack(pos, pvApiCtx);
+        return;
+    }
+
+    if (_name.at(0) == '/')
+    {
+        H5Object * obj = 0;
+
+        try
+        {
+            obj = &H5Object::getObject(*const_cast<H5File *>(this), _name);
+            obj->createOnScilabStack(pos, pvApiCtx);
+            return;
+        }
+        catch (const H5Exception & e)
+        {
+            if (obj)
+            {
+                delete obj;
+            }
+            throw;
+        }
+    }
+
     std::transform(_name.begin(), _name.end(), lower.begin(), tolower);
 
     if (lower == "name")
@@ -300,10 +341,9 @@ std::string H5File::toString(const unsigned int indentLevel) const
     err = H5get_libversion(&major, &minor, &release);
 
     os << H5Object::getIndentString(indentLevel) << "HDF5 File" << std::endl
-       << indentString << _("Filename") << ": " << filename << std::endl
-       << indentString << _("HDF5 library version") << ": " << major << "." << minor << "." << release << std::endl
-       << indentString << _("File size") << ": " << size << std::endl
-       << indentString << _("Root object") << ": " << path << std::flush;
+       << indentString << "Filename" << ": " << filename << std::endl
+       << indentString << "Version" << ": " << major << "." << minor << "." << release << std::endl
+       << indentString << "Size" << ": " << size << std::endl;
 
     return os.str();
 }
index 689fbe2..731ad3e 100644 (file)
@@ -17,6 +17,7 @@
 #include "H5DatasetsList.hxx"
 #include "H5TypesList.hxx"
 #include "H5Link.hxx"
+#include "H5BasicData.hxx"
 
 namespace org_modules_hdf5
 {
@@ -118,41 +119,69 @@ void H5Group::getAccessibleAttribute(const std::string & _name, const int pos, v
     SciErr err;
     std::string lower(_name);
 
-    try
-    {
-        H5Object & obj = H5Object::getObject(*const_cast<H5Group *>(this), _name);
-        obj.createOnScilabStack(pos, pvApiCtx);
-        return;
-    }
-    catch (const H5Exception & e) { }
-
     std::transform(_name.begin(), _name.end(), lower.begin(), tolower);
 
     if (lower == "attributes")
     {
-        const H5AttributesList & attrs = const_cast<H5Group *>(this)->getAttributes();
-        attrs.createOnScilabStack(pos, pvApiCtx);
+        std::vector<std::string> names;
+        getNames(*this, names, ATTRIBUTE);
+        H5BasicData<char>::putStringVectorOnStack(names, names.size(), 1, pos, pvApiCtx);
 
         return;
     }
     else if (lower == "groups")
     {
-        const H5GroupsList & groups = const_cast<H5Group *>(this)->getGroups();
-        groups.createOnScilabStack(pos, pvApiCtx);
+        std::vector<std::string> names;
+        getNames(*this, names, GROUP);
+        H5BasicData<char>::putStringVectorOnStack(names, names.size(), 1, pos, pvApiCtx);
 
         return;
     }
     else if (lower == "datasets")
     {
-        const H5DatasetsList & sets = const_cast<H5Group *>(this)->getDatasets();
-        sets.createOnScilabStack(pos, pvApiCtx);
+        std::vector<std::string> names;
+        getNames(*this, names, DATASET);
+        H5BasicData<char>::putStringVectorOnStack(names, names.size(), 1, pos, pvApiCtx);
 
         return;
     }
     else if (lower == "types")
     {
-        const H5TypesList & types = const_cast<H5Group *>(this)->getTypes();
-        types.createOnScilabStack(pos, pvApiCtx);
+        std::vector<std::string> names;
+        getNames(*this, names, TYPE);
+        H5BasicData<char>::putStringVectorOnStack(names, names.size(), 1, pos, pvApiCtx);
+
+        return;
+    }
+    else if (lower == "externals")
+    {
+        std::vector<std::string> names;
+        getNames(*this, names, EXTERNAL);
+        H5BasicData<char>::putStringVectorOnStack(names, names.size(), 1, pos, pvApiCtx);
+
+        return;
+    }
+    else if (lower == "softs")
+    {
+        std::vector<std::string> names;
+        getNames(*this, names, SOFT);
+        H5BasicData<char>::putStringVectorOnStack(names, names.size(), 1, pos, pvApiCtx);
+
+        return;
+    }
+    else if (lower == "danglings")
+    {
+        std::vector<std::string> names;
+        getNames(*this, names, DANGLING);
+        H5BasicData<char>::putStringVectorOnStack(names, names.size(), 1, pos, pvApiCtx);
+
+        return;
+    }
+    else if (lower == "hards")
+    {
+        std::vector<std::string> names;
+        getNames(*this, names, HARD);
+        H5BasicData<char>::putStringVectorOnStack(names, names.size(), 1, pos, pvApiCtx);
 
         return;
     }
@@ -186,6 +215,16 @@ void H5Group::getAccessibleAttribute(const std::string & _name, const int pos, v
 
         return;
     }
+    else
+    {
+        try
+        {
+            H5Object & obj = H5Object::getObject(*const_cast<H5Group *>(this), _name);
+            obj.createOnScilabStack(pos, pvApiCtx);
+            return;
+        }
+        catch (const H5Exception & e) { }
+    }
 
     H5Object::getAccessibleAttribute(_name, pos, pvApiCtx);
 }
@@ -193,10 +232,7 @@ void H5Group::getAccessibleAttribute(const std::string & _name, const int pos, v
 void H5Group::ls(std::vector<std::string> & name, std::vector<std::string> & type) const
 {
     herr_t err;
-    OpDataGetLs opdata;
-    opdata.parent = const_cast<H5Group *>(this);
-    opdata.name = &name;
-    opdata.type = &type;
+    OpDataGetLs opdata(const_cast<H5Group *>(this), &name, &type);
     hsize_t idx = 0;
 
     err = H5Literate(group, H5_INDEX_NAME, H5_ITER_INC, &idx, getLsInfo, &opdata);
@@ -217,15 +253,9 @@ herr_t H5Group::getLsInfo(hid_t g_id, const char * name, const H5L_info_t * info
 {
     H5O_info_t oinfo;
     herr_t err;
-    H5Object * hobj = 0;
     hid_t obj;
     OpDataGetLs & opdata = *(OpDataGetLs *)op_data;
 
-    if (obj < 0)
-    {
-        return (herr_t) - 1;
-    }
-
     switch (info->type)
     {
         case H5L_TYPE_SOFT:
@@ -237,10 +267,14 @@ herr_t H5Group::getLsInfo(hid_t g_id, const char * name, const H5L_info_t * info
             opdata.type->push_back("external");
             break;
         case H5L_TYPE_HARD:
-            obj = H5Oopen(g_id, name, H5P_DEFAULT);
+            obj = H5Oopen_by_addr(g_id, info->u.address);
+            if (obj < 0)
+            {
+                return (herr_t) - 1;
+            }
+
             err = H5Oget_info(obj, &oinfo);
             H5Oclose(obj);
-
             if (err < 0)
             {
                 return (herr_t) - 1;
@@ -401,71 +435,47 @@ std::string H5Group::toString(const unsigned int indentLevel) const
 {
     std::ostringstream os;
     std::string indentString = H5Object::getIndentString(indentLevel + 1);
-    const H5GroupsList & groups = const_cast<H5Group *>(this)->getGroups();
-    const H5DatasetsList & datasets = const_cast<H5Group *>(this)->getDatasets();
-    const H5TypesList & types = const_cast<H5Group *>(this)->getTypes();
-    const H5AttributesList & attrs = const_cast<H5Group *>(this)->getAttributes();
+    OpDataCount opdata(false);
+    H5Object::count(*this, opdata);
 
     os << H5Object::getIndentString(indentLevel) << "HDF5 Group" << std::endl
-       << indentString << _("Filename") << ": " << getFile().getFileName() << std::endl
-       << indentString << _("Name") << ": " << getName() << std::endl
-       << indentString << _("Path") << ": " << getCompletePath() << std::endl
-       << indentString << _("Attributes") << ": [1 x " << attrs.getSize() << "]" << std::endl
-       << indentString << _("Groups") << ": [1 x " << groups.getSize() << "]" << std::endl
-       << indentString << _("Datasets") << ": [1 x " << datasets.getSize() << "]" << std::endl
-       << indentString << _("Types") << ": [1 x " << types.getSize() << "]" << std::endl
-       << indentString << _("Links") << ": [" << getLinksSize() << " x 3]";
-
-    delete &groups;
-    delete &datasets;
-    delete &types;
-    delete &attrs;
+       << indentString << "Filename" << ": " << getFile().getFileName() << std::endl
+       << indentString << "Name" << ": " << getBaseName() << std::endl
+       << indentString << "Path" << ": " << getCompletePath() << std::endl
+       << indentString << "Attributes" << ": [1 x " << getAttributesNumber() << "]" << std::endl
+       << indentString << "Groups" << ": [1 x " << opdata.group << "]" << std::endl
+       << indentString << "Datasets" << ": [1 x " << opdata.dataset << "]" << std::endl
+       << indentString << "Types" << ": [1 x " << opdata.type << "]" << std::endl
+       << indentString << "Externals" << ": [1 x " << opdata.external << "]" << std::endl
+       << indentString << "Softs" << ": [1 x " << opdata.soft << "]";
 
     return os.str();
 }
 
 void H5Group::createGroup(H5Object & parent, const std::string & name)
 {
-    hid_t obj;
-    hid_t lcpl;
-    hid_t loc;
-    H5Object * hobj = 0;
+    const char * _name = name.c_str();
+    createGroup(parent, 1, &_name);
+}
 
-    if (parent.isFile())
-    {
-        hobj = &reinterpret_cast<H5File *>(&parent)->getRoot();
-        loc = hobj->getH5Id();
-    }
-    else
-    {
-        loc = parent.getH5Id();
-    }
+void H5Group::createGroup(H5Object & parent, const int size, const char ** names)
+{
+    hid_t obj;
+    hid_t loc = parent.getH5Id();
 
-    if (H5Lexists(loc, name.c_str(), H5P_DEFAULT) > 0)
+    for (unsigned int i = 0; i < (unsigned int)size; i++)
     {
-        if (hobj)
+        if (H5Lexists(loc, names[i], H5P_DEFAULT) > 0)
         {
-            delete hobj;
+            throw H5Exception(__LINE__, __FILE__, _("The group already exists: %s."), names[i]);
         }
-        throw H5Exception(__LINE__, __FILE__, _("The group already exists: %s."), name.c_str());
-    }
-
-    lcpl = H5Pcreate(H5P_LINK_CREATE);
-    H5Pset_create_intermediate_group(lcpl, 1);
-
-    obj = H5Gcreate(loc, name.c_str(), lcpl, H5P_DEFAULT, H5P_DEFAULT);
 
-    if (hobj)
-    {
-        delete hobj;
-    }
-
-    H5Pclose(lcpl);
-    if (obj < 0)
-    {
-        throw H5Exception(__LINE__, __FILE__, _("Cannot create the group: %s."), name.c_str());
+        obj = H5Gcreate(loc, names[i], H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+        if (obj < 0)
+        {
+            throw H5Exception(__LINE__, __FILE__, _("Cannot create the group: %s."), names[i]);
+        }
+        H5Gclose(obj);
     }
-
-    H5Gclose(obj);
 }
 }
index dade955..e804054 100644 (file)
@@ -77,6 +77,7 @@ public:
     virtual void getAccessibleAttribute(const std::string & name, const int pos, void * pvApiCtx) const;
 
     static void createGroup(H5Object & parent, const std::string & name);
+    static void createGroup(H5Object & parent, const int size, const char ** names);
 
 private :
 
index 3fca45d..85c6f2b 100644 (file)
@@ -52,12 +52,20 @@ void H5Object::cleanup()
     H5VariableScope::removeId(scilabId);
 }
 
-
 hid_t H5Object::getH5Id() const
 {
     return (hid_t) - 1;
 }
 
+hsize_t H5Object::getAttributesNumber() const
+{
+    H5O_info_t info;
+    H5Oget_info(getH5Id(), &info);
+
+    return info.num_attrs;
+}
+
+
 /*std::string H5Object::getName() const
   {
   herr_t err;
@@ -135,8 +143,13 @@ void H5Object::createOnScilabStack(int pos, void * pvApiCtx) const
     static const char * fields[] = {"H5Object", "_id"};
     int * mlistaddr = 0;
     SciErr err;
-    int id = H5VariableScope::getVariableId(*const_cast<H5Object *>(this));
-    const_cast<H5Object *>(this)->setScilabId(id);
+    int id = getScilabId();
+
+    if (id == -1)
+    {
+        id = H5VariableScope::getVariableId(*const_cast<H5Object *>(this));
+        const_cast<H5Object *>(this)->setScilabId(id);
+    }
 
     err = createMList(pvApiCtx, pos, 2, &mlistaddr);
     if (err.iErr)
@@ -189,6 +202,27 @@ H5AttributesList & H5Object::getAttributes()
     return *new H5AttributesList(*this);
 }
 
+void H5Object::getNames(const H5Object & obj, std::vector<std::string> & names, FilterType type) const
+{
+    herr_t err;
+    OpDataFilter opdata(&names, type, true);
+    hsize_t idx = 0;
+
+    if (type == ATTRIBUTE)
+    {
+        err = H5Aiterate(obj.getH5Id(), H5_INDEX_NAME, H5_ITER_NATIVE, &idx, H5Object::filterAttributesIterator, &opdata);
+    }
+    else
+    {
+        err = H5Literate(obj.getH5Id(), H5_INDEX_NAME, H5_ITER_NATIVE, &idx, H5Object::filterIterator, &opdata);
+    }
+
+    if (err < 0)
+    {
+        throw H5Exception(__LINE__, __FILE__, _("Cannot list names."));
+    }
+}
+
 H5Object & H5Object::getObject(H5Object & parent, hid_t obj)
 {
     H5O_info_t info;
@@ -276,6 +310,10 @@ std::string H5Object::getCompletePath() const
     std::string path = parent.getCompletePath();
     if (path.empty())
     {
+        if (name.at(0) != '/')
+        {
+            return "/" + name;
+        }
         return name;
     }
 
@@ -294,11 +332,7 @@ std::string H5Object::getCompletePath() const
 void H5Object::getLinksInfo(const H5Object & obj, std::vector<std::string> & linksName, std::vector<std::string> & type, std::vector<std::string> & linksType)
 {
     hsize_t idx = 0;
-    LinksInfo_ info;
-
-    info.name = &linksName;
-    info.type = &type;
-    info.linktype = &linksType;
+    LinksInfo info(&linksName, &type, &linksType);
 
     H5Literate(obj.getH5Id(), H5_INDEX_NAME, H5_ITER_INC, &idx, iterateGetInfo, &info);
 }
@@ -307,12 +341,37 @@ herr_t H5Object::iterateGetInfo(hid_t g_id, const char * name, const H5L_info_t
 {
     H5O_info_t oinfo;
     herr_t err;
-    LinksInfo_ & linfo = *(LinksInfo_ *)op_data;
-    hid_t obj = H5Oopen(g_id, name, H5P_DEFAULT);
+    LinksInfo & linfo = *(LinksInfo *)op_data;
+    hid_t obj;
+
+    linfo.name->push_back(std::string(name));
+
+    switch (info->type)
+    {
+        case H5L_TYPE_HARD:
+            linfo.linkType->push_back("hard");
+            break;
+        case H5L_TYPE_SOFT:
+            linfo.linkType->push_back("soft");
+            break;
+        case H5L_TYPE_EXTERNAL:
+            linfo.linkType->push_back("external");
+            break;
+        default:
+            linfo.linkType->push_back("error");
+    }
 
+    obj = H5Oopen(g_id, name, H5P_DEFAULT);
     if (obj < 0)
     {
-        return (herr_t) - 1;
+        if (info->type == H5L_TYPE_HARD)
+        {
+            return (herr_t) - 1;
+        }
+
+        linfo.type->push_back("dangling");
+
+        return (herr_t)0;
     }
 
     err = H5Oget_info(obj, &oinfo);
@@ -323,46 +382,261 @@ herr_t H5Object::iterateGetInfo(hid_t g_id, const char * name, const H5L_info_t
         return (herr_t) - 2;
     }
 
-    linfo.name->push_back(std::string(name));
+    switch (oinfo.type)
+    {
+        case H5O_TYPE_GROUP:
+            linfo.type->push_back("group");
+            break;
+        case H5O_TYPE_DATASET:
+            linfo.type->push_back("dataset");
+            break;
+        case H5O_TYPE_NAMED_DATATYPE:
+            linfo.type->push_back("datatype");
+            break;
+        default:
+            linfo.type->push_back("unknown");
+    }
+
+    return (herr_t)0;
+}
+
+herr_t H5Object::getLsAttributes(hid_t location_id, const char * attr_name, const H5A_info_t * ainfo, void * op_data)
+{
+    OpDataGetLs & opdata = *(OpDataGetLs *)op_data;
+    opdata.name->push_back(std::string(attr_name));
+    opdata.type->push_back("attribute");
+
+    return (herr_t)0;
+}
+
+herr_t H5Object::filterAttributesIterator(hid_t location_id, const char * attr_name, const H5A_info_t * ainfo, void * op_data)
+{
+    OpDataFilter & opdata = *(OpDataFilter *)op_data;
+    opdata.name->push_back(std::string(attr_name));
+
+    return (herr_t)0;
+}
+
+void H5Object::count(const H5Object & obj, OpDataCount & opdata)
+{
+    hsize_t idx = 0;
+    herr_t err = H5Literate(obj.getH5Id(), H5_INDEX_NAME, H5_ITER_INC, &idx, countIterator, &opdata);
+    if (err < 0)
+    {
+        throw H5Exception(__LINE__, __FILE__, _("Cannot list group contents"));
+    }
+}
+
+herr_t H5Object::countIterator(hid_t g_id, const char * name, const H5L_info_t * info, void * op_data)
+{
+    H5O_info_t oinfo;
+    herr_t err;
+    hid_t obj;
+    OpDataCount & opdata = *(OpDataCount *)op_data;
 
     switch (info->type)
     {
-        case H5L_TYPE_HARD:
-            linfo.linktype->push_back("hard");
-            break;
         case H5L_TYPE_SOFT:
-            linfo.linktype->push_back("soft");
+            opdata.soft++;
             break;
         case H5L_TYPE_EXTERNAL:
-            linfo.linktype->push_back("external");
+            opdata.external++;
+            break;
+        case H5L_TYPE_HARD:
+            opdata.hard++;
             break;
         default:
-            linfo.linktype->push_back("error");
+            return (herr_t) - 1;
+    }
+
+    if (info->type == H5L_TYPE_HARD)
+    {
+        obj = H5Oopen_by_addr(g_id, info->u.address);
+    }
+    else if (opdata.followLink)
+    {
+        obj = H5Oopen(g_id, name, H5P_DEFAULT);
+    }
+    else
+    {
+        return (herr_t)0;
+    }
+
+    if (obj < 0)
+    {
+        if (info->type == H5L_TYPE_HARD)
+        {
+            return (herr_t) - 1;
+        }
+        opdata.dangling++;
+        return (herr_t)0;
+    }
+
+    err = H5Oget_info(obj, &oinfo);
+    H5Oclose(obj);
+    if (err < 0)
+    {
+        return err;
     }
 
     switch (oinfo.type)
     {
         case H5O_TYPE_GROUP:
-            linfo.type->push_back("group");
+            opdata.group++;
             break;
         case H5O_TYPE_DATASET:
-            linfo.type->push_back("dataset");
+            opdata.dataset++;
             break;
         case H5O_TYPE_NAMED_DATATYPE:
-            linfo.type->push_back("datatype");
+            opdata.type++;
             break;
         default:
-            linfo.type->push_back("unknown");
+            return (herr_t) - 1;
     }
 
     return (herr_t)0;
 }
 
-herr_t H5Object::getLsAttributes(hid_t location_id, const char * attr_name, const H5A_info_t * ainfo, void * op_data)
+herr_t H5Object::filterIterator(hid_t g_id, const char * name, const H5L_info_t * info, void * op_data)
 {
-    OpDataGetLs & opdata = *(OpDataGetLs *)op_data;
-    opdata.name->push_back(std::string(attr_name));
-    opdata.type->push_back("attribute");
+    H5O_info_t oinfo;
+    herr_t err;
+    hid_t obj;
+    OpDataFilter & opdata = *(OpDataFilter *)op_data;
+
+    switch (opdata.type)
+    {
+        case HARD:
+            if (info->type == H5L_TYPE_HARD)
+            {
+                opdata.name->push_back(name);
+                return (herr_t)0;
+            }
+            break;
+        case SOFT:
+            if (info->type == H5L_TYPE_SOFT)
+            {
+                opdata.name->push_back(name);
+                return (herr_t)0;
+            }
+            break;
+        case EXTERNAL:
+            if (info->type == H5L_TYPE_EXTERNAL)
+            {
+                opdata.name->push_back(name);
+                return (herr_t)0;
+            }
+            break;
+    }
+
+    if (info->type == H5L_TYPE_HARD)
+    {
+        obj = H5Oopen_by_addr(g_id, info->u.address);
+    }
+    else
+    {
+        obj = H5Oopen(g_id, name, H5P_DEFAULT);
+    }
+
+    if (obj < 0)
+    {
+        if (info->type == H5L_TYPE_HARD)
+        {
+            return (herr_t) - 1;
+        }
+        if (opdata.type == DANGLING)
+        {
+            opdata.name->push_back(name);
+            return (herr_t)0;
+        }
+    }
+
+    err = H5Oget_info(obj, &oinfo);
+    H5Oclose(obj);
+    if (err < 0)
+    {
+        return err;
+    }
+
+    switch (opdata.type)
+    {
+        case GROUP:
+            if (oinfo.type == H5O_TYPE_GROUP)
+            {
+                opdata.name->push_back(name);
+                return (herr_t)0;
+            }
+            break;
+        case DATASET:
+            if (oinfo.type == H5O_TYPE_DATASET)
+            {
+                opdata.name->push_back(name);
+                return (herr_t)0;
+            }
+            break;
+        case TYPE:
+            if (oinfo.type == H5O_TYPE_NAMED_DATATYPE)
+            {
+                opdata.name->push_back(name);
+                return (herr_t)0;
+            }
+            break;
+        default:
+            return (herr_t)0;
+    }
+
+    return (herr_t)0;
+}
+
+herr_t H5Object::filterSoftLinkIterator(hid_t g_id, const char * name, const H5L_info_t * info, void * op_data)
+{
+    H5O_info_t oinfo;
+    herr_t err;
+    hid_t obj;
+    OpDataSoftLinkFilter & opdata = *(OpDataSoftLinkFilter *)op_data;
+
+    if (info->type == H5L_TYPE_SOFT && opdata.type == SOFT)
+    {
+        char * buf = new char[info->u.val_size];
+
+        err = H5Lget_val(g_id, name, buf, info->u.val_size, H5P_DEFAULT);
+        if (err < 0)
+        {
+            delete[] buf;
+            return err;
+        }
+
+        opdata.name->push_back(name);
+        opdata.value->push_back(std::string(buf));
+
+        delete[] buf;
+    }
+    else if (info->type == H5L_TYPE_EXTERNAL && opdata.type == EXTERNAL)
+    {
+        char * buf = new char[info->u.val_size];
+        const char * filename = 0;
+        const char * obj_path = 0;
+
+        err = H5Lget_val(g_id, name, buf, info->u.val_size, H5P_DEFAULT);
+        if (err < 0)
+        {
+            delete[] buf;
+            return err;
+        }
+
+        err = H5Lunpack_elink_val(buf, info->u.val_size, 0, &filename, &obj_path);
+        if (err < 0)
+        {
+            delete[] buf;
+            return err;
+        }
+
+        opdata.name->push_back(name);
+        opdata.value->push_back(std::string(filename));
+        opdata.value->push_back(std::string(obj_path));
+
+        delete[] buf;
+    }
 
     return (herr_t)0;
 }
index 5a21bd8..7ff98fc 100644 (file)
@@ -14,6 +14,7 @@
 #define __H5OBJECT_HXX__
 
 #define H5_NO_DEPRECATED_SYMBOLS
+#undef H5_USE_16_API
 
 #include <hdf5.h>
 
@@ -61,6 +62,8 @@ class H5Object
 
 public :
 
+    enum FilterType {HARD, SOFT, EXTERNAL, DANGLING, GROUP, DATASET, TYPE, ATTRIBUTE};
+
     H5Object(H5Object & _parent);
     H5Object(H5Object & _parent, const std::string & _name);
     virtual ~H5Object();
@@ -69,6 +72,7 @@ public :
 
     virtual hid_t getH5Id() const;
     virtual H5AttributesList & getAttributes();
+    virtual hsize_t getAttributesNumber() const;
 
     virtual H5O_info_t getInfo() const
     {
@@ -202,6 +206,7 @@ public :
     }
     H5File & getFile() const;
 
+    virtual void getNames(const H5Object & obj, std::vector<std::string> & names, FilterType type) const;
     virtual void createOnScilabStack(int pos, void * pvApiCtx) const;
     virtual void createInScilabList(int * list, int stackPos, int pos, void * pvApiCtx) const;
     bool isRoot() const
@@ -243,14 +248,62 @@ public :
     static H5Object & getObject(H5Object & parent, const std::string & name);
     static void getLinksInfo(const H5Object & obj, std::vector<std::string> & linksName, std::vector<std::string> & types, std::vector<std::string> & linksType);
 
+    inline static bool isEmptyPath(const std::string & path)
+    {
+        return path.empty() || path == ".";
+    }
+
+    inline static bool isEmptyPath(const char * path)
+    {
+        return path[0] == '\0' || (path[0] == '.' && path[1] == '\0');
+    }
+
 protected :
 
-    typedef struct
+    class OpDataGetLs
     {
+    public:
         H5Object * parent;
         std::vector<std::string> * name;
         std::vector<std::string> * type;
-    } OpDataGetLs;
+
+        OpDataGetLs(H5Object * _parent, std::vector<std::string> * _name, std::vector<std::string> * _type) : parent(_parent), name(_name), type(_type) { }
+    };
+
+    class OpDataCount
+    {
+    public:
+        unsigned int soft;
+        unsigned int external;
+        unsigned int hard;
+        unsigned int dangling;
+        unsigned int group;
+        unsigned int dataset;
+        unsigned int type;
+        const bool followLink;
+
+        OpDataCount(const bool _followLink) : soft(0), external(0), hard(0), dangling(0), group(0), dataset(0), type(0), followLink(_followLink) { }
+    };
+
+    class OpDataFilter
+    {
+    public:
+        std::vector<std::string> * name;
+        FilterType type;
+        const bool followLink;
+
+        OpDataFilter(std::vector<std::string> * _name, FilterType _type, const bool _followLink) : name(_name), type(_type), followLink(_followLink) { }
+    };
+
+    class OpDataSoftLinkFilter
+    {
+    public:
+        std::vector<std::string> * name;
+        std::vector<std::string> * value;
+        FilterType type;
+
+        OpDataSoftLinkFilter(std::vector<std::string> * _name, std::vector<std::string> * _value, FilterType _type) : name(_name), value(_value), type(_type) { }
+    };
 
     const std::string name;
     std::set<H5Object *> children;
@@ -263,18 +316,26 @@ protected :
         if (!locked) children.erase(child);
     }
 
+    static void count(const H5Object & obj, OpDataCount & opdata);
+    static herr_t countIterator(hid_t g_id, const char * name, const H5L_info_t * info, void * op_data);
+    static herr_t filterAttributesIterator(hid_t location_id, const char * attr_name, const H5A_info_t * ainfo, void * op_data);
+    static herr_t filterIterator(hid_t g_id, const char * name, const H5L_info_t * info, void * op_data);
+    static herr_t filterSoftLinkIterator(hid_t g_id, const char * name, const H5L_info_t * info, void * op_data);
     static herr_t getLsAttributes(hid_t location_id, const char * attr_name, const H5A_info_t * ainfo, void * op_data);
 
 private :
 
     H5Object() : parent(*this) { }
 
-    typedef struct
+    class LinksInfo
     {
+    public:
         std::vector<std::string> * name;
         std::vector<std::string> * type;
-        std::vector<std::string> * linktype;
-    } LinksInfo_;
+        std::vector<std::string> * linkType;
+
+        LinksInfo(std::vector<std::string> * _name, std::vector<std::string> * _type, std::vector<std::string> * _linkType) : name(_name), type(_type), linkType(_linkType) { }
+    };
 
     static herr_t iterateGetInfo(hid_t g_id, const char * name, const H5L_info_t * info, void * op_data);
 };
index 6c5fa71..31fde8e 100644 (file)
@@ -23,7 +23,7 @@ class H5OpaqueData : public H5BasicData<unsigned char>
 
 public:
 
-    H5OpaqueData(H5Object & _parent, const hsize_t _totalSize, const hsize_t _dataSize, const hsize_t _ndims, const hsize_t * _dims, unsigned char * _data, const hsize_t _stride = -1, const size_t _offset = 0, const bool _dataOwner = true) : H5BasicData(_parent, _totalSize, _dataSize, _ndims, _dims, _data, _stride, _offset, _dataOwner)
+    H5OpaqueData(H5Object & _parent, const hsize_t _totalSize, const hsize_t _dataSize, const hsize_t _ndims, const hsize_t * _dims, const hsize_t _arank, const hsize_t * _adims, unsigned char * _data, const hsize_t _stride, const size_t _offset, const bool _dataOwner) : H5BasicData(_parent, _totalSize, _dataSize, _ndims, _dims, _arank, _adims, _data, _stride, _offset, _dataOwner)
     {
 
     }
index 6008146..c9ebc48 100644 (file)
@@ -15,7 +15,7 @@
 namespace org_modules_hdf5
 {
 
-H5ReferenceData::H5ReferenceData(H5Object & _parent, const bool _datasetReference, const hsize_t _totalSize, const hsize_t _dataSize, const hsize_t _ndims, const hsize_t * _dims, char * _data, const hsize_t _stride, const size_t _offset, const bool _dataOwner) : H5BasicData(_parent, _totalSize, _dataSize, _ndims, _dims, _data, _stride, _offset, _dataOwner), datasetReference(_datasetReference)
+H5ReferenceData::H5ReferenceData(H5Object & _parent, const bool _datasetReference, const hsize_t _totalSize, const hsize_t _dataSize, const hsize_t _ndims, const hsize_t * _dims, const hsize_t _arank, const hsize_t * _adims, char * _data, const hsize_t _stride, const size_t _offset, const bool _dataOwner) : H5BasicData(_parent, _totalSize, _dataSize, _ndims, _dims, _arank, _adims, _data, _stride, _offset, _dataOwner), datasetReference(_datasetReference)
 {
 
 }
index 1d93418..f44c0e0 100644 (file)
@@ -29,7 +29,7 @@ class H5ReferenceData : public H5BasicData<char>
 
 public:
 
-    H5ReferenceData(H5Object & _parent, const bool _datasetReference, const hsize_t _totalSize, const hsize_t _dataSize, const hsize_t _ndims, const hsize_t * _dims, char * _data, const hsize_t _stride = -1, const size_t _offset = 0, const bool _dataOwner = true);
+    H5ReferenceData(H5Object & _parent, const bool _datasetReference, const hsize_t _totalSize, const hsize_t _dataSize, const hsize_t _ndims, const hsize_t * _dims, const hsize_t _arank, const hsize_t * _adims, char * _data, const hsize_t _stride, const size_t _offset, const bool _dataOwner);
     virtual ~H5ReferenceData();
 
     bool isReference() const
index 2dcbe8b..b69ea83 100644 (file)
@@ -15,7 +15,7 @@
 namespace org_modules_hdf5
 {
 
-H5StringData::H5StringData(H5Object & _parent, const hsize_t _totalSize, const hsize_t _stringSize, const hsize_t _ndims, const hsize_t * _dims, char * _data, const hsize_t _stride, const size_t _offset, const bool _dataOwner) : H5Data(_parent, _totalSize, _stringSize, _ndims, _dims, _data, _stride == -1 ? _stringSize : _stride, _offset, _dataOwner)
+H5StringData::H5StringData(H5Object & _parent, const hsize_t _totalSize, const hsize_t _stringSize, const hsize_t _ndims, const hsize_t * _dims, const hsize_t _arank, const hsize_t * _adims, char * _data, const hsize_t _stride, const size_t _offset, const bool _dataOwner) : H5Data(_parent, _totalSize, _stringSize, _ndims, _dims, _arank, _adims, _data, _stride == -1 ? _stringSize : _stride, _offset, _dataOwner)
 {
     char * __data = static_cast<char *>(_data);
     transformedData = new char*[totalSize];
@@ -38,7 +38,7 @@ H5StringData::H5StringData(H5Object & _parent, const hsize_t _totalSize, const h
     }
 }
 
-H5StringData::H5StringData(H5Object & _parent, const hsize_t _totalSize, const hsize_t _stringSize, const hsize_t _ndims, const hsize_t * _dims, char ** _data, const hsize_t _stride, const size_t _offset, const bool _dataOwner) : H5Data(_parent, _totalSize, _stringSize, _ndims, _dims, _data, _stride == -1 ? _stringSize : _stride, _offset, _dataOwner), transformedData(0)
+H5StringData::H5StringData(H5Object & _parent, const hsize_t _totalSize, const hsize_t _stringSize, const hsize_t _ndims, const hsize_t * _dims, const hsize_t _arank, const hsize_t * _adims, char ** _data, const hsize_t _stride, const size_t _offset, const bool _dataOwner) : H5Data(_parent, _totalSize, _stringSize, _ndims, _dims, _arank, _adims, _data, _stride == -1 ? _stringSize : _stride, _offset, _dataOwner), transformedData(0)
 {
 
 }
index 93d8ac9..5b14932 100644 (file)
@@ -27,9 +27,9 @@ protected:
 
 public:
 
-    H5StringData(H5Object & _parent, const hsize_t _totalSize, const hsize_t _stringSize, const hsize_t _ndims, const hsize_t * _dims, char * _data, const hsize_t _stride = -1, const size_t _offset = 0, const bool _dataOwner = true);
+    H5StringData(H5Object & _parent, const hsize_t _totalSize, const hsize_t _stringSize, const hsize_t _ndims, const hsize_t * _dims, const hsize_t _arank, const hsize_t * _adims, char * _data, const hsize_t _stride, const size_t _offset, const bool _dataOwner);
 
-    H5StringData(H5Object & _parent, const hsize_t _totalSize, const hsize_t _stringSize, const hsize_t _ndims, const hsize_t * _dims, char ** _data, const hsize_t _stride = -1, const size_t _offset = 0, const bool _dataOwner = true);
+    H5StringData(H5Object & _parent, const hsize_t _totalSize, const hsize_t _stringSize, const hsize_t _ndims, const hsize_t * _dims, const hsize_t _arank, const hsize_t * _adims, char ** _data, const hsize_t _stride, const size_t _offset, const bool _dataOwner);
 
     virtual ~H5StringData();
 
index b98754c..99940f0 100644 (file)
@@ -23,7 +23,7 @@ class H5TimeData : public H5BasicData<char>
 
 public:
 
-    H5TimeData(H5Object & _parent, const hsize_t _totalSize, const hsize_t _dataSize, const hsize_t _ndims, const hsize_t * _dims, char * _data, const hsize_t _stride = -1, const size_t _offset = 0, const bool _dataOwner = true) : H5BasicData(_parent, _totalSize, _dataSize, _ndims + 1, _dims, _data, _stride, _offset, _dataOwner)
+    H5TimeData(H5Object & _parent, const hsize_t _totalSize, const hsize_t _dataSize, const hsize_t _ndims, const hsize_t * _dims, const hsize_t _arank, const hsize_t * _adims, char * _data, const hsize_t _stride, const size_t _offset, const bool _dataOwner) : H5BasicData(_parent, _totalSize, _dataSize, _ndims, _dims, _arank, _adims, _data, _stride, _offset, _dataOwner)
     {
         //dims[ndims - 1] = dataSize;
     }
index fb34f38..96685a7 100644 (file)
@@ -28,7 +28,7 @@ protected:
 
 public:
 
-    H5TransformedData(H5Object & _parent, const hsize_t _totalSize, const hsize_t _dataSize, const hsize_t _ndims, const hsize_t * _dims, T * _data, const hsize_t _stride = -1, const size_t _offset = 0, const bool _dataOwner = true) : H5Data(_parent, _totalSize, _dataSize, _ndims, _dims, _data, _stride, _offset, _dataOwner)
+    H5TransformedData(H5Object & _parent, const hsize_t _totalSize, const hsize_t _dataSize, const hsize_t _ndims, const hsize_t * _dims, const hsize_t _arank, const hsize_t * _adims, T * _data, const hsize_t _stride, const size_t _offset, const bool _dataOwner) : H5Data(_parent, _totalSize, _dataSize, _ndims, _dims, _arank, _adims, _data, _stride, _offset, _dataOwner)
     {
         transformedData = new U[totalSize];
 
index 7a3372f..d0018ab 100644 (file)
@@ -1614,7 +1614,9 @@ std::string H5Type::dump(std::map<haddr_t, std::string> & alreadyVisited, const
                 os << "[" << (unsigned int)dims[i] << "]";
             }
 
-            os << H5Type(*const_cast<H5Type *>(this), super).dump(alreadyVisited, 0) << " }";
+            os << " " << getNameFromType(super) << " }";
+
+            H5Tclose(super);
             delete[] dims;
             break;
         default:
@@ -1651,13 +1653,13 @@ std::string H5Type::toString(const unsigned int indentLevel) const
     std::ostringstream os;
     std::string indentString = H5Object::getIndentString(indentLevel);
 
-    os << indentString << _("Filename") << ": " << getFile().getFileName() << std::endl
-       << indentString << _("Name") << ": " << name << std::endl
-       << indentString << _("Class name") << ": " << getClassName() << std::endl
-       << indentString << _("Type name") << ": " << getTypeName() << std::endl
-       << indentString << _("Type size") << ": " << getTypeSize() << std::endl
-       << indentString << _("Native type name") << ": " << getNativeTypeName() << std::endl
-       << indentString << _("Native type size") << ": " << getNativeTypeSize();
+    os << indentString << "Filename" << ": " << getFile().getFileName() << std::endl
+       << indentString << "Name" << ": " << name << std::endl
+       << indentString << "Class" << ": " << getClassName() << std::endl
+       << indentString << "Type" << ": " << getTypeName() << std::endl
+       << indentString << "Size" << ": " << getTypeSize() << std::endl
+       << indentString << "Nativetype" << ": " << getNativeTypeName() << std::endl
+       << indentString << "Nativesize" << ": " << getNativeTypeSize();
 
     return os.str();
 }
index 42ed680..aa2c710 100644 (file)
@@ -23,7 +23,7 @@ class H5UnsignedCharData : public H5BasicData<unsigned char>
 
 public:
 
-    H5UnsignedCharData(H5Object & _parent, const hsize_t _totalSize, const hsize_t _dataSize, const hsize_t _ndims, const hsize_t * _dims, unsigned char * _data, const hsize_t _stride = -1, const size_t _offset = 0, const bool _dataOwner = true) : H5BasicData(_parent, _totalSize, _dataSize, _ndims, _dims, _data, _stride, _offset, _dataOwner)
+    H5UnsignedCharData(H5Object & _parent, const hsize_t _totalSize, const hsize_t _dataSize, const hsize_t _ndims, const hsize_t * _dims, const hsize_t _arank, const hsize_t * _adims, unsigned char * _data, const hsize_t _stride, const size_t _offset, const bool _dataOwner) : H5BasicData(_parent, _totalSize, _dataSize, _ndims, _dims, _arank, _adims, _data, _stride, _offset, _dataOwner)
     {
 
     }
@@ -35,7 +35,20 @@ public:
 
     virtual void printData(std::ostream & os, const unsigned int pos, const unsigned int indentLevel) const
     {
-        os << (int)static_cast<unsigned char *>(getData())[pos];
+        if (adims)
+        {
+            os << "[ ";
+            const hsize_t _pos = pos * dataSize;
+            for (unsigned int i = 0; i < atotalSize - 1; i++)
+            {
+                os << (int)static_cast<unsigned char *>(getData())[_pos + i] << ", ";
+            }
+            os << (int)static_cast<unsigned char *>(getData())[_pos + atotalSize - 1] << " ]";
+        }
+        else
+        {
+            os << (int)static_cast<unsigned char *>(getData())[pos];
+        }
     }
 };
 }
index 182e691..25945ff 100644 (file)
@@ -112,35 +112,32 @@ void HDF5Scilab::split(const std::string & str, std::vector<std::string> & v, co
 void HDF5Scilab::readAttributeData(H5Object & obj, const std::string & path, const std::string & attrName, int pos, void * pvApiCtx)
 {
     H5Object * hobj = &obj;
-    const bool mustDelete = path != "." || obj.isFile();
 
     if (path != ".")
     {
         hobj = &H5Object::getObject(obj, path);
     }
-    else if (obj.isFile())
-    {
-        hobj = &reinterpret_cast<H5File *>(hobj)->getRoot();
-    }
 
     H5Attribute * attr = new H5Attribute(*hobj, attrName);
     attr->getData().toScilab(pvApiCtx, pos);
-    delete attr;
 
-    if (mustDelete)
+    if (path != ".")
     {
         delete hobj;
     }
+    else
+    {
+        delete attr;
+    }
 }
 
 void HDF5Scilab::readAttributeData(const std::string & filename, const std::string & path, const std::string & attrName, int pos, void * pvApiCtx)
 {
-    H5File * file = new H5File(filename, path, "r");
-    H5Object & root = file->getRoot();
+    H5File * file = new H5File(filename, "/", "r");
 
     try
     {
-        readAttributeData(root, ".", attrName, pos, pvApiCtx);
+        readAttributeData(*file, path, attrName, pos, pvApiCtx);
     }
     catch (const H5Exception & e)
     {
@@ -153,12 +150,11 @@ void HDF5Scilab::readAttributeData(const std::string & filename, const std::stri
 
 void HDF5Scilab::readData(const std::string & filename, const std::string & name, const unsigned int size, const double * start, const double * stride, const double * count, const double * block, int pos, void * pvApiCtx)
 {
-    H5File * file = new H5File(filename, name, "r");
-    H5Object & root = file->getRoot();
+    H5File * file = new H5File(filename, "/", "r");
 
     try
     {
-        readData(root, ".", size, start, stride, count, block, pos, pvApiCtx);
+        readData(*file, name, size, start, stride, count, block, pos, pvApiCtx);
     }
     catch (const H5Exception & e)
     {
@@ -172,17 +168,12 @@ void HDF5Scilab::readData(const std::string & filename, const std::string & name
 void HDF5Scilab::readData(H5Object & obj, const std::string & name, const unsigned int size, const double * start, const double * stride, const double * count, const double * block, int pos, void * pvApiCtx)
 {
     H5Object * hobj = &obj;
-    const bool mustDelete = name != "." || obj.isFile();
     hsize_t * dims = 0;
 
-    if (name != ".")
+    if (!H5Object::isEmptyPath(name))
     {
         hobj = &H5Object::getObject(obj, name);
     }
-    else if (obj.isFile())
-    {
-        hobj = &reinterpret_cast<H5File *>(hobj)->getRoot();
-    }
 
     try
     {
@@ -219,7 +210,7 @@ void HDF5Scilab::readData(H5Object & obj, const std::string & name, const unsign
     }
     catch (const H5Exception & e)
     {
-        if (mustDelete)
+        if (!H5Object::isEmptyPath(name))
         {
             delete hobj;
         }
@@ -230,7 +221,7 @@ void HDF5Scilab::readData(H5Object & obj, const std::string & name, const unsign
         throw;
     }
 
-    if (mustDelete)
+    if (!H5Object::isEmptyPath(name))
     {
         delete hobj;
     }
@@ -242,7 +233,7 @@ void HDF5Scilab::readData(H5Object & obj, const std::string & name, const unsign
 
 void HDF5Scilab::deleteObject(const std::string & file, const std::string & name)
 {
-    H5File * _file = new H5File(file, "/", "r+");
+    const H5File * _file = new H5File(file, "/", "r+");
 
     try
     {
@@ -255,41 +246,90 @@ void HDF5Scilab::deleteObject(const std::string & file, const std::string & name
     }
 }
 
+void HDF5Scilab::deleteObject(const std::string & file, const int size, const char ** names)
+{
+    const H5File * _file = new H5File(file, "/", "r+");
 
-void HDF5Scilab::deleteObject(H5Object & parent, const std::string & name)
+    try
+    {
+        deleteObject(*_file, size, names);
+        delete _file;
+    }
+    catch (const H5Exception & e)
+    {
+        delete _file;
+    }
+}
+
+void HDF5Scilab::deleteObject(const H5Object & parent, const std::string & name)
+{
+    const char * _name = name.c_str();
+    deleteObject(parent, 1, &_name);
+}
+
+void HDF5Scilab::deleteObject(const H5Object & parent, const int size, const char ** names)
 {
     herr_t err;
     hid_t loc = parent.getH5Id();
-    std::string _name = name;
-    if (name.empty())
+
+    for (unsigned int i = 0; i < (unsigned int)size; i++)
     {
-        _name = parent.getName();
-        if (!parent.isFile())
+        const char * _name = names[i];
+
+        if (H5Object::isEmptyPath(_name))
         {
-            loc = parent.getParent().getH5Id();
+            if (parent.isFile())
+            {
+                throw H5Exception(__LINE__, __FILE__, _("Cannot remove a file."));
+            }
+            else
+            {
+                _name = parent.getName().c_str();
+                loc = parent.getParent().getH5Id();
+            }
         }
-    }
 
-    if (H5Lexists(loc, _name.c_str(), H5P_DEFAULT) <= 0)
-    {
-        if (H5Aexists(loc, _name.c_str()) <= 0)
+        if (_name[0] == '/' && _name[1] == '\0')
         {
-            throw H5Exception(__LINE__, __FILE__, _("The name doesn't exist: %s."), _name.c_str());
+            throw H5Exception(__LINE__, __FILE__, _("Cannot remove root element."));
         }
 
-        err = H5Adelete(loc, _name.c_str());
-        if (err < 0)
+        if (H5Lexists(loc, _name, H5P_DEFAULT) <= 0)
         {
-            throw H5Exception(__LINE__, __FILE__, _("Cannot remove the attribute: %s."), _name.c_str());
+            if (H5Aexists(loc, _name) <= 0)
+            {
+                throw H5Exception(__LINE__, __FILE__, _("The name doesn't exist: %s."), _name);
+            }
+
+            err = H5Adelete(loc, _name);
+            if (err < 0)
+            {
+                throw H5Exception(__LINE__, __FILE__, _("Cannot remove the attribute: %s."), _name);
+            }
+
+            continue;
         }
 
-        return;
+        err = H5Ldelete(loc, _name, H5P_DEFAULT);
+        if (err < 0)
+        {
+            throw H5Exception(__LINE__, __FILE__, _("Cannot remove the link: %s."), _name);
+        }
     }
+}
 
-    err = H5Ldelete(loc, _name.c_str(), H5P_DEFAULT);
-    if (err < 0)
+void HDF5Scilab::getObject(H5Object & parent, const std::string & location, int position, void * pvApiCtx)
+{
+    H5Object * obj = &H5Object::getObject(parent, location);
+
+    try
+    {
+        obj->createOnScilabStack(position, pvApiCtx);
+    }
+    catch (const H5Exception & e)
     {
-        throw H5Exception(__LINE__, __FILE__, _("Cannot remove the link: %s."), _name.c_str());
+        delete obj;
+        throw;
     }
 }
 
@@ -365,7 +405,7 @@ void HDF5Scilab::createLink(const std::string & file, const std::string & locati
 
     try
     {
-        createLink(_file->getRoot(), name, destName, hard);
+        createLink(*_file, name, destName, hard);
     }
     catch (const H5Exception & e)
     {
@@ -400,17 +440,7 @@ void HDF5Scilab::copy(H5Object & src, const std::string & slocation, H5Object &
     std::string name;
     herr_t err;
 
-    if (src.isFile())
-    {
-        sobj = &reinterpret_cast<H5File *>(sobj)->getRoot();
-    }
-
-    if (dest.isFile())
-    {
-        dobj = &reinterpret_cast<H5File *>(dobj)->getRoot();
-    }
-
-    name = (dlocation.empty() || dlocation == ".") ? sobj->getBaseName() : dlocation;
+    name = H5Object::isEmptyPath(dlocation) ? sobj->getBaseName() : dlocation;
 
     if (sobj->isAttribute())
     {
@@ -421,15 +451,6 @@ void HDF5Scilab::copy(H5Object & src, const std::string & slocation, H5Object &
         }
         catch (const H5Exception & e)
         {
-            if (src.isFile())
-            {
-                delete sobj;
-            }
-
-            if (dest.isFile())
-            {
-                delete dobj;
-            }
             throw;
         }
     }
@@ -438,16 +459,6 @@ void HDF5Scilab::copy(H5Object & src, const std::string & slocation, H5Object &
         err = H5Ocopy(sobj->getH5Id(), slocation.empty() ? "." : slocation.c_str(), dobj->getH5Id(), name.c_str(), H5P_DEFAULT, H5P_DEFAULT);
     }
 
-    if (src.isFile())
-    {
-        delete sobj;
-    }
-
-    if (dest.isFile())
-    {
-        delete dobj;
-    }
-
     if (err < 0)
     {
         throw H5Exception(__LINE__, __FILE__, _("Cannot copy object."));
@@ -458,11 +469,11 @@ void HDF5Scilab::copy(H5Object & src, const std::string & slocation, H5Object &
 
 void HDF5Scilab::copy(H5Object & src, const std::string & slocation, const std::string & dfile, const std::string & dlocation)
 {
-    H5File * dest = new H5File(dfile, dlocation);
+    H5File * dest = new H5File(dfile, "/", "r+");
 
     try
     {
-        copy(src, slocation, *dest, ".");
+        copy(src, slocation, *dest, dlocation);
         delete dest;
     }
     catch (const H5Exception & e)
@@ -474,11 +485,11 @@ void HDF5Scilab::copy(H5Object & src, const std::string & slocation, const std::
 
 void HDF5Scilab::copy(const std::string & sfile, const std::string & slocation, H5Object & dest, const std::string & dlocation)
 {
-    H5File * src = new H5File(sfile, slocation);
+    H5File * src = new H5File(sfile, "/", "r");
 
     try
     {
-        copy(*src, "", dest, dlocation);
+        copy(*src, slocation, dest, dlocation);
         delete src;
     }
     catch (const H5Exception & e)
@@ -490,12 +501,12 @@ void HDF5Scilab::copy(const std::string & sfile, const std::string & slocation,
 
 void HDF5Scilab::copy(const std::string & sfile, const std::string & slocation, const std::string & dfile, const std::string & dlocation)
 {
-    H5File * src = new H5File(sfile, slocation);
+    H5File * src = new H5File(sfile, "/", "r");
     H5File * dest;
 
     try
     {
-        dest = new H5File(dfile, dlocation);
+        dest = new H5File(dfile, "/");
     }
     catch (const H5Exception & e)
     {
@@ -505,7 +516,7 @@ void HDF5Scilab::copy(const std::string & sfile, const std::string & slocation,
 
     try
     {
-        copy(*src, "", *dest, ".");
+        copy(*src, slocation, *dest, dlocation);
         delete src;
         delete dest;
     }
@@ -522,7 +533,7 @@ void HDF5Scilab::ls(H5Object & obj, std::string name, int position, void * pvApi
     std::vector<std::string> _name;
     std::vector<std::string> _type;
     std::vector<const char *> strs;
-    H5Object & hobj = (name.empty() || name == ".") ? obj : H5Object::getObject(obj, name);
+    H5Object & hobj = H5Object::isEmptyPath(name) ? obj : H5Object::getObject(obj, name);
 
     hobj.ls(_name, _type);
     strs.reserve(_name.size() * 2);
@@ -535,7 +546,7 @@ void HDF5Scilab::ls(H5Object & obj, std::string name, int position, void * pvApi
         strs.push_back(_type[i].c_str());
     }
 
-    if (!name.empty() && name != ".")
+    if (!H5Object::isEmptyPath(name))
     {
         delete &hobj;
     }
@@ -572,7 +583,7 @@ void HDF5Scilab::createGroup(const std::string & file, const std::string & name)
 
     try
     {
-        createGroup(_file->getRoot(), name);
+        createGroup(*_file, name);
     }
     catch (const H5Exception & e)
     {
@@ -583,21 +594,18 @@ void HDF5Scilab::createGroup(const std::string & file, const std::string & name)
     delete _file;
 }
 
-void HDF5Scilab::createGroup(H5Object & parent, const std::vector<std::string> & names)
+void HDF5Scilab::createGroup(H5Object & parent, const int size, const char ** names)
 {
-    for (unsigned int i = 0; i < names.size(); i++)
-    {
-        H5Group::createGroup(parent, names[i]);
-    }
+    H5Group::createGroup(parent, size, names);
 }
 
-void HDF5Scilab::createGroup(const std::string & file, const std::vector<std::string> & names)
+void HDF5Scilab::createGroup(const std::string & file, const int size, const char ** names)
 {
     H5File * _file = new H5File(file, "/", "r+");
 
     try
     {
-        createGroup(_file->getRoot(), names);
+        createGroup(*_file, size, names);
     }
     catch (const H5Exception & e)
     {
index 74d757a..d216221 100644 (file)
@@ -73,7 +73,13 @@ public:
 
     static void deleteObject(const std::string & file, const std::string & name);
 
-    static void deleteObject(H5Object & parent, const std::string & name);
+    static void deleteObject(const std::string & file, const int size, const char ** names);
+
+    static void deleteObject(const H5Object & parent, const std::string & name);
+
+    static void deleteObject(const H5Object & parent, const int size, const char ** names);
+
+    static void getObject(H5Object & parent, const std::string & location, int position, void * pvApiCtx);
 
     static void createLink(H5Object & parent, const std::string & name, const std::string & targetPath, const bool hard);
 
@@ -109,9 +115,9 @@ public:
 
     static void createGroup(const std::string & file, const std::string & name);
 
-    static void createGroup(H5Object & parent, const std::vector<std::string> & names);
+    static void createGroup(H5Object & parent, const int size, const char ** names);
 
-    static void createGroup(const std::string & file, const std::vector<std::string> & names);
+    static void createGroup(const std::string & file, const int size, const char ** names);
 
     template <typename T, typename U>
     static U & create(H5Object & parent, const std::string & name, const unsigned int rank, const hsize_t * dims, const hsize_t * maxdims, T * data, const hid_t targetType, const unsigned int size, const double * start, const double * stride, const double * count, const double * block)
@@ -122,7 +128,6 @@ public:
         hid_t type;
         hid_t targettype;
         herr_t err;
-        H5Object * loc = 0;
         hsize_t * newdims = 0;
         bool mustDelete = false;
         H5T_conv_t conv;
@@ -135,15 +140,6 @@ public:
             throw H5Exception(__LINE__, __FILE__, _("Invalid rank, must be in the interval [0, %d]."), __SCILAB_HDF5_MAX_DIMS__);
         }
 
-        if (parent.isFile())
-        {
-            loc = &reinterpret_cast<H5File *>(&parent)->getRoot();
-        }
-        else
-        {
-            loc = &parent;
-        }
-
         type = H5Type::getBaseType(data);
         if (type < 0)
         {
@@ -222,7 +218,7 @@ public:
 
         try
         {
-            obj = U::create(*loc, name, type, targettype, srcspace, targetspace, data);
+            obj = U::create(parent, name, type, targettype, srcspace, targetspace, data);
             H5Tclose(type);
             H5Sclose(srcspace);
             if (targetspace >= 0)
@@ -241,7 +237,7 @@ public:
             throw;
         }
 
-        return *new U(*loc, obj, name);
+        return *new U(parent, obj, name);
     }
 
     template <typename T, typename U>
@@ -283,11 +279,11 @@ public:
     template <typename T>
     static void createObjectFromStack(const std::string & file, const std::string & location, const std::string & name, const std::string & targetType, const unsigned int size, const double * start, const double * stride, const double * count, const double * block, const double * maxdims, void * pvApiCtx, int * addr, const int rhsPosition)
     {
-        H5File & src = *new H5File(file, location, "r+");
+        H5File & src = *new H5File(file, "/", "r+");
 
         try
         {
-            createObjectFromStack<T>(src, "", name, targetType, size, start, stride, count, block, maxdims, pvApiCtx, addr, rhsPosition);
+            createObjectFromStack<T>(src, location, name, targetType, size, start, stride, count, block, maxdims, pvApiCtx, addr, rhsPosition);
             delete &src;
         }
         catch (const H5Exception & e)
@@ -308,7 +304,6 @@ public:
         int row;
         int col;
         int type;
-        H5Object * robj = 0;
         H5Object * hobj = 0;
 
         if (maxdims)
@@ -324,15 +319,7 @@ public:
             throw H5Exception(__LINE__, __FILE__, _("Can not get the type of input argument #%d."), rhsPosition);
         }
 
-        if (obj.isFile())
-        {
-            robj = &reinterpret_cast<H5File *>(&obj)->getRoot();
-            hobj = (location.empty() || location == ".") ? robj : &H5Object::getObject(*robj, location);
-        }
-        else
-        {
-            hobj = (location.empty() || location == ".") ? &obj : &H5Object::getObject(obj, location);
-        }
+        hobj = H5Object::isEmptyPath(location) ? &obj : &H5Object::getObject(obj, location);
 
         try
         {
@@ -502,11 +489,7 @@ public:
         }
         catch (const H5Exception & e)
         {
-            if (obj.isFile())
-            {
-                delete robj;
-            }
-            else if (!location.empty() && location != ".")
+            if (!H5Object::isEmptyPath(location))
             {
                 delete hobj;
             }
@@ -514,11 +497,7 @@ public:
             throw;
         }
 
-        if (obj.isFile())
-        {
-            delete robj;
-        }
-        else if (!location.empty() && location != ".")
+        if (!H5Object::isEmptyPath(location))
         {
             delete hobj;
         }
index 57258b4..b7d6b52 100644 (file)
@@ -17,6 +17,7 @@ optimization
 genetic_algorithms
 simulated_annealing
 xml
+hdf5
 fileio
 io
 graphics