DebugSession.cpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. #include "DebugSession.h"
  2. #include <QXmlStreamReader>
  3. #include <QXmlStreamWriter>
  4. #include <QFile>
  5. #include <QMessageBox>
  6. DebugSession::DebugSession()
  7. : modified(false)
  8. {
  9. }
  10. bool DebugSession::existsAsFile() const
  11. {
  12. return !fileName.isEmpty();
  13. }
  14. const QString& DebugSession::filename() const
  15. {
  16. return fileName;
  17. }
  18. bool DebugSession::isModified() const
  19. {
  20. if(fileName.isEmpty() && symTable.size() == 0)
  21. return false;
  22. else
  23. return modified;
  24. }
  25. Breakpoints& DebugSession::breakpoints()
  26. {
  27. return breaks;
  28. }
  29. SymbolTable& DebugSession::symbolTable()
  30. {
  31. return symTable;
  32. }
  33. void DebugSession::clear()
  34. {
  35. // clear everything
  36. symTable.clear();
  37. breaks.clear();
  38. fileName.clear();
  39. modified = false;
  40. }
  41. void DebugSession::open(const QString& file)
  42. {
  43. QFile f(file);
  44. if (!f.open(QFile::ReadOnly | QFile::Text)) {
  45. QMessageBox::warning(0, tr("Open session ..."),
  46. tr("Cannot read file %1:\n%2.")
  47. .arg(file)
  48. .arg(f.errorString()));
  49. return;
  50. }
  51. // clear current project and start reading xml file
  52. clear();
  53. QXmlStreamReader ses;
  54. ses.setDevice(&f);
  55. while (!ses.atEnd()) {
  56. ses.readNext();
  57. if (ses.isStartElement() && (ses.name() == "DebugSession")) {
  58. // debug session data
  59. while (!ses.atEnd()) {
  60. ses.readNext();
  61. // end tag
  62. if (ses.isEndElement()) break;
  63. // begin tag
  64. if (ses.isStartElement()) {
  65. if (ses.name() == "Symbols") {
  66. symTable.loadSymbols(ses);
  67. } else if (ses.name() == "Breakpoints") {
  68. breaks.loadBreakpoints(ses);
  69. } else {
  70. skipUnknownElement(ses);
  71. }
  72. }
  73. }
  74. }
  75. }
  76. fileName = file;
  77. modified = false;
  78. }
  79. void DebugSession::skipUnknownElement(QXmlStreamReader& ses)
  80. {
  81. while (!ses.atEnd()) {
  82. ses.readNext();
  83. if (ses.isEndElement()) break;
  84. if (ses.isStartElement()) skipUnknownElement(ses);
  85. }
  86. }
  87. bool DebugSession::save()
  88. {
  89. return saveAs(fileName);
  90. }
  91. bool DebugSession::saveAs(const QString& newFileName)
  92. {
  93. // open file for save
  94. QFile file(newFileName);
  95. if (!file.open(QFile::WriteOnly | QFile::Text)) {
  96. QMessageBox::warning(0, tr("Save session ..."),
  97. tr("Cannot write file %1:\n%2.")
  98. .arg(fileName)
  99. .arg(file.errorString()));
  100. return false;
  101. }
  102. // start xml file
  103. QXmlStreamWriter ses;
  104. ses.setDevice(&file);
  105. ses.setAutoFormatting(true);
  106. ses.writeDTD("<!DOCTYPE xomds>");
  107. ses.writeStartElement("DebugSession");
  108. ses.writeAttribute("version", "0.1");
  109. // write symbols
  110. ses.writeStartElement("Symbols");
  111. symTable.saveSymbols(ses);
  112. ses.writeEndElement();
  113. // write breakpoints
  114. ses.writeStartElement("Breakpoints");
  115. breaks.saveBreakpoints(ses);
  116. ses.writeEndElement();
  117. // end
  118. ses.writeEndDocument();
  119. modified = false;
  120. fileName = newFileName; // only set after successful save
  121. return true;
  122. }
  123. void DebugSession::sessionModified()
  124. {
  125. modified = true;
  126. }