Revision 1 (by moose, 2006/03/06 10:00:33) Initial Import
#ifndef __MADMEDIALIBRARY_H__
#define __MADMEDIALIBRARY_H__

#include <sstream>
#include <string>

#define UNIMPL { \
	strstream str; \
	str << "Unimplemented method called: '"; \
	str << __PRETTY_FUNCTION__ << "'" << endl; \
	throw str.str().c_str(); \
} (void)0

class MadMediaLibraryCategory;
class MadMediaLibraryTag;
class MadMediaLibraryItem;
class MadApp;

class MadMediaLibrary {
	public:
		MadMediaLibrary(MadApp *_app) : app(_app) { };
		virtual ~MadMediaLibrary() { };

		// Categories
		virtual bool beginCategory() = 0;
		virtual bool step(MadMediaLibraryCategory &) = 0;
		virtual bool category(MadMediaLibraryCategory &, const char *name) = 0;
		virtual bool category(MadMediaLibraryCategory &, int i) = 0;
		virtual bool newCategory(MadMediaLibraryCategory &, const char *name, const char *d = 0) = 0;
		virtual void endCategory() = 0;

		// Tags
		virtual bool beginTag() = 0;
		virtual bool step(MadMediaLibraryTag &) = 0;
		virtual bool tag(MadMediaLibraryTag &, const char *name) = 0;
		virtual bool tag(MadMediaLibraryTag &, int i) = 0;
		virtual bool newTag(MadMediaLibraryTag &t, const char *name, const char *data = 0) = 0;
		virtual void endTag() = 0;


		// Items

		virtual bool beginItem() = 0;
		virtual bool step(MadMediaLibraryItem &) = 0;
		virtual bool item(MadMediaLibraryItem &, int i) = 0;
		virtual bool item(MadMediaLibraryItem &, const char *f) = 0;
		virtual bool newItem(MadMediaLibraryItem &, const char *f) = 0;
		virtual void endItem() = 0;

	private:

	protected:
		MadApp *app;
};

/* add endFile/endCategory, etc methods...

MadMediaLibraryItem
	+ categorys
	+ tags
	+ sub items (for grouping)

*/

// FIXME
class MadMediaLibraryItem {
	friend class MadMediaLibrary;
	public:
		MadMediaLibraryItem(MadMediaLibrary *library, int i) : lib(library), id(i) { };
		virtual ~MadMediaLibraryItem() { };

		// Sub Items
		virtual bool beginChild() = 0;
		virtual bool step(MadMediaLibraryItem &c) = 0;
		virtual void endChild() = 0;
		virtual bool newChild(MadMediaLibraryItem &c) = 0;
		virtual bool addChild(MadMediaLibraryItem &c) = 0;

		// Tags
		virtual bool beginTag() = 0;
		virtual bool step(MadMediaLibraryTag &) = 0;
		virtual void endTag() = 0;
		virtual bool tag(MadMediaLibraryTag &, const char *name) = 0;
		virtual bool tag(MadMediaLibraryTag &, int i) = 0;
		virtual bool addTag(MadMediaLibraryTag &t, const char *data) = 0;


		// Categories
		virtual bool beginCategory() = 0;
		virtual bool step(MadMediaLibraryCategory &) = 0;
		virtual void endCategory() = 0;
		virtual bool addCategory(MadMediaLibraryCategory &) = 0;

		int itemId() { return id; }
	private:
	protected:
		MadMediaLibrary *lib;
		int id;

};

class MadMediaLibraryCategory {
	friend class MadMediaLibraryItem;
	friend class MadMediaLibrary;

	public:
		MadMediaLibraryCategory(MadMediaLibrary *library, int i) : lib(library), /*category(0),*/ id(i) { };
		virtual ~MadMediaLibraryCategory() { };

		// Sub Categories
		virtual bool beginChild() = 0;
		virtual bool step(MadMediaLibraryCategory &c) = 0;
		virtual void endChild() = 0;
		virtual bool child(MadMediaLibraryCategory &c, int i) = 0;
		virtual bool child(MadMediaLibraryCategory &c, const char *n) = 0;
		virtual bool newChild(MadMediaLibraryCategory &c, const char *n, const char *d = 0) = 0;

		// Tags
		virtual bool beginTag() = 0;
		virtual bool step(MadMediaLibraryTag &) = 0;
		virtual void endTag() = 0;
		virtual bool tag(MadMediaLibraryTag &, const char *name) = 0;
		virtual bool tag(MadMediaLibraryTag &, int i) = 0;
		virtual bool addTag(MadMediaLibraryTag &t, const char *data) = 0;

		// Items
		virtual bool beginItem() = 0;
		virtual bool step(MadMediaLibraryItem &) = 0;
		virtual void endItem() = 0;

		int catId() { return id; }
	private:
	protected:
		MadMediaLibrary *lib;
		// need to do a regular accessor for this I think.
		//MadMediaLibraryCategory category;
		int id;
};

class MadMediaLibraryTag {
	public:
		MadMediaLibraryTag(MadMediaLibrary *l, int i, int iid=0) : lib(l), id(i), item_id(iid) { };
		virtual ~MadMediaLibraryTag() { };

		virtual const char *name() { return 0; };
		virtual bool name(const char *n) { return false; };
		virtual const char *data() { return 0; };
		virtual bool data(const char *) { return false; };

		int tagId() { return id; }
		int itemId() { return item_id; }
	private:
	protected:
		MadMediaLibrary *lib;
		int id, item_id;
};


#endif /* __MADMEDIALIBRARY_H__ */