Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F4324515
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Size
12 KB
Referenced Files
None
Subscribers
None
View Options
diff --git a/trunk/dlgaddkey.cpp b/trunk/dlgaddkey.cpp
index ebe9dd1..96a408c 100644
--- a/trunk/dlgaddkey.cpp
+++ b/trunk/dlgaddkey.cpp
@@ -1,190 +1,239 @@
#include "dlgaddkey.h"
#include "ui_dlgaddkey.h"
#include "registryhive.h"
#include <QString>
#include <QStringList>
#include <QDebug>
-DlgAddKey::DlgAddKey(QWidget *p_parent, QString key_name, QString key_value_type, QByteArray key_value) :
+DlgAddKey::DlgAddKey(QWidget *p_parent,
+ QString key_name,
+ QString key_value_type,
+ QByteArray key_value) :
QDialog(p_parent),
ui(new Ui::DlgAddKey)
{
this->p_current_widget=NULL;
ui->setupUi(this);
// Create widgets
- this->CreateWidgets();
+ this->CreateValueWidgets();
// Set dialog title
if(key_name.isEmpty() && key_value_type.isEmpty() && key_value.isEmpty()) {
// If no values were passed, we consider this the ddd key dialog
this->setWindowTitle(tr("Add key"));
} else {
// If a value was passed, this is considered the edit key dialog
this->setWindowTitle(tr("Edit key"));
this->ui->EdtKeyName->setEnabled(false);
+ this->ui->CmbKeyType->setEnabled(false);
}
// Preload key value type values
QStringList value_types=RegistryHive::GetKeyValueTypes();
this->ui->CmbKeyType->addItems(value_types);
// Load values
if(!key_name.isEmpty()) this->ui->EdtKeyName->setText(key_name);
if(!key_value_type.isEmpty())
this->ui->CmbKeyType->setCurrentIndex(value_types.indexOf(key_value_type));
-/*
- if(!key_value.isEmpty()) {
- this->ui->EdtKeyValue->setText(
- RegistryHive::KeyValueToString(key_value,
- RegistryHive::StringToKeyValueType(
- key_value_type)));
- }
-*/
+ if(!key_value.isEmpty()) this->SetValueWidgetData(key_value,key_value_type);
}
DlgAddKey::~DlgAddKey() {
- this->DestroyWidgets();
+ this->DestroyValueWidgets();
delete ui;
}
QString DlgAddKey::KeyName() {
return this->ui->EdtKeyName->text();
}
QString DlgAddKey::KeyType() {
return this->ui->CmbKeyType->currentText();
}
QByteArray DlgAddKey::KeyValue() {
- /*
- if(value_type=="REG_NONE") return hive_t_REG_NONE;
- if(value_type=="REG_SZ") return hive_t_REG_SZ;
- if(value_type=="REG_EXPAND_SZ") return hive_t_REG_EXPAND_SZ;
- if(value_type=="REG_BINARY") return hive_t_REG_BINARY;
- if(value_type=="REG_DWORD") return hive_t_REG_DWORD;
- if(value_type=="REG_DWORD_BIG_ENDIAN") return hive_t_REG_DWORD_BIG_ENDIAN;
- if(value_type=="REG_LINK") return hive_t_REG_LINK;
- if(value_type=="REG_MULTI_SZ") return hive_t_REG_MULTI_SZ;
- if(value_type=="REG_RESOURCE_LIST") return hive_t_REG_RESOURCE_LIST;
- if(value_type=="REG_FULL_RESOURCE_DESC")
- return hive_t_REG_FULL_RESOURCE_DESCRIPTOR;
- if(value_type=="REG_RESOURCE_REQ_LIST")
- return hive_t_REG_RESOURCE_REQUIREMENTS_LIST;
- if(value_type=="REG_QWORD") return hive_t_REG_QWORD;
-
- // I think this might be a good default :-)
- return hive_t_REG_BINARY;
- */
-
-
-
- return QByteArray("TestTest");
+ return this->GetValueWidgetData();
}
void DlgAddKey::on_BtnCancel_clicked() {
this->reject();
}
void DlgAddKey::on_BtnOk_clicked()
{
this->accept();
}
void DlgAddKey::on_CmbKeyType_currentIndexChanged(const QString &arg1) {
// Remove current widget from grid layout
if(this->p_current_widget!=NULL) {
this->ui->gridLayout->removeWidget(this->p_current_widget);
this->p_current_widget->setVisible(false);
this->p_current_widget=NULL;
}
// Add new widget for selected value type
- // Line edit widget for REG_SZ and REG_EXPAND_SZ
if(arg1=="REG_SZ" || arg1=="REG_EXPAND_SZ") {
+ // Line edit widget for REG_SZ and REG_EXPAND_SZ
this->ui->gridLayout->addWidget(this->p_line_widget,2,1);
this->p_current_widget=this->p_line_widget;
- }
-
- // Text edit widget for REG_MULTI_SZ
- if(arg1=="REG_MULTI_SZ") {
+ } else if(arg1=="REG_MULTI_SZ") {
+ // Text edit widget for REG_MULTI_SZ
this->ui->gridLayout->addWidget(this->p_text_widget,2,1);
this->p_current_widget=this->p_text_widget;
- }
-
- // Number widget for REG_DWORD, REG_DWORD_BIG_ENDIAN and REG_QWORD
- if(arg1=="REG_DWORD" || arg1=="REG_DWORD_BIG_ENDIAN" || arg1=="REG_QWORD") {
+ } else if(arg1=="REG_DWORD" ||
+ arg1=="REG_DWORD_BIG_ENDIAN" ||
+ arg1=="REG_QWORD")
+ {
+ // Number widget for REG_DWORD, REG_DWORD_BIG_ENDIAN and REG_QWORD
this->ui->gridLayout->addWidget(this->p_number_widget,2,1);
this->p_current_widget=this->p_number_widget;
- }
-
- // Binary widget for all other types
- if(arg1=="REG_BINARY" || arg1=="REG_LINK" || arg1=="REG_RESOURCE_LIST" ||
- arg1=="REG_FULL_RESOURCE_DESC" || arg1=="REG_RESOURCE_REQ_LIST")
+ } else if(arg1=="REG_BINARY" ||
+ arg1=="REG_LINK" ||
+ arg1=="REG_RESOURCE_LIST" ||
+ arg1=="REG_FULL_RESOURCE_DESC" ||
+ arg1=="REG_RESOURCE_REQ_LIST")
{
+ // Binary widget for all other types
this->ui->gridLayout->addWidget(this->p_binary_widget,2,1);
this->p_current_widget=this->p_binary_widget;
}
if(arg1!="REG_NONE") {
this->p_current_widget->setVisible(true);
this->ui->LblKeyValue->setVisible(true);
} else {
this->ui->LblKeyValue->setVisible(false);
}
}
-void DlgAddKey::CreateWidgets() {
+void DlgAddKey::CreateValueWidgets() {
this->p_line_widget=new QWidget();
this->p_line_widget_layout=new QHBoxLayout(this->p_line_widget);
this->p_line_widget_line_edit=new QLineEdit();
this->p_line_widget->setContentsMargins(0,0,0,0);
this->p_line_widget_layout->setContentsMargins(0,0,0,0);
this->p_line_widget_layout->addWidget(this->p_line_widget_line_edit);
this->p_text_widget=new QWidget();
this->p_text_widget_layout=new QHBoxLayout(this->p_text_widget);
this->p_text_widget_text_edit=new QPlainTextEdit();
this->p_text_widget->setContentsMargins(0,0,0,0);
this->p_text_widget_layout->setContentsMargins(0,0,0,0);
this->p_text_widget_layout->addWidget(this->p_text_widget_text_edit);
this->p_number_widget=new QWidget();
this->p_number_widget_layout=new QHBoxLayout(this->p_number_widget);
this->p_number_widget_line_edit=new QLineEdit();
this->p_number_widget_rb_decimal=new QRadioButton(tr("Dec base"));
this->p_number_widget_rb_decimal->setChecked(true);
this->p_number_widget_rb_hex=new QRadioButton(tr("Hex base"));
this->p_number_widget->setContentsMargins(0,0,0,0);
this->p_number_widget_layout->setContentsMargins(0,0,0,0);
this->p_number_widget_layout->addWidget(this->p_number_widget_line_edit);
this->p_number_widget_layout->addWidget(this->p_number_widget_rb_decimal);
this->p_number_widget_layout->addWidget(this->p_number_widget_rb_hex);
this->p_binary_widget=new QWidget();
this->p_binary_widget_layout=new QHBoxLayout(this->p_binary_widget);
this->p_binary_widget->setContentsMargins(0,0,0,0);
this->p_binary_widget_layout->setContentsMargins(0,0,0,0);
}
-void DlgAddKey::DestroyWidgets() {
+void DlgAddKey::DestroyValueWidgets() {
delete this->p_line_widget_line_edit;
delete this->p_line_widget_layout;
delete this->p_line_widget;
delete this->p_text_widget_text_edit;
delete this->p_text_widget_layout;
delete this->p_text_widget;
delete this->p_number_widget_rb_hex;
delete this->p_number_widget_rb_decimal;
delete this->p_number_widget_line_edit;
delete this->p_number_widget_layout;
delete this->p_number_widget;
delete this->p_binary_widget_layout;
delete this->p_binary_widget;
}
+
+void DlgAddKey::SetValueWidgetData(QByteArray &key_value,
+ QString &key_value_type)
+{
+ if(key_value_type=="REG_SZ" || key_value_type=="REG_EXPAND_SZ") {
+ p_line_widget_line_edit->setText(
+ RegistryHive::KeyValueToString(key_value,
+ RegistryHive::StringToKeyValueType(
+ key_value_type)));
+ } else if(key_value_type=="REG_MULTI_SZ") {
+ // TODO: How should text be splitted? Ascii, utfxx ??????
+ // p_text_widget_text_edit
+ } else if(key_value_type=="REG_DWORD") {
+ p_number_widget_line_edit->setText(
+ RegistryHive::KeyValueToString(key_value,"int32"));
+ } else if(key_value_type=="REG_DWORD_BIG_ENDIAN") {
+ p_number_widget_line_edit->setText(
+ RegistryHive::KeyValueToString(key_value,"int32",0,0,false));
+ } else if(key_value_type=="REG_QWORD") {
+ p_number_widget_line_edit->setText(
+ RegistryHive::KeyValueToString(key_value,"int64",0,0,false));
+ } else if(key_value_type=="REG_BINARY" ||
+ key_value_type=="REG_LINK" ||
+ key_value_type=="REG_RESOURCE_LIST" ||
+ key_value_type=="REG_FULL_RESOURCE_DESC" ||
+ key_value_type=="REG_RESOURCE_REQ_LIST")
+ {
+ // TODO: Set binary data
+ }
+}
+
+QByteArray DlgAddKey::GetValueWidgetData() {
+ QString key_value_type=this->KeyType();
+
+ if(key_value_type=="REG_SZ" || key_value_type=="REG_EXPAND_SZ") {
+ // TODO: Won't work! Normally UTF16_LE, but??????
+ return QByteArray(p_line_widget_line_edit->text().toLocal8Bit().constData());
+ } else if(key_value_type=="REG_MULTI_SZ") {
+ // TODO: How should text be concatenated? Ascii, utfxx ??????
+ // p_text_widget_text_edit
+ return QByteArray();
+ } else if(key_value_type=="REG_DWORD") {
+ // TODO: When pressing ok, we need to check if conversion to number works!
+ // TODO: We need host_to_le32 here!
+ int32_t val;
+ if(p_number_widget_rb_decimal->isChecked()) {
+ val=p_number_widget_line_edit->text().toInt();
+ } else {
+ val=p_number_widget_line_edit->text().toInt(0,16);
+ }
+ return QByteArray((char*)&val,4);
+ } else if(key_value_type=="REG_DWORD_BIG_ENDIAN") {
+ // TODO: Convert to big endian
+ return QByteArray();
+ } else if(key_value_type=="REG_QWORD") {
+ // TODO: We need host_to_le64 here!
+ int64_t val;
+ if(p_number_widget_rb_decimal->isChecked()) {
+ val=p_number_widget_line_edit->text().toLongLong();
+ } else {
+ val=p_number_widget_line_edit->text().toLongLong(0,16);
+ }
+ return QByteArray((char*)&val,8);
+ } else if(key_value_type=="REG_BINARY" ||
+ key_value_type=="REG_LINK" ||
+ key_value_type=="REG_RESOURCE_LIST" ||
+ key_value_type=="REG_FULL_RESOURCE_DESC" ||
+ key_value_type=="REG_RESOURCE_REQ_LIST")
+ {
+ // TODO: Return binary data
+ return QByteArray();
+ }
+ return QByteArray();
+}
diff --git a/trunk/dlgaddkey.h b/trunk/dlgaddkey.h
index e9991ce..a15c3c3 100644
--- a/trunk/dlgaddkey.h
+++ b/trunk/dlgaddkey.h
@@ -1,55 +1,57 @@
#ifndef DLGADDKEY_H
#define DLGADDKEY_H
#include <QDialog>
#include <QWidget>
#include <QHBoxLayout>
#include <QLineEdit>
#include <QPlainTextEdit>
#include <QRadioButton>
namespace Ui {
class DlgAddKey;
}
class DlgAddKey : public QDialog {
Q_OBJECT
public:
explicit DlgAddKey(QWidget *p_parent=0,
QString key_name=QString(),
QString key_value_type=QString(),
QByteArray key_value=QByteArray());
~DlgAddKey();
QString KeyName();
QString KeyType();
QByteArray KeyValue();
private slots:
void on_BtnCancel_clicked();
void on_BtnOk_clicked();
void on_CmbKeyType_currentIndexChanged(const QString &arg1);
private:
Ui::DlgAddKey *ui;
QWidget *p_current_widget;
QWidget *p_line_widget;
QHBoxLayout *p_line_widget_layout;
QLineEdit *p_line_widget_line_edit;
QWidget *p_text_widget;
QHBoxLayout *p_text_widget_layout;
QPlainTextEdit *p_text_widget_text_edit;
QWidget *p_number_widget;
QHBoxLayout *p_number_widget_layout;
QLineEdit *p_number_widget_line_edit;
QRadioButton *p_number_widget_rb_decimal;
QRadioButton *p_number_widget_rb_hex;
QWidget *p_binary_widget;
QHBoxLayout *p_binary_widget_layout;
- void CreateWidgets();
- void DestroyWidgets();
+ void CreateValueWidgets();
+ void DestroyValueWidgets();
+ void SetValueWidgetData(QByteArray &key_value, QString &key_value_type);
+ QByteArray GetValueWidgetData();
};
#endif // DLGADDKEY_H
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Mon, Dec 23, 11:38 AM (12 h, 6 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1176829
Default Alt Text
(12 KB)
Attached To
Mode
rFRED fred
Attached
Detach File
Event Timeline
Log In to Comment