// Расшифровка аттача на диске и в памяти void Attach::decrypt(unsigned int area) { // Если аттач не зашифрован, и происходит расшифровка, значит есть какая-то ошибка в логике выше if(getField("crypt")!="1") criticalError("Attach::decrypt() : Cant decrypt unencrypted attach."); // Расшифровывается файл if(area & areaFile) if(getField("type")=="file") CryptService::decryptFile(globalParameters.getCryptKey(), getFullInnerFileName()); // Расшифровывается содержимое файла в памяти, если таковое есть if(area & areaMemory) if(liteFlag==false && fileContent.length()>0) fileContent=CryptService::decryptByteArray(globalParameters.getCryptKey(), fileContent); // Расшифровываются поля, которые подлежат шифрованию foreach( QString fieldName, fieldCryptedList() ) { // У аттача с типом file не должно быть обращений к полю link (оно не должно использоваться) if(getField("type")=="file" && fieldName=="link") continue; // Если поле с указанным именем существует и содержит данные, оно расшифровывается из исходных зашифрованных данных if(getField(fieldName).length()>0) setFieldSource(fieldName, CryptService::decryptString( globalParameters.getCryptKey(), fields[fieldName])); } // Устанавливается флаг, что запись не зашифрована setField("crypt", ""); // Отсутсвие значения предпочтительней, так как тогда в XML-данные не будет попадать атрибут crypt="0" }
void AppConfigPage_Misc::onClickedEditMyTetraConfigFile(void) { // Сбрасываются в файл конфига все возможные изменения, которые, возможно еще не были записаны mytetraConfig.sync(); editConfigFile( globalParameters.getWorkDirectory()+"/conf.ini", 0.8 ); }
// Получение значения поля // Метод возвращает расшифрованные данные, если запись была зашифрована QString Attach::getField(QString name) const { // Если имя поля недопустимо if(fieldAvailableList().contains(name)==false) criticalError("Attach::getField() : get unavailable field "+name); // ------------------------------------------ // Проверки и действия для разных типов полей // ------------------------------------------ // Если запрашивается линк на файл if(name=="link") if(fields["type"]!="link") // И тип аттача не является линком criticalError("Attach::getField() : Can't get link from non-link attach."); // ----------------------- // Получение значения поля // ----------------------- // Если запись зашифрована, но ключ не установлен (т.е. человек не вводил пароль) // то расшифровка невозможна if(fieldCryptedList().contains(name)) if(fields.contains("crypt")) if(fields["crypt"]=="1") if(globalParameters.getCryptKey().length()==0) return QString(); bool isCrypt=false; // Если имя поля принадлежит списку полей, которые могут шифроваться // и в наборе полей есть поле crypt // и поле crypt установлено в 1 // и запрашиваемое поле не пустое (пустые данные невозможно расшифровать) if(fieldCryptedList().contains(name)) if(fields.contains("crypt")) if(fields["crypt"]=="1") if(fields[name].length()>0) isCrypt=true; // Если поле не подлежит шифрованию if(isCrypt==false) return fields[name]; // Возвращается значение поля else return CryptService::decryptString(globalParameters.getCryptKey(), fields[name]); // Поле расшифровывается }
void AppConfig::update_version_process(void) { QString configFileName=globalParameters.getWorkDirectory()+"/conf.ini"; AppConfigUpdater updater; updater.set_config_file(configFileName); int fromVersion=get_config_version(); // Эта строка компилируется нормально, сделать на ее основе список указателей на функцию // std::function< QStringList(AppConfig&, bool) > pFunction=&AppConfig::get_parameter_table_1; // Перечень функций, выдающих список параметров для конкретной версии конфига QList< std::function< QStringList(AppConfig&, bool) > > parameterFunctions; parameterFunctions << NULL; // Исторически счет версий идет с 1, поэтому, чтобы не запутаться, создается пустой нуливой элемент parameterFunctions << &AppConfig::get_parameter_table_1; parameterFunctions << &AppConfig::get_parameter_table_2; parameterFunctions << &AppConfig::get_parameter_table_3; parameterFunctions << &AppConfig::get_parameter_table_4; parameterFunctions << &AppConfig::get_parameter_table_5; parameterFunctions << &AppConfig::get_parameter_table_6; parameterFunctions << &AppConfig::get_parameter_table_7; parameterFunctions << &AppConfig::get_parameter_table_8; parameterFunctions << &AppConfig::get_parameter_table_9; parameterFunctions << &AppConfig::get_parameter_table_10; parameterFunctions << &AppConfig::get_parameter_table_11; parameterFunctions << &AppConfig::get_parameter_table_12; parameterFunctions << &AppConfig::get_parameter_table_13; parameterFunctions << &AppConfig::get_parameter_table_14; parameterFunctions << &AppConfig::get_parameter_table_15; parameterFunctions << &AppConfig::get_parameter_table_16; parameterFunctions << &AppConfig::get_parameter_table_17; parameterFunctions << &AppConfig::get_parameter_table_18; parameterFunctions << &AppConfig::get_parameter_table_19; parameterFunctions << &AppConfig::get_parameter_table_20; parameterFunctions << &AppConfig::get_parameter_table_21; parameterFunctions << &AppConfig::get_parameter_table_22; parameterFunctions << &AppConfig::get_parameter_table_23; parameterFunctions << &AppConfig::get_parameter_table_24; parameterFunctions << &AppConfig::get_parameter_table_25; parameterFunctions << &AppConfig::get_parameter_table_26; parameterFunctions << &AppConfig::get_parameter_table_27; parameterFunctions << &AppConfig::get_parameter_table_28; parameterFunctions << &AppConfig::get_parameter_table_29; parameterFunctions << &AppConfig::get_parameter_table_30; parameterFunctions << &AppConfig::get_parameter_table_31; parameterFunctions << &AppConfig::get_parameter_table_32; parameterFunctions << &AppConfig::get_parameter_table_33; parameterFunctions << &AppConfig::get_parameter_table_34; parameterFunctions << &AppConfig::get_parameter_table_35; for(int i=1; i<parameterFunctions.count()-1; ++i) if(fromVersion<=i) { // В вызове метода: *this - это объект, а true - это первый параметр метода. Именно так работает вызов метода для std::function updater.update_version(i, i+1, (parameterFunctions.at(i))(*this, true), (parameterFunctions.at(i+1))(*this, true) ); } }
void TreeScreen::edit_branch(void) { qDebug() << "In edit_branch()"; // Получение списка индексов QModelIndex выделенных элементов QModelIndexList selectitems=knowTreeView->selectionModel()->selectedIndexes(); // Если выбрано более одной ветки if(selectitems.size()>1) { QMessageBox messageBox(this); messageBox.setWindowTitle(tr("Unavailable action")); messageBox.setText(tr("You've selected ")+QString::number(selectitems.size())+tr(" items.\nPlease select single item for enabling edit operation.")); messageBox.addButton(tr("OK"), QMessageBox::AcceptRole); messageBox.exec(); return; } // Получение индекса выделенной строки QModelIndex index=getCurrentItemIndex(); // Получение ссылки на узел, который соответствует выделенной строке TreeItem *item=knowTreeModel->getItem(index); // Если ветка зашифрована и пароль не был введен if(item->getField("crypt")=="1" && globalParameters.getCryptKey().length()==0) return; // Получение имени ветки QString name=item->getField("name"); // Создается окно ввода данных bool ok; QString newname = QInputDialog::getText(this, tr("Edit item name"), tr("Item name:"), QLineEdit::Normal, name, &ok); // Если была нажата отмена if (!( ok && !newname.isEmpty() )) return; find_object<MainWindow>("mainwindow")->setDisabled(true); item->setField("name", newname); // Сохранение дерева веток find_object<TreeScreen>("treeScreen")->saveKnowTree(); find_object<MainWindow>("mainwindow")->setEnabled(true); }
// Шифрация аттача на диске и в памяти void Attach::encrypt(unsigned int area) { // В этом методе важна последовательность действий, // чтобы не получилась ситуации, когда часть данных зашифрована, // а другая пытается их использовать, а флаг шифрации еще не установлен // Если аттач уже зашифрован, значит есть какая-то ошибка в логике выше if(getField("crypt")=="1") criticalError("Attach::encrypt() : Cant encrypt already encrypted attach."); // Шифруется файл if(area & areaFile) if(getField("type")=="file") CryptService::encryptFile(globalParameters.getCryptKey(), getFullInnerFileName()); // Шифруется содержимое файла в памяти, если таковое есть if(area & areaMemory) if(liteFlag==false && fileContent.length()>0) fileContent=CryptService::encryptByteArray(globalParameters.getCryptKey(), fileContent); // Шифруются поля, которые подлежат шифрованию foreach( QString fieldName, fieldCryptedList() ) { // У аттача с типом file не должно быть обращений к полю link (оно не должно использоваться) if(getField("type")=="file" && fieldName=="link") continue; // Если поле с указанным именем существует if(getField(fieldName).length()>0) setFieldSource(fieldName, CryptService::encryptString( globalParameters.getCryptKey(), getField(fieldName))); } // Устанавливается флаг, что запись зашифрована setField("crypt", "1"); }
void AppConfig::init(void) { // Создается имя файла конфигурации QString configFileName=globalParameters.getWorkDirectory()+"/conf.ini"; // Проверяется, есть ли файл конфигурации QFile confFile(configFileName); if(!confFile.exists()) criticalError("File "+configFileName+" not found."); // Создается указатель на объект хранилища конфигурации conf=new QSettings(configFileName, QSettings::IniFormat); update_version_process(); sync(); is_init_flag=true; }
QVariant TreeModel::data(const QModelIndex &index, int role) const { // Если индекс невалиден, возвращается несуществующий элемент if(!index.isValid())return QVariant(); // Если запрашивается окраска текста элемента if(role==Qt::ForegroundRole) { TreeItem *item = getItem(index); if(item->recordtableGetRowCount()>0) return Qt::black;// Если узел содержит таблицу конечных записей else return Qt::darkGray; // Обычная ветка } // Если запрашивается содержимое текста элемента if(role==Qt::DisplayRole || role== Qt::EditRole) { TreeItem *item = getItem(index); return QVariant( item->getField("dynamicname") ); // Запрашивается строка имени с количеством элементов } // Если запрашиваются элементы оформления if(role == Qt::DecorationRole) { TreeItem *item = getItem(index); // Если ветка зашифрована if(item->getField("crypt")=="1") { // Если пароль не введен, доступа к ветке нет if(globalParameters.getCryptKey().length()==0) return QIcon(":/resource/pic/branch_closed.svg"); else return QIcon(":/resource/pic/branch_opened.svg"); } } return QVariant(); }
QStringList AppConfig::get_parameter_table_20(bool withEndSignature) { // Таблица параметров // Имя, Тип, Значение на случай когда в конфиге параметра прочему-то нет QStringList table; // Старые параметры, аналогичные версии 19 table << get_parameter_table_19(false); // Новые параметры if(globalParameters.getTargetOs()=="android") table << "hideEditorTools" << "QString" << "italic,underline,monospace,alignleft,aligncenter,alignright,alignwidth,numericlist,dotlist,indentplus,indentminus,showformatting,showhtml,fontcolor,expand_edit_area,save,createtable,table_add_row,table_remove_row,table_add_col,table_remove_col,table_merge_cells,table_split_cell"; // В Андроид прячутся инструменты сложного форматирования текста else table << "hideEditorTools" << "QString" << ""; // На десктопе скрываемых кнопок редактора нет if(withEndSignature) table << "0" << "0" << "0"; return table; }
QStringList AppConfig::get_parameter_table_18(bool withEndSignature) { // Таблица параметров // Имя, Тип, Значение на случай когда в конфиге параметра прочему-то нет QStringList table; // Старые параметры, аналогичные версии 17 table << get_parameter_table_17(false); // Новые параметры if(globalParameters.getTargetOs()=="android") table << "interfaceMode" << "QString" << "mobile"; // В Андроид должен быть мобильный интерфейс else table << "interfaceMode" << "QString" << "desktop"; // На десктопе должен быть интерфейс адоптированный для работы на рабочем столе if(withEndSignature) table << "0" << "0" << "0"; return table; }
QStringList AppConfig::get_parameter_table_17(bool withEndSignature) { // Таблица параметров // Имя, Тип, Значение на случай когда в конфиге параметра прочему-то нет QStringList table; // Старые параметры, аналогичные версии 16 table << get_parameter_table_16(false); // Новые параметры if(globalParameters.getTargetOs()=="android") table << "showSplashScreen" << "bool" << "true"; // В Андроид долгий запуск, нужно показывать сплешскрин else table << "showSplashScreen" << "bool" << "false"; // На десктопе быстрый запуск, сплешскрин только мешает if(withEndSignature) table << "0" << "0" << "0"; return table; }
QStringList AppConfig::get_parameter_table_15(bool withEndSignature) { // Таблица параметров // Имя, Тип, Значение на случай когда в конфиге параметра прочему-то нет QStringList table; // Старые параметры, аналогичные версии 14 table << get_parameter_table_14(false); // Новые параметры if(globalParameters.getTargetOs()=="android") table << "uglyQssReplaceHeightForTableView" << "int" << "35"; // Так как не все параметры можно стилизовать через QSS, здесь задается высота ячейки таблицы else table << "uglyQssReplaceHeightForTableView" << "int" << "0"; if(withEndSignature) table << "0" << "0" << "0"; return table; }
// Возвращение к дереву разделов в мобильном интерфейсе void RecordTableScreen::onBackClick(void) { globalParameters.getWindowSwitcher()->switchFromRecordtableToTree(); }
int HOGPlanner::readFromConfigFile(std::string& file) { globalParameters.configModels.clear(); return globalParameters.loadFromFile(file); }
namespace UC3M_HOG_GPU { using namespace std; GlobalParameters globalParameters; HOG hog; // Cambiar Detection por Dump y crear una nueva clase Detection //Detection dump; HOGPlanner::HOGPlanner() : imageReady(false),isModel(true), imageWidth(-1), imageHeight(-1) //selectedModels(NULL) { globalParameters.configModels.clear(); if(hog.initialize()) { std::cout << "ERROR:hog.initialize() failed.\n"; } if(initializeSVM()) { std::cout << "ERROR:svm.initialize() failed.\n"; } } HOGPlanner::~HOGPlanner() { if(imageReady) { hog.freeImage(); } if(hog.finalize()) { std::cout << "ERROR:hog.finalize() failed.\n"; } } int HOGPlanner::readFromConfigFile(std::string& file) { globalParameters.configModels.clear(); return globalParameters.loadFromFile(file); } int HOGPlanner::readFromModelFile() { if(globalParameters.location.size() == 0) { std::cout << "ERROR:readFromModelFile() failed.\n"; return -1; } // std::cout << "location.size:" << globalParameters.location.size() <<"\n"; // printf("# models: %d\n", globalParameters.configModels.size()); for(size_t x=0; x < globalParameters.configModels.size(); x++ ) { // std::cout << "id.size:" << globalParameters.configModels[x].id.size() <<"\n"; if(globalParameters.configModels[x].id.size() == 0) { std::cout << "ERROR:readFromModelFile() failed.\n"; return -1; } string model; if(globalParameters.configModels[x].filename.length() > 0 ) { // std::cout << "location:" << globalParameters.location<<"\n"; // std::cout << "id:" << globalParameters.configModels[x].id<<"\n"; // std::cout << "filename:" << globalParameters.configModels[x].filename<<"\n"; model = globalParameters.location +string("/")+ globalParameters.configModels[x].filename; } else { model = globalParameters.location +string("/")+ globalParameters.configModels[x].id; } // printf("loading model: %s\n", model.c_str()); if(readFromModelFileSVM(model.c_str())) { return -1; } } return 0; } // int HOGPlanner::freeImage() // { // return 0; // } int HOGPlanner::transferImage(uchar* image, ushort width, ushort height) { if(imageReady) { hog.freeImage(); } imageWidth = width; imageHeight = height; if(hog.transferImage(image, imageWidth, imageHeight)) { std::cout<<"ERROR: hog.transferImage failed"<<"\n"; return -1; } imageReady = true; return 0; } int HOGPlanner::detectInImages( const std::vector<string>& images, const std::vector<string>& output, int* blocks, int* cntSVM, double* timings) { // [Zaid-11] cambio el dia 25/10/2014 // printf("[----UC3M_HOG_GPU---Inicio de test_images-------------]\n"); // Fin [Zaid-11] int totalBlocks = 0; int totalSVM = 0; if(blocks == NULL || cntSVM == NULL) { blocks = &totalBlocks; cntSVM = &totalSVM; } for(size_t i=0; i < images.size(); i++) { QImage image; // printf("---->%s\n",images[i].c_str()); image.load(images[i].c_str()); if(image.isNull()) { std::cout << "ERROR:failed to load image in HOGPlanner" << images[i].c_str() <<"\n"; return -1; } // Porque se hace esta conversion hacia este formato hacer pruebas con y sin ese formato. QImage convertedImage = image.convertToFormat(QImage::Format_ARGB32); if(transferImage(convertedImage.bits(), convertedImage.width(),convertedImage.height())) { std::cout << "ERROR:failed in transferImage in HOGPlanner" << images[i].c_str() <<"\n"; return -1; } multiDetectionList detectionList; if(hog.processImageMultiScale(detectionList,imageWidth, imageHeight,blocks,cntSVM,timings)) { std::cout << "ERROR:failed in hog.processImageMultiScale in HOGPlanner" << images[i].c_str() <<"\n"; return -1; } //dumpMultiDetectionList(detectionList, output[i]); detectionList.clear(); hog.freeImage(); imageReady = false; } // [Zaid-11] cambio el dia 25/10/2014 // printf("[----UC3M_HOG_GPU---Fin de test_images-------------]\n"); // Fin [Zaid-11] return 0; } }
// Удаление выбранных веток, вызывается при выборе соотвествущей // кнопки или пункта меню void TreeScreen::del_branch(QString mode) { qDebug() << "In del_branch()"; // На время удаления блокируется главное окно find_object<MainWindow>("mainwindow")->setDisabled(true); find_object<MainWindow>("mainwindow")->blockSignals(true); // Получение списка индексов QModelIndex выделенных элементов QModelIndexList selectitems=knowTreeView->selectionModel()->selectedIndexes(); // Список имен веток, которые нужно удалить QStringList branches_name; for(int i = 0; i < selectitems.size(); ++i) { QModelIndex index=selectitems.at(i); TreeItem *item=knowTreeModel->getItem(index); branches_name << item->getField("name"); } // Если системный пароль не установлен, зашифрованные ветки удалять нельзя if(globalParameters.getCryptKey().size()==0) { bool disableFlag=false; // Перебираются удаляемые ветки for(int i = 0; i < selectitems.size(); ++i) { QModelIndex index=selectitems.at(i); TreeItem *item=knowTreeModel->getItem(index); // Если у ветки установлен флаг шифрования if(item->getField("crypt")=="1") { disableFlag=true; break; } // Проверяется наличие флага шифрования у всех подветок QList<QStringList> cryptFlagsList=item->getAllChildrenPathAsField("crypt"); foreach(QStringList cryptFlags, cryptFlagsList) if(cryptFlags.contains("1")) { disableFlag=true; break; } if(disableFlag) break; } // Закрылся цикл перебора всех выделенных для удаления веток // Если в какой-то ветке обнаружено шифрование if(disableFlag) { QMessageBox messageBox(this); messageBox.setWindowTitle(tr("Unavailable action")); messageBox.setText(tr("In your selected data found closed item. Action canceled.")); messageBox.addButton(tr("OK"), QMessageBox::AcceptRole); messageBox.exec(); // Разблокируется главное окно find_object<MainWindow>("mainwindow")->setEnabled(true); find_object<MainWindow>("mainwindow")->blockSignals(false); return; } } // Закрылось условие что системный пароль не установлен
void AppConfig::update_version_process(void) { QString configFileName=globalParameters.getWorkDirectory()+"/conf.ini"; AppConfigUpdater updater; updater.set_config_file(configFileName); int fromVersion=get_config_version(); // Последняя версия на данный момент - 26 if(fromVersion<=1) updater.update_version(1, 2, get_parameter_table_1(), get_parameter_table_2()); if(fromVersion<=2) updater.update_version(2, 3, get_parameter_table_2(), get_parameter_table_3()); if(fromVersion<=3) updater.update_version(3, 4, get_parameter_table_3(), get_parameter_table_4()); if(fromVersion<=4) updater.update_version(4, 5, get_parameter_table_4(), get_parameter_table_5()); if(fromVersion<=5) updater.update_version(5, 6, get_parameter_table_5(), get_parameter_table_6()); if(fromVersion<=6) updater.update_version(6, 7, get_parameter_table_6(), get_parameter_table_7()); if(fromVersion<=7) updater.update_version(7, 8, get_parameter_table_7(), get_parameter_table_8()); if(fromVersion<=8) updater.update_version(8, 9, get_parameter_table_8(), get_parameter_table_9()); if(fromVersion<=9) updater.update_version(9, 10, get_parameter_table_9(), get_parameter_table_10()); if(fromVersion<=10) updater.update_version(10, 11, get_parameter_table_10(), get_parameter_table_11()); if(fromVersion<=11) updater.update_version(11, 12, get_parameter_table_11(), get_parameter_table_12()); if(fromVersion<=12) updater.update_version(12, 13, get_parameter_table_12(), get_parameter_table_13()); if(fromVersion<=13) updater.update_version(13, 14, get_parameter_table_13(), get_parameter_table_14()); if(fromVersion<=14) updater.update_version(14, 15, get_parameter_table_14(), get_parameter_table_15()); if(fromVersion<=15) updater.update_version(15, 16, get_parameter_table_15(), get_parameter_table_16()); if(fromVersion<=16) updater.update_version(16, 17, get_parameter_table_16(), get_parameter_table_17()); if(fromVersion<=17) updater.update_version(17, 18, get_parameter_table_17(), get_parameter_table_18()); if(fromVersion<=18) updater.update_version(18, 19, get_parameter_table_18(), get_parameter_table_19()); if(fromVersion<=19) updater.update_version(19, 20, get_parameter_table_19(), get_parameter_table_20()); if(fromVersion<=20) updater.update_version(20, 21, get_parameter_table_20(), get_parameter_table_21()); if(fromVersion<=21) updater.update_version(21, 22, get_parameter_table_21(), get_parameter_table_22()); if(fromVersion<=22) updater.update_version(22, 23, get_parameter_table_22(), get_parameter_table_23()); if(fromVersion<=23) updater.update_version(23, 24, get_parameter_table_23(), get_parameter_table_24()); if(fromVersion<=24) updater.update_version(24, 25, get_parameter_table_24(), get_parameter_table_25()); if(fromVersion<=25) updater.update_version(25, 26, get_parameter_table_25(), get_parameter_table_26()); }
// Открытие контекстного меню в дереве разделов void TreeScreen::on_customContextMenuRequested(const QPoint &pos) { qDebug() << "In TreeScreen::on_customContextMenuRequested"; // Конструирование меню QMenu menu(this); menu.addAction(actionList["insSubbranch"]); menu.addAction(actionList["insBranch"]); menu.addAction(actionList["editBranch"]); menu.addAction(actionList["delBranch"]); menu.addSeparator(); menu.addAction(actionList["expandAllSubbranch"]); menu.addAction(actionList["collapseAllSubbranch"]); menu.addSeparator(); menu.addAction(actionList["moveUpBranch"]); menu.addAction(actionList["moveDnBranch"]); menu.addSeparator(); menu.addAction(actionList["cutBranch"]); menu.addAction(actionList["copyBranch"]); menu.addAction(actionList["pasteBranch"]); menu.addAction(actionList["pasteSubbranch"]); menu.addSeparator(); menu.addAction(actionList["encryptBranch"]); menu.addAction(actionList["decryptBranch"]); // Получение индекса выделенной ветки QModelIndex index=getCurrentItemIndex(); // Выясняется, зашифрована ли ветка или нет QString cryptFlag=knowTreeModel->getItem(index)->getField("crypt"); // Выясняется, зашифрована ли родительская ветка QString parentCryptFlag=knowTreeModel->getItem(index)->parent()->getField("crypt"); // Если ветка не зашифрована // Или ветка зашифрована, но пароль успешно введен if(cryptFlag!="1" || (cryptFlag=="1" && globalParameters.getCryptKey().length()>0)) { // Если в буфере есть ветки, соответсвующие пункты становятся активными bool isBranch=false; const QMimeData *mimeData=QApplication::clipboard()->mimeData(); if(mimeData!=NULL) if(mimeData->hasFormat("mytetra/branch")) isBranch=true; if( isBranch ) { actionList["pasteBranch"]->setEnabled(true); actionList["pasteSubbranch"]->setEnabled(true); } else { actionList["pasteBranch"]->setEnabled(false); actionList["pasteSubbranch"]->setEnabled(false); } // ---------------------------- // Подсветка пунктов шифрования // ---------------------------- // Если ветка незашифрована if(cryptFlag!="1") { // Шифровать можно // Дешифровать нельзя actionList["encryptBranch"]->setEnabled(true); actionList["decryptBranch"]->setEnabled(false); } else { // Ветка зашифрована // Шифровать нельзя actionList["encryptBranch"]->setEnabled(false); // Дешифровать можно только если верхнележащая ветка незашифрована if(parentCryptFlag!="1") actionList["decryptBranch"]->setEnabled(true); else actionList["decryptBranch"]->setEnabled(false); } } // Включение отображения меню на экране // menu.exec(event->globalPos()); menu.exec(knowTreeView->viewport()->mapToGlobal(pos)); }
void RecordTableController::initMetaEditorAtClickToRecord(const int pos) { // Внимание! Наверно, всю эту логику следует перенести в MetaEditor. А здесь только получить данные из таблицы // Выясняется указатель на объект редактирования текста записи MetaEditor *edView=find_object<MetaEditor>("editorScreen"); // Выясняется ссылка на таблицу конечных данных RecordTableData *table=recordSourceModel->getTableData(); // В таблице конечных данных запоминается какая запись была выбрана // чтобы затем при выборе этой же подветки засветка автоматически // установилась на последнюю рабочую запись table->setWorkPos( pos ); // Устанавливается функция обратного вызова для записи данных edView->set_save_callback(table->editorSaveCallback); // Сохраняется текст и картинки в окне редактирования find_object<MainWindow>("mainwindow")->saveTextarea(); // Для новой выбраной записи выясняется директория и основной файл QString currentDir =table->getField("dir", pos); QString currentFile=table->getField("file", pos); QString fullDir=mytetraConfig.get_tetradir()+"/base/"+currentDir; QString fullFileName=fullDir+"/"+currentFile; qDebug() << " File " << fullFileName << "\n"; // Если в окне содержимого записи уже находится выбираемая запись if(edView->get_work_directory()==fullDir && edView->get_file_name()==currentFile) { globalParameters.getWindowSwitcher()->switchFromRecordtableToRecord(); return; } // Перед открытием редактора происходит попытка получения текста записи // Этот вызов создаст файл с текстом записи, если он еще не создан (подумать, переделать) table->getText(pos); // Редактору задаются имя файла и директории // И дается команда загрузки файла edView->set_work_directory(fullDir); edView->set_file_name(currentFile); // Если идет работа с зашифрованной записью // И если имя директории или имя файла пусты, то это означает что // запись не была расшифрована, и редактор должен просто показывать пустой текст // ничего не сохранять и не считывать qDebug() << "RecordTableView::onClickToRecord() : id " << table->getField("id", pos); qDebug() << "RecordTableView::onClickToRecord() : name " << table->getField("name", pos); qDebug() << "RecordTableView::onClickToRecord() : crypt " << table->getField("crypt", pos); if(table->getField("crypt", pos)=="1") if(fullDir.length()==0 || currentFile.length()==0) edView->setDirFileEmptyReaction(MetaEditor::DIRFILEEMPTY_REACTION_SUPPRESS_ERROR); // В редактор заносится информация, идет ли работа с зашифрованным текстом edView->setMiscField("crypt", table->getField("crypt", pos)); // В редакторе устанавливается функция обратного вызова для чтения данных edView->set_load_callback(table->editorLoadCallback); edView->load_textarea(); // edView->set_textarea(table->get_text(index.row())); // Заполняются прочие инфо-поля edView->setName ( table->getField("name", pos) ); edView->setAuthor( table->getField("author", pos) ); edView->setUrl ( table->getField("url", pos) ); edView->setTags ( table->getField("tags", pos) ); QString id=table->getField("id", pos); edView->setMiscField("id", id); edView->setMiscField( "title", table->getField("name", pos) ); // Устанавливается путь до ветки в которой лежит запись (в виде названий веток) QString path=qobject_cast<RecordTableScreen *>(parent())->getTreePath(); // В мобильном интерфейсе редактор должен показывать путь до записи if(mytetraConfig.getInterfaceMode()=="mobile") edView->setTreePath( path ); // В редакторе восстанавливается позиция курсора и прокрутки если это необходимо if(mytetraConfig.getRememberCursorAtOrdinarySelection()) { edView->setCursorPosition( walkHistory.getCursorPosition(id) ); edView->setScrollBarPosition( walkHistory.getScrollBarPosition(id) ); } // Обновление иконки аттачей if( table->getRecord(pos)->getAttachTablePointer()->size()==0 ) edView->toAttach->setIcon( edView->iconAttachNotExists ); // Если нет приаттаченных файлов else edView->toAttach->setIcon( edView->iconAttachExists ); // Есть приаттаченные файлы }
// Установка значения поля // Метод принимает незашифрованные данные, и шфирует их если запись является зашифрованой void Attach::setField(QString name, QString value) { // Если имя поля недопустимо if(fieldAvailableList().contains(name)==false) criticalError("Attach::setField() : set unavailable field "+name); // ------------------------------------------ // Проверки и действия для разных типов полей // ------------------------------------------ // Поле с типом аттача if(name=="type") if( !typeAvailableList().contains(value) ) criticalError("Attach::setField() : Incorrect attach type : "+value); // Поле с именем файла if(name=="fileName") if(getField("type")=="link") // Если устанавливается имя файла для линка if(getField("fileName").length()>0 && value.length()>0) { // Если имя уже было задано (при создании аттача), и новое имя не пустое // Имя файла для линка менять нельзя showMessageBox(QObject::tr("Can't modify file name for link type attach.")); return; } // Поле со ссылкой на файл (содержит путь к файлу, на который указывает линк) if(name=="link") { QFile tempFile(value); // Если файла, на который ссылается линк, не существует if(!tempFile.exists()) { showMessageBox(QObject::tr("Bad link. File not found.")); return; } } // ----------------------- // Установка значения поля // ----------------------- bool isCrypt=false; // Если имя поля принадлежит списку полей, которые могут шифроваться // и в наборе полей есть поле crypt // и поле crypt установлено в 1 // и поле не пустое (пустые данные ненужно шифровать) if(fieldCryptedList().contains(name)) if(fields.contains("crypt")) if(fields["crypt"]=="1") if(value.length()>0) { if(globalParameters.getCryptKey().length()>0) isCrypt=true; else criticalError("In Attach::setField() can not set data to crypt field "+name+". Password not setted"); } // Если нужно шифровать, значение поля шифруется if(isCrypt==true) value=CryptService::encryptString(globalParameters.getCryptKey(), value); // Устанавливается значение поля fields.insert(name, value); }