*/
#include <regex>
-
+#include <ilm/ilm_control.h>
+#include <stdlib.h>
+#include "wm_client.hpp"
#include "wm_layer.hpp"
#include "json_helper.hpp"
#include "util.hpp"
using std::string;
using std::vector;
+using std::unordered_map;
namespace wm
{
LayerState::LayerState()
- : _ivi_layer_id_list(),
- area2ivi_layer_id()
+ : render_order(),
+ area2appid()
{}
-LayerSetting::LayerSetting(const string& name, MANAGEMENT_TYPE type, unsigned begin, unsigned end)
- : name(name), type(type),
- role_list(), area_list(), id_list(),
- id_begin(begin), id_end(end)
-{}
-void LayerSetting::appendRole(const string& role)
+void LayerState::attachIdToArea(const string& area, const WMClient& client)
{
- this->role_list.push_back(role);
+ this->area2appid[area] = client.appID();
+ this->render_order.push_back(client.layerID());
}
-void LayerSetting::appendArea(const string& area)
+const unordered_map<string, string> LayerState::popCurrentState()
{
- this->area_list.push_back(area);
+ unordered_map<string, string> tmp = this->area2appid;
+ this->area2appid.clear();
+ this->render_order.clear();
+ return tmp;
+}
+
+const unordered_map<string, string> LayerState::getCurrentState()
+{
+ return this->area2appid;
+}
+
+const vector<unsigned> LayerState::getIviIdList()
+{
+ return this->render_order;
+}
+
+void LayerState::addLayer(unsigned layer)
+{
+ this->render_order.push_back(layer);
+}
+
+void LayerState::removeLayer(unsigned layer)
+{
+ auto fwd_itr = std::remove_if(
+ this->render_order.begin(), this->render_order.end(),
+ [layer](unsigned elm) {
+ return elm == layer;
+ }
+ );
+ this->render_order.erase(fwd_itr, this->render_order.end());
+}
+
+void LayerState::setArea(const string& app, const string& area)
+{
+ this->area2appid[area] = app;
+}
+
+WMLayer::WMLayer(json_object* j) : before_state(), state()
+{
+ this->name = jh::getStringFromJson(j, "name");
+ this->role_list = jh::getStringFromJson(j, "role");
+ const char* type = jh::getStringFromJson(j, "type");
+ this->id_begin = static_cast<unsigned>(jh::getIntFromJson(j, "id_range_begin"));
+ this->id_end = static_cast<unsigned>(jh::getIntFromJson(j, "id_range_end"));
+
+ if (name.size() == 0 || type || this->id_begin == 0 || this->id_end == 0)
+ {
+ HMI_ERROR("Parse Error!!");
+ exit(1);
+ }
+ if(this->id_begin > this->id_end)
+ {
+ HMI_ERROR("INVALID");
+ exit(1);
+ }
+ string str_type = type;
+ this->type = (str_type == "tile") ? MANAGEMENT_TYPE::TILE : MANAGEMENT_TYPE::STACK;
}
-unsigned LayerSetting::getNewLayerID(const string& role)
+unsigned WMLayer::getNewLayerID(const string& role)
{
unsigned ret = 0;
- auto found = std::find(role_list.cbegin(), role_list.cend(), role);
- if(found == role_list.cend())
+
+ // generate new layer id;
+ if(this->hasRole(role))
+ {
+ ret = this->id_list.back() + 1;
+ HMI_INFO("Generate new id: %d", ret);
+ }
+ else
{
return ret;
}
- // generate new ivi layer id
- ret = id_list.back() + 1;
- HMI_INFO("generate ivi_layer_id : %d on the layer: %s", ret, this->name.c_str());
auto id_found = std::find(id_list.begin(), id_list.end(), ret);
if( (ret > this->idEnd()) || (id_found != id_list.cend()) )
{
HMI_NOTICE("id %d is not available then generate new id", ret);
- ret = 0;
+ ret = 0; // reset
for(unsigned i = this->idBegin(); i < this->idEnd(); i++)
{
auto ret_found = std::find(id_list.begin(), id_list.end(), i);
return ret;
}
-void LayerSetting::removeLayerID(unsigned id)
+const string& WMLayer::layerName()
+{
+ return this->name;
+}
+
+WMError WMLayer::setLayerState(const LayerState& l)
+{
+ this->before_state = l;
+ return WMError::SUCCESS;
+}
+
+void WMLayer::appendArea(const string& area)
+{
+ this->area_list.push_back(area);
+}
+
+void WMLayer::removeLayerID(unsigned id)
{
auto fwd_itr = std::remove_if(this->id_list.begin(), this->id_list.end(),
[id](unsigned elm) {
this->id_list.erase(fwd_itr, this->id_list.end());
}
-WMLayer::WMLayer()
- : before_state(),
- state(),
- setting{}
+bool WMLayer::hasLayerID(unsigned id)
{
- // this->setting = std::make_unique<LayerSetting>(name, type, begin, end);
+ bool ret = (id > this->idBegin() && id < this->idEnd());
+ if(!ret)
+ return ret;
+ auto itr = std::find(this->id_list.begin(), this->id_list.end(), id);
+ return (itr != this->id_list.end()) ? true : false;
}
-WMLayer::WMLayer(json_object* j) : before_state(), state()
+bool WMLayer::hasRole(const string& role)
{
- LayerSetting::MANAGEMENT_TYPE t;
- const char* layer_name = jh::getStringFromJson(j, "name");
- const char* role = jh::getStringFromJson(j, "role");
- const char* type = jh::getStringFromJson(j, "type");
- int begin = jh::getIntFromJson(j, "id_range_begin");
- int end = jh::getIntFromJson(j, "id_range_end");
- string name = layer_name;
-
- if (layer_name || type || begin >=0 || end >=0)
+ auto re = std::regex(this->role_list);
+ if (std::regex_match(role, re))
{
- HMI_ERROR("Parse Error!!");
- }
- if(begin > end)
- {
- HMI_ERROR("INVALID.");
+ HMI_DEBUG("role %s matches layer %d", role.c_str(), this->name.c_str());
+ return true;
}
- string str_type = type;
- t = (type == "tile") ? LayerSetting::TILE : LayerSetting::STACK;
- this->setting = std::make_unique<LayerSetting>(name, t, begin, end);
- this->setting->appendRole(role);
+ return false;
}
-unsigned WMLayer::getNewLayerID(const std::string& role)
+/* WMError WMLayer::commitChange()
{
- return this->setting->getNewLayerID(role);
+ this->state = this->before_state;
}
-WMError WMLayer::setLayerState(const LayerState& l)
+void WMLayer::undo()
{
- return WMError::SUCCESS;
+ this->before_state = this->state;
}
-
-bool WMLayer::checkIDBelongTo(unsigned id)
-{
- return (id > this->setting->idBegin() && id < this->setting->idEnd());
-}
-
+ */
} // namespace wm