class ObjectMapper {
private:
std::map<std::string, std::shared_ptr<UiObject>> mObjectMap;
- std::map<std::string, std::string> mObjectMapReverse;
unsigned long long mObjCounter;
private:
public:
static ObjectMapper *getInstance();
std::string addElement(std::shared_ptr<UiObject> object);
-
- std::shared_ptr<UiObject> getElement(const std::string key);
- std::string getElement(std::shared_ptr<UiObject> object);
-
- bool removeElement(const std::string key);
- bool removeElement(std::shared_ptr<UiObject> object);
-
+ std::shared_ptr<UiObject> getElement(const std::string elementId);
+ bool removeElement(const std::string elementId);
void cleanUp();
};
void DumpObjectTreeCommand::traverse(::aurum::Element *root, std::shared_ptr<Node> node, int depth)
{
if (!node->mNode) return;
- std::string key{};
std::shared_ptr<UiObject> obj = node->mNode;
- key = mObjMap->getElement(obj);
- if (key.length() <= 0)
- key = mObjMap->addElement(obj);
+ if (mObjMap->getElement(obj->getId()) == nullptr)
+ mObjMap->addElement(std::move(obj));
- root->set_elementid(key);
+ root->set_elementid(obj->getId());
::aurum::Rect *rect = root->mutable_geometry();
const Rect<int> &size = obj->getScreenBoundingBox();
root->set_widget_style(obj->getElementStyle());
root->set_text(obj->getText());
- root->set_id(obj->getId());
root->set_automationid(obj->getAutomationId());
root->set_package(obj->getApplicationPackage());
root->set_role(obj->getRole());
{
auto sel = std::make_shared<UiSelector>();
- if(mRequest->_automationid_case()) sel->id(mRequest->automationid());
+ if(mRequest->_elementid_case()) sel->id(mRequest->elementid());
+ if(mRequest->_automationid_case()) sel->automationid(mRequest->automationid());
if(mRequest->_textfield_case()) sel->text(mRequest->textfield());
if(mRequest->_widgettype_case()) sel->type(mRequest->widgettype());
if(mRequest->_widgetstyle_case()) sel->style(mRequest->widgetstyle());
if (founds.size() > 0) {
for (auto& found : founds) {
UiObject *obj = found.get();
- std::string key{};
- key = mObjMap->getElement(found);
- if (key.length() <= 0)
- key = mObjMap->addElement(std::move(found));
- LOGI("found object : %s key:%s",
- obj->getAutomationId().c_str(), key.c_str());
+ if (mObjMap->getElement(obj->getId()) == nullptr)
+ mObjMap->addElement(std::move(found));
+ LOGI("found object : %p elementId:%s",
+ obj, obj->getId().c_str());
+
::aurum::Element *elm = mResponse->add_elements();
- elm->set_elementid(key);
+ elm->set_elementid(obj->getId());
elm->set_package(obj->getApplicationPackage());
::aurum::Rect *rect = elm->mutable_geometry();
elm->set_widget_style(obj->getElementStyle());
elm->set_text(obj->getText());
- elm->set_id(obj->getId());
elm->set_automationid(obj->getAutomationId());
elm->set_package(obj->getApplicationPackage());
elm->set_role(obj->getRole());
#include <algorithm>
#include <sstream>
-ObjectMapper::ObjectMapper() : mObjectMap{}, mObjectMapReverse{}, mObjCounter{0} {}
+ObjectMapper::ObjectMapper() : mObjectMap{}, mObjCounter{0} {}
ObjectMapper::~ObjectMapper() {}
std::string ObjectMapper::addElement(std::shared_ptr<UiObject> object)
{
- ++mObjCounter;
- std::string key = std::to_string(mObjCounter);
- mObjectMap[key] = object;
std::string value = object->getId();
- mObjectMapReverse[value] = key;
- LOGI("addElement %p as key %s, id %s", object.get(), key.c_str(), value.c_str());
- return key;
+ mObjectMap[value] = object;
+ LOGI("addElement %p, id %s", object.get(), value.c_str());
+ return value;
}
-std::shared_ptr<UiObject> ObjectMapper::getElement(std::string key)
+std::shared_ptr<UiObject> ObjectMapper::getElement(std::string elementId)
{
- LOGI("getElement for key(%s)", key.c_str());
- unsigned long long keyCnt = (unsigned long long)std::stoll(key); // this key is a result of calling std:to_string(mObjCounter)
- if (keyCnt <= 0 || keyCnt > mObjCounter) return nullptr;
- if (mObjectMap.count(key)) {
- std::shared_ptr<UiObject> obj = mObjectMap[key];
+ LOGI("getElement for elementId(%s)", elementId.c_str());
+ if (mObjectMap.count(elementId)) {
+ std::shared_ptr<UiObject> obj = mObjectMap[elementId];
obj->refresh();
LOGI("succeeded");
return obj;
}
- LOGI("key is not exist in mObjectMap");
+ LOGI("Id(%s) is not exist in mObjectMap", elementId.c_str());
return nullptr;
}
-std::string ObjectMapper::getElement(std::shared_ptr<UiObject> object)
+bool ObjectMapper::removeElement(const std::string elementId)
{
- LOGI("getElement for object(%p)", object.get());
- std::string value = object->getId();
- if (mObjectMapReverse.count(value)) {
- LOGI("succeeded");
- return mObjectMapReverse[value];
- }
- LOGI("object is not exist in mObjectMapReverse");
- return std::string{""};
-}
-
-bool ObjectMapper::removeElement(const std::string key)
-{
- LOGI("removeElement for key(%s)", key.c_str());
- std::shared_ptr<UiObject> obj = getElement(key);
+ LOGI("removeElement for Id(%s)", elementId.c_str());
+ std::shared_ptr<UiObject> obj = getElement(elementId);
if (obj) {
- std::string value = obj->getId();
- if (mObjectMap.erase(key) && mObjectMapReverse.erase(value))
+ if (mObjectMap.erase(elementId))
return true;
}
return false;
}
-bool ObjectMapper::removeElement(std::shared_ptr<UiObject> object)
-{
- LOGI("removeElement for object(%p)", object.get());
- std::string key = getElement(object);
- if (key.empty()) return false;
- return removeElement(key);
-}
-
void ObjectMapper::cleanUp()
{
LOGI("clean up object map");
- for(auto iter = mObjectMapReverse.begin(); iter != mObjectMapReverse.end(); ) {
- auto obj = mObjectMap[iter->second];
- if (obj && !obj->isValid()) {
- iter = mObjectMapReverse.erase(iter);
- } else {
- ++iter;
- }
- }
for(auto iter = mObjectMap.begin(); iter != mObjectMap.end(); ) {
if (!iter->second->isValid()) {
iter = mObjectMap.erase(iter);