void BinaryMeshFileReader::read(IMeshBuilder& builder)
{
    BufferedFile file(
        m_filename.c_str(),
        BufferedFile::BinaryType,
        BufferedFile::ReadMode);

    if (!file.is_open())
        throw ExceptionIOError();

    read_and_check_signature(file);

    uint16 version;
    checked_read(file, version);

    auto_ptr<ReaderAdapter> reader;

    switch (version)
    {
      // Uncompressed.
      case 1:
        reader.reset(new PassthroughReaderAdapter(file));
        break;

      // LZO-compressed.
      case 2:
        throw ExceptionIOError(
            "binarymesh format version 2 is no longer supported; "
            "please use the convertmeshfile tool that ships with appleseed 1.1.0 alpha-21 or earlier");

      // LZ4-compressed.
      case 3:
        reader.reset(new LZ4CompressedReaderAdapter(file));
        break;

      // Unknown format.
      default:
        throw ExceptionIOError("unknown binarymesh format version");
    }

    read_meshes(*reader.get(), builder);
}
void BinaryMeshFileReader::read(IMeshBuilder& builder)
{
    BufferedFile file(
        m_filename.c_str(),
        BufferedFile::BinaryType,
        BufferedFile::ReadMode);

    if (!file.is_open())
        throw ExceptionIOError();

    read_and_check_signature(file);

    uint16 version;
    checked_read(file, version);

    auto_ptr<ReaderAdapter> reader;

    switch (version)
    {
      case 1:                       // uncompressed
        reader.reset(new PassthroughReaderAdapter(file));
        break;

      case 2:                       // LZO-compressed (deprecated)
        reader.reset(new LZOCompressedReaderAdapter(file));
        break;

      case 3:                       // LZ4-compressed
        reader.reset(new LZ4CompressedReaderAdapter(file));
        break;

      default:                      // unknown format
        throw ExceptionIOError();   // todo: throw better-qualified exception
    }

    read_meshes(*reader.get(), builder);
}