From 15453b75287cdaeba34a69f00662f82441901702 Mon Sep 17 00:00:00 2001
From: f4exb <f4exb06@gmail.com>
Date: Thu, 21 Dec 2017 00:23:36 +0100
Subject: [PATCH] Server: Web API: implemented /sdrangel/preset POST

---
 sdrgui/webapi/webapiadaptergui.cpp |  4 +--
 sdrsrv/webapi/webapiadaptersrv.cpp | 58 +++++++++++++++++++++++++++++-
 sdrsrv/webapi/webapiadaptersrv.h   |  5 +++
 3 files changed, 64 insertions(+), 3 deletions(-)

diff --git a/sdrgui/webapi/webapiadaptergui.cpp b/sdrgui/webapi/webapiadaptergui.cpp
index 4c7f983e7..239e3006f 100644
--- a/sdrgui/webapi/webapiadaptergui.cpp
+++ b/sdrgui/webapi/webapiadaptergui.cpp
@@ -433,7 +433,7 @@ int WebAPIAdapterGUI::instancePresetPut(
     SWGSDRangel::SWGPresetIdentifier *presetIdentifier = query.getPreset();
     int nbDeviceSets = m_mainWindow.m_deviceUIs.size();
 
-    if (deviceSetIndex > nbDeviceSets)
+    if (deviceSetIndex >= nbDeviceSets)
     {
         *error.getMessage() = QString("There is no device set at index %1. Number of device sets is %2").arg(deviceSetIndex).arg(nbDeviceSets);
         return 404;
@@ -489,7 +489,7 @@ int WebAPIAdapterGUI::instancePresetPost(
     SWGSDRangel::SWGPresetIdentifier *presetIdentifier = query.getPreset();
     int nbDeviceSets = m_mainWindow.m_deviceUIs.size();
 
-    if (deviceSetIndex > nbDeviceSets)
+    if (deviceSetIndex >= nbDeviceSets)
     {
         *error.getMessage() = QString("There is no device set at index %1. Number of device sets is %2").arg(deviceSetIndex).arg(nbDeviceSets);
         return 404;
diff --git a/sdrsrv/webapi/webapiadaptersrv.cpp b/sdrsrv/webapi/webapiadaptersrv.cpp
index 1f198ecfa..2bb365ebe 100644
--- a/sdrsrv/webapi/webapiadaptersrv.cpp
+++ b/sdrsrv/webapi/webapiadaptersrv.cpp
@@ -548,7 +548,7 @@ int WebAPIAdapterSrv::instancePresetPut(
     SWGSDRangel::SWGPresetIdentifier *presetIdentifier = query.getPreset();
     int nbDeviceSets = m_mainCore.m_deviceSets.size();
 
-    if (deviceSetIndex > nbDeviceSets)
+    if (deviceSetIndex >= nbDeviceSets)
     {
         *error.getMessage() = QString("There is no device set at index %1. Number of device sets is %2").arg(deviceSetIndex).arg(nbDeviceSets);
         return 404;
@@ -595,6 +595,62 @@ int WebAPIAdapterSrv::instancePresetPut(
     return 200;
 }
 
+int WebAPIAdapterSrv::instancePresetPost(
+        SWGSDRangel::SWGPresetTransfer& query,
+        SWGSDRangel::SWGPresetIdentifier& response,
+        SWGSDRangel::SWGErrorResponse& error)
+{
+    int deviceSetIndex = query.getDeviceSetIndex();
+    SWGSDRangel::SWGPresetIdentifier *presetIdentifier = query.getPreset();
+    int nbDeviceSets = m_mainCore.m_deviceSets.size();
+
+    if (deviceSetIndex >= nbDeviceSets)
+    {
+        *error.getMessage() = QString("There is no device set at index %1. Number of device sets is %2").arg(deviceSetIndex).arg(nbDeviceSets);
+        return 404;
+    }
+
+    DeviceSet *deviceSet = m_mainCore.m_deviceSets[deviceSetIndex];
+    int deviceCenterFrequency = 0;
+
+    if (deviceSet->m_deviceSourceEngine) { // Rx
+        deviceCenterFrequency = deviceSet->m_deviceSourceEngine->getSource()->getCenterFrequency();
+    } else if (deviceSet->m_deviceSinkEngine) { // Tx
+        deviceCenterFrequency = deviceSet->m_deviceSinkEngine->getSink()->getCenterFrequency();
+    } else {
+        *error.getMessage() = QString("Unknown device in device set (not Rx nor Tx)");
+        return 500;
+    }
+
+    const Preset *selectedPreset = m_mainCore.m_settings.getPreset(*presetIdentifier->getGroupName(),
+            deviceCenterFrequency,
+            *presetIdentifier->getName());
+
+    if (selectedPreset == 0) // save on a new preset
+    {
+        selectedPreset = m_mainCore.m_settings.newPreset(*presetIdentifier->getGroupName(), *presetIdentifier->getName());
+    }
+    else
+    {
+        *error.getMessage() = QString("Preset already exists [%1, %2, %3]")
+                .arg(*presetIdentifier->getGroupName())
+                .arg(deviceCenterFrequency)
+                .arg(*presetIdentifier->getName());
+        return 409;
+    }
+
+    MainCore::MsgSavePreset *msg = MainCore::MsgSavePreset::create(const_cast<Preset*>(selectedPreset), deviceSetIndex, true);
+    m_mainCore.m_inputMessageQueue.push(msg);
+
+    response.init();
+    response.setCenterFrequency(selectedPreset->getCenterFrequency());
+    *response.getGroupName() = selectedPreset->getGroup();
+    *response.getType() = selectedPreset->isSourcePreset() ? "R" : "T";
+    *response.getName() = selectedPreset->getDescription();
+
+    return 200;
+}
+
 int WebAPIAdapterSrv::instanceDeviceSetsPost(
         bool tx,
         SWGSDRangel::SWGSuccessResponse& response,
diff --git a/sdrsrv/webapi/webapiadaptersrv.h b/sdrsrv/webapi/webapiadaptersrv.h
index f06d13c81..24d373448 100644
--- a/sdrsrv/webapi/webapiadaptersrv.h
+++ b/sdrsrv/webapi/webapiadaptersrv.h
@@ -103,6 +103,11 @@ public:
             SWGSDRangel::SWGPresetIdentifier& response,
             SWGSDRangel::SWGErrorResponse& error);
 
+    virtual int instancePresetPost(
+            SWGSDRangel::SWGPresetTransfer& query,
+            SWGSDRangel::SWGPresetIdentifier& response,
+            SWGSDRangel::SWGErrorResponse& error);
+
     virtual int instanceDeviceSetsPost(
             bool tx,
             SWGSDRangel::SWGSuccessResponse& response,