INET Framework for OMNeT++/OMNEST
inet::ScenarioManager Class Reference

Scenario Manager (experimental) which executes a script specified in XML. More...

#include <ScenarioManager.h>

Inheritance diagram for inet::ScenarioManager:
inet::LifecycleController

Public Member Functions

 ScenarioManager ()
 
- Public Member Functions inherited from inet::LifecycleController
 LifecycleController ()
 
virtual ~LifecycleController ()
 
virtual bool initiateOperation (LifecycleOperation *operation, IDoneCallback *completionCallback=nullptr)
 Initiate an operation. More...
 

Protected Types

typedef std::pair< cGate *, cGate * > GatePair
 

Protected Member Functions

cModule * getRequiredModule (const char *path)
 
cModule * getRequiredModule (const cXMLElement *node, const char *attr)
 
cGate * findMandatorySingleGateTowards (cModule *srcModule, cModule *destModule)
 
GatePair getConnection (const cXMLElement *node)
 
void setChannelParam (cGate *srcGate, const char *name, const char *value)
 
void disconnect (cGate *srcGate)
 
void createConnection (const cXMLElementList &paramList, cChannelType *channelType, cGate *srcGate, cGate *destGate)
 
virtual void processCommand (const cXMLElement *node)
 
virtual void processAtCommand (const cXMLElement *node)
 
virtual void processSetParamCommand (const cXMLElement *node)
 
virtual void processSetChannelParamCommand (const cXMLElement *node)
 
virtual void processCreateModuleCommand (const cXMLElement *node)
 
virtual void processDeleteModuleCommand (const cXMLElement *node)
 
virtual void processConnectCommand (const cXMLElement *node)
 
virtual void processDisconnectCommand (const cXMLElement *node)
 
virtual void processModuleSpecificCommand (const cXMLElement *node)
 
virtual void processLifecycleCommand (const cXMLElement *node)
 
virtual void initialize () override
 
virtual void handleMessage (cMessage *msg) override
 
virtual void refreshDisplay () const override
 
- Protected Member Functions inherited from inet::LifecycleController
virtual bool resumeOperation (LifecycleOperation *operation)
 
virtual void doOneStage (LifecycleOperation *operation, cModule *submodule)
 
virtual void moduleOperationStageCompleted (Callback *callback)
 

Protected Attributes

int numChanges = 0
 
int numDone = 0
 
- Protected Attributes inherited from inet::LifecycleController
CallbackspareCallback = nullptr
 

Detailed Description

Scenario Manager (experimental) which executes a script specified in XML.

ScenarioManager has a few built-in commands such as <set-param>, <set-channel-param>, etc, and can pass commands to modules that implement the IScriptable interface. The <at> built-in command can be used to group commands to be carried out at the same simulation time.

See NED file for details.

See also
IScriptable

Member Typedef Documentation

◆ GatePair

typedef std::pair<cGate *, cGate *> inet::ScenarioManager::GatePair
protected

Constructor & Destructor Documentation

◆ ScenarioManager()

inet::ScenarioManager::ScenarioManager ( )
inline
74 {}

Member Function Documentation

◆ createConnection()

void inet::ScenarioManager::createConnection ( const cXMLElementList &  paramList,
cChannelType *  channelType,
cGate *  srcGate,
cGate *  destGate 
)
protected
346 {
347  if (!channelType)
348  srcGate->connectTo(destGate);
349  else {
350  cChannel *channel = channelType->create("channel");
351 
352  // set parameters:
353  for (auto child : paramList) {
354  const char *name = xmlutils::getMandatoryFilledAttribute(*child, ATTR_NAME);
355  const char *value = xmlutils::getMandatoryAttribute(*child, ATTR_VALUE);
356  channel->par(name).parse(value);
357  }
358 
359  // connect:
360  srcGate->connectTo(destGate, channel);
361  }
362 }

Referenced by processConnectCommand().

◆ disconnect()

void inet::ScenarioManager::disconnect ( cGate *  srcGate)
protected
411 {
412  srcGate->disconnect();
413 }

Referenced by processDisconnectCommand().

◆ findMandatorySingleGateTowards()

cGate * inet::ScenarioManager::findMandatorySingleGateTowards ( cModule *  srcModule,
cModule *  destModule 
)
protected
150 {
151  cGate *resultGate = nullptr;
152  for (cModule::GateIterator it(srcModule); !it.end(); ++it) {
153  cGate *gate = *it;
154  if (gate->getType() == cGate::OUTPUT && gate->getNextGate() != nullptr && gate->getNextGate()->getOwnerModule() == destModule) {
155  if (resultGate)
156  throw cRuntimeError("Ambiguous gate: there is more than one connection between the source and destination modules");
157  resultGate = gate;
158  }
159  }
160  if (!resultGate)
161  throw cRuntimeError("No such gate: there is no connection between the source and destination modules");
162  return resultGate;
163 }

Referenced by getConnection().

◆ getConnection()

ScenarioManager::GatePair inet::ScenarioManager::getConnection ( const cXMLElement *  node)
protected
166 {
167  // Connection can be identifier with the source module plus either the source gate or the
168  // destination module. The connection must be within a single level of the module hierarchy,
169  // i.e. the two modules must be siblings. With the latter option, there must be exactly
170  // one connection between the two modules. If the specified gate or connection identifies
171  // bidirectional connection (inout gates and '<-->' notation in NED), the source gates
172  // of both directions are returned.
173  //
174  if (node->getAttribute(ATTR_SRC_GATE)) {
175  cModule *srcModule = getRequiredModule(node, ATTR_SRC_MODULE);
176  const char *srcGateSpec = xmlutils::getMandatoryFilledAttribute(*node, ATTR_SRC_GATE);
177  std::string name;
178  int index;
179  parseIndexedName(srcGateSpec, name, index);
180  if (srcModule->gateType(name.c_str()) == cGate::OUTPUT) {
181  return GatePair(srcModule->gate(name.c_str(), index), nullptr); // throws if not found
182  }
183  else if (srcModule->gateType(name.c_str()) == cGate::INOUT) {
184  cGate *outputHalf = srcModule->gateHalf(name.c_str(), cGate::OUTPUT, index);
185  cGate *inputHalf = srcModule->gateHalf(name.c_str(), cGate::INPUT, index);
186  if (outputHalf->getNextGate() == nullptr || inputHalf->getPreviousGate() == nullptr)
187  throw cRuntimeError("The specified gate (or the input or output half of it) is not connected");
188  if (outputHalf->getNextGate()->getOwnerModule() != inputHalf->getPreviousGate()->getOwnerModule())
189  throw cRuntimeError("The specified gate (or the input or output half of it) is connected to a node on another level");
190  return GatePair(outputHalf, inputHalf->getPreviousGate());
191  }
192  else {
193  throw cRuntimeError("'src-gate' must be an inout or output gate");
194  }
195  }
196  else if (node->getAttribute(ATTR_DEST_MODULE)) {
197  cModule *srcModule = getRequiredModule(node, ATTR_SRC_MODULE);
198  cModule *destModule = getRequiredModule(node, ATTR_DEST_MODULE);
199  if (srcModule->getParentModule() != destModule->getParentModule())
200  throw cRuntimeError("Source and destination modules must be under the same parent");
201  cGate *srcGate = findMandatorySingleGateTowards(srcModule, destModule);
202  bool bidir = strlen(srcGate->getNameSuffix()) > 0; // TODO use =srcGate->isGateHalf();
203  if (!bidir) {
204  return GatePair(srcGate, nullptr);
205  }
206  else {
207  cGate *otherHalf = srcModule->gateHalf(srcGate->getBaseName(), cGate::INPUT, srcGate->isVector() ? srcGate->getIndex() : -1); // TODO use =srcGate->getOtherHalf();
208  cGate *otherSrcGate = otherHalf->getPreviousGate();
209  if (otherSrcGate == nullptr)
210  throw cRuntimeError("Broken bidirectional connection: the corresponding input gate is not connected");
211  if (otherSrcGate->getOwnerModule() != destModule)
212  throw cRuntimeError("Broken bidirectional connection: the input and output gates are connected to two different modules");
213  return GatePair(srcGate, otherSrcGate);
214  }
215  }
216  else {
217  throw cRuntimeError("Missing attribute: Either 'src-gate' or 'dest-module' must be present");
218  }
219 }

Referenced by processDisconnectCommand(), and processSetChannelParamCommand().

◆ getRequiredModule() [1/2]

cModule * inet::ScenarioManager::getRequiredModule ( const char *  path)
protected
137 {
138  cModule *mod = getModuleByPath(path);
139  if (!mod)
140  throw cRuntimeError("Module '%s' not found", path);
141  return mod;
142 }

Referenced by getConnection(), getRequiredModule(), processConnectCommand(), processModuleSpecificCommand(), and processSetParamCommand().

◆ getRequiredModule() [2/2]

cModule * inet::ScenarioManager::getRequiredModule ( const cXMLElement *  node,
const char *  attr 
)
protected
145 {
147 }

◆ handleMessage()

void inet::ScenarioManager::handleMessage ( cMessage *  msg)
overrideprotectedvirtual
80 {
81  auto node = check_and_cast<ScenarioTimer *>(msg)->getXmlNode();
82  delete msg;
83 
84  processCommand(node);
85 
86  numDone++;
87 }

◆ initialize()

void inet::ScenarioManager::initialize ( )
overrideprotectedvirtual
55 {
56  cXMLElement *script = par("script");
57 
58  numChanges = numDone = 0;
59  WATCH(numChanges);
60  WATCH(numDone);
61 
62  for (cXMLElement *node = script->getFirstChild(); node; node = node->getNextSibling()) {
63  // check attr t is present
64  const char *tAttr = node->getAttribute(ATTR_T);
65  if (!tAttr)
66  throw cRuntimeError("Attribute 't' missing at %s", node->getSourceLocation());
67 
68  // schedule self-message
69  simtime_t t = SimTime::parse(tAttr);
70  auto msg = new ScenarioTimer("scenario-event");
71  msg->setXmlNode(node);
72  scheduleAt(t, msg);
73 
74  // count it
75  numChanges++;
76  }
77 }

◆ processAtCommand()

void inet::ScenarioManager::processAtCommand ( const cXMLElement *  node)
protectedvirtual
222 {
223  for (const cXMLElement *child = node->getFirstChild(); child; child = child->getNextSibling())
224  processCommand(child);
225 }

Referenced by processCommand().

◆ processCommand()

void inet::ScenarioManager::processCommand ( const cXMLElement *  node)
protectedvirtual
90 {
91  try {
92  std::string tag = node->getTagName();
93  EV << "processing <" << tag << "> command...\n";
94 
95  if (tag == CMD_AT)
96  processAtCommand(node);
97  else if (tag == CMD_SET_PARAM)
99  else if (tag == CMD_SET_CHANNEL_PARAM)
101  else if (tag == CMD_CREATE_MODULE)
103  else if (tag == CMD_DELETE_MODULE)
105  else if (tag == CMD_CONNECT)
106  processConnectCommand(node);
107  else if (tag == CMD_DISCONNECT)
109  else if (tag == CMD_INITIATE || tag == OP_START || tag == OP_STARTUP || tag == OP_STOP
110  || tag == OP_SHUTDOWN || tag == OP_CRASH || tag == OP_SUSPEND || tag == OP_RESUME)
112  else
114  }
115  catch (std::exception& e) {
116  throw cRuntimeError("%s, in command <%s> at %s", e.what(), node->getTagName(), node->getSourceLocation());
117  }
118 }

Referenced by handleMessage(), and processAtCommand().

◆ processConnectCommand()

void inet::ScenarioManager::processConnectCommand ( const cXMLElement *  node)
protectedvirtual
365 {
366  cGate *srcGate;
367  cModule *srcMod = getRequiredModule(node, ATTR_SRC_MODULE);
368  const char *srcGateStr = xmlutils::getMandatoryFilledAttribute(*node, ATTR_SRC_GATE);
369  std::string srcGateName;
370  int srcGateIndex;
371  parseIndexedName(srcGateStr, srcGateName, srcGateIndex);
372  bool isSrcGateInOut = (srcMod->gateType(srcGateName.c_str()) == cGate::INOUT);
373 
374  cGate *destGate;
375  cModule *destMod = getRequiredModule(node, ATTR_DEST_MODULE);
376  const char *destGateStr = xmlutils::getMandatoryFilledAttribute(*node, ATTR_DEST_GATE);
377  std::string destGateName;
378  int destGateIndex;
379  parseIndexedName(destGateStr, destGateName, destGateIndex);
380  bool isDestGateInOut = (destMod->gateType(destGateName.c_str()) == cGate::INOUT);
381 
382  if (srcMod->getParentModule() != destMod->getParentModule())
383  throw cRuntimeError("'src-module' and 'dest-module' must have the same parent module");
384 
385  // process <connect-channel> command
386  const char *channelTypeName = node->getAttribute(ATTR_CHANNEL_TYPE);
387  cChannelType *channelType = channelTypeName ? cChannelType::get(channelTypeName) : nullptr;
388  cXMLElementList paramList;
389 
390  if (channelTypeName)
391  paramList = node->getChildrenByTagName(TAG_PARAM);
392 
393  srcGate = isSrcGateInOut ?
394  srcMod->gateHalf(srcGateName.c_str(), cGate::OUTPUT, srcGateIndex) :
395  srcMod->gate(srcGateName.c_str(), srcGateIndex);
396  destGate = isDestGateInOut ?
397  destMod->gateHalf(destGateName.c_str(), cGate::INPUT, destGateIndex) :
398  destMod->gate(destGateName.c_str(), destGateIndex);
399 
400  createConnection(paramList, channelType, srcGate, destGate);
401 
402  if (isSrcGateInOut && isDestGateInOut) {
403  destGate = srcMod->gateHalf(srcGateName.c_str(), cGate::INPUT, srcGateIndex);
404  srcGate = destMod->gateHalf(destGateName.c_str(), cGate::OUTPUT, destGateIndex);
405 
406  createConnection(paramList, channelType, srcGate, destGate);
407  }
408 }

Referenced by processCommand().

◆ processCreateModuleCommand()

void inet::ScenarioManager::processCreateModuleCommand ( const cXMLElement *  node)
protectedvirtual
292 {
293  const char *moduleTypeName = xmlutils::getMandatoryFilledAttribute(*node, ATTR_TYPE);
294  const char *submoduleName = xmlutils::getMandatoryFilledAttribute(*node, ATTR_SUBMODULE);
295  const char *parentModulePath = xmlutils::getMandatoryFilledAttribute(*node, ATTR_PARENT);
296  cModuleType *moduleType = cModuleType::get(moduleTypeName);
297  cModule *parentModule = getSimulation()->getSystemModule()->getModuleByPath(parentModulePath);
298  if (parentModule == nullptr)
299  throw cRuntimeError("Parent module '%s' is not found", parentModulePath);
300 
301  // TODO solution for inconsistent out-of-date vectorSize values in OMNeT++
302  int submoduleVectorSize = 0;
303  for (SubmoduleIterator it(parentModule); !it.end(); ++it) {
304  cModule *submodule = *it;
305  if (submodule->isVector() && submodule->isName(submoduleName)) {
306  if (submoduleVectorSize < submodule->getVectorSize())
307  submoduleVectorSize = submodule->getVectorSize();
308  }
309  }
310 
311  bool vector = xmlutils::getAttributeBoolValue(node, ATTR_VECTOR, submoduleVectorSize > 0);
312  cModule *module = nullptr;
313  if (vector) {
314  if (!parentModule->hasSubmoduleVector(submoduleName)) {
315  parentModule->addSubmoduleVector(submoduleName, submoduleVectorSize + 1);
316  }
317  else
318  parentModule->setSubmoduleVectorSize(submoduleName, submoduleVectorSize + 1);
319  module = moduleType->create(submoduleName, parentModule, submoduleVectorSize);
320  }
321  else {
322  module = moduleType->create(submoduleName, parentModule);
323  }
324  module->finalizeParameters();
325  module->buildInside();
326  cPreModuleInitNotification pre;
327  pre.module = module;
328  emit(POST_MODEL_CHANGE, &pre);
329  module->callInitialize();
330  cPostModuleInitNotification post;
331  post.module = module;
332  emit(POST_MODEL_CHANGE, &post);
333 }

Referenced by processCommand().

◆ processDeleteModuleCommand()

void inet::ScenarioManager::processDeleteModuleCommand ( const cXMLElement *  node)
protectedvirtual
336 {
337  const char *modulePath = xmlutils::getMandatoryFilledAttribute(*node, ATTR_MODULE);
338  cModule *module = getSimulation()->getSystemModule()->getModuleByPath(modulePath);
339  if (module == nullptr)
340  throw cRuntimeError("Module '%s' not found", modulePath);
341  module->callFinish();
342  module->deleteModule();
343 }

Referenced by processCommand().

◆ processDisconnectCommand()

void inet::ScenarioManager::processDisconnectCommand ( const cXMLElement *  node)
protectedvirtual
416 {
417  // process <disconnect> command
418  GatePair pair = getConnection(node);
419 
420  EV << "Disconnecting " << pair.first->getFullPath() << " --> " << pair.first->getNextGate()->getFullPath()
421  << (pair.second ? " and its reverse connection" : "") << "\n";
422 
423  disconnect(pair.first);
424  if (pair.second)
425  disconnect(pair.second);
426 }

Referenced by processCommand().

◆ processLifecycleCommand()

void inet::ScenarioManager::processLifecycleCommand ( const cXMLElement *  node)
protectedvirtual
429 {
430  // resolve target module
431  const char *target = node->getAttribute(ATTR_MODULE);
432  cModule *module = getModuleByPath(target);
433  if (!module)
434  throw cRuntimeError("Module '%s' not found", target);
435 
436  // resolve operation
437  std::string tag = node->getTagName();
438  std::string operationName = (tag == CMD_INITIATE) ? node->getAttribute(ATTR_OPERATION) : tag;
439  LifecycleOperation *operation;
440  if (operationName == OP_START || operationName == OP_STARTUP)
441  operation = new ModuleStartOperation;
442  else if (operationName == OP_STOP || operationName == OP_SHUTDOWN)
443  operation = new ModuleStopOperation;
444  else if (operationName == OP_CRASH)
445  operation = new ModuleCrashOperation;
446  else
447  operation = check_and_cast<LifecycleOperation *>(inet::utils::createOne(operationName.c_str()));
448 
449  auto paramsCopy = node->getAttributes();
450  paramsCopy.erase(ATTR_MODULE);
451  paramsCopy.erase(ATTR_T);
452  paramsCopy.erase(ATTR_OPERATION);
453  operation->initialize(module, paramsCopy);
454  if (!paramsCopy.empty())
455  throw cRuntimeError("Unknown parameter '%s' for operation %s", paramsCopy.begin()->first.c_str(), operationName.c_str());
456 
457  // do the operation
458  initiateOperation(operation);
459 }

Referenced by processCommand().

◆ processModuleSpecificCommand()

void inet::ScenarioManager::processModuleSpecificCommand ( const cXMLElement *  node)
protectedvirtual
228 {
229  // find which module we'll need to invoke
230  cModule *mod = getRequiredModule(node, ATTR_MODULE);
231 
232  // see if it supports the IScriptable interface
233  IScriptable *scriptable = dynamic_cast<IScriptable *>(mod);
234  if (!scriptable)
235  throw cRuntimeError("<%s> not understood: it is not a built-in command of %s, and module class %s "
236  "is not scriptable (does not subclass from IScriptable)",
237  node->getTagName(), getClassName(), mod->getClassName());
238 
239  // ok, trust it to process this command
240  scriptable->processCommand(*node);
241 }

Referenced by processCommand().

◆ processSetChannelParamCommand()

void inet::ScenarioManager::processSetChannelParamCommand ( const cXMLElement *  node)
protectedvirtual
275 {
276  // process <set-channel-param> command
277  GatePair pair = getConnection(node);
278  const char *parAttr = xmlutils::getMandatoryFilledAttribute(*node, ATTR_PAR);
279  const char *valueAttr = xmlutils::getMandatoryAttribute(*node, ATTR_VALUE);
280 
281  EV << "Setting channel parameter: " << parAttr << " = " << valueAttr
282  << " on connection " << pair.first->getFullPath() << " --> " << pair.first->getNextGate()->getFullPath()
283  << (pair.second ? " and its reverse connection" : "") << "\n";
284  bubble((std::string("setting channel parameter: ") + parAttr + " = " + valueAttr).c_str());
285 
286  setChannelParam(pair.first, parAttr, valueAttr);
287  if (pair.second)
288  setChannelParam(pair.second, parAttr, valueAttr);
289 }

Referenced by processCommand().

◆ processSetParamCommand()

void inet::ScenarioManager::processSetParamCommand ( const cXMLElement *  node)
protectedvirtual
244 {
245  // process <set-param> command
246  cModule *mod = getRequiredModule(node, ATTR_MODULE);
247  const char *parAttr = xmlutils::getMandatoryFilledAttribute(*node, ATTR_PAR);
248  const char *valueAttr = xmlutils::getMandatoryAttribute(*node, ATTR_VALUE);
249 
250  EV << "Setting " << mod->getFullPath() << "." << parAttr << " = " << valueAttr << "\n";
251  bubble((std::string("setting: ") + mod->getFullPath() + "." + parAttr + " = " + valueAttr).c_str());
252 
253  // set the parameter to the given value
254  cPar& param = mod->par(parAttr);
255  param.parse(valueAttr);
256 }

Referenced by processCommand().

◆ refreshDisplay()

void inet::ScenarioManager::refreshDisplay ( ) const
overrideprotectedvirtual
462 {
463  char buf[80];
464  sprintf(buf, "total %d changes, %d left", numChanges, numChanges - numDone);
465  getDisplayString().setTagArg(ATTR_T, 0, buf);
466 }

◆ setChannelParam()

void inet::ScenarioManager::setChannelParam ( cGate *  srcGate,
const char *  name,
const char *  value 
)
protected
259 {
260  // make sure gate is connected at all
261  if (!srcGate->getNextGate())
262  throw cRuntimeError("Gate '%s' is not connected", srcGate->getFullPath().c_str());
263 
264  // get channel object
265  cChannel *chan = srcGate->getChannel();
266  if (!chan)
267  throw cRuntimeError("Connection starting at gate '%s' has no channel object", srcGate->getFullPath().c_str());
268 
269  // set the parameter to the given value
270  cPar& param = chan->par(name);
271  param.parse(value);
272 }

Referenced by processSetChannelParamCommand().

Member Data Documentation

◆ numChanges

int inet::ScenarioManager::numChanges = 0
protected

Referenced by initialize(), and refreshDisplay().

◆ numDone

int inet::ScenarioManager::numDone = 0
protected

The documentation for this class was generated from the following files:
inet::math::mod
double mod(double dividend, double divisor)
Returns the rest of a whole-numbered division.
Definition: INETMath.h:96
inet::ScenarioManager::createConnection
void createConnection(const cXMLElementList &paramList, cChannelType *channelType, cGate *srcGate, cGate *destGate)
Definition: ScenarioManager.cc:345
inet::ScenarioManager::processModuleSpecificCommand
virtual void processModuleSpecificCommand(const cXMLElement *node)
Definition: ScenarioManager.cc:227
inet::units::constants::e
const value< double, units::C > e(1.602176487e-19)
inet::ScenarioManager::GatePair
std::pair< cGate *, cGate * > GatePair
Definition: ScenarioManager.h:50
inet::ScenarioManager::processLifecycleCommand
virtual void processLifecycleCommand(const cXMLElement *node)
Definition: ScenarioManager.cc:428
inet::xmlutils::getMandatoryAttribute
const char * getMandatoryAttribute(const cXMLElement &node, const char *attr)
Definition: XMLUtils.cc:151
inet::utils::createOne
cObject * createOne(const char *className, const char *defaultNamespace)
Like cObjectFactory::createOne(), except it starts searching for the class in the given namespace.
Definition: INETUtils.cc:147
inet::ScenarioManager::processCreateModuleCommand
virtual void processCreateModuleCommand(const cXMLElement *node)
Definition: ScenarioManager.cc:291
inet::ScenarioManager::processSetParamCommand
virtual void processSetParamCommand(const cXMLElement *node)
Definition: ScenarioManager.cc:243
inet::ScenarioManager::getRequiredModule
cModule * getRequiredModule(const char *path)
Definition: ScenarioManager.cc:136
inet::xmlutils::getAttributeBoolValue
bool getAttributeBoolValue(const cXMLElement *node, const char *attrName, bool defVal)
Definition: XMLUtils.cc:169
inet::ScenarioManager::processDisconnectCommand
virtual void processDisconnectCommand(const cXMLElement *node)
Definition: ScenarioManager.cc:415
inet::ScenarioManager::setChannelParam
void setChannelParam(cGate *srcGate, const char *name, const char *value)
Definition: ScenarioManager.cc:258
inet::ScenarioManager::processSetChannelParamCommand
virtual void processSetChannelParamCommand(const cXMLElement *node)
Definition: ScenarioManager.cc:274
inet::ScenarioManager::disconnect
void disconnect(cGate *srcGate)
Definition: ScenarioManager.cc:410
inet::ScenarioManager::getConnection
GatePair getConnection(const cXMLElement *node)
Definition: ScenarioManager.cc:165
inet::LifecycleController::initiateOperation
virtual bool initiateOperation(LifecycleOperation *operation, IDoneCallback *completionCallback=nullptr)
Initiate an operation.
Definition: LifecycleController.cc:46
inet::ScenarioManager::processDeleteModuleCommand
virtual void processDeleteModuleCommand(const cXMLElement *node)
Definition: ScenarioManager.cc:335
inet::ScenarioManager::numDone
int numDone
Definition: ScenarioManager.h:46
inet::ScenarioManager::findMandatorySingleGateTowards
cGate * findMandatorySingleGateTowards(cModule *srcModule, cModule *destModule)
Definition: ScenarioManager.cc:149
inet::ScenarioManager::processConnectCommand
virtual void processConnectCommand(const cXMLElement *node)
Definition: ScenarioManager.cc:364
inet::ScenarioManager::processCommand
virtual void processCommand(const cXMLElement *node)
Definition: ScenarioManager.cc:89
inet::ScenarioManager::numChanges
int numChanges
Definition: ScenarioManager.h:45
inet::ScenarioManager::processAtCommand
virtual void processAtCommand(const cXMLElement *node)
Definition: ScenarioManager.cc:221
inet::xmlutils::getMandatoryFilledAttribute
const char * getMandatoryFilledAttribute(const cXMLElement &node, const char *attr)
Definition: XMLUtils.cc:160