Skip to content

Commit e747034

Browse files
committed
Developing XML format of save files (#55)
1 parent b19efcf commit e747034

3 files changed

Lines changed: 112 additions & 56 deletions

File tree

omodsim/formmodsim.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -616,7 +616,7 @@ inline QXmlStreamReader& operator >>(QXmlStreamReader& xml, FormModSim* frm)
616616
{
617617
if (!frm) return xml;
618618

619-
if (xml.readNextStartElement() && xml.name() == QLatin1String("FormModSim")) {
619+
if (xml.isStartElement() && xml.name() == QLatin1String("FormModSim")) {
620620
DataDisplayMode ddm;
621621
DisplayDefinition dd;
622622
QHash<quint16, quint16> data;

omodsim/main.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ namespace {
1212
static const int reg3 = qRegisterMetaType<QModbusDataUnit>();
1313
static const int reg4 = qRegisterMetaType<ModbusMessage::ProtocolType>();
1414
static const int reg5 = qRegisterMetaType<QSharedPointer<const ModbusMessage>>();
15+
static const int reg6 = qRegisterMetaType<ModbusDefinitions>();
1516
}
1617
#endif
1718

omodsim/mainwindow.cpp

Lines changed: 110 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1359,60 +1359,119 @@ FormModSim* MainWindow::firstMdiChild() const
13591359
///
13601360
void 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
///
15151572
FormModSim* 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

Comments
 (0)