cstlcompilerattributes.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. /*
  2. Copyright 2017 Herik Lima de Castro and Marcelo Medeiros Eler
  3. Distributed under MIT license, or public domain if desired and
  4. recognized in your jurisdiction.
  5. See file LICENSE for detail.
  6. */
  7. #include "cstlcompilerattributes.h"
  8. #include <QVariant>
  9. #include "constants.h"
  10. #include "metaclassparser.h"
  11. #include "properties.h"
  12. // clazy:excludeall=connect-not-normalized
  13. CWF_BEGIN_NAMESPACE
  14. CSTLCompilerAttributes::CSTLCompilerAttributes(QMap<QString, QObject *> &objects)
  15. : objects(objects)
  16. {}
  17. QString CSTLCompilerAttributes::buildAttributes(QMap<QString, QString> &attr, bool keyValue)
  18. {
  19. QString htmlOut;
  20. for (QMap<QString, QString>::iterator it = attr.begin(); it != attr.end(); ++it) {
  21. compileAttributes(attr);
  22. if (keyValue)
  23. htmlOut += " " + it.key() + "=\"" + it.value() + "\"";
  24. else
  25. htmlOut += it.value();
  26. }
  27. return htmlOut;
  28. }
  29. void CSTLCompilerAttributes::compileAttributes(QMap<QString, QString> &attr)
  30. {
  31. for (QMap<QString, QString>::iterator it = attr.begin(); it != attr.end(); ++it) {
  32. QString outPutText;
  33. QString &value = it.value();
  34. compile(value, outPutText);
  35. value = outPutText;
  36. /*
  37. //Compile at runtime
  38. if(value.startsWith("#{") && value.endsWith("}"))
  39. {
  40. value.replace("#{", "").replace("}", "");
  41. Properties prop(value);
  42. if(!objects.contains(prop.m_class))
  43. {
  44. value = "***ERROR - OBJECT " + prop.m_class + " DOES NOT EXIST.***";
  45. }
  46. else
  47. {
  48. QObject *object = objects[prop.m_class];
  49. bool ok = QMetaObject::invokeMethod(object, prop.m_method.toStdString().data(), Qt::DirectConnection, Q_RETURN_ARG(QString, value));
  50. if(!ok)
  51. {
  52. value = "***ERROR - METHOD " + prop.m_method + " .***";
  53. }
  54. }
  55. }
  56. */
  57. }
  58. }
  59. void CSTLCompilerAttributes::compile(QString &text, QString &outPutText)
  60. {
  61. bool start = false;
  62. int size = text.size();
  63. QString expr;
  64. for (int i = 0; i < size; ++i) {
  65. QChar ch = text[i];
  66. if (ch == '#') {
  67. if ((i + 1) < size) {
  68. QChar c = text[i + 1];
  69. if (c == '{') {
  70. start = true;
  71. }
  72. }
  73. } else if (ch == '}') {
  74. if (start) {
  75. start = false;
  76. expr.replace("#{", "");
  77. Properties prop(expr);
  78. if (!objects.contains(prop.m_class)) {
  79. outPutText += "***ERROR - OBJECT " + prop.m_class + " DOES NOT EXIST.***";
  80. } else {
  81. QString value;
  82. QObject *object = objects[prop.m_class];
  83. bool ok = false;
  84. MetaClassParser metaClassParser(object);
  85. QString methodReturnType(metaClassParser.getReturnType(prop.m_method + "()"));
  86. if (!methodReturnType.isEmpty()) {
  87. if (methodReturnType == CSTL::SUPPORTED_TYPES::QSTRING)
  88. ok = QMetaObject::invokeMethod(object,
  89. prop.m_method.toStdString().data(),
  90. Qt::DirectConnection,
  91. Q_RETURN_ARG(QString, value));
  92. else if (methodReturnType == CSTL::SUPPORTED_TYPES::STD_STRING) {
  93. std::string returnValue;
  94. ok = QMetaObject::invokeMethod(object,
  95. prop.m_method.toStdString().data(),
  96. Qt::DirectConnection,
  97. Q_RETURN_ARG(std::string, returnValue));
  98. value = returnValue.data();
  99. } else if (methodReturnType == CSTL::SUPPORTED_TYPES::BOOL) {
  100. bool returnValue;
  101. ok = QMetaObject::invokeMethod(object,
  102. prop.m_method.toStdString().data(),
  103. Qt::DirectConnection,
  104. Q_RETURN_ARG(bool, returnValue));
  105. value = QString::number(returnValue);
  106. } else if (methodReturnType == CSTL::SUPPORTED_TYPES::CHAR) {
  107. char returnValue;
  108. ok = QMetaObject::invokeMethod(object,
  109. prop.m_method.toStdString().data(),
  110. Qt::DirectConnection,
  111. Q_RETURN_ARG(char, returnValue));
  112. value.push_back(returnValue);
  113. } else if (methodReturnType == CSTL::SUPPORTED_TYPES::UNSIGNED_CHAR) {
  114. unsigned char returnValue;
  115. ok = QMetaObject::invokeMethod(object,
  116. prop.m_method.toStdString().data(),
  117. Qt::DirectConnection,
  118. Q_RETURN_ARG(unsigned char, returnValue));
  119. value.push_back(returnValue);
  120. } else if (methodReturnType == CSTL::SUPPORTED_TYPES::SHORT) {
  121. short returnValue;
  122. ok = QMetaObject::invokeMethod(object,
  123. prop.m_method.toStdString().data(),
  124. Qt::DirectConnection,
  125. Q_RETURN_ARG(short, returnValue));
  126. value = QString::number(returnValue);
  127. } else if (methodReturnType == CSTL::SUPPORTED_TYPES::UNSIGNED_SHORT) {
  128. unsigned short returnValue;
  129. ok = QMetaObject::invokeMethod(object,
  130. prop.m_method.toStdString().data(),
  131. Qt::DirectConnection,
  132. Q_RETURN_ARG(unsigned short,
  133. returnValue));
  134. value = QString::number(returnValue);
  135. } else if (methodReturnType == CSTL::SUPPORTED_TYPES::INT) {
  136. int returnValue;
  137. ok = QMetaObject::invokeMethod(object,
  138. prop.m_method.toStdString().data(),
  139. Qt::DirectConnection,
  140. Q_RETURN_ARG(int, returnValue));
  141. value = QString::number(returnValue);
  142. } else if (methodReturnType == CSTL::SUPPORTED_TYPES::UNSIGNED_INT) {
  143. unsigned int returnValue;
  144. ok = QMetaObject::invokeMethod(object,
  145. prop.m_method.toStdString().data(),
  146. Qt::DirectConnection,
  147. Q_RETURN_ARG(unsigned int, returnValue));
  148. value = QString::number(returnValue);
  149. } else if (methodReturnType == CSTL::SUPPORTED_TYPES::LONG) {
  150. long returnValue;
  151. ok = QMetaObject::invokeMethod(object,
  152. prop.m_method.toStdString().data(),
  153. Qt::DirectConnection,
  154. Q_RETURN_ARG(long, returnValue));
  155. value = QString::number(returnValue);
  156. } else if (methodReturnType == CSTL::SUPPORTED_TYPES::UNSIGNED_LONG) {
  157. unsigned long returnValue;
  158. ok = QMetaObject::invokeMethod(object,
  159. prop.m_method.toStdString().data(),
  160. Qt::DirectConnection,
  161. Q_RETURN_ARG(unsigned long, returnValue));
  162. value = QString::number(returnValue);
  163. } else if (methodReturnType == CSTL::SUPPORTED_TYPES::LONG_LONG) {
  164. long long returnValue;
  165. ok = QMetaObject::invokeMethod(object,
  166. prop.m_method.toStdString().data(),
  167. Qt::DirectConnection,
  168. Q_RETURN_ARG(long long, returnValue));
  169. value = QString::number(returnValue);
  170. } else if (methodReturnType == CSTL::SUPPORTED_TYPES::UNSIGNED_LONG_LONG) {
  171. unsigned long long returnValue;
  172. ok = QMetaObject::invokeMethod(object,
  173. prop.m_method.toStdString().data(),
  174. Qt::DirectConnection,
  175. Q_RETURN_ARG(unsigned long long,
  176. returnValue));
  177. value = QString::number(returnValue);
  178. } else if (methodReturnType == CSTL::SUPPORTED_TYPES::FLOAT) {
  179. float returnValue;
  180. ok = QMetaObject::invokeMethod(object,
  181. prop.m_method.toStdString().data(),
  182. Qt::DirectConnection,
  183. Q_RETURN_ARG(float, returnValue));
  184. value = QString::number(returnValue);
  185. } else if (methodReturnType == CSTL::SUPPORTED_TYPES::DOUBLE) {
  186. double returnValue;
  187. ok = QMetaObject::invokeMethod(object,
  188. prop.m_method.toStdString().data(),
  189. Qt::DirectConnection,
  190. Q_RETURN_ARG(double, returnValue));
  191. value = QString::number(returnValue);
  192. }
  193. if (!ok) {
  194. outPutText += "***ERROR - METHOD " + prop.m_method + " .***";
  195. } else {
  196. outPutText += value;
  197. }
  198. } else {
  199. outPutText += "***ERROR - METHOD NOT FOUND " + prop.m_method + " .***";
  200. }
  201. }
  202. expr.clear();
  203. continue;
  204. }
  205. }
  206. if (start) {
  207. expr.push_back(ch);
  208. } else {
  209. outPutText.push_back(ch);
  210. }
  211. }
  212. }
  213. QMap<QString, QString> CSTLCompilerAttributes::getAttributes(const QXmlStreamAttributes &attributes)
  214. {
  215. QMap<QString, QString> attr;
  216. for (int i = 0; i < attributes.size(); ++i) {
  217. QString name(attributes[i].name().toString());
  218. QString value(attributes[i].value().toString());
  219. attr.insert(name, value);
  220. }
  221. return attr;
  222. }
  223. CWF_END_NAMESPACE