@@ -1359,60 +1359,119 @@ FormModSim* MainWindow::firstMdiChild() const
13591359// /
13601360void MainWindow::loadConfig (const QString& filename, bool startup)
13611361{
1362+ const auto format = filename.endsWith (" .xml" , Qt::CaseInsensitive) ?
1363+ SerializationFormat::Xml :
1364+ SerializationFormat::Binary;
1365+
13621366 QFile file (filename);
13631367 if (!file.open (QFile::ReadOnly))
13641368 return ;
13651369
1366- QDataStream s (&file);
1367- s.setByteOrder (QDataStream::BigEndian);
1368- s.setVersion (QDataStream::Version::Qt_5_0);
1370+ ModbusDefinitions defs;
1371+ QList<ConnectionDetails> conns;
1372+ switch (format)
1373+ {
1374+ case SerializationFormat::Binary:
1375+ {
1376+ QDataStream s (&file);
1377+ s.setByteOrder (QDataStream::BigEndian);
1378+ s.setVersion (QDataStream::Version::Qt_5_0);
13691379
1370- quint8 magic = 0 ;
1371- s >> magic;
1380+ quint8 magic = 0 ;
1381+ s >> magic;
13721382
1373- if (magic != 0x35 )
1374- return ;
1383+ if (magic != 0x35 )
1384+ return ;
13751385
1376- QVersionNumber ver;
1377- s >> ver;
1386+ QVersionNumber ver;
1387+ s >> ver;
13781388
1379- if (ver < QVersionNumber (1 , 0 ))
1380- return ;
1389+ if (ver < QVersionNumber (1 , 0 ))
1390+ return ;
13811391
1382- QStringList listFilename;
1383- s >> listFilename;
1392+ QStringList listFilename;
1393+ s >> listFilename;
13841394
1385- QList<ConnectionDetails> conns;
1386- s >> conns;
1387-
1388- if (ver >= QVersionNumber (1 , 1 )) {
1389- ModbusDefinitions defs;
1390- s >> defs.AddrSpace ;
1391- s >> defs.UseGlobalUnitMap ;
1392- s >> defs.ErrorSimulations ;
1393- _mbMultiServer.setModbusDefinitions (defs);
1394- }
1395+ ui->mdiArea ->closeAllSubWindows ();
1396+ for (auto && filename: listFilename)
1397+ {
1398+ if (!filename.isEmpty ())
1399+ openFile (filename);
1400+ }
13951401
1396- if (s.status () != QDataStream::Ok)
1397- return ;
1402+ s >> conns;
13981403
1399- ui->mdiArea ->closeAllSubWindows ();
1404+ if (ver >= QVersionNumber (1 , 1 )) {
1405+ s >> defs.AddrSpace ;
1406+ s >> defs.UseGlobalUnitMap ;
1407+ s >> defs.ErrorSimulations ;
1408+ }
1409+
1410+ if (s.status () != QDataStream::Ok)
1411+ return ;
1412+ }
1413+ break ;
1414+
1415+ case SerializationFormat::Xml:
1416+ {
1417+ QXmlStreamReader xml (&file);
1418+ while (xml.readNextStartElement ()) {
1419+ if (xml.name () == QLatin1String (" OpenModSim" )) {
1420+ while (xml.readNextStartElement ()) {
1421+ if (xml.name () == QLatin1String (" ModbusDefinitions" )) {
1422+ xml >> defs;
1423+ }
1424+ else if (xml.name () == QLatin1String (" Connections" )) {
1425+ while (xml.readNextStartElement ()) {
1426+ if (xml.name () == QLatin1String (" ConnectionDetails" )) {
1427+ ConnectionDetails cd;
1428+ xml >> cd;
1429+ conns.append (cd);
1430+ } else {
1431+ xml.skipCurrentElement ();
1432+ }
1433+ }
1434+ }
1435+ else if (xml.name () == QLatin1String (" Forms" )) {
1436+ ui->mdiArea ->closeAllSubWindows ();
1437+ while (xml.readNextStartElement ()) {
1438+ if (xml.name () == QLatin1String (" FormModSim" )) {
1439+ auto frm = createMdiChild (++_windowCounter);
1440+ if (frm) {
1441+ xml >> frm;
1442+ frm->show ();
1443+ }
1444+ } else {
1445+ xml.skipCurrentElement ();
1446+ }
1447+ }
1448+ }
1449+ else {
1450+ xml.skipCurrentElement ();
1451+ }
1452+ }
1453+ }
1454+ else {
1455+ xml.skipCurrentElement ();
1456+ }
1457+ }
1458+
1459+ }
1460+ break ;
1461+ }
14001462
14011463 auto menu = qobject_cast<MenuConnect*>(ui->actionConnect ->menu ());
14021464 menu->updateConnectionDetails (conns);
14031465
1466+ // setup definitions
1467+ _mbMultiServer.setModbusDefinitions (defs);
1468+
14041469 for (auto && cd : conns)
14051470 {
14061471 if (menu->canConnect (cd))
14071472 _mbMultiServer.connectDevice (cd);
14081473 }
14091474
1410- for (auto && filename: listFilename)
1411- {
1412- if (!filename.isEmpty ())
1413- openFile (filename);
1414- }
1415-
14161475 if (startup) {
14171476 for (auto && wnd : ui->mdiArea ->subWindowList ()) {
14181477 const auto frm = qobject_cast<FormModSim*>(wnd->widget ());
@@ -1434,8 +1493,6 @@ void MainWindow::saveConfig(const QString& filename, SerializationFormat format)
14341493 if (!file.open (QFile::WriteOnly))
14351494 return ;
14361495
1437- qDebug () << (int )format;
1438-
14391496 switch (format)
14401497 {
14411498 case SerializationFormat::Binary:
@@ -1514,7 +1571,9 @@ void MainWindow::saveConfig(const QString& filename, SerializationFormat format)
15141571// /
15151572FormModSim* MainWindow::loadMdiChild (const QString& filename)
15161573{
1517- const auto format = filename.endsWith (" .xml" , Qt::CaseInsensitive) ? SerializationFormat::Xml : SerializationFormat::Binary;
1574+ const auto format = filename.endsWith (" .xml" , Qt::CaseInsensitive) ?
1575+ SerializationFormat::Xml :
1576+ SerializationFormat::Binary;
15181577
15191578 QFile file (filename);
15201579 if (!file.open (QFile::ReadOnly))
@@ -1549,19 +1608,16 @@ FormModSim* MainWindow::loadMdiChild(const QString& filename)
15491608
15501609 bool created = false ;
15511610 frm = findMdiChild (formId);
1552- if (!frm)
1553- {
1611+ if (!frm) {
15541612 frm = createMdiChild (formId);
15551613 created = true ;
15561614 }
15571615
1558- if (frm)
1559- {
1616+ if (frm) {
15601617 frm->setProperty (" Version" , QVariant::fromValue (ver));
15611618 s >> frm;
15621619
1563- if (s.status () != QDataStream::Ok && created)
1564- {
1620+ if (s.status () != QDataStream::Ok && created) {
15651621 closeMdiChild (frm);
15661622 }
15671623 }
@@ -1570,27 +1626,26 @@ FormModSim* MainWindow::loadMdiChild(const QString& filename)
15701626
15711627 case SerializationFormat::Xml:
15721628 {
1573- QXmlStreamReader r (&file);
1574-
1575- frm = createMdiChild (++_windowCounter);
1576- if (frm)
1577- {
1578- r >> frm;
1579-
1580- // close windows with the same title
1581- for ( auto && wnd : ui-> mdiArea -> subWindowList ()) {
1582- const auto f = qobject_cast<FormModSim*>(wnd-> widget ());
1583- if (f != nullptr && f != frm && f-> windowTitle () == frm-> windowTitle ()) {
1584- wnd-> close ();
1629+ QXmlStreamReader xml (&file);
1630+ if (xml. readNextStartElement () && xml. name () == QLatin1String ( " FormModSim " )) {
1631+ frm = createMdiChild (++_windowCounter);
1632+ if (frm) {
1633+ xml >> frm;
1634+
1635+ // close windows with the same title
1636+ for ( auto && wnd : ui-> mdiArea -> subWindowList ()) {
1637+ const auto f = qobject_cast<FormModSim*>(wnd-> widget ());
1638+ if (f != nullptr && f != frm && f-> windowTitle () == frm-> windowTitle ()) {
1639+ wnd-> close ();
1640+ }
15851641 }
15861642 }
15871643 }
15881644 }
15891645 break ;
15901646 }
15911647
1592- if (frm)
1593- {
1648+ if (frm) {
15941649 frm->setFilename (filename);
15951650
15961651 addRecentFile (filename);
0 commit comments