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 #include #include -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 #include #include #include #include #include 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