void TwoDAFile::writeASCII(Common::WriteStream &out) const { // Write header out.writeString("2DA V2.0\n"); if (!_defaultString.empty()) out.writeString(Common::UString::format("DEFAULT: %s", _defaultString.c_str())); out.writeByte('\n'); // Calculate column lengths std::vector<size_t> colLength; colLength.resize(_headers.size() + 1, 0); const Common::UString maxRow = Common::UString::format("%d", (int)_rows.size() - 1); colLength[0] = maxRow.size(); for (size_t i = 0; i < _headers.size(); i++) colLength[i + 1] = _headers[i].size(); for (size_t i = 0; i < _rows.size(); i++) { for (size_t j = 0; j < _rows[i]->_data.size(); j++) { const bool needQuote = _rows[i]->_data[j].contains(' '); const size_t length = needQuote ? _rows[i]->_data[j].size() + 2 : _rows[i]->_data[j].size(); colLength[j + 1] = MAX<size_t>(colLength[j + 1], length); } } // Write column headers out.writeString(Common::UString::format("%-*s", (int)colLength[0], "")); for (size_t i = 0; i < _headers.size(); i++) out.writeString(Common::UString::format(" %-*s", (int)colLength[i + 1], _headers[i].c_str())); out.writeByte('\n'); // Write array for (size_t i = 0; i < _rows.size(); i++) { out.writeString(Common::UString::format("%*u", (int)colLength[0], (uint)i)); for (size_t j = 0; j < _rows[i]->_data.size(); j++) { const bool needQuote = _rows[i]->_data[j].contains(' '); Common::UString cellString; if (needQuote) cellString = Common::UString::format("\"%s\"", _rows[i]->_data[j].c_str()); else cellString = _rows[i]->_data[j]; out.writeString(Common::UString::format(" %-*s", (int)colLength[j + 1], cellString.c_str())); } out.writeByte('\n'); } out.flush(); }
void dumpTLK(const Common::UString &inFile, const Common::UString &outFile, Common::Encoding encoding) { Common::SeekableReadStream *tlk = new Common::ReadFile(inFile); Common::WriteStream *out = 0; try { if (!outFile.empty()) out = new Common::WriteFile(outFile); else out = new Common::StdOutStream; } catch (...) { delete tlk; throw; } try { XML::TLKDumper::dump(*out, tlk, encoding); } catch (...) { delete out; throw; } out->flush(); if (!outFile.empty()) status("Converted \"%s\" to \"%s\"", inFile.c_str(), outFile.c_str()); delete out; }
bool BladeRunnerEngine::saveGame(Common::WriteStream &stream, const Graphics::Surface &thumbnail) { if (!playerHasControl() || _sceneScript->isInsideScript() || _aiScripts->isInsideScript()) { return false; } Common::MemoryWriteStreamDynamic memoryStream(DisposeAfterUse::YES); SaveFileWriteStream s(memoryStream); s.write(thumbnail.getPixels(), SaveFileManager::kThumbnailSize); s.writeFloat(1.0f); _settings->save(s); _scene->save(s); _scene->_exits->save(s); _scene->_regions->save(s); _scene->_set->save(s); for (uint i = 0; i != _gameInfo->getGlobalVarCount(); ++i) { s.writeInt(_gameVars[i]); } _music->save(s); // _audioPlayer->save(s) // zero func // _audioSpeech->save(s) // zero func _combat->save(s); _gameFlags->save(s); _items->save(s); _sceneObjects->save(s); _ambientSounds->save(s); _overlays->save(s); _spinner->save(s); _scores->save(s); _dialogueMenu->save(s); _obstacles->save(s); _actorDialogueQueue->save(s); _waypoints->save(s); for (uint i = 0; i != _gameInfo->getActorCount(); ++i) { _actors[i]->save(s); int animationState, animationFrame, animationStateNext, nextAnimation; _aiScripts->queryAnimationState(i, &animationState, &animationFrame, &animationStateNext, &nextAnimation); s.writeInt(animationState); s.writeInt(animationFrame); s.writeInt(animationStateNext); s.writeInt(nextAnimation); } _actors[kActorVoiceOver]->save(s); _policeMaze->save(s); _crimesDatabase->save(s); s.finalize(); stream.writeUint32LE(memoryStream.size() + 4); stream.write(memoryStream.getData(), memoryStream.size()); stream.flush(); return true; }
static inline bool flushStream(Common::WriteStream &stream) { // Flush and check for errors if (!stream.flush()) return false; if (stream.err()) return false; return true; }
void Testsuite::logPrintf(const char *fmt, ...) { // Assuming log message size to be not greater than STRINGBUFLEN i.e 256 char buffer[STRINGBUFLEN]; va_list vl; va_start(vl, fmt); vsnprintf(buffer, STRINGBUFLEN, fmt, vl); va_end(vl); Common::WriteStream *ws = ConfigParams::instance().getLogWriteStream(); if (ws) { ws->writeString(buffer); ws->flush(); debugCN(kTestbedLogOutput, "%s", buffer); } else { debugCN(kTestbedLogOutput, "%s", buffer); } }
void Testsuite::logDetailedPrintf(const char *fmt, ...) { // Assuming log message size to be not greater than STRINGBUFLEN i.e 256 // Messages with this function would only be displayed if -d1 is specified on command line char buffer[STRINGBUFLEN]; va_list vl; va_start(vl, fmt); vsnprintf(buffer, STRINGBUFLEN, fmt, vl); va_end(vl); Common::WriteStream *ws = ConfigParams::instance().getLogWriteStream(); if (ws) { ws->writeString(buffer); ws->flush(); debugCN(1, kTestbedLogOutput, "%s", buffer); } else { debugCN(1, kTestbedLogOutput, "%s", buffer); } }
void TwoDAFile::writeCSV(Common::WriteStream &out) const { // Write column headers for (size_t i = 0; i < _headers.size(); i++) { const bool needQuote = _headers[i].contains(','); if (needQuote) out.writeByte('"'); out.writeString(_headers[i]); if (needQuote) out.writeByte('"'); if (i < (_headers.size() - 1)) out.writeByte(','); } out.writeByte('\n'); // Write array for (size_t i = 0; i < _rows.size(); i++) { for (size_t j = 0; j < _rows[i]->_data.size(); j++) { const bool needQuote = _rows[i]->_data[j].contains(','); if (needQuote) out.writeByte('"'); if (_rows[i]->_data[j] != "****") out.writeString(_rows[i]->_data[j]); if (needQuote) out.writeByte('"'); if (j < (_rows[i]->_data.size() - 1)) out.writeByte(','); } out.writeByte('\n'); } out.flush(); }
void dump2DA(Aurora::TwoDAFile &twoDA, const Common::UString &outFile, Format format) { Common::WriteStream *out = 0; if (!outFile.empty()) out = new Common::WriteFile(outFile); else out = new Common::StdOutStream; try { if (format == kFormat2DA) twoDA.dumpASCII(*out); else twoDA.dumpCSV(*out); } catch (...) { delete out; throw; } out->flush(); delete out; }
/** * This test creates a file testbed.out, writes a sample data and confirms if * it is same by reading the file again. */ TestExitStatus FStests::testWriteFile() { const Common::String &path = ConfMan.get("path"); Common::FSNode gameRoot(path); if (!gameRoot.exists()) { Testsuite::logPrintf("Couldn't open the game data directory %s", path.c_str()); return kTestFailed; } Common::FSNode fileToWrite = gameRoot.getChild("testbed.out"); Common::WriteStream *ws = fileToWrite.createWriteStream(); if (!ws) { Testsuite::logDetailedPrintf("Can't open writable file in game data dir\n"); return kTestFailed; } ws->writeString("ScummVM Rocks!"); ws->flush(); delete ws; Common::SeekableReadStream *rs = fileToWrite.createReadStream(); if (!rs) { Testsuite::logDetailedPrintf("Can't open recently written file testbed.out in game data dir\n"); return kTestFailed; } Common::String readFromFile = rs->readLine(); delete rs; if (readFromFile.equals("ScummVM Rocks!")) { // All good Testsuite::logDetailedPrintf("Data written and read correctly\n"); return kTestPassed; } return kTestFailed; }
void dumpGFF(const Common::UString &inFile, const Common::UString &outFile, Common::Encoding encoding, bool nwnPremium) { Common::SeekableReadStream *gff = new Common::ReadFile(inFile); XML::GFFDumper *dumper = 0; try { dumper = XML::GFFDumper::identify(*gff, nwnPremium); } catch (...) { delete gff; throw; } Common::WriteStream *out = 0; try { if (!outFile.empty()) out = new Common::WriteFile(outFile); else out = new Common::StdOutStream; dumper->dump(*out, gff, encoding, nwnPremium); } catch (...) { delete dumper; delete out; throw; } out->flush(); if (!outFile.empty()) status("Converted \"%s\" to \"%s\"", inFile.c_str(), outFile.c_str()); delete dumper; delete out; }
void dumpTGA(const Common::UString &fileName, const ImageDecoder *image) { if (!image || (image->getLayerCount() < 1) || (image->getMipMapCount() < 1)) throw Common::Exception("No image"); int32 width = image->getMipMap(0, 0).width; int32 height = 0; for (size_t i = 0; i < image->getLayerCount(); i++) { const ImageDecoder::MipMap &mipMap = image->getMipMap(0, i); if (mipMap.width != width) throw Common::Exception("dumpTGA(): Unsupported image with variable layer width"); height += mipMap.height; } Common::WriteStream *file = openTGA(fileName, width, height); for (size_t i = 0; i < image->getLayerCount(); i++) writeMipMap(*file, image->getMipMap(0, i), image->getFormat()); file->flush(); delete file; }
void pngFlushStream(png_structp pngPtr) { void *writeIOptr = png_get_io_ptr(pngPtr); Common::WriteStream *stream = (Common::WriteStream *)writeIOptr; stream->flush(); }
void disNCS(const Common::UString &inFile, const Common::UString &outFile, Aurora::GameID &game, Command &command, bool printStack, bool printControlTypes) { Common::SeekableReadStream *ncs = new Common::ReadFile(inFile); Common::WriteStream *out = 0; try { if (!outFile.empty()) out = new Common::WriteFile(outFile); else out = new Common::StdOutStream; status("Disassembling script..."); NWScript::Disassembler disassembler(*ncs, game); if (game != Aurora::kGameIDUnknown) { try { status("Analyzing script stack..."); disassembler.analyzeStack(); } catch (...) { Common::exceptionDispatcherWarnAndIgnore("Script analysis failed"); } try { status("Analyzing control flow..."); disassembler.analyzeControlFlow(); } catch (...) { Common::exceptionDispatcherWarnAndIgnore("Control flow analysis failed"); } } switch (command) { case kCommandListing: disassembler.createListing(*out, printStack); break; case kCommandAssembly: disassembler.createAssembly(*out, printStack); break; case kCommandDot: disassembler.createDot(*out, printControlTypes); break; default: throw Common::Exception("Invalid command %u", (uint)command); } } catch (...) { delete ncs; delete out; throw; } out->flush(); if (!outFile.empty()) status("Disassembled \"%s\" into \"%s\"", inFile.c_str(), outFile.c_str()); delete ncs; delete out; }