Play-/Source/ui_qt/DebugSupport/ELFHeaderView.cpp

155 lines
4 KiB
C++
Raw Permalink Normal View History

2019-12-21 18:36:40 +00:00
#include "ELFHeaderView.h"
#include "string_format.h"
#include "lexical_cast_ex.h"
#include <QLabel>
#include <QFontMetrics>
template <typename ElfType>
CELFHeaderView<ElfType>::CELFHeaderView(QMdiSubWindow* parent, QLayout* groupBoxLayout)
2019-12-21 18:48:44 +00:00
: QWidget(parent)
2019-12-21 18:36:40 +00:00
{
std::vector<std::string> labelsStr = {"Type:", "Machine:", "Version:", "Entry Point:", "Flags:", "Header Size:", "Program Header Table Offset:", "Program Header Size:", "Program Header Count:", "Section Header Table Offset:", "Section Header Size:", "Section Header Count:", "Section Header String Table Index:"};
m_layout = new QVBoxLayout(this);
auto label = new QLabel(this);
QFontMetrics metric(label->font());
delete label;
auto labelWidth = metric.horizontalAdvance(labelsStr.back().c_str()) + 10;
for(auto labelStr : labelsStr)
{
auto horizontalLayout = new QHBoxLayout();
2019-12-21 18:36:40 +00:00
auto label = new QLabel(this);
label->setText(labelStr.c_str());
label->setFixedWidth(labelWidth);
horizontalLayout->addWidget(label);
auto lineEdit = new QLineEdit(this);
lineEdit->setReadOnly(true);
m_editFields.push_back(lineEdit);
horizontalLayout->addWidget(lineEdit);
m_layout->addLayout(horizontalLayout);
}
2022-03-16 19:30:44 -04:00
m_layout->addStretch();
2019-12-21 18:36:40 +00:00
groupBoxLayout->addWidget(this);
hide();
}
template <typename ElfType>
void CELFHeaderView<ElfType>::Reset()
2019-12-21 18:36:40 +00:00
{
for(auto editField : m_editFields)
{
editField->clear();
}
}
template <typename ElfType>
void CELFHeaderView<ElfType>::SetELF(ElfType* pELF)
2019-12-21 18:36:40 +00:00
{
m_pELF = pELF;
FillInformation();
}
template <typename ElfType>
void CELFHeaderView<ElfType>::FillInformation()
2019-12-21 18:36:40 +00:00
{
int i = 0;
std::string sTemp;
2022-03-15 08:13:44 -04:00
auto pH = &m_pELF->GetHeader();
2019-12-21 18:36:40 +00:00
switch(pH->nType)
{
case ELF::ET_NONE:
2019-12-21 18:36:40 +00:00
sTemp = ("ET_NONE");
break;
case ELF::ET_REL:
2019-12-21 18:36:40 +00:00
sTemp = ("ET_REL");
break;
case ELF::ET_EXEC:
2019-12-21 18:36:40 +00:00
sTemp = ("ET_EXEC");
break;
case ELF::ET_DYN:
2019-12-21 18:36:40 +00:00
sTemp = ("ET_DYN");
break;
case ELF::ET_CORE:
2019-12-21 18:36:40 +00:00
sTemp = ("ET_CORE");
break;
default:
sTemp = string_format(("Unknown (%i)"), pH->nType);
break;
}
m_editFields[i++]->setText(sTemp.c_str());
switch(pH->nCPU)
{
case ELF::EM_NONE:
2019-12-21 18:36:40 +00:00
sTemp = ("EM_NONE");
break;
case ELF::EM_M32:
2019-12-21 18:36:40 +00:00
sTemp = ("EM_M32");
break;
case ELF::EM_SPARC:
2019-12-21 18:36:40 +00:00
sTemp = ("EM_SPARC");
break;
case ELF::EM_386:
2019-12-21 18:36:40 +00:00
sTemp = ("EM_386");
break;
case ELF::EM_68K:
2019-12-21 18:36:40 +00:00
sTemp = ("EM_68K");
break;
case ELF::EM_88K:
2019-12-21 18:36:40 +00:00
sTemp = ("EM_88K");
break;
case ELF::EM_860:
2019-12-21 18:36:40 +00:00
sTemp = ("EM_860");
break;
case ELF::EM_MIPS:
2019-12-21 18:36:40 +00:00
sTemp = ("EM_MIPS");
break;
case ELF::EM_PPC64:
2022-03-16 19:30:32 -04:00
sTemp = ("EM_PPC64");
break;
case ELF::EM_ARM:
2019-12-21 18:36:40 +00:00
sTemp = ("EM_ARM");
break;
default:
sTemp = string_format(("Unknown (%i)"), pH->nCPU);
break;
}
m_editFields[i++]->setText(sTemp.c_str());
switch(pH->nVersion)
{
case ELF::EV_NONE:
2019-12-21 18:36:40 +00:00
sTemp = ("EV_NONE");
break;
case ELF::EV_CURRENT:
2019-12-21 18:36:40 +00:00
sTemp = ("EV_CURRENT");
break;
default:
sTemp = string_format(("Unknown (%i)"), pH->nVersion);
break;
}
m_editFields[i++]->setText(sTemp.c_str());
m_editFields[i++]->setText((("0x") + lexical_cast_hex<std::string>(pH->nEntryPoint, 8)).c_str());
m_editFields[i++]->setText((("0x") + lexical_cast_hex<std::string>(pH->nFlags, 8)).c_str());
m_editFields[i++]->setText((("0x") + lexical_cast_hex<std::string>(pH->nSize, 8)).c_str());
m_editFields[i++]->setText((("0x") + lexical_cast_hex<std::string>(pH->nProgHeaderStart, 8)).c_str());
m_editFields[i++]->setText((("0x") + lexical_cast_hex<std::string>(pH->nProgHeaderEntrySize, 8)).c_str());
m_editFields[i++]->setText(lexical_cast_uint<std::string>(pH->nProgHeaderCount).c_str());
m_editFields[i++]->setText((("0x") + lexical_cast_hex<std::string>(pH->nSectHeaderStart, 8)).c_str());
m_editFields[i++]->setText((("0x") + lexical_cast_hex<std::string>(pH->nSectHeaderEntrySize, 8)).c_str());
m_editFields[i++]->setText(lexical_cast_uint<std::string>(pH->nSectHeaderCount).c_str());
m_editFields[i++]->setText(lexical_cast_uint<std::string>(pH->nSectHeaderStringTableIndex).c_str());
}
template class CELFHeaderView<CELF32>;
template class CELFHeaderView<CELF64>;