Beispiel #1
0
/**\brief Load image from file
 */
bool Image::Load( const string& filename ) {
	File file = File();

	if( filename == "" ) {
		return false; // No File to load.
	}

	if( !file.OpenRead(filename ) ) {
		return false; // File could not be opened or found.
	}

	char* buffer = file.Read();
	int bytesread = file.GetLength();

	if ( buffer == NULL ) {
		return false; // File could not be Read.
	}

	int retval = Load( buffer, bytesread );
	delete [] buffer;
	if ( retval ){
        filepath=filename;
		return true;
	}
	return false; // Image could not be loaded. (It might not be an Image)
}
Beispiel #2
0
bool Copy(File& srcFile, const char* destFilename)
{
	// Operate in 16k buffers.
	const DWORD BUFFER_SIZE = 16 * 1024;

	DWORD fileSize = (DWORD)srcFile.GetLength();

	// See if the destination file exists.
	DiskFile destFile;
	if (!destFile.Open(destFilename, File::MODE_CREATE | File::MODE_WRITEONLY))
		return false;

	// Allocate the buffer space.
	BYTE* buffer = (BYTE*)_alloca(BUFFER_SIZE);

	// Keep copying until there is no more file left to copy.
	while (fileSize > 0)
	{
		// Copy the minimum of BUFFER_SIZE or the fileSize.
		DWORD readSize = min(BUFFER_SIZE, fileSize);
		srcFile.Read(buffer, readSize);
		destFile.Write(buffer, readSize);
		fileSize -= readSize;
	}

	// Close the destination virtual file.
	destFile.Close();

	return true;
}
Beispiel #3
0
void read_qscn(int user_number, uint32_t* qscn, bool stay_open, bool bForceRead) {
  if (!bForceRead) {
    if ((a()->IsUserOnline() && user_number == a()->usernum) ||
        (a()->at_wfc() && user_number == 1)) {
      if (qscn != qsc) {
        for (int i = (syscfg.qscn_len / 4) - 1; i >= 0; i--) {
          qscn[i] = qsc[i];
        }
      }
      return;
    }
  }
  if (open_qscn()) {
    long lPos = static_cast<long>(syscfg.qscn_len) * static_cast<long>(user_number);
    if (lPos + static_cast<long>(syscfg.qscn_len) <= qscanFile.GetLength()) {
      qscanFile.Seek(lPos, File::Whence::begin);
      qscanFile.Read(qscn, syscfg.qscn_len);
      if (!stay_open) {
        close_qscn();
      }
      return;
    }
  }
  if (!stay_open) {
    close_qscn();
  }

  memset(qsc, 0, syscfg.qscn_len);
  *qsc = 999;
  memset(qsc + 1, 0xff, ((syscfg.max_dirs + 31) / 32) * 4);
  memset(qsc + 1 + (syscfg.max_subs + 31) / 32, 0xff, ((syscfg.max_subs + 31) / 32) * 4);
}
Beispiel #4
0
bool Copy(File& srcFile, const char* destFilename)
{
	// Operate in 16k buffers.
	const uint32_t BUFFER_SIZE = 16 * 1024;

	uint32_t fileSize = (uint32_t)srcFile.GetLength();

	if (!Misc::PathCreate(destFilename))
		return false;

	// See if the destination file exists.
	DiskFile destFile;
	if (!destFile.Open(destFilename, File::MODE_CREATE | File::MODE_WRITEONLY))
		return false;

	// Allocate the buffer space.
	BYTE* buffer = (BYTE*)alloca(BUFFER_SIZE);

	// Keep copying until there is no more file left to copy.
	while (fileSize > 0) {
		// Copy the minimum of BUFFER_SIZE or the fileSize.
		uint32_t readSize = BUFFER_SIZE < fileSize ? BUFFER_SIZE : fileSize;
		if (srcFile.Read(buffer, readSize) != readSize)
			return false;
		destFile.Write(buffer, readSize);
		fileSize -= readSize;
	}

	// Close the destination virtual file.
	destFile.Close();

	return true;
}
Beispiel #5
0
/**\brief Load a player from a file.
 * \param[in] filename of a player's xml saved game.
 * \returns pointer to new Player instance.
 */
Player* Player::Load( string filename ) {
	xmlDocPtr doc;
	xmlNodePtr cur;

	Player* newPlayer = new Player();

	File xmlfile = File (filename);
	long filelen = xmlfile.GetLength();
	char *buffer = xmlfile.Read();
	doc = xmlParseMemory( buffer, static_cast<int>(filelen) );
	cur = xmlDocGetRootElement( doc );

	newPlayer->FromXMLNode( doc, cur );

	// We check the planet location at loadtime in case planet moved or lastPlanet changed.
	// This happens with --random-universe. TODO: Does this matter? random-universe was removed.
	Planet* p = Menu::GetCurrentScenario()->GetPlanets()->GetPlanet( newPlayer->lastPlanet );
	if( p != NULL ) {
		newPlayer->SetWorldPosition( p->GetWorldPosition() );
	} else {
		LogMsg(INFO, "There is no planet named: '%s'.", newPlayer->lastPlanet.c_str() );
	}

	newPlayer->RemoveLuaControlFunc();

	// We can't start the game with bad player Information
	assert( newPlayer->GetModelName() != "" );
	assert( newPlayer->GetEngineName() != "" );

	// Tell Lua to initialize these escorts.
	for(list<Player::HiredEscort*>::iterator iter_escort = newPlayer->hiredEscorts.begin(); iter_escort != newPlayer->hiredEscorts.end(); iter_escort++) {
		(*iter_escort)->Lua_Initialize( newPlayer->GetID(), newPlayer->GetWorldPosition() );
	}

	// Remember this Player
	newPlayer->lastLoadTime = time(NULL);

	LogMsg(INFO, "Successfully loaded the player: '%s'.", newPlayer->GetName().c_str() );
	LogMsg(INFO, "Loaded Player '%s' with Model='%s' Engine='%s' Credits = %d at (%.0f,%.0f).",
		newPlayer->GetName().c_str(),
		newPlayer->GetModel()->GetName().c_str(),
		newPlayer->GetEngine()->GetName().c_str(),
		newPlayer->GetCredits(),
		newPlayer->GetWorldPosition().GetX(), newPlayer->GetWorldPosition().GetY()
	);

	return newPlayer;
}
Beispiel #6
0
static bool checkFileSize(File &file, unsigned long len) {
  if (!file.IsOpen()) {
    int nFileMode = File::modeReadOnly | File::modeBinary;
    file.Open(nFileMode);
  }
  unsigned long actual = file.GetLength();
  file.Close();
  if (actual < len) {
    LOG << file.full_pathname() << " too short (" << actual << "<"
      << len << ").";
    return false;
  }
  if (actual > len) {
    LOG << file.full_pathname() << " too long (" << actual << ">"
      << len << ").";
    LOG << "Attempting to continue.";
  }
  return true;
}
Beispiel #7
0
static void set_gat_section(File& file, int section) {
  if (gat_section != section) {
    auto file_size = file.GetLength();
    auto section_pos = static_cast<off_t>(section) * GATSECLEN;
    if (file_size < section_pos) {
      file.SetLength(section_pos);
      file_size = section_pos;
    }
    file.Seek(section_pos, File::Whence::begin);
    if (file_size < (section_pos + GAT_SECTION_SIZE)) {
      for (int i = 0; i < GAT_NUMBER_ELEMENTS; i++) {
        gat[i] = 0;
      }
      file.Write(gat, GAT_SECTION_SIZE);
    } else {
      file.Read(gat, GAT_SECTION_SIZE);
    }
    gat_section = section;
  }
}
Beispiel #8
0
bool XMLFile::Open( const string& filename ) {
	char *buf = NULL;
	long bufSize = 0;
	File xmlfile;

	if( xmlfile.OpenRead( filename ) == false ) {
		LogMsg(ERR, "Could not find file %s", filename.c_str() );
		return( false );
	}

	buf = xmlfile.Read();
	bufSize = xmlfile.GetLength();
	if( buf == NULL ) {
		LogMsg(ERR, "Could not load XML from archive. Buffer failed to allocate." );
		return( NULL );
	}

	xmlPtr = xmlParseMemory( buf, bufSize );
	delete [] buf;

	this->filename.assign( filename );

	return( true );
}
Beispiel #9
0
/**\brief Load an XML file
 * \arg filename The XML file that should be parsed.
 * \arg optional  If this is true, an error is not returned if the file doesn't exist.
 */
bool Components::Load(string filename, bool optional) {
	xmlDocPtr doc;
	xmlNodePtr cur;
	int versionMajor = 0, versionMinor = 0, versionMacro = 0;
	int numObjs = 0;
	bool success = true;
	
	File xmlfile = File (filename);
	long filelen = xmlfile.GetLength();
	char *buffer = xmlfile.Read();
	doc = xmlParseMemory( buffer, static_cast<int>(filelen) );
	delete [] buffer;

	if( doc == NULL ) {
		LogMsg(ERR, "Could not load '%s' for parsing.", filename.c_str() );
		return optional;
	}
	
	cur = xmlDocGetRootElement( doc );
	
	if( cur == NULL ) {
		LogMsg(ERR, "'%s' file appears to be empty.", filename.c_str() );
		xmlFreeDoc( doc );
		return false;
	}
	
	if( xmlStrcmp( cur->name, (const xmlChar *)rootName.c_str() ) ) {
		LogMsg(ERR, "'%s' appears to be invalid. Root element was %s.", filename.c_str(), (char *)cur->name );
		xmlFreeDoc( doc );
		return false;
	} else {
		LogMsg(INFO, "'%s' file found and valid, parsing...", filename.c_str() );
	}
	
	cur = cur->xmlChildrenNode;
	while( success && cur != NULL ) {
		// Parse for the version information and any children nodes
		if( ( !xmlStrcmp( cur->name, BAD_CAST "version-major" ) ) ) {
			xmlChar *key = xmlNodeListGetString( doc, cur->xmlChildrenNode, 1 );
			versionMajor = atoi( (char *)key );
			xmlFree( key );
		} else if( ( !xmlStrcmp( cur->name, BAD_CAST "version-minor" ) ) ) {
			xmlChar *key = xmlNodeListGetString( doc, cur->xmlChildrenNode, 1 );
			versionMinor = atoi( (char *)key );
			xmlFree( key );
		} else if( ( !xmlStrcmp( cur->name, BAD_CAST "version-macro" ) ) ) {
			xmlChar *key = xmlNodeListGetString( doc, cur->xmlChildrenNode, 1 );
			versionMacro = atoi( (char *)key );
			xmlFree( key );
		} else if( ( !xmlStrcmp( cur->name, BAD_CAST componentName.c_str() ) ) ) {
			// Parse a Component
			success = ParseXMLNode( doc, cur );
			assert(success);
			if(success) numObjs++;
		}
		
		cur = cur->next;
	}
	
	xmlFreeDoc( doc );
	
	LogMsg(INFO, "Parsing of file '%s' done, found %d objects. File is version %d.%d.%d.", filename.c_str(), numObjs, versionMajor, versionMinor, versionMacro );
	return success;
}
Beispiel #10
0
PGPBoolean 
PGPdisk::BestGuessComparePaths(LPCSTR path)
{
	File		testFile;
	DualErr		derr;
	PGPBoolean	failedTest	= FALSE;
	PGPUInt32	i, numPGPdiskPathElems, numTestFilePathElems;
	PGPUInt64	PGPdiskLength, testFileLength;

	pgpAssert(Mounted());

	// First try the easy case.
	if (ComparePaths(path))
		return TRUE;

	// See if the number of path elements in each path is the same.
	numPGPdiskPathElems = 0;

	for (i=0; i<strlen(GetPath()); i++)
	{
		if ((GetPath()[i] == '\\') || (GetPath()[i] == '/'))
			numPGPdiskPathElems++;
	}

	numTestFilePathElems = 0;

	for (i=0; i<strlen(path); i++)
	{
		if ((path[i] == '\\') || (path[i] == '/'))
			numTestFilePathElems++;
	}

	if (numPGPdiskPathElems != numTestFilePathElems)
		failedTest = TRUE;

	// Make sure the files are the same size.
	if (!failedTest)
	{
		derr = GetLength(&PGPdiskLength);
	}

	if (derr.IsntError() && !failedTest)
	{
		derr = testFile.Open(path, kOF_MustExist | kOF_ReadOnly);
	}

	if (derr.IsntError() && !failedTest)
	{
		derr = testFile.GetLength(&testFileLength);
	}

	if (!failedTest && testFile.Opened())
	{
		testFile.Close();
	}

	if (derr.IsntError() && !failedTest)
	{
		if (PGPdiskLength != testFileLength)
			failedTest = TRUE;
	}

	// Check if the test file is in use (which must be the case with any
	// mounted PGPdisk.

	if (derr.IsntError() && !failedTest)
	{
		if (!Driver->IsFileInUse(path))
			failedTest = TRUE;
	}

	// Finally return false if there was an error.
	if (derr.IsError())
	{
		failedTest = TRUE;
	}

	return !failedTest;
}
Beispiel #11
0
static bool EditHeader(MenuHeader* header, File &fileEditMenu, const string& menuDir, int& nAmount, int& nCur) {
  bool done = false;
  char szTemp1[21];
  DisplayHeader(header, 0, menuDir);
  char chKey = onek("Q[]Z012ABCDEFGHIJKLMNOP");
  switch (chKey) {
  case 'Q':
    WriteMenuRec(fileEditMenu, (MenuRec*) header, nCur);
    done = true;
    break;
  case '[':
    WriteMenuRec(fileEditMenu, (MenuRec*) header, nCur);
    nAmount = static_cast<uint16_t>(fileEditMenu.GetLength() / sizeof(MenuRec)) - 1;
    --(nCur);
    if ((nCur) < 0) {
      nCur = nAmount;
    }
    ReadMenuRec(fileEditMenu, (MenuRec*) header, nCur);
    break;
  case ']':
    WriteMenuRec(fileEditMenu, (MenuRec*) header, nCur);
    nAmount = static_cast<uint16_t>(fileEditMenu.GetLength() / sizeof(MenuRec)) - 1;
    (nCur)++;
    if (nCur > nAmount) {
      (nCur) = 0;
    }
    ReadMenuRec(fileEditMenu, (MenuRec*) header, nCur);
    break;
  case 'Z':
    WriteMenuRec(fileEditMenu, (MenuRec*) header, nCur);
    memset(header, 0, sizeof(MenuRec));
    nAmount = static_cast<uint16_t>(fileEditMenu.GetLength() / sizeof(MenuRec)) - 1;
    (nCur) = nAmount + 1;

    // TODO(rushfan): WTF is this for?
    ((MenuRec*) header)->iMaxSL = 255;
    ((MenuRec*) header)->iMaxDSL = 255;

    WriteMenuRec(fileEditMenu, (MenuRec*) header, nCur);
    nAmount = static_cast<uint16_t>(fileEditMenu.GetLength() / sizeof(MenuRec)) - 1;
    ReadMenuRec(fileEditMenu, (MenuRec*) header, nCur);
    break;
  case '0': {
    wwiv::menus::MenuDescriptions descriptions(GetMenuDirectory());
    string description = descriptions.description(menuDir);

    bout << "|#5New desc     : ";
    bout.Color(0);
    inputl(&description, 60);
    if (!description.empty()) {
      descriptions.set_description(menuDir, description);
    }
  } break;
  case '1':
    bout << "Is Menu deleted? (N) ";
    if (noyes()) {
      header->nFlags |= MENU_FLAG_DELETED;
    } else {
      header->nFlags &= ~MENU_FLAG_DELETED;
    }
    break;
  case '2':
    bout << "Is Menu a main menu? (Y) ";
    if (yesno()) {
      header->nFlags |= MENU_FLAG_MAINMENU;
    } else {
      header->nFlags &= ~MENU_FLAG_MAINMENU;
    }
    break;
  case 'A':
    header->nNumbers++;
    if (header->nNumbers == MENU_NUMFLAG_LAST) {
      header->nNumbers = 0;
    }
    break;
  case 'B':
    header->nLogging++;
    if (header->nLogging == MENU_LOGTYPE_LAST) {
      header->nLogging = 0;
    }
    break;
  case 'C':
    header->nForceHelp++;
    if (header->nForceHelp == MENU_HELP_LAST) {
      header->nForceHelp = 0;
    }
    break;
  case 'D':
    header->nAllowedMenu++;
    if (header->nAllowedMenu == MENU_ALLOWED_LAST) {
      header->nAllowedMenu = 0;
    }
    break;
  case 'F':
    bout << "Command to execute : ";
    inputl(header->szScript, 100);
    break;
  case 'G':
    bout << "Script for when menu ends : ";
    inputl(header->szExitScript, 100);
    break;
  case 'H':
    bout << "Min SL : ";
    input(szTemp1, 3);
    if (szTemp1[0]) {
      header->nMinSL = StringToShort(szTemp1);
    }
    break;
  case 'I':
    bout << "Min DSL : ";
    input(szTemp1, 3);
    if (szTemp1[0]) {
      header->nMinDSL = StringToShort(szTemp1);
    }
    break;
  case 'J':
    bout << "AR : ";
    input(szTemp1, 5);
    if (szTemp1[0]) {
      header->uAR = StringToUnsignedShort(szTemp1);
    }
    break;
  case 'K':
    bout << "DAR : ";
    input(szTemp1, 5);
    if (szTemp1[0]) {
      header->uDAR = StringToUnsignedShort(szTemp1);
    }
    break;
  case 'L':
    bout << "Restrictions : ";
    input(szTemp1, 5);
    if (szTemp1[0]) {
      header->uRestrict = StringToUnsignedShort(szTemp1);
    }
    break;
  case 'M':
    header->nSysop = !header->nSysop;
    break;
  case 'N':
    header->nCoSysop = !header->nCoSysop;
    break;
  case 'O':
    if (incom && header->szPassWord[0]) {
      bout << "Current PW: ";
      string pw;
      input(&pw, 20);
      if (!IsEqualsIgnoreCase(pw.c_str(), header->szPassWord)) {
        MenuSysopLog("Unable to change PW");
        break;
      }
    }
    bout << "   New PW : ";
    input(header->szPassWord, 20);
    break;
  }
  return done;
}
Beispiel #12
0
static bool EditMenuItem(MenuRec* menu, File &fileEditMenu, int& nAmount, int& nCur) {
  bool done = false;
  char szPW[21];
  char szTemp1[21];
  DisplayItem(menu, nCur, nAmount);
  char chKey = onek("Q[]Z1ABCDEFGKLMNOPRSTUVW");

  switch (chKey) {
  case 'Q':
    WriteMenuRec(fileEditMenu, menu, nCur);
    done = true;
    break;

  case '[':
    WriteMenuRec(fileEditMenu, menu, nCur);
    nAmount = static_cast<uint16_t>(fileEditMenu.GetLength() / sizeof(MenuRec)) - 1;
    --nCur;
    if (nCur < 0) {
      nCur = nAmount;
    }
    ReadMenuRec(fileEditMenu, menu, nCur);
    break;
  case ']':
    WriteMenuRec(fileEditMenu, menu, nCur);
    nAmount = static_cast<uint16_t>(fileEditMenu.GetLength() / sizeof(MenuRec)) - 1;
    ++nCur;
    if (nCur > nAmount) {
      nCur = 0;
    }
    ReadMenuRec(fileEditMenu, menu, nCur);
    break;
  case 'Z':
    WriteMenuRec(fileEditMenu, menu, nCur);
    memset(menu, 0, sizeof(MenuRec));
    nAmount = static_cast<uint16_t>(fileEditMenu.GetLength() / sizeof(MenuRec)) - 1;
    nCur = nAmount + 1;
    memset(menu, 0, sizeof(MenuRec));
    menu->iMaxSL = 255;
    menu->iMaxDSL = 255;
    WriteMenuRec(fileEditMenu, menu, nCur);
    nAmount = static_cast<uint16_t>(fileEditMenu.GetLength() / sizeof(MenuRec)) - 1;
    ReadMenuRec(fileEditMenu, menu, nCur);
    break;
  case '1':
    bout << "Is record deleted? (N) ";
    if (yesno()) {
      menu->nFlags |= MENU_FLAG_DELETED;
    } else {
      menu->nFlags &= ~MENU_FLAG_DELETED;
    }
    break;
  case 'A':
    bout << "Key to cause execution : ";
    input(menu->szKey, MENU_MAX_KEYS);
    if (!(menu->szSysopLog[0])) {
      strcpy(menu->szSysopLog, menu->szKey);
    }
    break;
  case 'B':
    bout << "Command to execute : ";
    inputl(menu->szExecute, 100);
    if (!(menu->szMenuText[0])) {
      strcpy(menu->szMenuText, menu->szExecute);
    }
    break;
  case 'C':
    bout << "Menu Text : ";
    inputl(menu->szMenuText, 40);
    break;
  case 'E':
    bout << "Help Text : ";
    inputl(menu->szHelp, 80);
    break;
  case 'F':
    bout << "Instance Message : ";
    inputl(menu->szInstanceMessage, 80);
    break;
  case 'G':
    bout << "Sysoplog Message : ";
    inputl(menu->szSysopLog, 50);
    break;
  case 'K':
    bout << "Min SL : ";
    input(szTemp1, 3);
    if (szTemp1[0]) {
      menu->nMinSL = StringToShort(szTemp1);
    }
    break;
  case 'L':
    bout << "Max SL : ";
    input(szTemp1, 3);
    if (szTemp1[0]) {
      menu->iMaxSL = StringToShort(szTemp1);
    }
    break;
  case 'M':
    bout << "Min DSL : ";
    input(szTemp1, 3);
    if (szTemp1[0]) {
      menu->nMinDSL = StringToShort(szTemp1);
    }
    break;
  case 'N':
    bout << "Max DSL : ";
    input(szTemp1, 3);
    if (szTemp1[0]) {
      menu->iMaxDSL = StringToShort(szTemp1);
    }
    break;
  case 'O':
    bout << "AR : ";
    input(szTemp1, 5);
    if (szTemp1[0]) {
      menu->uAR = StringToUnsignedShort(szTemp1);
    }
    break;
  case 'P':
    bout << "DAR : ";
    input(szTemp1, 5);
    if (szTemp1[0]) {
      menu->uDAR = StringToUnsignedShort(szTemp1);
    }
    break;
  case 'R':
    bout << "Restrictions : ";
    input(szTemp1, 5);
    if (szTemp1[0]) {
      menu->uRestrict = StringToUnsignedShort(szTemp1);
    }
    break;
  case 'S':
    menu->nSysop = !menu->nSysop;
    break;
  case 'T':
    menu->nCoSysop = !menu->nCoSysop;
    break;
  case 'U':
    if (incom && menu->szPassWord[0]) {
      bout << "Current PW: ";
      input(szPW, 20);
      if (!IsEqualsIgnoreCase(szPW, menu->szPassWord)) {
        MenuSysopLog("Unable to change PW");
        break;
      }
    }
    bout << "   New PW : ";
    input(menu->szPassWord, 20);
    break;

  case 'V':
    ++menu->nHide;
    if (menu->nHide >= MENU_HIDE_LAST) {
      menu->nHide = MENU_HIDE_NONE;
    }
    break;
  }
  return done;
}
Beispiel #13
0
/**\brief Load an XML file
 * \arg filename The XML file that should be parsed.
 * \arg optional  If this is true, an error is not returned if the file doesn't exist.
 */
bool Components::Load(string filename, bool optional) {
	xmlDocPtr doc;
	xmlNodePtr cur, ver;
	int versionMajor = 0, versionMinor = 0, versionMacro = 0;
	int numObjs = 0;
	bool success = true;
	
	File xmlfile = File (filename);
	long filelen = xmlfile.GetLength();
	char *buffer = xmlfile.Read();
	doc = xmlParseMemory( buffer, static_cast<int>(filelen) );
	delete [] buffer;

	if( doc == NULL ) {
		LogMsg(ERR, "Could not load '%s' for parsing.", filename.c_str() );
		return optional;
	}
	
	cur = xmlDocGetRootElement( doc );
	
	if( cur == NULL ) {
		LogMsg(ERR, "'%s' file appears to be empty.", filename.c_str() );
		xmlFreeDoc( doc );
		return false;
	}
	
	if( xmlStrcmp( cur->name, (const xmlChar *)rootName.c_str() ) ) {
		LogMsg(ERR, "'%s' appears to be invalid. Root element was %s.", filename.c_str(), (char *)cur->name );
		xmlFreeDoc( doc );
		return false;
	} else {
		LogMsg(INFO, "'%s' file found and valid, parsing...", filename.c_str() );
	}
	
	// Get the version number
	if( (ver = FirstChildNamed(cur, "version-major")) != NULL ) {
		versionMajor = NodeToInt(doc,ver);
	}
	if( (ver = FirstChildNamed(cur, "version-minor")) != NULL ) {
		versionMinor = NodeToInt(doc,ver);
	}
	if( (ver = FirstChildNamed(cur, "version-macro")) != NULL ) {
		versionMacro = NodeToInt(doc,ver);
	}
	if( ( versionMajor != EPIAR_VERSION_MAJOR ) ||
	    ( versionMinor != EPIAR_VERSION_MINOR ) ||
	    ( versionMacro != EPIAR_VERSION_MICRO ) ) {
		LogMsg(WARN, "File '%s' is version %d.%d.%d. This may cause problems since it does not match the current version %d.%d.%d.",
			filename.c_str(),
			versionMajor, versionMinor, versionMacro,
			EPIAR_VERSION_MAJOR, EPIAR_VERSION_MINOR, EPIAR_VERSION_MICRO );
	}
	
	// Get the components
	cur = cur->xmlChildrenNode;
	while( success && cur != NULL ) {
		// Parse for the version information and any children nodes
		if( ( !xmlStrcmp( cur->name, BAD_CAST componentName.c_str() ) ) ) {
			// Parse a Component
			success = ParseXMLNode( doc, cur );
			assert(success || optional);
			if(success) numObjs++;
		}
		
		cur = cur->next;
	}
	
	xmlFreeDoc( doc );

	filepath = filename;
	
	LogMsg(INFO, "Parsing of file '%s' done, found %d objects. File is version %d.%d.%d.", filename.c_str(), numObjs, versionMajor, versionMinor, versionMacro );
	return success;
}