X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/682b9158bbddde229a2559365aa108812b15de61..fc0d94d9a917be5979e4c2fcd910bd441a35843e:/lib/dvb_ci/dvbci.h diff --git a/lib/dvb_ci/dvbci.h b/lib/dvb_ci/dvbci.h index 961999e9..603fadfd 100644 --- a/lib/dvb_ci/dvbci.h +++ b/lib/dvb_ci/dvbci.h @@ -1,35 +1,153 @@ #ifndef __dvbci_dvbci_h #define __dvbci_dvbci_h +#ifndef SWIG + #include +#include +#include +#include +#include class eDVBCISession; +class eDVBCIApplicationManagerSession; +class eDVBCICAManagerSession; +class eDVBCIMMISession; +class eDVBServicePMTHandler; +class eDVBCISlot; +class eDVBCIInterfaces; + +struct queueData +{ + __u8 prio; + unsigned char *data; + unsigned int len; + queueData( unsigned char *data, unsigned int len, __u8 prio = 0 ) + :prio(prio), data(data), len(len) + { -class eDVBCISlot: public Object + } + bool operator < ( const struct queueData &a ) const + { + return prio < a.prio; + } +}; + +enum data_source { + TUNER_A, TUNER_B, TUNER_C, TUNER_D, CI_A, CI_B, CI_C, CI_D +}; + +class eDVBCISlot: public iObject, public Object +{ + friend class eDVBCIInterfaces; DECLARE_REF(eDVBCISlot); private: + int slotid; int fd; + eSocketNotifier *notifier; + int state; + std::map running_services; + eDVBCIApplicationManagerSession *application_manager; + eDVBCICAManagerSession *ca_manager; + eDVBCIMMISession *mmi_session; + std::priority_queue sendqueue; + std::set possible_caids; + std::set possible_services; + std::set possible_providers; + int use_count; + eDVBCISlot *linked_next; // needed for linked CI handling + data_source current_source; + int current_tuner; void data(int); - eSocketNotifier *notifier_data; - void event(int); - eSocketNotifier *notifier_event; - - eDVBCISession *se; public: + enum {stateRemoved, stateInserted, stateInvalid, stateResetted}; eDVBCISlot(eMainloop *context, int nr); - virtual ~eDVBCISlot(); + ~eDVBCISlot(); - int eDVBCISlot::write(const unsigned char *data, size_t len); + int send(const unsigned char *data, size_t len); + + void setAppManager( eDVBCIApplicationManagerSession *session ); + void setMMIManager( eDVBCIMMISession *session ); + void setCAManager( eDVBCICAManagerSession *session ); + + eDVBCIApplicationManagerSession *getAppManager() { return application_manager; } + eDVBCIMMISession *getMMIManager() { return mmi_session; } + eDVBCICAManagerSession *getCAManager() { return ca_manager; } + + int getState() { return state; } + int getSlotID(); + int reset(); + int startMMI(); + int stopMMI(); + int answerText(int answer); + int answerEnq(char *value); + int cancelEnq(); + int getMMIState(); + int sendCAPMT(eDVBServicePMTHandler *ptr, const std::vector &caids=std::vector()); + void removeService(uint16_t program_number=0xFFFF); + int getNumOfServices() { return running_services.size(); } + int setSource(data_source source); +}; + +struct CIPmtHandler +{ + eDVBServicePMTHandler *pmthandler; + eDVBCISlot *cislot; + CIPmtHandler() + :pmthandler(NULL), cislot(NULL) + {} + CIPmtHandler( const CIPmtHandler &x ) + :pmthandler(x.pmthandler), cislot(x.cislot) + {} + CIPmtHandler( eDVBServicePMTHandler *ptr ) + :pmthandler(ptr), cislot(NULL) + {} + bool operator==(const CIPmtHandler &x) const { return x.pmthandler == pmthandler; } }; +typedef std::list PMTHandlerList; + +#endif // SWIG + class eDVBCIInterfaces { +DECLARE_REF(eDVBCIInterfaces); + static eDVBCIInterfaces *instance; private: - eSmartPtrList m_slots; + eSmartPtrList m_slots; + eDVBCISlot *getSlot(int slotid); + PMTHandlerList m_pmt_handlers; +#ifndef SWIG public: +#endif eDVBCIInterfaces(); - virtual ~eDVBCIInterfaces(); + ~eDVBCIInterfaces(); + + void addPMTHandler(eDVBServicePMTHandler *pmthandler); + void removePMTHandler(eDVBServicePMTHandler *pmthandler); + void recheckPMTHandlers(); + void gotPMT(eDVBServicePMTHandler *pmthandler); + void ciRemoved(eDVBCISlot *slot); + int getSlotState(int slot); + + int reset(int slot); + int initialize(int slot); + int startMMI(int slot); + int stopMMI(int slot); + int answerText(int slot, int answer); + int answerEnq(int slot, char *value); + int cancelEnq(int slot); + int getMMIState(int slot); + int sendCAPMT(int slot); + int setInputSource(int tunerno, data_source source); +#ifdef SWIG +public: +#endif + static eDVBCIInterfaces *getInstance(); + int getNumOfSlots() { return m_slots.size(); } + PyObject *getDescrambleRules(int slotid); + RESULT setDescrambleRules(int slotid, SWIG_PYOBJECT(ePyObject) ); }; #endif