예제 #1
0
void zip::decompress(buffer& compressed, buffer& uncompressed) 
{
   fstream out(COMPRESSED, ios::out|ios::trunc);

   if ( !out )
      throw(streamException(out.rdstate()));

   if ( out.write(compressed.get_base(), compressed.content_sz()) == 0 )
      throw(streamException(out.rdstate()));

   out.close();

   system(form("gzip -cd %s > %s", COMPRESSED, UNCOMPRESSED));

   fstream in(UNCOMPRESSED, ios::in);

   if ( !in )
      throw(streamException(in.rdstate()));

   int x = bytes(in);

   uncompressed.expand_chunk(x);

   if ( in.read(uncompressed.get_base(), x) == 0 || x != in.gcount() )
      throw(streamException(in.rdstate()));

   uncompressed.set_content_sz(x);

   in.close();

   return;
}
예제 #2
0
void zip::compress(const buffer& uncompressed, buffer& compressed) 
{
////////////////////////////////////////
// code for testing. I know it is slow. 
////////////////////////////////////////

   fstream out(UNCOMPRESSED, ios::out|ios::trunc);

   if ( !out )
      throw(streamException(out.rdstate()));

   if ( out.write(uncompressed.get_base(), uncompressed.content_sz()) == 0 )
      throw(streamException(out.rdstate()));

   out.close();

   system(form("gzip -c %s > %s", UNCOMPRESSED, COMPRESSED));

   fstream in(COMPRESSED, ios::in);

   if ( !in )
      throw(streamException(in.rdstate()));

   int x = bytes(in);

   compressed.expand_chunk(x);

   if ( in.read(compressed.get_base(), x) == 0 || x != in.gcount() )
      throw(streamException(in.rdstate()));

   compressed.set_content_sz(x);

   in.close();

   return;
}