| 
									
										
										
										
											2020-09-28 00:18:30 +02:00
										 |  |  | ///////////////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | // Copyright (C) 2020 Jon Beniston, M7RCE                                        //
 | 
					
						
							|  |  |  | // 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 <QJsonArray>
 | 
					
						
							|  |  |  | #include <QList>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "webapiutils.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-22 08:38:43 +02:00
										 |  |  | const QMap<QString, QString> WebAPIUtils::m_channelURIToSettingsKey = { | 
					
						
							| 
									
										
										
										
											2020-11-24 12:31:16 +00:00
										 |  |  |     {"sdrangel.channel.adsbdemod", "ADSBDemodSettings"}, | 
					
						
							| 
									
										
										
										
											2021-05-07 21:50:27 +01:00
										 |  |  |     {"sdrangel.channel.modais", "AISModSettings"}, | 
					
						
							|  |  |  |     {"sdrangel.channel.aisdemod", "AISDemodSettings"}, | 
					
						
							| 
									
										
										
										
											2020-10-22 08:38:43 +02:00
										 |  |  |     {"sdrangel.channel.amdemod", "AMDemodSettings"}, | 
					
						
							| 
									
										
										
										
											2021-02-26 20:47:24 +00:00
										 |  |  |     {"sdrangel.channel.aptdemod", "APTDemodSettings"}, | 
					
						
							| 
									
										
										
										
											2020-10-22 08:38:43 +02:00
										 |  |  |     {"de.maintech.sdrangelove.channel.am", "AMDemodSettings"}, // remap
 | 
					
						
							|  |  |  |     {"sdrangel.channeltx.modam", "AMModSettings"}, | 
					
						
							|  |  |  |     {"sdrangel.channeltx.modatv", "ATVModSettings"}, | 
					
						
							| 
									
										
										
										
											2021-03-18 17:17:58 +00:00
										 |  |  |     {"sdrangel.channeltx.moddatv", "DATVModSettings"}, | 
					
						
							| 
									
										
										
										
											2020-10-22 08:38:43 +02:00
										 |  |  |     {"sdrangel.channel.bfm", "BFMDemodSettings"}, | 
					
						
							|  |  |  |     {"sdrangel.channel.chanalyzer", "ChannelAnalyzerSettings"}, | 
					
						
							|  |  |  |     {"sdrangel.channel.chanalyzerng", "ChannelAnalyzerSettings"}, // remap
 | 
					
						
							|  |  |  |     {"org.f4exb.sdrangelove.channel.chanalyzer", "ChannelAnalyzerSettings"}, // remap
 | 
					
						
							|  |  |  |     {"sdrangel.channel.chirpchatdemod", "ChirpChatDemodSettings"}, | 
					
						
							|  |  |  |     {"sdrangel.channel.modchirpchat", "ChirpChatModSettings"}, | 
					
						
							|  |  |  |     {"sdrangel.channel.demodatv", "ATVDemodSettings"}, | 
					
						
							|  |  |  |     {"sdrangel.channel.demoddatv", "DATVDemodSettings"}, | 
					
						
							| 
									
										
										
										
											2021-04-16 22:56:15 +01:00
										 |  |  |     {"sdrangel.channel.dabdemod", "DABDemodSettings"}, | 
					
						
							| 
									
										
										
										
											2022-05-27 00:50:38 +02:00
										 |  |  |     {"sdrangel.channel.doa2", "DOA2Settings"}, | 
					
						
							| 
									
										
										
										
											2020-10-22 08:38:43 +02:00
										 |  |  |     {"sdrangel.channel.dsddemod", "DSDDemodSettings"}, | 
					
						
							|  |  |  |     {"sdrangel.channel.filesink", "FileSinkSettings"}, | 
					
						
							|  |  |  |     {"sdrangel.channeltx.filesource", "FileSourceSettings"}, | 
					
						
							|  |  |  |     {"sdrangel.channel.freedvdemod", "FreeDVDemodSettings"}, | 
					
						
							|  |  |  |     {"sdrangel.channeltx.freedvmod", "FreeDVModSettings"}, | 
					
						
							|  |  |  |     {"sdrangel.channel.freqtracker", "FreqTrackerSettings"}, | 
					
						
							| 
									
										
										
										
											2022-06-05 00:54:59 +02:00
										 |  |  |     {"sdrangel.channel.m17demod", "M17DemodSettings"}, | 
					
						
							| 
									
										
										
										
											2022-06-10 01:42:24 +02:00
										 |  |  |     {"sdrangel.channeltx.modm17", "M17ModSettings"}, | 
					
						
							| 
									
										
										
										
											2020-10-22 08:38:43 +02:00
										 |  |  |     {"sdrangel.channel.nfmdemod", "NFMDemodSettings"}, | 
					
						
							|  |  |  |     {"de.maintech.sdrangelove.channel.nfm", "NFMDemodSettings"}, // remap
 | 
					
						
							|  |  |  |     {"sdrangel.channeltx.modnfm", "NFMModSettings"}, | 
					
						
							| 
									
										
										
										
											2021-06-09 16:17:59 +01:00
										 |  |  |     {"sdrangel.channel.noisefigure", "NoiseFigureSettings"}, | 
					
						
							| 
									
										
										
										
											2020-10-22 08:38:43 +02:00
										 |  |  |     {"sdrangel.demod.localsink", "LocalSinkSettings"}, | 
					
						
							|  |  |  |     {"sdrangel.channel.localsink", "LocalSinkSettings"}, // remap
 | 
					
						
							|  |  |  |     {"sdrangel.channel.localsource", "LocalSourceSettings"}, | 
					
						
							| 
									
										
										
										
											2021-02-26 20:47:24 +00:00
										 |  |  |     {"sdrangel.channel.packetdemod", "PacketDemodSettings"}, | 
					
						
							| 
									
										
										
										
											2021-07-09 12:06:23 +01:00
										 |  |  |     {"sdrangel.channel.pagerdemod", "PagerDemodSettings"}, | 
					
						
							| 
									
										
										
										
											2020-10-22 08:38:43 +02:00
										 |  |  |     {"sdrangel.channeltx.modpacket", "PacketModSettings"}, | 
					
						
							|  |  |  |     {"sdrangel.channeltx.mod802.15.4", "IEEE_802_15_4_ModSettings"}, | 
					
						
							| 
									
										
										
										
											2021-06-22 17:38:56 +01:00
										 |  |  |     {"sdrangel.channel.radioclock", "RadioClockSettings"}, | 
					
						
							| 
									
										
										
										
											2022-03-01 17:17:56 +00:00
										 |  |  |     {"sdrangel.channel.radiosondedemod", "RadiosondeDemodSettings"}, | 
					
						
							| 
									
										
										
										
											2020-10-22 08:38:43 +02:00
										 |  |  |     {"sdrangel.demod.remotesink", "RemoteSinkSettings"}, | 
					
						
							| 
									
										
										
										
											2022-07-19 10:10:20 +01:00
										 |  |  |     {"sdrangel.demod.remotetcpsink", "RemoteTCPSinkSettings"}, | 
					
						
							| 
									
										
										
										
											2020-10-22 08:38:43 +02:00
										 |  |  |     {"sdrangel.channeltx.remotesource", "RemoteSourceSettings"}, | 
					
						
							|  |  |  |     {"sdrangel.channeltx.modssb", "SSBModSettings"}, | 
					
						
							|  |  |  |     {"sdrangel.channel.ssbdemod", "SSBDemodSettings"}, | 
					
						
							|  |  |  |     {"de.maintech.sdrangelove.channel.ssb", "SSBDemodSettings"}, // remap
 | 
					
						
							| 
									
										
										
										
											2021-10-12 11:31:14 +01:00
										 |  |  |     {"sdrangel.channel.radioastronomy", "RadioAstronomySettings"}, | 
					
						
							| 
									
										
										
										
											2020-10-22 08:38:43 +02:00
										 |  |  |     {"sdrangel.channeltx.udpsource", "UDPSourceSettings"}, | 
					
						
							| 
									
										
										
										
											2020-11-18 21:23:04 +01:00
										 |  |  |     {"sdrangel.channeltx.udpsink", "UDPSinkSettings"}, // remap
 | 
					
						
							| 
									
										
										
										
											2020-10-22 08:38:43 +02:00
										 |  |  |     {"sdrangel.channel.udpsink", "UDPSinkSettings"}, | 
					
						
							| 
									
										
										
										
											2020-11-18 21:23:04 +01:00
										 |  |  |     {"sdrangel.channel.udpsrc", "UDPSourceSettings"}, // remap
 | 
					
						
							| 
									
										
										
										
											2022-05-01 11:25:15 +02:00
										 |  |  |     {"sdrangel.channel.vordemodmc", "VORDemodMCSettings"}, | 
					
						
							| 
									
										
										
										
											2020-11-24 12:31:16 +00:00
										 |  |  |     {"sdrangel.channel.vordemod", "VORDemodSettings"}, | 
					
						
							| 
									
										
										
										
											2020-10-22 08:38:43 +02:00
										 |  |  |     {"sdrangel.channel.wfmdemod", "WFMDemodSettings"}, | 
					
						
							|  |  |  |     {"de.maintech.sdrangelove.channel.wfm", "WFMDemodSettings"}, // remap
 | 
					
						
							|  |  |  |     {"sdrangel.channeltx.modwfm", "WFMModSettings"}, | 
					
						
							|  |  |  |     {"sdrangel.channel.beamsteeringcwmod", "BeamSteeringCWModSettings"}, | 
					
						
							|  |  |  |     {"sdrangel.channelmimo.interferometer", "InterferometerSettings"}, | 
					
						
							|  |  |  |     {"sdrangel.channel.sigmffilesink", "SigMFFileSinkSettings"} | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const QMap<QString, QString> WebAPIUtils::m_deviceIdToSettingsKey = { | 
					
						
							|  |  |  |     {"sdrangel.samplesource.airspy", "airspySettings"}, | 
					
						
							|  |  |  |     {"sdrangel.samplesource.airspyhf", "airspyHFSettings"}, | 
					
						
							| 
									
										
										
										
											2020-11-21 11:15:06 +01:00
										 |  |  |     {"sdrangel.samplesource.audioinput", "audioInputSettings"}, | 
					
						
							|  |  |  |     {"sdrangel.samplesink.audiooutput", "audioOutputSettings"}, | 
					
						
							| 
									
										
										
										
											2020-10-22 08:38:43 +02:00
										 |  |  |     {"sdrangel.samplesource.bladerf1input", "bladeRF1InputSettings"}, | 
					
						
							|  |  |  |     {"sdrangel.samplesource.bladerf", "bladeRF1InputSettings"}, // remap
 | 
					
						
							|  |  |  |     {"sdrangel.samplesink.bladerf1output", "bladeRF1OutputSettings"}, | 
					
						
							|  |  |  |     {"sdrangel.samplesource.bladerf1output", "bladeRF1OutputSettings"}, // remap
 | 
					
						
							|  |  |  |     {"sdrangel.samplesource.bladerfoutput", "bladeRF1OutputSettings"}, // remap
 | 
					
						
							|  |  |  |     {"sdrangel.samplesource.bladerf2input", "bladeRF2InputSettings"}, | 
					
						
							|  |  |  |     {"sdrangel.samplesink.bladerf2output", "bladeRF2OutputSettings"}, | 
					
						
							|  |  |  |     {"sdrangel.samplesource.bladerf2output", "bladeRF2OutputSettings"}, // remap
 | 
					
						
							|  |  |  |     {"sdrangel.samplemimo.bladerf2mimo", "bladeRF2MIMOSettings"}, | 
					
						
							|  |  |  |     {"sdrangel.samplesource.fcdpro", "fcdProSettings"}, | 
					
						
							|  |  |  |     {"sdrangel.samplesource.fcdproplus", "fcdProPlusSettings"}, | 
					
						
							|  |  |  |     {"sdrangel.samplesource.fileinput", "fileInputSettings"}, | 
					
						
							|  |  |  |     {"sdrangel.samplesource.filesource", "fileInputSettings"}, // remap
 | 
					
						
							|  |  |  |     {"sdrangel.samplesource.hackrf", "hackRFInputSettings"}, | 
					
						
							|  |  |  |     {"sdrangel.samplesink.hackrf", "hackRFOutputSettings"}, | 
					
						
							|  |  |  |     {"sdrangel.samplesource.hackrfoutput", "hackRFOutputSettings"}, // remap
 | 
					
						
							|  |  |  |     {"sdrangel.samplesource.kiwisdrsource", "kiwiSDRSettings"}, | 
					
						
							|  |  |  |     {"sdrangel.samplesource.limesdr", "limeSdrInputSettings"}, | 
					
						
							|  |  |  |     {"sdrangel.samplesink.limesdr", "limeSdrOutputSettings"}, | 
					
						
							|  |  |  |     {"sdrangel.samplesource.localinput", "localInputSettings"}, | 
					
						
							|  |  |  |     {"sdrangel.samplesink.localoutput", "localOutputSettings"}, | 
					
						
							|  |  |  |     {"sdrangel.samplesource.localoutput", "localOutputSettings"}, // remap
 | 
					
						
							|  |  |  |     {"sdrangel.samplemimo.metismiso", "metisMISOSettings"}, | 
					
						
							|  |  |  |     {"sdrangel.samplesource.perseus", "perseusSettings"}, | 
					
						
							|  |  |  |     {"sdrangel.samplesource.plutosdr", "plutoSdrInputSettings"}, | 
					
						
							|  |  |  |     {"sdrangel.samplesink.plutosdr", "plutoSdrOutputSettings"}, | 
					
						
							|  |  |  |     {"sdrangel.samplesource.rtlsdr", "rtlSdrSettings"}, | 
					
						
							|  |  |  |     {"sdrangel.samplesource.remoteinput", "remoteInputSettings"}, | 
					
						
							| 
									
										
										
										
											2022-07-19 10:10:20 +01:00
										 |  |  |     {"sdrangel.samplesource.remotetcpinput", "remoteTCPInputSettings"}, | 
					
						
							| 
									
										
										
										
											2020-10-22 08:38:43 +02:00
										 |  |  |     {"sdrangel.samplesink.remoteoutput", "remoteOutputSettings"}, | 
					
						
							|  |  |  |     {"sdrangel.samplesource.sdrplay", "sdrPlaySettings"}, | 
					
						
							| 
									
										
										
										
											2021-04-11 21:21:36 +01:00
										 |  |  |     {"sdrangel.samplesource.sdrplayv3", "sdrPlayV3Settings"}, | 
					
						
							| 
									
										
										
										
											2020-10-22 08:38:43 +02:00
										 |  |  |     {"sdrangel.samplesource.sigmffileinput", "sigMFFileInputSettings"}, | 
					
						
							|  |  |  |     {"sdrangel.samplesource.soapysdrinput", "soapySDRInputSettings"}, | 
					
						
							|  |  |  |     {"sdrangel.samplesink.soapysdroutput", "soapySDROutputSettings"}, | 
					
						
							|  |  |  |     {"sdrangel.samplesource.testsource", "testSourceSettings"}, | 
					
						
							|  |  |  |     {"sdrangel.samplemimo.testmi", "testMISettings"}, | 
					
						
							|  |  |  |     {"sdrangel.samplemimo.testmosync", "testMOSyncSettings"}, | 
					
						
							|  |  |  |     {"sdrangel.samplesource.usrp", "usrpInputSettings"}, | 
					
						
							|  |  |  |     {"sdrangel.samplesink.usrp", "usrpOutputSettings"}, | 
					
						
							|  |  |  |     {"sdrangel.samplesource.xtrx", "xtrxInputSettings"}, | 
					
						
							| 
									
										
										
										
											2020-11-11 03:49:53 +01:00
										 |  |  |     {"sdrangel.samplesink.xtrx", "xtrxOutputSettings"}, | 
					
						
							|  |  |  |     {"sdrangel.samplemimo.xtrxmimo", "xtrxMIMOSettings"} | 
					
						
							| 
									
										
										
										
											2020-10-22 08:38:43 +02:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const QMap<QString, QString> WebAPIUtils::m_channelTypeToSettingsKey = { | 
					
						
							| 
									
										
										
										
											2020-11-24 12:31:16 +00:00
										 |  |  |     {"ADSBDemod", "ADSBDemodSettings"}, | 
					
						
							| 
									
										
										
										
											2021-05-07 21:50:27 +01:00
										 |  |  |     {"AISDemod", "AISDemodSettings"}, | 
					
						
							|  |  |  |     {"AISMod", "AISModSettings"}, | 
					
						
							| 
									
										
										
										
											2021-09-02 05:51:47 +02:00
										 |  |  |     {"APTDemod", "APTDemodSettings"}, | 
					
						
							| 
									
										
										
										
											2020-10-22 08:38:43 +02:00
										 |  |  |     {"AMDemod", "AMDemodSettings"}, | 
					
						
							|  |  |  |     {"AMMod", "AMModSettings"}, | 
					
						
							|  |  |  |     {"ATVDemod", "ATVDemodSettings"}, | 
					
						
							|  |  |  |     {"ATVMod", "ATVModSettings"}, | 
					
						
							|  |  |  |     {"BFMDemod", "BFMDemodSettings"}, | 
					
						
							|  |  |  |     {"ChannelAnalyzer", "ChannelAnalyzerSettings"}, | 
					
						
							|  |  |  |     {"ChirpChatDemod", "ChirpChatDemodSettings"}, | 
					
						
							|  |  |  |     {"ChirpChatMod", "ChirpChatModSettings"}, | 
					
						
							|  |  |  |     {"DATVDemod", "DATVDemodSettings"}, | 
					
						
							| 
									
										
										
										
											2021-03-18 17:17:58 +00:00
										 |  |  |     {"DATVMod", "DATVModSettings"}, | 
					
						
							| 
									
										
										
										
											2021-04-16 22:56:15 +01:00
										 |  |  |     {"DABDemod", "DABDemodSettings"}, | 
					
						
							| 
									
										
										
										
											2022-05-27 00:50:38 +02:00
										 |  |  |     {"DOA2", "DOA2Settings"}, | 
					
						
							| 
									
										
										
										
											2020-10-22 08:38:43 +02:00
										 |  |  |     {"DSDDemod", "DSDDemodSettings"}, | 
					
						
							|  |  |  |     {"FileSink", "FileSinkSettings"}, | 
					
						
							|  |  |  |     {"FileSource", "FileSourceSettings"}, | 
					
						
							|  |  |  |     {"FreeDVDemod", "FreeDVDemodSettings"}, | 
					
						
							|  |  |  |     {"FreeDVMod", "FreeDVModSettings"}, | 
					
						
							|  |  |  |     {"FreqTracker", "FreqTrackerSettings"}, | 
					
						
							|  |  |  |     {"IEEE_802_15_4_Mod", "IEEE_802_15_4_ModSettings"}, | 
					
						
							| 
									
										
										
										
											2022-06-05 00:54:59 +02:00
										 |  |  |     {"M17Demod", "M17DemodSettings"}, | 
					
						
							| 
									
										
										
										
											2022-06-10 01:42:24 +02:00
										 |  |  |     {"M17Mod", "M17ModSettings"}, | 
					
						
							| 
									
										
										
										
											2020-10-22 08:38:43 +02:00
										 |  |  |     {"NFMDemod", "NFMDemodSettings"}, | 
					
						
							|  |  |  |     {"NFMMod", "NFMModSettings"}, | 
					
						
							| 
									
										
										
										
											2021-06-09 16:17:59 +01:00
										 |  |  |     {"NoiseFigure", "NoiseFigureSettings"}, | 
					
						
							| 
									
										
										
										
											2021-01-13 20:56:45 +00:00
										 |  |  |     {"PacketDemod", "PacketDemodSettings"}, | 
					
						
							| 
									
										
										
										
											2020-10-22 08:38:43 +02:00
										 |  |  |     {"PacketMod", "PacketModSettings"}, | 
					
						
							| 
									
										
										
										
											2021-07-09 12:06:23 +01:00
										 |  |  |     {"PagerDemod", "PagerDemodSettings"}, | 
					
						
							| 
									
										
										
										
											2020-10-22 08:38:43 +02:00
										 |  |  |     {"LocalSink", "LocalSinkSettings"}, | 
					
						
							|  |  |  |     {"LocalSource", "LocalSourceSettings"}, | 
					
						
							| 
									
										
										
										
											2021-10-12 11:31:14 +01:00
										 |  |  |     {"RadioAstronomy", "RadioAstronomySettings"}, | 
					
						
							| 
									
										
										
										
											2021-06-22 17:38:56 +01:00
										 |  |  |     {"RadioClock", "RadioClockSettings"}, | 
					
						
							| 
									
										
										
										
											2022-03-01 17:17:56 +00:00
										 |  |  |     {"RadiosondeDemod", "RadiosondeDemodSettings"}, | 
					
						
							| 
									
										
										
										
											2020-10-22 08:38:43 +02:00
										 |  |  |     {"RemoteSink", "RemoteSinkSettings"}, | 
					
						
							|  |  |  |     {"RemoteSource", "RemoteSourceSettings"}, | 
					
						
							| 
									
										
										
										
											2022-07-19 10:10:20 +01:00
										 |  |  |     {"RemoteTCPSink", "RemoteTCPSinkSettings"}, | 
					
						
							| 
									
										
										
										
											2020-10-22 08:38:43 +02:00
										 |  |  |     {"SSBMod", "SSBModSettings"}, | 
					
						
							|  |  |  |     {"SSBDemod", "SSBDemodSettings"}, | 
					
						
							| 
									
										
										
										
											2020-11-18 21:23:04 +01:00
										 |  |  |     {"UDPSink", "UDPSinkSettings"}, | 
					
						
							|  |  |  |     {"UDPSource", "UDPSourceSettings"}, | 
					
						
							| 
									
										
										
										
											2022-05-01 11:25:15 +02:00
										 |  |  |     {"VORDemodMC", "VORDemodMCSettings"}, | 
					
						
							| 
									
										
										
										
											2020-11-24 12:31:16 +00:00
										 |  |  |     {"VORDemod", "VORDemodSettings"}, | 
					
						
							| 
									
										
										
										
											2020-10-22 08:38:43 +02:00
										 |  |  |     {"WFMDemod", "WFMDemodSettings"}, | 
					
						
							|  |  |  |     {"WFMMod", "WFMModSettings"}, | 
					
						
							|  |  |  |     {"BeamSteeringCWMod", "BeamSteeringCWModSettings"}, | 
					
						
							|  |  |  |     {"Interferometer", "InterferometerSettings"}, | 
					
						
							|  |  |  |     {"SigMFFileSink", "SigMFFileSinkSettings"} | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const QMap<QString, QString> WebAPIUtils::m_channelTypeToActionsKey = { | 
					
						
							| 
									
										
										
										
											2021-05-07 21:50:27 +01:00
										 |  |  |     {"AISMod", "AISModActions"}, | 
					
						
							| 
									
										
										
										
											2021-02-26 20:47:24 +00:00
										 |  |  |     {"APTDemod", "APTDemodActions"}, | 
					
						
							| 
									
										
										
										
											2020-10-22 08:38:43 +02:00
										 |  |  |     {"FileSink", "FileSinkActions"}, | 
					
						
							|  |  |  |     {"FileSource", "FileSourceActions"}, | 
					
						
							|  |  |  |     {"SigMFFileSink", "SigMFFileSinkActions"}, | 
					
						
							|  |  |  |     {"IEEE_802_15_4_Mod", "IEEE_802_15_4_ModActions"}, | 
					
						
							| 
									
										
										
										
											2021-10-12 11:31:14 +01:00
										 |  |  |     {"RadioAstronomy", "RadioAstronomyActions"}, | 
					
						
							| 
									
										
										
										
											2020-10-22 08:38:43 +02:00
										 |  |  |     {"PacketMod", "PacketModActions"} | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const QMap<QString, QString> WebAPIUtils::m_sourceDeviceHwIdToSettingsKey = { | 
					
						
							|  |  |  |     {"Airspy", "airspySettings"}, | 
					
						
							|  |  |  |     {"AirspyHF", "airspyHFSettings"}, | 
					
						
							| 
									
										
										
										
											2020-11-09 21:12:08 +00:00
										 |  |  |     {"AudioInput", "audioInputSettings"}, | 
					
						
							| 
									
										
										
										
											2020-10-22 08:38:43 +02:00
										 |  |  |     {"BladeRF1", "bladeRF1InputSettings"}, | 
					
						
							|  |  |  |     {"BladeRF2", "bladeRF2InputSettings"}, | 
					
						
							|  |  |  |     {"FCDPro", "fcdProSettings"}, | 
					
						
							|  |  |  |     {"FCDPro+", "fcdProPlusSettings"}, | 
					
						
							|  |  |  |     {"FileInput", "fileInputSettings"}, | 
					
						
							|  |  |  |     {"HackRF", "hackRFInputSettings"}, | 
					
						
							|  |  |  |     {"KiwiSDR", "kiwiSDRSettings"}, | 
					
						
							|  |  |  |     {"LimeSDR", "limeSdrInputSettings"}, | 
					
						
							|  |  |  |     {"LocalInput", "localInputSettings"}, | 
					
						
							|  |  |  |     {"Perseus", "perseusSettings"}, | 
					
						
							|  |  |  |     {"PlutoSDR", "plutoSdrInputSettings"}, | 
					
						
							|  |  |  |     {"RTLSDR", "rtlSdrSettings"}, | 
					
						
							|  |  |  |     {"RemoteInput", "remoteInputSettings"}, | 
					
						
							| 
									
										
										
										
											2022-07-19 10:10:20 +01:00
										 |  |  |     {"RemoteTCPInput", "remoteTCPInputSettings"}, | 
					
						
							| 
									
										
										
										
											2020-10-22 08:38:43 +02:00
										 |  |  |     {"SDRplay1", "sdrPlaySettings"}, | 
					
						
							| 
									
										
										
										
											2021-08-25 15:03:30 +02:00
										 |  |  |     {"SDRplayV3", "sdrPlayV3Settings"}, | 
					
						
							| 
									
										
										
										
											2020-10-22 08:38:43 +02:00
										 |  |  |     {"SigMFFileInput", "sigMFFileInputSettings"}, | 
					
						
							|  |  |  |     {"SoapySDR", "soapySDRInputSettings"}, | 
					
						
							|  |  |  |     {"TestSource", "testSourceSettings"}, | 
					
						
							|  |  |  |     {"USRP", "usrpInputSettings"}, | 
					
						
							|  |  |  |     {"XTRX", "xtrxInputSettings"} | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const QMap<QString, QString> WebAPIUtils::m_sourceDeviceHwIdToActionsKey = { | 
					
						
							|  |  |  |     {"Airspy", "airspyActions"}, | 
					
						
							|  |  |  |     {"AirspyHF", "airspyHFActions"}, | 
					
						
							| 
									
										
										
										
											2020-11-09 21:12:08 +00:00
										 |  |  |     {"AudioInput", "audioInputActions"}, | 
					
						
							| 
									
										
										
										
											2020-10-22 08:38:43 +02:00
										 |  |  |     {"BladeRF1", "bladeRF1InputActions"}, | 
					
						
							|  |  |  |     {"FCDPro", "fcdProActions"}, | 
					
						
							|  |  |  |     {"FCDPro+", "fcdProPlusActions"}, | 
					
						
							|  |  |  |     {"HackRF", "hackRFInputActions"}, | 
					
						
							|  |  |  |     {"KiwiSDR", "kiwiSDRActions"}, | 
					
						
							|  |  |  |     {"LimeSDR", "limeSdrInputActions"}, | 
					
						
							|  |  |  |     {"LocalInput", "localInputActions"}, | 
					
						
							|  |  |  |     {"Perseus", "perseusActions"}, | 
					
						
							|  |  |  |     {"PlutoSDR", "plutoSdrInputActions"}, | 
					
						
							|  |  |  |     {"RemoteInput", "remoteInputActions"}, | 
					
						
							|  |  |  |     {"RTLSDR", "rtlSdrActions"}, | 
					
						
							|  |  |  |     {"SDRplay1", "sdrPlayActions"}, | 
					
						
							| 
									
										
										
										
											2021-08-25 15:03:30 +02:00
										 |  |  |     {"SDRplayV3", "sdrPlayV3Actions"}, | 
					
						
							| 
									
										
										
										
											2020-10-22 08:38:43 +02:00
										 |  |  |     {"SigMFFileInput", "sigMFFileActions"}, | 
					
						
							|  |  |  |     {"SoapySDR", "soapySDRInputActions"}, | 
					
						
							|  |  |  |     {"TestSource", "testSourceActions"}, | 
					
						
							|  |  |  |     {"USRP", "usrpSourceActions"}, | 
					
						
							|  |  |  |     {"XTRX", "xtrxInputActions"} | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const QMap<QString, QString> WebAPIUtils::m_sinkDeviceHwIdToSettingsKey = { | 
					
						
							| 
									
										
										
										
											2021-04-08 06:47:33 +02:00
										 |  |  |     {"AudioOutput", "audioOutputSettings"}, | 
					
						
							| 
									
										
										
										
											2020-10-22 08:38:43 +02:00
										 |  |  |     {"BladeRF1", "bladeRF1OutputSettings"}, | 
					
						
							|  |  |  |     {"BladeRF2", "bladeRF2OutputSettings"}, | 
					
						
							| 
									
										
										
										
											2021-05-18 01:52:25 +02:00
										 |  |  |     {"FileOutput", "fileOutputSettings"}, | 
					
						
							| 
									
										
										
										
											2020-10-22 08:38:43 +02:00
										 |  |  |     {"HackRF", "hackRFOutputSettings"}, | 
					
						
							|  |  |  |     {"LimeSDR", "limeSdrOutputSettings"}, | 
					
						
							|  |  |  |     {"LocalOutput", "localOutputSettings"}, | 
					
						
							|  |  |  |     {"PlutoSDR", "plutoSdrOutputSettings"}, | 
					
						
							|  |  |  |     {"RemoteOutput", "remoteOutputSettings"}, | 
					
						
							|  |  |  |     {"SoapySDR", "soapySDROutputSettings"}, | 
					
						
							|  |  |  |     {"USRP", "usrpOutputSettings"}, | 
					
						
							|  |  |  |     {"XTRX", "xtrxOutputSettings"} | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const QMap<QString, QString> WebAPIUtils::m_sinkDeviceHwIdToActionsKey = { | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const QMap<QString, QString> WebAPIUtils::m_mimoDeviceHwIdToSettingsKey = { | 
					
						
							|  |  |  |     {"BladeRF2", "bladeRF2MIMOSettings"}, | 
					
						
							|  |  |  |     {"MetisMISO", "metisMISOSettings"}, | 
					
						
							|  |  |  |     {"TestMI", "testMISettings"}, | 
					
						
							| 
									
										
										
										
											2020-11-11 03:49:53 +01:00
										 |  |  |     {"TestMOSync", "testMOSyncSettings"}, | 
					
						
							|  |  |  |     {"XTRX", "xtrxMIMOSettings"} | 
					
						
							| 
									
										
										
										
											2020-10-22 08:38:43 +02:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const QMap<QString, QString> WebAPIUtils::m_mimoDeviceHwIdToActionsKey = { | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const QMap<QString, QString> WebAPIUtils::m_featureTypeToSettingsKey = { | 
					
						
							| 
									
										
										
										
											2022-01-11 23:22:24 +01:00
										 |  |  |     {"AFC", "AFCSettings"}, | 
					
						
							| 
									
										
										
										
											2021-05-07 21:50:27 +01:00
										 |  |  |     {"AIS", "AISSettings"}, | 
					
						
							| 
									
										
										
										
											2022-05-24 22:51:29 +02:00
										 |  |  |     {"AMBE", "AMBESettings"}, | 
					
						
							| 
									
										
										
										
											2021-05-20 17:15:14 +01:00
										 |  |  |     {"AntennaTools", "AntennaToolsSettings"}, | 
					
						
							| 
									
										
										
										
											2021-01-13 20:56:45 +00:00
										 |  |  |     {"APRS", "APRSSettings"}, | 
					
						
							| 
									
										
										
										
											2021-12-01 00:20:14 +01:00
										 |  |  |     {"DemodAnalyzer", "DemodAnalyzerSettings"}, | 
					
						
							| 
									
										
										
										
											2022-01-06 22:47:41 +01:00
										 |  |  |     {"JogdialController", "JogdialControllerSettings"}, | 
					
						
							| 
									
										
										
										
											2022-01-11 23:22:24 +01:00
										 |  |  |     {"GS232Controller", "GS232ControllerSettings"}, // a.k.a Rotator Controller
 | 
					
						
							| 
									
										
										
										
											2022-05-22 11:59:02 +02:00
										 |  |  |     {"LimeRFE", "LimeRFESettings"}, | 
					
						
							| 
									
										
										
										
											2021-01-13 20:56:45 +00:00
										 |  |  |     {"Map", "MapSettings"}, | 
					
						
							| 
									
										
										
										
											2021-04-07 20:25:12 +01:00
										 |  |  |     {"PERTester", "PERTesterSettings"}, | 
					
						
							| 
									
										
										
										
											2022-03-01 17:17:56 +00:00
										 |  |  |     {"Radiosonde", "RadiosondeSettings"}, | 
					
						
							| 
									
										
										
										
											2022-01-11 23:22:24 +01:00
										 |  |  |     {"RigCtlServer", "RigCtlServerSettings"}, | 
					
						
							| 
									
										
										
										
											2021-07-02 15:37:11 +01:00
										 |  |  |     {"SatelliteTracker", "SatelliteTrackerSettings"}, | 
					
						
							| 
									
										
										
										
											2020-10-22 08:38:43 +02:00
										 |  |  |     {"SimplePTT", "SimplePTTSettings"}, | 
					
						
							| 
									
										
										
										
											2021-01-13 20:56:45 +00:00
										 |  |  |     {"StarTracker", "StarTrackerSettings"}, | 
					
						
							| 
									
										
										
										
											2022-01-11 23:22:24 +01:00
										 |  |  |     {"VORLocalizer", "VORLocalizerSettings"} | 
					
						
							| 
									
										
										
										
											2020-10-22 08:38:43 +02:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const QMap<QString, QString> WebAPIUtils::m_featureTypeToActionsKey = { | 
					
						
							| 
									
										
										
										
											2021-10-22 02:01:33 +02:00
										 |  |  |     {"AFC", "AFCActions"}, | 
					
						
							| 
									
										
										
										
											2022-05-24 22:51:29 +02:00
										 |  |  |     {"AMBE", "AMBEActions"}, | 
					
						
							| 
									
										
										
										
											2021-10-22 02:01:33 +02:00
										 |  |  |     {"GS232Controller", "GS232ControllerActions"}, | 
					
						
							| 
									
										
										
										
											2022-05-22 11:59:02 +02:00
										 |  |  |     {"LimeRFE", "LimeRFEActions"}, | 
					
						
							| 
									
										
										
										
											2021-01-13 20:56:45 +00:00
										 |  |  |     {"Map", "MapActions"}, | 
					
						
							| 
									
										
										
										
											2021-10-22 02:01:33 +02:00
										 |  |  |     {"PERTester", "PERTesterActions"}, | 
					
						
							|  |  |  |     {"RigCtlServer", "RigCtlServerActions"}, | 
					
						
							|  |  |  |     {"SatelliteTracker", "SatelliteTrackerActions"}, | 
					
						
							|  |  |  |     {"SimplePTT", "SimplePTTActions"}, | 
					
						
							|  |  |  |     {"StarTracker", "StarTrackerActions"}, | 
					
						
							|  |  |  |     {"VORLocalizer", "VORLocalizerActions"} | 
					
						
							| 
									
										
										
										
											2020-10-22 08:38:43 +02:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const QMap<QString, QString> WebAPIUtils::m_featureURIToSettingsKey = { | 
					
						
							| 
									
										
										
										
											2022-01-11 23:22:24 +01:00
										 |  |  |     {"sdrangel.feature.afc", "AFCSettings"}, | 
					
						
							| 
									
										
										
										
											2021-05-07 21:50:27 +01:00
										 |  |  |     {"sdrangel.feature.ais", "AISSSettings"}, | 
					
						
							| 
									
										
										
										
											2022-05-24 22:51:29 +02:00
										 |  |  |     {"sdrangel.feature.ambe", "AMBESSettings"}, | 
					
						
							| 
									
										
										
										
											2021-05-20 17:15:14 +01:00
										 |  |  |     {"sdrangel.feature.antennatools", "AntennaToolsSettings"}, | 
					
						
							| 
									
										
										
										
											2021-01-13 20:56:45 +00:00
										 |  |  |     {"sdrangel.feature.aprs", "APRSSettings"}, | 
					
						
							| 
									
										
										
										
											2021-12-01 00:20:14 +01:00
										 |  |  |     {"sdrangel.feature.demodanalyzer", "DemodAnalyzerSettings"}, | 
					
						
							| 
									
										
										
										
											2022-01-06 22:47:41 +01:00
										 |  |  |     {"sdrangel.feature.jogdialcontroller", "JogdialControllerSettings"}, | 
					
						
							| 
									
										
										
										
											2021-01-13 20:56:45 +00:00
										 |  |  |     {"sdrangel.feature.gs232controller", "GS232ControllerSettings"}, | 
					
						
							| 
									
										
										
										
											2022-05-22 11:59:02 +02:00
										 |  |  |     {"sdrangel.feature.limerfe", "LimeRFESettings"}, | 
					
						
							| 
									
										
										
										
											2021-01-13 20:56:45 +00:00
										 |  |  |     {"sdrangel.feature.map", "MapSettings"}, | 
					
						
							| 
									
										
										
										
											2021-04-07 20:25:12 +01:00
										 |  |  |     {"sdrangel.feature.pertester", "PERTesterSettings"}, | 
					
						
							| 
									
										
										
										
											2022-03-01 17:17:56 +00:00
										 |  |  |     {"sdrangel.feature.radiosonde", "RadiosondeSettings"}, | 
					
						
							| 
									
										
										
										
											2022-01-11 23:22:24 +01:00
										 |  |  |     {"sdrangel.feature.rigctlserver", "RigCtlServerSettings"}, | 
					
						
							| 
									
										
										
										
											2021-07-02 15:37:11 +01:00
										 |  |  |     {"sdrangel.feature.satellitetracker", "SatelliteTrackerSettings"}, | 
					
						
							| 
									
										
										
										
											2020-10-22 08:38:43 +02:00
										 |  |  |     {"sdrangel.feature.simpleptt", "SimplePTTSettings"}, | 
					
						
							| 
									
										
										
										
											2021-01-13 20:56:45 +00:00
										 |  |  |     {"sdrangel.feature.startracker", "StarTrackerSettings"}, | 
					
						
							| 
									
										
										
										
											2022-01-11 23:22:24 +01:00
										 |  |  |     {"sdrangel.feature.vorlocalizer", "VORLocalizerSettings"} | 
					
						
							| 
									
										
										
										
											2020-10-22 08:38:43 +02:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-28 00:18:30 +02:00
										 |  |  | // Get integer value from within JSON object
 | 
					
						
							|  |  |  | bool WebAPIUtils::getObjectInt(const QJsonObject &json, const QString &key, int &value) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (json.contains(key)) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         value = json[key].toInt(); | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Get string value from within JSON object
 | 
					
						
							|  |  |  | bool WebAPIUtils::getObjectString(const QJsonObject &json, const QString &key, QString &value) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (json.contains(key)) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         value = json[key].toString(); | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Get a list of JSON objects from within JSON object
 | 
					
						
							|  |  |  | bool WebAPIUtils::getObjectObjects(const QJsonObject &json, const QString &key, QList<QJsonObject> &objects) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     bool processed = false; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (json.contains(key)) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (json[key].isArray()) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             QJsonArray a = json[key].toArray(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             for (QJsonArray::const_iterator  it = a.begin(); it != a.end(); it++) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 if (it->isObject()) | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     objects.push_back(it->toObject()); | 
					
						
							|  |  |  |                     processed = true; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return processed; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Get double value from within nested JSON object
 | 
					
						
							|  |  |  | bool WebAPIUtils::getSubObjectDouble(const QJsonObject &json, const QString &key, double &value) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     for (QJsonObject::const_iterator  it = json.begin(); it != json.end(); it++) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         QJsonValue jsonValue = it.value(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (jsonValue.isObject()) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             QJsonObject subObject = jsonValue.toObject(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (subObject.contains(key)) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 value = subObject[key].toDouble(); | 
					
						
							|  |  |  |                 return true; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Set double value withing nested JSON object
 | 
					
						
							|  |  |  | bool WebAPIUtils::setSubObjectDouble(QJsonObject &json, const QString &key, double value) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     for (QJsonObject::iterator  it = json.begin(); it != json.end(); it++) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         QJsonValue jsonValue = it.value(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (jsonValue.isObject()) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             QJsonObject subObject = jsonValue.toObject(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (subObject.contains(key)) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 subObject[key] = value; | 
					
						
							|  |  |  |                 it.value() = subObject; | 
					
						
							|  |  |  |                 return true; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return false; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2020-10-22 08:38:43 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-07 19:32:43 +01:00
										 |  |  | // Get integer value from within nested JSON object
 | 
					
						
							|  |  |  | bool WebAPIUtils::getSubObjectInt(const QJsonObject &json, const QString &key, int &value) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     for (QJsonObject::const_iterator  it = json.begin(); it != json.end(); it++) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         QJsonValue jsonValue = it.value(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (jsonValue.isObject()) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             QJsonObject subObject = jsonValue.toObject(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (subObject.contains(key)) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 value = subObject[key].toInt(); | 
					
						
							|  |  |  |                 return true; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Set integer value withing nested JSON object
 | 
					
						
							|  |  |  | bool WebAPIUtils::setSubObjectInt(QJsonObject &json, const QString &key, int value) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     for (QJsonObject::iterator  it = json.begin(); it != json.end(); it++) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         QJsonValue jsonValue = it.value(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (jsonValue.isObject()) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             QJsonObject subObject = jsonValue.toObject(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (subObject.contains(key)) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 subObject[key] = value; | 
					
						
							|  |  |  |                 it.value() = subObject; | 
					
						
							|  |  |  |                 return true; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-12 11:31:14 +01:00
										 |  |  | // Get string value from within nested JSON object
 | 
					
						
							|  |  |  | bool WebAPIUtils::getSubObjectString(const QJsonObject &json, const QString &key, QString &value) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     for (QJsonObject::const_iterator  it = json.begin(); it != json.end(); it++) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         QJsonValue jsonValue = it.value(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (jsonValue.isObject()) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             QJsonObject subObject = jsonValue.toObject(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (subObject.contains(key)) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 value = subObject[key].toString(); | 
					
						
							|  |  |  |                 return true; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Set string value withing nested JSON object
 | 
					
						
							|  |  |  | bool WebAPIUtils::setSubObjectString(QJsonObject &json, const QString &key, const QString &value) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     for (QJsonObject::iterator  it = json.begin(); it != json.end(); it++) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         QJsonValue jsonValue = it.value(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (jsonValue.isObject()) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             QJsonObject subObject = jsonValue.toObject(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (subObject.contains(key)) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 subObject[key] = value; | 
					
						
							|  |  |  |                 it.value() = subObject; | 
					
						
							|  |  |  |                 return true; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-19 10:10:20 +01:00
										 |  |  | // Get string list from within nested JSON object
 | 
					
						
							|  |  |  | bool WebAPIUtils::getSubObjectIntList(const QJsonObject &json, const QString &key, const QString &subKey, QList<int> &values) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     for (QJsonObject::const_iterator  it = json.begin(); it != json.end(); it++) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         QJsonValue jsonValue = it.value(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (jsonValue.isObject()) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             QJsonObject subObject = jsonValue.toObject(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (subObject.contains(key)) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 QJsonValue value = subObject[key]; | 
					
						
							|  |  |  |                 if (value.isArray()) | 
					
						
							|  |  |  |                 {  | 
					
						
							|  |  |  |                     QJsonArray array = value.toArray(); | 
					
						
							|  |  |  |                     for (int i = 0; i < array.size(); i++) | 
					
						
							|  |  |  |                     { | 
					
						
							|  |  |  |                         QJsonObject element = array[i].toObject(); | 
					
						
							|  |  |  |                         if (element.contains(subKey)) { | 
					
						
							|  |  |  |                             values.append(element[subKey].toInt()); | 
					
						
							|  |  |  |                         } | 
					
						
							|  |  |  |                     }  | 
					
						
							|  |  |  |                     return true; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-22 08:38:43 +02:00
										 |  |  | // look for value in key=value
 | 
					
						
							|  |  |  | bool WebAPIUtils::extractValue(const QJsonObject &json, const QString &key, QJsonValue &value) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     // final
 | 
					
						
							|  |  |  |     if (json.contains(key)) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         value = json[key]; | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         for (QJsonObject::const_iterator  it = json.begin(); it != json.end(); it++) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             QJsonValue jsonValue = it.value(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (jsonValue.isObject()) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 if (extractValue(jsonValue.toObject(), key, value)) { | 
					
						
							|  |  |  |                     return true; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // look for [...] in key=[...]
 | 
					
						
							|  |  |  | bool WebAPIUtils::extractArray(const QJsonObject &json, const QString &key, QJsonArray &value) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     // final
 | 
					
						
							|  |  |  |     if (json.contains(key)) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (json[key].isArray()) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             value = json[key].toArray(); | 
					
						
							|  |  |  |             return true; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             return false; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         for (QJsonObject::const_iterator  it = json.begin(); it != json.end(); it++) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             QJsonValue jsonValue = it.value(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (jsonValue.isObject()) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 if (extractArray(jsonValue.toObject(), key, value)) { | 
					
						
							|  |  |  |                     return true; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // look for {...} in key={...}
 | 
					
						
							|  |  |  | bool WebAPIUtils::extractObject(const QJsonObject &json, const QString &key, QJsonObject &value) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     // final
 | 
					
						
							|  |  |  |     if (json.contains(key)) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (json[key].isObject()) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             value = json[key].toObject(); | 
					
						
							|  |  |  |             return true; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             return false; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         for (QJsonObject::const_iterator  it = json.begin(); it != json.end(); it++) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             QJsonValue jsonValue = it.value(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (jsonValue.isObject()) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 if (extractObject(jsonValue.toObject(), key, value)) { | 
					
						
							|  |  |  |                     return true; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // set value in key=value
 | 
					
						
							|  |  |  | bool WebAPIUtils::setValue(const QJsonObject &json, const QString &key, const QJsonValue &value) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     // final
 | 
					
						
							|  |  |  |     if (json.contains(key)) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         json[key] = value; | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         for (QJsonObject::const_iterator  it = json.begin(); it != json.end(); it++) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             QJsonValue jsonValue = it.value(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (jsonValue.isObject()) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 if (setValue(jsonValue.toObject(), key, value)) { | 
					
						
							|  |  |  |                     return true; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // set [...] in key=[...]
 | 
					
						
							|  |  |  | bool WebAPIUtils::setArray(const QJsonObject &json, const QString &key, const QJsonArray &value) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     // final
 | 
					
						
							|  |  |  |     if (json.contains(key)) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (json[key].isArray()) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             json[key] = value; | 
					
						
							|  |  |  |             return true; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             return false; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         for (QJsonObject::const_iterator  it = json.begin(); it != json.end(); it++) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             QJsonValue jsonValue = it.value(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (jsonValue.isObject()) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 if (setArray(jsonValue.toObject(), key, value)) { | 
					
						
							|  |  |  |                     return true; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // set {...} in key={...}
 | 
					
						
							|  |  |  | bool WebAPIUtils::setObject(const QJsonObject &json, const QString &key, const QJsonObject &value) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     // final
 | 
					
						
							|  |  |  |     if (json.contains(key)) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (json[key].isObject()) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             json[key] = value; | 
					
						
							|  |  |  |             return true; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             return false; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         for (QJsonObject::const_iterator  it = json.begin(); it != json.end(); it++) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             QJsonValue jsonValue = it.value(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (jsonValue.isObject()) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 if (setObject(jsonValue.toObject(), key, value)) { | 
					
						
							|  |  |  |                     return true; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return false; | 
					
						
							|  |  |  | } |