libaurum: apply smart pointer wider and extract impl out
[platform/core/uifw/aurum.git] / org.tizen.aurum-bootstrap / src / Commands / FindElementCommand.cc
1 #include "FindElementCommand.h"
2
3 #include "ISearchable.h"
4
5 #include "Sel.h"
6 #include "UiDevice.h"
7 #include "UiObject.h"
8 #include "UiSelector.h"
9
10 #include <loguru.hpp>
11
12 FindElementCommand::FindElementCommand(const ::aurum::ReqFindElement* request,
13                                        ::aurum::RspFindElement*       response)
14     : mRequest{request}, mResponse{response}
15 {
16     mObjMap = ObjectMapper::getInstance();
17 }
18 std::shared_ptr<ISearchable> FindElementCommand::getSearchableTop(void)
19 {
20     std::shared_ptr<ISearchable> searchableObj{nullptr};
21
22     if (mRequest->_automationid_case() != 0) {
23         searchableObj = mObjMap->getElement(mRequest->elementid());
24     }
25     if (!searchableObj) searchableObj = UiDevice::getInstance();
26
27     return searchableObj;
28 }
29
30 std::vector<std::shared_ptr<UiSelector>> FindElementCommand::getSelectors(void)
31 {
32     auto sel = std::make_shared<UiSelector>();
33
34     if(mRequest->_automationid_case())    sel->id(mRequest->automationid());
35     if(mRequest->_textfield_case())       sel->text(mRequest->textfield());
36     if(mRequest->_widgettype_case())      sel->type(mRequest->widgettype());
37     if(mRequest->_widgetstyle_case())     sel->style(mRequest->widgetstyle());
38     if(mRequest->_ischecked_case())       sel->isChecked(mRequest->ischecked());
39     if(mRequest->_ischeckable_case())     sel->isCheckable(mRequest->ischeckable());
40     if(mRequest->_isclickable_case())     sel->isClickable(mRequest->isclickable());
41     if(mRequest->_isenabled_case())       sel->isEnabled(mRequest->isenabled());
42     if(mRequest->_isfocused_case())       sel->isFocused(mRequest->isfocused());
43     if(mRequest->_isfocusable_case())     sel->isFocusable(mRequest->isfocusable());
44     if(mRequest->_isscrollable_case())    sel->isScrollable(mRequest->isscrollable());
45     if(mRequest->_isselected_case())      sel->isSelected(mRequest->isselected());
46     if(mRequest->_isshowing_case())       sel->isShowing(mRequest->isshowing());
47     if(mRequest->_isactive_case())        sel->isActive(mRequest->isactive());
48     if(mRequest->_mindepth_case())        sel->minDepth(mRequest->mindepth());
49     if(mRequest->_maxdepth_case())        sel->maxDepth(mRequest->maxdepth());
50
51     return std::vector<std::shared_ptr<UiSelector>>{sel};
52 }
53
54 ::grpc::Status FindElementCommand::execute()
55 {
56     LOG_SCOPE_F(INFO, "findElement --------------- ");
57     auto searchableObj = getSearchableTop();
58     auto selectors     = getSelectors();
59
60     std::vector<std::shared_ptr<UiObject>> founds = {};
61
62     for ( auto &sel : selectors ) {
63         auto ret = searchableObj->findObjects(sel);
64         std::move(std::begin(ret), std::end(ret), std::back_inserter(founds));
65     }
66
67     if (founds.size() > 0) {
68         for (auto& found : founds) {
69             UiObject*   obj = found.get();
70             std::string key = mObjMap->addElement(std::move(found));
71             LOG_F(INFO, "found object : %s key:%s",
72                   obj->getResourceName().c_str(), key.c_str());
73             ::aurum::Element* elm = mResponse->add_elements();
74             elm->set_elementid(key);
75         }
76         mResponse->set_status(::aurum::RspStatus::OK);
77     }
78
79     return grpc::Status::OK;
80 }