X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=tool%2Fpacker.cpp;h=d54d333e3affc244e80ce9653cbc4867f66f43fe;hb=e5289623539d2bd64d4276551a968cf1a9f8e793;hp=ff69912fe40124fe4d64e37f5d13330b521782c0;hpb=29fafaa2c570b0cf92f41eeb534cfb65a841a892;p=libs%2Fdatafile.git diff --git a/tool/packer.cpp b/tool/packer.cpp index ff69912..d54d333 100644 --- a/tool/packer.cpp +++ b/tool/packer.cpp @@ -13,23 +13,25 @@ using namespace Msp; Packer::Packer(DataTool &t): tool(t), tmp_file(tempfile()), - tmp_buf(new IO::Buffered(*tmp_file)), dir_alloc(0) { } -IO::File *Packer::tempfile() +IO::BufferedFile *Packer::tempfile() { + FS::Path tmpdir; + const char *tmp_env = getenv("TMPDIR"); + if(tmp_env) + tmpdir = tmp_env; + else + tmpdir = "/tmp"; + for(unsigned i=0;; ++i) { try { - std::string filename = format("/tmp/mspdatatool.%d", i); - /*filename.reserve(25); - filename.append("/tmp/mspdatatool."); - for(unsigned i=0; i<8; ++i) - filename.append(rand());*/ - IO::File *file = new IO::File(filename, IO::M_RDWR, IO::File::C_NEW); - FS::unlink(filename); + FS::Path filename = tmpdir/format("mspdatatool.%d", i); + IO::BufferedFile *file = new IO::BufferedFile(filename.str(), IO::M_RDWR, IO::File::C_NEW); + FS::unlink(filename.str()); return file; } catch(const IO::file_already_exists &) @@ -41,7 +43,6 @@ IO::File *Packer::tempfile() Packer::~Packer() { - delete tmp_buf; delete tmp_file; } @@ -58,10 +59,7 @@ void Packer::pack_file(const string &fn) if(raw) transfer_raw(in, *tmp_file); else - { - transfer_datafile(in, fn, *tmp_buf, objects); - tmp_buf->flush(); - } + transfer_datafile(in, fn, *tmp_file, objects); unsigned length = tmp_file->tell()-offset; @@ -79,7 +77,7 @@ bool Packer::detect_raw(IO::Seekable &in) IO::SeekOffset offset = in.tell(); bool raw = false; DataFile::Parser parser(in, "-"); - while(!raw && !in.eof() && in.tell()<10240) + while(!raw && parser && in.tell()<10240) { try { @@ -167,12 +165,14 @@ void Packer::create_pack(const string &fn) IO::File out(fn, IO::M_WRITE); out.write(&dir_buffer[0], base_offset); tmp_file->seek(0, IO::S_BEG); + unsigned bufsize = 1048576; + char *buf = new char[bufsize]; while(!tmp_file->eof()) { - char buf[16384]; - unsigned len = tmp_file->read(buf, sizeof(buf)); + unsigned len = tmp_file->read(buf, bufsize); if(!len) break; out.write(buf, len); } + delete[] buf; }