#include "../runtime/common.h" #include "../runtime/crypto.h" #include "../core/objects.h" #include "../core/osutils.h" #include "../core/streams.h" #include "../core/files.h" #include "../core/lang.h" #include "../core/core.h" #include "../core/processors.h" #include "widgets.h" #include "models.h" #include "property_editor.h" #include "moc/moc_property_editor.cc" std::string formatBase64(const std::string &value) { std::string res = value; size_t len = res.size(); for (size_t i = 0; i < len / 76; i++) { res.insert(res.begin() + (i + 1) * 76 + i, '\n'); } return res; } std::string formatVector(const std::vector &value) { std::string dst; size_t dst_len = Base64EncodeGetRequiredLength(value.size()); if (dst_len) { dst.resize(dst_len); Base64Encode(&value[0], value.size(), &dst[0], dst_len); if (dst_len != dst.size()) dst.resize(dst_len); } return formatBase64(dst); } /** * Property */ Property::Property(Property *parent, const QString &name) : parent_(NULL), name_(name), readOnly_(false) { if (parent) parent->addChild(this); } Property::~Property() { if (parent_) parent_->removeChild(this); clear(); emit destroyed(this); } void Property::clear() { while (!children_.isEmpty()) { QListIterator it(children_); Property *prop = it.next(); delete prop; } } QWidget *Property::createEditor(QWidget * /*parent*/) { return NULL; } QString Property::valueText() const { return QString(); } void Property::setName(const QString &name) { if (name_ == name) return; name_ = name; emit changed(this); } void Property::setReadOnly(bool value) { if (readOnly_ == value) return; readOnly_ = value; emit changed(this); } void Property::addChild(Property *child) { insertChild(childCount(), child); } void Property::insertChild(int index, Property *child) { if (child->parent()) return; child->parent_ = this; children_.insert(index, child); } void Property::removeChild(Property *child) { children_.removeOne(child); } /** * StringProperty */ StringProperty::StringProperty(Property *parent, const QString &name, const QString &value) : Property(parent, name), value_(value) { } QString StringProperty::valueText() const { return value_; } QWidget *StringProperty::createEditor(QWidget *parent) { QLineEdit *editor = new LineEdit(parent); editor->setFrame(false); editor->setText(value_); connect(editor, SIGNAL(textChanged(const QString &)), this, SLOT(editorChanged(const QString &))); return editor; } void StringProperty::editorChanged(const QString &value) { setValue(value); } void StringProperty::setValue(const QString &value) { if (value_ != value) { value_ = value; emit valueChanged(value); emit changed(this); } } /** * BoolProperty */ BoolProperty::BoolProperty(Property *parent, const QString &name, bool value) : Property(parent, name), value_(value) { } QString BoolProperty::valueText() const { return value_ ? QString::fromUtf8(language[lsYes].c_str()) : QString::fromUtf8(language[lsNo].c_str()); } QWidget *BoolProperty::createEditor(QWidget *parent) { BoolEdit *editor = new BoolEdit(parent); editor->setFrame(false); editor->setChecked(value_); connect(editor, SIGNAL(toggled(bool)), this, SLOT(editorChanged(bool))); return editor; } void BoolProperty::editorChanged(bool value) { setValue(value); } void BoolProperty::setValue(bool value) { if (value_ != value) { value_ = value; emit valueChanged(value); emit changed(this); } } /** * DateProperty */ DateProperty::DateProperty(Property *parent, const QString &name, const QDate &value) : Property(parent, name), value_(value) { } QString DateProperty::valueText() const { return value_.toString(Qt::SystemLocaleShortDate); } QWidget *DateProperty::createEditor(QWidget *parent) { QDateEdit *editor = new QDateEdit(parent); editor->setFrame(false); editor->setDate(value_); connect(editor, SIGNAL(dateChanged(const QDate &)), this, SLOT(editorChanged(const QDate &))); return editor; } void DateProperty::editorChanged(const QDate &value) { setValue(value); } void DateProperty::setValue(const QDate &value) { if (value_ != value) { value_ = value; emit valueChanged(value); emit changed(this); } } /** * StringListProperty */ StringListProperty::StringListProperty(Property *parent, const QString &name, const QString &value) : StringProperty(parent, name, value) { } QWidget *StringListProperty::createEditor(QWidget *parent) { StringListEdit *editor = new StringListEdit(parent); editor->document()->setDocumentMargin(0); editor->setFrameShape(QFrame::NoFrame); editor->setPlainText(value()); connect(editor, SIGNAL(textChanged(const QString &)), this, SLOT(editorChanged(const QString &))); return editor; } /** * HexProperty */ /* HexProperty::HexProperty(Property *parent, const QString &name, const QByteArray &value) : Property(parent, name) { edit_ = new QHexEdit(); edit_->setFrameShape(QFrame::NoFrame); edit_->setData(value); } HexProperty::~HexProperty() { delete edit_; } */ /** * GroupProperty */ GroupProperty::GroupProperty(Property *parent, const QString &name) : Property(parent, name) { } /** * CommandProperty */ CommandProperty::CommandProperty(Property *parent, ICommand *value) : Property(parent, QString::fromLatin1(value->display_address().c_str())), value_(value) { text_ = QString::fromUtf8(value_->text().c_str()); } QString CommandProperty::valueText() const { return text_; } bool CommandProperty::hasStaticText(int column) const { if (!value_) return false; if (column == 0) return true; if (column == 1) return (value_->comment().type > ttNone); return false; } QString CommandProperty::staticText(int column) const { if (!value_) return QString(); if (column == 0) return QString::fromLatin1(value_->dump_str().c_str()); if (column == 1) return QString::fromUtf8(value_->comment().display_value().c_str()); return QString(); } QColor CommandProperty::staticColor(int column) const { if (!value_) return QColor(); if (column == 0) return Qt::gray; if (column == 1) { switch (value_->comment().type) { case ttFunction: case ttJmp: return Qt::blue; case ttImport: return Qt::darkRed; case ttExport: return Qt::red; case ttString: return Qt::darkGreen; case ttVariable: return Qt::magenta; case ttComment: return Qt::gray; } } return QColor(); } /** * EnumProperty */ EnumProperty::EnumProperty(Property *parent, const QString &name, const QStringList &items, int value) : Property(parent, name), items_(items), value_(value) { } void EnumProperty::setValue(int value) { if (value_ != value) { value_ = value; emit valueChanged(value); emit changed(this); } } void EnumProperty::editorChanged(int value) { setValue(value); } QString EnumProperty::valueText() const { if (value_ >= 0 && value_ < items_.size()) return items_[value_]; return QString(); } QWidget *EnumProperty::createEditor(QWidget *parent) { EnumEdit *editor = new EnumEdit(parent, items_); editor->setFrame(false); editor->setCurrentIndex(value_); connect(editor, SIGNAL(currentIndexChanged(int)), this, SLOT(editorChanged(int))); return editor; } /** * CompilationTypeProperty */ CompilationTypeProperty::CompilationTypeProperty(Property *parent, const QString &name, CompilationType value) : Property(parent, name), value_(value), defaultValue_(ctNone) { items_ << QString::fromUtf8(language[lsNone].c_str()); items_ << QString::fromUtf8(language[lsVirtualization].c_str()); items_ << QString::fromUtf8(language[lsMutation].c_str()); items_ << QString("%1 (%2 + %3)").arg(QString::fromUtf8(language[lsUltra].c_str())).arg(QString::fromUtf8(language[lsMutation].c_str())).arg(QString::fromUtf8(language[lsVirtualization].c_str())); } void CompilationTypeProperty::setValue(CompilationType value) { if (value_ != value) { value_ = value; emit valueChanged(value); emit changed(this); } } void CompilationTypeProperty::editorChanged(int value) { CompilationType new_value = ctNone; if (value > 0) { if (defaultValue_ == ctNone) new_value = static_cast(value - 1); else new_value = (value == 1) ? defaultValue_ : ctNone; } setValue(new_value); } QString CompilationTypeProperty::valueText() const { switch (value_) { case ctNone: return items_[0]; case ctVirtualization: return items_[1]; case ctMutation: return items_[2]; case ctUltra: return items_[3]; } return QString(); } QWidget *CompilationTypeProperty::createEditor(QWidget *parent) { QStringList items; items << items_[0]; switch (defaultValue_) { case ctNone: items << items_[1]; items << items_[2]; items << items_[3]; break; case ctVirtualization: items << items_[1]; break; case ctMutation: items << items_[2]; break; case ctUltra: items << items_[3]; break; } int index = 0; if (defaultValue_ != ctNone) { if (value_ == defaultValue_) index = 1; } else if (value_ != ctNone) { index = value_ + 1; } EnumEdit *editor = new EnumEdit(parent, items); editor->setFrame(false); editor->setCurrentIndex(index); connect(editor, SIGNAL(currentIndexChanged(int)), this, SLOT(editorChanged(int))); return editor; } /** * FileNameProperty */ FileNameProperty::FileNameProperty(Property *parent, const QString &name, const QString &filter, const QString &value, bool saveMode) : Property(parent, name), filter_(filter), value_(value), saveMode_(saveMode) { } QString FileNameProperty::valueText() const { return value_; } QWidget *FileNameProperty::createEditor(QWidget *parent) { FileNameEdit *editor = new FileNameEdit(parent); editor->setFrame(false); editor->setFilter(filter_); editor->setRelativePath(relativePath_); editor->setText(value_); editor->setSaveMode(saveMode_); connect(editor, SIGNAL(textChanged(const QString &)), this, SLOT(editorChanged(const QString &))); return editor; } void FileNameProperty::editorChanged(const QString &value) { setValue(value); } void FileNameProperty::setValue(const QString &value) { if (value_ != value) { value_ = value; emit valueChanged(value); emit changed(this); } } /** * FileNameProperty */ WatermarkProperty::WatermarkProperty(Property *parent, const QString &name, const QString &value) : Property(parent, name), value_(value) { } QString WatermarkProperty::valueText() const { return value_; } QWidget *WatermarkProperty::createEditor(QWidget *parent) { WatermarkEdit *editor = new WatermarkEdit(parent); editor->setFrame(false); editor->setText(value_); connect(editor, SIGNAL(textChanged(const QString &)), this, SLOT(editorChanged(const QString &))); return editor; } void WatermarkProperty::editorChanged(const QString &value) { setValue(value); } void WatermarkProperty::setValue(const QString &value) { if (value_ != value) { value_ = value; emit valueChanged(value); emit changed(this); } } /** * PropertyManager */ PropertyManager::PropertyManager(QObject *parent) : QAbstractItemModel(parent) { root_ = new GroupProperty(NULL, ""); } PropertyManager::~PropertyManager() { delete root_; } QModelIndex PropertyManager::index(int row, int column, const QModelIndex &parent) const { //if (parent.isValid() && parent.column() != 0) // return QModelIndex(); Property *parentProp = indexToProperty(parent); Property *childProp = parentProp->children().value(row); if (!childProp) return QModelIndex(); return createIndex(row, column, childProp); } QModelIndex PropertyManager::parent(const QModelIndex &index) const { if (!index.isValid()) return QModelIndex(); Property *childProp = indexToProperty(index); Property *parentProp = childProp->parent(); if (parentProp == root_) return QModelIndex(); return createIndex(parentProp->parent()->children().indexOf(parentProp), 0, parentProp); } int PropertyManager::columnCount(const QModelIndex & /* parent */) const { return 2; } int PropertyManager::rowCount(const QModelIndex &parent) const { Property *parentProp = indexToProperty(parent); return parentProp->childCount(); } QVariant PropertyManager::data(const QModelIndex &index, int role) const { if (!index.isValid()) return QVariant(); Property *prop = indexToProperty(index); switch (role) { case Qt::DisplayRole: if (index.column() == 0) { return prop->name(); } else if (index.column() == 1) { return prop->valueText(); } break; case Qt::DecorationRole: if (CommandProperty *c = qobject_cast(prop)) { if (index.column() == 0) { ICommand *command = c->value(); IFunction *func = command->owner(); if (qobject_cast(c->parent())) { return QIcon(":/images/reference.png"); } else if (func->ext_command_list()->GetCommandByAddress(command->address())) { return QIcon(":/images/link.png"); } else if (func->is_breaked_address(command->address())) { return QIcon(":/images/disabled.png"); } QIcon res; QPixmap pixmap(18, 1); pixmap.fill(Qt::transparent); res.addPixmap(pixmap); return res; } } break; case Qt::TextColorRole: if (prop->readOnly() && index.column() == 1) { QPalette palette; return palette.color(QPalette::Disabled, QPalette::Text); } break; case Qt::FontRole: if (!prop->readOnly() && index.column() == 1) { QFont font; font.setBold(true); return font; } break; case Qt::Vmp::StaticTextRole: if (prop->hasStaticText(index.column())) return prop->staticText(index.column()); break; case Qt::Vmp::StaticColorRole: if (prop->hasStaticText(index.column())) return prop->staticColor(index.column()); break; } return QVariant(); } QVariant PropertyManager::headerData(int section, Qt::Orientation /*orientation*/, int role) const { if (role == Qt::DisplayRole) { if (section == 0) { return QString::fromUtf8(language[lsName].c_str()); } else { return QString::fromUtf8(language[lsValue].c_str()); } } return QVariant(); } void PropertyManager::clear() { root_->clear(); } BoolProperty *PropertyManager::addBoolProperty(Property *parent, const QString &name, bool value) { BoolProperty *prop = new BoolProperty(parent ? parent : root_, name, value); addProperty(prop); return prop; } StringProperty *PropertyManager::addStringProperty(Property *parent, const QString &name, const QString &value) { StringProperty *prop = new StringProperty(parent ? parent : root_, name, value); addProperty(prop); return prop; } DateProperty *PropertyManager::addDateProperty(Property *parent, const QString &name, const QDate &value) { DateProperty *prop = new DateProperty(parent ? parent : root_, name, value); addProperty(prop); return prop; } StringListProperty *PropertyManager::addStringListProperty(Property *parent, const QString &name, const QString &value) { StringListProperty *prop = new StringListProperty(parent ? parent : root_, name, value); addProperty(prop); return prop; } GroupProperty *PropertyManager::addGroupProperty(Property *parent, const QString &name) { GroupProperty *prop = new GroupProperty(parent ? parent : root_, name); addProperty(prop); return prop; } EnumProperty *PropertyManager::addEnumProperty(Property *parent, const QString &name, const QStringList &items, int value) { EnumProperty *prop = new EnumProperty(parent ? parent : root_, name, items, value); addProperty(prop); return prop; } FileNameProperty *PropertyManager::addFileNameProperty(Property *parent, const QString &name, const QString &filter, const QString &value, bool saveMode) { FileNameProperty *prop = new FileNameProperty(parent ? parent : root_, name, filter, value, saveMode); addProperty(prop); return prop; } CommandProperty *PropertyManager::addCommandProperty(Property *parent, ICommand *value) { CommandProperty *prop = new CommandProperty(parent ? parent : root_, value); addProperty(prop); return prop; } WatermarkProperty *PropertyManager::addWatermarkProperty(Property *parent, const QString &name, const QString &value) { WatermarkProperty *prop = new WatermarkProperty(parent ? parent : root_, name, value); addProperty(prop); return prop; } CompilationTypeProperty *PropertyManager::addCompilationTypeProperty(Property *parent, const QString &name, CompilationType value) { CompilationTypeProperty *prop = new CompilationTypeProperty(parent ? parent : root_, name, value); addProperty(prop); return prop; } void PropertyManager::addProperty(Property *prop) { if (!prop) return; connect(prop, SIGNAL(destroyed(Property *)), this, SLOT(slotPropertyDestroyed(Property *))); connect(prop, SIGNAL(changed(Property *)), this, SLOT(slotPropertyChanged(Property *))); } Property *PropertyManager::indexToProperty(const QModelIndex &index) const { if (index.isValid()) return static_cast(index.internalPointer()); return root_; } QModelIndex PropertyManager::propertyToIndex(Property *prop) const { if (!prop) return QModelIndex(); return createIndex(prop->parent()->children().indexOf(prop), 0, prop); } void PropertyManager::slotPropertyChanged(Property *prop) { QModelIndex index = propertyToIndex(prop); emit dataChanged(index, index.sibling(index.row(), 1)); } void PropertyManager::slotPropertyDestroyed(Property * /*prop*/) { // } Qt::ItemFlags PropertyManager::flags(const QModelIndex &index) const { if (!index.isValid()) return 0; Qt::ItemFlags res = Qt::ItemIsEnabled | Qt::ItemIsSelectable; Property *prop = indexToProperty(index); if (prop && prop->hasValue() && !prop->readOnly()) res |= Qt::ItemIsEditable; return res; } /** * PropertyEditorDelegate */ PropertyEditorDelegate::PropertyEditorDelegate(QObject *parent) : TreeViewItemDelegate(parent) { } Property *PropertyEditorDelegate::indexToProperty(const QModelIndex &index) const { return static_cast(index.internalPointer()); } QWidget *PropertyEditorDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &, const QModelIndex &index) const { if (index.column() != 1) return NULL; Property *prop = indexToProperty(index); if (!prop) return NULL; QWidget *editor = prop->createEditor(parent); if (editor) { QWidget *corrBearing = dynamic_cast(editor); editor->setObjectName("editor"); editor->setAutoFillBackground(true); QVariant value = index.data(Qt::FontRole); if (value.isValid() && value.canConvert()) editor->setFont(qvariant_cast(value)); if (QComboBox *c = qobject_cast(editor)) { c->lineEdit()->selectAll(); corrBearing = c; } else if (QPlainTextEdit *c = qobject_cast(editor)) { c->selectAll(); } if(corrBearing) { corrBearing->setProperty("corrBearing", #ifdef __APPLE__ false #else true #endif ); corrBearing->style()->unpolish(corrBearing); corrBearing->style()->polish(corrBearing); corrBearing->update(); } } return editor; } void PropertyEditorDelegate::setEditorData(QWidget * /*widget*/, const QModelIndex &) const { //do nothing } /** * TreePropertyEditor */ TreePropertyEditor::TreePropertyEditor(QWidget *parent) : TreeView(parent) { setObjectName("grid"); setIconSize(QSize(18, 18)); setFrameShape(QFrame::NoFrame); setItemDelegate(new PropertyEditorDelegate(this)); } Property *TreePropertyEditor::indexToProperty(const QModelIndex &index) const { return static_cast(index.internalPointer()); } void TreePropertyEditor::keyPressEvent(QKeyEvent *event) { switch (event->key()) { case Qt::Key_Return: case Qt::Key_Enter: case Qt::Key_Space: // Trigger Edit { QModelIndex index = currentIndex(); if ((index.flags() & (Qt::ItemIsEditable | Qt::ItemIsEnabled)) == (Qt::ItemIsEditable | Qt::ItemIsEnabled)) { event->accept(); // If the current position is at column 0, move to 1. if (index.column() == 0) { index = index.sibling(index.row(), 1); setCurrentIndex(index); } edit(index); return; } } break; default: break; } TreeView::keyPressEvent(event); } void TreePropertyEditor::mousePressEvent(QMouseEvent *event) { QTreeView::mousePressEvent(event); QModelIndex index = indexAt(event->pos()); if (index.isValid()) { Property *prop = indexToProperty(index); if ((event->button() == Qt::LeftButton) && (index.column() == 1) && ((index.flags() & (Qt::ItemIsEditable | Qt::ItemIsEnabled)) == (Qt::ItemIsEditable | Qt::ItemIsEnabled))) { edit(index); } else if (!rootIsDecorated() && prop->childCount()) { QRect rect = visualRect(index); if (event->pos().x() >= rect.left() && event->pos().x() <= rect.left() + 20) setExpanded(index, !isExpanded(index)); } } } void TreePropertyEditor::dataChanged(const QModelIndex & topLeft, const QModelIndex & bottomRight, const QVector &roles /*= QVector()*/) { QRect rect = visualRect(topLeft); QTreeView::dataChanged(topLeft, bottomRight, roles); if (topLeft.row() == bottomRight.row() && topLeft.isValid()) { if (rect != visualRect(bottomRight)) updateEditorGeometries(); } } /** * LicensePropertyManager */ LicensePropertyManager::LicensePropertyManager(QObject *parent) : PropertyManager(parent), value_(NULL), lock_(false) { details_ = addGroupProperty(NULL, QString::fromUtf8(language[lsDetails].c_str())); licenseName_ = addStringProperty(details_, QString::fromUtf8(language[lsCustomerName].c_str()), QString()); licenseEmail_ = addStringProperty(details_, QString::fromUtf8(language[lsEmail].c_str()), QString()); licenseDate_ = addDateProperty(details_, QString::fromUtf8(language[lsDate].c_str()), QDate()); licenseOrder_ = addStringProperty(details_, QString::fromUtf8(language[lsOrderRef].c_str()), QString()); licenseComments_ = addStringListProperty(details_, QString::fromUtf8(language[lsComments].c_str()), QString()); licenseBlocked_ = addBoolProperty(details_, QString::fromUtf8(language[lsBlocked].c_str()), false); licenseSerialNumber_ = addStringProperty(details_, QString::fromUtf8(language[lsSerialNumber].c_str()), QString()); licenseSerialNumber_->setReadOnly(true); contents_ = addGroupProperty(NULL, QString::fromUtf8(language[lsSerialNumberContents].c_str())); serialName_ = addStringProperty(contents_, QString::fromUtf8(language[lsCustomerName].c_str()), QString()); serialName_->setReadOnly(true); serialEmail_ = addStringProperty(contents_, QString::fromUtf8(language[lsEmail].c_str()), QString()); serialEmail_->setReadOnly(true); serialHWID_ = addStringProperty(contents_, QString::fromUtf8(language[lsHardwareID].c_str()), QString()); serialHWID_->setReadOnly(true); serialExpirationDate_ = addDateProperty(contents_, QString::fromUtf8(language[lsExpirationDate].c_str()), QDate()); serialExpirationDate_->setReadOnly(true); serialTimeLimit_ = addStringProperty(contents_, QString::fromUtf8(language[lsRunningTimeLimit].c_str()), QString()); serialTimeLimit_->setReadOnly(true); serialMaxBuildDate_ = addDateProperty(contents_, QString::fromUtf8(language[lsMaxBuildDate].c_str()), QDate()); serialMaxBuildDate_->setReadOnly(true); serialUserData_ = addStringProperty(contents_, QString::fromUtf8(language[lsUserData].c_str()), QString()); serialUserData_->setReadOnly(true); connect(licenseName_, SIGNAL(valueChanged(const QString &)), this, SLOT(nameChanged(const QString &))); connect(licenseEmail_, SIGNAL(valueChanged(const QString &)), this, SLOT(emailChanged(const QString &))); connect(licenseDate_, SIGNAL(valueChanged(const QDate &)), this, SLOT(dateChanged(const QDate &))); connect(licenseOrder_, SIGNAL(valueChanged(const QString &)), this, SLOT(orderChanged(const QString &))); connect(licenseComments_, SIGNAL(valueChanged(const QString &)), this, SLOT(commentsChanged(const QString &))); connect(licenseBlocked_, SIGNAL(valueChanged(bool)), this, SLOT(blockedChanged(bool))); localize(); } void LicensePropertyManager::localize() { details_->setName(QString::fromUtf8(language[lsDetails].c_str())); licenseName_->setName(QString::fromUtf8(language[lsCustomerName].c_str())); licenseEmail_->setName(QString::fromUtf8(language[lsEmail].c_str())); licenseDate_->setName(QString::fromUtf8(language[lsDate].c_str())); licenseComments_->setName(QString::fromUtf8(language[lsComments].c_str())); licenseOrder_->setName(QString::fromUtf8(language[lsOrderRef].c_str())); licenseBlocked_->setName(QString::fromUtf8(language[lsBlocked].c_str())); licenseSerialNumber_->setName(QString::fromUtf8(language[lsSerialNumber].c_str())); contents_->setName(QString::fromUtf8(language[lsSerialNumberContents].c_str())); serialName_->setName(QString::fromUtf8(language[lsCustomerName].c_str())); serialEmail_->setName(QString::fromUtf8(language[lsEmail].c_str())); serialHWID_->setName(QString::fromUtf8(language[lsHardwareID].c_str())); serialExpirationDate_->setName(QString::fromUtf8(language[lsExpirationDate].c_str())); serialTimeLimit_->setName(QString::fromUtf8(language[lsRunningTimeLimit].c_str())); serialMaxBuildDate_->setName(QString::fromUtf8(language[lsMaxBuildDate].c_str())); serialUserData_->setName(QString::fromUtf8(language[lsUserData].c_str())); } QVariant LicensePropertyManager::data(const QModelIndex &index, int role) const { Property *prop = indexToProperty(index); if (role == Qt::FontRole) { if (index.column() == 1 && (prop == licenseSerialNumber_ || prop == serialUserData_)) return QFont(MONOSPACE_FONT_FAMILY); } return PropertyManager::data(index, role); } void LicensePropertyManager::nameChanged(const QString &value) { if (!value_ || lock_) return; #ifdef ULTIMATE value_->set_customer_name(value.toUtf8().constData()); #endif } void LicensePropertyManager::emailChanged(const QString &value) { if (!value_ || lock_) return; #ifdef ULTIMATE value_->set_customer_email(value.toUtf8().constData()); #endif } void LicensePropertyManager::orderChanged(const QString &value) { if (!value_ || lock_) return; #ifdef ULTIMATE value_->set_order_ref(value.toUtf8().constData()); #endif } void LicensePropertyManager::dateChanged(const QDate &value) { if (!value_ || lock_) return; #ifdef ULTIMATE value_->set_date(LicenseDate(value.year(), value.month(), value.day())); #endif } void LicensePropertyManager::commentsChanged(const QString &value) { if (!value_ || lock_) return; #ifdef ULTIMATE value_->set_comments(value.toUtf8().constData()); #endif } void LicensePropertyManager::blockedChanged(bool value) { if (!value_ || lock_) return; #ifdef ULTIMATE value_->set_blocked(value); #endif } void LicensePropertyManager::setValue(License *value) { value_ = value; update(); } void LicensePropertyManager::update() { #ifdef ULTIMATE lock_ = true; licenseName_->setValue(value_ ? QString::fromUtf8(value_->customer_name().c_str()) : QString()); licenseEmail_->setValue(value_ ? QString::fromUtf8(value_->customer_email().c_str()) : QString()); licenseDate_->setValue(value_ ? QDate(value_->date().Year, value_->date().Month, value_->date().Day) : QDate()); licenseOrder_->setValue(value_ ? QString::fromUtf8(value_->order_ref().c_str()) : QString()); licenseComments_->setValue(value_ ? QString::fromUtf8(value_->comments().c_str()) : QString()); licenseBlocked_->setValue(value_ ? value_->blocked() : false); licenseSerialNumber_->setValue(value_ ? QString::fromLatin1(formatBase64(value_->serial_number()).c_str()) : QString()); LicenseInfo *license_info = value_ ? value_->info() : NULL; serialName_->setValue(license_info && (license_info->Flags & HAS_USER_NAME) ? QString::fromUtf8(license_info->CustomerName.c_str()) : QString()); serialEmail_->setValue(license_info && (license_info->Flags & HAS_EMAIL) ? QString::fromUtf8(license_info->CustomerEmail.c_str()) : QString()); serialHWID_->setValue(license_info && (license_info->Flags & HAS_HARDWARE_ID) ? QString::fromLatin1(license_info->HWID.c_str()) : QString()); serialTimeLimit_->setValue(license_info && (license_info->Flags & HAS_TIME_LIMIT) ? QString::number(license_info->RunningTimeLimit) : QString()); serialExpirationDate_->setValue(license_info && (license_info->Flags & HAS_EXP_DATE) ? QDate(license_info->ExpireDate.Year, license_info->ExpireDate.Month, license_info->ExpireDate.Day) : QDate()); serialMaxBuildDate_->setValue(license_info && (license_info->Flags & HAS_MAX_BUILD_DATE) ? QDate(license_info->MaxBuildDate.Year, license_info->MaxBuildDate.Month, license_info->MaxBuildDate.Day) : QDate()); QString userData; if (license_info && license_info->Flags & HAS_USER_DATA) { int bytes = 16; for (size_t line = 0; line <= license_info->UserData.size() / bytes; line++) { QString hex; QString text; for (int i = 0; i < bytes; i++) { size_t pos = line * bytes + i; if (pos < license_info->UserData.size()) { uint8_t value = static_cast(license_info->UserData[pos]); hex.append(QString("%1 ").arg(value, 2, 16, QChar('0'))); QChar qc(value); if (qc.unicode() >= 127 || !qc.isPrint()) qc = 0xB7; text += qc; } else { if (i == 0) break; hex.append(" "); text.append(" "); } } if (!hex.isEmpty()) { if (!userData.isEmpty()) userData.append('\n'); userData.append(QString("%1 ").arg(line * bytes, 4, 16, QChar('0'))).append(hex).append(text); } } } serialUserData_->setValue(userData); if (serialHWID_->childCount()) { beginRemoveRows(propertyToIndex(serialHWID_), 0, serialHWID_->childCount()); serialHWID_->clear(); endRemoveRows(); } if (license_info && (license_info->Flags & HAS_HARDWARE_ID) && !license_info->HWID.empty()) { size_t len = license_info->HWID.size(); uint8_t *hwid = new uint8_t[len]; Base64Decode(license_info->HWID.c_str(), license_info->HWID.size(), hwid, len); beginInsertRows(propertyToIndex(serialHWID_), 0, (int)(len / 4)); for (size_t i = 0; i < len; i += 4) { uint32_t value = *reinterpret_cast(&hwid[i]); QString name; switch (value & 3) { case 0: name = QString::fromUtf8(language[lsCPU].c_str()); break; case 1: name = QString::fromUtf8(language[lsHost].c_str()); break; case 2: name = QString::fromUtf8(language[lsEthernet].c_str()); break; case 3: name = QString::fromUtf8(language[lsHDD].c_str()); break; } StringProperty *prop = addStringProperty(serialHWID_, name, QString("%1").arg(value & ~3, 8, 16, QChar('0')).toUpper()); prop->setReadOnly(true); } delete [] hwid; endInsertRows(); } lock_ = false; #endif } /** * FilePropertyManager */ InternalFilePropertyManager::InternalFilePropertyManager(QObject *parent) : PropertyManager(parent), value_(NULL), lock_(false) { details_ = addGroupProperty(NULL, QString::fromUtf8(language[lsDetails].c_str())); name_ = addStringProperty(details_, QString::fromUtf8(language[lsName].c_str()), QString()); fileName_ = addFileNameProperty(details_, QString::fromUtf8(language[lsFileName].c_str()), QString( #ifdef VMP_GNU "%1 (*)" #else "%1 (*.*)" #endif ).arg(QString::fromUtf8(language[lsAllFiles].c_str())), QString()); action_ = addEnumProperty(details_, QString::fromUtf8(language[lsAction].c_str()), QStringList() << QString::fromUtf8(language[lsNo].c_str()) << QString::fromUtf8(language[lsLoadAtStart].c_str()) << QString::fromUtf8(language[lsRegisterCOMServer].c_str()) << QString::fromUtf8(language[lsInstallCOMServer].c_str()), 0); connect(name_, SIGNAL(valueChanged(const QString &)), this, SLOT(nameChanged(const QString &))); connect(fileName_, SIGNAL(valueChanged(const QString &)), this, SLOT(fileNameChanged(const QString &))); connect(action_, SIGNAL(valueChanged(int)), this, SLOT(actionChanged(int))); } void InternalFilePropertyManager::localize() { details_->setName(QString::fromUtf8(language[lsDetails].c_str())); name_->setName(QString::fromUtf8(language[lsName].c_str())); fileName_->setName(QString::fromUtf8(language[lsFileName].c_str())); fileName_->setFilter(QString( #ifdef VMP_GNU "%1 (*)" #else "%1 (*.*)" #endif ).arg(QString::fromUtf8(language[lsAllFiles].c_str()))); action_->setName(QString::fromUtf8(language[lsAction].c_str())); action_->setText(0, QString::fromUtf8(language[lsNo].c_str())); action_->setText(1, QString::fromUtf8(language[lsLoadAtStart].c_str())); action_->setText(2, QString::fromUtf8(language[lsRegisterCOMServer].c_str())); action_->setText(3, QString::fromUtf8(language[lsInstallCOMServer].c_str())); } void InternalFilePropertyManager::nameChanged(const QString &value) { if (!value_ || lock_) return; #ifdef ULTIMATE value_->set_name(value.toUtf8().constData()); #endif } void InternalFilePropertyManager::fileNameChanged(const QString &value) { if (!value_ || lock_) return; #ifdef ULTIMATE value_->set_file_name(value.toUtf8().constData()); #endif } void InternalFilePropertyManager::actionChanged(int value) { if (!value_ || lock_) return; #ifdef ULTIMATE value_->set_action(static_cast(value)); #endif } void InternalFilePropertyManager::setValue(InternalFile *value) { value_ = value; #ifdef ULTIMATE fileName_->setRelativePath(value_ ? QString::fromUtf8(value_->owner()->owner()->project_path().c_str()) : QString()); update(); #endif } void InternalFilePropertyManager::update() { #ifdef ULTIMATE lock_ = true; name_->setValue(value_ ? QString::fromUtf8(value_->name().c_str()) : QString()); fileName_->setValue(value_ ? QString::fromUtf8(value_->file_name().c_str()) : QString()); int i = 0; if (value_) { switch (value_->action()) { case faLoad: i = 1; break; case faRegister: i = 2; break; case faInstall: i = 3; break; } } action_->setValue(value_ ? i : 0); lock_ = false; #endif } /** * AssemblyPropertyManager */ AssemblyPropertyManager::AssemblyPropertyManager(QObject *parent) : PropertyManager(parent), value_(NULL), lock_(false) { details_ = addGroupProperty(NULL, QString::fromUtf8(language[lsDetails].c_str())); name_ = addStringProperty(details_, QString::fromUtf8(language[lsName].c_str()), QString()); fileName_ = addFileNameProperty(details_, QString::fromUtf8(language[lsFileName].c_str()), QString("%1 (*.dll);;%2 (*.*)").arg(QString::fromUtf8(language[lsAssemblies].c_str())).arg(QString::fromUtf8(language[lsAllFiles].c_str())), QString()); connect(name_, SIGNAL(valueChanged(const QString &)), this, SLOT(nameChanged(const QString &))); connect(fileName_, SIGNAL(valueChanged(const QString &)), this, SLOT(fileNameChanged(const QString &))); } void AssemblyPropertyManager::localize() { details_->setName(QString::fromUtf8(language[lsDetails].c_str())); name_->setName(QString::fromUtf8(language[lsName].c_str())); fileName_->setName(QString::fromUtf8(language[lsFileName].c_str())); fileName_->setFilter(QString("%1 (*.dll);;%2 (*.*)").arg(QString::fromUtf8(language[lsAssemblies].c_str())).arg(QString::fromUtf8(language[lsAllFiles].c_str()))); } void AssemblyPropertyManager::nameChanged(const QString &value) { if (!value_ || lock_) return; #ifdef ULTIMATE value_->set_name(value.toUtf8().constData()); #endif } void AssemblyPropertyManager::fileNameChanged(const QString &value) { if (!value_ || lock_) return; #ifdef ULTIMATE value_->set_file_name(value.toUtf8().constData()); #endif } void AssemblyPropertyManager::setValue(InternalFile *value) { value_ = value; #ifdef ULTIMATE fileName_->setRelativePath(value_ ? QString::fromUtf8(value_->owner()->owner()->project_path().c_str()) : QString()); update(); #endif } void AssemblyPropertyManager::update() { #ifdef ULTIMATE lock_ = true; name_->setValue(value_ ? QString::fromUtf8(value_->name().c_str()) : QString()); fileName_->setValue(value_ ? QString::fromUtf8(value_->file_name().c_str()) : QString()); lock_ = false; #endif } /** * FunctionPropertyManager */ FunctionPropertyManager::FunctionPropertyManager(QObject *parent) : PropertyManager(parent), value_(NULL), lock_(false) { protection_ = addGroupProperty(NULL, QString::fromUtf8(language[lsProtection].c_str())); compilationType_ = addCompilationTypeProperty(protection_, QString::fromUtf8(language[lsCompilationType].c_str()), ctNone); lockToKey_ = addBoolProperty(protection_, QString::fromUtf8(language[lsLockToSerialNumber].c_str()), false); details_ = addGroupProperty(NULL, QString::fromUtf8(language[lsDetails].c_str())); type_ = addStringProperty(details_, QString::fromUtf8(language[lsType].c_str()), QString()); type_->setReadOnly(true); name_ = addStringProperty(details_, QString::fromUtf8(language[lsName].c_str()), QString()); name_->setReadOnly(true); address_ = addStringProperty(details_, QString::fromUtf8(language[lsAddress].c_str()), QString()); address_->setReadOnly(true); connect(compilationType_, SIGNAL(valueChanged(CompilationType)), this, SLOT(compilationTypeChanged(CompilationType))); connect(lockToKey_, SIGNAL(valueChanged(bool)), this, SLOT(lockToKeyChanged(bool))); } void FunctionPropertyManager::localize() { protection_->setName(QString::fromUtf8(language[lsProtection].c_str())); compilationType_->setName(QString::fromUtf8(language[lsCompilationType].c_str())); compilationType_->setText(0, QString::fromUtf8(language[lsNone].c_str())); compilationType_->setText(1, QString::fromUtf8(language[lsVirtualization].c_str())); compilationType_->setText(2, QString::fromUtf8(language[lsMutation].c_str())); compilationType_->setText(3, QString("%1 (%2 + %3)").arg(QString::fromUtf8(language[lsUltra].c_str())).arg(QString::fromUtf8(language[lsMutation].c_str())).arg(QString::fromUtf8(language[lsVirtualization].c_str()))); compilationType_->setToolTip(QString::fromUtf8(language[lsCompilationTypeHelp].c_str())); lockToKey_->setName(QString::fromUtf8(language[lsLockToSerialNumber].c_str())); lockToKey_->setToolTip(QString::fromUtf8(language[lsLockToSerialNumberHelp].c_str())); details_->setName(QString::fromUtf8(language[lsDetails].c_str())); type_->setName(QString::fromUtf8(language[lsType].c_str())); name_->setName(QString::fromUtf8(language[lsName].c_str())); address_->setName(QString::fromUtf8(language[lsAddress].c_str())); if (value_) { for (QMap::const_iterator arch = map_.begin(); arch != map_.end(); arch++) { QString str = QString::fromUtf8(language[lsCode].c_str()); if (value_->show_arch_name()) str.append(" ").append(QString::fromLatin1(arch.key()->name().c_str())); arch.value().code->setName(str); } update(); } } QVariant FunctionPropertyManager::data(const QModelIndex &index, int role) const { Property *prop = indexToProperty(index); if (role == Qt::FontRole) { if (qobject_cast(prop)) return QFont(MONOSPACE_FONT_FAMILY); } return PropertyManager::data(index, role); } void FunctionPropertyManager::setValue(FunctionBundle *value) { if (value_ == value) return; value_ = value; for (QMap::iterator arch = map_.begin(); arch != map_.end(); arch++) { Property *code = arch.value().code; if (code->childCount()) { beginRemoveRows(propertyToIndex(code), 0, code->childCount()); code->clear(); endRemoveRows(); } arch.value().map.clear(); } if (value_) { for (size_t i = 0; i < value_->count(); i++) { internalAddFunction(value_->item(i)->func()); } } else { for (QMap::const_iterator arch = map_.begin(); arch != map_.end(); arch++) { Property *code = arch.value().code; int index = code->parent()->children().indexOf(code); beginRemoveRows(propertyToIndex(code->parent()), index, index + 1); delete code; endRemoveRows(); } map_.clear(); } update(); } void FunctionPropertyManager::addFunction(IFunction *func) { if (internalAddFunction(func)) update(); } void FunctionPropertyManager::createCommands(IFunction *func, Property *code) { size_t i; QMap > references; for (i = 0; i < func->link_list()->count(); i++) { CommandLink *link = func->link_list()->item(i); if (link->to_address()) { QMap >::iterator it = references.find(link->to_address()); if (it == references.end()) it = references.insert(link->to_address(), QList() << link->from_command()); else it.value().push_back(link->from_command()); } } beginInsertRows(propertyToIndex(code), 0, (int)func->count()); for (i = 0; i < func->count(); i++) { ICommand *command = func->item(i); Property *prop = addCommandProperty(code, command); prop->setReadOnly(true); QMap >::ConstIterator it = references.find(command->address()); if (it != references.end()) { for (int j = 0; j < it.value().size(); j++) { Property *link_prop = addCommandProperty(prop, it.value().at(j)); link_prop->setReadOnly(true); } } } endInsertRows(); } bool FunctionPropertyManager::internalAddFunction(IFunction *func) { if (!value_) return false; FunctionArch *func_arch = value_->GetArchByFunction(func); if (!func_arch) return false; QMap::iterator arch = map_.find(func_arch->arch()); if (arch == map_.end()) { beginInsertRows(propertyToIndex(details_), details_->childCount(), details_->childCount() + 1); QString str = QString::fromUtf8(language[lsCode].c_str()); if (value_->show_arch_name()) str.append(" ").append(QString::fromLatin1(func_arch->arch()->name().c_str())); ArchInfo info; info.code = addStringProperty(details_, str, QString()); info.code->setReadOnly(true); endInsertRows(); arch = map_.insert(func_arch->arch(), info); } QMap::const_iterator it = arch.value().map.find(func); if (it == arch.value().map.end()) { StringProperty *code = arch.value().code; if (!arch.value().map.empty()) { if (arch.value().map.size() == 1) { QMap::iterator tmp = arch.value().map.begin(); if (tmp.value() == code) { beginRemoveRows(propertyToIndex(code), 0, code->childCount()); code->clear(); endRemoveRows(); beginInsertRows(propertyToIndex(code), code->childCount(), code->childCount() + 1); StringProperty *newCode = addStringProperty(code, QString::fromLatin1(tmp.key()->display_address("").c_str()), QString()); newCode->setReadOnly(true); endInsertRows(); tmp.value() = newCode; createCommands(tmp.key(), newCode); } } beginInsertRows(propertyToIndex(code), code->childCount(), code->childCount() + 1); code = addStringProperty(code, QString::fromLatin1(func->display_address("").c_str()), QString()); code->setReadOnly(true); endInsertRows(); } it = arch.value().map.insert(func, code); } createCommands(func, it.value()); return true; } void FunctionPropertyManager::updateFunction(IFunction *func) { if (value_ && value_->GetArchByFunction(func)) update(); } bool FunctionPropertyManager::removeFunction(IFunction *func) { if (internalRemoveFunction(func)) { update(); return true; } return false; } bool FunctionPropertyManager::internalRemoveFunction(IFunction *func) { if (!value_) return false; FunctionArch *func_arch = value_->GetArchByFunction(func); if (!func_arch) return false; QMap::iterator arch = map_.find(func_arch->arch()); if (arch != map_.end()) { QMap::iterator it = arch.value().map.find(func); if (it != arch.value().map.end()) { StringProperty *code = it.value(); if (code == arch.value().code) { beginRemoveRows(propertyToIndex(code), 0, code->childCount()); code->clear(); endRemoveRows(); } else { int index = code->parent()->children().indexOf(code); beginRemoveRows(propertyToIndex(code->parent()), index, index + 1); delete code; endRemoveRows(); } arch.value().map.erase(it); } } return true; } void FunctionPropertyManager::update() { lock_ = true; name_->setValue(value_ ? QString::fromUtf8(value_->display_name().c_str()) : QString()); QString str; if (value_) { switch (value_->type()) { case otAPIMarker: case otMarker: str = QString::fromUtf8(language[lsMarker].c_str()); break; case otString: str = QString::fromUtf8(language[lsString].c_str()); break; case otCode: str = QString::fromUtf8(language[lsFunction].c_str()); break; case otExport: str = QString::fromUtf8(language[lsExport].c_str()); break; default: str = QString::fromUtf8(language[lsUnknown].c_str()); break; } } else { str = ""; } type_->setValue(str); address_->setValue(value_ ? QString::fromUtf8(value_->display_address().c_str()) : QString()); compilationType_->setValue(value_ && value_->need_compile() ? value_->compilation_type() : ctNone); compilationType_->setDefaultValue(value_ ? value_->default_compilation_type() : ctNone); lockToKey_->setReadOnly(value_ && (!value_->need_compile() || value_->compilation_type() == ctMutation)); lockToKey_->setValue((value_ && !lockToKey_->readOnly()) ? (value_->compilation_options() & coLockToKey) != 0 : false); for (QMap::const_iterator arch = map_.begin(); arch != map_.end(); arch++) { ArchInfo info = arch.value(); if (info.code->childCount()) info.code->setValue(QString::number(info.code->childCount()) + " " + QString::fromUtf8(language[lsItems].c_str())); else info.code->setValue(QString()); for (QMap::const_iterator it = info.map.begin(); it != info.map.end(); it++) { IFunction *func = it.key(); StringProperty *code = it.value(); str.clear(); if (func->type() != otUnknown) { str = QString::number(func->count()) + " " + QString::fromUtf8(language[lsItems].c_str()); QString hint; if (func->ext_command_list()->count()) { if (!hint.isEmpty()) hint.append(", "); hint.append(QString::fromUtf8(language[lsExternalAddress].c_str())).append(": ").append(QString::number(func->ext_command_list()->count())); } if (func->break_address()) { if (!hint.isEmpty()) hint.append(", "); hint.append(QString::fromUtf8(language[lsBreakAddress].c_str())); } if (!hint.isEmpty()) str.append(" (").append(hint).append(")"); } code->setValue(str); } } lock_ = false; } void FunctionPropertyManager::compilationTypeChanged(CompilationType value) { if (!value_ || lock_) return; if (value == ctNone) { value_->set_need_compile(false); } else { value_->set_need_compile(true); value_->set_compilation_type(value); } } void FunctionPropertyManager::lockToKeyChanged(bool value) { if (!value_ || lock_) return; uint32_t options = value_->compilation_options(); if (value) { options |= coLockToKey; } else { options &= ~coLockToKey; } value_->set_compilation_options(options); } ICommand *FunctionPropertyManager::indexToCommand(const QModelIndex &index) const { if (!index.isValid()) return NULL; Property *prop = indexToProperty(index); if (prop) { if (CommandProperty *c = qobject_cast(prop)) return c->value(); } return NULL; } IFunction *FunctionPropertyManager::indexToFunction(const QModelIndex &index) const { if (!index.isValid()) return NULL; Property *prop = indexToProperty(index); if (prop) { for (QMap::const_iterator arch = map_.begin(); arch != map_.end(); arch++) { for (QMap::const_iterator it = arch.value().map.begin(); it != arch.value().map.end(); it++) { if (it.value() == prop) return it.key(); } } } return NULL; } QModelIndex FunctionPropertyManager::commandToIndex(ICommand *command) const { for (QMap::const_iterator arch = map_.begin(); arch != map_.end(); arch++) { ArchInfo info = arch.value(); for (QMap::const_iterator it = info.map.begin(); it != info.map.end(); it++) { QList propList = it.value()->children(); for (int j = 0; j < propList.size(); j++) { Property *prop = propList[j]; if (reinterpret_cast(prop)->value() == command) return propertyToIndex(prop); } } } return QModelIndex(); } /** * SectionPropertyManager */ SectionPropertyManager::SectionPropertyManager(QObject *parent) : PropertyManager(parent), value_(NULL) { details_ = addGroupProperty(NULL, QString::fromUtf8(language[lsDetails].c_str())); name_ = addStringProperty(details_, QString::fromUtf8(language[lsName].c_str()), QString()); name_->setReadOnly(true); address_ = addStringProperty(details_, QString::fromUtf8(language[lsAddress].c_str()), QString()); address_->setReadOnly(true); virtual_size_ = addStringProperty(details_, QString::fromUtf8(language[lsSize].c_str()), QString()); virtual_size_->setReadOnly(true); physical_offset_ = addStringProperty(details_, QString::fromUtf8(language[lsRawAddress].c_str()), QString()); physical_offset_->setReadOnly(true); physical_size_ = addStringProperty(details_, QString::fromUtf8(language[lsRawSize].c_str()), QString()); physical_size_->setReadOnly(true); flags_ = addStringProperty(details_, QString::fromUtf8(language[lsFlags].c_str()), QString()); flags_->setReadOnly(true); } void SectionPropertyManager::localize() { details_->setName(QString::fromUtf8(language[lsDetails].c_str())); name_->setName(QString::fromUtf8(language[lsName].c_str())); address_->setName(QString::fromUtf8(language[lsAddress].c_str())); virtual_size_->setName(QString::fromUtf8(language[lsSize].c_str())); physical_offset_->setName(QString::fromUtf8(language[lsRawAddress].c_str())); physical_size_->setName(QString::fromUtf8(language[lsRawSize].c_str())); flags_->setName(QString::fromUtf8(language[lsFlags].c_str())); } void SectionPropertyManager::setValue(ISection *value) { value_ = value; update(); } void SectionPropertyManager::update() { name_->setValue(value_ ? QString::fromUtf8(value_->name().c_str()) : QString()); address_->setValue(value_ ? QString::fromUtf8(DisplayValue(value_->address_size(), value_->address()).c_str()) : QString()); virtual_size_->setValue(value_ ? QString::fromUtf8(DisplayValue(value_->address_size(), value_->size()).c_str()) : QString()); physical_offset_->setValue(value_ ? QString::fromUtf8(DisplayValue(osDWord, value_->physical_offset()).c_str()) : QString()); physical_size_->setValue(value_ ? QString::fromUtf8(DisplayValue(osDWord, value_->physical_size()).c_str()) : QString()); flags_->setValue(value_ ? QString::fromLatin1(DisplayValue(osDWord, value_->flags()).c_str()) : QString()); } /** * SegmentPropertyManager */ SegmentPropertyManager::SegmentPropertyManager(QObject *parent) : PropertyManager(parent), value_(NULL), lock_(false) { options_ = addGroupProperty(NULL, QString::fromUtf8(language[lsOptions].c_str())); excluded_from_memory_protection_ = addBoolProperty(options_, QString::fromUtf8(language[lsExcludedFromMemoryProtection].c_str()), false); excluded_from_packing_ = addBoolProperty(options_, QString::fromUtf8(language[lsExcludedFromPacking].c_str()), false); details_ = addGroupProperty(NULL, QString::fromUtf8(language[lsDetails].c_str())); name_ = addStringProperty(details_, QString::fromUtf8(language[lsName].c_str()), QString()); name_->setReadOnly(true); address_ = addStringProperty(details_, QString::fromUtf8(language[lsAddress].c_str()), QString()); address_->setReadOnly(true); virtual_size_ = addStringProperty(details_, QString::fromUtf8(language[lsSize].c_str()), QString()); virtual_size_->setReadOnly(true); physical_offset_ = addStringProperty(details_, QString::fromUtf8(language[lsRawAddress].c_str()), QString()); physical_offset_->setReadOnly(true); physical_size_ = addStringProperty(details_, QString::fromUtf8(language[lsRawSize].c_str()), QString()); physical_size_->setReadOnly(true); flags_ = addStringProperty(details_, QString::fromUtf8(language[lsFlags].c_str()), QString()); flags_->setReadOnly(true); flag_readable_ = addBoolProperty(flags_, "Readable", false); flag_readable_->setReadOnly(true); flag_writable_ = addBoolProperty(flags_, "Writable", false); flag_writable_->setReadOnly(true); flag_executable_ = addBoolProperty(flags_, "Executable", false); flag_executable_->setReadOnly(true); flag_shared_ = addBoolProperty(flags_, "Shared", false); flag_shared_->setReadOnly(true); flag_discardable_ = addBoolProperty(flags_, "Discardable", false); flag_discardable_->setReadOnly(true); flag_notpaged_ = addBoolProperty(flags_, "NotPaged", false); flag_notpaged_->setReadOnly(true); connect(excluded_from_packing_, SIGNAL(valueChanged(bool)), this, SLOT(excludedFromPackingChanged(bool))); connect(excluded_from_memory_protection_, SIGNAL(valueChanged(bool)), this, SLOT(excludedFromMemoryProtectionChanged(bool))); } void SegmentPropertyManager::localize() { options_->setName(QString::fromUtf8(language[lsOptions].c_str())); excluded_from_packing_->setName(QString::fromUtf8(language[lsExcludedFromPacking].c_str())); excluded_from_memory_protection_->setName(QString::fromUtf8(language[lsExcludedFromMemoryProtection].c_str())); details_->setName(QString::fromUtf8(language[lsDetails].c_str())); name_->setName(QString::fromUtf8(language[lsName].c_str())); virtual_size_->setName(QString::fromUtf8(language[lsSize].c_str())); address_->setName(QString::fromUtf8(language[lsAddress].c_str())); physical_offset_->setName(QString::fromUtf8(language[lsRawAddress].c_str())); physical_size_->setName(QString::fromUtf8(language[lsRawSize].c_str())); flags_->setName(QString::fromUtf8(language[lsFlags].c_str())); } void SegmentPropertyManager::setValue(ISection *value) { value_ = value; update(); } void SegmentPropertyManager::update() { lock_ = true; excluded_from_packing_->setValue(value_ ? value_->excluded_from_packing() : false); excluded_from_memory_protection_->setValue(value_ ? value_->excluded_from_memory_protection() : false); name_->setValue(value_ ? QString::fromUtf8(value_->name().c_str()) : QString()); address_->setValue(value_ ? QString::fromUtf8(DisplayValue(value_->address_size(), value_->address()).c_str()) : QString()); virtual_size_->setValue(value_ ? QString::fromUtf8(DisplayValue(value_->address_size(), value_->size()).c_str()) : QString()); physical_offset_->setValue(value_ ? QString::fromUtf8(DisplayValue(osDWord, value_->physical_offset()).c_str()) : QString()); physical_size_->setValue(value_ ? QString::fromUtf8(DisplayValue(osDWord, value_->physical_size()).c_str()) : QString()); flags_->setValue(value_ ? QString::fromLatin1(DisplayValue(osDWord, value_->flags()).c_str()) : QString()); uint32_t memoryType = value_ ? value_->memory_type() : mtNone; flag_readable_->setValue(memoryType & mtReadable); flag_writable_->setValue(memoryType & mtWritable); flag_executable_->setValue(memoryType & mtExecutable); flag_shared_->setValue(memoryType & mtShared); flag_notpaged_->setValue(memoryType & mtNotPaged); flag_discardable_->setValue(memoryType & mtDiscardable); lock_ = false; } void SegmentPropertyManager::excludedFromPackingChanged(bool value) { if (!value_ || lock_) return; value_->set_excluded_from_packing(value); } void SegmentPropertyManager::excludedFromMemoryProtectionChanged(bool value) { if (!value_ || lock_) return; value_->set_excluded_from_memory_protection(value); } /** * LoadCommandPropertyManager */ LoadCommandPropertyManager::LoadCommandPropertyManager(QObject *parent) : PropertyManager(parent), value_(NULL) { details_ = addGroupProperty(NULL, QString::fromUtf8(language[lsDetails].c_str())); name_ = addStringProperty(details_, QString::fromUtf8(language[lsName].c_str()), QString()); name_->setReadOnly(true); address_ = addStringProperty(details_, QString::fromUtf8(language[lsAddress].c_str()), QString()); address_->setReadOnly(true); size_ = addStringProperty(details_, QString::fromUtf8(language[lsSize].c_str()), QString()); size_->setReadOnly(true); segment_ = addStringProperty(details_, QString::fromUtf8(language[lsSegment].c_str()), QString()); segment_->setReadOnly(true); } void LoadCommandPropertyManager::localize() { details_->setName(QString::fromUtf8(language[lsDetails].c_str())); name_->setName(QString::fromUtf8(language[lsName].c_str())); address_->setName(QString::fromUtf8(language[lsAddress].c_str())); size_->setName(QString::fromUtf8(language[lsSize].c_str())); segment_->setName(QString::fromUtf8(language[lsSegment].c_str())); } void LoadCommandPropertyManager::setValue(ILoadCommand *value) { value_ = value; update(); } void LoadCommandPropertyManager::update() { name_->setValue(value_ ? QString::fromUtf8(value_->name().c_str()) : QString()); address_->setValue(value_ ? QString::fromUtf8(DisplayValue(value_->address_size(), value_->address()).c_str()) : QString()); size_->setValue(value_ ? QString::fromUtf8(DisplayValue(osDWord, value_->size()).c_str()) : QString()); ISection *segment = NULL; if (value_) { IArchitecture *file = value_->owner()->owner(); segment = file->segment_list()->GetSectionByAddress(value_->address()); if (file->owner()->format_name() == "ELF") { switch (value_->type()) { case DT_NEEDED: case DT_PLTRELSZ: case DT_RELASZ: case DT_RELAENT: case DT_STRSZ: case DT_SYMENT: case DT_SONAME: case DT_RPATH: case DT_RELSZ: case DT_RELENT: case DT_PLTREL: case DT_DEBUG: case DT_BIND_NOW: case DT_INIT_ARRAYSZ: case DT_FINI_ARRAYSZ: case DT_RUNPATH: case DT_FLAGS: case DT_PREINIT_ARRAYSZ: case DT_GNU_HASH: case DT_RELACOUNT: case DT_RELCOUNT: case DT_FLAGS_1: case DT_VERDEFNUM: case DT_VERNEEDNUM: segment = NULL; break; } } } segment_->setValue(segment ? QString::fromUtf8(segment->name().c_str()) : QString()); } /** * ImportPropertyManager */ ImportPropertyManager::ImportPropertyManager(QObject *parent) : PropertyManager(parent), value_(NULL), func_(NULL) { details_ = addGroupProperty(NULL, QString::fromUtf8(language[lsDetails].c_str())); name_ = addStringProperty(details_, QString::fromUtf8(language[lsName].c_str()), QString()); name_->setReadOnly(true); address_ = addStringProperty(details_, QString::fromUtf8(language[lsAddress].c_str()), QString()); address_->setReadOnly(true); references_ = addStringProperty(details_, QString::fromUtf8(language[lsReferences].c_str()), QString()); references_->setReadOnly(true); } ImportPropertyManager::~ImportPropertyManager() { delete func_; } void ImportPropertyManager::localize() { details_->setName(QString::fromUtf8(language[lsDetails].c_str())); name_->setName(QString::fromUtf8(language[lsName].c_str())); address_->setName(QString::fromUtf8(language[lsAddress].c_str())); references_->setName(QString::fromUtf8(language[lsReferences].c_str())); references_->setValue(value_ ? QString::number(references_->childCount()) + " " + QString::fromUtf8(language[lsItems].c_str()) : QString()); } QVariant ImportPropertyManager::data(const QModelIndex &index, int role) const { Property *prop = indexToProperty(index); if (role == Qt::FontRole) { if (prop && prop->parent() == references_) return QFont(MONOSPACE_FONT_FAMILY); } return PropertyManager::data(index, role); } void ImportPropertyManager::setValue(IImportFunction *value) { value_ = value; delete func_; func_ = NULL; if (references_->childCount()) { beginRemoveRows(propertyToIndex(references_), 0, references_->childCount()); references_->clear(); endRemoveRows(); } if (value_) { IArchitecture *file = value_->owner()->owner()->owner(); func_ = file->function_list()->CreateFunction(); ReferenceList *reference_list = value_->map_function()->reference_list(); for (size_t i = 0; i < reference_list->count(); i++) { Reference *reference = reference_list->item(i); if (file->AddressSeek(reference->address())) func_->ParseCommand(*file, reference->address()); } beginInsertRows(propertyToIndex(references_), 0, (int)reference_list->count()); for (size_t i = 0; i < func_->count(); i++) { Property *prop = addCommandProperty(references_, func_->item(i)); prop->setReadOnly(true); } endInsertRows(); } update(); } void ImportPropertyManager::update() { name_->setValue(value_ ? QString::fromUtf8(value_->name().c_str()) : QString()); address_->setValue(value_ ? QString::fromUtf8(DisplayValue(value_->address_size(), value_->address()).c_str()) : QString()); references_->setValue(value_ ? QString::number(references_->childCount()) + " " + QString::fromUtf8(language[lsItems].c_str()) : QString()); } /** * ExportPropertyManager */ ExportPropertyManager::ExportPropertyManager(QObject *parent) : PropertyManager(parent), value_(NULL) { details_ = addGroupProperty(NULL, QString::fromUtf8(language[lsDetails].c_str())); name_ = addStringProperty(details_, QString::fromUtf8(language[lsName].c_str()), QString()); name_->setReadOnly(true); forwarded_ = addStringProperty(details_, "Forwarded", QString()); forwarded_->setReadOnly(true); address_ = addStringProperty(details_, QString::fromUtf8(language[lsAddress].c_str()), QString()); address_->setReadOnly(true); } void ExportPropertyManager::localize() { details_->setName(QString::fromUtf8(language[lsDetails].c_str())); name_->setName(QString::fromUtf8(language[lsName].c_str())); address_->setName(QString::fromUtf8(language[lsAddress].c_str())); } void ExportPropertyManager::setValue(IExport *value) { value_ = value; update(); } void ExportPropertyManager::update() { name_->setValue(value_ ? QString::fromUtf8(value_->name().c_str()) : QString()); forwarded_->setValue(value_ ? QString::fromUtf8(value_->forwarded_name().c_str()) : QString()); address_->setValue(value_ ? QString::fromUtf8(DisplayValue(value_->address_size(), value_->address()).c_str()) : QString()); } /** * ResourcePropertyManager */ ResourcePropertyManager::ResourcePropertyManager(QObject *parent) : PropertyManager(parent), value_(NULL), lock_(false) { options_ = addGroupProperty(NULL, QString::fromUtf8(language[lsPacking].c_str())); excluded_from_packing_ = addBoolProperty(options_, QString::fromUtf8(language[lsExcludedFromPacking].c_str()), false); details_ = addGroupProperty(NULL, QString::fromUtf8(language[lsDetails].c_str())); name_ = addStringProperty(details_, QString::fromUtf8(language[lsName].c_str()), QString()); name_->setReadOnly(true); address_ = addStringProperty(details_, QString::fromUtf8(language[lsAddress].c_str()), QString()); address_->setReadOnly(true); size_ = addStringProperty(details_, QString::fromUtf8(language[lsSize].c_str()), QString()); size_->setReadOnly(true); connect(excluded_from_packing_, SIGNAL(valueChanged(bool)), this, SLOT(excludedFromPackingChanged(bool))); } void ResourcePropertyManager::localize() { options_->setName(QString::fromUtf8(language[lsOptions].c_str())); excluded_from_packing_->setName(QString::fromUtf8(language[lsExcludedFromPacking].c_str())); details_->setName(QString::fromUtf8(language[lsDetails].c_str())); name_->setName(QString::fromUtf8(language[lsName].c_str())); address_->setName(QString::fromUtf8(language[lsAddress].c_str())); size_->setName(QString::fromUtf8(language[lsSize].c_str())); } void ResourcePropertyManager::setValue(IResource *value) { value_ = value; update(); } void ResourcePropertyManager::update() { lock_ = true; name_->setValue(value_ ? QString::fromUtf8(value_->name().c_str()) : QString()); address_->setValue(value_ ? QString::fromUtf8(DisplayValue(value_->address_size(), value_->address()).c_str()) : QString()); size_->setValue(value_ ? QString::fromUtf8(DisplayValue(osDWord, value_->size()).c_str()) : QString()); excluded_from_packing_->setValue(value_ ? value_->excluded_from_packing() : false); lock_ = false; } void ResourcePropertyManager::excludedFromPackingChanged(bool value) { if (!value_ || lock_) return; value_->set_excluded_from_packing(value); } /** * CorePropertyManager */ CorePropertyManager::CorePropertyManager(QObject *parent) : PropertyManager(parent), core_(NULL), lock_(false) { file_ = addGroupProperty(NULL, QString::fromUtf8(language[lsFile].c_str())); memoryProtection_ = addBoolProperty(file_, QString::fromUtf8(language[lsMemoryProtection].c_str()), false); connect(memoryProtection_, SIGNAL(valueChanged(bool)), this, SLOT(memoryProtectionChanged(bool))); importProtection_ = addBoolProperty(file_, QString::fromUtf8(language[lsImportProtection].c_str()), false); connect(importProtection_, SIGNAL(valueChanged(bool)), this, SLOT(importProtectionChanged(bool))); resourceProtection_ = addBoolProperty(file_, QString::fromUtf8(language[lsResourceProtection].c_str()), false); connect(resourceProtection_, SIGNAL(valueChanged(bool)), this, SLOT(resourceProtectionChanged(bool))); packOutputFile_ = addBoolProperty(file_, QString::fromUtf8(language[lsPackOutputFile].c_str()), false); connect(packOutputFile_, SIGNAL(valueChanged(bool)), this, SLOT(packOutputFileChanged(bool))); outputFileName_ = addFileNameProperty(file_, QString::fromUtf8(language[lsOutputFile].c_str()), QString("%1 (" #ifdef VMP_GNU "*.dylib *.exe *.dll *.bpl *.ocx *.sys *.scr *.so);;%2 (*)" #else "*.exe *.dll *.bpl *.ocx *.sys *.scr *.dylib *.so);;%2 (*.*)" #endif ).arg(QString::fromUtf8(language[lsExecutableFiles].c_str())).arg(QString::fromUtf8(language[lsAllFiles].c_str())), QString(), true); connect(outputFileName_, SIGNAL(valueChanged(const QString &)), this, SLOT(outputFileChanged(const QString &))); detection_ = addGroupProperty(NULL, QString::fromUtf8(language[lsDetection].c_str())); detectionDebugger_ = addEnumProperty(detection_, QString::fromUtf8(language[lsDebugger].c_str()), QStringList() << QString::fromUtf8(language[lsNo].c_str()) << "User-mode" << "User-mode + Kernel-mode", 0); connect(detectionDebugger_, SIGNAL(valueChanged(int)), this, SLOT(detectionDebuggerChanged(int))); detectionVMTools_ = addBoolProperty(detection_, QString::fromUtf8(language[lsVirtualizationTools].c_str()), false); connect(detectionVMTools_, SIGNAL(valueChanged(bool)), this, SLOT(detectioncpVMToolsChanged(bool))); additional_ = addGroupProperty(NULL, QString::fromUtf8(language[lsAdditional].c_str())); vmSectionName_ = addStringProperty(additional_, QString::fromUtf8(language[lsVMSegments].c_str()), QString()); connect(vmSectionName_, SIGNAL(valueChanged(const QString &)), this, SLOT(vmSectionNameChanged(const QString &))); stripDebugInfo_ = addBoolProperty(additional_, QString::fromUtf8(language[lsStripDebugInfo].c_str()), false); connect(stripDebugInfo_, SIGNAL(valueChanged(bool)), this, SLOT(stripDebugInfoChanged(bool))); stripRelocations_ = addBoolProperty(additional_, QString::fromUtf8(language[lsStripRelocations].c_str()), false); connect(stripRelocations_, SIGNAL(valueChanged(bool)), this, SLOT(stripRelocationsChanged(bool))); #ifndef LITE watermarkName_ = addWatermarkProperty(additional_, QString::fromUtf8(language[lsWatermark].c_str()), QString()); connect(watermarkName_, SIGNAL(valueChanged(const QString &)), this, SLOT(watermarkNameChanged(const QString &))); #ifdef ULTIMATE hwid_ = addStringProperty(additional_, QString::fromUtf8(language[lsLockToHWID].c_str()), QString()); connect(hwid_, SIGNAL(valueChanged(const QString &)), this, SLOT(hwidChanged(const QString &))); #ifdef DEMO if (true) #else if (VMProtectGetSerialNumberState() != SERIAL_STATE_SUCCESS) #endif { size_t size = VMProtectGetCurrentHWID(NULL, 0); char *hwid = new char[size]; VMProtectGetCurrentHWID(hwid, (int)size); hwid_->setValue(QString().fromLatin1(hwid)); hwid_->setReadOnly(true); delete [] hwid; } #endif messages_ = addGroupProperty(NULL, QString::fromUtf8(language[lsMessages].c_str())); messageDebuggerFound_ = addStringListProperty(messages_, QString::fromUtf8(language[lsDebuggerFound].c_str()), QString()); connect(messageDebuggerFound_, SIGNAL(valueChanged(const QString &)), this, SLOT(messageDebuggerFoundChanged(const QString &))); messageVMToolsFound_ = addStringListProperty(messages_, QString::fromUtf8(language[lsVirtualizationToolsFound].c_str()), QString()); connect(messageVMToolsFound_, SIGNAL(valueChanged(const QString &)), this, SLOT(messageVMToolsFoundChanged(const QString &))); messageFileCorrupted_ = addStringListProperty(messages_, QString::fromUtf8(language[lsFileCorrupted].c_str()), QString()); connect(messageFileCorrupted_, SIGNAL(valueChanged(const QString &)), this, SLOT(messageFileCorruptedChanged(const QString &))); messageSerialNumberRequired_ = addStringListProperty(messages_, QString::fromUtf8(language[lsSerialNumberRequired].c_str()), QString()); connect(messageSerialNumberRequired_, SIGNAL(valueChanged(const QString &)), this, SLOT(messageSerialNumberRequiredChanged(const QString &))); messageHWIDMismatched_ = addStringListProperty(messages_, QString::fromUtf8(language[lsHWIDMismatched].c_str()), QString()); connect(messageHWIDMismatched_, SIGNAL(valueChanged(const QString &)), this, SLOT(messageHWIDMismatchedChanged(const QString &))); #endif #ifdef ULTIMATE licensingParameters_ = addGroupProperty(NULL, QString::fromUtf8(language[lsLicensingParameters].c_str())); licenseDataFileName_ = addFileNameProperty(licensingParameters_, QString::fromUtf8(language[lsFileName].c_str()), QString("%1 (*.vmp);;" #ifdef VMP_GNU " %2 (*)" #else " %2 (*.*)" #endif ).arg(QString::fromUtf8(language[lsProjectFiles].c_str())).arg(QString::fromUtf8(language[lsAllFiles].c_str())), QString()); connect(licenseDataFileName_, SIGNAL(valueChanged(const QString &)), this, SLOT(licenseDataFileNameChanged(const QString &))); keyPairAlgorithm_ = addStringProperty(licensingParameters_, QString::fromUtf8(language[lsKeyPairAlgorithm].c_str()), QString()); keyPairAlgorithm_->setReadOnly(true); activationServer_ = addStringProperty(licensingParameters_, QString::fromUtf8(language[lsActivationServer].c_str()), QString()); connect(activationServer_, SIGNAL(valueChanged(const QString &)), this, SLOT(activationServerChanged(const QString &))); #endif } void CorePropertyManager::localize() { file_->setName(QString::fromUtf8(language[lsFile].c_str())); memoryProtection_->setName(QString::fromUtf8(language[lsMemoryProtection].c_str())); memoryProtection_->setToolTip(QString::fromUtf8(language[lsMemoryProtectionHelp].c_str())); importProtection_->setName(QString::fromUtf8(language[lsImportProtection].c_str())); importProtection_->setToolTip(QString::fromUtf8(language[lsImportProtectionHelp].c_str())); resourceProtection_->setName(QString::fromUtf8(language[lsResourceProtection].c_str())); resourceProtection_->setToolTip(QString::fromUtf8(language[lsResourceProtectionHelp].c_str())); packOutputFile_->setName(QString::fromUtf8(language[lsPackOutputFile].c_str())); packOutputFile_->setToolTip(QString::fromUtf8(language[lsPackOutputFileHelp].c_str())); #ifndef LITE watermarkName_->setName(QString::fromUtf8(language[lsWatermark].c_str())); watermarkName_->setToolTip(QString::fromUtf8(language[lsWatermarkHelp].c_str())); #endif outputFileName_->setName(QString::fromUtf8(language[lsOutputFile].c_str())); outputFileName_->setFilter(QString("%1 (" #ifdef VMP_GNU "*.dylib *.exe *.dll *.bpl *.ocx *.sys *.scr *.so);;%2 (*)" #else "*.exe *.dll *.bpl *.ocx *.sys *.scr *.dylib *.so);;%2 (*.*)" #endif ).arg(QString::fromUtf8(language[lsExecutableFiles].c_str())).arg(QString::fromUtf8(language[lsAllFiles].c_str()))); detection_->setName(QString::fromUtf8(language[lsDetection].c_str())); detectionDebugger_->setName(QString::fromUtf8(language[lsDebugger].c_str())); detectionDebugger_->setToolTip(QString::fromUtf8(language[lsDebuggerHelp].c_str())); detectionDebugger_->setText(0, QString::fromUtf8(language[lsNo].c_str())); detectionVMTools_->setName(QString::fromUtf8(language[lsVirtualizationTools].c_str())); detectionVMTools_->setToolTip(QString::fromUtf8(language[lsVirtualizationToolsHelp].c_str())); #ifndef LITE messages_->setName(QString::fromUtf8(language[lsMessages].c_str())); messageDebuggerFound_->setName(QString::fromUtf8(language[lsDebuggerFound].c_str())); messageVMToolsFound_->setName(QString::fromUtf8(language[lsVirtualizationToolsFound].c_str())); messageFileCorrupted_->setName(QString::fromUtf8(language[lsFileCorrupted].c_str())); messageSerialNumberRequired_->setName(QString::fromUtf8(language[lsSerialNumberRequired].c_str())); messageHWIDMismatched_->setName(QString::fromUtf8(language[lsHWIDMismatched].c_str())); #endif additional_->setName(QString::fromUtf8(language[lsAdditional].c_str())); vmSectionName_->setName(QString::fromUtf8(language[lsVMSegments].c_str())); vmSectionName_->setToolTip(QString::fromUtf8(language[lsVMSegmentsHelp].c_str())); stripDebugInfo_->setName(QString::fromUtf8(language[lsStripDebugInfo].c_str())); stripRelocations_->setName(QString::fromUtf8(language[lsStripRelocations].c_str())); #ifdef ULTIMATE hwid_->setName(QString::fromUtf8(language[lsLockToHWID].c_str())); licensingParameters_->setName(QString::fromUtf8(language[lsLicensingParameters].c_str())); licensingParameters_->setToolTip(QString::fromUtf8(language[lsLicensingParametersHelp].c_str())); licenseDataFileName_->setName(QString::fromUtf8(language[lsFileName].c_str())); licenseDataFileName_->setFilter(QString( #ifdef VMP_GNU "%1 (*.vmp);;%2 (*)" #else "%1 (*.vmp);;%2 (*.*)" #endif ).arg(QString::fromUtf8(language[lsProjectFiles].c_str())).arg(QString::fromUtf8(language[lsAllFiles].c_str()))); keyPairAlgorithm_->setName(QString::fromUtf8(language[lsKeyPairAlgorithm].c_str())); if (keyPairAlgorithm_->childCount()) { QList keyProps = keyPairAlgorithm_->children(); keyProps[0]->setName(QString::fromUtf8(language[lsPublicExp].c_str())); keyProps[1]->setName(QString::fromUtf8(language[lsPrivateExp].c_str())); keyProps[2]->setName(QString::fromUtf8(language[lsModulus].c_str())); keyProps[3]->setName(QString::fromUtf8(language[lsProductCode].c_str())); } else { keyPairAlgorithm_->setValue(QString::fromUtf8(language[lsNone].c_str())); } activationServer_->setName(QString::fromUtf8(language[lsActivationServer].c_str())); #endif } void CorePropertyManager::setCore(Core *core) { core_ = core; if (core_ && core_->input_file()) { uint32_t disable_options = core_->input_file()->disable_options(); stripRelocations_->setReadOnly(disable_options & cpStripFixups); importProtection_->setReadOnly(disable_options & cpImportProtection); resourceProtection_->setReadOnly(disable_options & cpResourceProtection); packOutputFile_->setReadOnly(disable_options & cpPack); } outputFileName_->setRelativePath(core ? QString::fromUtf8(core->project_path().c_str()) : QString()); #ifdef ULTIMATE licenseDataFileName_->setRelativePath(core ? QString::fromUtf8(core->project_path().c_str()) : QString()); #endif update(); } QVariant CorePropertyManager::data(const QModelIndex &index, int role) const { if (role == Qt::FontRole) { #ifdef ULTIMATE Property *prop = indexToProperty(index); if (prop && prop->parent() == keyPairAlgorithm_ && index.column() == 1) return QFont(MONOSPACE_FONT_FAMILY); #endif } return PropertyManager::data(index, role); } void CorePropertyManager::update() { lock_ = true; uint32_t options = core_ ? core_->options() : 0; if (core_ && core_->input_file()) options &= ~core_->input_file()->disable_options(); memoryProtection_->setValue(core_ ? (options & cpMemoryProtection) != 0 : false); importProtection_->setValue(core_ ? (options & cpImportProtection) != 0 : false); resourceProtection_->setValue(core_ ? (options & cpResourceProtection) != 0 : false); packOutputFile_->setValue(core_ ? (options & cpPack) != 0 : false); #ifndef LITE watermarkName_->setValue(core_ ? QString::fromUtf8(core_->watermark_name().c_str()) : QString()); #endif outputFileName_->setValue(core_ ? QString::fromUtf8(core_->output_file_name().c_str()) : QString()); int i; switch (options & (cpCheckDebugger | cpCheckKernelDebugger)) { case cpCheckDebugger: i = 1; break; case cpCheckDebugger | cpCheckKernelDebugger: i = 2; break; default: i = 0; break; } detectionDebugger_->setValue(core_ ? i : 0); detectionVMTools_->setValue(core_ ? (options & cpCheckVirtualMachine) != 0 : false); #ifndef LITE messageDebuggerFound_->setValue(core_ ? QString::fromUtf8(core_->message(MESSAGE_DEBUGGER_FOUND).c_str()) : QString()); messageVMToolsFound_->setValue(core_ ? QString::fromUtf8(core_->message(MESSAGE_VIRTUAL_MACHINE_FOUND).c_str()) : QString()); messageFileCorrupted_->setValue(core_ ? QString::fromUtf8(core_->message(MESSAGE_FILE_CORRUPTED).c_str()) : QString()); messageSerialNumberRequired_->setValue(core_ ? QString::fromUtf8(core_->message(MESSAGE_SERIAL_NUMBER_REQUIRED).c_str()) : QString()); messageHWIDMismatched_->setValue(core_ ? QString::fromUtf8(core_->message(MESSAGE_HWID_MISMATCHED).c_str()) : QString()); #endif vmSectionName_->setValue(core_ ? QString::fromUtf8(core_->vm_section_name().c_str()) : QString()); stripDebugInfo_->setValue(core_ ? (options & cpStripDebugInfo) != 0 : false); stripRelocations_->setValue(core_ ? (options & cpStripFixups) != 0 : false); #ifdef ULTIMATE if (!hwid_->readOnly()) hwid_->setValue(core_ ? QString::fromUtf8(core_->hwid().c_str()) : QString()); licenseDataFileName_->setValue(core_ ? QString::fromUtf8(core_->license_data_file_name().c_str()) : QString()); QString str; if (core_) { LicensingManager *licensingManager = core_->licensing_manager(); switch (licensingManager->algorithm()) { case alNone: str = QString::fromUtf8(language[lsNone].c_str()); if (keyPairAlgorithm_->childCount()) { beginRemoveRows(propertyToIndex(keyPairAlgorithm_), 0, keyPairAlgorithm_->childCount()); keyPairAlgorithm_->clear(); endRemoveRows(); } break; case alRSA: str = QString("RSA %1").arg(licensingManager->bits()); if (!keyPairAlgorithm_->childCount()) { beginInsertRows(propertyToIndex(keyPairAlgorithm_), 0, 4); StringProperty *prop = addStringProperty(keyPairAlgorithm_, QString::fromUtf8(language[lsPublicExp].c_str()), QString()); prop->setReadOnly(true); prop = addStringProperty(keyPairAlgorithm_, QString::fromUtf8(language[lsPrivateExp].c_str()), QString()); prop->setReadOnly(true); prop = addStringProperty(keyPairAlgorithm_, QString::fromUtf8(language[lsModulus].c_str()), QString()); prop->setReadOnly(true); prop = addStringProperty(keyPairAlgorithm_, QString::fromUtf8(language[lsProductCode].c_str()), QString()); prop->setReadOnly(true); endInsertRows(); } QList list = keyPairAlgorithm_->children(); reinterpret_cast(list.at(0))->setValue(QString::fromLatin1(formatVector(licensingManager->public_exp()).c_str())); reinterpret_cast(list.at(1))->setValue(QString::fromLatin1(formatVector(licensingManager->private_exp()).c_str())); reinterpret_cast(list.at(2))->setValue(QString::fromLatin1(formatVector(licensingManager->modulus()).c_str())); uint64_t product_code = licensingManager->product_code(); reinterpret_cast(list.at(3))->setValue(QByteArray(reinterpret_cast(&product_code), sizeof(product_code)).toBase64()); break; } } keyPairAlgorithm_->setValue(str); activationServer_->setValue(core_ ? QString::fromUtf8(core_->activation_server().c_str()) : QString()); #endif lock_ = false; } void CorePropertyManager::memoryProtectionChanged(bool value) { if (!core_ || lock_) return; if (value) { core_->include_option(cpMemoryProtection); } else { core_->exclude_option(cpMemoryProtection); } } void CorePropertyManager::importProtectionChanged(bool value) { if (!core_ || lock_) return; if (value) { core_->include_option(cpImportProtection); } else { core_->exclude_option(cpImportProtection); } } void CorePropertyManager::resourceProtectionChanged(bool value) { if (!core_ || lock_) return; if (value) { core_->include_option(cpResourceProtection); } else { core_->exclude_option(cpResourceProtection); } } void CorePropertyManager::packOutputFileChanged(bool value) { if (!core_ || lock_) return; if (value) { core_->include_option(cpPack); } else { core_->exclude_option(cpPack); } } void CorePropertyManager::watermarkNameChanged(const QString &value) { if (!core_ || lock_) return; core_->set_watermark_name(value.toUtf8().constData()); } void CorePropertyManager::outputFileChanged(const QString &value) { if (!core_ || lock_) return; core_->set_output_file_name(value.toUtf8().constData()); } void CorePropertyManager::detectionDebuggerChanged(int value) { if (!core_ || lock_) return; if (value) core_->include_option(cpCheckDebugger); else core_->exclude_option(cpCheckDebugger); if (value == 2) core_->include_option(cpCheckKernelDebugger); else core_->exclude_option(cpCheckKernelDebugger); } void CorePropertyManager::detectioncpVMToolsChanged(bool value) { if (!core_ || lock_) return; if (value) { core_->include_option(cpCheckVirtualMachine); } else { core_->exclude_option(cpCheckVirtualMachine); } } void CorePropertyManager::vmSectionNameChanged(const QString &value) { if (!core_ || lock_) return; core_->set_vm_section_name(value.toUtf8().constData()); } void CorePropertyManager::stripDebugInfoChanged(bool value) { if (!core_ || lock_) return; if (value) { core_->include_option(cpStripDebugInfo); } else { core_->exclude_option(cpStripDebugInfo); } } void CorePropertyManager::stripRelocationsChanged(bool value) { if (!core_ || lock_) return; if (value) { core_->include_option(cpStripFixups); } else { core_->exclude_option(cpStripFixups); } } void CorePropertyManager::debugModeChanged(bool value) { if (!core_ || lock_) return; if (value) { core_->include_option(cpDebugMode); } else { core_->exclude_option(cpDebugMode); } } void CorePropertyManager::messageDebuggerFoundChanged(const QString &value) { if (!core_ || lock_) return; core_->set_message(MESSAGE_DEBUGGER_FOUND, value.toUtf8().constData()); } void CorePropertyManager::messageVMToolsFoundChanged(const QString &value) { if (!core_ || lock_) return; core_->set_message(MESSAGE_VIRTUAL_MACHINE_FOUND, value.toUtf8().constData()); } void CorePropertyManager::messageFileCorruptedChanged(const QString &value) { if (!core_ || lock_) return; core_->set_message(MESSAGE_FILE_CORRUPTED, value.toUtf8().constData()); } void CorePropertyManager::messageSerialNumberRequiredChanged(const QString &value) { if (!core_ || lock_) return; core_->set_message(MESSAGE_SERIAL_NUMBER_REQUIRED, value.toUtf8().constData()); } void CorePropertyManager::messageHWIDMismatchedChanged(const QString &value) { if (!core_ || lock_) return; core_->set_message(MESSAGE_HWID_MISMATCHED, value.toUtf8().constData()); } #ifdef ULTIMATE void CorePropertyManager::hwidChanged(const QString &value) { if (!core_ || lock_) return; core_->set_hwid(value.toUtf8().constData()); } void CorePropertyManager::licenseDataFileNameChanged(const QString &value) { if (!core_ || lock_) return; core_->set_license_data_file_name(value.toUtf8().constData()); } void CorePropertyManager::activationServerChanged(const QString &value) { if (!core_ || lock_) return; core_->set_activation_server(value.toUtf8().constData()); } #else void CorePropertyManager::hwidChanged(const QString &) {} void CorePropertyManager::licenseDataFileNameChanged(const QString &) {} void CorePropertyManager::activationServerChanged(const QString &) {} #endif /** * WatermarkPropertyManager */ WatermarkPropertyManager::WatermarkPropertyManager(QObject *parent) : PropertyManager(parent), lock_(false), watermark_(NULL) { GroupProperty *details_ = addGroupProperty(NULL, QString::fromUtf8(language[lsDetails].c_str())); name_ = addStringProperty(details_, QString::fromUtf8(language[lsName].c_str()), QString()); blocked_ = addBoolProperty(details_, QString::fromUtf8(language[lsBlocked].c_str()), false); useCount_ = addStringProperty(details_, QString::fromUtf8(language[lsUsageCount].c_str()), QString()); useCount_->setReadOnly(true); connect(name_, SIGNAL(valueChanged(const QString &)), this, SLOT(nameChanged(const QString &))); connect(blocked_, SIGNAL(valueChanged(bool)), this, SLOT(blockedChanged(bool))); } void WatermarkPropertyManager::setWatermark(Watermark *watermark) { watermark_ = watermark; update(); } void WatermarkPropertyManager::update() { lock_ = true; name_->setValue(watermark_ ? QString::fromUtf8(watermark_->name().c_str()) : QString()); blocked_->setValue(watermark_ ? !watermark_->enabled() : false); useCount_->setValue(watermark_ ? QString::number(watermark_->use_count()) : QString()); lock_ = false; } void WatermarkPropertyManager::nameChanged(const QString &value) { if (!watermark_ || lock_) return; watermark_->set_name(value.toUtf8().constData()); } void WatermarkPropertyManager::blockedChanged(bool value) { if (!watermark_ || lock_) return; watermark_->set_enabled(!value); } /** * AddressCalculator */ AddressCalculator::AddressCalculator(QObject *parent) : PropertyManager(parent), lock_(false), file_(NULL) { address_ = addStringProperty(NULL, QString::fromUtf8(language[lsAddress].c_str()), QString()); offset_ = addStringProperty(NULL, QString::fromUtf8(language[lsRawAddress].c_str()), QString()); segment_ = addEnumProperty(NULL, QString::fromUtf8(language[lsSegment].c_str()), QStringList(), -1); connect(address_, SIGNAL(valueChanged(const QString &)), this, SLOT(addressChanged(const QString &))); connect(offset_, SIGNAL(valueChanged(const QString &)), this, SLOT(offsetChanged(const QString &))); connect(segment_, SIGNAL(valueChanged(int)), this, SLOT(segmentChanged(int))); } void AddressCalculator::localize() { address_->setName(QString::fromUtf8(language[lsAddress].c_str())); offset_->setName(QString::fromUtf8(language[lsRawAddress].c_str())); segment_->setName(QString::fromUtf8(language[lsSegment].c_str())); } void AddressCalculator::setValue(IArchitecture *file) { if (file_ == file) return; file_ = file; lock_ = true; address_->setValue(QString()); offset_->setValue(QString()); QStringList segments; if (file_) { for (size_t i = 0; i < file_->segment_list()->count(); i++) { segments.push_back(QString::fromUtf8(file_->segment_list()->item(i)->name().c_str())); } } segment_->setValue(-1); segment_->setItems(segments); lock_ = false; } void AddressCalculator::addressChanged(const QString &value) { if (!file_ || lock_) return; lock_ = true; bool is_valid; ISection *segment = NULL; uint64_t address = value.toULongLong(&is_valid, 16); if (is_valid) segment = file_->segment_list()->GetSectionByAddress(address); offset_->setValue(segment ? QString::fromUtf8(DisplayValue(osDWord, segment->physical_offset() + address - segment->address()).c_str()) : QString()); segment_->setValue(segment ? (int)file_->segment_list()->IndexOf(segment) : -1); lock_ = false; } void AddressCalculator::offsetChanged(const QString &value) { if (!file_ || lock_) return; lock_ = true; bool is_valid; ISection *segment = NULL; uint64_t offset = value.toULongLong(&is_valid, 16); if (is_valid) segment = file_->segment_list()->GetSectionByOffset(offset); uint64_t address = segment ? segment->address() + offset - segment->physical_offset() : 0; address_->setValue(segment ? QString::fromUtf8(DisplayValue(file_->cpu_address_size(), address).c_str()) : QString()); segment_->setValue(segment ? (int)file_->segment_list()->IndexOf(segment) : -1); lock_ = false; } void AddressCalculator::segmentChanged(int value) { if (!file_ || lock_) return; lock_ = true; ISection *segment = file_->segment_list()->item(value); uint64_t address = segment ? segment->address() : 0; address_->setValue(segment ? QString::fromUtf8(DisplayValue(file_->cpu_address_size(), address).c_str()) : QString()); offset_->setValue(segment ? QString::fromUtf8(DisplayValue(osDWord, segment->physical_offset() + address - segment->address()).c_str()) : QString()); lock_ = false; }