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