//--------------------------------------------------------------------------------------------- // constructor //--------------------------------------------------------------------------------------------- TLibParser::TLibParser() { #ifdef internaldebug printf("Calling TLibParser Contructor\r\n"); #endif ResetParser(); ConfigDefaultParser(); }
UMaterial* T3DMaterialParser::ImportMaterialT3DFile(const FString &FileName) { FString MaterialT3D; if (FFileHelper::LoadFileToString(MaterialT3D, *FileName)) { ResetParser(MaterialT3D); MaterialT3D.Empty(); return ImportMaterial(); } return NULL; }
bool FGPropulsion::Load(Element* el) { string type, engine_filename; bool ThrottleAdded = false; Debug(2); FGModel::Load(el); // Perform base class Load. // Process tank definitions first to establish the number of fuel tanks Element* tank_element = el->FindElement("tank"); while (tank_element) { Tanks.push_back(new FGTank(FDMExec, tank_element, numTanks)); if (Tanks.back()->GetType() == FGTank::ttFUEL) numFuelTanks++; else if (Tanks.back()->GetType() == FGTank::ttOXIDIZER) numOxiTanks++; else {cerr << "Unknown tank type specified." << endl; return false;} numTanks++; tank_element = el->FindNextElement("tank"); } numSelectedFuelTanks = numFuelTanks; numSelectedOxiTanks = numOxiTanks; Element* engine_element = el->FindElement("engine"); while (engine_element) { engine_filename = engine_element->GetAttributeValue("file"); if (engine_filename.empty()) { cerr << "Engine definition did not supply an engine file." << endl; return false; } engine_filename = FindEngineFullPathname(engine_filename); document = LoadXMLDocument(engine_filename); document->SetParent(engine_element); type = document->GetName(); if (type == "piston_engine") { HavePistonEngine = true; if (!IsBound) bind(); Engines.push_back(new FGPiston(FDMExec, document, numEngines)); } else if (type == "turbine_engine") { HaveTurbineEngine = true; if (!IsBound) bind(); Engines.push_back(new FGTurbine(FDMExec, document, numEngines)); } else if (type == "turboprop_engine") { HaveTurboPropEngine = true; if (!IsBound) bind(); Engines.push_back(new FGTurboProp(FDMExec, document, numEngines)); } else if (type == "rocket_engine") { HaveRocketEngine = true; if (!IsBound) bind(); Engines.push_back(new FGRocket(FDMExec, document, numEngines)); } else if (type == "electric_engine") { HaveElectricEngine = true; if (!IsBound) bind(); Engines.push_back(new FGElectric(FDMExec, document, numEngines)); } else { cerr << "Unknown engine type: " << type << endl; exit(-5); } FCS->AddThrottle(); ThrottleAdded = true; numEngines++; engine_element = el->FindNextElement("engine"); ResetParser(); } CalculateTankInertias(); if (!ThrottleAdded) FCS->AddThrottle(); // need to have at least one throttle // Process fuel dump rate if (el->FindElement("dump-rate")) DumpRate = el->FindElementValueAsNumberConvertTo("dump-rate", "LBS/MIN"); PostLoad(el, PropertyManager); return true; }
CFSTChunkParser::~CFSTChunkParser() { // Free any resources allocated by the parser ResetParser(); }
//--------------------------------------------------------------------------------------------- // Send Data to Parser internal Buffer int TLibParser::SendToParser(char *pdata) { // Initial state, no Start/End Cmd found yet if(StartFlag == false && EndFlag == false) { // verify if the previous received parserbuffer+string(*pdata) if part or equals to StartCmd if((parserbuffer+*pdata).compare(0,parserbuffer.length()+1,StartCmd,0,parserbuffer.length()+1) == 0) { parserbuffer += *pdata; #ifdef internaldebug if(StartFlag == true) printf("-> TLibParser::SendToParser: Found complete StartCmd [%s]\r\n",parserbuffer.c_str()); else printf("-> TLibParser::SendToParser: Found partial StartCmd [%s]\r\n",parserbuffer.c_str()); #endif if(parserbuffer == StartCmd) { StartFlag = true; parserbuffer.clear(); } if(StartFlag == true) return PARSER_STARTCHAR; else return PARSER_ERROR_NOSTARTCHAR; } else { StartFlag = false; parserbuffer.clear(); #ifdef internaldebug printf("[-]%c\r\n",*pdata); #endif return PARSER_ERROR_NOSTARTCHAR; } } else if(StartFlag == true && EndFlag == false) { // verify if the previous received parserbuffer+string(*pdata) if part or equals to StartCmd if((parserbuffer+*pdata).compare(0,parserbuffer.length()+1,EndCmd,0,parserbuffer.length()+1) == 0) { parserbuffer += *pdata; #ifdef internaldebug if(EndFlag == true) printf("-> TLibParser::SendToParser: Found complete EndCmd [%s]\r\n",parserbuffer.c_str()); else printf("-> TLibParser::SendToParser: Found partial EndCmd [%s]\r\n",parserbuffer.c_str()); #endif if(parserbuffer == EndCmd) { EndFlag = true; parserbuffer.clear(); } if(EndFlag == true) return PARSER_ENDCHAR; else return PARSER_ERROR_IGNOREENDCHAR; // need to change this!!! not an error, adding data to buffer } else { // copies *pdata to internal Buffer Buffer += parserbuffer; Buffer += *pdata; EndFlag = false; parserbuffer.clear(); #ifdef internaldebug printf("[--]%c\r\n",*pdata); #endif // verify if it's an history data message, if so trash all data // will not require this info, database already contains enough data string hist("<hist>"); if(Buffer.find(hist)!=string::npos) { // found <hist> - trash data - reset printf("Found <hist> tag: %s\r\n", Buffer.c_str()); ResetParser(); return PARSER_ERROR_IGNOREDATA; } return PARSER_ERROR_IGNOREENDCHAR; } } // Found Start and End Cmd if(StartFlag == true && EndFlag == true) { #ifdef minimal_internaldebug printf("Found Cmd: [%s]\r\n", Buffer.c_str()); #endif #ifdef internaldebug printf("Found Cmd: [%s]", Buffer.c_str()); #endif // ResetParser() called after data is fetched //StartFlag = false; //EndFlag = false; //parserbuffer.clear(); //Buffer.clear(); return PARSEREVAL_COMPLETED; } return PARSER_BUFFERDATA; }