#include <errno.h>
#include <lib/service/servicefs.h>
#include <lib/service/service.h>
+#include <lib/service/servicedvb.h>
#include <lib/base/init_num.h>
#include <lib/base/init.h>
#include <dirent.h>
#include <sys/stat.h>
#include <unistd.h>
+class eStaticServiceFSInformation: public iStaticServiceInformation
+{
+ DECLARE_REF(eStaticServiceFSInformation);
+public:
+ RESULT getName(const eServiceReference &ref, std::string &name);
+ int getLength(const eServiceReference &ref) { return -1; }
+};
+
+DEFINE_REF(eStaticServiceFSInformation);
+
+RESULT eStaticServiceFSInformation::getName(const eServiceReference &ref, std::string &name)
+{
+ name = ref.path;
+ return 0;
+}
+
// eServiceFactoryFS
-eServiceFactoryFS::eServiceFactoryFS(): ref(0)
+eServiceFactoryFS::eServiceFactoryFS()
{
ePtr<eServiceCenter> sc;
- eServiceCenter::getInstance(sc);
+ eServiceCenter::getPrivInstance(sc);
if (sc)
sc->addServiceFactory(eServiceFactoryFS::id, this);
+
+ m_service_information = new eStaticServiceFSInformation();
}
eServiceFactoryFS::~eServiceFactoryFS()
{
ePtr<eServiceCenter> sc;
- eServiceCenter::getInstance(sc);
+ eServiceCenter::getPrivInstance(sc);
if (sc)
sc->removeServiceFactory(eServiceFactoryFS::id);
}
return 0;
}
+RESULT eServiceFactoryFS::info(const eServiceReference &ref, ePtr<iStaticServiceInformation> &ptr)
+{
+ ptr = m_service_information;
+ return 0;
+}
+
+RESULT eServiceFactoryFS::offlineOperations(const eServiceReference &, ePtr<iServiceOfflineOperations> &ptr)
+{
+ ptr = 0;
+ return -1;
+}
+
// eServiceFS
DEFINE_REF(eServiceFS);
-eServiceFS::eServiceFS(const char *path): ref(0), path(path)
+eServiceFS::eServiceFS(const char *path): path(path)
{
+ m_list_valid = 0;
}
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)
if (!(strcmp(e->d_name, ".") && strcmp(e->d_name, "..")))
continue;
- eString filename;
+ std::string filename;
filename = path;
filename += e->d_name;
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);
+ /* FIIIIIX ME */
+ if (filename.substr(filename.size()-3) == ".ts")
+ {
+ eServiceReference service(eServiceFactoryDVB::id,
+ 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<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;
+}
+
+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<iMutableServiceList> &res)
+{
+ res = 0;
+ return -1;
+}
+
eAutoInitPtr<eServiceFactoryFS> init_eServiceFactoryFS(eAutoInitNumbers::service+1, "eServiceFactoryFS");