- ActionExecutorFactory generates execution id on each executors.
- Execute() of TIDL interface returns execution id.
- The execution id passed on ActionReplyCb.
Signed-off-by: Sangyoon Jang <jeremy.jang@samsung.com>
class DefaultActionExecutor : public common::AbstractActionExecutor {
public:
- explicit DefaultActionExecutor() : AbstractActionExecutor("") {}
+ explicit DefaultActionExecutor() : AbstractActionExecutor("", -1) {}
~DefaultActionExecutor() = default;
int Execute(const common::ActionModel& model) override {
switch (model.GetType()) {
case common::ActionType::AppControl:
return std::make_unique<action::AppControlExecutor>(std::move(instance),
+ GenerateExecutionId(),
model);
case common::ActionType::Plugin:
- return std::make_unique<action::PluginExecutor>(std::move(instance));
+ return std::make_unique<action::PluginExecutor>(std::move(instance),
+ GenerateExecutionId());
default:
return std::make_unique<DefaultActionExecutor>();
}
}
+int ActionExecutorFactory::GenerateExecutionId() {
+ static int id = 0;
+ return ++id;
+}
+
} // namespace action
static std::unique_ptr<common::AbstractActionExecutor> CreateExecutor(
std::string instance,
const common::ActionModel& model);
+
+ private:
+ static int GenerateExecutionId();
};
} // namespace action
auto executor = ActionExecutorFactory::CreateExecutor(instance, model);
executor->SetResultHandler(this);
- int ret = executor->Execute(model);
+ int execution_id = executor->Execute(model);
executors_.emplace_back(std::move(executor));
- return ret;
+ return execution_id;
} catch (const std::runtime_error& e) {
LOG(ERROR) << "Failed to execute action : " << e.what();
return -1;
}
void ActionRequestHandler::OnResult(const std::string& requester,
+ int execution_id,
const std::string& result) {
- LOG(DEBUG) << "OnResult : " << result << ", from : " << requester;
+ LOG(DEBUG) << "OnResult : " << result << ", from : " << requester
+ << ", execution_id : " << execution_id;
auto it = std::find_if(reply_handlers_.begin(), reply_handlers_.end(),
[requester](const auto& iterator) {
return iterator.first == requester;
});
if (it != reply_handlers_.end())
- it->second->SendRequestReply(result);
+ it->second->SendRequestReply(execution_id, result);
else
LOG(WARNING) << "No handler found for requester :" << requester;
}
void UnregisterRequestReplyHandler(const std::string& requester) override;
void OnResult(const std::string& requester,
+ int execution_id,
const std::string& result) override;
private:
namespace action {
-AppControlExecutor::AppControlExecutor(std::string id,
+AppControlExecutor::AppControlExecutor(std::string id, int execution_id,
const common::ActionModel& model)
- : common::AbstractActionExecutor(std::move(id)) {
+ : common::AbstractActionExecutor(std::move(id), execution_id) {
model_ = model;
app_control_ = ConvertToAppControl(model);
}
return -1;
}
- return 0;
+ return GetExecutionId();
}
void AppControlExecutor::OnAppControlReply(const std::string& reply) {
- // TODO: Handle reply
- LOG(DEBUG) << "reply from instance: " << GetId() << ", reply: " << reply;
+ LOG(DEBUG) << "reply from instance: " << GetRequesterId()
+ << ", reply: " << reply;
NotifyResult(reply);
}
class AppControlExecutor : public common::AbstractActionExecutor {
public:
- explicit AppControlExecutor(std::string id, const common::ActionModel& model);
+ explicit AppControlExecutor(std::string id, int execution_id,
+ const common::ActionModel& model);
~AppControlExecutor();
int Execute(const common::ActionModel& model) override;
PluginExecutor* executor_ = nullptr;
};
-PluginExecutor::PluginExecutor(std::string id)
- : AbstractActionExecutor(std::move(id)),
+PluginExecutor::PluginExecutor(std::string id, int execution_id)
+ : AbstractActionExecutor(std::move(id), execution_id),
plugin_manager_(
this,
"d::org.tizen.appfw.service.tizen_action_plugin_manager") {}
return -1;
}
- return 0;
+ return GetExecutionId();
}
void PluginExecutor::OnResultReceived(const std::string& result) {
- LOG(DEBUG) << "result from instance: " << GetId() << ", result: " << result;
+ LOG(DEBUG) << "result from instance: " << GetRequesterId()
+ << ", result: " << result;
NotifyResult(result);
}
public rpc_port::plugin_manager_proxy::proxy::
PluginManager::IEventListener {
public:
- explicit PluginExecutor(std::string instance);
+ explicit PluginExecutor(std::string instance, int execution_id);
~PluginExecutor();
int Execute(const common::ActionModel& model) override;
void OnResultReceived(const std::string& result);
class IRequestReplyHandler {
public:
virtual ~IRequestReplyHandler() = default;
- virtual void SendRequestReply(const std::string& reply) = 0;
+ virtual void SendRequestReply(int execution_id, const std::string& reply) = 0;
};
} // namespace action
}
}
-void Service::SendRequestReply(const std::string& reply) {
+void Service::SendRequestReply(int execution_id, const std::string& reply) {
for (const auto& cb : reply_cbs_)
- cb->Invoke(reply);
+ cb->Invoke(execution_id, reply);
}
} // namespace action
int Execute(rpc::ActionModel action) override;
int RegisterActionReplyCb(std::unique_ptr<ActionReplyCb> cb) override;
bool UnregisterActionReplyCb(int id) override;
- void SendRequestReply(const std::string& reply) override;
+ void SendRequestReply(int execution_id, const std::string& reply) override;
private:
IRequestHandler& handler_;
Reply(action_result_cb cb, void* user_data)
: cb_(cb), user_data_(user_data) {}
- void OnReceived(std::string result) {
+ void OnReceived(int execution_id, std::string result) {
LOG(WARNING) << "@@@ reply OnReceived : " << result;
cb_(100, result.c_str(), user_data_);
class AbstractActionExecutor {
public:
- explicit AbstractActionExecutor(std::string id) : id_(std::move(id)) {}
+ explicit AbstractActionExecutor(std::string requester_id, int execution_id)
+ : requester_id_(std::move(requester_id)), execution_id_(execution_id) {}
virtual ~AbstractActionExecutor() = default;
virtual int Execute(const ActionModel& model) = 0;
- std::string GetId() { return id_; }
+ std::string GetRequesterId() { return requester_id_; }
void SetResultHandler(IActionResultHandler* handler) { handler_ = handler; }
void NotifyResult(const std::string& result) {
- handler_->OnResult(id_, result);
+ handler_->OnResult(requester_id_, execution_id_, result);
}
+ int GetExecutionId() { return execution_id_; }
private:
- std::string id_;
+ std::string requester_id_;
+ int execution_id_;
IActionResultHandler* handler_ = nullptr;
};
class IActionResultHandler {
public:
virtual ~IActionResultHandler() = default;
- virtual void OnResult(const std::string& executor_id,
+ virtual void OnResult(const std::string& executor_id, int execution_id,
const std::string& result) = 0;
};
ActionSchema GetAction(string action_id);
array<VectorDbResult> GetActionId(string user_description, int top_k, float search_threshold);
int Execute(ActionModel action);
- void ActionReplyCb(string result) delegate;
+ void ActionReplyCb(int execution_id, string result) delegate;
int RegisterActionReplyCb(ActionReplyCb cb);
bool UnregisterActionReplyCb(int id);
}
using ActionReplyCb = rpc::proxy::ActionService::ActionReplyCb;
class Reply : public ActionReplyCb {
public:
- void OnReceived(std::string result) {
- _I("result : %s", result.c_str());
+ void OnReceived(int execution_id, std::string result) {
+ _I("execution_id: %d, result : %s", execution_id, result.c_str());
g_main_loop_quit(mainloop);
}
};