You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
piklab/src/tools/list/compile_process.h

184 lines
6.0 KiB

/***************************************************************************
* Copyright (C) 2005-2006 Nicolas Hadacek <hadacek@kde.org> *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
***************************************************************************/
#ifndef COMPILE_PROCESS_H
#define COMPILE_PROCESS_H
#include "common/common/qflags.h"
#include "common/global/purl.h"
#include "libgui/log_view.h"
#include "devices/base/hex_buffer.h"
#include "tools/base/tool_group.h"
#include "tools/base/generic_tool.h"
#include "libgui/main_global.h"
namespace Process { class LineSignal; }
namespace Compile
{
class Manager;
enum FileAction { NoAction = 0, Show = 1, InProject = 2, Generated = 8, Included = 16 };
TQ_DECLARE_FLAGS(FileActions, FileAction)
TQ_DECLARE_OPERATORS_FOR_FLAGS(FileActions)
class FileData {
public:
FileData() {}
FileData(const PURL::Url &u, FileActions a) : url(u), actions(a) {}
PURL::Url url;
FileActions actions;
class List : public TQValueList<FileData> {
public:
List() {}
List(const FileData &data) { append(data); }
List onlyExistingFiles() const;
void cleanGenerated() const;
};
};
struct ArgumentData {
const char *key, *description;
};
extern const ArgumentData ARGUMENT_DATA[];
class ParseErrorData {
public:
ParseErrorData(const TQString &p, int iFile, int iLine, int iMessage, Log::LineType dLineType)
: pattern(p), indexFile(iFile), indexLine(iLine), indexMessage(iMessage), indexLogType(-1),
defaultLineType(dLineType) {}
ParseErrorData(const TQString &p, int iFile, int iLine, int iMessage, uint iLogType,
Log::LineType dLineType = Log::LineType::Error)
: pattern(p), indexFile(iFile), indexLine(iLine), indexMessage(iMessage), indexLogType(iLogType),
defaultLineType(dLineType) {}
TQString pattern;
int indexFile, indexLine, indexMessage, indexLogType;
Log::LineType defaultLineType;
};
//-----------------------------------------------------------------------------
class LogWidget : public Log::Widget
{
Q_OBJECT
public:
LogWidget(TQWidget *parent);
void appendLine(Log::LineType type, const TQString &message, const TQString &filepath, uint line);
void appendLine(Log::DebugLevel debug, const TQString &message, const TQString &filepath, uint line);
virtual void clear();
private slots:
void lineClicked(int line);
private:
class Data {
public:
Data() {}
Data(const TQString &fp, uint l) : filepath(fp), line(l) {}
TQString filepath;
uint line;
};
TQMap<uint, Data> _map;
};
//-----------------------------------------------------------------------------
class BaseProcess : public TQObject
{
Q_OBJECT
public:
BaseProcess();
virtual void init(const Data &data, Manager *manager);
virtual bool check() const = 0;
virtual FileData::List files(bool *ok) const = 0;
bool start();
signals:
void success();
void failure();
protected:
Manager *_manager;
Data _data;
::Process::LineSignal *_process;
TQString _stdout, _stderr;
const Tool::Group &group() const { return Main::toolGroup(); }
PURL::Directory directory(uint i = 0) const;
virtual void setupProcess() = 0;
protected slots:
virtual void logStdoutLine(const TQString &line) { logStderrLine(line); }
virtual void logStderrLine(const TQString &line) = 0;
virtual void done(int code);
void timeout();
};
//-----------------------------------------------------------------------------
class Process : public BaseProcess
{
Q_OBJECT
public:
virtual ~Process();
virtual void init(const Data &data, Manager *manager);
virtual bool check() const;
virtual FileData::List files(bool *ok) const;
virtual TQStringList genericArguments(const Compile::Config &config) const = 0;
void checkArguments() const;
protected:
Config *_config;
virtual PURL::Url url(PURL::FileType type = PURL::Nb_FileTypes, uint i = 0) const;
TQString filepath(PURL::FileType type, uint i=0) const;
virtual TQString outputFilepath() const;
virtual TQString outputFiles() const = 0;
uint nbFiles() const { return _data.items.count(); }
virtual TQString inputFilepath(uint i) const { return filepath(PURL::Nb_FileTypes, i); }
virtual TQString deviceName() const = 0;
virtual TQString familyName() const { return TQString(); }
virtual TQString objectExtension() const { return TQString(); }
virtual TQString libraryExtension() const { return "lib"; }
virtual bool hasLinkerScript() const { return group().hasCustomLinkerScript(_data.project); }
FileData fileData(PURL::FileType type, FileActions actions) const;
bool parseErrorLine(const TQString &s, const ParseErrorData &data);
virtual Log::LineType filterType(const TQString &type) const;
void doLog(const TQString &type, const TQString &message, const TQString &surl, uint line);
void doLog(Log::LineType type, const TQString &message, const TQString &surl, uint line);
virtual void setupProcess();
TQStringList arguments() const;
const Tool::Base *tool() const { return group().base(_data.category); }
private:
static bool checkIs(const TQString &s, const TQString &key);
static TQString replaceIf(const TQString &s, const TQString &key, bool condition);
};
//-----------------------------------------------------------------------------
class CustomProcess : public BaseProcess
{
Q_OBJECT
public:
CustomProcess(const TQString &command) : _command(command) {}
virtual bool check() const { return true; }
virtual FileData::List files(bool *ok) const { if (ok) *ok = true; return FileData::List(); }
protected:
virtual void setupProcess();
protected slots:
virtual void logStderrLine(const TQString &line);
private:
TQString _command;
};
} // namespace
#endif