1 #include <lib/nav/core.h>
2 #include <lib/base/eerror.h>
3 #include <lib/python/python.h>
4 #include <lib/dvb/fcc.h>
6 void eNavigation::serviceEvent(iPlayableService* service, int event)
8 if (m_runningService && service != m_runningService)
10 eDebug("nav: event %d for other service", event);
16 void eNavigation::recordEvent(iRecordableService* service, int event)
18 if (m_recordings.find(service) == m_recordings.end())
20 eDebug("nav: event for non registered recording service");
23 m_record_event(service, event);
26 RESULT eNavigation::playService(const eServiceReference &service)
30 if (m_fccmgr->tryFCCService(service, m_runningService) == -1)
33 ASSERT(m_servicehandler);
34 res = m_servicehandler->play(service, m_runningService);
39 m_runningService->setTarget(m_decoder);
40 m_runningService->connectEvent(slot(*this, &eNavigation::serviceEvent), m_service_event_conn);
41 res = m_runningService->start();
46 RESULT eNavigation::connectEvent(const Slot1<void,int> &event, ePtr<eConnection> &connection)
48 connection = new eConnection(this, m_event.connect(event));
52 RESULT eNavigation::connectRecordEvent(const Slot2<void,ePtr<iRecordableService>,int> &event, ePtr<eConnection> &connection)
54 connection = new eConnection(this, m_record_event.connect(event));
58 RESULT eNavigation::getCurrentService(ePtr<iPlayableService> &service)
60 service = m_runningService;
64 RESULT eNavigation::stopService(void)
66 /* check if there is a running service... */
67 if (!m_runningService)
70 ePtr<iPlayableService> tmp = m_runningService;
75 m_event(iPlayableService::evEnd);
78 m_service_event_conn = 0;
80 m_fccmgr->cleanupFCCService();
84 RESULT eNavigation::recordService(const eServiceReference &ref, ePtr<iRecordableService> &service, bool simulate)
86 ASSERT(m_servicehandler);
87 RESULT res = m_servicehandler->record(ref, service);
88 eDebug("record: %d", res);
94 m_simulate_recordings.insert(service);
97 ePtr<eConnection> conn;
98 service->connectEvent(slot(*this, &eNavigation::recordEvent), conn);
99 m_recordings[service]=conn;
105 RESULT eNavigation::stopRecordService(ePtr<iRecordableService> &service)
108 std::set<ePtr<iRecordableService> >::iterator it =
109 m_simulate_recordings.find(service);
110 if (it != m_simulate_recordings.end())
112 m_simulate_recordings.erase(it);
117 std::map<ePtr<iRecordableService>, ePtr<eConnection> >::iterator it =
118 m_recordings.find(service);
119 if (it != m_recordings.end())
121 m_recordings.erase(it);
122 /* send stop event */
123 m_record_event(service, iRecordableService::evEnd);
128 eDebug("try to stop non running recording!!"); // this should not happen
132 PyObject *eNavigation::getRecordings(bool simulate)
134 ePyObject result = PyList_New(simulate ? m_simulate_recordings.size() : m_recordings.size());
137 for (std::set<ePtr<iRecordableService> >::iterator it(m_simulate_recordings.begin()); it != m_simulate_recordings.end(); ++it)
138 PyList_SET_ITEM(result, pos++, NEW_iRecordableServicePtr(*it));
140 for (std::map<ePtr<iRecordableService>, ePtr<eConnection> >::iterator it(m_recordings.begin()); it != m_recordings.end(); ++it)
141 PyList_SET_ITEM(result, pos++, NEW_iRecordableServicePtr(it->first));
145 RESULT eNavigation::pause(int dop)
147 if (!m_runningService)
149 ePtr<iPauseableService> p;
150 if (m_runningService->pause(p))
158 eNavigation::eNavigation(iServiceHandler *serviceHandler, int decoder)
160 ASSERT(serviceHandler);
161 m_servicehandler = serviceHandler;
163 m_fccmgr = new eFCCServiceManager(this);
166 eNavigation::~eNavigation()
171 DEFINE_REF(eNavigation);