Page MenuHomePhabricator

No OneTemporary

Size
12 KB
Referenced Files
None
Subscribers
None
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

Mime Type
text/x-diff
Expires
Mon, Dec 23, 5:21 AM (44 m, 24 s)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1176829
Default Alt Text
(12 KB)

Event Timeline