diff --git a/elf/elffilewidget.cpp b/elf/elffilewidget.cpp --- a/elf/elffilewidget.cpp +++ b/elf/elffilewidget.cpp @@ -62,9 +62,9 @@ elfFileWidget::~elfFileWidget() -void elfFileWidget::setFile(ElfFile *file) +void elfFileWidget::setFile(abstractBinFile *file) { - this->p_elf = file; + this->p_elf = (ElfFile*)file; if(p_elf->isopened() && p_elf->iself()) { this->ui->classLabel->setText(p_elf->getClass()); @@ -235,23 +235,27 @@ void elfFileWidget::viewSymbolInHexViewe { int row=this->ui->symbolsList->item(this->ui->symbolsList->currentRow(),0)->text().toInt(); int section = p_elf->getSectionIndex(p_elf->getSymbolSectionName(row)); - qint64 address = p_elf->getSymbolAddress(row); - qint64 secAddress = p_elf->getSectionPaddr(section); - qint64 size = p_elf->getSymbolSize(row); - char* buff=NULL; - char* symBuff=NULL; - if(size && !p_elf->sectionIsNobits(section)) + if(section!=-1) { - if(section!=-1) + qint64 address = p_elf->getSymbolAddress(row); + qint64 secAddress = p_elf->getSectionPaddr(section); + qint64 size = p_elf->getSymbolSize(row); + char* buff=NULL; + char* symBuff=NULL; + if(size && !p_elf->sectionIsNobits(section)) { - symBuff = (char*)malloc(size); - this->p_elf->getSectionData(section,&buff); - memcpy(symBuff,buff+(address-secAddress),size); - this->p_hexviewer->setData(QByteArray(symBuff,size)); - this->p_hexviewer->setAddressOffset(address); - this->p_hexviewer->show(); + if(section!=-1) + { + symBuff = (char*)malloc(size); + this->p_elf->getSectionData(section,&buff); + memcpy(symBuff,buff+(address-secAddress),size); + this->p_hexviewer->setData(QByteArray(symBuff,size)); + this->p_hexviewer->setAddressOffset(address); + this->p_hexviewer->show(); + } } } + } void elfFileWidget::filterSymbols(const QString &pattern) @@ -291,23 +295,27 @@ QList elfFileWidget::get { int row=this->ui->symbolsList->item(items.at(i)->row(),0)->text().toInt(); int section = p_elf->getSectionIndex(p_elf->getSymbolSectionName(row)); - qint64 address = p_elf->getSymbolAddress(row); - qint64 secAddress = p_elf->getSectionPaddr(section); - qint64 size = p_elf->getSymbolSize(row); - char* buff=NULL; - if(size && !p_elf->sectionIsNobits(section)) + if(section!=-1) { - if(section!=-1) + qint64 address = p_elf->getSymbolAddress(row); + qint64 secAddress = p_elf->getSectionPaddr(section); + qint64 size = p_elf->getSymbolSize(row); + char* buff=NULL; + if(size && !p_elf->sectionIsNobits(section)) { - fragment= new codeFragment(); - fragment->data = (char*)malloc(size); - fragment->address = address; - fragment->size = size; - this->p_elf->getSectionData(section,&buff); - memcpy(fragment->data,buff+(address-secAddress),size); - fragments.append(fragment); + if(section!=-1) + { + fragment= new codeFragment(); + fragment->data = (char*)malloc(size); + fragment->address = address; + fragment->size = size; + this->p_elf->getSectionData(section,&buff); + memcpy(fragment->data,buff+(address-secAddress),size); + fragments.append(fragment); + } } } + } } return fragments; diff --git a/elf/elffilewidget.h b/elf/elffilewidget.h --- a/elf/elffilewidget.h +++ b/elf/elffilewidget.h @@ -36,11 +36,11 @@ class elfFileWidget : public abstractBin Q_OBJECT public: - elfFileWidget(QWidget *parent = 0); + explicit elfFileWidget(QWidget *parent = 0); ~elfFileWidget(); public slots: - void setFile(ElfFile* file); + void setFile(abstractBinFile* file); void reloadFile(); void updateSymbols(); void updateSections(); diff --git a/genericBinaryFiles.qrc b/genericBinaryFiles.qrc new file mode 100644 --- /dev/null +++ b/genericBinaryFiles.qrc @@ -0,0 +1,6 @@ + + + ressources/Gnome-list-add.svg + ressources/Gnome-user-trash.svg + + diff --git a/genericbinaryfilewidget.cpp b/genericbinaryfilewidget.cpp --- a/genericbinaryfilewidget.cpp +++ b/genericbinaryfilewidget.cpp @@ -3,12 +3,21 @@ #include #include #include "srec/srecfile.h" +#include "srec/srecfilewidget.h" +#include "BinFile/binaryfile.h" +#include "BinFile/binaryfilewidget.h" +#include "elf/elffile.h" +#include "elf/elffilewidget.h" + genericBinaryFileWidget::genericBinaryFileWidget(QWidget *parent) : QWidget(parent), ui(new Ui::genericBinaryFileWidget) { ui->setupUi(this); + 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))); } genericBinaryFileWidget::~genericBinaryFileWidget() @@ -26,18 +35,26 @@ void genericBinaryFileWidget::openFile() for(int i=0;ifileName) + { + fileOpened = true; + } + } QFile file(filesNames.at(i)); - if(file.open(QIODevice::ReadOnly)) + if(!fileOpened && file.open(QIODevice::ReadOnly)) { char magic[4]; file.read(magic,4); QString line; switch((int)magic[0]) { - case 'e': - if((magic[1]=='l') && (magic[2]=='f')) + case 0x7F: + if((magic[1]=='E') && (magic[2]=='L') && (magic[3]=='F')) { - files.append(new FileListElement(filesNames.at(i),false,Type_Elf,NULL)); + files.append(new FileListElement(filesNames.at(i),false,Type_Elf,NULL,NULL)); } break; case 'S': @@ -45,18 +62,124 @@ void genericBinaryFileWidget::openFile() line = file.readLine(); if(srecFile::checkSum(line)) { - files.append(new FileListElement(filesNames.at(i),false,Type_SREC,NULL)); + files.append(new FileListElement(filesNames.at(i),false,Type_SREC,NULL,NULL)); } break; default: - files.append(new FileListElement(filesNames.at(i),false,Type_Bin,NULL)); + files.append(new FileListElement(filesNames.at(i),false,Type_Bin,NULL,NULL)); break; } } } + updateFileList(); } +void genericBinaryFileWidget::updateFileList() +{ + this->ui->fileList->clear(); + this->ui->fileList->setRowCount(files.count()); + this->ui->fileList->setHorizontalHeaderLabels(QStringList()<<"File"<<"Type"); + for(int i=0;ifileName); + 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 items = this->ui->fileList->selectedItems(); + for(int i=0;iui->fileList->item(items.at(i)->row(),0)->text(); + for(int l=0;lfileName==filename) + { + if(files.at(l)->isOpened) + { + for(int m=0;mui->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;lfileName==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; + } + } + } + } + } + } +} + diff --git a/genericbinaryfilewidget.h b/genericbinaryfilewidget.h --- a/genericbinaryfilewidget.h +++ b/genericbinaryfilewidget.h @@ -15,12 +15,30 @@ class FileListElement { public: FileListElement() {} - FileListElement(QString fileName,bool isOpened,FileTypeEnum FileType,abstractBinFileWidget* viewer) - :fileName(fileName),isOpened(isOpened),FileType(FileType),viewer(viewer){} + FileListElement(QString fileName,bool isOpened,FileTypeEnum FileType,abstractBinFileWidget* viewer=0,abstractBinFile* parser=0) + :fileName(fileName),isOpened(isOpened),FileType(FileType),viewer(viewer),parser(parser){} + QString type() + { + switch (this->FileType) { + case Type_SREC: + return "Srec"; + break; + case Type_Bin: + return "Binary"; + break; + case Type_Elf: + return "Elf"; + break; + default: + return "Unknow"; + break; + } + } QString fileName; bool isOpened; FileTypeEnum FileType; abstractBinFileWidget* viewer; + abstractBinFile* parser; }; class genericBinaryFileWidget : public QWidget @@ -33,6 +51,9 @@ public: public slots: void openFile(); + void updateFileList(); + void removeFiles(); + void fileCellActivated(int row, int column); private: Ui::genericBinaryFileWidget *ui; diff --git a/genericbinaryfilewidget.ui b/genericbinaryfilewidget.ui --- a/genericbinaryfilewidget.ui +++ b/genericbinaryfilewidget.ui @@ -30,8 +30,8 @@ - - :/images/add.svg:/images/add.svg + + :/img/ressources/Gnome-list-add.svg:/img/ressources/Gnome-list-add.svg @@ -47,8 +47,8 @@ - - :/images/trash.svg:/images/trash.svg + + :/img/ressources/Gnome-user-trash.svg:/img/ressources/Gnome-user-trash.svg @@ -72,7 +72,7 @@ - + File @@ -97,7 +97,7 @@ - + diff --git a/ressources/Gnome-list-add.svg b/ressources/Gnome-list-add.svg new file mode 100644 --- /dev/null +++ b/ressources/Gnome-list-add.svg @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/ressources/Gnome-user-trash.svg b/ressources/Gnome-user-trash.svg new file mode 100644 --- /dev/null +++ b/ressources/Gnome-user-trash.svg @@ -0,0 +1,266 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + Trash + + + Jakub Steiner + + + + + + trash + delete + wastebasket + empty + + + + + + + + + + + + + + + + + + + + + + + + + + + + +