00001
00002
00003
00004
00005
00006
00007
00008 #ifndef _OBJECT_H
00009 #define _OBJECT_H
00010
00011 #include "database.h"
00012 #include "../common.h"
00013 #include "../misc/util.h"
00014 #include <string.h>
00015 #include <vdr/tools.h>
00016 #include <map>
00017 #include <vector>
00018 #include <upnp/ixml.h>
00019
00025 struct cUPnPObjectID {
00026 int _ID;
00027
00032 cUPnPObjectID():_ID(-1){}
00038 cUPnPObjectID(
00039 long ID
00040 ){ _ID = (int)ID; }
00046 cUPnPObjectID(
00047 int ID
00048 ){ _ID = ID; }
00050 cUPnPObjectID &operator=(
00051 long ID
00052 ){ _ID = ID; return *this; }
00054 cUPnPObjectID &operator=(
00055 int ID
00056 ){ _ID = ID; return *this; }
00058 cUPnPObjectID &operator=(
00059 const cUPnPObjectID& ID
00060 ){ if(this != &ID){ _ID = ID._ID; } return *this; }
00062 cUPnPObjectID &operator++(){ _ID++; return *this; }
00064 cUPnPObjectID operator++(int){ cUPnPObjectID old = *this; _ID++; return old; }
00066 cUPnPObjectID operator--(int){ cUPnPObjectID old = *this; _ID--; return old; }
00068 cUPnPObjectID &operator--(){ _ID--; return *this; }
00070 bool operator!=(
00071 long ID
00072 ){ return _ID != ID; }
00074 bool operator==(
00075 long ID
00076 ){ return _ID == ID; }
00078 bool operator!=(
00079 int ID
00080 ){ return _ID != ID; }
00082 bool operator==(
00083 int ID
00084 ){ return _ID == ID; }
00086 bool operator!=(
00087 const cUPnPObjectID& ID
00088 ){ return *this == ID; }
00090 bool operator==(
00091 const cUPnPObjectID& ID
00092 ){ return *this == ID; }
00094 operator unsigned int(){ return (unsigned int)_ID; }
00096 operator int(){ return _ID; }
00098 operator long(){ return (long)_ID; }
00100 const char* operator*(){ char* buf; return asprintf(&buf,"%d",_ID)?buf:NULL; }
00101 };
00102
00108 struct cClass {
00109 cString ID;
00110 bool includeDerived;
00111
00116 bool operator==(const cClass &cmp){ return (!strcasecmp(cmp.ID,ID) && includeDerived==cmp.includeDerived); }
00118 bool operator!=(const cClass &cmp){ return !(*this==cmp); }
00119 };
00120
00126 class cUPnPResource : public cListObject {
00127 friend class cUPnPResourceMediator;
00128 friend class cUPnPResources;
00129 friend class cAudioVideoDetector;
00130 private:
00131 unsigned int mResourceID;
00132 cUPnPObjectID mObjectID;
00133 int mResourceType;
00134 cString mResource;
00135 cString mDuration;
00136 cString mResolution;
00137 cString mProtocolInfo;
00138 cString mContentType;
00139 cString mImportURI;
00140 unsigned long mSize;
00141 unsigned int mBitrate;
00142 unsigned int mSampleFrequency;
00143 unsigned int mBitsPerSample;
00144 unsigned int mNrAudioChannels;
00145 unsigned int mColorDepth;
00146 cUPnPResource();
00147 public:
00155 unsigned int getID() const { return this->mResourceID; }
00164 const char* getResource() const { return this->mResource; }
00172 const char* getDuration() const { return this->mDuration; }
00180 const char* getResolution() const { return this->mResolution; }
00188 const char* getProtocolInfo() const { return this->mProtocolInfo; }
00196 const char* getContentType() const { return this->mContentType; }
00205 const char* getImportURI() const { return this->mImportURI; }
00213 int getResourceType() const { return this->mResourceType; }
00221 unsigned long getSize() const { return this->mSize; }
00230 off64_t getFileSize() const;
00239 time_t getLastModification() const;
00247 unsigned int getBitrate() const { return this->mBitrate; }
00255 unsigned int getSampleFrequency() const { return this->mSampleFrequency; }
00263 unsigned int getBitsPerSample() const { return this->mBitsPerSample; }
00271 unsigned int getNrAudioChannels() const { return this->mNrAudioChannels; }
00279 unsigned int getColorDepth() const { return this->mColorDepth; }
00280 };
00281
00282 class cUPnPClassObject;
00283 class cUPnPObjectMediator;
00284 class cUPnPContainerMediator;
00285 class cUPnPClassContainer;
00286
00293 class cUPnPObjects : public cList<cUPnPClassObject> {
00294 public:
00295 cUPnPObjects();
00296 virtual ~cUPnPObjects();
00302 void SortBy(
00303 const char* Property,
00304 bool Descending = false
00305 );
00306 };
00307
00313 class cUPnPClassObject : public cListObject {
00314 friend class cMediaDatabase;
00315 friend class cUPnPObjectMediator;
00316 friend class cUPnPClassContainer;
00317 private:
00318 cUPnPObjectID mLastID;
00319 bool mDeleted;
00320 protected:
00321 time_t mLastModified;
00322 cUPnPObjectID mID;
00323 cUPnPClassObject* mParent;
00324 cString mClass;
00325 cString mTitle;
00326 cString mCreator;
00327 bool mRestricted;
00328 int mWriteStatus;
00329 cList<cUPnPResource>* mResources;
00330 cHash<cUPnPResource>* mResourcesID;
00331 IXML_Document* mDIDLFragment;
00332 cString mSortCriteria;
00333 bool mSortDescending;
00334 cUPnPClassObject();
00346 int setID(cUPnPObjectID ID);
00358 int setParent(cUPnPClassContainer* Parent);
00370 int setClass(const char* Class);
00377 void setModified(void){ this->mLastModified = time(NULL); }
00378 public:
00386 time_t modified() const { return this->mLastModified; }
00387 virtual ~cUPnPClassObject();
00400 virtual int Compare(const cListObject& ListObject) const;
00409 virtual cStringList* getPropertyList();
00422 virtual bool getProperty(const char* Property, char** Value) const ;
00435 virtual bool setProperty(const char* Property, const char* Value);
00446 virtual cUPnPClassContainer* getContainer(){ return NULL; }
00458 virtual IXML_Node* createDIDLFragment(IXML_Document* Document, cStringList* Filter) = 0;
00468 bool isContainer(){ return this->getContainer()==NULL?false:true; }
00477 void setSortCriteria(const char* Property, bool Descending = false);
00484 void clearSortCriteria();
00485
00497 int setTitle(const char* Title);
00508 int setCreator(const char* Creator);
00520 int setRestricted(bool Restricted);
00532 int setWriteStatus(int Status);
00544 int setResources(cList<cUPnPResource>* Resources);
00555 int addResource(cUPnPResource* Resource);
00566 int removeResource(cUPnPResource* Resource);
00567
00575 cUPnPObjectID getID() const { return this->mID; }
00584 cUPnPObjectID getParentID() const { return this->mParent?this->mParent->getID():cUPnPObjectID(-1); }
00593 cUPnPClassContainer* getParent() const { return (cUPnPClassContainer*)this->mParent; }
00602 const char* getTitle() const { return this->mTitle; }
00612 const char* getClass() const { return this->mClass; }
00621 const char* getCreator() const { return this->mCreator; }
00633 bool isRestricted() const { return this->mRestricted; }
00642 int getWriteStatus() const { return this->mWriteStatus; }
00651 cUPnPResource* getResource(unsigned int ResourceID) const { return this->mResourcesID->Get(ResourceID); }
00659 cList<cUPnPResource>* getResources() const { return this->mResources; }
00660 };
00661
00667 class cUPnPClassItem : public cUPnPClassObject {
00668 friend class cMediaDatabase;
00669 friend class cUPnPObjectMediator;
00670 friend class cUPnPItemMediator;
00671 protected:
00672
00673 cUPnPClassItem* mReference;
00674
00679 cUPnPClassItem();
00680 public:
00681 virtual ~cUPnPClassItem(){};
00682 virtual cStringList* getPropertyList();
00683 virtual IXML_Node* createDIDLFragment(IXML_Document* Document, cStringList* Filter);
00684 virtual bool setProperty(const char* Property, const char* Value);
00685 virtual bool getProperty(const char* Property, char** Value) const;
00686
00696 int setReference(cUPnPClassItem* Reference);
00697
00705 cUPnPClassItem* getReference() const { return this->mReference; }
00714 cUPnPObjectID getReferenceID() const { return this->mReference?this->mReference->getID():cUPnPObjectID(-1); }
00715 };
00716
00717 typedef std::vector<cClass> tClassVector;
00718
00724 class cUPnPClassContainer : public cUPnPClassObject {
00725 friend class cMediaDatabase;
00726 friend class cUPnPObjectMediator;
00727 friend class cUPnPContainerMediator;
00728 protected:
00729 cString mContainerType;
00730 tClassVector mSearchClasses;
00731 tClassVector mCreateClasses;
00732 bool mSearchable;
00733 unsigned int mUpdateID;
00734 cUPnPObjects* mChildren;
00735 cHash<cUPnPClassObject>* mChildrenID;
00736
00741 void update();
00753 int setUpdateID(unsigned int UID);
00759 cUPnPClassContainer();
00760 public:
00761 virtual ~cUPnPClassContainer();
00762 virtual cStringList* getPropertyList();
00763 virtual IXML_Node* createDIDLFragment(IXML_Document* Document, cStringList* Filter);
00764 virtual bool setProperty(const char* Property, const char* Value);
00765 virtual bool getProperty(const char* Property, char** Value) const;
00766 virtual cUPnPClassContainer* getContainer(){ return this; }
00775 void addObject(cUPnPClassObject* Object);
00784 void removeObject(cUPnPClassObject* Object);
00793 cUPnPClassObject* getObject(cUPnPObjectID ID) const;
00801 cUPnPObjects* getObjectList() const { return this->mChildren; }
00812 int addSearchClass(cClass SearchClass);
00823 int delSearchClass(cClass SearchClass);
00834 int addCreateClass(cClass CreateClass);
00845 int delCreateClass(cClass CreateClass);
00846
00857 int setContainerType(const char* Type);
00871 int setSearchClasses(std::vector<cClass> SearchClasses);
00883 int setCreateClasses(std::vector<cClass> CreateClasses);
00895 int setSearchable(bool Searchable);
00896
00906 const char* getContainerType() const { return this->mContainerType; }
00915 const std::vector<cClass>* getSearchClasses() const { return &(this->mSearchClasses); }
00926 const std::vector<cClass>* getCreateClasses() const { return &(this->mCreateClasses); }
00937 bool isSearchable() const { return this->mSearchable; }
00945 unsigned int getChildCount() const { return this->mChildren->Count(); }
00953 unsigned int getUpdateID() const { return this->mUpdateID; }
00964 bool isUpdated();
00965 };
00966
00972 class cUPnPClassVideoItem : public cUPnPClassItem {
00973 friend class cMediaDatabase;
00974 friend class cUPnPObjectMediator;
00975 friend class cUPnPVideoItemMediator;
00976 protected:
00977 cString mGenre;
00978 cString mDescription;
00979 cString mLongDescription;
00980 cString mPublishers;
00981 cString mLanguage;
00982 cString mRelations;
00983 cString mProducers;
00984 cString mRating;
00985 cString mActors;
00986 cString mDirectors;
00987
00992 cUPnPClassVideoItem();
00993 public:
00994 virtual ~cUPnPClassVideoItem();
00995
00996 virtual cStringList* getPropertyList();
00997 virtual bool setProperty(const char* Property, const char* Value);
00998 virtual bool getProperty(const char* Property, char** Value) const;
00999
01011 int setLongDescription(const char* LongDescription);
01024 int setDescription(const char* Description);
01035 int setPublishers(const char* Publishers);
01049 int setGenre(const char* Genre);
01062 int setLanguage(const char* Language);
01076 int setRelations(const char* Relations);
01087 int setDirectors(const char* Directors);
01099 int setActors(const char* Actors);
01111 int setProducers(const char* Producers);
01123 int setRating(const char* Rating);
01124
01132 const char* getGenre() const { return this->mGenre; }
01140 const char* getLongDescription() const { return this->mLongDescription; }
01148 const char* getDescription() const { return this->mDescription; }
01156 const char* getPublishers() const { return this->mPublishers; }
01164 const char* getLanguage() const { return this->mLanguage; }
01172 const char* getRelations() const { return this->mRelations; }
01180 const char* getActors() const { return this->mActors; }
01188 const char* getProducers() const { return this->mProducers; }
01196 const char* getDirectors() const { return this->mDirectors; }
01204 const char* getRating() const { return this->mRating; }
01205 };
01206
01212 class cUPnPClassMovie : public cUPnPClassVideoItem {
01213 friend class cMediaDatabase;
01214 friend class cUPnPObjectMediator;
01215 friend class cUPnPMovieMediator;
01216 protected:
01217 int mDVDRegionCode;
01218 cString mStorageMedium;
01219
01224 cUPnPClassMovie();
01225 public:
01226 virtual ~cUPnPClassMovie();
01227
01228 virtual cStringList* getPropertyList();
01229 virtual bool setProperty(const char* Property, const char* Value);
01230 virtual bool getProperty(const char* Property, char** Value) const;
01231
01245 int setDVDRegionCode(int RegionCode);
01258 int setStorageMedium(const char* StorageMedium);
01259
01271 int getDVDRegionCode() const { return this->mDVDRegionCode; }
01279 const char* getStorageMedium() const { return this->mStorageMedium; }
01280 };
01281
01287 class cUPnPClassVideoBroadcast : public cUPnPClassVideoItem {
01288 friend class cMediaDatabase;
01289 friend class cUPnPObjectMediator;
01290 friend class cUPnPVideoBroadcastMediator;
01291 protected:
01292 cString mIcon;
01293 cString mRegion;
01294 int mChannelNr;
01295 cString mChannelName;
01296
01301 cUPnPClassVideoBroadcast();
01302 public:
01303 virtual ~cUPnPClassVideoBroadcast();
01304
01305 virtual cStringList* getPropertyList();
01306 virtual bool setProperty(const char* Property, const char* Value);
01307 virtual bool getProperty(const char* Property, char** Value) const;
01308
01320 int setIcon(const char* IconURI);
01331 int setRegion(const char* Region);
01343 int setChannelNr(int ChannelNr);
01354 int setChannelName(const char* ChannelName);
01355
01363 const char* getIcon() const { return this->mIcon; }
01371 const char* getRegion() const { return this->mRegion; }
01379 int getChannelNr() const { return this->mChannelNr; }
01387 const char* getChannelName() const { return this->mChannelName; }
01388 };
01389
01396 class cMediatorInterface {
01397 public:
01398 virtual ~cMediatorInterface(){};
01408 virtual cUPnPClassObject* createObject(const char* Title, bool Restricted) = 0;
01418 virtual cUPnPClassObject* getObject(cUPnPObjectID ID) = 0;
01430 virtual int saveObject(cUPnPClassObject* Object) = 0;
01442 virtual int deleteObject(cUPnPClassObject* Object) = 0;
01454 virtual int clearObject(cUPnPClassObject* Object) = 0;
01455 };
01456
01457 typedef std::map<const char*, cMediatorInterface*, strCmp> tMediatorMap;
01458
01469 class cUPnPObjectFactory {
01470 private:
01471 static cUPnPObjectFactory* mInstance;
01472 cSQLiteDatabase* mDatabase;
01473 tMediatorMap mMediators;
01474 cMediatorInterface* findMediatorByID(cUPnPObjectID ID);
01475 cMediatorInterface* findMediatorByClass(const char* Class);
01476 cUPnPObjectFactory();
01477 public:
01487 static cUPnPObjectFactory* getInstance();
01498 void registerMediator(const char* UPnPClass, cMediatorInterface* Mediator);
01509 void unregisterMediator(const char* UPnPClass, bool freeMediator=true);
01515 cUPnPClassObject* createObject(const char* UPnPClass, const char* Title, bool Restricted=true);
01517 cUPnPClassObject* getObject(cUPnPObjectID ID);
01519 int saveObject(cUPnPClassObject* Object);
01521 int deleteObject(cUPnPClassObject* Object);
01523 int clearObject(cUPnPClassObject* Object);
01524 };
01525
01526 class cMediaDatabase;
01527
01535 class cUPnPObjectMediator : public cMediatorInterface {
01536 protected:
01537 cSQLiteDatabase* mDatabase;
01538 cMediaDatabase* mMediaDatabase;
01539
01545 cUPnPObjectMediator(
01546 cMediaDatabase* MediaDatabase
01547 );
01558 virtual int initializeObject(
01559 cUPnPClassObject* Object,
01560 const char* Class,
01561 const char* Title,
01562 bool Restricted
01563 );
01574 virtual int objectToDatabase(cUPnPClassObject* Object);
01586 virtual int databaseToObject(cUPnPClassObject* Object, cUPnPObjectID ID);
01587 public:
01588 virtual ~cUPnPObjectMediator();
01590 virtual cUPnPClassObject* createObject(const char* Title, bool Restricted);
01592 virtual cUPnPClassObject* getObject(cUPnPObjectID ID);
01594 virtual int saveObject(cUPnPClassObject* Object);
01596 virtual int deleteObject(cUPnPClassObject* Object);
01598 virtual int clearObject(cUPnPClassObject* Object);
01599 };
01600
01608 class cUPnPItemMediator : public cUPnPObjectMediator {
01609 protected:
01611 virtual int objectToDatabase(cUPnPClassObject* Object);
01613 virtual int databaseToObject(cUPnPClassObject* Object, cUPnPObjectID ID);
01614 public:
01623 cUPnPItemMediator(cMediaDatabase* MediaDatabase);
01624 virtual ~cUPnPItemMediator(){};
01626 virtual cUPnPClassItem* createObject(const char* Title, bool Restricted);
01628 virtual cUPnPClassItem* getObject(cUPnPObjectID ID);
01629 };
01630
01638 class cUPnPVideoItemMediator : public cUPnPItemMediator {
01639 protected:
01640 virtual int objectToDatabase(cUPnPClassObject* Object);
01641 virtual int databaseToObject(cUPnPClassObject* Object, cUPnPObjectID ID);
01642 public:
01651 cUPnPVideoItemMediator(cMediaDatabase* MediaDatabase);
01652 virtual ~cUPnPVideoItemMediator(){};
01653 virtual cUPnPClassVideoItem* createObject(const char* Title, bool Restricted);
01654 virtual cUPnPClassVideoItem* getObject(cUPnPObjectID ID);
01655 };
01656
01664 class cUPnPVideoBroadcastMediator : public cUPnPVideoItemMediator {
01665 protected:
01666 virtual int objectToDatabase(cUPnPClassObject* Object);
01667 virtual int databaseToObject(cUPnPClassObject* Object, cUPnPObjectID ID);
01668 public:
01677 cUPnPVideoBroadcastMediator(cMediaDatabase* MediaDatabase);
01678 virtual ~cUPnPVideoBroadcastMediator(){};
01679 virtual cUPnPClassVideoBroadcast* createObject(const char* Title, bool Restricted);
01680 virtual cUPnPClassVideoBroadcast* getObject(cUPnPObjectID ID);
01681 };
01682
01690 class cUPnPMovieMediator : public cUPnPVideoItemMediator {
01691 protected:
01692 virtual int objectToDatabase(cUPnPClassObject* Object);
01693 virtual int databaseToObject(cUPnPClassObject* Object, cUPnPObjectID ID);
01694 public:
01703 cUPnPMovieMediator(cMediaDatabase* MediaDatabase);
01704 virtual ~cUPnPMovieMediator(){};
01705 virtual cUPnPClassMovie* createObject(const char* Title, bool Restricted);
01706 virtual cUPnPClassMovie* getObject(cUPnPObjectID ID);
01707 };
01708
01716 class cUPnPContainerMediator : public cUPnPObjectMediator {
01717 protected:
01718 virtual int objectToDatabase(cUPnPClassObject* Object);
01719 virtual int databaseToObject(cUPnPClassObject* Object, cUPnPObjectID ID);
01720 public:
01729 cUPnPContainerMediator(cMediaDatabase* MediaDatabase);
01730 virtual ~cUPnPContainerMediator(){};
01731 virtual cUPnPClassContainer* createObject(const char* Title, bool Restricted);
01732 virtual cUPnPClassContainer* getObject(cUPnPObjectID ID);
01733 };
01734
01735 #endif
01736