X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/08fca93e7f2a37a452399d08c5c84b969b7e52af..c7239788f111d2a6a8ca3bb8b95b72579095bad4:/lib/service/servicefs.cpp diff --git a/lib/service/servicefs.cpp b/lib/service/servicefs.cpp index 22d8cf65..16948854 100644 --- a/lib/service/servicefs.cpp +++ b/lib/service/servicefs.cpp @@ -96,6 +96,11 @@ eServiceFS::~eServiceFS() { } +int lower(char c) +{ + return std::tolower(static_cast(c)); +} + RESULT eServiceFS::getContent(std::list &list, bool sorted) { DIR *d=opendir(path.c_str()); @@ -129,13 +134,25 @@ RESULT eServiceFS::getContent(std::list &list, bool sorted) list.push_back(service); } else { - std::string extension = filename.substr(filename.rfind('.')); + size_t e = filename.rfind('.'); + std::string extension = (e != std::string::npos) ? filename.substr(e) : ""; + std::transform(extension.begin(), extension.end(), extension.begin(), lower); int type = -1; if (extension == ".ts") type = eServiceFactoryDVB::id; - else if (extension == ".mp3" || extension == ".ogg" || extension == ".avi") + else if (extension == ".mp3") + type = 4097; + else if (extension == ".ogg") + type = 4097; + else if (extension == ".mpg") type = 4097; + else if (extension == ".vob") + type = 4097; + else if (extension == ".wav" || extension == ".wave") + type = 4097; + else if (extension == ".m3u" || extension == ".pls" || extension == ".e2pls") + type = 4098; if (type != -1) { @@ -155,27 +172,93 @@ RESULT eServiceFS::getContent(std::list &list, bool sorted) return 0; } -RESULT eServiceFS::getContent(PyObject *list, bool sorted) +// The first argument of this function is a format string to specify the order and +// the content of the returned list +// useable format options are +// R = Service Reference (as swig object .. this is very slow) +// S = Service Reference (as python string object .. same as ref.toString()) +// C = Service Reference (as python string object .. same as ref.toCompareString()) +// N = Service Name (as python string object) +// when exactly one return value per service is selected in the format string, +// then each value is directly a list entry +// when more than one value is returned per service, then the list is a list of +// python tuples +// unknown format string chars are returned as python None values ! +PyObject *eServiceFS::getContent(const char* format, bool sorted) { - if (!list || !PyList_Check(list)) - return -1; - + PyObject *ret=0; std::list tmplist; + int retcount=1; - getContent(tmplist, sorted); - - if (sorted) - tmplist.sort(iListableServiceCompare(this)); + if (!format || !(retcount=strlen(format))) + format = "R"; // just return service reference swig object ... - for (std::list::iterator it(tmplist.begin()); - it != tmplist.end(); ++it) + if (!getContent(tmplist, sorted)) { - PyObject *refobj = New_eServiceReference(*it); - PyList_Append(list, refobj); - Py_DECREF(refobj); - } + int services=tmplist.size(); + ePtr sptr; + eServiceCenterPtr service_center; - return 0; + if (strchr(format, 'N')) + eServiceCenter::getPrivInstance(service_center); + + ret = PyList_New(services); + std::list::iterator it(tmplist.begin()); + + for (int cnt=0; cnt < services; ++cnt) + { + eServiceReference &ref=*it++; + PyObject *tuple = retcount > 1 ? PyTuple_New(retcount) : 0; + for (int i=0; i < retcount; ++i) + { + PyObject *tmp=0; + switch(format[i]) + { + case 'R': // service reference (swig)object + tmp = New_eServiceReference(ref); + break; + case 'C': // service reference compare string + tmp = PyString_FromString(ref.toCompareString().c_str()); + break; + case 'S': // service reference string + tmp = PyString_FromString(ref.toString().c_str()); + break; + case 'N': // service name + if (service_center) + { + service_center->info(ref, sptr); + if (sptr) + { + std::string name; + sptr->getName(ref, name); + if (name.length()) + tmp = PyString_FromString(name.c_str()); + } + } + if (!tmp) + tmp = PyString_FromString(""); + break; + default: + if (tuple) + { + tmp = Py_None; + Py_INCREF(Py_None); + } + break; + } + if (tmp) + { + if (tuple) + PyTuple_SET_ITEM(tuple, i, tmp); + else + PyList_SET_ITEM(ret, cnt, tmp); + } + } + if (tuple) + PyList_SET_ITEM(ret, cnt, tuple); + } + } + return ret ? ret : PyList_New(0); } RESULT eServiceFS::getNext(eServiceReference &ptr)