File indexing completed on 2024-04-14 04:29:51

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 }