X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Socket%2FProtocols%2FDVB%2FDVBDemuxHandles.cc;h=3a66a06246f2306c037323f2f08b2e0d57ca5ac9;hb=34199e3d9e56891d51d497fc2367d14258fa0c37;hp=8fda3496a8ea31b169d8d664c361cc3ab3903a61;hpb=2c4c9deecc7491fbfc916aeb41074dcb76e8a2c2;p=senf.git diff --git a/Socket/Protocols/DVB/DVBDemuxHandles.cc b/Socket/Protocols/DVB/DVBDemuxHandles.cc index 8fda349..3a66a06 100644 --- a/Socket/Protocols/DVB/DVBDemuxHandles.cc +++ b/Socket/Protocols/DVB/DVBDemuxHandles.cc @@ -1,9 +1,9 @@ // $Id$ // // Copyright (C) 2007 -// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS) -// Kompetenzzentrum fuer Satelitenkommunikation (SatCom) -// Stefan Bund +// Fraunhofer Institute for Open Communication Systems (FOKUS) +// Competence Center NETwork research (NET), St. Augustin, GERMANY +// Thorsten Horstmann // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -21,23 +21,17 @@ // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. /** \file - \brief xxx - */ + \brief DVBDemuxHandles non-inline non-template implementation */ #include "DVBDemuxHandles.hh" //#include "DVBDemuxHandles.ih" // Custom includes -#include +#include #include -#include -#include #include -#include -#include #include - -#include "Utils/Exception.hh" +#include "../../../Utils/Exception.hh" //#include "DVBDemuxHandles.mpp" #define prefix_ @@ -46,87 +40,85 @@ /////////////////////////////////////////////////////////////////////////// // senf::DVBDemuxHandles -prefix_ void senf::DVBDemuxSectionProtocol::init_client() +prefix_ void senf::DVBDemuxSectionSocketProtocol::init_client(unsigned short adapter, unsigned short device) const { - int fd = open("/dev/dvb/adapter0/demux0", O_RDONLY | O_NONBLOCK); - if (fd < 0) - throw SystemException(errno); - body().fd(fd); + std::string devDemux = str( boost::format( + "/dev/dvb/adapter%d/demux%d") % adapter % device); + int f = open(devDemux.c_str(), O_RDONLY | O_NONBLOCK); + if (f < 0){ + SENF_THROW_SYSTEM_EXCEPTION("Could not open demux device of DVB adapter ") << devDemux << "."; + } + fd(f); } -prefix_ unsigned senf::DVBDemuxSectionProtocol::available() +prefix_ unsigned senf::DVBDemuxSectionSocketProtocol::available() const { return 4096; } -prefix_ std::auto_ptr senf::DVBDemuxSectionProtocol::clone() +prefix_ void senf::DVBDemuxSectionSocketProtocol::setSectionFilter(unsigned short int pid, unsigned int timeout, unsigned int flags, unsigned char filter, unsigned char mask, unsigned char mode) const { - return std::auto_ptr(new DVBDemuxSectionProtocol()); -} - -prefix_ void senf::DVBDemuxSectionProtocol::setSectionFilter(struct dmx_sct_filter_params *filter) - const -{ - if (::ioctl(body().fd(), DMX_SET_FILTER, filter) < 0) - throw SystemException(errno); + struct dmx_sct_filter_params sec_filter; + ::memset(&sec_filter, 0, sizeof(struct dmx_sct_filter_params)); + + sec_filter.pid = pid; + sec_filter.filter.filter[0] = filter; + sec_filter.filter.mask[0] = mask; + sec_filter.filter.mode[0] = mode; + sec_filter.flags = flags; + + if (::ioctl(fd(), DMX_SET_FILTER, filter) < 0) + SENF_THROW_SYSTEM_EXCEPTION("Could not set section filter of DVB adapter."); } // ---------------------------------------------------------------- -prefix_ void senf::DVBDemuxPESProtocol::init_client() +prefix_ void senf::DVBDemuxPESSocketProtocol::init_client(unsigned short adapter, unsigned short device) const { - int fd = open("/dev/dvb/adapter0/demux0", O_RDONLY | O_NONBLOCK); - if (fd < 0) - throw SystemException(errno); - body().fd(fd); + std::string devDemux = str( boost::format( + "/dev/dvb/adapter%d/demux%d") % adapter % device); + int f = open(devDemux.c_str(), O_RDONLY | O_NONBLOCK); + if (f < 0) + SENF_THROW_SYSTEM_EXCEPTION("Could not open demux device of DVB adapter ") << devDemux << "."; + fd(f); } -prefix_ unsigned senf::DVBDemuxPESProtocol::available() +prefix_ unsigned senf::DVBDemuxPESSocketProtocol::available() const { return 4096; //??? } -prefix_ std::auto_ptr senf::DVBDemuxPESProtocol::clone() +prefix_ void senf::DVBDemuxPESSocketProtocol::setPESFilter(struct dmx_pes_filter_params *filter) const { - return std::auto_ptr(new DVBDemuxPESProtocol()); -} - -prefix_ void senf::DVBDemuxPESProtocol::setPESFilter(struct dmx_pes_filter_params *filter) - const -{ - if (::ioctl(body().fd(), DMX_SET_PES_FILTER, filter) < 0) - throw SystemException(errno); + if (::ioctl(fd(), DMX_SET_PES_FILTER, filter) < 0) + SENF_THROW_SYSTEM_EXCEPTION("Could not set PES filter of DVB adapter."); } // ---------------------------------------------------------------- -prefix_ void senf::DVBDvrProtocol::init_client() +prefix_ void senf::DVBDvrSocketProtocol::init_client(unsigned short adapter, unsigned short device) const { - int fd = open("/dev/dvb/adapter0/dvr0", O_RDONLY | O_NONBLOCK); - if (fd < 0) - throw SystemException(errno); - body().fd(fd); + std::string devDvr = str( boost::format( + "/dev/dvb/adapter%d/dvr%d") % adapter % device); + int f = open(devDvr.c_str(), O_RDONLY | O_NONBLOCK); + if (f < 0) + SENF_THROW_SYSTEM_EXCEPTION("Could not open dvr device of DVB adapter ") << devDvr << "."; + fd(f); } -prefix_ unsigned senf::DVBDvrProtocol::available() +prefix_ unsigned senf::DVBDvrSocketProtocol::available() const { return 188; } -prefix_ std::auto_ptr senf::DVBDvrProtocol::clone() - const -{ - return std::auto_ptr(new DVBDvrProtocol()); -} - ///////////////////////////////cc.e//////////////////////////////////////// #undef prefix_ //#include "DVBDemuxHandles.mpp"