X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_dvbapp;a=blobdiff_plain;f=lib%2Fservice%2Fservicefs.cpp;h=22d8cf65e3b7b214cca53d70645ff4fcb773f9fd;hp=de75cc672fe6b35053a151995b3c1a76bbe1c035;hb=08fca93e7f2a37a452399d08c5c84b969b7e52af;hpb=4bc08995411e21f3564f09e136809be68ddf96a8 diff --git a/lib/service/servicefs.cpp b/lib/service/servicefs.cpp index de75cc6..22d8cf6 100644 --- a/lib/service/servicefs.cpp +++ b/lib/service/servicefs.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -11,19 +12,20 @@ #include #include - -class eServiceFSInformation: public iServiceInformation +class eStaticServiceFSInformation: public iStaticServiceInformation { - DECLARE_REF; + DECLARE_REF(eStaticServiceFSInformation); public: RESULT getName(const eServiceReference &ref, std::string &name); + int getLength(const eServiceReference &ref) { return -1; } }; -DEFINE_REF(eServiceFSInformation); +DEFINE_REF(eStaticServiceFSInformation); -RESULT eServiceFSInformation::getName(const eServiceReference &ref, std::string &name) +RESULT eStaticServiceFSInformation::getName(const eServiceReference &ref, std::string &name) { name = ref.path; + return 0; } // eServiceFactoryFS @@ -32,18 +34,18 @@ eServiceFactoryFS::eServiceFactoryFS() { ePtr sc; - eServiceCenter::getInstance(sc); + eServiceCenter::getPrivInstance(sc); if (sc) sc->addServiceFactory(eServiceFactoryFS::id, this); - m_service_information = new eServiceFSInformation(); + m_service_information = new eStaticServiceFSInformation(); } eServiceFactoryFS::~eServiceFactoryFS() { ePtr sc; - eServiceCenter::getInstance(sc); + eServiceCenter::getPrivInstance(sc); if (sc) sc->removeServiceFactory(eServiceFactoryFS::id); } @@ -69,25 +71,32 @@ RESULT eServiceFactoryFS::list(const eServiceReference &ref, ePtr &ptr) +RESULT eServiceFactoryFS::info(const eServiceReference &ref, ePtr &ptr) { ptr = m_service_information; return 0; } +RESULT eServiceFactoryFS::offlineOperations(const eServiceReference &, ePtr &ptr) +{ + ptr = 0; + return -1; +} + // eServiceFS DEFINE_REF(eServiceFS); eServiceFS::eServiceFS(const char *path): path(path) { + m_list_valid = 0; } eServiceFS::~eServiceFS() { } -RESULT eServiceFS::getContent(std::list &list) +RESULT eServiceFS::getContent(std::list &list, bool sorted) { DIR *d=opendir(path.c_str()); if (!d) @@ -120,16 +129,92 @@ RESULT eServiceFS::getContent(std::list &list) list.push_back(service); } else { - eServiceReference service(eServiceFactoryFS::id, - eServiceReference::isDirectory| - eServiceReference::canDescent|eServiceReference::mustDescent| - eServiceReference::shouldSort|eServiceReference::sort1, - filename); - service.data[0] = 0; - list.push_back(service); + std::string extension = filename.substr(filename.rfind('.')); + int type = -1; + + if (extension == ".ts") + type = eServiceFactoryDVB::id; + else if (extension == ".mp3" || extension == ".ogg" || extension == ".avi") + type = 4097; + + if (type != -1) + { + eServiceReference service(type, + 0, + filename); + service.data[0] = 0; + list.push_back(service); + } } } + 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; } +RESULT eServiceFS::getNext(eServiceReference &ptr) +{ + if (!m_list_valid) + { + m_list_valid = 1; + int res = getContent(m_list); + if (res) + return res; + } + + 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");