327 lines
13 KiB
C++
327 lines
13 KiB
C++
/**
|
|
* @author Rick Chan (cy187lion@sina.com)
|
|
* @date 2014-01-23
|
|
*/
|
|
|
|
#include "engine.h"
|
|
#include <QDir>
|
|
#include <QFileInfoList>
|
|
|
|
Engine::Engine(QString proDir, QString schdir, QString fileName, FILE_TYPES selectedFile, QObject *parent) :
|
|
QThread(parent)
|
|
{
|
|
ProDir = proDir;
|
|
SearchDir = schdir;
|
|
ProFileName = fileName;
|
|
FileTypes = selectedFile;
|
|
}
|
|
|
|
Engine::~Engine()
|
|
{
|
|
exit();
|
|
this->wait();
|
|
}
|
|
|
|
void Engine::run(void)
|
|
{
|
|
QFile proFile;
|
|
proFile.setFileName(ProFileName);
|
|
proFile.open(QIODevice::ReadWrite);
|
|
|
|
QTextStream *stream;
|
|
/** 以流的形式获取文件数据 */
|
|
stream = new QTextStream( &proFile );
|
|
stream->seek(proFile.size());
|
|
|
|
QString incPath, socFile, hedFile, disFile;
|
|
incPath.append("\nINCLUDEPATH += "+SearchDir);
|
|
socFile.append("\nSOURCES += ");
|
|
hedFile.append("\nHEADERS += ");
|
|
disFile.append("\nDISTFILES += ");
|
|
|
|
incPath.replace("\\","/");
|
|
//如果传入的项目文件路径为空,则以绝对路径方式添加,否则以相对路径方式添加
|
|
if(""!=ProDir)
|
|
{
|
|
FindAndAddEngine(ProDir, SearchDir, FileTypes, &incPath, &socFile, &hedFile, &disFile);
|
|
}
|
|
else
|
|
{
|
|
FindAndAddEngine(SearchDir, FileTypes, &incPath, &socFile, &hedFile, &disFile);
|
|
}
|
|
|
|
*stream<<incPath+'\n';
|
|
*stream<<hedFile+'\n';
|
|
*stream<<socFile+'\n';
|
|
*stream<<disFile+'\n';
|
|
stream->flush();
|
|
|
|
proFile.close();
|
|
emit EngineProcessing(true, 0);
|
|
}
|
|
|
|
void Engine::FindAndAddEngine(QString schdir, FILE_TYPES ftypes, QString *incPath, QString *socFile, QString *hedFile, QString *disFile)
|
|
{
|
|
QDir dir(schdir);
|
|
/** 开始搜索 */
|
|
//设置过滤器(目录,文件或非上级目录)
|
|
dir.setFilter(QDir::Dirs|QDir::Files|QDir::NoDotAndDotDot);
|
|
dir.setSorting(QDir::DirsFirst);
|
|
//取得目录中文件列表(包含目录)
|
|
QFileInfoList filelist = dir.entryInfoList();
|
|
int i=0;
|
|
do{
|
|
emit EngineProcessing(false, i);
|
|
if(0==filelist.size())
|
|
{
|
|
return;
|
|
}
|
|
QFileInfo fileInfo = filelist.at(i);
|
|
|
|
bool bisDir=fileInfo.isDir();
|
|
//判断是否为目录,如果是目录则遍历,否则当前处理文件
|
|
if(bisDir)
|
|
{
|
|
QString addFile = fileInfo.absoluteFilePath();
|
|
addFile.replace("\\","/");
|
|
incPath->append(" \\\n "+addFile);
|
|
FindAndAddEngine(fileInfo.absoluteFilePath(), ftypes, incPath, socFile, hedFile, disFile);
|
|
}
|
|
else
|
|
{
|
|
//取得文件类型后缀
|
|
QString extension=fileInfo.suffix().toLower();
|
|
/**< Sources */
|
|
if(("c"==extension) & (ftypes.Source&&0x01))
|
|
{
|
|
QString addFile = fileInfo.absoluteFilePath();
|
|
addFile.replace("\\","/");
|
|
socFile->append(" \\\n "+addFile);
|
|
}
|
|
else if(("c++"==extension) & ((ftypes.Source>>1)&&0x01))
|
|
{
|
|
QString addFile = fileInfo.absoluteFilePath();
|
|
addFile.replace("\\","/");
|
|
socFile->append(" \\\n "+addFile);
|
|
}
|
|
else if(("cpp"==extension) & ((ftypes.Source>>2)&&0x01))
|
|
{
|
|
QString addFile = fileInfo.absoluteFilePath();
|
|
addFile.replace("\\","/");
|
|
socFile->append(" \\\n "+addFile);
|
|
}
|
|
else if(("cxx"==extension) & ((ftypes.Source>>3)&&0x01))
|
|
{
|
|
QString addFile = fileInfo.absoluteFilePath();
|
|
addFile.replace("\\","/");
|
|
socFile->append(" \\\n "+addFile);
|
|
}
|
|
else if(("cc"==extension) & ((ftypes.Source>>4)&&0x01))
|
|
{
|
|
QString addFile = fileInfo.absoluteFilePath();
|
|
addFile.replace("\\","/");
|
|
socFile->append(" \\\n "+addFile);
|
|
}
|
|
else if(("tcc"==extension) & ((ftypes.Source>>5)&&0x01))
|
|
{
|
|
QString addFile = fileInfo.absoluteFilePath();
|
|
addFile.replace("\\","/");
|
|
socFile->append(" \\\n "+addFile);
|
|
}
|
|
/**< Headers */
|
|
else if(("h"==extension) & (ftypes.Header&&0x01))
|
|
{
|
|
QString addFile = fileInfo.absoluteFilePath();
|
|
addFile.replace("\\","/");
|
|
hedFile->append(" \\\n "+addFile);
|
|
}
|
|
else if(("h++"==extension) & ((ftypes.Header>>1)&&0x01))
|
|
{
|
|
QString addFile = fileInfo.absoluteFilePath();
|
|
addFile.replace("\\","/");
|
|
hedFile->append(" \\\n "+addFile);
|
|
}
|
|
else if(("hpp"==extension) & ((ftypes.Header>>2)&&0x01))
|
|
{
|
|
QString addFile = fileInfo.absoluteFilePath();
|
|
addFile.replace("\\","/");
|
|
hedFile->append(" \\\n "+addFile);
|
|
}
|
|
else if(("hxx"==extension) & ((ftypes.Header>>3)&&0x01))
|
|
{
|
|
QString addFile = fileInfo.absoluteFilePath();
|
|
addFile.replace("\\","/");
|
|
hedFile->append(" \\\n "+addFile);
|
|
}
|
|
/**< Others */
|
|
else if(("Makefile"==fileInfo.fileName())&&(ftypes.Other&&0x01))
|
|
{
|
|
QString addFile = fileInfo.absoluteFilePath();
|
|
addFile.replace("\\","/");
|
|
disFile->append(" \\\n "+addFile);
|
|
}
|
|
else if(("asm"==extension) & ((ftypes.Other>>1)&&0x01))
|
|
{
|
|
QString addFile = fileInfo.absoluteFilePath();
|
|
addFile.replace("\\","/");
|
|
disFile->append(" \\\n "+addFile);
|
|
}
|
|
else if(("s"==extension) & ((ftypes.Other>>2)&&0x01))
|
|
{
|
|
QString addFile = fileInfo.absoluteFilePath();
|
|
addFile.replace("\\","/");
|
|
disFile->append(" \\\n "+addFile);
|
|
}
|
|
else if(("xml"==extension) & ((ftypes.Other>>3)&&0x01))
|
|
{
|
|
QString addFile = fileInfo.absoluteFilePath();
|
|
addFile.replace("\\","/");
|
|
disFile->append(" \\\n "+addFile);
|
|
}
|
|
}
|
|
i++;
|
|
}while(i<filelist.count());
|
|
emit EngineProcessing(false, ++i);
|
|
}
|
|
|
|
void Engine::FindAndAddEngine(QString proDir, QString schdir, FILE_TYPES ftypes, QString *incPath, QString *socFile, QString *hedFile, QString *disFile)
|
|
{
|
|
QDir dir(schdir);
|
|
//获取项目文件所在目录
|
|
QDir relaDir(proDir);
|
|
/** 开始搜索 */
|
|
//设置过滤器(目录,文件或非上级目录)
|
|
dir.setFilter(QDir::Dirs|QDir::Files|QDir::NoDotAndDotDot);
|
|
dir.setSorting(QDir::DirsFirst);
|
|
//取得目录中文件列表(包含目录)
|
|
QFileInfoList filelist = dir.entryInfoList();
|
|
int i=0;
|
|
do{
|
|
emit EngineProcessing(false, i);
|
|
if(0==filelist.size())
|
|
{
|
|
return;
|
|
}
|
|
QFileInfo fileInfo = filelist.at(i);
|
|
|
|
bool bisDir=fileInfo.isDir();
|
|
//判断是否为目录,如果是目录则遍历,否则当前处理文件
|
|
if(bisDir)
|
|
{
|
|
QString addFile = fileInfo.absoluteFilePath();
|
|
addFile.replace("\\","/");
|
|
//计算当前文件夹与项目文件所在文件夹的相对路径
|
|
incPath->append(" \\\n "+relaDir.relativeFilePath(fileInfo.absoluteFilePath()));
|
|
FindAndAddEngine(proDir, fileInfo.absoluteFilePath(), ftypes, incPath, socFile, hedFile, disFile);
|
|
}
|
|
else
|
|
{
|
|
//取得文件类型后缀
|
|
QString extension=fileInfo.suffix().toLower();
|
|
/**< Sources */
|
|
if(("c"==extension) & (ftypes.Source&&0x01))
|
|
{
|
|
QString addFile = fileInfo.absoluteFilePath();
|
|
addFile.replace("\\","/");
|
|
//计算当前文件夹与项目文件所在文件夹的相对路径
|
|
socFile->append(" \\\n "+relaDir.relativeFilePath(fileInfo.absoluteFilePath()));
|
|
}
|
|
else if(("c++"==extension) & ((ftypes.Source>>1)&&0x01))
|
|
{
|
|
QString addFile = fileInfo.absoluteFilePath();
|
|
addFile.replace("\\","/");
|
|
//计算当前文件夹与项目文件所在文件夹的相对路径
|
|
socFile->append(" \\\n "+relaDir.relativeFilePath(fileInfo.absoluteFilePath()));
|
|
}
|
|
else if(("cpp"==extension) & ((ftypes.Source>>2)&&0x01))
|
|
{
|
|
QString addFile = fileInfo.absoluteFilePath();
|
|
addFile.replace("\\","/");
|
|
//计算当前文件夹与项目文件所在文件夹的相对路径
|
|
socFile->append(" \\\n "+relaDir.relativeFilePath(fileInfo.absoluteFilePath()));
|
|
}
|
|
else if(("cxx"==extension) & ((ftypes.Source>>3)&&0x01))
|
|
{
|
|
QString addFile = fileInfo.absoluteFilePath();
|
|
addFile.replace("\\","/");
|
|
//计算当前文件夹与项目文件所在文件夹的相对路径
|
|
socFile->append(" \\\n "+relaDir.relativeFilePath(fileInfo.absoluteFilePath()));
|
|
}
|
|
else if(("cc"==extension) & ((ftypes.Source>>4)&&0x01))
|
|
{
|
|
QString addFile = fileInfo.absoluteFilePath();
|
|
addFile.replace("\\","/");
|
|
//计算当前文件夹与项目文件所在文件夹的相对路径
|
|
socFile->append(" \\\n "+relaDir.relativeFilePath(fileInfo.absoluteFilePath()));
|
|
}
|
|
else if(("tcc"==extension) & ((ftypes.Source>>5)&&0x01))
|
|
{
|
|
QString addFile = fileInfo.absoluteFilePath();
|
|
addFile.replace("\\","/");
|
|
//计算当前文件夹与项目文件所在文件夹的相对路径
|
|
socFile->append(" \\\n "+relaDir.relativeFilePath(fileInfo.absoluteFilePath()));
|
|
}
|
|
/**< Headers */
|
|
else if(("h"==extension) & (ftypes.Header&&0x01))
|
|
{
|
|
QString addFile = fileInfo.absoluteFilePath();
|
|
addFile.replace("\\","/");
|
|
//计算当前文件夹与项目文件所在文件夹的相对路径
|
|
hedFile->append(" \\\n "+relaDir.relativeFilePath(fileInfo.absoluteFilePath()));
|
|
}
|
|
else if(("h++"==extension) & ((ftypes.Header>>1)&&0x01))
|
|
{
|
|
QString addFile = fileInfo.absoluteFilePath();
|
|
addFile.replace("\\","/");
|
|
//计算当前文件夹与项目文件所在文件夹的相对路径
|
|
hedFile->append(" \\\n "+relaDir.relativeFilePath(fileInfo.absoluteFilePath()));
|
|
}
|
|
else if(("hpp"==extension) & ((ftypes.Header>>2)&&0x01))
|
|
{
|
|
QString addFile = fileInfo.absoluteFilePath();
|
|
addFile.replace("\\","/");
|
|
//计算当前文件夹与项目文件所在文件夹的相对路径
|
|
hedFile->append(" \\\n "+relaDir.relativeFilePath(fileInfo.absoluteFilePath()));
|
|
}
|
|
else if(("hxx"==extension) & ((ftypes.Header>>3)&&0x01))
|
|
{
|
|
QString addFile = fileInfo.absoluteFilePath();
|
|
addFile.replace("\\","/");
|
|
//计算当前文件夹与项目文件所在文件夹的相对路径
|
|
hedFile->append(" \\\n "+relaDir.relativeFilePath(fileInfo.absoluteFilePath()));
|
|
}
|
|
/**< Others */
|
|
else if(("Makefile"==fileInfo.fileName())&&(ftypes.Other&&0x01))
|
|
{
|
|
QString addFile = fileInfo.absoluteFilePath();
|
|
addFile.replace("\\","/");
|
|
//计算当前文件夹与项目文件所在文件夹的相对路径
|
|
disFile->append(" \\\n "+relaDir.relativeFilePath(fileInfo.absoluteFilePath()));
|
|
}
|
|
else if(("asm"==extension) & ((ftypes.Other>>1)&&0x01))
|
|
{
|
|
QString addFile = fileInfo.absoluteFilePath();
|
|
addFile.replace("\\","/");
|
|
//计算当前文件夹与项目文件所在文件夹的相对路径
|
|
disFile->append(" \\\n "+relaDir.relativeFilePath(fileInfo.absoluteFilePath()));
|
|
}
|
|
else if(("s"==extension) & ((ftypes.Other>>2)&&0x01))
|
|
{
|
|
QString addFile = fileInfo.absoluteFilePath();
|
|
addFile.replace("\\","/");
|
|
//计算当前文件夹与项目文件所在文件夹的相对路径
|
|
disFile->append(" \\\n "+relaDir.relativeFilePath(fileInfo.absoluteFilePath()));
|
|
}
|
|
else if(("xml"==extension) & ((ftypes.Other>>3)&&0x01))
|
|
{
|
|
QString addFile = fileInfo.absoluteFilePath();
|
|
addFile.replace("\\","/");
|
|
//计算当前文件夹与项目文件所在文件夹的相对路径
|
|
disFile->append(" \\\n "+relaDir.relativeFilePath(fileInfo.absoluteFilePath()));
|
|
}
|
|
}
|
|
i++;
|
|
}while(i<filelist.count());
|
|
emit EngineProcessing(false, ++i);
|
|
}
|