X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FMEDLoader%2FMEDFileUtilities.cxx;h=2f8beeeae16bbf520477c2d987340d50f463b984;hb=1b746b38f3cdeae6654a9501f37fde5e56e59288;hp=201388f6a59f2bfeaf58832c42afa371795b99c1;hpb=392b6949b0e81a257445b9d00d15345ab7e8248c;p=tools%2Fmedcoupling.git diff --git a/src/MEDLoader/MEDFileUtilities.cxx b/src/MEDLoader/MEDFileUtilities.cxx index 201388f6a..2f8beeeae 100644 --- a/src/MEDLoader/MEDFileUtilities.cxx +++ b/src/MEDLoader/MEDFileUtilities.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2016 CEA/DEN, EDF R&D +// Copyright (C) 2007-2024 CEA, EDF // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -19,11 +19,15 @@ // Author : Anthony Geay (CEA/DEN) #include "MEDFileUtilities.hxx" +#include "MEDFileSafeCaller.txx" #include "MEDLoaderBase.hxx" +#include "MEDLoader.hxx" +#include "MEDFileBasis.hxx" #include "InterpKernelAutoPtr.hxx" #include +#include const char MEDCoupling::MEDFileWritableStandAlone::DFT_FILENAME_IN_MEM[]="DftFileNameInMemory"; @@ -45,18 +49,21 @@ med_access_mode MEDFileUtilities::TraduceWriteMode(int medloaderwritemode) const char *MEDFileUtilities::GetReadableMEDFieldType(med_field_type ft) { static const char medFloat64[]="MED_FLOAT64"; + static const char medFloat32[]="MED_FLOAT32"; static const char medInt32[]="MED_INT32"; static const char medInt64[]="MED_INT64"; switch(ft) { case MED_FLOAT64: return medFloat64; + case MED_FLOAT32: + return medFloat32; case MED_INT32: return medInt32; case MED_INT64: return medInt64; default: - throw INTERP_KERNEL::Exception("Non supported field type ! Should be FLOAT64, INT32 or INT64 !"); + throw INTERP_KERNEL::Exception("Non supported field type ! Should be FLOAT64, FLOAT32, INT32 or INT64 !"); } } @@ -100,7 +107,7 @@ void MEDFileUtilities::CheckFileForRead(const std::string& fileName) throw INTERP_KERNEL::Exception(oss.str().c_str()); } oss << " has been detected readable but "; - int major,minor,release; + med_int major,minor,release; MEDfileNumVersionRd(fid,&major,&minor,&release); if(major<2 || (major==2 && minor<2)) { @@ -152,7 +159,7 @@ void MEDCoupling::MEDFileWritable::setZipConnPolicy(int newVal) std::string MEDCoupling::MEDFileWritable::FileNameFromFID(med_idt fid) { - int lgth(MEDfileName(fid,0,0)); + med_int lgth(MEDfileName(fid,0,0)); if(lgth<=0) return std::string(); INTERP_KERNEL::AutoPtr tmp(new char[lgth+1]); @@ -182,16 +189,35 @@ void MEDCoupling::MEDFileWritableStandAlone::write(const std::string& fileName, med_access_mode medmod(MEDFileUtilities::TraduceWriteMode(mode)); MEDFileUtilities::AutoFid fid(MEDfileOpen(fileName.c_str(),medmod)); std::ostringstream oss; oss << "MEDFileWritableStandAlone : error on attempt to write in file : \"" << fileName << "\""; - MEDFileUtilities::CheckMEDCode(fid,fid,oss.str()); + MEDFileUtilities::CheckMEDCode((int)fid,fid,oss.str()); writeLL(fid); } +void MEDCoupling::MEDFileWritableStandAlone::write33(const std::string& fileName, int mode) const +{ + this->writeXX(fileName,mode,3,3,1); +} + void MEDCoupling::MEDFileWritableStandAlone::write30(const std::string& fileName, int mode) const { + this->writeXX(fileName,mode,3,0,6); +} + +void MEDCoupling::MEDFileWritableStandAlone::write40(const std::string& fileName, int mode) const +{ + this->writeXX(fileName,mode,4,0,1); +} + +void MEDCoupling::MEDFileWritableStandAlone::writeXX(const std::string& fileName, int mode, med_int maj, med_int min, med_int rel) const +{ +#if ( MED_NUM_MAJEUR>4 || ( MED_NUM_MAJEUR==4 && MED_NUM_MINEUR>=1 ) ) med_access_mode medmod(MEDFileUtilities::TraduceWriteMode(mode)); - throw INTERP_KERNEL::Exception("MEDFileWritableStandAlone::write30 : will be implemented with MEDFile >= 3.2.1 !"); - //MEDFileUtilities::AutoFid fid(MEDfileVersionOpen(fileName.c_str(),medmod,3,0,0)); - //writeLL(fid); + MEDFileUtilities::AutoFid fid(MEDfileVersionOpen(fileName.c_str(),medmod,maj,min,rel)); + writeLL(fid); +#else + std::ostringstream oss; oss << "MEDFileWritableStandAlone::write" << maj << min << " : the MED version used to compile medcoupling is " << MEDFileVersionStr() << " ! If you need this feature please use version >= 4.1."; + throw INTERP_KERNEL::Exception(oss.str()); +#endif } MEDCoupling::MCAuto MEDCoupling::MEDFileWritableStandAlone::serialize() const @@ -200,10 +226,25 @@ MEDCoupling::MCAuto MEDCoupling::MEDFileWritableStan memfile.app_image_ptr=0; memfile.app_image_size=0; // - MEDFileUtilities::AutoFid fid(MEDmemFileOpen(DFT_FILENAME_IN_MEM,&memfile,MED_FALSE,MED_ACC_CREAT)); - writeLL(fid); + std::string dftFileName(GenerateUniqueDftFileNameInMem()); + {// very important to let this braces ! The AutoFid destructor must be called, to have a "clean" memfile.app_image_ptr pointer embedded in the returned object. + MEDFileUtilities::AutoFid fid(MEDmemFileOpen(dftFileName.c_str(),&memfile,MED_FALSE,MED_ACC_CREAT)); + writeLL(fid); + } // MEDCoupling::MCAuto ret(MEDCoupling::DataArrayByte::New()); - ret->useArray(reinterpret_cast(memfile.app_image_ptr),true,C_DEALLOC,memfile.app_image_size,1); + ret->useArray(reinterpret_cast(memfile.app_image_ptr),true,DeallocType::C_DEALLOC,memfile.app_image_size,1); return ret; } + +std::string MEDCoupling::MEDFileWritableStandAlone::GenerateUniqueDftFileNameInMem() +{ + static int ii=0; + std::ostringstream oss; oss << DFT_FILENAME_IN_MEM << "_" << ii++; + return oss.str(); +} + +MEDCoupling::MEDFileCapability::MEDFileCapability(med_idt fid) +{ + MEDFILESAFECALLERRD0(MEDfileNumVersionRd,(fid,&_maj,&_min,&_rel)); +}