SimulatorDialog::SimulatorDialog(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::SimulatorDialog),
    m_numRows(0),
    m_paused(false),
    controller()
{
  ui->setupUi(this);

  ui->btnStart->setEnabled(false);
  ui->btnPause->setEnabled(false);
  ui->btnStop->setEnabled(false);

  ui->spinBox_port->setValue(controller.getPort());

  connect(&controller, SIGNAL(readGeomessage(Geomessage)), this, SLOT(addGeomessageToTable(Geomessage)));
  connect(&controller, SIGNAL(advancedToGeomessage(int)), this, SLOT(selectGeomessageInTable(int)));
}
SimulatorDialog::SimulatorDialog(bool isVerboseOutput, QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::SimulatorDialog),
    m_numRows(0),
    m_paused(false),
    controller()
{
  controller.setVerbose(isVerboseOutput);
  ui->setupUi(this);

  setWindowTitle(windowTitle() + " " + SimulatorController::RELEASE);

  ui->btnStart->setEnabled(false);
  ui->btnPause->setEnabled(false);
  ui->btnStop->setEnabled(false);

  ui->spinBox_port->setValue(controller.getPort());

  connect(&controller, SIGNAL(readGeomessage(Geomessage)), this, SLOT(addGeomessageToTable(Geomessage)));
  connect(&controller, SIGNAL(advancedToGeomessage(int)), this, SLOT(selectGeomessageInTable(int)));
}
void SimulatorController::timerEvent(QTimerEvent *event)
{
  if (event->timerId() == m_timer.timerId())
  {
    QString payload;
    QString currentElementName;
    QString Name, messageID, messageAction, symbolID, type;
    QXmlStreamWriter streamWriter(&payload);
    QString currentTimeString = QDateTime::currentDateTimeUtc().toString(SimulatorController::DATE_FORMAT);

    streamWriter.writeStartElement(TAG_ROOT);
    for(int messageThroughput = 0 ; messageThroughput < m_messageThroughput ; messageThroughput++)
    {
      while (!m_inputReader.atEnd())
      {
        if(QStringRef::compare(m_inputReader.name(), TAG_MESSAGES) == 0)
        {
          m_inputReader.readNext();
          if(m_inputReader.atEnd())
          {
            m_reachedEndOfFile=true;
            m_inputReader.clear();
            m_inputFile.reset();
            m_inputReader.setDevice(&m_inputFile);
            m_currentIndex = 0;
          }
          continue;
        }
        else if (m_inputReader.isEndElement())
        {
          streamWriter.writeEndElement();
          if(QStringRef::compare(m_inputReader.name(), TAG_MESSAGE) == 0)
          {
            //Only emit readGeomessage if this is the first time we have read the message...
            if (m_reachedEndOfFile == false)
            {
              emit readGeomessage(Geomessage(Name, messageID, messageAction, symbolID, type));
            }
            //Only emit advancedToGeomessage when it's the last message in this set...
            if (messageThroughput + 1 == m_messageThroughput)
            {
              emit advancedToGeomessage(m_currentIndex);
            }
            m_currentIndex++;
            break;
          }

          m_inputReader.readNext();
        }
        else if (m_inputReader.isStartElement())
        {
          currentElementName = m_inputReader.name().toString();
          if (m_inputReader.prefix().toString().isEmpty())
          {
            streamWriter.writeStartElement(m_inputReader.name().toString());
          }
          else
          {
            streamWriter.writeStartElement(m_inputReader.prefix().toString()+ ":" + m_inputReader.name().toString());
          }
          if (m_inputReader.attributes().size() > 0)
          {
            streamWriter.writeAttributes(m_inputReader.attributes());
          }
        }
        else if (m_inputReader.isCharacters())
        {
          QString text = m_inputReader.text().toString();
          {
            QMutexLocker locker(&timeOverrideFieldsMutex);
            if (m_timeOverrideFields.contains(currentElementName))
            {
              text = currentTimeString;
            }
          }

          streamWriter.writeCharacters(text);
          if (TAG_NAME == currentElementName)
          {
            Name = text;
          }
          else if (TAG_ACTION == currentElementName)
          {
            messageAction = text;
          }
          else if (TAG_ID == currentElementName)
          {
            messageID = text;
          }
          else if (TAG_SIC == currentElementName)
          {
            symbolID = text;
          }
          else if (TAG_TYPE == currentElementName)
          {
            type = text;
          }
        }
        else if (m_inputReader.isComment())
        {
          /* leave not import */
        }
        else if (m_inputReader.isCDATA())
        {
          /* take cdata */
        }
        m_inputReader.readNext();
      }

      m_inputReader.readNext();
    }

    streamWriter.writeEndElement();

    QByteArray datagram;
    datagram += payload;
    QList<QNetworkInterface> ifaces = QNetworkInterface::allInterfaces();
    for (int i = 0; i < ifaces.size(); i++)
    {
      QNetworkInterface::InterfaceFlags flags = ifaces[i].flags();
      if (!(flags & QNetworkInterface::IsLoopBack) && (flags & QNetworkInterface::IsUp))
      {
        QList<QNetworkAddressEntry> entries = ifaces[i].addressEntries();
        for (int j = 0; j < entries.size(); j++)
        {
          m_udpSocket->writeDatagram(datagram.data(), datagram.size(), entries[j].broadcast(), getPort());
        }
      }
    }

    if (verbose())
    {
      consoleOut << payload << endl;
    }
  }
  else
  {
    QObject::timerEvent(event);
  }
}