1 #include <lib/base/eerror.h>
2 #include <lib/base/estring.h>
3 #include <lib/python/python.h>
4 #include <lib/service/service.h>
5 #include <lib/base/init_num.h>
6 #include <lib/base/init.h>
7 #include <lib/python/python.h>
9 static std::string encode(const std::string s)
16 unsigned char c = s[i];
17 if ((c == ':') || (c < 32) || (c == '%'))
21 snprintf(hex, 8, "%02x", c);
29 static std::string decode(const std::string s)
36 unsigned char c = s[i];
44 char t[3] = {s[i - 1], s[i], 0};
45 unsigned char r = strtoul(t, 0, 0x10);
54 eServiceReference::eServiceReference(const std::string &string)
56 const char *c=string.c_str();
61 else if ( sscanf(c, "%d:%d:%x:%x:%x:%x:%x:%x:%x:%x:%n", &type, &flags, &data[0], &data[1], &data[2], &data[3], &data[4], &data[5], &data[6], &data[7], &pathl) < 8 )
63 memset( data, 0, sizeof(data) );
64 eDebug("find old format eServiceReference string");
65 if ( sscanf(c, "%d:%d:%x:%x:%x:%x:%n", &type, &flags, &data[0], &data[1], &data[2], &data[3], &pathl) < 2 )
71 const char *pathstr = c+pathl;
72 const char *namestr = strchr(pathstr, ':');
75 if (!strncmp(namestr, "://", 3)) // The path is a url (e.g. "http://...")
77 namestr = strchr(namestr, ' ');
80 path.assign(pathstr, namestr - pathstr);
87 if (pathstr != namestr)
88 path.assign(pathstr, namestr-pathstr);
101 std::string eServiceReference::toString() const
106 ret += getNum(flags);
107 for (unsigned int i=0; i<sizeof(data)/sizeof(*data); ++i)
108 ret+=":"+ getNum(data[i], 0x10);
109 ret+=":"+encode(path); /* we absolutely have a problem when the path contains a ':' (for example: http://). we need an encoding here. */
111 ret+=":"+encode(name);
115 std::string eServiceReference::toCompareString() const
120 for (unsigned int i=0; i<sizeof(data)/sizeof(*data); ++i)
121 ret+=":"+getNum(data[i], 0x10);
122 ret+=":"+encode(path);
126 eServiceCenter *eServiceCenter::instance;
128 eServiceCenter::eServiceCenter()
132 eDebug("settings instance.");
137 eServiceCenter::~eServiceCenter()
139 if (instance == this)
141 eDebug("clear instance");
146 DEFINE_REF(eServiceCenter);
148 RESULT eServiceCenter::play(const eServiceReference &ref, ePtr<iPlayableService> &ptr)
150 std::map<int,ePtr<iServiceHandler> >::iterator i = handler.find(ref.type);
151 if (i == handler.end())
156 return i->second->play(ref, ptr);
159 RESULT eServiceCenter::record(const eServiceReference &ref, ePtr<iRecordableService> &ptr)
161 std::map<int,ePtr<iServiceHandler> >::iterator i = handler.find(ref.type);
162 if (i == handler.end())
167 return i->second->record(ref, ptr);
170 RESULT eServiceCenter::list(const eServiceReference &ref, ePtr<iListableService> &ptr)
172 std::map<int,ePtr<iServiceHandler> >::iterator i = handler.find(ref.type);
173 if (i == handler.end())
178 return i->second->list(ref, ptr);
181 RESULT eServiceCenter::info(const eServiceReference &ref, ePtr<iStaticServiceInformation> &ptr)
183 std::map<int,ePtr<iServiceHandler> >::iterator i = handler.find(ref.type);
184 if (i == handler.end())
189 return i->second->info(ref, ptr);
192 RESULT eServiceCenter::offlineOperations(const eServiceReference &ref, ePtr<iServiceOfflineOperations> &ptr)
194 std::map<int,ePtr<iServiceHandler> >::iterator i = handler.find(ref.type);
195 if (i == handler.end())
200 return i->second->offlineOperations(ref, ptr);
203 RESULT eServiceCenter::addServiceFactory(int id, iServiceHandler *hnd, std::list<std::string> &extensions)
205 handler.insert(std::pair<int,ePtr<iServiceHandler> >(id, hnd));
206 this->extensions[id]=extensions;
210 RESULT eServiceCenter::removeServiceFactory(int id)
213 extensions.erase(id);
217 RESULT eServiceCenter::addFactoryExtension(int id, const char *extension)
219 std::map<int, std::list<std::string> >::iterator it = extensions.find(id);
220 if (it == extensions.end())
222 it->second.push_back(extension);
226 RESULT eServiceCenter::removeFactoryExtension(int id, const char *extension)
228 std::map<int, std::list<std::string> >::iterator it = extensions.find(id);
229 if (it == extensions.end())
231 it->second.remove(extension);
236 int eServiceCenter::getServiceTypeForExtension(const char *str)
238 for (std::map<int, std::list<std::string> >::iterator sit(extensions.begin()); sit != extensions.end(); ++sit)
240 for (std::list<std::string>::iterator eit(sit->second.begin()); eit != sit->second.end(); ++eit)
249 int eServiceCenter::getServiceTypeForExtension(const std::string &str)
251 return getServiceTypeForExtension(str.c_str());
254 /* default handlers */
255 RESULT iServiceHandler::info(const eServiceReference &, ePtr<iStaticServiceInformation> &ptr)
261 #include <lib/service/event.h>
263 RESULT iStaticServiceInformation::getEvent(const eServiceReference &ref, ePtr<eServiceEvent> &evt, time_t start_time)
269 int iStaticServiceInformation::getLength(const eServiceReference &ref)
274 int iStaticServiceInformation::isPlayable(const eServiceReference &ref, const eServiceReference &ignore, bool simulate)
279 RESULT iServiceInformation::getEvent(ePtr<eServiceEvent> &evt, int m_nownext)
285 int iStaticServiceInformation::getInfo(const eServiceReference &ref, int w)
290 std::string iStaticServiceInformation::getInfoString(const eServiceReference &ref, int w)
295 PyObject *iStaticServiceInformation::getInfoObject(const eServiceReference &ref, int w)
300 int iServiceInformation::getInfo(int w)
305 std::string iServiceInformation::getInfoString(int w)
310 PyObject* iServiceInformation::getInfoObject(int w)
315 int iStaticServiceInformation::setInfo(const eServiceReference &ref, int w, int v)
320 int iStaticServiceInformation::setInfoString(const eServiceReference &ref, int w, const char *v)
325 int iServiceInformation::setInfo(int w, int v)
330 int iServiceInformation::setInfoString(int w, const char *v)
335 eAutoInitPtr<eServiceCenter> init_eServiceCenter(eAutoInitNumbers::service, "eServiceCenter");