source: XMLIO_V2/dev/dev_rv/src/XMLIO/c_interface.cpp @ 134

Last change on this file since 134 was 134, checked in by hozdoba, 12 years ago

Pour sauvegarde

File size: 6.2 KB
Line 
1#include "c_interface.hpp"
2
3/* ********************************************************** */
4/*                      CONVERSION FUNCTION                   */
5/* ********************************************************** */
6
7static inline std::string stringXtoStd(const XString _str)
8{
9   char * const temp = new char[_str.len+1]();
10   memset(temp, '\0', _str.len+1);
11   memcpy(temp, _str.str, _str.len);
12   std::string _retstr(temp);
13   size_t d = _retstr.find_first_not_of(' ');
14   size_t f = _retstr.find_last_not_of (' ');
15
16   delete[] temp;
17   return (_retstr.substr(d, f-d+1));
18}
19
20static inline XString stringXtoStd(const std::string& _str) // Non testée
21{
22   XString _retstr = {new char[_str.size()](), _str.size()};
23   memcpy(_retstr.str, _str.c_str(), _str.size());
24   return (_retstr);
25}
26
27static inline Duration durationXtoXMLIO(const XDuration * const _xdur) // Non testée
28{
29   Duration __dur= { _xdur->year, _xdur->month , _xdur->day,
30                     _xdur->hour, _xdur->minute, _xdur->second };
31   return (__dur);
32}
33
34/* ********************************************************** */
35/*                      HANDLE INTERFACE                      */
36/* ********************************************************** */
37
38void xios_handle_create_(XHandle * const _ret, const XDType * const _dtype, const XString _id)
39{
40   // Si le handle n'est pas initialisé à 0, on ne fait aucun traitement.
41   if (!isNullHandle(*_ret)) return;
42   std::string __id = stringXtoStd(_id);
43   switch(*_dtype)
44   {
45      /* EAXIS, EDOMAIN, EFIELD, EFILE, EGRID, GAXIS, GDOMAIN, GFIELD, GFILE, GGRID*/
46      case (ECONTEXT):
47         // Si le context n'existe pas, on retourne un handle vide/nul.
48         if (!Context::HasContext(__id)) { *_ret = NULLHANDLE; return ; }
49         _ret->data_type = *_dtype;
50         _ret->data_ptr  = Context::GetContext(__id);
51         return ;
52
53      default :
54         *_ret = NULLHANDLE;
55         return ;
56   };
57}
58
59/* ********************************************************** */
60/*                      XML INTERFACE                         */
61/* ********************************************************** */
62
63void xios_xml_parse_file_(const XString _filename)
64{
65   std::string   __filename = stringXtoStd(_filename);
66   std::ifstream __istr( __filename.c_str() , std::ifstream::in );
67
68   // On commence la lecture du flux de donnée xml.
69   XMLNode node = XMLNode::CreateNode(__istr, Context::GetRootName());
70
71   // On parse le fichier xml noeud par noeud
72   // (ie on construit dynamiquement notre arbre d'objets).
73   XMLParser::Parse(node);
74}
75
76void xios_xml_parse_string_(const XString _xmlcontent)
77{
78   std::string        __xmlcontent = stringXtoStd(_xmlcontent);
79   std::istringstream __istr(__xmlcontent);
80
81   // On commence la lecture du flux de donnée xml.
82   XMLNode node = XMLNode::CreateNode(__istr, Context::GetRootName());
83
84   // On parse le fichier xml noeud par noeud
85   // (ie on construit dynamiquement notre arbre d'objets).
86   XMLParser::Parse(node);
87}
88
89/* ********************************************************** */
90/*                      DATA TREATMENT INTERFACE              */
91/* ********************************************************** */
92
93static std::vector<DataTreatment *> AllDataTreatment;
94
95static void deleteAllDataTreatment(void)
96{
97   std::vector<DataTreatment *>::iterator it;
98   for (it  = AllDataTreatment.begin();
99        it != AllDataTreatment.end(); it++)
100      if (*it != NULL) delete (*it);
101}
102
103void xios_dtreatment_new_(XHandle * const _dt, const XHandle * const _hd)
104{
105   static bool called = false;
106
107   // Si le handle de traitement n'est pas initialisé à 0, on ne fait aucun traitement.
108   if (!isNullHandle(*_dt) || (_hd->data_type != ECONTEXT)) return;
109   Context       * const __ctxt = (Context*) _hd->data_ptr;
110   DataTreatment * const __dtrt =__ctxt->setDataTreatment<DataTreatment>();
111
112   if (__dtrt != NULL)
113   {
114      AllDataTreatment.push_back(__dtrt);
115      _dt->data_type = DTREATMENT;
116      _dt->data_ptr  = __dtrt;
117      if (!called)
118      {
119         atexit (&deleteAllDataTreatment);
120         called = true;
121      }
122   }
123}
124
125void xios_dtreatment_create_files_and_headers_(const XHandle * const _hd, const XFileType * const _ft)
126{
127   if (isNullHandle(*_hd) || (_hd->data_type != DTREATMENT)) return;
128   DataTreatment * const __dt = (DataTreatment*)_hd->data_ptr;
129   switch(*_ft)
130   {
131      case (NETCDF4):
132         __dt->createDataOutput<NetCDF4DataOutput>();
133         return;
134      // Autres formats de fichiers si disponibles...
135      default:
136         return;
137   }
138}
139
140/* ********************************************************** */
141/*                      CONTEXT INTERFACE                     */
142/* ********************************************************** */
143
144void xios_context_set_current_(const XHandle * const _ctxt, const bool * const _wswap)
145{
146   bool __wswap = (_wswap == NULL) ? false : *_wswap;
147   if (isNullHandle(*_ctxt) || (_ctxt->data_type != ECONTEXT)) return;
148   Context* const __ctxt = (Context*) _ctxt->data_ptr;
149   Context::SetCurrentContext(__ctxt->getId(), __wswap) ;
150}
151
152void xios_context_get_current_ (XHandle * _ctxt)
153{
154   // Si le handle de traitement n'est pas initialisé à 0, on ne fait aucun traitement.
155   if ((Context::GetAllListObject().size() == 0) ||
156         !isNullHandle(*_ctxt)) return;
157   _ctxt->data_type = ECONTEXT;
158   _ctxt->data_ptr  = Context::GetCurrentContext();
159}
160
161void xios_context_get_calendar_(const XHandle * const _ctxt, XHandle * _cal)
162{
163   if (!isNullHandle(*_cal)  || isNullHandle(*_ctxt) ||
164      (_ctxt->data_type != ECONTEXT)) return;
165   Context* const __ctxt = (Context*) _ctxt->data_ptr;
166   AbstractCalendar * const __cal  = __ctxt->getCalendar();
167   if (__cal != NULL)
168   {
169      _cal->data_type = CALENDAR;
170      _cal->data_ptr  = __cal;
171   }
172}
173
174/* ********************************************************** */
175/*                      CALENDAR INTERFACE                    */
176/* ********************************************************** */
177
178void xios_calendar_set_timestep_(const XHandle * const _cal, const XDuration * const _dur)
179{
180   if (isNullHandle(*_cal) || (_cal->data_type != CALENDAR)) return;
181   const Duration __dur = durationXtoXMLIO(_dur);
182   AbstractCalendar * const __cal = (AbstractCalendar*) _cal->data_ptr;
183   __cal->setTimeStep(__dur);
184}
185
186#undef isNullHandle
Note: See TracBrowser for help on using the repository browser.