ArchiveFactory.h ======================================== #ifndef krux_krx_ArchiveFactory_h #define krux_krx_ArchiveFactory_h #include "krx/IArchive.h" #include "krx/IEntry.h" #include "krx/ICodec.h" #include #include typedef std::map CodecMap; typedef std::pair CodecMapPair; typedef std::map::iterator CodecMapIterator; namespace krux { namespace krx { class ArchiveFactory { public: static IArchive* openArchive(const char* archive); static IArchive* createArchive(const char* archive); static void closeArchive(IArchive* archive); static void registerCodec(ICodec* codec); static ICodec* getCodec(const char* codecName); private: static void initialize(); static CodecMap m_Codecs; static bool m_Initialized; }; } } #endif ArchiveFactory.cpp ======================================== #include "krx/ArchiveFactory.h" #include #include "Archive.h" #include "NullCodec.h" using namespace krux::krx; std::map ArchiveFactory::m_Codecs; bool ArchiveFactory::m_Initialized = false; void ArchiveFactory::initialize() { if (!ArchiveFactory::m_Initialized) { ArchiveFactory::registerCodec(new NullCodec()); ArchiveFactory::m_Initialized = true; } } IArchive* ArchiveFactory::openArchive(const char* archive) { ArchiveFactory::initialize(); Archive* arc = new Archive(); arc->setFile(archive); arc->open(); return arc; } IArchive* ArchiveFactory::createArchive(const char* archive) { return ArchiveFactory::openArchive(archive); } void ArchiveFactory::closeArchive(IArchive* archive) { ArchiveFactory::initialize(); Archive* arch = (Archive*)archive; arch->close(); delete arch; } ICodec* ArchiveFactory::getCodec(const char* codecName) { ICodec* codec = m_Codecs[codecName]; return (codec) ? codec : NULL; } void ArchiveFactory::registerCodec(ICodec* codec) { if (getCodec(codec->getName())!=NULL) { // TODO: handle errors return; } m_Codecs.insert(CodecMapPair(codec->getName(),codec)); }