//---------------------------------------------------------------------------------------------
// 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;
}
Exemple #3
0
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;
}