genericbinaryfilewidget.cpp
190 lines
| 6.4 KiB
| text/x-c
|
CppLexer
Jeandet Alexis
|
r0 | #include "genericbinaryfilewidget.h" | ||
#include "ui_genericbinaryfilewidget.h" | ||||
#include <QFileDialog> | ||||
#include <QFile> | ||||
#include "srec/srecfile.h" | ||||
Jeandet Alexis
|
r4 | #include "srec/srecfilewidget.h" | ||
#include "BinFile/binaryfile.h" | ||||
#include "BinFile/binaryfilewidget.h" | ||||
#include "elf/elffile.h" | ||||
#include "elf/elffilewidget.h" | ||||
Jeandet Alexis
|
r0 | |||
genericBinaryFileWidget::genericBinaryFileWidget(QWidget *parent) : | ||||
QWidget(parent), | ||||
ui(new Ui::genericBinaryFileWidget) | ||||
{ | ||||
ui->setupUi(this); | ||||
Jeandet Alexis
|
r4 | connect(this->ui->openFileQpb,SIGNAL(clicked()),this,SLOT(openFile())); | ||
connect(this->ui->removeFileQpb,SIGNAL(clicked()),this,SLOT(removeFiles())); | ||||
connect(this->ui->fileList,SIGNAL(cellActivated(int,int)),this,SLOT(fileCellActivated(int,int))); | ||||
Jeandet Alexis
|
r5 | connect(this->ui->fileList,SIGNAL(openFiles(QStringList)),this,SLOT(openFile(QStringList))); | ||
Jeandet Alexis
|
r0 | } | ||
genericBinaryFileWidget::~genericBinaryFileWidget() | ||||
{ | ||||
delete ui; | ||||
} | ||||
void genericBinaryFileWidget::openFile() | ||||
{ | ||||
QStringList filesNames = QFileDialog::getOpenFileNames( | ||||
this, | ||||
"Select one or more files to open", | ||||
NULL, | ||||
"Binary Files (*.bin);;SREC Files (*.srec);;Elf Files (*)"); | ||||
Jeandet Alexis
|
r5 | openFile(filesNames); | ||
} | ||||
void genericBinaryFileWidget::openFile(const QStringList &FileList) | ||||
{ | ||||
for(int i=0;i<FileList.count();i++) | ||||
Jeandet Alexis
|
r0 | { | ||
Jeandet Alexis
|
r4 | bool fileOpened = false; | ||
for(int l=0;l<files.count();l++) | ||||
{ | ||||
Jeandet Alexis
|
r5 | if(FileList.at(i)==files.at(l)->fileName) | ||
Jeandet Alexis
|
r4 | { | ||
fileOpened = true; | ||||
} | ||||
} | ||||
Jeandet Alexis
|
r5 | QFile file(FileList.at(i)); | ||
Jeandet Alexis
|
r4 | if(!fileOpened && file.open(QIODevice::ReadOnly)) | ||
Jeandet Alexis
|
r0 | { | ||
char magic[4]; | ||||
file.read(magic,4); | ||||
QString line; | ||||
switch((int)magic[0]) | ||||
{ | ||||
Jeandet Alexis
|
r4 | case 0x7F: | ||
if((magic[1]=='E') && (magic[2]=='L') && (magic[3]=='F')) | ||||
Jeandet Alexis
|
r0 | { | ||
Jeandet Alexis
|
r5 | files.append(new FileListElement(FileList.at(i),false,Type_Elf,NULL,NULL)); | ||
Jeandet Alexis
|
r0 | } | ||
break; | ||||
case 'S': | ||||
file.seek(0); | ||||
line = file.readLine(); | ||||
if(srecFile::checkSum(line)) | ||||
{ | ||||
Jeandet Alexis
|
r5 | files.append(new FileListElement(FileList.at(i),false,Type_SREC,NULL,NULL)); | ||
Jeandet Alexis
|
r0 | } | ||
break; | ||||
default: | ||||
Jeandet Alexis
|
r5 | files.append(new FileListElement(FileList.at(i),false,Type_Bin,NULL,NULL)); | ||
Jeandet Alexis
|
r0 | break; | ||
} | ||||
} | ||||
} | ||||
Jeandet Alexis
|
r4 | updateFileList(); | ||
Jeandet Alexis
|
r0 | } | ||
Jeandet Alexis
|
r4 | void genericBinaryFileWidget::updateFileList() | ||
{ | ||||
this->ui->fileList->clear(); | ||||
this->ui->fileList->setRowCount(files.count()); | ||||
this->ui->fileList->setHorizontalHeaderLabels(QStringList()<<"File"<<"Type"); | ||||
for(int i=0;i<files.count();i++) | ||||
{ | ||||
QTableWidgetItem *newItem = new QTableWidgetItem(files.at(i)->fileName); | ||||
newItem->setFlags(newItem->flags() ^ Qt::ItemIsEditable); | ||||
this->ui->fileList->setItem(i, 0, newItem); | ||||
newItem = new QTableWidgetItem(files.at(i)->type()); | ||||
newItem->setFlags(newItem->flags() ^ Qt::ItemIsEditable); | ||||
this->ui->fileList->setItem(i, 1, newItem); | ||||
} | ||||
this->ui->fileList->resizeColumnsToContents(); | ||||
} | ||||
void genericBinaryFileWidget::removeFiles() | ||||
{ | ||||
QList<QTableWidgetItem*> items = this->ui->fileList->selectedItems(); | ||||
for(int i=0;i<items.count();i++) | ||||
{ | ||||
QString filename = this->ui->fileList->item(items.at(i)->row(),0)->text(); | ||||
for(int l=0;l<files.count();l++) | ||||
{ | ||||
if(files.at(l)->fileName==filename) | ||||
{ | ||||
if(files.at(l)->isOpened) | ||||
{ | ||||
for(int m=0;m<this->ui->fileViewerTab->count();m++) | ||||
{ | ||||
if(this->ui->fileViewerTab->widget(m)==this->files.at(l)->viewer) | ||||
{ | ||||
this->ui->fileViewerTab->removeTab(m); | ||||
} | ||||
} | ||||
delete this->files.at(l)->viewer; | ||||
delete this->files.at(l)->parser; | ||||
} | ||||
delete files.at(l); | ||||
files.removeAt(l); | ||||
} | ||||
} | ||||
} | ||||
updateFileList(); | ||||
} | ||||
void genericBinaryFileWidget::fileCellActivated(int row, int column) | ||||
{ | ||||
Q_UNUSED(column) | ||||
QString fileName = this->ui->fileList->item(row,0)->text(); | ||||
if(fileName!="") | ||||
{ | ||||
for(int l=0;l<files.count();l++) | ||||
{ | ||||
FileListElement* file = files.at(l); | ||||
if(file->fileName==fileName) | ||||
{ | ||||
if(!file->isOpened) | ||||
{ | ||||
if(file->parser==NULL) | ||||
{ | ||||
switch (file->FileType) | ||||
{ | ||||
case Type_Bin: | ||||
file->parser = new binaryFile(file->fileName); | ||||
if(file->viewer==NULL) | ||||
{ | ||||
file->viewer = new binaryFileWidget(); | ||||
file->viewer->setFile(file->parser); | ||||
this->ui->fileViewerTab->addTab(file->viewer,file->fileName); | ||||
} | ||||
file->isOpened = true; | ||||
break; | ||||
case Type_Elf: | ||||
file->parser = new ElfFile(file->fileName); | ||||
if(file->viewer==NULL) | ||||
{ | ||||
file->viewer = new elfFileWidget(); | ||||
file->viewer->setFile(file->parser); | ||||
this->ui->fileViewerTab->addTab(file->viewer,file->fileName); | ||||
} | ||||
file->isOpened = true; | ||||
break; | ||||
case Type_SREC: | ||||
file->parser = new srecFile(file->fileName); | ||||
if(file->viewer==NULL) | ||||
{ | ||||
file->viewer = new srecFileWidget(); | ||||
file->viewer->setFile(file->parser); | ||||
this->ui->fileViewerTab->addTab(file->viewer,file->fileName); | ||||
} | ||||
file->isOpened = true; | ||||
break; | ||||
default: | ||||
break; | ||||
} | ||||
} | ||||
} | ||||
} | ||||
} | ||||
} | ||||
} | ||||
Jeandet Alexis
|
r0 | |||