X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/1cdf6cb021fcaa6548b90ba7b6765cf1e8b8b37b..c7239788f111d2a6a8ca3bb8b95b72579095bad4:/lib/service/iservice.h diff --git a/lib/service/iservice.h b/lib/service/iservice.h index c58421ed..31c1c99d 100644 --- a/lib/service/iservice.h +++ b/lib/service/iservice.h @@ -1,11 +1,15 @@ #ifndef __lib_dvb_iservice_h #define __lib_dvb_iservice_h +#include +#include #include #include #include #include +class eServiceEvent; + class eServiceReference { public: @@ -19,7 +23,6 @@ public: }; int type; - int flags; // flags will NOT be compared. enum { isDirectory=1, // SHOULD enter (implies mustDescent) @@ -35,19 +38,60 @@ public: flagDirectory=isDirectory|mustDescent|canDescent, shouldSort=8, // should be ASCII-sorted according to service_name. great for directories. hasSortKey=16, // has a sort key in data[3]. not having a sort key implies 0. - sort1=32 // sort key is 1 instead of 0 + sort1=32, // sort key is 1 instead of 0 + isMarker=64 // Marker }; + int flags; // flags will NOT be compared. inline int getSortKey() const { return (flags & hasSortKey) ? data[3] : ((flags & sort1) ? 1 : 0); } +#ifndef SWIG int data[8]; std::string path; +#endif + std::string getPath() { return path; } + void setPath( const std::string &n ) { path=n; } + + unsigned int getUnsignedData(unsigned int num) const + { + if ( num < sizeof(data)/sizeof(int) ) + return data[num]; + return 0; + } + + int getData(unsigned int num) const + { + if ( num < sizeof(data)/sizeof(int) ) + return data[num]; + return 0; + } + + void setUnsignedData(unsigned int num, unsigned int val) + { + if ( num < sizeof(data)/sizeof(int) ) + data[num] = val; + } + + void setData(unsigned int num, int val) + { + if ( num < sizeof(data)/sizeof(int) ) + data[num] = val; + } + +// only for override service names in bouquets or to give servicerefs a name which not have a +// real existing service ( for dvb eServiceDVB ) +#ifndef SWIG + std::string name; +#endif + std::string getName() { return name; } + void setName( const std::string &n ) { name=n; } eServiceReference() : type(idInvalid), flags(0) { + memset(data, 0, sizeof(data)); } - +#ifndef SWIG eServiceReference(int type, int flags) : type(type), flags(flags) { @@ -98,13 +142,15 @@ public: { memset(data, 0, sizeof(data)); } +#endif eServiceReference(const std::string &string); std::string toString() const; + std::string toCompareString() const; bool operator==(const eServiceReference &c) const { if (type != c.type) return 0; - return /* (flags == c.flags) && */ (memcmp(data, c.data, sizeof(int)*8)==0) && (path == c.path); + return (memcmp(data, c.data, sizeof(int)*8)==0) && (path == c.path); } bool operator!=(const eServiceReference &c) const { @@ -117,11 +163,6 @@ public: if (type > c.type) return 0; - -/* if (flags < c.flags) - return 1; - if (flags > c.flags) - return 0; */ int r=memcmp(data, c.data, sizeof(int)*8); if (r) @@ -129,90 +170,469 @@ public: return path < c.path; } operator bool() const + { + return valid(); + } + + int valid() const { return type != idInvalid; } }; +SWIG_ALLOW_OUTPUT_SIMPLE(eServiceReference); + +extern PyObject *New_eServiceReference(const eServiceReference &ref); // defined in enigma_python.i + +typedef 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! */ + +TEMPLATE_TYPEDEF(ePtr, eServiceEventPtr); + class iStaticServiceInformation: public iObject { +#ifdef SWIG + iStaticServiceInformation(); + ~iStaticServiceInformation(); +#endif public: - virtual RESULT getName(const eServiceReference &ref, std::string &name)=0; + 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); + virtual SWIG_VOID(RESULT) getEvent(const eServiceReference &ref, ePtr &SWIG_OUTPUT, time_t start_time=-1); + // returns true when not implemented + virtual bool isPlayable(const eServiceReference &ref, const eServiceReference &ignore); + + virtual int getInfo(const eServiceReference &ref, int w); + virtual std::string getInfoString(const eServiceReference &ref,int w); }; TEMPLATE_TYPEDEF(ePtr, iStaticServiceInformationPtr); -class eServiceEvent; - -class iServiceInformation: public iStaticServiceInformation +class iServiceInformation: public iObject { +#ifdef SWIG + iServiceInformation(); + ~iServiceInformation(); +#endif public: - virtual RESULT getEvent(ePtr &evt, int nownext); + virtual SWIG_VOID(RESULT) getName(std::string &SWIG_OUTPUT)=0; + virtual SWIG_VOID(RESULT) getEvent(ePtr &SWIG_OUTPUT, int nownext); + + enum { + sIsCrypted, /* is encrypted (no indication if decrypt was possible) */ + sAspect, /* aspect ratio: 0=4:3, 1=16:9, 2=whatever we need */ + sIsMultichannel, /* multichannel *available* (probably not selected) */ + + /* "user serviceable info" - they are not reliable. Don't use them for anything except the service menu! + that's also the reason why they are so globally defined. + + + again - if somebody EVER tries to use this information for anything else than simply displaying it, + i will change this to return a user-readable text like "zero x zero three three" (and change the + exact spelling in every version) to stop that! + */ + sVideoPID, + sAudioPID, + sPCRPID, + sPMTPID, + sTXTPID, + + sSID, + sONID, + sTSID, + sNamespace, + sProvider, + + sDescription, + sServiceref, + sTimeCreate, // unix time or string + + sTitle, + sArtist, + sAlbum, + sComment, + sTracknumber, + sGenre, + sCAIDs, + sVideoType // MPEG2 MPEG4 + }; + enum { resNA = -1, resIsString = -2, resIsPyObject = -3 }; + + virtual int getInfo(int w); + virtual std::string getInfoString(int w); + virtual PyObject *getInfoObject(int w); }; TEMPLATE_TYPEDEF(ePtr, iServiceInformationPtr); +class iFrontendInformation: public iObject +{ +#ifdef SWIG + iFrontendInformation(); + ~iFrontendInformation(); +#endif +public: + enum { + bitErrorRate, + signalPower, + signalQuality, + lockState, + syncState, + frontendNumber + }; + virtual int getFrontendInfo(int w)=0; + virtual PyObject *getFrontendData(bool original=false)=0; +}; + +TEMPLATE_TYPEDEF(ePtr, iFrontendInformationPtr); + class iPauseableService: public iObject { +#ifdef SWIG + iPausableService(); + ~iPausableService(); +#endif public: virtual RESULT pause()=0; virtual RESULT unpause()=0; + + /* hm. */ + virtual RESULT setSlowMotion(int ratio=0)=0; + virtual RESULT setFastForward(int ratio=0)=0; }; TEMPLATE_TYPEDEF(ePtr, iPauseableServicePtr); +class iSeekableService: public iObject +{ +#ifdef SWIG + iSeekableService(); + ~iSeekableService(); +#endif +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; + /* if you want to do several seeks in a row, you can enable the trickmode. + audio will be switched off, sync will be disabled etc. */ + virtual RESULT setTrickmode(int trick=0)=0; + virtual RESULT isCurrentlySeekable()=0; +}; + +TEMPLATE_TYPEDEF(ePtr, iSeekableServicePtr); + +struct iAudioTrackInfo +{ +#ifndef SWIG + std::string m_description; + std::string m_language; /* iso639 */ +#endif + std::string getDescription() { return m_description; } + std::string getLanguage() { return m_language; } +}; + +SWIG_ALLOW_OUTPUT_SIMPLE(iAudioTrackInfo); + +class iAudioTrackSelection: public iObject +{ +#ifdef SWIG + iAudioTrackSelection(); + ~iAudioTrackSelection(); +#endif +public: + virtual int getNumberOfTracks()=0; + virtual RESULT selectTrack(unsigned int i)=0; + virtual SWIG_VOID(RESULT) getTrackInfo(struct iAudioTrackInfo &SWIG_OUTPUT, unsigned int n)=0; +}; + +TEMPLATE_TYPEDEF(ePtr, iAudioTrackSelectionPtr); + +class iAudioChannelSelection: public iObject +{ +#ifdef SWIG + iAudioChannelSelection(); + ~iAudioChannelSelection(); +#endif +public: + enum { LEFT, STEREO, RIGHT }; + virtual int getCurrentChannel()=0; + virtual RESULT selectChannel(int i)=0; +}; + +TEMPLATE_TYPEDEF(ePtr, iAudioChannelSelectionPtr); + +class iAudioDelay: public iObject +{ +#ifdef SWIG + iAudioDelay(); + ~iAudioDelay(); +#endif +public: + virtual int getAC3Delay()=0; + virtual int getPCMDelay()=0; + virtual void setAC3Delay(int)=0; + virtual void setPCMDelay(int)=0; +}; + +TEMPLATE_TYPEDEF(ePtr, iAudioDelayPtr); + +class iRadioText: public iObject +{ +#ifdef SWIG + iRadioText(); + ~iRadioText(); +#endif +public: + virtual std::string getRadioText(int x=0)=0; +}; + +TEMPLATE_TYPEDEF(ePtr, iRadioTextPtr); + +class iSubserviceList: public iObject +{ +#ifdef SWIG + iSubserviceList(); + ~iSubserviceList(); +#endif +public: + virtual int getNumberOfSubservices()=0; + virtual SWIG_VOID(RESULT) getSubservice(eServiceReference &SWIG_OUTPUT, unsigned int n)=0; +}; + +TEMPLATE_TYPEDEF(ePtr, iSubserviceListPtr); + +class iTimeshiftService: public iObject +{ +#ifdef SWIG + iTimeshiftService(); + ~iTimeshiftService(); +#endif +public: + virtual RESULT startTimeshift()=0; + virtual RESULT stopTimeshift()=0; + + virtual int isTimeshiftActive()=0; + /* this essentially seeks to the relative end of the timeshift buffer */ + virtual RESULT activateTimeshift()=0; +}; + +TEMPLATE_TYPEDEF(ePtr, iTimeshiftServicePtr); + + /* not related to eCueSheet */ +class iCueSheet: public iObject +{ +#ifdef SWIG + iCueSheet(); + ~iCueSheet(); +#endif +public: + /* returns a list of (pts, what)-tuples */ + virtual PyObject *getCutList() = 0; + virtual void setCutList(PyObject *list) = 0; + virtual void setCutListEnable(int enable) = 0; + enum { cutIn = 0, cutOut = 1, cutMark = 2 }; +}; + +TEMPLATE_TYPEDEF(ePtr, iCueSheetPtr); + +class eWidget; +class PyList; + +class iSubtitleOutput: public iObject +{ +public: + virtual RESULT enableSubtitles(eWidget *parent, PyObject *entry)=0; + virtual RESULT disableSubtitles(eWidget *parent)=0; + virtual PyObject *getSubtitleList()=0; +}; + +TEMPLATE_TYPEDEF(ePtr, iSubtitleOutputPtr); + class iPlayableService: public iObject { +#ifdef SWIG + iPlayableService(); + ~iPlaybleService(); +#endif friend class iServiceHandler; public: enum { + /* these first two events are magical, and should only + be generated if you know what you're doing. */ evStart, evEnd, - // when iServiceInformation is implemented: - evUpdatedEventInfo + evTuneFailed, + // when iServiceInformation is implemented: + evUpdatedEventInfo, + evUpdatedInfo, + + /* when seek() is implemented: */ + evSeekableStatusChanged, /* for example when timeshifting */ + + evEOF, + evSOF, /* bounced against start of file (when seeking backwards) */ + + /* only when cueSheet is implemented */ + evCuesheetChanged, + + evUpdatedRadioText }; virtual RESULT connectEvent(const Slot2 &event, ePtr &connection)=0; virtual RESULT start()=0; virtual RESULT stop()=0; - virtual RESULT pause(ePtr &ptr)=0; - virtual RESULT info(ePtr &ptr)=0; + /* might have to be changed... */ + virtual RESULT setTarget(int target)=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; + virtual SWIG_VOID(RESULT) audioTracks(ePtr &SWIG_OUTPUT)=0; + virtual SWIG_VOID(RESULT) audioChannel(ePtr &SWIG_OUTPUT)=0; + virtual SWIG_VOID(RESULT) subServices(ePtr &SWIG_OUTPUT)=0; + virtual SWIG_VOID(RESULT) frontendInfo(ePtr &SWIG_OUTPUT)=0; + virtual SWIG_VOID(RESULT) timeshift(ePtr &SWIG_OUTPUT)=0; + virtual SWIG_VOID(RESULT) cueSheet(ePtr &SWIG_OUTPUT)=0; + virtual SWIG_VOID(RESULT) subtitle(ePtr &SWIG_OUTPUT)=0; + virtual SWIG_VOID(RESULT) audioDelay(ePtr &SWIG_OUTPUT)=0; + virtual SWIG_VOID(RESULT) radioText(ePtr &SWIG_OUTPUT)=0; }; TEMPLATE_TYPEDEF(ePtr, iPlayableServicePtr); class iRecordableService: public iObject { +#ifdef SWIG + iRecordableService(); + ~iRecordableService(); +#endif public: + virtual RESULT prepare(const char *filename, time_t begTime=-1, time_t endTime=-1, int eit_event_id=-1)=0; virtual RESULT start()=0; virtual RESULT stop()=0; + virtual SWIG_VOID(RESULT) frontendInfo(ePtr &SWIG_OUTPUT)=0; }; TEMPLATE_TYPEDEF(ePtr, iRecordableServicePtr); // TEMPLATE_TYPEDEF(std::list, eServiceReferenceList); +class iMutableServiceList: public iObject +{ +#ifdef SWIG + iMutableServiceList(); + ~iMutableServiceList(); +#endif +public: + /* flush changes */ + virtual RESULT flushChanges()=0; + /* adds a service to a list */ + virtual RESULT addService(eServiceReference &ref, eServiceReference before=eServiceReference())=0; + /* removes a service from a list */ + virtual RESULT removeService(eServiceReference &ref)=0; + /* moves a service in a list, only if list suppports a specific sort method. */ + /* pos is the new, absolute position from 0..size-1 */ + virtual RESULT moveService(eServiceReference &ref, int pos)=0; + /* set name of list, for bouquets this is the visible bouquet name */ + virtual RESULT setListName(const std::string &name)=0; +}; + +TEMPLATE_TYPEDEF(ePtr, iMutableServiceListPtr); + class iListableService: public iObject { +#ifdef SWIG + iListableService(); + ~iListableService(); +#endif public: - virtual RESULT getContent(std::list &list)=0; + /* legacy interface: get a list */ + virtual RESULT getContent(std::list &list, bool sorted=false)=0; + virtual PyObject *getContent(const char* format, bool sorted=false)=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; + + virtual SWIG_VOID(RESULT) startEdit(ePtr &SWIG_OUTPUT)=0; }; TEMPLATE_TYPEDEF(ePtr, iListableServicePtr); +#ifndef SWIG + /* 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); + } +}; +#endif + +class iServiceOfflineOperations: public iObject +{ +#ifdef SWIG + iServiceOfflineOperations(); + ~iServiceOfflineOperations(); +#endif +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 { +#ifdef SWIG + iServiceHandler(); + ~iServiceHandler(); +#endif 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 RESULT info(const eServiceReference &, ePtr &ptr); + 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);