compare the backend's version with the plugin's version
此提交包含在:
@@ -7,6 +7,8 @@
|
|||||||
# Brief:
|
# Brief:
|
||||||
# Creates the plug-in which is used by Euroscope
|
# Creates the plug-in which is used by Euroscope
|
||||||
|
|
||||||
|
ADD_DEFINITIONS(-DCURL_STATICLIB)
|
||||||
|
|
||||||
# define the Google Protobuf-files
|
# define the Google Protobuf-files
|
||||||
SET(PROTO_FILES
|
SET(PROTO_FILES
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/com/protobuf/Aircraft.proto
|
${CMAKE_CURRENT_SOURCE_DIR}/com/protobuf/Aircraft.proto
|
||||||
@@ -86,8 +88,8 @@ ADD_LIBRARY(
|
|||||||
|
|
||||||
# define the dependencies
|
# define the dependencies
|
||||||
TARGET_INCLUDE_DIRECTORIES(ArrivalMANager INTERFACE EuroScope)
|
TARGET_INCLUDE_DIRECTORIES(ArrivalMANager INTERFACE EuroScope)
|
||||||
TARGET_LINK_LIBRARIES(ArrivalMANager EuroScope GSL Shlwapi)
|
TARGET_LINK_LIBRARIES(ArrivalMANager EuroScope libcurl GSL Shlwapi)
|
||||||
TARGET_LINK_LIBRARIES(ArrivalMANager cppzmq protobuf)
|
TARGET_LINK_LIBRARIES(ArrivalMANager cppzmq protobuf jsoncpp)
|
||||||
|
|
||||||
# configure the debugger and update the linker flags
|
# configure the debugger and update the linker flags
|
||||||
IF(MSVC)
|
IF(MSVC)
|
||||||
|
|||||||
@@ -17,6 +17,9 @@
|
|||||||
|
|
||||||
#include <aman/com/BackendReceiver.h>
|
#include <aman/com/BackendReceiver.h>
|
||||||
#include <aman/com/BackendNotification.h>
|
#include <aman/com/BackendNotification.h>
|
||||||
|
#include <curl/curl.h>
|
||||||
|
#include <json/json.h>
|
||||||
|
|
||||||
#include <aman/config/CommunicationFileFormat.h>
|
#include <aman/config/CommunicationFileFormat.h>
|
||||||
#include <aman/config/IdentifierFileFormat.h>
|
#include <aman/config/IdentifierFileFormat.h>
|
||||||
#include <aman/helper/String.h>
|
#include <aman/helper/String.h>
|
||||||
@@ -28,6 +31,16 @@ EXTERN_C IMAGE_DOS_HEADER __ImageBase;
|
|||||||
|
|
||||||
using namespace aman;
|
using namespace aman;
|
||||||
|
|
||||||
|
static std::string __receivedAmanData;
|
||||||
|
|
||||||
|
static std::size_t receiveCurl(void* ptr, std::size_t size, std::size_t nmemb, void* stream) {
|
||||||
|
(void)stream;
|
||||||
|
|
||||||
|
std::string serverResult = static_cast<char*>(ptr);
|
||||||
|
__receivedAmanData += serverResult;
|
||||||
|
return size * nmemb;
|
||||||
|
}
|
||||||
|
|
||||||
PlugIn::PlugIn() :
|
PlugIn::PlugIn() :
|
||||||
EuroScopePlugIn::CPlugIn(EuroScopePlugIn::COMPATIBILITY_CODE,
|
EuroScopePlugIn::CPlugIn(EuroScopePlugIn::COMPATIBILITY_CODE,
|
||||||
PLUGIN_NAME,
|
PLUGIN_NAME,
|
||||||
@@ -37,7 +50,10 @@ PlugIn::PlugIn() :
|
|||||||
m_configuration(),
|
m_configuration(),
|
||||||
m_screen(),
|
m_screen(),
|
||||||
m_updateQueueLock(),
|
m_updateQueueLock(),
|
||||||
m_updateQueue() {
|
m_updateQueue(),
|
||||||
|
m_compatible(false),
|
||||||
|
m_airportsLock(),
|
||||||
|
m_airports() {
|
||||||
GOOGLE_PROTOBUF_VERIFY_VERSION;
|
GOOGLE_PROTOBUF_VERIFY_VERSION;
|
||||||
|
|
||||||
this->DisplayUserMessage(PLUGIN_NAME, "INFO", (std::string("Loaded ") + PLUGIN_NAME + " " + PLUGIN_VERSION).c_str(), true, true, false, false, false);
|
this->DisplayUserMessage(PLUGIN_NAME, "INFO", (std::string("Loaded ") + PLUGIN_NAME + " " + PLUGIN_VERSION).c_str(), true, true, false, false, false);
|
||||||
@@ -75,6 +91,7 @@ PlugIn::PlugIn() :
|
|||||||
BackendNotification::instance().deinitialize();
|
BackendNotification::instance().deinitialize();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
this->validateBackendData();
|
||||||
}
|
}
|
||||||
|
|
||||||
PlugIn::~PlugIn() noexcept {
|
PlugIn::~PlugIn() noexcept {
|
||||||
@@ -84,6 +101,78 @@ PlugIn::~PlugIn() noexcept {
|
|||||||
google::protobuf::ShutdownProtobufLibrary();
|
google::protobuf::ShutdownProtobufLibrary();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PlugIn::validateBackendData() {
|
||||||
|
std::string url = "http://" + this->m_configuration.address + ":5000/aman/airports";
|
||||||
|
CURL* curl = curl_easy_init();
|
||||||
|
CURLcode result;
|
||||||
|
|
||||||
|
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
|
||||||
|
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
|
||||||
|
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
|
||||||
|
curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, static_cast<long>(CURL_HTTP_VERSION_1_1));
|
||||||
|
curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L);
|
||||||
|
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 0L);
|
||||||
|
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, receiveCurl);
|
||||||
|
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 2L);
|
||||||
|
|
||||||
|
struct curl_slist* headers = nullptr;
|
||||||
|
headers = curl_slist_append(headers, "Accept: */*");
|
||||||
|
headers = curl_slist_append(headers, "Content-Type: application/json");
|
||||||
|
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
|
||||||
|
|
||||||
|
__receivedAmanData.clear();
|
||||||
|
|
||||||
|
result = curl_easy_perform(curl);
|
||||||
|
std::lock_guard guard(this->m_airportsLock);
|
||||||
|
this->m_airports.clear();
|
||||||
|
this->m_compatible = false;
|
||||||
|
|
||||||
|
if (CURLE_OK != result) {
|
||||||
|
MessageBoxA(nullptr, "Unable to receive backend information", "AMAN-Error", MB_OK);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* validate the json data */
|
||||||
|
Json::Value root;
|
||||||
|
Json::CharReaderBuilder builder;
|
||||||
|
std::unique_ptr<Json::CharReader> reader(builder.newCharReader());
|
||||||
|
if (false == reader->parse(__receivedAmanData.c_str(), __receivedAmanData.c_str() + __receivedAmanData.length(), &root, nullptr)) {
|
||||||
|
MessageBoxA(nullptr, "Received invalid backend data", "AMAN-Error", MB_OK);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<std::string> airports;
|
||||||
|
std::string version;
|
||||||
|
for (auto it = root.begin(); root.end() != it; ++it) {
|
||||||
|
if ("version" == it.key().asString()) {
|
||||||
|
version = it->asString();
|
||||||
|
}
|
||||||
|
else if ("airports" == it.key().asString() && true == it->isArray()) {
|
||||||
|
auto airportArray = *it;
|
||||||
|
|
||||||
|
airports.reserve(airportArray.size());
|
||||||
|
for (auto i = 0; i < airportArray.size(); ++i)
|
||||||
|
airports.push_back(airportArray[i].asString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* invalid version or airports info */
|
||||||
|
auto entries = String::splitString(version, ".");
|
||||||
|
if (3 != entries.size() || 0 == airports.size()) {
|
||||||
|
MessageBoxA(nullptr, "Unable to receive backend information", "AMAN-Error", MB_OK);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* incompatible communication version */
|
||||||
|
if (PLUGIN_MAJOR_VERSION != std::atoi(entries[0].c_str()) || PLUGIN_MINOR_VERSION != std::atoi(entries[1].c_str())) {
|
||||||
|
MessageBoxA(nullptr, "Plugin version is outdated. An update is required", "AMAN-Error", MB_OK);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this->m_airports = airports;
|
||||||
|
this->m_compatible = true;
|
||||||
|
}
|
||||||
|
|
||||||
EuroScopePlugIn::CRadarScreen* PlugIn::OnRadarScreenCreated(const char* displayName, bool needsRadarContent, bool geoReferenced,
|
EuroScopePlugIn::CRadarScreen* PlugIn::OnRadarScreenCreated(const char* displayName, bool needsRadarContent, bool geoReferenced,
|
||||||
bool canBeSaved, bool canBeCreated) {
|
bool canBeSaved, bool canBeCreated) {
|
||||||
std::ignore = needsRadarContent;
|
std::ignore = needsRadarContent;
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ namespace aman {
|
|||||||
enum class TagItemElement {
|
enum class TagItemElement {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void validateBackendData();
|
||||||
aman::Aircraft* generateAircraftMessage(const EuroScopePlugIn::CRadarTarget& target);
|
aman::Aircraft* generateAircraftMessage(const EuroScopePlugIn::CRadarTarget& target);
|
||||||
void generateAircraftReportMessage(const EuroScopePlugIn::CRadarTarget& radarTarget, aman::AircraftReport* report);
|
void generateAircraftReportMessage(const EuroScopePlugIn::CRadarTarget& radarTarget, aman::AircraftReport* report);
|
||||||
|
|
||||||
@@ -48,6 +49,9 @@ namespace aman {
|
|||||||
std::shared_ptr<RadarScreen> m_screen;
|
std::shared_ptr<RadarScreen> m_screen;
|
||||||
std::mutex m_updateQueueLock;
|
std::mutex m_updateQueueLock;
|
||||||
std::list<std::string> m_updateQueue;
|
std::list<std::string> m_updateQueue;
|
||||||
|
bool m_compatible;
|
||||||
|
std::mutex m_airportsLock;
|
||||||
|
std::vector<std::string> m_airports;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
|
|||||||
新增問題並參考
封鎖使用者