1 #include "ELFHeaderView.h"
2 #include "string_format.h"
3 #include "lexical_cast_ex.h"
4
5 #include <QLabel>
6 #include <QFontMetrics>
7
CELFHeaderView(QMdiSubWindow * parent,QLayout * groupBoxLayout)8 CELFHeaderView::CELFHeaderView(QMdiSubWindow* parent, QLayout* groupBoxLayout)
9 : QWidget(parent)
10 {
11
12 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:"};
13 m_layout = new QVBoxLayout(this);
14
15 auto label = new QLabel(this);
16 QFontMetrics metric(label->font());
17 delete label;
18 auto labelWidth = metric.horizontalAdvance(labelsStr.back().c_str()) + 10;
19
20 for(auto labelStr : labelsStr)
21 {
22 auto horizontalLayout = new QHBoxLayout();
23 auto label = new QLabel(this);
24 label->setText(labelStr.c_str());
25 label->setFixedWidth(labelWidth);
26
27 horizontalLayout->addWidget(label);
28
29 auto lineEdit = new QLineEdit(this);
30 lineEdit->setReadOnly(true);
31 m_editFields.push_back(lineEdit);
32
33 horizontalLayout->addWidget(lineEdit);
34 m_layout->addLayout(horizontalLayout);
35 }
36
37 groupBoxLayout->addWidget(this);
38 hide();
39 }
40
Reset()41 void CELFHeaderView::Reset()
42 {
43 for(auto editField : m_editFields)
44 {
45 editField->clear();
46 }
47 }
48
SetELF(CELF * pELF)49 void CELFHeaderView::SetELF(CELF* pELF)
50 {
51 m_pELF = pELF;
52 FillInformation();
53 }
54
FillInformation()55 void CELFHeaderView::FillInformation()
56 {
57 int i = 0;
58 std::string sTemp;
59 const ELFHEADER* pH = &m_pELF->GetHeader();
60
61 switch(pH->nType)
62 {
63 case CELF::ET_NONE:
64 sTemp = ("ET_NONE");
65 break;
66 case CELF::ET_REL:
67 sTemp = ("ET_REL");
68 break;
69 case CELF::ET_EXEC:
70 sTemp = ("ET_EXEC");
71 break;
72 case CELF::ET_DYN:
73 sTemp = ("ET_DYN");
74 break;
75 case CELF::ET_CORE:
76 sTemp = ("ET_CORE");
77 break;
78 default:
79 sTemp = string_format(("Unknown (%i)"), pH->nType);
80 break;
81 }
82 m_editFields[i++]->setText(sTemp.c_str());
83
84 switch(pH->nCPU)
85 {
86 case CELF::EM_NONE:
87 sTemp = ("EM_NONE");
88 break;
89 case CELF::EM_M32:
90 sTemp = ("EM_M32");
91 break;
92 case CELF::EM_SPARC:
93 sTemp = ("EM_SPARC");
94 break;
95 case CELF::EM_386:
96 sTemp = ("EM_386");
97 break;
98 case CELF::EM_68K:
99 sTemp = ("EM_68K");
100 break;
101 case CELF::EM_88K:
102 sTemp = ("EM_88K");
103 break;
104 case CELF::EM_860:
105 sTemp = ("EM_860");
106 break;
107 case CELF::EM_MIPS:
108 sTemp = ("EM_MIPS");
109 break;
110 case CELF::EM_ARM:
111 sTemp = ("EM_ARM");
112 break;
113 default:
114 sTemp = string_format(("Unknown (%i)"), pH->nCPU);
115 break;
116 }
117 m_editFields[i++]->setText(sTemp.c_str());
118
119 switch(pH->nVersion)
120 {
121 case CELF::EV_NONE:
122 sTemp = ("EV_NONE");
123 break;
124 case CELF::EV_CURRENT:
125 sTemp = ("EV_CURRENT");
126 break;
127 default:
128 sTemp = string_format(("Unknown (%i)"), pH->nVersion);
129 break;
130 }
131 m_editFields[i++]->setText(sTemp.c_str());
132
133 m_editFields[i++]->setText((("0x") + lexical_cast_hex<std::string>(pH->nEntryPoint, 8)).c_str());
134 m_editFields[i++]->setText((("0x") + lexical_cast_hex<std::string>(pH->nFlags, 8)).c_str());
135 m_editFields[i++]->setText((("0x") + lexical_cast_hex<std::string>(pH->nSize, 8)).c_str());
136 m_editFields[i++]->setText((("0x") + lexical_cast_hex<std::string>(pH->nProgHeaderStart, 8)).c_str());
137 m_editFields[i++]->setText((("0x") + lexical_cast_hex<std::string>(pH->nProgHeaderEntrySize, 8)).c_str());
138 m_editFields[i++]->setText(lexical_cast_uint<std::string>(pH->nProgHeaderCount).c_str());
139 m_editFields[i++]->setText((("0x") + lexical_cast_hex<std::string>(pH->nSectHeaderStart, 8)).c_str());
140 m_editFields[i++]->setText((("0x") + lexical_cast_hex<std::string>(pH->nSectHeaderEntrySize, 8)).c_str());
141 m_editFields[i++]->setText(lexical_cast_uint<std::string>(pH->nSectHeaderCount).c_str());
142 m_editFields[i++]->setText(lexical_cast_uint<std::string>(pH->nSectHeaderStringTableIndex).c_str());
143 }
144