示例#1
0
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;
}
示例#2
0
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);
}