// virtual CXMLHandler * ParameterHandler::processStart(const XML_Char * pszName, const XML_Char ** papszAttrs) { CXMLHandler * pHandlerToCall = NULL; const char * cValue = NULL; const char * cType = NULL; std::string name; std::string sValue(""); bool UnmappedKey = false; void * pValue = NULL; CCopasiParameter::Type type; C_FLOAT64 d; C_INT32 i; size_t ui; bool b; switch (mCurrentElement.first) { case Parameter: // Parameter has attributes name, type and value name = mpParser->getAttributeValue("name", papszAttrs); cType = mpParser->getAttributeValue("type", papszAttrs); type = toEnum(cType, CCopasiParameter::XMLType, CCopasiParameter::INVALID); cValue = mpParser->getAttributeValue("value", papszAttrs); if (cValue != NULL) { sValue = cValue; } switch (type) { case CCopasiParameter::DOUBLE: d = CCopasiXMLInterface::DBL(sValue.c_str()); pValue = &d; break; case CCopasiParameter::UDOUBLE: d = CCopasiXMLInterface::DBL(sValue.c_str()); pValue = &d; break; case CCopasiParameter::INT: i = strToInt(sValue.c_str()); pValue = &i; break; case CCopasiParameter::UINT: ui = strToUnsignedInt(sValue.c_str()); pValue = &ui; break; case CCopasiParameter::BOOL: if (sValue == "0" || sValue == "false") { b = false; } else { b = true; } pValue = &b; break; case CCopasiParameter::STRING: case CCopasiParameter::FILE: case CCopasiParameter::CN: pValue = &sValue; break; case CCopasiParameter::KEY: { if (sValue != "" && CKeyFactory::isValidKey(sValue)) { CCopasiObject * pObject = mpData->mKeyMap.get(sValue); if (pObject) { sValue = pObject->getKey(); } else { UnmappedKey = true; } } pValue = &sValue; } break; default: CCopasiMessage(CCopasiMessage::ERROR, MCXML + 16, name.c_str(), cType, mpParser->getCurrentLineNumber()); pValue = NULL; break; } mpData->pCurrentParameter = new CCopasiParameter(name, type, pValue); if (UnmappedKey) { mpData->UnmappedKeyParameters.push_back(mpData->pCurrentParameter->getKey()); } break; default: CCopasiMessage(CCopasiMessage::EXCEPTION, MCXML + 2, mpParser->getCurrentLineNumber(), mpParser->getCurrentColumnNumber(), pszName); break; } return pHandlerToCall; }
// virtual CXMLHandler * ReportDefinitionHandler::processStart(const XML_Char * pszName, const XML_Char ** papszAttrs) { CXMLHandler * pHandlerToCall = NULL; const char * Key; const char * Name; const char * Separator; const char * Precision; CTaskEnum::Task type; switch (mCurrentElement.first) { case ReportDefinition: Key = mpParser->getAttributeValue("key", papszAttrs); Name = mpParser->getAttributeValue("name", papszAttrs); type = CTaskEnum::TaskXML.toEnum(mpParser->getAttributeValue("taskType", papszAttrs), CTaskEnum::Task::UnsetTask); Separator = mpParser->getAttributeValue("separator", papszAttrs, "\t"); Precision = mpParser->getAttributeValue("precision", papszAttrs, "6"); // create a new report mpData->pReport = new CReportDefinition(); mpData->pReport->setTaskType(type); mpData->pReport->setSeparator(Separator); mpData->pReport->setPrecision(strToUnsignedInt(Precision)); { // We need to make sure that the name is unique. std::string ValidName(Name); size_t Index = 1; while (mpData->pReportList->getIndex(ValidName) != C_INVALID_INDEX) { std::ostringstream ValidNameStream; ValidNameStream << Name << " " << Index++; ValidName = ValidNameStream.str(); } mpData->pReport->setObjectName(ValidName); } /* We have a new report and add it to the list */ mpData->pReportList->add(mpData->pReport, true); addFix(Key, mpData->pReport); break; case Comment: pHandlerToCall = getHandler(mCurrentElement.second); break; case Header: case Body: case Footer: mpData->pReport->setIsTable(false); pHandlerToCall = getHandler(mCurrentElement.second); break; case Table: mpData->pReport->setIsTable(true); pHandlerToCall = getHandler(mCurrentElement.second); break; default: CCopasiMessage(CCopasiMessage::EXCEPTION, MCXML + 2, mpParser->getCurrentLineNumber(), mpParser->getCurrentColumnNumber(), pszName); break; } return pHandlerToCall; }