string GetMEDVersion(in string theFileName);
/*!
- * \brief Check compatibility of file with MED format being used.
+ * \brief Check compatibility of file with MED format being used, for read only.
*/
boolean CheckCompatibility(in string theFileName);
+ /*!
+ * \brief Check compatibility of file with MED format being used, for append on write.
+ */
+ boolean CheckWriteCompatibility(in string theFileName);
+
/*!
* \brief Get names of meshes defined in file with the specified name.
*/
#include <unistd.h>
#endif
}
+#include <utilities.h>
namespace MED
{
#endif
}
- bool CheckCompatibility(const std::string& fileName)
+ bool CheckCompatibility(const std::string& fileName, bool isForAppend)
{
bool ok = false;
// check that file is accessible
if ( exists(fileName) ) {
// check HDF5 && MED compatibility
med_bool hdfok, medok;
- MEDfileCompatibility(fileName.c_str(), &hdfok, &medok);
- if ( hdfok && medok ) {
+ med_err r0 = MEDfileCompatibility(fileName.c_str(), &hdfok, &medok);
+ //MESSAGE(r0 << " " << hdfok << " " << medok);
+ if ( r0==0 && hdfok && medok ) {
med_idt aFid = MEDfileOpen(fileName.c_str(), MED_ACC_RDONLY);
if (aFid >= 0) {
med_int major, minor, release;
med_err ret = MEDfileNumVersionRd(aFid, &major, &minor, &release);
+ //MESSAGE(ret << " " << major << "." << minor << "." << release);
if (ret >= 0) {
- int version = 100*major + minor;
- if (version >= 202)
+ bool isReadOnly = !isForAppend;
+ if ( isReadOnly || ((major == MED_MAJOR_NUM) && (minor == MED_MINOR_NUM)))
ok = true;
}
}
PWrapper CrWrapperW(const std::string& fileName, int theMinor)
{
- if (!CheckCompatibility(fileName))
+ if (!CheckCompatibility(fileName, true))
remove(fileName.c_str());
return new MED::TWrapper(fileName, theMinor);
}
bool GetMEDVersion( const std::string&, int&, int&, int& );
MEDWRAPPER_EXPORT
- bool CheckCompatibility( const std::string& );
+ bool CheckCompatibility( const std::string& , bool isForAppend=false);
MEDWRAPPER_EXPORT
PWrapper CrWrapperR( const std::string& );
// Get parameters of export operation
QString aFilename;
- int aFormat =-1; // for MED minor versions
+ int aFormat =-1; // for MED minor versions
+ bool isOkToWrite = true; // to check MED file version compatibility before adding a mesh in an existing file
// Init the parameters with the default values
bool aIsASCII_STL = true;
if ( fd->exec() )
aFilename = fd->selectedFile();
- toOverwrite = fv->isOverwrite();
+ toOverwrite = fv->isOverwrite(aFilename);
toCreateGroups = fd->IsChecked(0);
SMESHGUI::resourceMgr()->setValue("SMESH", theByTypeResource, toCreateGroups );
if ( isMED ) {
//filters << QObject::tr( "MED_FILES_FILTER" ) + " (*.med)";
QString vmed (aMesh->GetVersionString(-1, 2));
- MESSAGE("MED version: " << vmed.toStdString());
+ //MESSAGE("MED version: " << vmed.toStdString());
int minor = vmed.split(".").last().toInt();
- MESSAGE("MED version minor: "<< minor);
- minor +=3; // TODO test, to remove
+ //MESSAGE("MED version minor: "<< minor);
+ //minor +=3; // TODO remove: test multiple minor
aFilterMap.insert( QObject::tr( "MED_VX_FILES_FILTER" ).arg( vmed ) + " (*.med)", minor );
for (int ii=0; ii<minor; ii++)
{
QString vs = aMesh->GetVersionString(ii, 2);
- std::ostringstream vss; // TODO test, to remove
- vss << "4."; //
- vss << ii; //
- vs = vss.str().c_str(); // TODO test, to remove
- MESSAGE("MED version: " << vs.toStdString());
+ //std::ostringstream vss; // TODO remove: test multiple minor
+ //vss << "4."; // TODO remove: test multiple minor
+ //vss << ii; // TODO remove: test multiple minor
+ //vs = vss.str().c_str(); // TODO remove: test multiple minor
+ //MESSAGE("MED version: " << vs.toStdString());
aFilterMap.insert( QObject::tr( "MED_VX_FILES_FILTER" ).arg( vs ) + " (*.med)", ii);
}
}
bool is_ok = false;
while (!is_ok) {
+ //MESSAGE("******* Loop on file dialog ***********");
+ isOkToWrite =true;
if ( fd->exec() )
aFilename = fd->selectedFile();
else {
break;
}
aFormat = aFilterMap[fd->selectedNameFilter()];
- MESSAGE("selected minor: " << aFormat);
- toOverwrite = fv->isOverwrite();
+ //MESSAGE("selected minor: " << aFormat << " file: " << aFilename.toUtf8().constData());
+ toOverwrite = fv->isOverwrite(aFilename);
is_ok = true;
if ( !aFilename.isEmpty() ) {
if( !toOverwrite ) {
// can't append to an existing using other format
- bool isVersionOk = SMESHGUI::GetSMESHGen()->CheckCompatibility( aFilename.toUtf8().constData() );
+ bool isVersionOk = SMESHGUI::GetSMESHGen()->CheckWriteCompatibility( aFilename.toUtf8().constData() );
if ( !isVersionOk ) {
int aRet = SUIT_MessageBox::warning(SMESHGUI::desktop(),
QObject::tr("SMESH_WRN_WARNING"),
QObject::tr("SMESH_BUT_YES"),
QObject::tr("SMESH_BUT_NO"), 0, 1);
if (aRet == 0)
- toOverwrite = true;
+ {
+ toOverwrite = true;
+ MESSAGE("incompatible MED file version for add, overwrite accepted");
+ }
else
- is_ok = false;
+ {
+ isOkToWrite = false;
+ is_ok = false;
+ MESSAGE("incompatible MED file version for add, overwrite refused");
+ }
}
-
QStringList aMeshNamesCollisionList;
SMESH::string_array_var aMeshNames = SMESHGUI::GetSMESHGen()->GetMeshNames( aFilename.toUtf8().constData() );
for( int i = 0, n = aMeshNames->length(); i < n; i++ ) {
}
}
}
- if( !aMeshNamesCollisionList.isEmpty() ) {
+ if( !aMeshNamesCollisionList.isEmpty() ) {
+ isOkToWrite = false;
QString aMeshNamesCollisionString = aMeshNamesCollisionList.join( ", " );
int aRet = SUIT_MessageBox::warning(SMESHGUI::desktop(),
QObject::tr("SMESH_WRN_WARNING"),
QObject::tr("SMESH_BUT_YES"),
QObject::tr("SMESH_BUT_NO"),
QObject::tr("SMESH_BUT_CANCEL"), 0, 2);
- if (aRet == 0)
+ //MESSAGE("answer collision name " << aRet);
+ if (aRet == 0) {
toOverwrite = true;
+ isOkToWrite = true;
+ }
else if (aRet == 2)
is_ok = false;
}
}
}
}
+ //MESSAGE(" ****** end of file dialog loop")
toCreateGroups = fd->IsChecked(0);
toFindOutDim = fd->IsChecked(1);
fieldSelWdg->GetSelectedFields();
// if ( SMESHGUI::automaticUpdate() )
// SMESH::UpdateView();
// }
- if ( isMED )
+ if ( isMED && isOkToWrite)
{
+ //MESSAGE("OK to write MED file "<< aFilename.toUtf8().constData());
aMeshIter = aMeshList.begin();
for( int aMeshIndex = 0; aMeshIter != aMeshList.end(); aMeshIter++, aMeshIndex++ )
{
}
return true;
}
+
+bool SMESHGUI_FileValidator::isOverwrite( const QString& fileName) const
+{
+ if ( QFile::exists( fileName ) )
+ return myIsOverwrite;
+ return true;
+}
virtual bool canSave( const QString&, bool = true );
- bool isOverwrite() const { return myIsOverwrite; }
+ bool isOverwrite( const QString& fileName) const;
private:
bool myIsOverwrite;
/*!
* SMESH_Gen_i::CheckCompatibility
*
- * Check compatibility of file with MED format being used.
+ * Check compatibility of file with MED format being used, read only.
*/
//================================================================================
CORBA::Boolean SMESH_Gen_i::CheckCompatibility(const char* theFileName)
return MED::CheckCompatibility( theFileName );
}
+//================================================================================
+/*!
+ * SMESH_Gen_i::CheckWriteCompatibility
+ *
+ * Check compatibility of file with MED format being used, for append on write.
+ */
+//================================================================================
+CORBA::Boolean SMESH_Gen_i::CheckWriteCompatibility(const char* theFileName)
+{
+ return MED::CheckCompatibility( theFileName, true );
+}
+
//================================================================================
/*!
* SMESH_Gen_i::GetMeshNames
//================================================================================
SMESH::string_array* SMESH_Gen_i::GetMeshNames(const char* theFileName)
{
+ //MESSAGE("GetMeshNames " << theFileName);
SMESH::string_array_var aResult = new SMESH::string_array();
MED::PWrapper aMed = MED::CrWrapperR( theFileName );
MED::TErr anErr;
MED::TInt aNbMeshes = aMed->GetNbMeshes( &anErr );
+ //MESSAGE("---" << aNbMeshes);
if( anErr >= 0 ) {
aResult->length( aNbMeshes );
for( MED::TInt i = 0; i < aNbMeshes; i++ ) {
// Get MED version of the file by its name
char* GetMEDVersion(const char* theFileName);
- // Check compatibility of file with MED format being used.
+ // Check compatibility of file with MED format being used, read only.
CORBA::Boolean CheckCompatibility(const char* theFileName);
+ // Check compatibility of file with MED format being used, for append on write.
+ CORBA::Boolean CheckWriteCompatibility(const char* theFileName);
+
// Get names of meshes defined in file with the specified name
SMESH::string_array* GetMeshNames(const char* theFileName);
CORBA::Boolean autoDimension)
throw(SALOME::SALOME_Exception)
{
- MESSAGE("MED minor version: "<< minor);
+ //MESSAGE("MED minor version: "<< minor);
SMESH_TRY;
if ( _preMeshInfo )
_preMeshInfo->FullLoadFromFile();
const char* geomAssocFields)
throw (SALOME::SALOME_Exception)
{
- MESSAGE("MED minor version: "<< minor);
+ //MESSAGE("MED minor version: "<< minor);
SMESH_TRY;
if ( _preMeshInfo )
_preMeshInfo->FullLoadFromFile();