/*
* tracker/Decompressor.h
*
* Copyright 2009 Peter Barth
*
* This file is part of Milkytracker.
*
* Milkytracker is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Milkytracker is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Milkytracker. If not, see .
*
*/
/*
* Decompressor.h
* MilkyTracker
*
* Created by Peter Barth on 19.10.07.
*
*/
#ifndef __DECOMPRESSOR_H__
#define __DECOMPRESSOR_H__
#include "BasicTypes.h"
#include "SimpleVector.h"
class XMFile;
class DecompressorBase
{
public:
enum Hints
{
HintAll,
HintModules,
HintInstruments,
HintSamples,
HintPatterns,
HintTracks
};
DecompressorBase(const PPSystemString& fileName) :
fileName(fileName)
{
}
virtual ~DecompressorBase()
{
}
virtual bool identify(XMFile& f) = 0;
virtual bool identify();
virtual bool doesServeHint(Hints hint) = 0;
virtual const PPSimpleVector& getDescriptors(Hints hint) const = 0;
virtual bool decompress(const PPSystemString& outFileName, Hints hint) = 0;
static void removeFile(const PPSystemString& fileName);
virtual void setFilename(const PPSystemString& fileName);
virtual DecompressorBase* clone() = 0;
protected:
PPSystemString fileName;
mutable PPSimpleVector descriptors;
};
/*****************************************************************************
* Generic decompressor
*****************************************************************************/
class Decompressor : public DecompressorBase
{
public:
Decompressor(const PPSystemString& fileName);
virtual bool identify(XMFile& f);
virtual bool doesServeHint(Hints hint);
virtual const PPSimpleVector& getDescriptors(Hints hint) const;
virtual bool decompress(const PPSystemString& outFileName, Hints hint);
virtual DecompressorBase* clone();
virtual void setFilename(const PPSystemString& fileName);
private:
void adjustFilenames(const PPSystemString& fileName);
PPSimpleVector decompressors;
public:
static PPSimpleVector& decompressorList();
template
struct RegisterDecompressor
{
RegisterDecompressor()
{
Decompressor::decompressorList().add(new type(""));
}
};
};
#endif