mirror of
				https://github.com/f4exb/sdrangel.git
				synced 2025-10-30 20:40:20 -04:00 
			
		
		
		
	Created SDRdaemon library
This commit is contained in:
		
							parent
							
								
									e073af634c
								
							
						
					
					
						commit
						411cb36a6f
					
				| @ -222,6 +222,7 @@ endif() | ||||
| add_subdirectory(sdrbase) | ||||
| add_subdirectory(sdrgui) | ||||
| add_subdirectory(sdrsrv) | ||||
| add_subdirectory(sdrdaemon) | ||||
| add_subdirectory(sdrbench) | ||||
| add_subdirectory(httpserver) | ||||
| add_subdirectory(logging) | ||||
|  | ||||
							
								
								
									
										55
									
								
								sdrdaemon/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								sdrdaemon/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,55 @@ | ||||
| project (sdrdaemon) | ||||
| 
 | ||||
| set(sdrdaemon_SOURCES | ||||
|     sdrdaemonmain.cpp | ||||
|     sdrdaemonpreferences.cpp | ||||
|     sdrdaemonsettings.cpp   | ||||
|     webapi/webapiadapterdaemon.cpp | ||||
|     webapi/webapirequestmapper.cpp | ||||
|     webapi/webapiserver.cpp | ||||
| ) | ||||
| 
 | ||||
| set(sdrdaemon_HEADERS | ||||
|     sdrdaemonmain.h | ||||
|     sdrdaemonpreferences.h | ||||
|     sdrdaemonsettings.h   | ||||
|     webapi/webapiadapterdaemon.h | ||||
|     webapi/webapirequestmapper.h | ||||
|     webapi/webapiserver.h | ||||
| ) | ||||
| 
 | ||||
| set(sdrdaemon_SOURCES | ||||
|     ${sdrdaemon_SOURCES} | ||||
|     ${sdrdaemon_HEADERS} | ||||
| ) | ||||
| 
 | ||||
| add_definitions(${QT_DEFINITIONS}) | ||||
| add_definitions(-DQT_SHARED) | ||||
| 
 | ||||
| add_library(sdrdaemon SHARED | ||||
|     ${sdrdaemon_SOURCES} | ||||
|     ${sdrdaemon_HEADERS_MOC} | ||||
| ) | ||||
| 
 | ||||
| include_directories( | ||||
|     . | ||||
|     ${CMAKE_SOURCE_DIR}/exports | ||||
|     ${CMAKE_SOURCE_DIR}/sdrbase | ||||
|     ${CMAKE_SOURCE_DIR}/logging | ||||
|     ${CMAKE_SOURCE_DIR}/httpserver | ||||
|     ${CMAKE_SOURCE_DIR}/swagger/sdrangel/code/qt5/client     | ||||
|     ${CMAKE_CURRENT_BINARY_DIR} | ||||
| ) | ||||
| 
 | ||||
| target_link_libraries(sdrdaemon | ||||
|     ${QT_LIBRARIES} | ||||
|     sdrbase | ||||
|     logging | ||||
| ) | ||||
| 
 | ||||
| target_compile_features(sdrdaemon PRIVATE cxx_generalized_initializers) # cmake >= 3.1.0 | ||||
| 
 | ||||
| target_link_libraries(sdrdaemon Qt5::Core Qt5::Multimedia) | ||||
| 
 | ||||
| install(TARGETS sdrdaemon DESTINATION lib) | ||||
| 
 | ||||
							
								
								
									
										162
									
								
								sdrdaemon/sdrdaemonmain.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										162
									
								
								sdrdaemon/sdrdaemonmain.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,162 @@ | ||||
| ///////////////////////////////////////////////////////////////////////////////////
 | ||||
| // Copyright (C) 2018 Edouard Griffiths, F4EXB.                                  //
 | ||||
| //                                                                               //
 | ||||
| // SDRdaemon instance                                                            //
 | ||||
| //                                                                               //
 | ||||
| // SDRdaemon is a detached SDR front end that handles the interface with a       //
 | ||||
| // physical device and sends or receives the I/Q samples stream to or from a     //
 | ||||
| // SDRangel instance via UDP. It is controlled via a Web REST API.               //
 | ||||
| //                                                                               //
 | ||||
| // 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                  //
 | ||||
| //                                                                               //
 | ||||
| // 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 <QSysInfo> | ||||
| #include <QResource> | ||||
| #include <unistd.h> | ||||
| 
 | ||||
| #include "dsp/dspengine.h" | ||||
| #include "dsp/dspdevicesourceengine.h" | ||||
| #include "plugin/pluginmanager.h" | ||||
| #include "util/message.h" | ||||
| #include "loggerwithfile.h" | ||||
| #include "sdrdaemonmain.h" | ||||
| 
 | ||||
| #include "webapi/webapiadapterdaemon.h" | ||||
| #include "webapi/webapirequestmapper.h" | ||||
| #include "webapi/webapiserver.h" | ||||
| 
 | ||||
| SDRDaemonMain *SDRDaemonMain::m_instance = 0; | ||||
| 
 | ||||
| SDRDaemonMain::SDRDaemonMain(qtwebapp::LoggerWithFile *logger, const MainParser& parser, QObject *parent) : | ||||
|     QObject(parent), | ||||
|     m_logger(logger), | ||||
|     m_settings(), | ||||
|     m_dspEngine(DSPEngine::instance()), | ||||
|     m_lastEngineState(DSPDeviceSourceEngine::StNotStarted) | ||||
| { | ||||
|     qDebug() << "SDRdaemon::SDRdaemon: start"; | ||||
| 
 | ||||
|     m_instance = this; | ||||
| 
 | ||||
|     m_pluginManager = new PluginManager(this); | ||||
|     m_pluginManager->loadPlugins(QString("pluginssrv")); | ||||
| 
 | ||||
|     connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleMessages()), Qt::QueuedConnection); | ||||
|     m_masterTimer.start(50); | ||||
| 
 | ||||
|     loadSettings(); | ||||
| 
 | ||||
|     QString applicationDirPath = QCoreApplication::instance()->applicationDirPath(); | ||||
| 
 | ||||
|     if (QResource::registerResource(applicationDirPath + "/sdrbase.rcc")) { | ||||
|         qDebug("MainCore::MainCore: registered resource file %s/%s", qPrintable(applicationDirPath), "sdrbase.rcc"); | ||||
|     } else { | ||||
|         qWarning("MainCore::MainCore: could not register resource file %s/%s", qPrintable(applicationDirPath), "sdrbase.rcc"); | ||||
|     } | ||||
| 
 | ||||
|     m_apiAdapter = new WebAPIAdapterDaemon(*this); | ||||
|     m_requestMapper = new SDRDaemon::WebAPIRequestMapper(this); | ||||
|     m_requestMapper->setAdapter(m_apiAdapter); | ||||
|     m_apiServer = new SDRDaemon::WebAPIServer(parser.getServerAddress(), parser.getServerPort(), m_requestMapper); | ||||
|     m_apiServer->start(); | ||||
| 
 | ||||
|     qDebug() << "SDRdaemon::SDRdaemon: end"; | ||||
| } | ||||
| 
 | ||||
| SDRDaemonMain::~SDRDaemonMain() | ||||
| { | ||||
|     m_apiServer->stop(); | ||||
|     m_settings.save(); | ||||
|     delete m_apiServer; | ||||
|     delete m_requestMapper; | ||||
|     delete m_apiAdapter; | ||||
| 
 | ||||
|     delete m_pluginManager; | ||||
| 
 | ||||
|     qDebug() << "SDRdaemon::~SDRdaemon: end"; | ||||
|     delete m_logger; | ||||
| } | ||||
| 
 | ||||
| void SDRDaemonMain::loadSettings() | ||||
| { | ||||
|     qDebug() << "SDRdaemon::loadSettings"; | ||||
| 
 | ||||
|     m_settings.load(); | ||||
|     setLoggingOptions(); | ||||
| } | ||||
| 
 | ||||
| void SDRDaemonMain::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()) | ||||
|     { | ||||
| #if QT_VERSION >= 0x050400 | ||||
|         QString appInfoStr(tr("%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(tr("%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); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| bool SDRDaemonMain::handleMessage(const Message& cmd __attribute__((unused))) | ||||
| { | ||||
|     return false; | ||||
| } | ||||
| 
 | ||||
| void SDRDaemonMain::handleMessages() | ||||
| { | ||||
|     Message* message; | ||||
| 
 | ||||
|     while ((message = m_inputMessageQueue.pop()) != 0) | ||||
|     { | ||||
|         qDebug("SDRdaemon::handleMessages: message: %s", message->getIdentifier()); | ||||
|         handleMessage(*message); | ||||
|         delete message; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										76
									
								
								sdrdaemon/sdrdaemonmain.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								sdrdaemon/sdrdaemonmain.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,76 @@ | ||||
| ///////////////////////////////////////////////////////////////////////////////////
 | ||||
| // Copyright (C) 2018 Edouard Griffiths, F4EXB.                                  //
 | ||||
| //                                                                               //
 | ||||
| // SDRdaemon instance                                                            //
 | ||||
| //                                                                               //
 | ||||
| // SDRdaemon is a detached SDR front end that handles the interface with a       //
 | ||||
| // physical device and sends or receives the I/Q samples stream to or from a     //
 | ||||
| // SDRangel instance via UDP. It is controlled via a Web REST API.               //
 | ||||
| //                                                                               //
 | ||||
| // 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                  //
 | ||||
| //                                                                               //
 | ||||
| // 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/>.          //
 | ||||
| ///////////////////////////////////////////////////////////////////////////////////
 | ||||
| 
 | ||||
| #ifndef SDRDAEMON_SDRDAEMONMAIN_H_ | ||||
| #define SDRDAEMON_SDRDAEMONMAIN_H_ | ||||
| 
 | ||||
| #include <QObject> | ||||
| #include <QTimer> | ||||
| 
 | ||||
| #include "mainparser.h" | ||||
| #include "sdrdaemonsettings.h" | ||||
| #include "util/messagequeue.h" | ||||
| 
 | ||||
| namespace SDRDaemon { | ||||
|     class WebAPIRequestMapper; | ||||
|     class WebAPIServer; | ||||
| } | ||||
| 
 | ||||
| namespace qtwebapp { | ||||
|     class LoggerWithFile; | ||||
| } | ||||
| 
 | ||||
| class DSPEngine; | ||||
| class PluginManager; | ||||
| class Message; | ||||
| class WebAPIAdapterDaemon; | ||||
| 
 | ||||
| class SDRDaemonMain : public QObject { | ||||
|     Q_OBJECT | ||||
| public: | ||||
|     explicit SDRDaemonMain(qtwebapp::LoggerWithFile *logger, const MainParser& parser, QObject *parent = 0); | ||||
|     ~SDRDaemonMain(); | ||||
|     static SDRDaemonMain *getInstance() { return m_instance; } // Main Core is de facto a singleton so this just returns its reference
 | ||||
| 
 | ||||
| private: | ||||
|     static SDRDaemonMain *m_instance; | ||||
|     qtwebapp::LoggerWithFile *m_logger; | ||||
|     SDRDaemonSettings m_settings; | ||||
|     DSPEngine* m_dspEngine; | ||||
|     int m_lastEngineState; | ||||
|     PluginManager* m_pluginManager; | ||||
|     MessageQueue m_inputMessageQueue; | ||||
|     QTimer m_masterTimer; | ||||
| 
 | ||||
|     SDRDaemon::WebAPIRequestMapper *m_requestMapper; | ||||
|     SDRDaemon::WebAPIServer *m_apiServer; | ||||
|     WebAPIAdapterDaemon *m_apiAdapter; | ||||
| 
 | ||||
|     void loadSettings(); | ||||
|     void setLoggingOptions(); | ||||
|     bool handleMessage(const Message& cmd); | ||||
| 
 | ||||
| private slots: | ||||
|     void handleMessages(); | ||||
| }; | ||||
| 
 | ||||
| #endif /* SDRDAEMON_SDRDAEMONMAIN_H_ */ | ||||
							
								
								
									
										95
									
								
								sdrdaemon/sdrdaemonpreferences.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								sdrdaemon/sdrdaemonpreferences.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,95 @@ | ||||
| ///////////////////////////////////////////////////////////////////////////////////
 | ||||
| // Copyright (C) 2018 Edouard Griffiths, F4EXB.                                  //
 | ||||
| //                                                                               //
 | ||||
| // SDRdaemon instance                                                            //
 | ||||
| //                                                                               //
 | ||||
| // SDRdaemon is a detached SDR front end that handles the interface with a       //
 | ||||
| // physical device and sends or receives the I/Q samples stream to or from a     //
 | ||||
| // SDRangel instance via UDP. It is controlled via a Web REST API.               //
 | ||||
| //                                                                               //
 | ||||
| // 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                  //
 | ||||
| //                                                                               //
 | ||||
| // 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 "util/simpleserializer.h" | ||||
| #include "sdrdaemonpreferences.h" | ||||
| 
 | ||||
| SDRDaemonPreferences::SDRDaemonPreferences() | ||||
| { | ||||
|     resetToDefaults(); | ||||
| } | ||||
| 
 | ||||
| void SDRDaemonPreferences::resetToDefaults() | ||||
| { | ||||
|     m_useLogFile = false; | ||||
|     m_logFileName = "sdrangel.log"; | ||||
|     m_consoleMinLogLevel = QtDebugMsg; | ||||
|     m_fileMinLogLevel = QtDebugMsg; | ||||
| } | ||||
| 
 | ||||
| QByteArray SDRDaemonPreferences::serialize() const | ||||
| { | ||||
|     SimpleSerializer s(1); | ||||
|     s.writeS32(1, (int) m_consoleMinLogLevel); | ||||
|     s.writeBool(2, m_useLogFile); | ||||
|     s.writeString(3, m_logFileName); | ||||
|     s.writeS32(4, (int) m_fileMinLogLevel); | ||||
|     return s.final(); | ||||
| } | ||||
| 
 | ||||
| bool SDRDaemonPreferences::deserialize(const QByteArray& data) | ||||
| { | ||||
|     int tmpInt; | ||||
| 
 | ||||
|     SimpleDeserializer d(data); | ||||
| 
 | ||||
|     if(!d.isValid()) { | ||||
|         resetToDefaults(); | ||||
|         return false; | ||||
|     } | ||||
| 
 | ||||
|     if(d.getVersion() == 1) | ||||
|     { | ||||
|         d.readS32(1, &tmpInt, (int) QtDebugMsg); | ||||
| 
 | ||||
|         if ((tmpInt == (int) QtDebugMsg) || | ||||
|             (tmpInt == (int) QtInfoMsg) || | ||||
|             (tmpInt == (int) QtWarningMsg) || | ||||
|             (tmpInt == (int) QtCriticalMsg) || | ||||
|             (tmpInt == (int) QtFatalMsg)) { | ||||
|             m_consoleMinLogLevel = (QtMsgType) tmpInt; | ||||
|         } else { | ||||
|             m_consoleMinLogLevel = QtDebugMsg; | ||||
|         } | ||||
| 
 | ||||
|         d.readBool(2, &m_useLogFile, false); | ||||
|         d.readString(3, &m_logFileName, "sdrangel.log"); | ||||
| 
 | ||||
|         d.readS32(4, &tmpInt, (int) QtDebugMsg); | ||||
| 
 | ||||
|         if ((tmpInt == (int) QtDebugMsg) || | ||||
|             (tmpInt == (int) QtInfoMsg) || | ||||
|             (tmpInt == (int) QtWarningMsg) || | ||||
|             (tmpInt == (int) QtCriticalMsg) || | ||||
|             (tmpInt == (int) QtFatalMsg)) { | ||||
|             m_fileMinLogLevel = (QtMsgType) tmpInt; | ||||
|         } else { | ||||
|             m_fileMinLogLevel = QtDebugMsg; | ||||
|         } | ||||
| 
 | ||||
|         return true; | ||||
|     } else | ||||
|     { | ||||
|         resetToDefaults(); | ||||
|         return false; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										53
									
								
								sdrdaemon/sdrdaemonpreferences.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								sdrdaemon/sdrdaemonpreferences.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,53 @@ | ||||
| ///////////////////////////////////////////////////////////////////////////////////
 | ||||
| // Copyright (C) 2018 Edouard Griffiths, F4EXB.                                  //
 | ||||
| //                                                                               //
 | ||||
| // SDRdaemon instance                                                            //
 | ||||
| //                                                                               //
 | ||||
| // SDRdaemon is a detached SDR front end that handles the interface with a       //
 | ||||
| // physical device and sends or receives the I/Q samples stream to or from a     //
 | ||||
| // SDRangel instance via UDP. It is controlled via a Web REST API.               //
 | ||||
| //                                                                               //
 | ||||
| // 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                  //
 | ||||
| //                                                                               //
 | ||||
| // 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/>.          //
 | ||||
| ///////////////////////////////////////////////////////////////////////////////////
 | ||||
| 
 | ||||
| #ifndef SDRDAEMON_SDRDAEMONPREFERENCES_H_ | ||||
| #define SDRDAEMON_SDRDAEMONPREFERENCES_H_ | ||||
| 
 | ||||
| #include <QString> | ||||
| 
 | ||||
| class SDRDaemonPreferences | ||||
| { | ||||
| public: | ||||
|     SDRDaemonPreferences(); | ||||
| 
 | ||||
|     void resetToDefaults(); | ||||
|     QByteArray serialize() const; | ||||
|     bool deserialize(const QByteArray& data); | ||||
| 
 | ||||
|     void setConsoleMinLogLevel(const QtMsgType& minLogLevel) { m_consoleMinLogLevel = minLogLevel; } | ||||
|     void setFileMinLogLevel(const QtMsgType& minLogLevel) { m_fileMinLogLevel = minLogLevel; } | ||||
|     void setUseLogFile(bool useLogFile) { m_useLogFile = useLogFile; } | ||||
|     void setLogFileName(const QString& value) { m_logFileName = value; } | ||||
|     QtMsgType getConsoleMinLogLevel() const { return m_consoleMinLogLevel; } | ||||
|     QtMsgType getFileMinLogLevel() const { return m_fileMinLogLevel; } | ||||
|     bool getUseLogFile() const { return m_useLogFile; } | ||||
|     const QString& getLogFileName() const { return m_logFileName; } | ||||
| 
 | ||||
| private: | ||||
|     QtMsgType m_consoleMinLogLevel; | ||||
|     QtMsgType m_fileMinLogLevel; | ||||
|     bool m_useLogFile; | ||||
|     QString m_logFileName; | ||||
| }; | ||||
| 
 | ||||
| #endif /* SDRDAEMON_SDRDAEMONPREFERENCES_H_ */ | ||||
							
								
								
									
										51
									
								
								sdrdaemon/sdrdaemonsettings.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								sdrdaemon/sdrdaemonsettings.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,51 @@ | ||||
| ///////////////////////////////////////////////////////////////////////////////////
 | ||||
| // Copyright (C) 2018 Edouard Griffiths, F4EXB.                                  //
 | ||||
| //                                                                               //
 | ||||
| // SDRdaemon instance                                                            //
 | ||||
| //                                                                               //
 | ||||
| // SDRdaemon is a detached SDR front end that handles the interface with a       //
 | ||||
| // physical device and sends or receives the I/Q samples stream to or from a     //
 | ||||
| // SDRangel instance via UDP. It is controlled via a Web REST API.               //
 | ||||
| //                                                                               //
 | ||||
| // 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                  //
 | ||||
| //                                                                               //
 | ||||
| // 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 <QSettings> | ||||
| 
 | ||||
| #include "sdrdaemonpreferences.h" | ||||
| #include "sdrdaemonsettings.h" | ||||
| 
 | ||||
| SDRDaemonSettings::SDRDaemonSettings() | ||||
| { | ||||
|     resetToDefaults(); | ||||
| } | ||||
| 
 | ||||
| SDRDaemonSettings::~SDRDaemonSettings() | ||||
| {} | ||||
| 
 | ||||
| void SDRDaemonSettings::load() | ||||
| { | ||||
|     QSettings s; | ||||
|     m_preferences.deserialize(qUncompress(QByteArray::fromBase64(s.value("preferences").toByteArray()))); | ||||
| } | ||||
| 
 | ||||
| void SDRDaemonSettings::save() const | ||||
| { | ||||
|     QSettings s; | ||||
|     s.setValue("preferences", qCompress(m_preferences.serialize()).toBase64()); | ||||
| } | ||||
| 
 | ||||
| void SDRDaemonSettings::resetToDefaults() | ||||
| { | ||||
|     m_preferences.resetToDefaults(); | ||||
| } | ||||
							
								
								
									
										54
									
								
								sdrdaemon/sdrdaemonsettings.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								sdrdaemon/sdrdaemonsettings.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,54 @@ | ||||
| ///////////////////////////////////////////////////////////////////////////////////
 | ||||
| // Copyright (C) 2018 Edouard Griffiths, F4EXB.                                  //
 | ||||
| //                                                                               //
 | ||||
| // SDRdaemon instance                                                            //
 | ||||
| //                                                                               //
 | ||||
| // SDRdaemon is a detached SDR front end that handles the interface with a       //
 | ||||
| // physical device and sends or receives the I/Q samples stream to or from a     //
 | ||||
| // SDRangel instance via UDP. It is controlled via a Web REST API.               //
 | ||||
| //                                                                               //
 | ||||
| // 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                  //
 | ||||
| //                                                                               //
 | ||||
| // 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/>.          //
 | ||||
| ///////////////////////////////////////////////////////////////////////////////////
 | ||||
| 
 | ||||
| #ifndef SDRDAEMON_SDRDAEMONSETTINGS_H_ | ||||
| #define SDRDAEMON_SDRDAEMONSETTINGS_H_ | ||||
| 
 | ||||
| #include "sdrdaemonpreferences.h" | ||||
| 
 | ||||
| class SDRDaemonSettings | ||||
| { | ||||
| public: | ||||
|     SDRDaemonSettings(); | ||||
|     ~SDRDaemonSettings(); | ||||
| 
 | ||||
|     void load(); | ||||
|     void save() const; | ||||
| 
 | ||||
|     void resetToDefaults(); | ||||
| 
 | ||||
|     void setConsoleMinLogLevel(const QtMsgType& minLogLevel) { m_preferences.setConsoleMinLogLevel(minLogLevel); } | ||||
|     void setFileMinLogLevel(const QtMsgType& minLogLevel) { m_preferences.setFileMinLogLevel(minLogLevel); } | ||||
|     void setUseLogFile(bool useLogFile) { m_preferences.setUseLogFile(useLogFile); } | ||||
|     void setLogFileName(const QString& value) { m_preferences.setLogFileName(value); } | ||||
|     QtMsgType getConsoleMinLogLevel() const { return m_preferences.getConsoleMinLogLevel(); } | ||||
|     QtMsgType getFileMinLogLevel() const { return m_preferences.getFileMinLogLevel(); } | ||||
|     bool getUseLogFile() const { return m_preferences.getUseLogFile(); } | ||||
|     const QString& getLogFileName() const { return m_preferences.getLogFileName(); } | ||||
| 
 | ||||
| private: | ||||
|     SDRDaemonPreferences m_preferences; | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| #endif /* SDRDAEMON_SDRDAEMONSETTINGS_H_ */ | ||||
							
								
								
									
										164
									
								
								sdrdaemon/webapi/webapiadapterdaemon.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										164
									
								
								sdrdaemon/webapi/webapiadapterdaemon.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,164 @@ | ||||
| ///////////////////////////////////////////////////////////////////////////////////
 | ||||
| // Copyright (C) 2018 Edouard Griffiths, F4EXB.                                  //
 | ||||
| //                                                                               //
 | ||||
| // SDRDaemon Swagger server adapter interface                                    //
 | ||||
| //                                                                               //
 | ||||
| // 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                  //
 | ||||
| //                                                                               //
 | ||||
| // 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 "SWGDaemonSummaryResponse.h" | ||||
| #include "SWGDeviceSettings.h" | ||||
| #include "SWGDeviceState.h" | ||||
| #include "SWGDeviceReport.h" | ||||
| #include "SWGErrorResponse.h" | ||||
| 
 | ||||
| #include "webapiadapterdaemon.h" | ||||
| 
 | ||||
| QString WebAPIAdapterDaemon::daemonInstanceSummaryURL = "/sdrdaemon"; | ||||
| QString WebAPIAdapterDaemon::daemonInstanceLoggingURL = "/sdrdaemon/logging"; | ||||
| QString WebAPIAdapterDaemon::daemonSettingsURL = "/sdrdaemon/settings"; | ||||
| QString WebAPIAdapterDaemon::daemonReportURL = "/sdrdaemon/report"; | ||||
| QString WebAPIAdapterDaemon::daemonRunURL = "/sdrdaemon/run"; | ||||
| 
 | ||||
| WebAPIAdapterDaemon::WebAPIAdapterDaemon(SDRDaemonMain& sdrDaemonMain) : | ||||
|     m_sdrDaemonMain(sdrDaemonMain) | ||||
| { | ||||
| } | ||||
| 
 | ||||
| WebAPIAdapterDaemon::~WebAPIAdapterDaemon() | ||||
| { | ||||
| } | ||||
| 
 | ||||
| int WebAPIAdapterDaemon::daemonInstanceSummary( | ||||
|         SWGSDRangel::SWGDaemonSummaryResponse& response __attribute__((unused)), | ||||
|         SWGSDRangel::SWGErrorResponse& error) | ||||
| { | ||||
|     error.init(); | ||||
|     *error.getMessage() = "Not implemented"; | ||||
|     return 501; | ||||
| } | ||||
| 
 | ||||
| int WebAPIAdapterDaemon::daemonInstanceLoggingGet( | ||||
|         SWGSDRangel::SWGLoggingInfo& response __attribute__((unused)), | ||||
|         SWGSDRangel::SWGErrorResponse& error) | ||||
| { | ||||
|     error.init(); | ||||
|     *error.getMessage() = "Not implemented"; | ||||
|     return 501; | ||||
| } | ||||
| 
 | ||||
| int WebAPIAdapterDaemon::daemonInstanceLoggingPut( | ||||
|         SWGSDRangel::SWGLoggingInfo& query __attribute__((unused)), | ||||
|         SWGSDRangel::SWGLoggingInfo& response __attribute__((unused)), | ||||
|         SWGSDRangel::SWGErrorResponse& error) | ||||
| { | ||||
|     error.init(); | ||||
|     *error.getMessage() = "Not implemented"; | ||||
|     return 501; | ||||
| } | ||||
| 
 | ||||
| int WebAPIAdapterDaemon::daemonSettingsGet( | ||||
|         SWGSDRangel::SWGDeviceSettings& response __attribute__((unused)), | ||||
|         SWGSDRangel::SWGErrorResponse& error) | ||||
| { | ||||
|     error.init(); | ||||
|     *error.getMessage() = "Not implemented"; | ||||
|     return 501; | ||||
| } | ||||
| 
 | ||||
| int WebAPIAdapterDaemon::daemonSettingsPutPatch( | ||||
|         bool force __attribute__((unused)), | ||||
|         const QStringList& deviceSettingsKeys __attribute__((unused)), | ||||
|         SWGSDRangel::SWGDeviceSettings& response __attribute__((unused)), | ||||
|         SWGSDRangel::SWGErrorResponse& error) | ||||
| { | ||||
|     error.init(); | ||||
|     *error.getMessage() = "Not implemented"; | ||||
|     return 501; | ||||
| } | ||||
| 
 | ||||
| int WebAPIAdapterDaemon::daemonRunGet( | ||||
|         SWGSDRangel::SWGDeviceState& response __attribute__((unused)), | ||||
|         SWGSDRangel::SWGErrorResponse& error) | ||||
| { | ||||
|     error.init(); | ||||
|     *error.getMessage() = "Not implemented"; | ||||
|     return 501; | ||||
| } | ||||
| 
 | ||||
| int WebAPIAdapterDaemon::daemonRunPost( | ||||
|         SWGSDRangel::SWGDeviceState& response __attribute__((unused)), | ||||
|         SWGSDRangel::SWGErrorResponse& error) | ||||
| { | ||||
|     error.init(); | ||||
|     *error.getMessage() = "Not implemented"; | ||||
|     return 501; | ||||
| } | ||||
| 
 | ||||
| int WebAPIAdapterDaemon::daemonRunDelete( | ||||
|         SWGSDRangel::SWGDeviceState& response __attribute__((unused)), | ||||
|         SWGSDRangel::SWGErrorResponse& error) | ||||
| { | ||||
|     error.init(); | ||||
|     *error.getMessage() = "Not implemented"; | ||||
|     return 501; | ||||
| } | ||||
| 
 | ||||
| int WebAPIAdapterDaemon::daemonReportGet( | ||||
|         SWGSDRangel::SWGDeviceReport& response __attribute__((unused)), | ||||
|         SWGSDRangel::SWGErrorResponse& error) | ||||
| { | ||||
|     error.init(); | ||||
|     *error.getMessage() = "Not implemented"; | ||||
|     return 501; | ||||
| } | ||||
| 
 | ||||
| // TODO: put in library in common with SDRangel. Can be static.
 | ||||
| QtMsgType WebAPIAdapterDaemon::getMsgTypeFromString(const QString& msgTypeString) | ||||
| { | ||||
|     if (msgTypeString == "debug") { | ||||
|         return QtDebugMsg; | ||||
|     } else if (msgTypeString == "info") { | ||||
|         return QtInfoMsg; | ||||
|     } else if (msgTypeString == "warning") { | ||||
|         return QtWarningMsg; | ||||
|     } else if (msgTypeString == "error") { | ||||
|         return QtCriticalMsg; | ||||
|     } else { | ||||
|         return QtDebugMsg; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| // TODO: put in library in common with SDRangel. Can be static.
 | ||||
| void WebAPIAdapterDaemon::getMsgTypeString(const QtMsgType& msgType, QString& levelStr) | ||||
| { | ||||
|     switch (msgType) | ||||
|     { | ||||
|     case QtDebugMsg: | ||||
|         levelStr = "debug"; | ||||
|         break; | ||||
|     case QtInfoMsg: | ||||
|         levelStr = "info"; | ||||
|         break; | ||||
|     case QtWarningMsg: | ||||
|         levelStr = "warning"; | ||||
|         break; | ||||
|     case QtCriticalMsg: | ||||
|     case QtFatalMsg: | ||||
|         levelStr = "error"; | ||||
|         break; | ||||
|     default: | ||||
|         levelStr = "debug"; | ||||
|         break; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										98
									
								
								sdrdaemon/webapi/webapiadapterdaemon.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										98
									
								
								sdrdaemon/webapi/webapiadapterdaemon.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,98 @@ | ||||
| ///////////////////////////////////////////////////////////////////////////////////
 | ||||
| // Copyright (C) 2018 Edouard Griffiths, F4EXB.                                  //
 | ||||
| //                                                                               //
 | ||||
| // SDRDaemon Swagger server adapter interface                                    //
 | ||||
| //                                                                               //
 | ||||
| // 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                  //
 | ||||
| //                                                                               //
 | ||||
| // 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/>.          //
 | ||||
| ///////////////////////////////////////////////////////////////////////////////////
 | ||||
| 
 | ||||
| #ifndef SDRDAEMON_WEBAPI_WEBAPIADAPTERDAEMON_H_ | ||||
| #define SDRDAEMON_WEBAPI_WEBAPIADAPTERDAEMON_H_ | ||||
| 
 | ||||
| #include <QtGlobal> | ||||
| #include <QStringList> | ||||
| 
 | ||||
| namespace SWGSDRangel | ||||
| { | ||||
|     class SWGDaemonSummaryResponse; | ||||
|     class SWGDeviceSet; | ||||
|     class SWGDeviceListItem; | ||||
|     class SWGDeviceSettings; | ||||
|     class SWGDeviceState; | ||||
|     class SWGDeviceReport; | ||||
|     class SWGSuccessResponse; | ||||
|     class SWGErrorResponse; | ||||
|     class SWGLoggingInfo; | ||||
| } | ||||
| 
 | ||||
| class SDRDaemonMain; | ||||
| 
 | ||||
| class WebAPIAdapterDaemon | ||||
| { | ||||
| public: | ||||
|     WebAPIAdapterDaemon(SDRDaemonMain& sdrDaemonMain); | ||||
|     ~WebAPIAdapterDaemon(); | ||||
| 
 | ||||
|     int daemonInstanceSummary( | ||||
|             SWGSDRangel::SWGDaemonSummaryResponse& response, | ||||
|             SWGSDRangel::SWGErrorResponse& error); | ||||
| 
 | ||||
|     int daemonInstanceLoggingGet( | ||||
|             SWGSDRangel::SWGLoggingInfo& response, | ||||
|             SWGSDRangel::SWGErrorResponse& error); | ||||
| 
 | ||||
|     int daemonInstanceLoggingPut( | ||||
|             SWGSDRangel::SWGLoggingInfo& query, | ||||
|             SWGSDRangel::SWGLoggingInfo& response, | ||||
|             SWGSDRangel::SWGErrorResponse& error); | ||||
| 
 | ||||
|     int daemonSettingsGet( | ||||
|             SWGSDRangel::SWGDeviceSettings& response, | ||||
|             SWGSDRangel::SWGErrorResponse& error); | ||||
| 
 | ||||
|     int daemonSettingsPutPatch( | ||||
|             bool force, | ||||
|             const QStringList& deviceSettingsKeys, | ||||
|             SWGSDRangel::SWGDeviceSettings& response, | ||||
|             SWGSDRangel::SWGErrorResponse& error); | ||||
| 
 | ||||
|     int daemonRunGet( | ||||
|             SWGSDRangel::SWGDeviceState& response, | ||||
|             SWGSDRangel::SWGErrorResponse& error); | ||||
| 
 | ||||
|     int daemonRunPost( | ||||
|             SWGSDRangel::SWGDeviceState& response, | ||||
|             SWGSDRangel::SWGErrorResponse& error); | ||||
| 
 | ||||
|     int daemonRunDelete( | ||||
|             SWGSDRangel::SWGDeviceState& response, | ||||
|             SWGSDRangel::SWGErrorResponse& error); | ||||
| 
 | ||||
|     int daemonReportGet( | ||||
|             SWGSDRangel::SWGDeviceReport& response, | ||||
|             SWGSDRangel::SWGErrorResponse& error); | ||||
| 
 | ||||
|     static QString daemonInstanceSummaryURL; | ||||
|     static QString daemonInstanceLoggingURL; | ||||
|     static QString daemonSettingsURL; | ||||
|     static QString daemonReportURL; | ||||
|     static QString daemonRunURL; | ||||
| 
 | ||||
| private: | ||||
|     SDRDaemonMain& m_sdrDaemonMain; | ||||
| 
 | ||||
|     static QtMsgType getMsgTypeFromString(const QString& msgTypeString); | ||||
|     static void getMsgTypeString(const QtMsgType& msgType, QString& level); | ||||
| }; | ||||
| 
 | ||||
| #endif /* SDRDAEMON_WEBAPI_WEBAPIADAPTERDAEMON_H_ */ | ||||
							
								
								
									
										706
									
								
								sdrdaemon/webapi/webapirequestmapper.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										706
									
								
								sdrdaemon/webapi/webapirequestmapper.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,706 @@ | ||||
| ///////////////////////////////////////////////////////////////////////////////////
 | ||||
| // Copyright (C) 2018 Edouard Griffiths, F4EXB.                                  //
 | ||||
| //                                                                               //
 | ||||
| // SDRDaemon Swagger server adapter interface                                    //
 | ||||
| //                                                                               //
 | ||||
| // 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                  //
 | ||||
| //                                                                               //
 | ||||
| // 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 <QDirIterator> | ||||
| #include <QJsonDocument> | ||||
| #include <QJsonArray> | ||||
| 
 | ||||
| #include <boost/lexical_cast.hpp> | ||||
| 
 | ||||
| #include "httpdocrootsettings.h" | ||||
| #include "webapirequestmapper.h" | ||||
| #include "SWGDaemonSummaryResponse.h" | ||||
| #include "SWGInstanceDevicesResponse.h" | ||||
| #include "SWGDeviceSettings.h" | ||||
| #include "SWGDeviceState.h" | ||||
| #include "SWGDeviceReport.h" | ||||
| #include "SWGSuccessResponse.h" | ||||
| #include "SWGErrorResponse.h" | ||||
| #include "SWGLoggingInfo.h" | ||||
| 
 | ||||
| #include "webapirequestmapper.h" | ||||
| #include "webapiadapterdaemon.h" | ||||
| 
 | ||||
| namespace SDRDaemon | ||||
| { | ||||
| 
 | ||||
| WebAPIRequestMapper::WebAPIRequestMapper(QObject* parent) : | ||||
|     HttpRequestHandler(parent), | ||||
|     m_adapter(0) | ||||
| { | ||||
|     qtwebapp::HttpDocrootSettings docrootSettings; | ||||
|     docrootSettings.path = ":/webapi"; | ||||
|     m_staticFileController = new qtwebapp::StaticFileController(docrootSettings, parent); | ||||
| } | ||||
| 
 | ||||
| WebAPIRequestMapper::~WebAPIRequestMapper() | ||||
| { | ||||
|     delete m_staticFileController; | ||||
| } | ||||
| 
 | ||||
| void WebAPIRequestMapper::service(qtwebapp::HttpRequest& request, qtwebapp::HttpResponse& response) | ||||
| { | ||||
|     if (m_adapter == 0) // format service unavailable if adapter is null
 | ||||
|     { | ||||
|         SWGSDRangel::SWGErrorResponse errorResponse; | ||||
|         response.setHeader("Content-Type", "application/json"); | ||||
|         response.setHeader("Access-Control-Allow-Origin", "*"); | ||||
|         response.setStatus(500,"Service not available"); | ||||
| 
 | ||||
|         errorResponse.init(); | ||||
|         *errorResponse.getMessage() = "Service not available"; | ||||
|         response.write(errorResponse.asJson().toUtf8()); | ||||
|     } | ||||
|     else // normal processing
 | ||||
|     { | ||||
|         QByteArray path=request.getPath(); | ||||
| 
 | ||||
|         // Handle pre-flight requests
 | ||||
|         if (request.getMethod() == "OPTIONS") | ||||
|         { | ||||
|             qDebug("WebAPIRequestMapper::service: method OPTIONS: assume pre-flight"); | ||||
|             response.setHeader("Access-Control-Allow-Origin", "*"); | ||||
|             response.setHeader("Access-Control-Allow-Headers", "*"); | ||||
|             response.setHeader("Access-Control-Allow-Methods", "*"); | ||||
|             response.setStatus(200, "OK"); | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         if (path.startsWith("/sdrangel")) | ||||
|         { | ||||
|             SWGSDRangel::SWGErrorResponse errorResponse; | ||||
|             response.setStatus(501,"Not implemented"); | ||||
|             errorResponse.init(); | ||||
|             *errorResponse.getMessage() = "Not implemented"; | ||||
|             response.write(errorResponse.asJson().toUtf8()); | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         if (path == WebAPIAdapterDaemon::daemonInstanceSummaryURL) { | ||||
|             daemonInstanceSummaryService(request, response); | ||||
|         } else if (path == WebAPIAdapterDaemon::daemonInstanceLoggingURL) { | ||||
|             daemonInstanceLoggingService(request, response); | ||||
|         } else if (path == WebAPIAdapterDaemon::daemonSettingsURL) { | ||||
|             daemonSettingsService(request, response); | ||||
|         } else if (path == WebAPIAdapterDaemon::daemonReportURL) { | ||||
|             daemonReportService(request, response); | ||||
|         } else if (path == WebAPIAdapterDaemon::daemonRunURL) { | ||||
|             daemonRunService(request, response); | ||||
|         } else { | ||||
|             m_staticFileController->service(request, response); // serve static pages
 | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void WebAPIRequestMapper::daemonInstanceSummaryService(qtwebapp::HttpRequest& request, qtwebapp::HttpResponse& response) | ||||
| { | ||||
|     SWGSDRangel::SWGErrorResponse errorResponse; | ||||
|     response.setHeader("Content-Type", "application/json"); | ||||
|     response.setHeader("Access-Control-Allow-Origin", "*"); | ||||
| 
 | ||||
|     if (request.getMethod() == "GET") | ||||
|     { | ||||
|         SWGSDRangel::SWGDaemonSummaryResponse normalResponse; | ||||
| 
 | ||||
|         int status = m_adapter->daemonInstanceSummary(normalResponse, errorResponse); | ||||
|         response.setStatus(status); | ||||
| 
 | ||||
|         if (status/100 == 2) { | ||||
|             response.write(normalResponse.asJson().toUtf8()); | ||||
|         } else { | ||||
|             response.write(errorResponse.asJson().toUtf8()); | ||||
|         } | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         response.setStatus(405,"Invalid HTTP method"); | ||||
|         errorResponse.init(); | ||||
|         *errorResponse.getMessage() = "Invalid HTTP method"; | ||||
|         response.write(errorResponse.asJson().toUtf8()); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void WebAPIRequestMapper::daemonInstanceLoggingService(qtwebapp::HttpRequest& request, qtwebapp::HttpResponse& response) | ||||
| { | ||||
|     SWGSDRangel::SWGLoggingInfo query; | ||||
|     SWGSDRangel::SWGLoggingInfo normalResponse; | ||||
|     SWGSDRangel::SWGErrorResponse errorResponse; | ||||
|     response.setHeader("Content-Type", "application/json"); | ||||
|     response.setHeader("Access-Control-Allow-Origin", "*"); | ||||
| 
 | ||||
|     if (request.getMethod() == "GET") | ||||
|     { | ||||
|         int status = m_adapter->daemonInstanceLoggingGet(normalResponse, errorResponse); | ||||
|         response.setStatus(status); | ||||
| 
 | ||||
|         if (status/100 == 2) { | ||||
|             response.write(normalResponse.asJson().toUtf8()); | ||||
|         } else { | ||||
|             response.write(errorResponse.asJson().toUtf8()); | ||||
|         } | ||||
|     } | ||||
|     else if (request.getMethod() == "PUT") | ||||
|     { | ||||
|         QString jsonStr = request.getBody(); | ||||
|         QJsonObject jsonObject; | ||||
| 
 | ||||
|         if (parseJsonBody(jsonStr, jsonObject, response)) | ||||
|         { | ||||
|             query.fromJson(jsonStr); | ||||
|             int status = m_adapter->daemonInstanceLoggingPut(query, normalResponse, errorResponse); | ||||
|             response.setStatus(status); | ||||
| 
 | ||||
|             if (status/100 == 2) { | ||||
|                 response.write(normalResponse.asJson().toUtf8()); | ||||
|             } else { | ||||
|                 response.write(errorResponse.asJson().toUtf8()); | ||||
|             } | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             response.setStatus(400,"Invalid JSON format"); | ||||
|             errorResponse.init(); | ||||
|             *errorResponse.getMessage() = "Invalid JSON format"; | ||||
|             response.write(errorResponse.asJson().toUtf8()); | ||||
|         } | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         response.setStatus(405,"Invalid HTTP method"); | ||||
|         errorResponse.init(); | ||||
|         *errorResponse.getMessage() = "Invalid HTTP method"; | ||||
|         response.write(errorResponse.asJson().toUtf8()); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void WebAPIRequestMapper::daemonSettingsService(qtwebapp::HttpRequest& request, qtwebapp::HttpResponse& response) | ||||
| { | ||||
|     SWGSDRangel::SWGErrorResponse errorResponse; | ||||
|     response.setHeader("Content-Type", "application/json"); | ||||
|     response.setHeader("Access-Control-Allow-Origin", "*"); | ||||
| 
 | ||||
|     if ((request.getMethod() == "PUT") || (request.getMethod() == "PATCH")) | ||||
|     { | ||||
|         QString jsonStr = request.getBody(); | ||||
|         QJsonObject jsonObject; | ||||
| 
 | ||||
|         if (parseJsonBody(jsonStr, jsonObject, response)) | ||||
|         { | ||||
|             SWGSDRangel::SWGDeviceSettings normalResponse; | ||||
|             resetDeviceSettings(normalResponse); | ||||
|             QStringList deviceSettingsKeys; | ||||
| 
 | ||||
|             if (validateDeviceSettings(normalResponse, jsonObject, deviceSettingsKeys)) | ||||
|             { | ||||
|                 int status = m_adapter->daemonSettingsPutPatch( | ||||
|                         (request.getMethod() == "PUT"), // force settings on PUT
 | ||||
|                         deviceSettingsKeys, | ||||
|                         normalResponse, | ||||
|                         errorResponse); | ||||
|                 response.setStatus(status); | ||||
| 
 | ||||
|                 if (status/100 == 2) { | ||||
|                     response.write(normalResponse.asJson().toUtf8()); | ||||
|                 } else { | ||||
|                     response.write(errorResponse.asJson().toUtf8()); | ||||
|                 } | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 response.setStatus(400,"Invalid JSON request"); | ||||
|                 errorResponse.init(); | ||||
|                 *errorResponse.getMessage() = "Invalid JSON request"; | ||||
|                 response.write(errorResponse.asJson().toUtf8()); | ||||
|             } | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             response.setStatus(400,"Invalid JSON format"); | ||||
|             errorResponse.init(); | ||||
|             *errorResponse.getMessage() = "Invalid JSON format"; | ||||
|             response.write(errorResponse.asJson().toUtf8()); | ||||
|         } | ||||
|     } | ||||
|     else if (request.getMethod() == "GET") | ||||
|     { | ||||
|         SWGSDRangel::SWGDeviceSettings normalResponse; | ||||
|         resetDeviceSettings(normalResponse); | ||||
|         int status = m_adapter->daemonSettingsGet(normalResponse, errorResponse); | ||||
|         response.setStatus(status); | ||||
| 
 | ||||
|         if (status/100 == 2) { | ||||
|             response.write(normalResponse.asJson().toUtf8()); | ||||
|         } else { | ||||
|             response.write(errorResponse.asJson().toUtf8()); | ||||
|         } | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         response.setStatus(405,"Invalid HTTP method"); | ||||
|         errorResponse.init(); | ||||
|         *errorResponse.getMessage() = "Invalid HTTP method"; | ||||
|         response.write(errorResponse.asJson().toUtf8()); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void WebAPIRequestMapper::daemonReportService(qtwebapp::HttpRequest& request, qtwebapp::HttpResponse& response) | ||||
| { | ||||
|     SWGSDRangel::SWGErrorResponse errorResponse; | ||||
|     response.setHeader("Content-Type", "application/json"); | ||||
|     response.setHeader("Access-Control-Allow-Origin", "*"); | ||||
| 
 | ||||
|     if (request.getMethod() == "GET") | ||||
|     { | ||||
|         SWGSDRangel::SWGDeviceReport normalResponse; | ||||
|         resetDeviceReport(normalResponse); | ||||
|         int status = m_adapter->daemonReportGet(normalResponse, errorResponse); | ||||
|         response.setStatus(status); | ||||
| 
 | ||||
|         if (status/100 == 2) { | ||||
|             response.write(normalResponse.asJson().toUtf8()); | ||||
|         } else { | ||||
|             response.write(errorResponse.asJson().toUtf8()); | ||||
|         } | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         response.setStatus(405,"Invalid HTTP method"); | ||||
|         errorResponse.init(); | ||||
|         *errorResponse.getMessage() = "Invalid HTTP method"; | ||||
|         response.write(errorResponse.asJson().toUtf8()); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void WebAPIRequestMapper::daemonRunService(qtwebapp::HttpRequest& request, qtwebapp::HttpResponse& response) | ||||
| { | ||||
|     SWGSDRangel::SWGErrorResponse errorResponse; | ||||
|     response.setHeader("Content-Type", "application/json"); | ||||
|     response.setHeader("Access-Control-Allow-Origin", "*"); | ||||
| 
 | ||||
|     if (request.getMethod() == "GET") | ||||
|     { | ||||
|         SWGSDRangel::SWGDeviceState normalResponse; | ||||
|         int status = m_adapter->daemonRunGet(normalResponse, errorResponse); | ||||
| 
 | ||||
|         response.setStatus(status); | ||||
| 
 | ||||
|         if (status/100 == 2) { | ||||
|             response.write(normalResponse.asJson().toUtf8()); | ||||
|         } else { | ||||
|             response.write(errorResponse.asJson().toUtf8()); | ||||
|         } | ||||
|     } | ||||
|     else if (request.getMethod() == "POST") | ||||
|     { | ||||
|         SWGSDRangel::SWGDeviceState normalResponse; | ||||
|         int status = m_adapter->daemonRunPost(normalResponse, errorResponse); | ||||
| 
 | ||||
|         response.setStatus(status); | ||||
| 
 | ||||
|         if (status/100 == 2) { | ||||
|             response.write(normalResponse.asJson().toUtf8()); | ||||
|         } else { | ||||
|             response.write(errorResponse.asJson().toUtf8()); | ||||
|         } | ||||
|     } | ||||
|     else if (request.getMethod() == "DELETE") | ||||
|     { | ||||
|         SWGSDRangel::SWGDeviceState normalResponse; | ||||
|         int status = m_adapter->daemonRunDelete(normalResponse, errorResponse); | ||||
| 
 | ||||
|         response.setStatus(status); | ||||
| 
 | ||||
|         if (status/100 == 2) { | ||||
|             response.write(normalResponse.asJson().toUtf8()); | ||||
|         } else { | ||||
|             response.write(errorResponse.asJson().toUtf8()); | ||||
|         } | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         response.setStatus(405,"Invalid HTTP method"); | ||||
|         errorResponse.init(); | ||||
|         *errorResponse.getMessage() = "Invalid HTTP method"; | ||||
|         response.write(errorResponse.asJson().toUtf8()); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| // TODO: put in library in common with SDRangel. Can be static.
 | ||||
| bool WebAPIRequestMapper::validateDeviceSettings(SWGSDRangel::SWGDeviceSettings& deviceSettings, QJsonObject& jsonObject, QStringList& deviceSettingsKeys) | ||||
| { | ||||
|     if (jsonObject.contains("tx")) { | ||||
|         deviceSettings.setTx(jsonObject["tx"].toInt()); | ||||
|     } else { | ||||
|         deviceSettings.setTx(0); // assume Rx
 | ||||
|     } | ||||
| 
 | ||||
|     if (jsonObject.contains("deviceHwType") && jsonObject["deviceHwType"].isString()) { | ||||
|         deviceSettings.setDeviceHwType(new QString(jsonObject["deviceHwType"].toString())); | ||||
|     } else { | ||||
|         return false; | ||||
|     } | ||||
| 
 | ||||
|     QString *deviceHwType = deviceSettings.getDeviceHwType(); | ||||
| 
 | ||||
|     if ((*deviceHwType == "Airspy") && (deviceSettings.getTx() == 0)) | ||||
|     { | ||||
|         if (jsonObject.contains("airspySettings") && jsonObject["airspySettings"].isObject()) | ||||
|         { | ||||
|             QJsonObject airspySettingsJsonObject = jsonObject["airspySettings"].toObject(); | ||||
|             deviceSettingsKeys = airspySettingsJsonObject.keys(); | ||||
|             deviceSettings.setAirspySettings(new SWGSDRangel::SWGAirspySettings()); | ||||
|             deviceSettings.getAirspySettings()->fromJsonObject(airspySettingsJsonObject); | ||||
|             return true; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             return false; | ||||
|         } | ||||
|     } | ||||
|     else if ((*deviceHwType == "AirspyHF") && (deviceSettings.getTx() == 0)) | ||||
|     { | ||||
|         if (jsonObject.contains("airspyHFSettings") && jsonObject["airspyHFSettings"].isObject()) | ||||
|         { | ||||
|             QJsonObject airspyHFSettingsJsonObject = jsonObject["airspyHFSettings"].toObject(); | ||||
|             deviceSettingsKeys = airspyHFSettingsJsonObject.keys(); | ||||
|             deviceSettings.setAirspyHfSettings(new SWGSDRangel::SWGAirspyHFSettings()); | ||||
|             deviceSettings.getAirspyHfSettings()->fromJsonObject(airspyHFSettingsJsonObject); | ||||
|             return true; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             return false; | ||||
|         } | ||||
|     } | ||||
|     else if ((*deviceHwType == "BladeRF") && (deviceSettings.getTx() == 0)) | ||||
|     { | ||||
|         if (jsonObject.contains("bladeRFInputSettings") && jsonObject["bladeRFInputSettings"].isObject()) | ||||
|         { | ||||
|             QJsonObject bladeRFInputSettingsJsonObject = jsonObject["bladeRFInputSettings"].toObject(); | ||||
|             deviceSettingsKeys = bladeRFInputSettingsJsonObject.keys(); | ||||
|             deviceSettings.setBladeRfInputSettings(new SWGSDRangel::SWGBladeRFInputSettings()); | ||||
|             deviceSettings.getBladeRfInputSettings()->fromJsonObject(bladeRFInputSettingsJsonObject); | ||||
|             return true; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             return false; | ||||
|         } | ||||
|     } | ||||
|     else if ((*deviceHwType == "BladeRF") && (deviceSettings.getTx() != 0)) | ||||
|     { | ||||
|         if (jsonObject.contains("bladeRFOutputSettings") && jsonObject["bladeRFOutputSettings"].isObject()) | ||||
|         { | ||||
|             QJsonObject bladeRFOutputSettingsJsonObject = jsonObject["bladeRFOutputSettings"].toObject(); | ||||
|             deviceSettingsKeys = bladeRFOutputSettingsJsonObject.keys(); | ||||
|             deviceSettings.setBladeRfOutputSettings(new SWGSDRangel::SWGBladeRFOutputSettings()); | ||||
|             deviceSettings.getBladeRfOutputSettings()->fromJsonObject(bladeRFOutputSettingsJsonObject); | ||||
|             return true; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             return false; | ||||
|         } | ||||
|     } | ||||
|     else if (*deviceHwType == "FCDPro") | ||||
|     { | ||||
|         if (jsonObject.contains("fcdProSettings") && jsonObject["fcdProSettings"].isObject()) | ||||
|         { | ||||
|             QJsonObject fcdProSettingsJsonObject = jsonObject["fcdProSettings"].toObject(); | ||||
|             deviceSettingsKeys = fcdProSettingsJsonObject.keys(); | ||||
|             deviceSettings.setFcdProSettings(new SWGSDRangel::SWGFCDProSettings()); | ||||
|             deviceSettings.getFcdProSettings()->fromJsonObject(fcdProSettingsJsonObject); | ||||
|             return true; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             return false; | ||||
|         } | ||||
|     } | ||||
|     else if (*deviceHwType == "FCDProPlus") | ||||
|     { | ||||
|         if (jsonObject.contains("fcdProPlusSettings") && jsonObject["fcdProPlusSettings"].isObject()) | ||||
|         { | ||||
|             QJsonObject fcdProPlusSettingsJsonObject = jsonObject["fcdProPlusSettings"].toObject(); | ||||
|             deviceSettingsKeys = fcdProPlusSettingsJsonObject.keys(); | ||||
|             deviceSettings.setFcdProPlusSettings(new SWGSDRangel::SWGFCDProPlusSettings()); | ||||
|             deviceSettings.getFcdProPlusSettings()->fromJsonObject(fcdProPlusSettingsJsonObject); | ||||
|             return true; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             return false; | ||||
|         } | ||||
|     } | ||||
|     else if (*deviceHwType == "FileSource") | ||||
|     { | ||||
|         if (jsonObject.contains("fileSourceSettings") && jsonObject["fileSourceSettings"].isObject()) | ||||
|         { | ||||
|             QJsonObject fileSourceSettingsJsonObject = jsonObject["fileSourceSettings"].toObject(); | ||||
|             deviceSettingsKeys = fileSourceSettingsJsonObject.keys(); | ||||
|             deviceSettings.setFileSourceSettings(new SWGSDRangel::SWGFileSourceSettings()); | ||||
|             deviceSettings.getFileSourceSettings()->fromJsonObject(fileSourceSettingsJsonObject); | ||||
|             return true; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             return false; | ||||
|         } | ||||
|     } | ||||
|     else if ((*deviceHwType == "HackRF") && (deviceSettings.getTx() == 0)) | ||||
|     { | ||||
|         if (jsonObject.contains("hackRFInputSettings") && jsonObject["hackRFInputSettings"].isObject()) | ||||
|         { | ||||
|             QJsonObject hackRFInputSettingsJsonObject = jsonObject["hackRFInputSettings"].toObject(); | ||||
|             deviceSettingsKeys = hackRFInputSettingsJsonObject.keys(); | ||||
|             deviceSettings.setHackRfInputSettings(new SWGSDRangel::SWGHackRFInputSettings()); | ||||
|             deviceSettings.getHackRfInputSettings()->fromJsonObject(hackRFInputSettingsJsonObject); | ||||
|             return true; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             return false; | ||||
|         } | ||||
|     } | ||||
|     else if ((*deviceHwType == "HackRF") && (deviceSettings.getTx() != 0)) | ||||
|     { | ||||
|         if (jsonObject.contains("hackRFOutputSettings") && jsonObject["hackRFOutputSettings"].isObject()) | ||||
|         { | ||||
|             QJsonObject hackRFOutputSettingsJsonObject = jsonObject["hackRFOutputSettings"].toObject(); | ||||
|             deviceSettingsKeys = hackRFOutputSettingsJsonObject.keys(); | ||||
|             deviceSettings.setHackRfOutputSettings(new SWGSDRangel::SWGHackRFOutputSettings()); | ||||
|             deviceSettings.getHackRfOutputSettings()->fromJsonObject(hackRFOutputSettingsJsonObject); | ||||
|             return true; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             return false; | ||||
|         } | ||||
|     } | ||||
|     else if ((*deviceHwType == "LimeSDR") && (deviceSettings.getTx() == 0)) | ||||
|     { | ||||
|         if (jsonObject.contains("limeSdrInputSettings") && jsonObject["limeSdrInputSettings"].isObject()) | ||||
|         { | ||||
|             QJsonObject limeSdrInputSettingsJsonObject = jsonObject["limeSdrInputSettings"].toObject(); | ||||
|             deviceSettingsKeys = limeSdrInputSettingsJsonObject.keys(); | ||||
|             deviceSettings.setLimeSdrInputSettings(new SWGSDRangel::SWGLimeSdrInputSettings()); | ||||
|             deviceSettings.getLimeSdrInputSettings()->fromJsonObject(limeSdrInputSettingsJsonObject); | ||||
|             return true; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             return false; | ||||
|         } | ||||
|     } | ||||
|     else if ((*deviceHwType == "LimeSDR") && (deviceSettings.getTx() != 0)) | ||||
|     { | ||||
|         if (jsonObject.contains("limeSdrOutputSettings") && jsonObject["limeSdrOutputSettings"].isObject()) | ||||
|         { | ||||
|             QJsonObject limeSdrOutputSettingsJsonObject = jsonObject["limeSdrOutputSettings"].toObject(); | ||||
|             deviceSettingsKeys = limeSdrOutputSettingsJsonObject.keys(); | ||||
|             deviceSettings.setLimeSdrOutputSettings(new SWGSDRangel::SWGLimeSdrOutputSettings()); | ||||
|             deviceSettings.getLimeSdrOutputSettings()->fromJsonObject(limeSdrOutputSettingsJsonObject); | ||||
|             return true; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             return false; | ||||
|         } | ||||
|     } | ||||
|     else if (*deviceHwType == "Perseus") | ||||
|     { | ||||
|         if (jsonObject.contains("perseusSettings") && jsonObject["perseusSettings"].isObject()) | ||||
|         { | ||||
|             QJsonObject perseusSettingsJsonObject = jsonObject["perseusSettings"].toObject(); | ||||
|             deviceSettingsKeys = perseusSettingsJsonObject.keys(); | ||||
|             deviceSettings.setPerseusSettings(new SWGSDRangel::SWGPerseusSettings()); | ||||
|             deviceSettings.getPerseusSettings()->fromJsonObject(perseusSettingsJsonObject); | ||||
|             return true; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             return false; | ||||
|         } | ||||
|     } | ||||
|     else if ((*deviceHwType == "PlutoSDR") && (deviceSettings.getTx() == 0)) | ||||
|     { | ||||
|         if (jsonObject.contains("plutoSdrInputSettings") && jsonObject["plutoSdrInputSettings"].isObject()) | ||||
|         { | ||||
|             QJsonObject plutoSdrInputSettingsJsonObject = jsonObject["plutoSdrInputSettings"].toObject(); | ||||
|             deviceSettingsKeys = plutoSdrInputSettingsJsonObject.keys(); | ||||
|             deviceSettings.setPlutoSdrInputSettings(new SWGSDRangel::SWGPlutoSdrInputSettings()); | ||||
|             deviceSettings.getPlutoSdrInputSettings()->fromJsonObject(plutoSdrInputSettingsJsonObject); | ||||
|             return true; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             return false; | ||||
|         } | ||||
|     } | ||||
|     else if ((*deviceHwType == "PlutoSDR") && (deviceSettings.getTx() != 0)) | ||||
|     { | ||||
|         if (jsonObject.contains("plutoSdrOutputSettings") && jsonObject["plutoSdrOutputSettings"].isObject()) | ||||
|         { | ||||
|             QJsonObject plutoSdrOutputSettingsJsonObject = jsonObject["plutoSdrOutputSettings"].toObject(); | ||||
|             deviceSettingsKeys = plutoSdrOutputSettingsJsonObject.keys(); | ||||
|             deviceSettings.setPlutoSdrOutputSettings(new SWGSDRangel::SWGPlutoSdrOutputSettings()); | ||||
|             deviceSettings.getPlutoSdrOutputSettings()->fromJsonObject(plutoSdrOutputSettingsJsonObject); | ||||
|             return true; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             return false; | ||||
|         } | ||||
|     } | ||||
|     else if (*deviceHwType == "RTLSDR") | ||||
|     { | ||||
|         if (jsonObject.contains("rtlSdrSettings") && jsonObject["rtlSdrSettings"].isObject()) | ||||
|         { | ||||
|             QJsonObject rtlSdrSettingsJsonObject = jsonObject["rtlSdrSettings"].toObject(); | ||||
|             deviceSettingsKeys = rtlSdrSettingsJsonObject.keys(); | ||||
|             deviceSettings.setRtlSdrSettings(new SWGSDRangel::SWGRtlSdrSettings()); | ||||
|             deviceSettings.getRtlSdrSettings()->fromJsonObject(rtlSdrSettingsJsonObject); | ||||
|             return true; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             return false; | ||||
|         } | ||||
|     } | ||||
|     else if (*deviceHwType == "TestSource") | ||||
|     { | ||||
|         if (jsonObject.contains("testSourceSettings") && jsonObject["testSourceSettings"].isObject()) | ||||
|         { | ||||
|             QJsonObject testSourceSettingsJsonObject = jsonObject["testSourceSettings"].toObject(); | ||||
|             deviceSettingsKeys = testSourceSettingsJsonObject.keys(); | ||||
|             deviceSettings.setTestSourceSettings(new SWGSDRangel::SWGTestSourceSettings()); | ||||
|             deviceSettings.getTestSourceSettings()->fromJsonObject(testSourceSettingsJsonObject); | ||||
|             return true; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             return false; | ||||
|         } | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         return false; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| // TODO: put in library in common with SDRangel. Can be static.
 | ||||
| void WebAPIRequestMapper::appendSettingsSubKeys( | ||||
|         const QJsonObject& parentSettingsJsonObject, | ||||
|         QJsonObject& childSettingsJsonObject, | ||||
|         const QString& parentKey, | ||||
|         QStringList& keyList) | ||||
| { | ||||
|     childSettingsJsonObject = parentSettingsJsonObject[parentKey].toObject(); | ||||
|     QStringList childSettingsKeys = childSettingsJsonObject.keys(); | ||||
| 
 | ||||
|     for (int i = 0; i < childSettingsKeys.size(); i++) { | ||||
|         keyList.append(parentKey + QString(".") + childSettingsKeys.at(i)); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| // TODO: put in library in common with SDRangel. Can be static.
 | ||||
| bool WebAPIRequestMapper::parseJsonBody(QString& jsonStr, QJsonObject& jsonObject, qtwebapp::HttpResponse& response) | ||||
| { | ||||
|     SWGSDRangel::SWGErrorResponse errorResponse; | ||||
| 
 | ||||
|     try | ||||
|     { | ||||
|         QByteArray jsonBytes(jsonStr.toStdString().c_str()); | ||||
|         QJsonParseError error; | ||||
|         QJsonDocument doc = QJsonDocument::fromJson(jsonBytes, &error); | ||||
| 
 | ||||
|         if (error.error == QJsonParseError::NoError) | ||||
|         { | ||||
|             jsonObject = doc.object(); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             QString errorMsg = QString("Input JSON error: ") + error.errorString() + QString(" at offset ") + QString::number(error.offset); | ||||
|             errorResponse.init(); | ||||
|             *errorResponse.getMessage() = errorMsg; | ||||
|             response.setStatus(400, errorMsg.toUtf8()); | ||||
|             response.write(errorResponse.asJson().toUtf8()); | ||||
|         } | ||||
| 
 | ||||
|         return (error.error == QJsonParseError::NoError); | ||||
|     } | ||||
|     catch (const std::exception& ex) | ||||
|     { | ||||
|         QString errorMsg = QString("Error parsing request: ") + ex.what(); | ||||
|         errorResponse.init(); | ||||
|         *errorResponse.getMessage() = errorMsg; | ||||
|         response.setStatus(500, errorMsg.toUtf8()); | ||||
|         response.write(errorResponse.asJson().toUtf8()); | ||||
| 
 | ||||
|         return false; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| // TODO: put in library in common with SDRangel. Can be static.
 | ||||
| void WebAPIRequestMapper::resetDeviceSettings(SWGSDRangel::SWGDeviceSettings& deviceSettings) | ||||
| { | ||||
|     deviceSettings.cleanup(); | ||||
|     deviceSettings.setDeviceHwType(0); | ||||
|     deviceSettings.setAirspySettings(0); | ||||
|     deviceSettings.setAirspyHfSettings(0); | ||||
|     deviceSettings.setBladeRfInputSettings(0); | ||||
|     deviceSettings.setBladeRfOutputSettings(0); | ||||
|     deviceSettings.setFcdProPlusSettings(0); | ||||
|     deviceSettings.setFcdProSettings(0); | ||||
|     deviceSettings.setFileSourceSettings(0); | ||||
|     deviceSettings.setHackRfInputSettings(0); | ||||
|     deviceSettings.setHackRfOutputSettings(0); | ||||
|     deviceSettings.setLimeSdrInputSettings(0); | ||||
|     deviceSettings.setLimeSdrOutputSettings(0); | ||||
|     deviceSettings.setPerseusSettings(0); | ||||
|     deviceSettings.setPlutoSdrInputSettings(0); | ||||
|     deviceSettings.setPlutoSdrOutputSettings(0); | ||||
|     deviceSettings.setRtlSdrSettings(0); | ||||
|     deviceSettings.setSdrDaemonSinkSettings(0); | ||||
|     deviceSettings.setSdrDaemonSourceSettings(0); | ||||
|     deviceSettings.setSdrPlaySettings(0); | ||||
|     deviceSettings.setTestSourceSettings(0); | ||||
| } | ||||
| 
 | ||||
| // TODO: put in library in common with SDRangel. Can be static.
 | ||||
| void WebAPIRequestMapper::resetDeviceReport(SWGSDRangel::SWGDeviceReport& deviceReport) | ||||
| { | ||||
|     deviceReport.cleanup(); | ||||
|     deviceReport.setDeviceHwType(0); | ||||
|     deviceReport.setAirspyHfReport(0); | ||||
|     deviceReport.setAirspyReport(0); | ||||
|     deviceReport.setFileSourceReport(0); | ||||
|     deviceReport.setLimeSdrInputReport(0); | ||||
|     deviceReport.setLimeSdrOutputReport(0); | ||||
|     deviceReport.setPerseusReport(0); | ||||
|     deviceReport.setPlutoSdrInputReport(0); | ||||
|     deviceReport.setPlutoSdrOutputReport(0); | ||||
|     deviceReport.setRtlSdrReport(0); | ||||
|     deviceReport.setSdrDaemonSinkReport(0); | ||||
|     deviceReport.setSdrDaemonSourceReport(0); | ||||
|     deviceReport.setSdrPlayReport(0); | ||||
| } | ||||
| 
 | ||||
| } // namespace SDRDaemon
 | ||||
| 
 | ||||
| 
 | ||||
							
								
								
									
										76
									
								
								sdrdaemon/webapi/webapirequestmapper.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								sdrdaemon/webapi/webapirequestmapper.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,76 @@ | ||||
| ///////////////////////////////////////////////////////////////////////////////////
 | ||||
| // Copyright (C) 2017 Edouard Griffiths, F4EXB.                                  //
 | ||||
| //                                                                               //
 | ||||
| // SDRDaemon Swagger server adapter interface                                    //
 | ||||
| //                                                                               //
 | ||||
| // 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                  //
 | ||||
| //                                                                               //
 | ||||
| // 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/>.          //
 | ||||
| ///////////////////////////////////////////////////////////////////////////////////
 | ||||
| 
 | ||||
| #ifndef SDRDAEMON_WEBAPI_WEBAPIREQUESTMAPPER_H_ | ||||
| #define SDRDAEMON_WEBAPI_WEBAPIREQUESTMAPPER_H_ | ||||
| 
 | ||||
| #include <QJsonParseError> | ||||
| 
 | ||||
| #include "httprequesthandler.h" | ||||
| #include "httprequest.h" | ||||
| #include "httpresponse.h" | ||||
| #include "staticfilecontroller.h" | ||||
| 
 | ||||
| #include "export.h" | ||||
| 
 | ||||
| namespace SWGSDRangel | ||||
| { | ||||
|     class SWGDeviceSettings; | ||||
|     class SWGDeviceReport; | ||||
| } | ||||
| 
 | ||||
| class WebAPIAdapterDaemon; | ||||
| 
 | ||||
| namespace SDRDaemon | ||||
| { | ||||
| 
 | ||||
| class SDRBASE_API WebAPIRequestMapper : public qtwebapp::HttpRequestHandler { | ||||
|     Q_OBJECT | ||||
| public: | ||||
|     WebAPIRequestMapper(QObject* parent=0); | ||||
|     ~WebAPIRequestMapper(); | ||||
|     void service(qtwebapp::HttpRequest& request, qtwebapp::HttpResponse& response); | ||||
|     void setAdapter(WebAPIAdapterDaemon *adapter) { m_adapter = adapter; } | ||||
| 
 | ||||
| private: | ||||
|     WebAPIAdapterDaemon *m_adapter; | ||||
|     qtwebapp::StaticFileController *m_staticFileController; | ||||
| 
 | ||||
|     void daemonInstanceSummaryService(qtwebapp::HttpRequest& request, qtwebapp::HttpResponse& response); | ||||
|     void daemonInstanceLoggingService(qtwebapp::HttpRequest& request, qtwebapp::HttpResponse& response); | ||||
|     void daemonSettingsService(qtwebapp::HttpRequest& request, qtwebapp::HttpResponse& response); | ||||
|     void daemonRunService(qtwebapp::HttpRequest& request, qtwebapp::HttpResponse& response); | ||||
|     void daemonReportService(qtwebapp::HttpRequest& request, qtwebapp::HttpResponse& response); | ||||
| 
 | ||||
|     bool validateDeviceSettings(SWGSDRangel::SWGDeviceSettings& deviceSettings, QJsonObject& jsonObject, QStringList& deviceSettingsKeys); | ||||
| 
 | ||||
|     void appendSettingsSubKeys( | ||||
|             const QJsonObject& parentSettingsJsonObject, | ||||
|             QJsonObject& childSettingsJsonObject, | ||||
|             const QString& parentKey, | ||||
|             QStringList& keyList); | ||||
| 
 | ||||
|     bool parseJsonBody(QString& jsonStr, QJsonObject& jsonObject, qtwebapp::HttpResponse& response); | ||||
| 
 | ||||
|     void resetDeviceSettings(SWGSDRangel::SWGDeviceSettings& deviceSettings); | ||||
|     void resetDeviceReport(SWGSDRangel::SWGDeviceReport& deviceReport); | ||||
| }; | ||||
| 
 | ||||
| } // namespace SDRdaemon
 | ||||
| 
 | ||||
| #endif /* SDRDAEMON_WEBAPI_WEBAPIREQUESTMAPPER_H_ */ | ||||
							
								
								
									
										67
									
								
								sdrdaemon/webapi/webapiserver.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								sdrdaemon/webapi/webapiserver.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,67 @@ | ||||
| ///////////////////////////////////////////////////////////////////////////////////
 | ||||
| // Copyright (C) 2018 Edouard Griffiths, F4EXB.                                  //
 | ||||
| //                                                                               //
 | ||||
| // SDRdaemon Swagger server adapter interface                                    //
 | ||||
| //                                                                               //
 | ||||
| // 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                  //
 | ||||
| //                                                                               //
 | ||||
| // 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 <QCoreApplication> | ||||
| 
 | ||||
| #include "httplistener.h" | ||||
| #include "webapirequestmapper.h" | ||||
| #include "webapiserver.h" | ||||
| 
 | ||||
| namespace SDRDaemon { | ||||
| 
 | ||||
| WebAPIServer::WebAPIServer(const QString& host, uint16_t port, WebAPIRequestMapper *requestMapper) : | ||||
|     m_requestMapper(requestMapper), | ||||
|     m_listener(0) | ||||
| { | ||||
|     m_settings.host = host; | ||||
|     m_settings.port = port; | ||||
| } | ||||
| 
 | ||||
| WebAPIServer::~WebAPIServer() | ||||
| { | ||||
|     if (m_listener) { delete m_listener; } | ||||
| } | ||||
| 
 | ||||
| void WebAPIServer::start() | ||||
| { | ||||
|     if (!m_listener) | ||||
|     { | ||||
|         m_listener = new qtwebapp::HttpListener(m_settings, m_requestMapper, qApp); | ||||
|         qInfo("WebAPIServer::start: starting web API server at http://%s:%d", qPrintable(m_settings.host), m_settings.port); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void WebAPIServer::stop() | ||||
| { | ||||
|     if (m_listener) | ||||
|     { | ||||
|         delete m_listener; | ||||
|         m_listener = 0; | ||||
|         qInfo("WebAPIServer::stop: stopped web API server at http://%s:%d", qPrintable(m_settings.host), m_settings.port); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void WebAPIServer::setHostAndPort(const QString& host, uint16_t port) | ||||
| { | ||||
|     stop(); | ||||
|     m_settings.host = host; | ||||
|     m_settings.port = port; | ||||
|     m_listener = new qtwebapp::HttpListener(m_settings, m_requestMapper, qApp); | ||||
| } | ||||
| 
 | ||||
| } // namespace SDRdaemon
 | ||||
							
								
								
									
										56
									
								
								sdrdaemon/webapi/webapiserver.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								sdrdaemon/webapi/webapiserver.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,56 @@ | ||||
| ///////////////////////////////////////////////////////////////////////////////////
 | ||||
| // Copyright (C) 2018 Edouard Griffiths, F4EXB.                                  //
 | ||||
| //                                                                               //
 | ||||
| // SDRdaemon Swagger server adapter interface                                    //
 | ||||
| //                                                                               //
 | ||||
| // 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                  //
 | ||||
| //                                                                               //
 | ||||
| // 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/>.          //
 | ||||
| ///////////////////////////////////////////////////////////////////////////////////
 | ||||
| 
 | ||||
| #ifndef SDRDAEMON_WEBAPI_WEBAPISERVER_H_ | ||||
| #define SDRDAEMON_WEBAPI_WEBAPISERVER_H_ | ||||
| 
 | ||||
| #include <QString> | ||||
| #include "export.h" | ||||
| 
 | ||||
| namespace qtwebapp | ||||
| { | ||||
|     class HttpListener; | ||||
|     class HttpListenerSettings; | ||||
| } | ||||
| 
 | ||||
| namespace SDRDaemon { | ||||
| 
 | ||||
| class WebAPIRequestMapper; | ||||
| 
 | ||||
| class SDRBASE_API WebAPIServer | ||||
| { | ||||
| public: | ||||
|     WebAPIServer(const QString& host, uint16_t port, WebAPIRequestMapper *requestMapper); | ||||
|     ~WebAPIServer(); | ||||
| 
 | ||||
|     void start(); | ||||
|     void stop(); | ||||
| 
 | ||||
|     void setHostAndPort(const QString& host, uint16_t port); | ||||
|     const QString& getHost() const { return m_settings.host; } | ||||
|     int getPort() const { return m_settings.port; } | ||||
| 
 | ||||
| private: | ||||
|     WebAPIRequestMapper *m_requestMapper; | ||||
|     qtwebapp::HttpListener *m_listener; | ||||
|     qtwebapp::HttpListenerSettings m_settings; | ||||
| }; | ||||
| 
 | ||||
| } // namespace SDRdaemon
 | ||||
| 
 | ||||
| #endif /* SDRDAEMON_WEBAPI_WEBAPISERVER_H_ */ | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user