/**\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) }
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; }
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); }
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; }
/**\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; }
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; }
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; } }
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 ); }
/**\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; }
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; }
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; }
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; }
/**\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; }