From e3a72974c6212cddcb0f170183945b3750e427a8 Mon Sep 17 00:00:00 2001 From: Adam Malinowski Date: Mon, 1 Dec 2014 12:14:35 +0100 Subject: [PATCH] Add processing cynara requests This patch introduces cynara requests handling without UI stuff. Change-Id: I5fb2158f4089c28893f59d69218a5a447c774741 --- src/agent/main/Agent.cpp | 81 +++++++++++++++++++++++++++++++++++++++---- src/agent/main/Agent.h | 17 +++++++++ src/agent/main/CynaraTalker.h | 3 +- 3 files changed, 94 insertions(+), 7 deletions(-) diff --git a/src/agent/main/Agent.cpp b/src/agent/main/Agent.cpp index d95b615..477428c 100644 --- a/src/agent/main/Agent.cpp +++ b/src/agent/main/Agent.cpp @@ -20,8 +20,13 @@ */ #include +#include +#include #include +#include +#include +#include #include "Agent.h" @@ -29,6 +34,8 @@ namespace AskUser { namespace Agent { +volatile sig_atomic_t Agent::m_stopFlag = 0; + Agent::Agent() : m_cynaraTalker([&](Request *request) -> void { requestHandler(request); }) { init(); } @@ -46,17 +53,41 @@ void Agent::init() { void Agent::run() { m_cynaraTalker.start(); - // TODO: wait for requests + while (!m_stopFlag) { + std::unique_lock lock(m_mutex); + m_event.wait(lock); + + while (!m_incomingRequests.empty()) { + Request *request = m_incomingRequests.front(); + m_incomingRequests.pop(); + lock.unlock(); + + LOGD("Request popped from queue:" + " type [" << request->type() << "]," + " id [" << request->id() << "]," + " data length [" << request->data().size() << "]"); + + if (request->type() == RT_Close) { + delete request; + m_stopFlag = 1; + break; + } + + processCynaraRequest(request); - while (true) { - sleep(1); + lock.lock(); + } + + //TODO: do sth here with available data from UIs } - LOGD("Ask user agent task stopped"); + //TODO: dismiss all threads if possible + + LOGD("Agent task stopped"); } void Agent::finish() { - // TODO: implement if needed + m_cynaraTalker.stop(); LOGD("Agent daemon has stopped commonly"); } @@ -67,7 +98,45 @@ void Agent::requestHandler(Request *request) { " id [" << request->id() << "]," " data length: [" << request->data().size() << "]"); - delete request; + std::unique_lock lock(m_mutex); + m_incomingRequests.push(request); + m_event.notify_one(); +} + +void Agent::processCynaraRequest(Request *request) { + std::unique_ptr requestPtr(request); + + auto existingRequest = m_requests.find(request->id()); + if (existingRequest != m_requests.end()) { + if (request->type() == RT_Cancel) { + delete existingRequest->second; + m_requests.erase(existingRequest); + m_cynaraTalker.sendResponse(request->type(), request->id()); + //TODO: get UI for request and dismiss or update it + } else { + LOGE("Incoming request with ID: [" << request->id() << "] is being already processed"); + } + return; + } + + if (request->type() == RT_Cancel) { + LOGE("Cancel request for unknown request: ID: [" << request->id() << "]"); + return; + } + + if (!startUIForRequest(request)) { + auto data = Translator::Agent::answerToData(Cynara::PolicyType(), AgentErrorMsg::Error); + m_cynaraTalker.sendResponse(RT_Action, request->id(), data); + return; + } + + m_requests.insert(std::make_pair(request->id(), request)); + requestPtr.release(); +} + +bool Agent::startUIForRequest(Request *request UNUSED) { + // TODO: start UI for request + return false; } } // namespace Agent diff --git a/src/agent/main/Agent.h b/src/agent/main/Agent.h index 6cfc49a..6df7c72 100644 --- a/src/agent/main/Agent.h +++ b/src/agent/main/Agent.h @@ -21,6 +21,12 @@ #pragma once +#include +#include +#include +#include +#include + #include
#include
@@ -35,13 +41,24 @@ public: void run(); + static void stop() { + m_stopFlag = 1; + } + private: CynaraTalker m_cynaraTalker; + std::map m_requests; + std::queue m_incomingRequests; + std::condition_variable m_event; + std::mutex m_mutex; + static volatile sig_atomic_t m_stopFlag; void init(); void finish(); void requestHandler(Request *request); + void processCynaraRequest(Request *request); + bool startUIForRequest(Request *request); }; } // namespace Agent diff --git a/src/agent/main/CynaraTalker.h b/src/agent/main/CynaraTalker.h index 3f45b96..c26dc28 100644 --- a/src/agent/main/CynaraTalker.h +++ b/src/agent/main/CynaraTalker.h @@ -45,7 +45,8 @@ public: bool start(); bool stop(); - bool sendResponse(RequestType requestType, RequestId requestId, const Cynara::PluginData &data); + bool sendResponse(RequestType requestType, RequestId requestId, + const Cynara::PluginData &data = Cynara::PluginData()); private: RequestHandler m_requestHandler; -- 2.7.4