File indexing completed on 2024-06-16 04:21:24
0001 /* 0002 * This file is part of KDevelop Krazy2 Plugin. 0003 * 0004 * Copyright 2012 Daniel Calviño Sánchez <danxuliu@gmail.com> 0005 * 0006 * This program is free software; you can redistribute it and/or 0007 * modify it under the terms of the GNU General Public License 0008 * as published by the Free Software Foundation; either version 2 0009 * of the License, or (at your option) any later version. 0010 * 0011 * This program is distributed in the hope that it will be useful, 0012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 0013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 0014 * GNU General Public License for more details. 0015 * 0016 * You should have received a copy of the GNU General Public License 0017 * along with this program. If not, see <http://www.gnu.org/licenses/>. 0018 */ 0019 0020 #include "analysisprogressparser.h" 0021 0022 #include <KLocalizedString> 0023 0024 //public: 0025 0026 AnalysisProgressParser::AnalysisProgressParser(QObject* parent /*= 0*/): QObject(parent), 0027 m_numberOfCheckers(0), 0028 m_numberOfCheckersRun(0), 0029 m_currentNumberOfDots(0) { 0030 } 0031 0032 QString AnalysisProgressParser::statusName() const { 0033 return xi18nc("@info:progress", "Running <command>krazy2</command>"); 0034 } 0035 0036 void AnalysisProgressParser::setNumberOfCheckers(int numberOfCheckers) { 0037 m_numberOfCheckers = numberOfCheckers; 0038 } 0039 0040 void AnalysisProgressParser::resetNumberOfFilesForEachFileType() { 0041 m_fileTypeToNumberOfDots.clear(); 0042 } 0043 0044 //public slots: 0045 0046 void AnalysisProgressParser::start() { 0047 emit showProgress(this, 0, 100, 0); 0048 } 0049 0050 void AnalysisProgressParser::parse(const QByteArray& data) { 0051 //fromAscii() conversion is good enough for progress output 0052 m_buffer += QString::fromLatin1(data); 0053 0054 discardFilteredOutFileMessages(); 0055 0056 bool changed; 0057 do { 0058 changed = parseFileType(); 0059 changed = parseCheckerName() || changed; 0060 changed = parseDots() || changed; 0061 changed = parseDone() || changed; 0062 } while (changed); 0063 } 0064 0065 void AnalysisProgressParser::finish() { 0066 emit clearMessage(this); 0067 emit showProgress(this, 0, 100, 100); 0068 emit hideProgress(this); 0069 } 0070 0071 //private: 0072 0073 void AnalysisProgressParser::discardFilteredOutFileMessages() { 0074 bool changed; 0075 do { 0076 changed = discardCannotAccessFileMessage(); 0077 changed = discardUnsupportedFileTypeMessage() || changed; 0078 } while (changed); 0079 } 0080 0081 bool AnalysisProgressParser::discardCannotAccessFileMessage() { 0082 if (!(m_buffer.startsWith(QLatin1String("Cannot access file ")) && m_buffer.contains('\n'))) { 0083 return false; 0084 } 0085 0086 int messageEnd = m_buffer.indexOf('\n') + 1; 0087 m_buffer.remove(0, messageEnd); 0088 0089 return true; 0090 } 0091 0092 bool AnalysisProgressParser::discardUnsupportedFileTypeMessage() { 0093 if (!(m_buffer.startsWith(QLatin1String("Unsupported file type ")) && m_buffer.contains("skipping\n"))) { 0094 return false; 0095 } 0096 0097 int messageEnd = m_buffer.indexOf('\n') + 1; 0098 m_buffer.remove(0, messageEnd); 0099 0100 return true; 0101 } 0102 0103 bool AnalysisProgressParser::parseFileType() { 0104 if (!(m_buffer.startsWith(QLatin1String("=>")) && m_buffer.contains('/'))) { 0105 return false; 0106 } 0107 0108 int start = QString("=>").length(); 0109 m_currentFileType = m_buffer.mid(start, m_buffer.indexOf('/')-start); 0110 0111 m_buffer.remove(0, QString("=>" + m_currentFileType).length()); 0112 0113 return true; 0114 } 0115 0116 bool AnalysisProgressParser::parseCheckerName() { 0117 if (!(m_buffer.startsWith('/') && m_buffer.contains(" test in-progress"))) { 0118 return false; 0119 } 0120 0121 int start = QString('/').length(); 0122 QString checkerName = m_buffer.mid(start, m_buffer.indexOf(' ')-start); 0123 0124 m_buffer.remove(0, QString('/' + checkerName + " test in-progress").length()); 0125 0126 emit showMessage(this, i18nc("@info:progress File type (c++, desktop...) and checker name", "Running %1/%2", m_currentFileType, checkerName)); 0127 0128 if (m_numberOfCheckersRun == m_numberOfCheckers) { 0129 m_numberOfCheckers++; 0130 } 0131 0132 return true; 0133 } 0134 0135 bool AnalysisProgressParser::parseDots() { 0136 if (!m_buffer.startsWith('.')) { 0137 return false; 0138 } 0139 0140 int numberOfDots = m_fileTypeToNumberOfDots.value(m_currentFileType); 0141 if (m_currentNumberOfDots > 0 && numberOfDots > 0) { 0142 int checkerProgressRange = 100 / (float)m_numberOfCheckers; 0143 int checkerProgress = checkerProgressRange * m_currentNumberOfDots / (float)numberOfDots; 0144 0145 int progress = 100 * m_numberOfCheckersRun / (float)m_numberOfCheckers; 0146 0147 emit showProgress(this, 0, 100, progress + checkerProgress); 0148 } 0149 0150 m_buffer.remove(0, QString('.').length()); 0151 0152 m_currentNumberOfDots++; 0153 0154 return true; 0155 } 0156 0157 bool AnalysisProgressParser::parseDone() { 0158 if (!m_buffer.startsWith(QLatin1String("done\n"))) { 0159 return false; 0160 } 0161 0162 m_buffer.remove(0, QString("done\n").length()); 0163 0164 if (m_fileTypeToNumberOfDots.value(m_currentFileType) == 0) { 0165 m_fileTypeToNumberOfDots.insert(m_currentFileType, m_currentNumberOfDots); 0166 } 0167 0168 m_numberOfCheckersRun++; 0169 m_currentNumberOfDots = 0; 0170 0171 if (m_numberOfCheckers > 0) { 0172 int progress = 100 * m_numberOfCheckersRun / (float)m_numberOfCheckers; 0173 //Limit parsing progress 0174 if (progress == 100) { 0175 progress = 99; 0176 } 0177 emit showProgress(this, 0, 100, progress); 0178 } 0179 0180 return true; 0181 }