aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAndreas Monzner <andreas.monzner@multimedia-labs.de>2006-01-24 00:29:54 +0000
committerAndreas Monzner <andreas.monzner@multimedia-labs.de>2006-01-24 00:29:54 +0000
commit5ff227c657e02ebe2bc719faf4bd2231a04850c8 (patch)
tree8e7361161ee08db583147d47e2662b94219ed324 /lib
parent3e9bd06034d9656d4346225e90e68a65327a4aa0 (diff)
downloadenigma2-5ff227c657e02ebe2bc719faf4bd2231a04850c8.tar.gz
enigma2-5ff227c657e02ebe2bc719faf4bd2231a04850c8.zip
add ability to copy providers or all services from satellites to favourites (this creates a new bouquet)
add ability to remove a complete bouquet both are just working with enabled multi bouquet mode
Diffstat (limited to 'lib')
-rw-r--r--lib/dvb/db.cpp6
-rw-r--r--lib/dvb/idvb.h3
-rw-r--r--lib/python/Screens/ChannelSelection.py95
-rw-r--r--lib/python/enigma_python.i5
-rw-r--r--lib/service/iservice.h10
-rw-r--r--lib/service/servicedvb.cpp39
-rw-r--r--lib/service/servicedvb.h4
-rw-r--r--lib/service/servicefs.cpp29
-rw-r--r--lib/service/servicefs.h3
9 files changed, 177 insertions, 17 deletions
diff --git a/lib/dvb/db.cpp b/lib/dvb/db.cpp
index ad2996f9..e0fadc5e 100644
--- a/lib/dvb/db.cpp
+++ b/lib/dvb/db.cpp
@@ -107,6 +107,12 @@ err:
return -1;
}
+RESULT eBouquet::setListName(const std::string &name)
+{
+ m_bouquet_name = name;
+ return 0;
+}
+
eDVBService::eDVBService()
{
}
diff --git a/lib/dvb/idvb.h b/lib/dvb/idvb.h
index f18d4f34..c7db9779 100644
--- a/lib/dvb/idvb.h
+++ b/lib/dvb/idvb.h
@@ -21,11 +21,12 @@ struct eBouquet
std::string m_filename; // without path.. just name
typedef std::list<eServiceReference> list;
list m_services;
-// the following four methods are implemented in db.cpp
+// the following five methods are implemented in db.cpp
RESULT flushChanges();
RESULT addService(const eServiceReference &);
RESULT removeService(const eServiceReference &);
RESULT moveService(const eServiceReference &, unsigned int);
+ RESULT setListName(const std::string &name);
};
/* these structures have by intention no operator int() defined.
diff --git a/lib/python/Screens/ChannelSelection.py b/lib/python/Screens/ChannelSelection.py
index 59cc6b24..43cf66d7 100644
--- a/lib/python/Screens/ChannelSelection.py
+++ b/lib/python/Screens/ChannelSelection.py
@@ -3,7 +3,7 @@ from Components.Button import Button
from Components.ServiceList import ServiceList
from Components.ActionMap import NumberActionMap, ActionMap
from EpgSelection import EPGSelection
-from enigma import eServiceReference, eEPGCache, eEPGCachePtr, eServiceCenter, eServiceCenterPtr, iMutableServiceListPtr, iStaticServiceInformationPtr, eTimer
+from enigma import eServiceReference, eEPGCache, eEPGCachePtr, eServiceCenter, eServiceCenterPtr, iMutableServiceListPtr, iStaticServiceInformationPtr, eTimer, eDVBDB
from Components.config import config, configElement, ConfigSubsection, configText, currentConfigSelectionElement
from Screens.FixedMenu import FixedMenu
from Tools.NumericalTextInput import NumericalTextInput
@@ -11,7 +11,9 @@ from Components.NimManager import nimmanager
from Components.ServiceName import ServiceName
from Components.Clock import Clock
from Components.EventInfo import EventInfo
+from ServiceReference import ServiceReference
from re import *
+from os import remove
import xml.dom.minidom
@@ -37,14 +39,20 @@ class ChannelContextMenu(FixedMenu):
inBouquet = csel.getMutableList() is not None
haveBouquets = csel.bouquet_root.getPath().find('FROM BOUQUET "bouquets.') != -1
- if not csel.bouquet_mark_edit and not csel.movemode and not inBouquetRootList:
- if (csel.getCurrentSelection().flags & eServiceReference.flagDirectory) != eServiceReference.flagDirectory:
- if haveBouquets:
- menu.append((_("add service to bouquet"), self.addServiceToBouquetSelected))
- else:
- menu.append((_("add service to favourites"), self.addServiceToBouquetSelected))
- if inBouquet:
- menu.append((_("remove service"), self.removeCurrentService))
+ if not csel.bouquet_mark_edit and not csel.movemode:
+ if not inBouquetRootList:
+ if (csel.getCurrentSelection().flags & eServiceReference.flagDirectory) != eServiceReference.flagDirectory:
+ if haveBouquets:
+ menu.append((_("add service to bouquet"), self.addServiceToBouquetSelected))
+ else:
+ menu.append((_("add service to favourites"), self.addServiceToBouquetSelected))
+ elif haveBouquets:
+ if not inBouquet and csel.getCurrentSelection().getPath().find("PROVIDERS") == -1:
+ menu.append((_("copy to favourites"), csel.copyCurrentToBouquetList))
+ if inBouquet:
+ menu.append((_("remove service"), self.removeCurrentService))
+ elif haveBouquets:
+ menu.append((_("remove bouquet"), csel.removeBouquet))
if inBouquet: # current list is editable?
if not csel.bouquet_mark_edit:
@@ -83,6 +91,14 @@ class ChannelContextMenu(FixedMenu):
else: #no bouquets in root.. so assume only one favourite list is used
self.addCurrentServiceToBouquet(self.csel.bouquet_root)
+ def copyCurrentToBouquetList(self):
+ self.csel.copyCurrentToBouquetList()
+ self.close()
+
+ def removeBouquet(self):
+ self.csel.removeBouquet()
+ self.close()
+
def addCurrentServiceToBouquet(self, dest):
self.csel.addCurrentServiceToBouquet(dest)
self.close()
@@ -159,6 +175,65 @@ class ChannelSelectionEdit:
return list.startEdit()
return None
+ def buildBouquetID(self, str):
+ tmp = str.lower()
+ name = ''
+ for c in tmp:
+ if (c >= 'a' and c <= 'z') or (c >= '0' and c <= '9'):
+ name += c
+ else:
+ name += '_'
+ return name
+
+ def copyCurrentToBouquetList(self):
+ provider = ServiceReference(self.getCurrentSelection())
+ serviceHandler = eServiceCenter.getInstance()
+ mutableBouquetList = serviceHandler.list(self.bouquet_root).startEdit()
+ if mutableBouquetList:
+ providerName = provider.getServiceName()
+ if self.mode == MODE_TV:
+ str = '1:7:1:0:0:0:0:0:0:0:(type == 1) FROM BOUQUET \"userbouquet.%s.tv\" ORDER BY bouquet'%(self.buildBouquetID(providerName))
+ else:
+ str = '1:7:2:0:0:0:0:0:0:0:(type == 2) FROM BOUQUET \"userbouquet.%s.radio\" ORDER BY bouquet'%(self.buildBouquetID(providerName))
+ new_bouquet_ref = eServiceReference(str)
+ if not mutableBouquetList.addService(new_bouquet_ref):
+ mutableBouquetList.flushChanges()
+ eDVBDB.getInstance().reloadBouquets()
+ mutableBouquet = serviceHandler.list(new_bouquet_ref).startEdit()
+ if mutableBouquet:
+ mutableBouquet.setListName(providerName)
+ list = [ ]
+ services = serviceHandler.list(provider.ref)
+ if not services is None:
+ if not services.getContent(list, True):
+ for service in list:
+ if mutableBouquet.addService(service):
+ print "add", service.toString(), "to new bouquet failed"
+ mutableBouquet.flushChanges()
+ else:
+ print "getContent failed"
+ else:
+ print "list provider", providerName, "failed"
+ else:
+ print "get mutable list for new created bouquet failed"
+ else:
+ print "add", str, "to bouquets failed"
+ else:
+ print "bouquetlist is not editable"
+
+ def removeBouquet(self):
+ refstr = self.getCurrentSelection().toString()
+ pos = refstr.find('FROM BOUQUET "')
+ if pos != -1:
+ refstr = refstr[pos+14:]
+ print refstr
+ pos = refstr.find('"')
+ if pos != -1:
+ filename = '/etc/enigma2/' + refstr[:pos] # FIXMEEE !!! HARDCODED /etc/enigma2
+ self.removeCurrentService()
+ remove(filename)
+ eDVBDB.getInstance().reloadBouquets()
+
# multiple marked entry stuff ( edit mode, later multiepg selection )
def startMarkedEdit(self):
self.mutableList = self.getMutableList()
@@ -279,7 +354,7 @@ class ChannelSelectionBase(Screen):
# this makes it much simple to implement a selectable radio or tv mode :)
self.service_types_tv = '1:7:1:0:0:0:0:0:0:0:(type == 1) || (type == 17)'
- self.service_types_radio = '1:7:1:0:0:0:0:0:0:0:(type == 2)'
+ self.service_types_radio = '1:7:2:0:0:0:0:0:0:0:(type == 2)'
self["key_red"] = Button(_("All"))
self["key_green"] = Button(_("Satellites"))
diff --git a/lib/python/enigma_python.i b/lib/python/enigma_python.i
index 8029a265..53238e4a 100644
--- a/lib/python/enigma_python.i
+++ b/lib/python/enigma_python.i
@@ -251,4 +251,9 @@ PyObject *New_TestObj()
TestObj *result = (TestObj *)new TestObj();
return SWIG_NewPointerObj((void*)(result), SWIGTYPE_p_TestObj, 1);
}
+PyObject *New_eServiceReference(const eServiceReference &ref)
+{
+ eServiceReference *result = new eServiceReference(ref);
+ return SWIG_NewPointerObj((void*)(result), SWIGTYPE_p_eServiceReference, 1);
+}
%}
diff --git a/lib/service/iservice.h b/lib/service/iservice.h
index 2b42510d..1f55fe49 100644
--- a/lib/service/iservice.h
+++ b/lib/service/iservice.h
@@ -2,6 +2,7 @@
#define __lib_dvb_iservice_h
#include <lib/python/swig.h>
+#include <lib/python/python.h>
#include <lib/base/object.h>
#include <string>
#include <connection.h>
@@ -166,6 +167,8 @@ public:
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
@@ -442,6 +445,8 @@ public:
/* 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<iMutableServiceList>, iMutableServiceListPtr);
@@ -454,8 +459,9 @@ class iListableService: public iObject
#endif
public:
/* legacy interface: get a list */
- virtual RESULT getContent(std::list<eServiceReference> &list)=0;
-
+ virtual RESULT getContent(std::list<eServiceReference> &list, bool sorted=false)=0;
+ virtual RESULT getContent(PyObject *list, bool sorted=false)=0;
+
/* new, shiny interface: streaming. */
virtual SWIG_VOID(RESULT) getNext(eServiceReference &SWIG_OUTPUT)=0;
diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp
index 61221ecb..827b7f36 100644
--- a/lib/service/servicedvb.cpp
+++ b/lib/service/servicedvb.cpp
@@ -13,6 +13,7 @@
#include <lib/service/servicedvbrecord.h>
#include <lib/dvb/metaparser.h>
#include <lib/dvb/tstools.h>
+#include <lib/python/python.h>
class eStaticServiceDVBInformation: public iStaticServiceInformation
{
@@ -305,7 +306,32 @@ RESULT eDVBServiceList::startQuery()
return 0;
}
-RESULT eDVBServiceList::getContent(std::list<eServiceReference> &list)
+RESULT eDVBServiceList::getContent(PyObject *list, bool sorted)
+{
+ eServiceReferenceDVB ref;
+
+ if (!m_query || !list || !PyList_Check(list))
+ return -1;
+
+ std::list<eServiceReferenceDVB> tmplist;
+
+ while (!m_query->getNextResult(ref))
+ tmplist.push_back(ref);
+
+ if (sorted)
+ tmplist.sort(iListableServiceCompare(this));
+
+ for (std::list<eServiceReferenceDVB>::iterator it(tmplist.begin());
+ it != tmplist.end(); ++it)
+ {
+ PyObject *refobj = New_eServiceReference(*it);
+ PyList_Append(list, refobj);
+ Py_DECREF(refobj);
+ }
+ return 0;
+}
+
+RESULT eDVBServiceList::getContent(std::list<eServiceReference> &list, bool sorted)
{
eServiceReferenceDVB ref;
@@ -314,6 +340,10 @@ RESULT eDVBServiceList::getContent(std::list<eServiceReference> &list)
while (!m_query->getNextResult(ref))
list.push_back(ref);
+
+ if (sorted)
+ list.sort(iListableServiceCompare(this));
+
return 0;
}
@@ -379,6 +409,13 @@ RESULT eDVBServiceList::flushChanges()
return m_bouquet->flushChanges();
}
+RESULT eDVBServiceList::setListName(const std::string &name)
+{
+ if (!m_bouquet)
+ return -1;
+ return m_bouquet->setListName(name);
+}
+
RESULT eServiceFactoryDVB::play(const eServiceReference &ref, ePtr<iPlayableService> &ptr)
{
ePtr<eDVBService> service;
diff --git a/lib/service/servicedvb.h b/lib/service/servicedvb.h
index 61baf6a2..ba4f2fb5 100644
--- a/lib/service/servicedvb.h
+++ b/lib/service/servicedvb.h
@@ -32,7 +32,8 @@ class eDVBServiceList: public iListableService, public iMutableServiceList
DECLARE_REF(eDVBServiceList);
public:
virtual ~eDVBServiceList();
- RESULT getContent(std::list<eServiceReference> &list);
+ RESULT getContent(std::list<eServiceReference> &list, bool sorted=false);
+ RESULT getContent(PyObject *list, bool sorted=false);
RESULT getNext(eServiceReference &ptr);
int compareLessEqual(const eServiceReference &a, const eServiceReference &b);
@@ -41,6 +42,7 @@ public:
RESULT addService(eServiceReference &ref);
RESULT removeService(eServiceReference &ref);
RESULT moveService(eServiceReference &ref, int pos);
+ RESULT setListName(const std::string &name);
private:
RESULT startQuery();
eServiceReference m_parent;
diff --git a/lib/service/servicefs.cpp b/lib/service/servicefs.cpp
index a22b88d3..8254e63b 100644
--- a/lib/service/servicefs.cpp
+++ b/lib/service/servicefs.cpp
@@ -96,7 +96,7 @@ eServiceFS::~eServiceFS()
{
}
-RESULT eServiceFS::getContent(std::list<eServiceReference> &list)
+RESULT eServiceFS::getContent(std::list<eServiceReference> &list, bool sorted)
{
DIR *d=opendir(path.c_str());
if (!d)
@@ -141,6 +141,33 @@ RESULT eServiceFS::getContent(std::list<eServiceReference> &list)
}
}
closedir(d);
+
+ if (sorted)
+ list.sort(iListableServiceCompare(this));
+
+ return 0;
+}
+
+RESULT eServiceFS::getContent(PyObject *list, bool sorted)
+{
+ if (!list || !PyList_Check(list))
+ return -1;
+
+ std::list<eServiceReference> tmplist;
+
+ getContent(tmplist, sorted);
+
+ if (sorted)
+ tmplist.sort(iListableServiceCompare(this));
+
+ for (std::list<eServiceReference>::iterator it(tmplist.begin());
+ it != tmplist.end(); ++it)
+ {
+ PyObject *refobj = New_eServiceReference(*it);
+ PyList_Append(list, refobj);
+ Py_DECREF(refobj);
+ }
+
return 0;
}
diff --git a/lib/service/servicefs.h b/lib/service/servicefs.h
index 46e8b890..4257f2ac 100644
--- a/lib/service/servicefs.h
+++ b/lib/service/servicefs.h
@@ -34,7 +34,8 @@ private:
public:
virtual ~eServiceFS();
- RESULT getContent(std::list<eServiceReference> &list);
+ RESULT getContent(std::list<eServiceReference> &list, bool sorted=false);
+ RESULT getContent(PyObject *list, bool sorted=false);
RESULT getNext(eServiceReference &ptr);
int compareLessEqual(const eServiceReference &, const eServiceReference &);
RESULT startEdit(ePtr<iMutableServiceList> &);