Salome HOME
1b57e1efba68905e528febeadf319426a0923f24
[modules/kernel.git] / src / HDFPersist / HDFconvert.cc
1 // Copyright (C) 2007-2014  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   : HDFconvert.cc
25 //  Module : SALOME
26 //
27 #include "HDFconvert.hxx"
28
29 #ifdef WIN32
30 #include <io.h>
31 #include <windows.h>
32 #define open _open
33 #define close _close
34 #endif
35
36 int HDFConvert::FromAscii(const std::string& file, const HDFcontainerObject & hdf_container, const std::string& nomdataset)
37 {
38   
39   HDFdataset   * hdf_dataset;
40   char         * buffer;
41   int          fd;
42   struct stat  status;
43   size_t       length;
44   hdf_size     length_long;
45   
46   // Ouverture du fichier source
47   if ( (fd = open(file.c_str(),O_RDONLY)) <0) { 
48     perror("HDFConvert::FromAscii");
49     return -1;
50   };
51   
52   // Lit l'\89tat du fichier
53   if ( fstat(fd,&status) < 0) {
54     perror("HDFConvert::FromAscii");
55     return -1;
56   };
57   
58   length = status.st_size; //Calcul la taille du fichier en octets
59   length_long = length;
60   
61 #ifdef _POSIX_MAPPED_FILES
62   
63   // Map le fichier en m\89moire
64   if ( (buffer = (char *)  mmap(0,length,PROT_READ,MAP_SHARED,fd,0)) == MAP_FAILED ) {
65     perror("HDFConvert::FromAscii");
66     return -1;
67   };
68 #elif defined WIN32
69
70 #define SHMEMSIZE 4096
71
72   HANDLE hMapObject = CreateFileMapping( 
73            INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, SHMEMSIZE, "");
74   if (hMapObject != NULL) {
75   // Get a pointer to the file-mapped shared memory.
76   buffer = ( char* ) MapViewOfFile( 
77     hMapObject, FILE_MAP_WRITE, 0, 0, 0 );
78   if( buffer == NULL )
79     CloseHandle(hMapObject);
80   };
81
82 #else
83
84   // Sort de la compilation
85 #error Necessite l''utilisation de la primitive mmap
86   
87 #endif
88   
89   // Creation du Dataset utilisateur 
90   hdf_dataset = new HDFdataset( (char *) nomdataset.c_str(),            /*discard const */
91                                             (HDFcontainerObject*) &hdf_container,   /*discard const, pas de constructeur par r\89f\89rence */
92                                             HDF_STRING,
93                                             &length_long,1);
94   // Cree le Dataset sur le disk
95   hdf_dataset->CreateOnDisk();
96   
97   // Effectue la copie
98   hdf_dataset->WriteOnDisk(buffer);
99   
100   // Ferme le fichier hdf
101   hdf_dataset->CloseOnDisk();
102   
103   // Memory Clean
104   delete hdf_dataset;
105   
106 #ifdef _POSIX_MAPPED_FILES
107   
108   // Desalloue le mapping
109   if (munmap(buffer,length) < 0 ) {
110     perror("HDFConvert::FromAscii");
111     return -1;
112   };
113 #endif
114   
115   // Ferme le fichier ASCII
116   if (close(fd) <0) {
117     perror("HDFConvert::FromAscii");
118     return -1;
119   };
120     
121
122   return length;    
123 };