1 #include <lib/base/eerror.h>
2 #include <lib/base/object.h>
5 #include <lib/service/servicefs.h>
6 #include <lib/service/service.h>
7 #include <lib/service/servicedvb.h>
8 #include <lib/base/init_num.h>
9 #include <lib/base/init.h>
11 #include <sys/types.h>
15 class eStaticServiceFSInformation: public iStaticServiceInformation
17 DECLARE_REF(eStaticServiceFSInformation);
19 RESULT getName(const eServiceReference &ref, std::string &name);
20 int getLength(const eServiceReference &ref) { return -1; }
23 DEFINE_REF(eStaticServiceFSInformation);
25 RESULT eStaticServiceFSInformation::getName(const eServiceReference &ref, std::string &name)
33 eServiceFactoryFS::eServiceFactoryFS()
35 ePtr<eServiceCenter> sc;
37 eServiceCenter::getPrivInstance(sc);
39 sc->addServiceFactory(eServiceFactoryFS::id, this);
41 m_service_information = new eStaticServiceFSInformation();
44 eServiceFactoryFS::~eServiceFactoryFS()
46 ePtr<eServiceCenter> sc;
48 eServiceCenter::getPrivInstance(sc);
50 sc->removeServiceFactory(eServiceFactoryFS::id);
53 DEFINE_REF(eServiceFactoryFS)
56 RESULT eServiceFactoryFS::play(const eServiceReference &ref, ePtr<iPlayableService> &ptr)
62 RESULT eServiceFactoryFS::record(const eServiceReference &ref, ePtr<iRecordableService> &ptr)
68 RESULT eServiceFactoryFS::list(const eServiceReference &ref, ePtr<iListableService> &ptr)
70 ptr = new eServiceFS(ref.path.c_str());
74 RESULT eServiceFactoryFS::info(const eServiceReference &ref, ePtr<iStaticServiceInformation> &ptr)
76 ptr = m_service_information;
80 RESULT eServiceFactoryFS::offlineOperations(const eServiceReference &, ePtr<iServiceOfflineOperations> &ptr)
88 DEFINE_REF(eServiceFS);
90 eServiceFS::eServiceFS(const char *path): path(path)
95 eServiceFS::~eServiceFS()
99 RESULT eServiceFS::getContent(std::list<eServiceReference> &list, bool sorted)
101 DIR *d=opendir(path.c_str());
104 while (dirent *e=readdir(d))
106 if (!(strcmp(e->d_name, ".") && strcmp(e->d_name, "..")))
109 std::string filename;
112 filename += e->d_name;
115 if (::stat(filename.c_str(), &s) < 0)
118 if (S_ISDIR(s.st_mode))
121 if (S_ISDIR(s.st_mode))
123 eServiceReference service(eServiceFactoryFS::id,
124 eServiceReference::isDirectory|
125 eServiceReference::canDescent|eServiceReference::mustDescent|
126 eServiceReference::shouldSort|eServiceReference::sort1,
129 list.push_back(service);
132 size_t e = filename.rfind('.');
133 std::string extension = (e != std::string::npos) ? filename.substr(e) : "";
136 if (extension == ".ts")
137 type = eServiceFactoryDVB::id;
138 else if (extension == ".mp3")
140 else if (extension == ".ogg")
142 else if (extension == ".mpg")
144 else if (extension == ".vob")
146 else if (extension == ".wav" || extension == ".wave")
151 eServiceReference service(type,
155 list.push_back(service);
162 list.sort(iListableServiceCompare(this));
167 RESULT eServiceFS::getContent(PyObject *list, bool sorted)
169 if (!list || !PyList_Check(list))
172 std::list<eServiceReference> tmplist;
174 getContent(tmplist, sorted);
177 tmplist.sort(iListableServiceCompare(this));
179 for (std::list<eServiceReference>::iterator it(tmplist.begin());
180 it != tmplist.end(); ++it)
182 PyObject *refobj = New_eServiceReference(*it);
183 PyList_Append(list, refobj);
190 RESULT eServiceFS::getNext(eServiceReference &ptr)
195 int res = getContent(m_list);
202 ptr = eServiceReference();
206 ptr = m_list.front();
211 int eServiceFS::compareLessEqual(const eServiceReference &a, const eServiceReference &b)
213 /* directories first */
214 if ((a.flags & ~b.flags) & eServiceReference::isDirectory)
216 else if ((~a.flags & b.flags) & eServiceReference::isDirectory)
218 /* sort by filename */
220 return a.path < b.path;
223 RESULT eServiceFS::startEdit(ePtr<iMutableServiceList> &res)
229 eAutoInitPtr<eServiceFactoryFS> init_eServiceFactoryFS(eAutoInitNumbers::service+1, "eServiceFactoryFS");