summaryrefslogtreecommitdiff
path: root/database/object.h
diff options
context:
space:
mode:
Diffstat (limited to 'database/object.h')
-rw-r--r--database/object.h397
1 files changed, 397 insertions, 0 deletions
diff --git a/database/object.h b/database/object.h
new file mode 100644
index 0000000..9b62c54
--- /dev/null
+++ b/database/object.h
@@ -0,0 +1,397 @@
+/*
+ * File: object.h
+ * Author: savop
+ *
+ * Created on 11. September 2009, 20:39
+ */
+
+#ifndef _OBJECT_H
+#define _OBJECT_H
+
+#include "database.h"
+#include "../common.h"
+#include "../misc/util.h"
+#include <string.h>
+#include <vdr/tools.h>
+#include <map>
+#include <vector>
+#include <upnp/ixml.h>
+
+struct cUPnPObjectID {
+ int _ID;
+ cUPnPObjectID():_ID(-1){}
+ cUPnPObjectID(long ID){ _ID = (int)ID; }
+ cUPnPObjectID(int ID){ _ID = ID; }
+ cUPnPObjectID &operator=(long ID){ _ID = ID; return *this; }
+ cUPnPObjectID &operator=(int ID){ _ID = ID; return *this; }
+ cUPnPObjectID &operator=(const cUPnPObjectID& ID){ if(this != &ID){ _ID = ID._ID; } return *this; }
+ cUPnPObjectID &operator++(){ _ID++; return *this; }
+ cUPnPObjectID operator++(int){ cUPnPObjectID old = *this; _ID++; return old; }
+ cUPnPObjectID operator--(int){ cUPnPObjectID old = *this; _ID--; return old; }
+ cUPnPObjectID &operator--(){ _ID--; return *this; }
+ bool operator!=(long ID){ return _ID != ID; }
+ bool operator==(long ID){ return _ID == ID; }
+ bool operator!=(int ID){ return _ID != ID; }
+ bool operator==(int ID){ return _ID == ID; }
+ bool operator!=(const cUPnPObjectID& ID){ return *this == ID; }
+ bool operator==(const cUPnPObjectID& ID){ return *this == ID; }
+ operator unsigned int(){ return (unsigned int)_ID; }
+ operator int(){ return _ID; }
+ operator long(){ return (long)_ID; }
+ const char* operator*(){ char* buf; return asprintf(&buf,"%d",_ID)?buf:NULL; }
+};
+
+struct cClass {
+ cString ID;
+ bool includeDerived;
+ bool operator==(const cClass &cmp){ return (!strcasecmp(cmp.ID,ID) && includeDerived==cmp.includeDerived); }
+ bool operator!=(const cClass &cmp){ return !(*this==cmp); }
+};
+
+class cUPnPResource : public cListObject {
+ friend class cUPnPResourceMediator;
+ friend class cUPnPResources;
+private:
+ unsigned int mResourceID;
+ cUPnPObjectID mObjectID;
+ int mResourceType;
+ cString mResource;
+ cString mDuration;
+ cString mResolution;
+ cString mProtocolInfo;
+ cString mContentType;
+ cString mImportURI;
+ unsigned long mSize;
+ unsigned int mBitrate;
+ unsigned int mSampleFrequency;
+ unsigned int mBitsPerSample;
+ unsigned int mNrAudioChannels;
+ unsigned int mColorDepth;
+ cUPnPResource();
+public:
+ unsigned int getID() const { return this->mResourceID; }
+ const char* getResource() const { return this->mResource; }
+ const char* getDuration() const { return this->mDuration; }
+ const char* getResolution() const { return this->mResolution; }
+ const char* getProtocolInfo() const { return this->mProtocolInfo; }
+ const char* getContentType() const { return this->mContentType; }
+ const char* getImportURI() const { return this->mImportURI; }
+ int getResourceType() const { return this->mResourceType; }
+ unsigned long getSize() const { return this->mSize; }
+ off64_t getFileSize() const;
+ time_t getLastModification() const;
+ unsigned int getBitrate() const { return this->mBitrate; }
+ unsigned int getSampleFrequency() const { return this->mSampleFrequency; }
+ unsigned int getBitsPerSample() const { return this->mBitsPerSample; }
+ unsigned int getNrAudioChannels() const { return this->mNrAudioChannels; }
+ unsigned int getColorDepth() const { return this->mColorDepth; }
+};
+
+class cUPnPClassObject;
+class cUPnPObjectMediator;
+class cUPnPContainerMediator;
+class cUPnPClassContainer;
+
+class cUPnPObjects : public cList<cUPnPClassObject> {
+public:
+ cUPnPObjects();
+ virtual ~cUPnPObjects();
+ void SortBy(const char* Property, bool Descending = false);
+};
+
+class cUPnPClassObject : public cListObject {
+ friend class cMediaDatabase;
+ friend class cUPnPObjectMediator;
+ friend class cUPnPClassContainer;
+private:
+ bool mDeleted; // is this Objected marked as deleted
+protected:
+ time_t mLastModified;
+ cUPnPObjectID mID; // The object ID
+ cUPnPClassObject* mParent;
+ cString mClass; // Class (Who am I?)
+ cString mTitle; // Object title
+ cString mCreator; // Creator of this object
+ bool mRestricted; // Ability of changing metadata?
+ int mWriteStatus; // Ability of writing resources?
+ cList<cUPnPResource>* mResources; // The resources of this object
+ cHash<cUPnPResource>* mResourcesID;
+ IXML_Document* mDIDLFragment;
+ cString mSortCriteria;
+ bool mSortDescending;
+ cUPnPClassObject();
+ int setID(cUPnPObjectID ID);
+ int setParent(cUPnPClassContainer* Parent);
+ int setClass(const char* Class);
+ void setModified(void){ this->mLastModified = time(NULL); }
+public:
+ time_t modified() const { return this->mLastModified; }
+ virtual ~cUPnPClassObject();
+ virtual int Compare(const cListObject& ListObject) const;
+ virtual cStringList* getPropertyList();
+ virtual bool getProperty(const char* Property, char** Value) const ;
+ virtual bool setProperty(const char* Property, const char* Value);
+ virtual cUPnPClassContainer* getContainer(){ return NULL; }
+ virtual IXML_Node* createDIDLFragment(IXML_Document* Document, cStringList* Filter) = 0;
+ bool isContainer(){ return this->getContainer()==NULL?false:true; }
+ void setSortCriteria(const char* Property, bool Descending = false);
+ void clearSortCriteria();
+ /******* Setter *******/
+ int setTitle(const char* Title);
+ int setCreator(const char* Creator);
+ int setRestricted(bool Restricted);
+ int setWriteStatus(int Status);
+ int setResources(cList<cUPnPResource>* Resources);
+ int addResource(cUPnPResource* Resource);
+ int removeResource(cUPnPResource* Resource);
+ /******* Getter *******/
+ cUPnPObjectID getID() const { return this->mID; }
+ cUPnPObjectID getParentID() const { return this->mParent?this->mParent->getID():cUPnPObjectID(-1); }
+ cUPnPClassContainer* getParent() const { return (cUPnPClassContainer*)this->mParent; }
+ const char* getTitle() const { return this->mTitle; }
+ const char* getClass() const { return this->mClass; }
+ const char* getCreator() const { return this->mCreator; }
+ bool isRestricted() const { return this->mRestricted; }
+ int getWriteStatus() const { return this->mWriteStatus; }
+ cUPnPResource* getResource(unsigned int ResourceID) const { return this->mResourcesID->Get(ResourceID); }
+ cList<cUPnPResource>* getResources() const { return this->mResources; }
+};
+
+class cUPnPClassItem : public cUPnPClassObject {
+ friend class cMediaDatabase;
+ friend class cUPnPObjectMediator;
+ friend class cUPnPItemMediator;
+protected:
+// cUPnPObjectID mReferenceID;
+ cUPnPClassItem* mReference;
+ cUPnPClassItem();
+public:
+ virtual ~cUPnPClassItem(){};
+ virtual cStringList* getPropertyList();
+ virtual IXML_Node* createDIDLFragment(IXML_Document* Document, cStringList* Filter);
+ virtual bool setProperty(const char* Property, const char* Value);
+ virtual bool getProperty(const char* Property, char** Value) const;
+ /******** Setter ********/
+ int setReference(cUPnPClassItem* Reference);
+ /******** Getter ********/
+ cUPnPClassItem* getReference() const { return this->mReference; }
+ cUPnPObjectID getReferenceID() const { return this->mReference?this->mReference->getID():cUPnPObjectID(-1); }
+};
+
+typedef std::vector<cClass> tClassVector;
+
+class cUPnPClassContainer : public cUPnPClassObject {
+ friend class cMediaDatabase;
+ friend class cUPnPObjectMediator;
+ friend class cUPnPContainerMediator;
+protected:
+ cString mContainerType;
+ tClassVector mSearchClasses;
+ tClassVector mCreateClasses;
+ bool mSearchable;
+ unsigned int mUpdateID;
+ cUPnPObjects* mChildren;
+ cHash<cUPnPClassObject>* mChildrenID;
+ void update();
+ int setUpdateID(unsigned int UID);
+ cUPnPClassContainer();
+public:
+ virtual ~cUPnPClassContainer();
+ virtual cStringList* getPropertyList();
+ virtual IXML_Node* createDIDLFragment(IXML_Document* Document, cStringList* Filter);
+ virtual bool setProperty(const char* Property, const char* Value);
+ virtual bool getProperty(const char* Property, char** Value) const;
+ virtual cUPnPClassContainer* getContainer(){ return this; }
+ void addObject(cUPnPClassObject* Object);
+ void removeObject(cUPnPClassObject* Object);
+ cUPnPClassObject* getObject(cUPnPObjectID ID) const;
+ cUPnPObjects* getObjectList() const { return this->mChildren; }
+ int addSearchClass(cClass SearchClass);
+ int delSearchClass(cClass SearchClass);
+ int addCreateClass(cClass CreateClass);
+ int delCreateClass(cClass CreateClass);
+ /******** Setter ********/
+ int setContainerType(const char* Type);
+ int setSearchClasses(std::vector<cClass> SearchClasses);
+ int setCreateClasses(std::vector<cClass> CreateClasses);
+ int setSearchable(bool Searchable);
+ /******** Getter ********/
+ const char* getContainerType() const { return this->mContainerType; }
+ const std::vector<cClass>* getSearchClasses() const { return &(this->mSearchClasses); }
+ const std::vector<cClass>* getCreateClasses() const { return &(this->mCreateClasses); }
+ bool isSearchable() const { return this->mSearchable; }
+ unsigned int getChildCount() const { return this->mChildren->Count(); }
+ unsigned int getUpdateID() const { return this->mUpdateID; }
+ bool isUpdated();
+};
+
+class cUPnPClassVideoItem : public cUPnPClassItem {
+ friend class cMediaDatabase;
+ friend class cUPnPObjectMediator;
+ friend class cUPnPVideoItemMediator;
+protected:
+ cString mGenre; // Genre
+ cString mDescription; // Description
+ cString mLongDescription; // a longer description
+ cString mPublishers; // CSV of Publishers
+ cString mLanguage; // RFC 1766 Language code
+ cString mRelations; // Relation to other contents
+ cString mProducers; // CSV of Producers
+ cString mRating; // Rating (for parential control)
+ cString mActors; // CSV of Actors
+ cString mDirectors; // CSV of Directors
+ cUPnPClassVideoItem();
+public:
+ virtual ~cUPnPClassVideoItem();
+ //virtual cString createDIDLFragment(cStringList* Filter);
+ virtual cStringList* getPropertyList();
+ virtual bool setProperty(const char* Property, const char* Value);
+ virtual bool getProperty(const char* Property, char** Value) const;
+ /******** Setter ********/
+ int setLongDescription(const char* LongDescription);
+ int setDescription(const char* Description);
+ int setPublishers(const char* Publishers);
+ int setGenre(const char* Genre);
+ int setLanguage(const char* Language);
+ int setRelations(const char* Relations);
+ int setDirectors(const char* Directors);
+ int setActors(const char* Actors);
+ int setProducers(const char* Producers);
+ int setRating(const char* Rating);
+ /******** Getter ********/
+ const char* getGenre() const { return this->mGenre; }
+ const char* getLongDescription() const { return this->mLongDescription; }
+ const char* getDescription() const { return this->mDescription; }
+ const char* getPublishers() const { return this->mPublishers; }
+ const char* getLanguage() const { return this->mLanguage; }
+ const char* getRelations() const { return this->mRelations; }
+ const char* getActors() const { return this->mActors; }
+ const char* getProducers() const { return this->mProducers; }
+ const char* getDirectors() const { return this->mDirectors; }
+ const char* getRating() const { return this->mRating; }
+};
+
+class cUPnPClassVideoBroadcast : public cUPnPClassVideoItem {
+ friend class cMediaDatabase;
+ friend class cUPnPObjectMediator;
+ friend class cUPnPVideoBroadcastMediator;
+protected:
+ cString mIcon;
+ cString mRegion;
+ int mChannelNr;
+ cString mChannelName;
+ cUPnPClassVideoBroadcast();
+public:
+ virtual ~cUPnPClassVideoBroadcast();
+ //virtual cString createDIDLFragment(cStringList* Filter);
+ virtual cStringList* getPropertyList();
+ virtual bool setProperty(const char* Property, const char* Value);
+ virtual bool getProperty(const char* Property, char** Value) const;
+ /******** Setter ********/
+ int setIcon(const char* IconURI);
+ int setRegion(const char* Region);
+ int setChannelNr(int ChannelNr);
+ int setChannelName(const char* ChannelName);
+ /******** Getter ********/
+ const char* getIcon() const { return this->mIcon; }
+ const char* getRegion() const { return this->mRegion; }
+ int getChannelNr() const { return this->mChannelNr; }
+ const char* getChannelName() const { return this->mChannelName; }
+};
+
+class cMediatorInterface {
+public:
+ virtual ~cMediatorInterface(){};
+ virtual cUPnPClassObject* createObject(const char* Title, bool Restricted) = 0;
+ virtual cUPnPClassObject* getObject(cUPnPObjectID ID) = 0;
+ virtual int saveObject(cUPnPClassObject* Object) = 0;
+ virtual int deleteObject(cUPnPClassObject* Object) = 0;
+ virtual int clearObject(cUPnPClassObject* Object) = 0;
+};
+
+typedef std::map<const char*, cMediatorInterface*, strCmp> tMediatorMap;
+
+class cUPnPObjectFactory {
+private:
+ static cUPnPObjectFactory* mInstance;
+ cSQLiteDatabase* mDatabase;
+ tMediatorMap mMediators;
+ cMediatorInterface* findMediatorByID(cUPnPObjectID ID);
+ cMediatorInterface* findMediatorByClass(const char* Class);
+ cUPnPObjectFactory();
+public:
+ static cUPnPObjectFactory* getInstance();
+ void registerMediator(const char* UPnPClass, cMediatorInterface* Mediator);
+ void unregisterMediator(const char* UPnPClass, bool freeMediator=true);
+ cUPnPClassObject* createObject(const char* UPnPClass, const char* Title, bool Restricted=true);
+ cUPnPClassObject* getObject(cUPnPObjectID ID);
+ int saveObject(cUPnPClassObject* Object);
+ int deleteObject(cUPnPClassObject* Object);
+ int clearObject(cUPnPClassObject* Object);
+};
+
+class cMediaDatabase;
+
+class cUPnPObjectMediator : public cMediatorInterface {
+protected:
+ cSQLiteDatabase* mDatabase;
+ cMediaDatabase* mMediaDatabase;
+ cUPnPObjectMediator(cMediaDatabase* MediaDatabase);
+ virtual int initializeObject(cUPnPClassObject* Object, const char* Class, const char* Title, bool Restricted);
+ virtual int objectToDatabase(cUPnPClassObject* Object);
+ virtual int databaseToObject(cUPnPClassObject* Object, cUPnPObjectID ID);
+public:
+ virtual ~cUPnPObjectMediator();
+ virtual cUPnPClassObject* createObject(const char* Title, bool Restricted);
+ virtual cUPnPClassObject* getObject(cUPnPObjectID);
+ virtual int saveObject(cUPnPClassObject* Object);
+ virtual int deleteObject(cUPnPClassObject* Object);
+ virtual int clearObject(cUPnPClassObject* Object);
+};
+
+class cUPnPItemMediator : public cUPnPObjectMediator {
+protected:
+ virtual int objectToDatabase(cUPnPClassObject* Object);
+ virtual int databaseToObject(cUPnPClassObject* Object, cUPnPObjectID ID);
+public:
+ cUPnPItemMediator(cMediaDatabase* MediaDatabase);
+ virtual ~cUPnPItemMediator(){};
+ virtual cUPnPClassItem* createObject(const char* Title, bool Restricted);
+ virtual cUPnPClassItem* getObject(cUPnPObjectID ID);
+};
+
+class cUPnPVideoItemMediator : public cUPnPItemMediator {
+protected:
+ virtual int objectToDatabase(cUPnPClassObject* Object);
+ virtual int databaseToObject(cUPnPClassObject* Object, cUPnPObjectID ID);
+public:
+ cUPnPVideoItemMediator(cMediaDatabase* MediaDatabase);
+ virtual ~cUPnPVideoItemMediator(){};
+ virtual cUPnPClassVideoItem* createObject(const char* Title, bool Restricted);
+ virtual cUPnPClassVideoItem* getObject(cUPnPObjectID ID);
+};
+
+class cUPnPVideoBroadcastMediator : public cUPnPVideoItemMediator {
+protected:
+ virtual int objectToDatabase(cUPnPClassObject* Object);
+ virtual int databaseToObject(cUPnPClassObject* Object, cUPnPObjectID ID);
+public:
+ cUPnPVideoBroadcastMediator(cMediaDatabase* MediaDatabase);
+ virtual ~cUPnPVideoBroadcastMediator(){};
+ virtual cUPnPClassVideoBroadcast* createObject(const char* Title, bool Restricted);
+ virtual cUPnPClassVideoBroadcast* getObject(cUPnPObjectID ID);
+};
+
+class cUPnPContainerMediator : public cUPnPObjectMediator {
+protected:
+ virtual int objectToDatabase(cUPnPClassObject* Object);
+ virtual int databaseToObject(cUPnPClassObject* Object, cUPnPObjectID ID);
+public:
+ cUPnPContainerMediator(cMediaDatabase* MediaDatabase);
+ virtual ~cUPnPContainerMediator(){};
+ virtual cUPnPClassContainer* createObject(const char* Title, bool Restricted);
+ virtual cUPnPClassContainer* getObject(cUPnPObjectID ID);
+};
+
+#endif /* _OBJECT_H */
+