X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/fe813cde98c0c550137b47dd7a75ec2d4d9e6f34..33ceea2a8e9afa4d3002724d2fe3f2fbe3909ea9:/lib/service/servicefs.cpp diff --git a/lib/service/servicefs.cpp b/lib/service/servicefs.cpp index 67b99c08..3e2f97b3 100644 --- a/lib/service/servicefs.cpp +++ b/lib/service/servicefs.cpp @@ -12,7 +12,6 @@ #include #include - class eStaticServiceFSInformation: public iStaticServiceInformation { DECLARE_REF(eStaticServiceFSInformation); @@ -26,6 +25,7 @@ DEFINE_REF(eStaticServiceFSInformation); RESULT eStaticServiceFSInformation::getName(const eServiceReference &ref, std::string &name) { name = ref.path; + return 0; } // eServiceFactoryFS @@ -34,7 +34,7 @@ eServiceFactoryFS::eServiceFactoryFS() { ePtr sc; - eServiceCenter::getInstance(sc); + eServiceCenter::getPrivInstance(sc); if (sc) sc->addServiceFactory(eServiceFactoryFS::id, this); @@ -45,7 +45,7 @@ eServiceFactoryFS::~eServiceFactoryFS() { ePtr sc; - eServiceCenter::getInstance(sc); + eServiceCenter::getPrivInstance(sc); if (sc) sc->removeServiceFactory(eServiceFactoryFS::id); } @@ -77,6 +77,12 @@ RESULT eServiceFactoryFS::info(const eServiceReference &ref, ePtr &ptr) +{ + ptr = 0; + return -1; +} + // eServiceFS DEFINE_REF(eServiceFS); @@ -90,7 +96,7 @@ eServiceFS::~eServiceFS() { } -RESULT eServiceFS::getContent(std::list &list) +RESULT eServiceFS::getContent(std::list &list, bool sorted) { DIR *d=opendir(path.c_str()); if (!d) @@ -123,10 +129,26 @@ RESULT eServiceFS::getContent(std::list &list) list.push_back(service); } else { - /* FIIIIIX ME */ - if (filename.substr(filename.size()-3) == ".ts") + size_t e = filename.rfind('.'); + std::string extension = (e != std::string::npos) ? filename.substr(e) : ""; + int type = -1; + + if (extension == ".ts") + type = eServiceFactoryDVB::id; + 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; + + if (type != -1) { - eServiceReference service(eServiceFactoryDVB::id, + eServiceReference service(type, 0, filename); service.data[0] = 0; @@ -134,6 +156,34 @@ RESULT eServiceFS::getContent(std::list &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 tmplist; + + getContent(tmplist, sorted); + + if (sorted) + tmplist.sort(iListableServiceCompare(this)); + + for (std::list::iterator it(tmplist.begin()); + it != tmplist.end(); ++it) + { + PyObject *refobj = New_eServiceReference(*it); + PyList_Append(list, refobj); + Py_DECREF(refobj); + } + return 0; } @@ -148,11 +198,32 @@ RESULT eServiceFS::getNext(eServiceReference &ptr) } if (!m_list.size()) + { + ptr = eServiceReference(); return -ERANGE; + } ptr = m_list.front(); m_list.pop_front(); return 0; } +int eServiceFS::compareLessEqual(const eServiceReference &a, const eServiceReference &b) +{ + /* directories first */ + if ((a.flags & ~b.flags) & eServiceReference::isDirectory) + return 1; + else if ((~a.flags & b.flags) & eServiceReference::isDirectory) + return 0; + /* sort by filename */ + else + return a.path < b.path; +} + +RESULT eServiceFS::startEdit(ePtr &res) +{ + res = 0; + return -1; +} + eAutoInitPtr init_eServiceFactoryFS(eAutoInitNumbers::service+1, "eServiceFactoryFS");