HAL
action_set_object_data.cpp
Go to the documentation of this file.
2 #include "gui/gui_globals.h"
3 
4 namespace hal
5 {
6 
8  {}
10 
12  {
13  return new ActionSetObjectData;
14  }
15 
17  : mKey(key), mCat(category), mType(type), mVal(val), mOldKey(""), mOldCat(""), mKeyOrCatModified(false)
18  {
19  }
20 
22  {
23  //for now, this action only supports setting the data of gates, modules and nets (DataContainer)
24  DataContainer* container = nullptr;
25  switch(mObject.type())
26  {
28  container = dynamic_cast<DataContainer*>(gNetlist->get_gate_by_id(mObject.id()));
29  break;
31  container = dynamic_cast<DataContainer*>(gNetlist->get_module_by_id(mObject.id()));
32  break;
34  container = dynamic_cast<DataContainer*>(gNetlist->get_net_by_id(mObject.id()));
35  break;
36  default: break;
37  }
38 
39  if(!container)
40  return false;
41 
42  //implicit modifying of an existing entry, but it must be deleted beforehand and undo action must be constructed in an appropriate way
43  if(mKeyOrCatModified)
44  {
45  if(!container->has_data(mOldCat.toStdString(), mOldKey.toStdString()))//additional security check
46  return false;
47 
48  //construct appropriate undo action
49  auto data = container->get_data(mOldCat.toStdString(), mOldKey.toStdString());
50  mUndoAction = new ActionSetObjectData(mOldCat, mOldKey, QString::fromStdString(std::get<0>(data)), QString::fromStdString(std::get<1>(data)));
52  static_cast<ActionSetObjectData*>(mUndoAction)->setChangeKeyAndOrCategory(mCat, mKey);
53 
54  //delete old, add new
55  container->delete_data(mOldCat.toStdString(), mOldKey.toStdString());
56  container->set_data(mCat.toStdString(), mKey.toStdString(), mType.toStdString(), mVal.toStdString());
57  }
58  //check if the data to set already exists (undo action is then "change back")
59  else if(container->has_data(mCat.toStdString(), mKey.toStdString()))
60  {
61  auto data = container->get_data(mCat.toStdString(), mKey.toStdString());
62  mUndoAction = new ActionSetObjectData(mCat, mKey, QString::fromStdString(std::get<0>(data)), QString::fromStdString(std::get<1>(data)));
64  container->set_data(mCat.toStdString(), mKey.toStdString(), mType.toStdString(), mVal.toStdString());
65  }
66  else //if the data does not already exists -> it is new data -> undo action deletes it (yet to come)
67  {
68  }
69 
70  return UserAction::exec();
71  }
72 
74  {
76  }
77 
79  {
80  xmlOut.writeTextElement("category", mCat);
81  xmlOut.writeTextElement("key", mKey);
82  xmlOut.writeTextElement("type", mType);
83  xmlOut.writeTextElement("value", mVal);
84  if(mKeyOrCatModified)
85  {
86  xmlOut.writeTextElement("oldCategory", mOldCat);
87  xmlOut.writeTextElement("oldKey", mOldKey);
88  }
89  }
90 
92  {
93  while(xmlIn.readNextStartElement())
94  {
95  if(xmlIn.name() == "category")
96  mCat = xmlIn.readElementText();
97  else if(xmlIn.name() == "key")
98  mKey = xmlIn.readElementText();
99  else if(xmlIn.name() == "type")
100  mType = xmlIn.readElementText();
101  else if(xmlIn.name() == "value")
102  mVal = xmlIn.readElementText();
103  else if(xmlIn.name() == "oldCategory")
104  {
105  mKeyOrCatModified = true;
106  mOldCat = xmlIn.readElementText();
107  }
108  else if(xmlIn.name() == "oldKey")
109  {
110  mKeyOrCatModified = true;
111  mOldKey = xmlIn.readElementText();
112  }
113  }
114  }
115 
117  {
118  cryptoHash.addData("cat", 3);
119  cryptoHash.addData(mCat.toUtf8());
120  cryptoHash.addData("key", 3);
121  cryptoHash.addData(mKey.toUtf8());
122  cryptoHash.addData("type", 4);
123  cryptoHash.addData(mType.toUtf8());
124  cryptoHash.addData("val", 3);
125  cryptoHash.addData(mVal.toUtf8());
126  if(mKeyOrCatModified)
127  {
128  cryptoHash.addData("oldCat", 6);
129  cryptoHash.addData(mOldCat.toUtf8());
130  cryptoHash.addData("oldKey", 6);
131  cryptoHash.addData(mOldKey.toUtf8());
132  }
133  }
134 
136  {
137  mOldKey = oldKey;
138  mOldCat = oldCategory;
139  mKeyOrCatModified = true;
140  }
141 
142 }
The ActionSetObjectDataFactory class.
static ActionSetObjectDataFactory * sFactory
UserAction * newAction() const override
QString tagname() const override
void writeToXml(QXmlStreamWriter &xmlOut) const override
void setChangeKeyAndOrCategory(QString oldCategory, QString oldKey)
void addToHash(QCryptographicHash &cryptoHash) const override
ActionSetObjectData(QString category=QString(), QString key=QString(), QString type=QString(), QString val=QString())
void readFromXml(QXmlStreamReader &xmlIn) override
std::tuple< std::string, std::string > get_data(const std::string &category, const std::string &key) const
bool set_data(const std::string &category, const std::string &key, const std::string &data_type, const std::string &value, const bool log_with_info_level=false)
bool has_data(const std::string &category, const std::string &key) const
bool delete_data(const std::string &category, const std::string &key, const bool log_with_info_level=false)
Gate * get_gate_by_id(const u32 gate_id) const
Definition: netlist.cpp:193
Module * get_module_by_id(u32 module_id) const
Definition: netlist.cpp:613
Net * get_net_by_id(u32 net_id) const
Definition: netlist.cpp:353
The UserActionFactory is the abstract base class for registration.
Definition: user_action.h:225
QString tagname() const
Definition: user_action.h:242
The UserAction class is the abstract base class for user interactions.
Definition: user_action.h:57
UserAction * mUndoAction
Definition: user_action.h:186
virtual bool exec()
Definition: user_action.cpp:23
virtual void setObject(const UserActionObject &obj)
Definition: user_action.cpp:32
UserActionObject mObject
Definition: user_action.h:183
UserActionObjectType::ObjectType type() const
Netlist * gNetlist
Definition: plugin_gui.cpp:80
PinType type
void addData(const char *data, int length)
QString fromStdString(const std::string &str)
std::string toStdString() const const
QByteArray toUtf8() const const
QStringRef name() const const
QString readElementText(QXmlStreamReader::ReadElementTextBehaviour behaviour)
bool readNextStartElement()
void writeTextElement(const QString &qualifiedName, const QString &text)