Esempio n. 1
0
// Расшифровка аттача на диске и в памяти
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"
}
Esempio n. 2
0
void AppConfigPage_Misc::onClickedEditMyTetraConfigFile(void)
{
  // Сбрасываются в файл конфига все возможные изменения, которые, возможно еще не были записаны
  mytetraConfig.sync();

  editConfigFile( globalParameters.getWorkDirectory()+"/conf.ini", 0.8 );
}
Esempio n. 3
0
// Получение значения поля
// Метод возвращает расшифрованные данные, если запись была зашифрована
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]); // Поле расшифровывается
}
Esempio n. 4
0
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);
}
Esempio n. 6
0
// Шифрация аттача на диске и в памяти
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");
}
Esempio n. 7
0
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;
}
Esempio n. 8
0
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();
}
Esempio n. 9
0
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;
}
Esempio n. 10
0
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;
}
Esempio n. 11
0
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;
}
Esempio n. 12
0
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;
}
Esempio n. 13
0
// Возвращение к дереву разделов в мобильном интерфейсе
void RecordTableScreen::onBackClick(void)
{
  globalParameters.getWindowSwitcher()->switchFromRecordtableToTree();
}
Esempio n. 14
0
 int HOGPlanner::readFromConfigFile(std::string& file)
 {
     globalParameters.configModels.clear();
     return globalParameters.loadFromFile(file);
 }
Esempio n. 15
0
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;
        }

    } // Закрылось условие что системный пароль не установлен
Esempio n. 17
0
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 ); // Есть приаттаченные файлы
}
Esempio n. 20
0
// Установка значения поля
// Метод принимает незашифрованные данные, и шфирует их если запись является зашифрованой
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);
}