ctkCmdLineModuleInstance.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. /*=============================================================================
  2. Library: CTK
  3. Copyright (c) German Cancer Research Center,
  4. Division of Medical and Biological Informatics
  5. Licensed under the Apache License, Version 2.0 (the "License");
  6. you may not use this file except in compliance with the License.
  7. You may obtain a copy of the License at
  8. http://www.apache.org/licenses/LICENSE-2.0
  9. Unless required by applicable law or agreed to in writing, software
  10. distributed under the License is distributed on an "AS IS" BASIS,
  11. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. See the License for the specific language governing permissions and
  13. limitations under the License.
  14. =============================================================================*/
  15. #include "ctkCmdLineModuleInstance.h"
  16. #include "ctkCmdLineModuleReference.h"
  17. #include "ctkCmdLineModuleObjectHierarchyReader.h"
  18. #include "ctkCmdLineModuleObjectHierarchyReader.h"
  19. #include "ctkCmdLineModuleProcessRunner_p.h"
  20. #include "ctkException.h"
  21. #include <QStringList>
  22. #include <QDebug>
  23. namespace {
  24. QString normalizeFlag(const QString& flag)
  25. {
  26. return flag.trimmed().remove(QRegExp("^-*"));
  27. }
  28. }
  29. struct ctkCmdLineModuleInstancePrivate
  30. {
  31. ctkCmdLineModuleInstancePrivate(ctkCmdLineModuleInstance* qq,
  32. const ctkCmdLineModuleReference& moduleRef)
  33. : ModuleReference(moduleRef), q(qq)
  34. {
  35. }
  36. QStringList createCommandLineArgs()
  37. {
  38. ctkCmdLineModuleObjectHierarchyReader reader(q->parameterValueModel());
  39. QStringList cmdLineArgs;
  40. QHash<int, QString> indexedArgs;
  41. while(reader.readNextParameter())
  42. {
  43. if (reader.index() > -1)
  44. {
  45. indexedArgs.insert(reader.index(), reader.value().toString());
  46. }
  47. else
  48. {
  49. QString argFlag;
  50. if (reader.longFlag().isEmpty())
  51. {
  52. argFlag = QString("-") + normalizeFlag(reader.flag());
  53. }
  54. else
  55. {
  56. argFlag = QString("--") + normalizeFlag(reader.longFlag());
  57. }
  58. QStringList args;
  59. if (reader.isMultiple())
  60. {
  61. args = reader.value().toString().split(',', QString::SkipEmptyParts);
  62. }
  63. else
  64. {
  65. args.push_back(reader.value().toString());
  66. }
  67. foreach(QString arg, args)
  68. {
  69. cmdLineArgs << argFlag << arg;
  70. }
  71. }
  72. }
  73. QList<int> indexes = indexedArgs.keys();
  74. qSort(indexes.begin(), indexes.end());
  75. foreach(int index, indexes)
  76. {
  77. cmdLineArgs << indexedArgs[index];
  78. }
  79. return cmdLineArgs;
  80. }
  81. ctkCmdLineModuleReference ModuleReference;
  82. private:
  83. ctkCmdLineModuleInstance* q;
  84. };
  85. ctkCmdLineModuleInstance::ctkCmdLineModuleInstance(const ctkCmdLineModuleReference& moduleRef)
  86. : d(new ctkCmdLineModuleInstancePrivate(this, moduleRef))
  87. {
  88. }
  89. ctkCmdLineModuleInstance::~ctkCmdLineModuleInstance()
  90. {
  91. }
  92. QObject *ctkCmdLineModuleInstance::parameterValueModel() const
  93. {
  94. return guiHandle();
  95. }
  96. QVariant ctkCmdLineModuleInstance::value(const QString &parameter) const
  97. {
  98. throw ctkException("not implemented yet");
  99. }
  100. void ctkCmdLineModuleInstance::setValue(const QString &parameter, const QVariant &value)
  101. {
  102. ctkCmdLineModuleObjectHierarchyReader reader(parameterValueModel());
  103. while(reader.readNextParameter())
  104. {
  105. if(reader.name() == parameter && reader.value() != value)
  106. {
  107. reader.setValue(value);
  108. emit valueChanged(parameter, value);
  109. }
  110. }
  111. }
  112. ctkCmdLineModuleReference ctkCmdLineModuleInstance::moduleReference() const
  113. {
  114. return d->ModuleReference;
  115. }
  116. ctkCmdLineModuleProcessFuture ctkCmdLineModuleInstance::run() const
  117. {
  118. // TODO: manage memory
  119. QStringList args = d->createCommandLineArgs();
  120. qDebug() << args;
  121. ctkCmdLineModuleProcessRunner* moduleProcess =
  122. new ctkCmdLineModuleProcessRunner(d->ModuleReference.location(), args);
  123. return moduleProcess->start();
  124. }