Salome HOME
Merge V8_4_BR branch.
[modules/kernel.git] / src / HDFPersist / HDFfile.cc
1 // Copyright (C) 2007-2016  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
5 //
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License, or (at your option) any later version.
10 //
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 // Lesser General Public License for more details.
15 //
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
19 //
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 //
22
23 //  SALOME HDFPersist : implementation of HDF persitent ( save/ restore )
24 //  File   : HDFfile.cc
25 //  Module : SALOME
26 //
27 #include "hdfi.h"
28 #ifndef WIN32
29 #include <unistd.h>
30 #else
31 #include <io.h>
32 #define F_OK 0
33 #define access _access
34 #endif
35 #include <string.h>
36 #include <iostream>
37 #include "HDFfile.hxx"
38 #include "HDFexception.hxx"
39
40 herr_t file_attr(hid_t loc_id, const char *attr_name, void *operator_data)
41 {
42    *(char**)operator_data = new char[strlen(attr_name)+1];
43    strcpy(*(char**)operator_data, attr_name);
44    return 1;
45 }
46
47 HDFfile::HDFfile(char *name)
48   : HDFcontainerObject(name) 
49 {
50   _attribute = NULL;
51 }
52
53 void HDFfile::CreateOnDisk()
54 {
55   if ((_id = HDFfileCreate(_name)) < 0) 
56     throw HDFexception("Can't create HDF file");
57 }
58
59 void HDFfile::OpenOnDisk(hdf_access_mode access_mode)
60 {
61   _access_mode = access_mode;
62
63   switch (_access_mode)
64     {
65     case HDF_RDWR :
66       if (access(_name,F_OK))
67         {
68           if ((_id = HDFfileCreate(_name)) < 0) 
69             throw HDFexception("Can't open HDF file");
70         }
71       else
72         if ((_id = HDFfileOpen(_name,_access_mode)) < 0)
73           throw HDFexception("Can't open HDF file");
74       break;
75       
76     case HDF_RDONLY :
77       if ((_id = HDFfileOpen(_name,_access_mode)) < 0)
78         throw HDFexception("Can't open HDF file");
79       break;
80       
81     default :
82       throw HDFexception("Can't open HDF file : bad access option");
83     }
84 }
85
86 void HDFfile::CloseOnDisk()
87 {
88   hdf_err ret;
89
90   if ((ret = HDFfileClose(_id)) < 0) 
91     throw HDFexception("Can't close HDF file");
92   _id = -1;
93 }
94   
95
96 hdf_access_mode HDFfile::GetAccessMode()
97 {
98   return _access_mode;
99 }
100
101 hdf_object_type HDFfile::GetObjectType()
102 {
103   return HDF_FILE;
104 }
105
106 int HDFfile::nInternalObjects()
107 {
108   int n;
109   hdf_err ret;   
110
111   if ((ret = HDFnObjects(_id,"/",&n)) < 0)
112     throw HDFexception("Can't determine the number of internal objects");
113
114   return  n;
115 }
116
117 void HDFfile::InternalObjectIndentify(int rank, char *object_name)
118 {
119   hdf_err ret;
120
121   if ((ret = HDFobjectIdentify(_id,"/",rank,object_name)) < 0)
122     throw HDFexception("Can't identify an internal object");
123 }
124
125 int HDFfile::ExistInternalObject(const char *object_name)
126 {
127   int n,i;
128   int ret = 0;
129   char name[HDF_NAME_MAX_LEN+1];
130
131   n = this->nInternalObjects(); 
132   for (i=0;i<n;i++) 
133     {
134       this->InternalObjectIndentify(i,name);
135       if (!strcmp(name,object_name))
136         {
137           ret = 1;
138           break;
139         }
140     }  
141   return ret;
142 }
143
144 hdf_object_type HDFfile::InternalObjectType(char *object_name)
145 {
146   hdf_object_type type;
147   hdf_err ret;
148   
149   if ((ret = HDFobjectType(_id,object_name,&type)) < 0)
150     throw HDFexception("Can't determine internal object type");
151
152   return type;
153 }
154
155 int HDFfile::nAttributes()
156 {
157   int nbAttrs = H5Aget_num_attrs(_id);
158   if(nbAttrs <= 0) nbAttrs = 0;
159   return nbAttrs; 
160 }
161
162 char* HDFfile::GetAttributeName(unsigned idx)
163 {
164   int nbAttrs = nAttributes();
165   if(nbAttrs == 0) return NULL;
166   H5Aiterate(_id, &idx, file_attr, &_attribute);
167   return _attribute;
168 }