| 
									
										
										
										
											2020-10-09 08:52:30 +02:00
										 |  |  | ///////////////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | // Copyright (C) 2020 Edouard Griffiths, F4EXB                                   //
 | 
					
						
							|  |  |  | //                                                                               //
 | 
					
						
							|  |  |  | // This program is free software; you can redistribute it and/or modify          //
 | 
					
						
							|  |  |  | // it under the terms of the GNU General Public License as published by          //
 | 
					
						
							|  |  |  | // the Free Software Foundation as version 3 of the License, or                  //
 | 
					
						
							|  |  |  | // (at your option) any later version.                                           //
 | 
					
						
							|  |  |  | //                                                                               //
 | 
					
						
							|  |  |  | // This program is distributed in the hope that it will be useful,               //
 | 
					
						
							|  |  |  | // but WITHOUT ANY WARRANTY; without even the implied warranty of                //
 | 
					
						
							|  |  |  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the                  //
 | 
					
						
							|  |  |  | // GNU General Public License V3 for more details.                               //
 | 
					
						
							|  |  |  | //                                                                               //
 | 
					
						
							|  |  |  | // You should have received a copy of the GNU General Public License             //
 | 
					
						
							|  |  |  | // along with this program. If not, see <http://www.gnu.org/licenses/>.          //
 | 
					
						
							|  |  |  | ///////////////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <QGlobalStatic>
 | 
					
						
							|  |  |  | #include <QCoreApplication>
 | 
					
						
							|  |  |  | #include <QString>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "loggerwithfile.h"
 | 
					
						
							|  |  |  | #include "dsp/dsptypes.h"
 | 
					
						
							| 
									
										
										
										
											2020-10-11 00:22:42 +02:00
										 |  |  | #include "feature/featureset.h"
 | 
					
						
							| 
									
										
										
										
											2020-10-16 08:35:06 +02:00
										 |  |  | #include "feature/feature.h"
 | 
					
						
							| 
									
										
										
										
											2020-10-11 08:27:58 +02:00
										 |  |  | #include "device/deviceset.h"
 | 
					
						
							| 
									
										
										
										
											2020-10-16 08:35:06 +02:00
										 |  |  | #include "channel/channelapi.h"
 | 
					
						
							| 
									
										
										
										
											2020-10-09 08:52:30 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include "maincore.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-10 20:08:11 +02:00
										 |  |  | MESSAGE_CLASS_DEFINITION(MainCore::MsgDeviceSetFocus, Message) | 
					
						
							|  |  |  | MESSAGE_CLASS_DEFINITION(MainCore::MsgDVSerial, Message) | 
					
						
							| 
									
										
										
										
											2020-10-09 08:52:30 +02:00
										 |  |  | MESSAGE_CLASS_DEFINITION(MainCore::MsgDeleteInstance, Message) | 
					
						
							|  |  |  | MESSAGE_CLASS_DEFINITION(MainCore::MsgLoadPreset, Message) | 
					
						
							|  |  |  | MESSAGE_CLASS_DEFINITION(MainCore::MsgSavePreset, Message) | 
					
						
							|  |  |  | MESSAGE_CLASS_DEFINITION(MainCore::MsgDeletePreset, Message) | 
					
						
							|  |  |  | MESSAGE_CLASS_DEFINITION(MainCore::MsgLoadFeatureSetPreset, Message) | 
					
						
							|  |  |  | MESSAGE_CLASS_DEFINITION(MainCore::MsgSaveFeatureSetPreset, Message) | 
					
						
							|  |  |  | MESSAGE_CLASS_DEFINITION(MainCore::MsgDeleteFeatureSetPreset, Message) | 
					
						
							|  |  |  | MESSAGE_CLASS_DEFINITION(MainCore::MsgAddDeviceSet, Message) | 
					
						
							|  |  |  | MESSAGE_CLASS_DEFINITION(MainCore::MsgRemoveLastDeviceSet, Message) | 
					
						
							| 
									
										
										
										
											2021-08-21 13:14:48 +02:00
										 |  |  | MESSAGE_CLASS_DEFINITION(MainCore::MsgAddFeatureSet, Message) | 
					
						
							|  |  |  | MESSAGE_CLASS_DEFINITION(MainCore::MsgRemoveLastFeatureSet, Message) | 
					
						
							| 
									
										
										
										
											2020-10-09 08:52:30 +02:00
										 |  |  | MESSAGE_CLASS_DEFINITION(MainCore::MsgSetDevice, Message) | 
					
						
							|  |  |  | MESSAGE_CLASS_DEFINITION(MainCore::MsgAddChannel, Message) | 
					
						
							|  |  |  | MESSAGE_CLASS_DEFINITION(MainCore::MsgDeleteChannel, Message) | 
					
						
							|  |  |  | MESSAGE_CLASS_DEFINITION(MainCore::MsgApplySettings, Message) | 
					
						
							|  |  |  | MESSAGE_CLASS_DEFINITION(MainCore::MsgAddFeature, Message) | 
					
						
							|  |  |  | MESSAGE_CLASS_DEFINITION(MainCore::MsgDeleteFeature, Message) | 
					
						
							| 
									
										
										
										
											2020-11-29 09:26:32 +01:00
										 |  |  | MESSAGE_CLASS_DEFINITION(MainCore::MsgChannelReport, Message) | 
					
						
							| 
									
										
										
										
											2020-12-13 13:04:36 +01:00
										 |  |  | MESSAGE_CLASS_DEFINITION(MainCore::MsgChannelSettings, Message) | 
					
						
							| 
									
										
										
										
											2020-12-20 01:53:03 +01:00
										 |  |  | MESSAGE_CLASS_DEFINITION(MainCore::MsgChannelDemodReport, Message) | 
					
						
							| 
									
										
										
										
											2021-06-29 21:47:27 +02:00
										 |  |  | MESSAGE_CLASS_DEFINITION(MainCore::MsgChannelDemodQuery, Message) | 
					
						
							| 
									
										
										
										
											2021-01-13 17:07:38 +00:00
										 |  |  | MESSAGE_CLASS_DEFINITION(MainCore::MsgMapItem, Message) | 
					
						
							|  |  |  | MESSAGE_CLASS_DEFINITION(MainCore::MsgPacket, Message) | 
					
						
							|  |  |  | MESSAGE_CLASS_DEFINITION(MainCore::MsgTargetAzimuthElevation, Message) | 
					
						
							| 
									
										
										
										
											2021-10-12 11:07:56 +01:00
										 |  |  | MESSAGE_CLASS_DEFINITION(MainCore::MsgStarTrackerTarget, Message) | 
					
						
							|  |  |  | MESSAGE_CLASS_DEFINITION(MainCore::MsgStarTrackerDisplaySettings, Message) | 
					
						
							|  |  |  | MESSAGE_CLASS_DEFINITION(MainCore::MsgStarTrackerDisplayLoSSettings, Message) | 
					
						
							| 
									
										
										
										
											2020-10-09 08:52:30 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | MainCore::MainCore() | 
					
						
							| 
									
										
										
										
											2020-10-11 19:58:45 +02:00
										 |  |  | { | 
					
						
							|  |  |  | 	m_masterTimer.setTimerType(Qt::PreciseTimer); | 
					
						
							|  |  |  | 	m_masterTimer.start(50); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2020-10-09 08:52:30 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | MainCore::~MainCore() | 
					
						
							|  |  |  | {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Q_GLOBAL_STATIC(MainCore, mainCore) | 
					
						
							|  |  |  | MainCore *MainCore::instance() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return mainCore; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void MainCore::setLoggingOptions() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     m_logger->setConsoleMinMessageLevel(m_settings.getConsoleMinLogLevel()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (m_settings.getUseLogFile()) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         qtwebapp::FileLoggerSettings fileLoggerSettings; // default values
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (m_logger->hasFileLogger()) { | 
					
						
							|  |  |  |             fileLoggerSettings = m_logger->getFileLoggerSettings(); // values from file logger if it exists
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         fileLoggerSettings.fileName = m_settings.getLogFileName(); // put new values
 | 
					
						
							|  |  |  |         m_logger->createOrSetFileLogger(fileLoggerSettings, 2000); // create file logger if it does not exist and apply settings in any case
 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (m_logger->hasFileLogger()) { | 
					
						
							|  |  |  |         m_logger->setFileMinMessageLevel(m_settings.getFileMinLogLevel()); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     m_logger->setUseFileLogger(m_settings.getUseLogFile()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (m_settings.getUseLogFile()) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2020-11-04 22:52:15 +01:00
										 |  |  | #if QT_VERSION >= QT_VERSION_CHECK(5, 4, 0)
 | 
					
						
							| 
									
										
										
										
											2020-10-09 08:52:30 +02:00
										 |  |  |         QString appInfoStr(QString("%1 %2 Qt %3 %4b %5 %6 DSP Rx:%7b Tx:%8b PID %9") | 
					
						
							|  |  |  |                 .arg(QCoreApplication::applicationName()) | 
					
						
							|  |  |  |                 .arg(QCoreApplication::applicationVersion()) | 
					
						
							|  |  |  |                 .arg(QT_VERSION_STR) | 
					
						
							|  |  |  |                 .arg(QT_POINTER_SIZE*8) | 
					
						
							|  |  |  |                 .arg(QSysInfo::currentCpuArchitecture()) | 
					
						
							|  |  |  |                 .arg(QSysInfo::prettyProductName()) | 
					
						
							|  |  |  |                 .arg(SDR_RX_SAMP_SZ) | 
					
						
							|  |  |  |                 .arg(SDR_TX_SAMP_SZ) | 
					
						
							|  |  |  |                 .arg(QCoreApplication::applicationPid())); | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  |         QString appInfoStr(QString("%1 %2 Qt %3 %4b DSP Rx:%5b Tx:%6b PID %7") | 
					
						
							|  |  |  |                 .arg(QCoreApplication::applicationName()) | 
					
						
							|  |  |  |                 .arg(QCoreApplication::applicationVersion()) | 
					
						
							|  |  |  |                 .arg(QT_VERSION_STR) | 
					
						
							|  |  |  |                 .arg(QT_POINTER_SIZE*8) | 
					
						
							|  |  |  |                 .arg(SDR_RX_SAMP_SZ) | 
					
						
							|  |  |  |                 .arg(SDR_RX_SAMP_SZ) | 
					
						
							|  |  |  |                 .arg(QCoreApplication::applicationPid()); | 
					
						
							|  |  |  |  #endif
 | 
					
						
							|  |  |  |         m_logger->logToFile(QtInfoMsg, appInfoStr); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2020-10-11 00:22:42 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-14 22:08:06 +01:00
										 |  |  | ChannelAPI *MainCore::getChannel(unsigned int deviceSetIndex, int channelIndex) | 
					
						
							| 
									
										
										
										
											2020-10-13 08:15:21 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2020-11-14 22:08:06 +01:00
										 |  |  |     if (deviceSetIndex < m_deviceSets.size()) { | 
					
						
							| 
									
										
										
										
											2020-10-13 08:15:21 +02:00
										 |  |  |         return m_deviceSets[deviceSetIndex]->getChannelAt(channelIndex); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |         return nullptr; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-14 22:08:06 +01:00
										 |  |  | Feature *MainCore::getFeature(unsigned int featureSetIndex, int featureIndex) | 
					
						
							| 
									
										
										
										
											2020-10-13 08:15:21 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2020-11-14 22:08:06 +01:00
										 |  |  |     if (featureSetIndex < m_featureSets.size()) { | 
					
						
							| 
									
										
										
										
											2020-10-13 08:15:21 +02:00
										 |  |  |         return m_featureSets[featureSetIndex]->getFeatureAt(featureIndex); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |         return nullptr; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-11 00:22:42 +02:00
										 |  |  | void MainCore::appendFeatureSet() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int newIndex = m_featureSets.size(); | 
					
						
							| 
									
										
										
										
											2020-10-16 08:35:06 +02:00
										 |  |  |     FeatureSet *featureSet = new FeatureSet(newIndex); | 
					
						
							|  |  |  |     m_featureSets.push_back(featureSet); | 
					
						
							|  |  |  |     m_featureSetsMap.insert(featureSet, newIndex); | 
					
						
							| 
									
										
										
										
											2020-10-11 00:22:42 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-14 22:08:06 +01:00
										 |  |  | void MainCore::removeFeatureSet(unsigned int index) | 
					
						
							| 
									
										
										
										
											2020-10-11 00:22:42 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2020-10-16 08:35:06 +02:00
										 |  |  |     if (index < m_featureSets.size()) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         FeatureSet *featureSet = m_featureSets[index]; | 
					
						
							|  |  |  |         m_featureSetsMap.remove(featureSet); | 
					
						
							| 
									
										
										
										
											2020-10-11 00:22:42 +02:00
										 |  |  |         m_featureSets.erase(m_featureSets.begin() + index); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void MainCore::removeLastFeatureSet() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2020-10-16 08:35:06 +02:00
										 |  |  |     if (m_featureSets.size() != 0) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         FeatureSet *featureSet = m_featureSets.back(); | 
					
						
							|  |  |  |         m_featureSetsMap.remove(featureSet); | 
					
						
							| 
									
										
										
										
											2020-10-11 00:22:42 +02:00
										 |  |  |         m_featureSets.pop_back(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2020-10-11 08:27:58 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | void MainCore::appendDeviceSet(int deviceType) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int newIndex = m_deviceSets.size(); | 
					
						
							| 
									
										
										
										
											2020-10-16 08:35:06 +02:00
										 |  |  |     DeviceSet *deviceSet = new DeviceSet(newIndex, deviceType); | 
					
						
							|  |  |  |     m_deviceSets.push_back(deviceSet); | 
					
						
							|  |  |  |     m_deviceSetsMap.insert(deviceSet, newIndex); | 
					
						
							| 
									
										
										
										
											2020-10-11 08:27:58 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void MainCore::removeLastDeviceSet() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2020-10-16 08:35:06 +02:00
										 |  |  |     if (m_deviceSets.size() != 0) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         DeviceSet *deviceSet = m_deviceSets.back(); | 
					
						
							|  |  |  |         m_deviceSetsMap.remove(deviceSet); | 
					
						
							| 
									
										
										
										
											2020-10-11 08:27:58 +02:00
										 |  |  |         m_deviceSets.pop_back(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2020-10-16 08:35:06 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | void MainCore::addChannelInstance(DeviceSet *deviceSet, ChannelAPI *channelAPI) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     m_channelsMap.insert(channelAPI, deviceSet); | 
					
						
							|  |  |  |     // debugMaps();
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void MainCore::removeChannelInstanceAt(DeviceSet *deviceSet, int channelIndex) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int deviceSetIndex = m_deviceSetsMap[deviceSet]; | 
					
						
							|  |  |  |     ChannelAPI *channelAPI = m_deviceSets[deviceSetIndex]->getChannelAt(channelIndex); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (channelAPI) { | 
					
						
							|  |  |  |         m_channelsMap.remove(channelAPI); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void MainCore::removeChannelInstance(ChannelAPI *channelAPI) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (channelAPI) { | 
					
						
							|  |  |  |         m_channelsMap.remove(channelAPI); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void MainCore::clearChannels(DeviceSet *deviceSet) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     for (int i = 0; i < deviceSet->getNumberOfChannels(); i++) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         ChannelAPI *channelAPI = deviceSet->getChannelAt(i); | 
					
						
							|  |  |  |         m_channelsMap.remove(channelAPI); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void MainCore::addFeatureInstance(FeatureSet *featureSet, Feature *feature) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     m_featuresMap.insert(feature, featureSet); | 
					
						
							|  |  |  |     // debugMaps();
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void MainCore::removeFeatureInstanceAt(FeatureSet *featureSet, int featureIndex) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int featureSetIndex = m_featureSetsMap[featureSet]; | 
					
						
							|  |  |  |     Feature *feature = m_featureSets[featureSetIndex]->getFeatureAt(featureIndex); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (feature) { | 
					
						
							|  |  |  |         m_featuresMap.remove(feature); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void MainCore::removeFeatureInstance(Feature *feature) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (feature) { | 
					
						
							|  |  |  |         m_featuresMap.remove(feature); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void MainCore::clearFeatures(FeatureSet *featureSet) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     for (int i = 0; i < featureSet->getNumberOfFeatures(); i++) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         Feature *feature = featureSet->getFeatureAt(i); | 
					
						
							|  |  |  |         m_featuresMap.remove(feature); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void MainCore::debugMaps() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QMap<DeviceSet*, int>::const_iterator dsIt = m_deviceSetsMap.begin(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for (; dsIt != m_deviceSetsMap.end(); ++dsIt) { | 
					
						
							|  |  |  |         qDebug("MainCore::debugMaps: device set %d #%d", dsIt.key()->getIndex(), dsIt.value()); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QMap<FeatureSet*, int>::const_iterator fsIt = m_featureSetsMap.begin(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for (; fsIt != m_featureSetsMap.end(); ++fsIt) { | 
					
						
							|  |  |  |         qDebug("MainCore::debugMaps: feature set %d #%d", fsIt.key()->getIndex(), fsIt.value()); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QMap<ChannelAPI*, DeviceSet*>::const_iterator chIt = m_channelsMap.begin(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for (; chIt != m_channelsMap.end(); ++chIt) { | 
					
						
							|  |  |  |         qDebug("MainCore::debugMaps: channel ds: %d - %d: %s %s", | 
					
						
							|  |  |  |             chIt.value()->getIndex(), chIt.key()->getIndexInDeviceSet(), qPrintable(chIt.key()->getURI()), qPrintable(chIt.key()->getName())); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QMap<Feature*, FeatureSet*>::const_iterator feIt = m_featuresMap.begin(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for (; feIt != m_featuresMap.end(); ++feIt) { | 
					
						
							|  |  |  |         qDebug("MainCore::debugMaps: feature fs: %d - %d: %s %s", | 
					
						
							|  |  |  |             feIt.value()->getIndex(), feIt.key()->getIndexInFeatureSet(), qPrintable(feIt.key()->getURI()), qPrintable(feIt.key()->getName())); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |