CClass* CDecodeFlowType::readClassType ( const QDomElement& element) { bool bOk = false; CClass* cl = NULL; QDomElement id = element.firstChildElement("id"); QDomElement name = element.firstChildElement("name"); QDomElement definition = element.firstChildElement("definition"); QDomElement readOnly = element.firstChildElement("read-only"); QDomElement values = element.firstChildElement("values"); QDomElement type = element.firstChildElement("type"); switch (type.text().toInt()) { case CClass::VOID: { CVoid* v = new CVoid(name.text(), definition.text()); v->setId(id.text().toInt(&bOk)); v->setReadOnly((readOnly.text().toInt(&bOk))); cl = v; bOk = true; } break; case CClass::ENUMERATION: { CEnumeration* e = new CEnumeration(name.text(), definition.text()); e->setId(id.text().toInt(&bOk)); e->setReadOnly((readOnly.text().toInt(&bOk))); QDomElement data = values.firstChildElement("string"); while (!data.isNull()) { e->append(data.text()); data = data.nextSiblingElement("string"); } bOk = true; cl = e; } break; case CClass::NUMBER: { CNumber* n = new CNumber(name.text(), definition.text()); n->setId(id.text().toInt(&bOk)); n->setReadOnly((readOnly.text().toInt(&bOk))); QDomElement range = values.firstChildElement("range"); if (!range.isNull()) { Range r; r.begin = range.attribute("begin").toLongLong(&bOk); if (!bOk) { // try with uLongLong r.begin = range.attribute("begin").toULongLong(&bOk); } r.end = range.attribute("end").toLongLong(&bOk); if (!bOk) { // try with uLongLong r.end = range.attribute("end").toULongLong(&bOk); } r.beginName = range.attribute("begin-name"); r.endName = range.attribute("end-name"); n->insertRange(r); bOk = true; } else bOk = false; cl = n; } break; case CClass::FLOAT: { CFloat* f = new CFloat(name.text(), definition.text()); f->setId(id.text().toInt(&bOk)); f->setReadOnly((readOnly.text().toInt(&bOk))); QDomElement range = values.firstChildElement("range"); if (!range.isNull()) { Range r; r.begin = range.attribute("begin").toDouble(&bOk); r.end = range.attribute("end").toDouble(&bOk); r.beginName = range.attribute("begin-name"); r.endName = range.attribute("end-name"); f->insertRange(r); bOk = true; } else bOk = false; cl = f; } break; case CClass::CHAR: { CChar* c = new CChar(name.text(), definition.text()); c->setId(id.text().toInt(&bOk)); c->setReadOnly((readOnly.text().toInt(&bOk))); QDomElement range = values.firstChildElement("range"); if (!range.isNull()) { Range r; r.begin = range.attribute("begin").toInt(&bOk); r.end = range.attribute("end").toInt(&bOk); r.beginName = range.attribute("begin-name"); r.endName = range.attribute("end-name"); c->insertRange(r); bOk = true; } else bOk = false; cl = c; } break; case CClass::STRING: { CString* s = new CString(name.text(), definition.text()); s->setId(id.text().toInt(&bOk)); s->setReadOnly((readOnly.text().toInt(&bOk))); QDomElement size = values.firstChildElement("size"); if (!size.isNull()) { s->setSize(size.text().toInt(&bOk)); bOk = true; } else bOk = false; cl = s; } break; case CClass::AGGREGATION: { CStructure* s = new CStructure(name.text(), definition.text()); s->setId(id.text().toInt(&bOk)); s->setReadOnly((readOnly.text().toInt(&bOk))); QDomElement structure = values.firstChildElement("structure"); while (!structure.isNull() && !bOk) { Structure st; st.name = structure.attribute("name"); st.classId = structure.attribute("type").toInt(&bOk); st.pClass = NULL; if (bOk == true) { s->insertField(st); } structure = structure.nextSiblingElement("structure"); } cl = s; } break; default: bOk = false; break; } if ((bOk == false) & (cl != NULL)) { delete cl; cl = NULL; } return cl; }
void CTypeFactory::createBuildinType() { CNumber* nb; CChar* ch; Range r; CVoid* v; v = new CVoid(tr("void"), tr("no type")); v->setReadOnly(true); insertType(v); nb = new CNumber(tr("signed char"), tr("signed integer of 8bits")); r.begin = -128; r.beginName = QString("-128"); r.end = 127; r.endName = QString("127"); nb->insertRange(r); nb->setReadOnly(true); insertType(nb); nb = new CNumber(tr("unsigned char"), tr("unsigned integer of 8bits")); r.begin = 0; r.beginName = QString("0"); r.end = 255; r.endName = QString("255"); nb->insertRange(r); nb->setReadOnly(true); insertType(nb); nb = new CNumber(tr("signed short"), tr("signed integer of 16bits")); r.begin = -32768; r.beginName = QString("-32768"); r.end = 32767; r.endName = QString("32767"); nb->insertRange(r); nb->setReadOnly(true); insertType(nb); nb = new CNumber(tr("unsigned short"), tr("unsigned integer of 16bits")); r.begin = 0; r.beginName = QString("0"); r.end = 65535; r.endName = QString("65535"); nb->insertRange(r); nb->setReadOnly(true); insertType(nb); nb = new CNumber(tr("signed long"), tr("signed integer of 32bits")); r.begin = (int) -2147483648; r.beginName = QString("-2147483648"); r.end = (int) 2147483647; r.endName = QString("2147483647"); nb->insertRange(r); nb->setReadOnly(true); insertType(nb); nb = new CNumber(tr("unsigned long"), tr("unsigned integer of 32bits")); r.begin = 0; r.beginName = QString("0"); r.end = (unsigned int) 4294967296; r.endName = QString("4294967296"); nb->insertRange(r); nb->setReadOnly(true); insertType(nb); nb = new CNumber(tr("signed long long"), tr("signed integer of 64bits")); r.begin = (long long) 0x8000000000000000; r.beginName = QString("2^63"); r.end = (long long) 0x7FFFFFFFFFFFFFFF; r.endName = QString("2^63-1"); nb->insertRange(r); nb->setReadOnly(true); insertType(nb); nb = new CNumber(tr("unsigned long long"), tr("unsigned integer of 64bits")); r.begin = 0; r.beginName = QString("0"); r.end = (unsigned long long) std::numeric_limits<unsigned long long>::max(); //0xFFFFFFFFFFFFFFFF; r.endName = QString("2^64"); nb->insertRange(r); nb->setReadOnly(true); insertType(nb); ch = new CChar(tr("ascii character"), tr("ascii character")); r.begin = 0; r.beginName = QString("NUL (0)"); r.end = 127; r.endName = QString("DEL (127)"); ch->insertRange(r); ch->setReadOnly(true); insertType(ch); ch = new CChar(tr("ext. ascii character"), tr("extended ascii character")); r.begin = 0; r.beginName = QString("NUL (0)"); r.end = 0xFF; r.endName = QString(" (255)"); ch->insertRange(r); ch->setReadOnly(true); insertType(ch); CString* s = new CString(tr("string"), tr("string")); s->setSize(-1); s->setReadOnly(true); insertType(s); CEnumeration* b = new CEnumeration(tr("bool"), tr("boolean")); b->append(tr("FALSE")); b->append(tr("TRUE")); b->setReadOnly(true); insertType(b); nb = new CFloat(tr("float"), tr("float single precision")); r.begin = std::numeric_limits<qreal>::min(); r.beginName = QString("-INF"); r.end = std::numeric_limits<qreal>::max();; r.endName = QString("+INF"); nb->insertRange(r); nb->setReadOnly(true); insertType(nb); nb = new CFloat(tr("double"), tr("float double precision")); r.begin = std::numeric_limits<qreal>::min(); r.beginName = QString("-INF"); r.end = std::numeric_limits<qreal>::max();; r.endName = QString("+INF"); nb->insertRange(r); nb->setReadOnly(true); insertType(nb); }