X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/1aeefd997cc362c3b37c1587c5f08891b35c3a75..4cd594ce7621755ce7a81a3f2bd6a31e5323e2a3:/lib/service/iservice.h?ds=inline diff --git a/lib/service/iservice.h b/lib/service/iservice.h index 253f8c3b..15631fda 100644 --- a/lib/service/iservice.h +++ b/lib/service/iservice.h @@ -1,8 +1,9 @@ #ifndef __lib_dvb_iservice_h #define __lib_dvb_iservice_h +#include #include -#include +#include #include #include @@ -41,7 +42,11 @@ public: inline int getSortKey() const { return (flags & hasSortKey) ? data[3] : ((flags & sort1) ? 1 : 0); } int data[8]; - eString path; + std::string path; + +// only for override service names in bouquets or to give servicerefs a name which not have a +// real existing service ( for dvb eServiceDVB ) + std::string name; eServiceReference() : type(idInvalid), flags(0) @@ -93,13 +98,13 @@ public: data[3]=data3; data[4]=data4; } - eServiceReference(int type, int flags, const eString &path) + eServiceReference(int type, int flags, const std::string &path) : type(type), flags(flags), path(path) { memset(data, 0, sizeof(data)); } - eServiceReference(const eString &string); - eString toString() const; + eServiceReference(const std::string &string); + std::string toString() const; bool operator==(const eServiceReference &c) const { if (type != c.type) @@ -129,17 +134,65 @@ public: return path < c.path; } operator bool() const + { + return valid(); + } + + int valid() const { return type != idInvalid; } }; +SWIG_ALLOW_OUTPUT_SIMPLE(eServiceReference); + +typedef unsigned long long pts_t; + + /* the reason we have the servicereference as additional argument is + that we don't have to create one object for every entry in a possibly + large list, provided that no state information is nessesary to deliver + the required information. Anyway - ref *must* be the same as the argument + to the info() or getIServiceInformation call! */ + + /* About the usage of SWIG_VOID: + SWIG_VOID(real_returntype_t) hides a return value from swig. This is used for + the "superflouus" RESULT return values. + + Python code has to check the returned pointer against 0. This works, + as all functions returning instances in smartpointers AND having a + RESULT have to BOTH return non-zero AND set the pointer to zero. + + Python code thus can't check for the reason, but the reason isn't + user-servicable anyway. If you want to return a real reason which + goes beyong "it just doesn't work", use extra variables for this, + not the RESULT. + + Hide the result only if there is another way to check for failure! */ + +class iStaticServiceInformation: public iObject +{ +public: + virtual SWIG_VOID(RESULT) getName(const eServiceReference &ref, std::string &SWIG_OUTPUT)=0; + + // doesn't need to be implemented, should return -1 then. + virtual int getLength(const eServiceReference &ref)=0; +}; + +TEMPLATE_TYPEDEF(ePtr, iStaticServiceInformationPtr); + +class eServiceEvent; + +TEMPLATE_TYPEDEF(ePtr, eServiceEventPtr); + class iServiceInformation: public iObject { public: - virtual RESULT getName(eString &name)=0; + virtual SWIG_VOID(RESULT) getName(std::string &SWIG_OUTPUT)=0; + virtual SWIG_VOID(RESULT) getEvent(ePtr &SWIG_OUTPUT, int nownext); }; +TEMPLATE_TYPEDEF(ePtr, iServiceInformationPtr); + class iPauseableService: public iObject { public: @@ -147,6 +200,20 @@ public: virtual RESULT unpause()=0; }; +TEMPLATE_TYPEDEF(ePtr, iPauseableServicePtr); + +class iSeekableService: public iObject +{ +public: + virtual RESULT getLength(pts_t &SWIG_OUTPUT)=0; + virtual RESULT seekTo(pts_t to)=0; + enum { dirForward = +1, dirBackward = -1 }; + virtual RESULT seekRelative(int direction, pts_t to)=0; + virtual RESULT getPlayPosition(pts_t &SWIG_OUTPUT)=0; +}; + +TEMPLATE_TYPEDEF(ePtr, iSeekableServicePtr); + class iPlayableService: public iObject { friend class iServiceHandler; @@ -154,34 +221,89 @@ public: enum { evStart, - evEnd + evEnd, + + evTuneFailed, + // when iServiceInformation is implemented: + evUpdatedEventInfo }; virtual RESULT connectEvent(const Slot2 &event, ePtr &connection)=0; virtual RESULT start()=0; virtual RESULT stop()=0; - virtual RESULT getIPausableService(ePtr &ptr)=0; - virtual RESULT getIServiceInformation(ePtr &ptr)=0; + virtual SWIG_VOID(RESULT) seek(ePtr &SWIG_OUTPUT)=0; + virtual SWIG_VOID(RESULT) pause(ePtr &SWIG_OUTPUT)=0; + virtual SWIG_VOID(RESULT) info(ePtr &SWIG_OUTPUT)=0; }; +TEMPLATE_TYPEDEF(ePtr, iPlayableServicePtr); + class iRecordableService: public iObject { public: + virtual RESULT prepare(const char *filename)=0; virtual RESULT start()=0; virtual RESULT stop()=0; }; +TEMPLATE_TYPEDEF(ePtr, iRecordableServicePtr); + +// TEMPLATE_TYPEDEF(std::list, eServiceReferenceList); + class iListableService: public iObject { public: + /* legacy interface: get a list */ virtual RESULT getContent(std::list &list)=0; + + /* new, shiny interface: streaming. */ + virtual SWIG_VOID(RESULT) getNext(eServiceReference &SWIG_OUTPUT)=0; + + /* use this for sorting. output is not sorted because of either + - performance reasons: the whole list must be buffered or + - the interface would be restricted to a list. streaming + (as well as a future "active" extension) won't be possible. + */ + virtual int compareLessEqual(const eServiceReference &, const eServiceReference &)=0; +}; + +TEMPLATE_TYPEDEF(ePtr, iListableServicePtr); + + /* a helper class which can be used as argument to stl's sort(). */ +class iListableServiceCompare +{ + ePtr m_list; +public: + iListableServiceCompare(iListableService *list): m_list(list) { } + bool operator()(const eServiceReference &a, const eServiceReference &b) + { + return m_list->compareLessEqual(a, b); + } }; +class iServiceOfflineOperations: public iObject +{ +public: + /* to delete a service, forever. */ + virtual RESULT deleteFromDisk(int simulate=1)=0; + + /* for transferring a service... */ + virtual SWIG_VOID(RESULT) getListOfFilenames(std::list &SWIG_OUTPUT)=0; + + // TODO: additional stuff, like a conversion interface? +}; + +TEMPLATE_TYPEDEF(ePtr, iServiceOfflineOperationsPtr); + class iServiceHandler: public iObject { public: - virtual RESULT play(const eServiceReference &, ePtr &ptr)=0; - virtual RESULT record(const eServiceReference &, ePtr &ptr)=0; - virtual RESULT list(const eServiceReference &, ePtr &ptr)=0; + virtual SWIG_VOID(RESULT) play(const eServiceReference &, ePtr &SWIG_OUTPUT)=0; + virtual SWIG_VOID(RESULT) record(const eServiceReference &, ePtr &SWIG_OUTPUT)=0; + virtual SWIG_VOID(RESULT) list(const eServiceReference &, ePtr &SWIG_OUTPUT)=0; + virtual SWIG_VOID(RESULT) info(const eServiceReference &, ePtr &SWIG_OUTPUT)=0; + virtual SWIG_VOID(RESULT) offlineOperations(const eServiceReference &, ePtr &SWIG_OUTPUT)=0; }; +TEMPLATE_TYPEDEF(ePtr, iServiceHandlerPtr); + #endif