QtProAddFileHelper/engine.cpp

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);
}