X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/d0899514fa9495013cb73c8ead8c5a5baaf49111..fab31898f5892e9841b5c4f24fe505bd216e0ab2:/lib/service/service.cpp diff --git a/lib/service/service.cpp b/lib/service/service.cpp index 3a59d444..eb2757ab 100644 --- a/lib/service/service.cpp +++ b/lib/service/service.cpp @@ -1,23 +1,88 @@ #include #include +#include #include #include #include +#include + +static std::string encode(const std::string s) +{ + int len = s.size(); + std::string res; + int i; + for (i=0; i= len) + break; + char t[3] = {s[i - 1], s[i], 0}; + unsigned char r = strtoul(t, 0, 0x10); + if (r) + res += r; + } + } + return res; +} + eServiceReference::eServiceReference(const std::string &string) { const char *c=string.c_str(); - int pathl=-1; - - 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 ) + int pathl=0; + + if (!string.length()) + type = idInvalid; + 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 ) { memset( data, 0, sizeof(data) ); eDebug("find old format eServiceReference string"); - sscanf(c, "%d:%d:%x:%x:%x:%x:%n", &type, &flags, &data[0], &data[1], &data[2], &data[3], &pathl); + if ( sscanf(c, "%d:%d:%x:%x:%x:%x:%n", &type, &flags, &data[0], &data[1], &data[2], &data[3], &pathl) < 2 ) + type = idInvalid; } if (pathl) - path=c+pathl; + { + const char *pathstr = c+pathl; + const char *namestr = strchr(pathstr, ':'); + if (namestr) + { + if (pathstr != namestr) + path.assign(pathstr, namestr-pathstr); + if (*(namestr+1)) + name=namestr+1; + } + else + path=pathstr; + } + + path = decode(path); + name = decode(name); } std::string eServiceReference::toString() const @@ -27,13 +92,23 @@ std::string eServiceReference::toString() const ret += ":"; ret += getNum(flags); for (unsigned int i=0; isecond->offlineOperations(ref, ptr); } -RESULT eServiceCenter::addServiceFactory(int id, iServiceHandler *hnd) +RESULT eServiceCenter::addServiceFactory(int id, iServiceHandler *hnd, std::list &extensions) { handler.insert(std::pair >(id, hnd)); + this->extensions[id]=extensions; return 0; } RESULT eServiceCenter::removeServiceFactory(int id) { handler.erase(id); + extensions.erase(id); return 0; } +int eServiceCenter::getServiceTypeForExtension(const char *str) +{ + for (std::map >::iterator sit(extensions.begin()); sit != extensions.end(); ++sit) + { + for (std::list::iterator eit(sit->second.begin()); eit != sit->second.end(); ++eit) + { + if (*eit == str) + return sit->first; + } + } + return -1; +} + +int eServiceCenter::getServiceTypeForExtension(const std::string &str) +{ + return getServiceTypeForExtension(str.c_str()); +} + /* default handlers */ RESULT iServiceHandler::info(const eServiceReference &, ePtr &ptr) { @@ -133,11 +228,76 @@ RESULT iServiceHandler::info(const eServiceReference &, ePtr +RESULT iStaticServiceInformation::getEvent(const eServiceReference &ref, ePtr &evt, time_t start_time) +{ + evt = 0; + return -1; +} + +int iStaticServiceInformation::getLength(const eServiceReference &ref) +{ + return -1; +} + +int iStaticServiceInformation::isPlayable(const eServiceReference &ref, const eServiceReference &ignore, bool simulate) +{ + return 0; +} + RESULT iServiceInformation::getEvent(ePtr &evt, int m_nownext) -{ +{ evt = 0; return -1; } +int iStaticServiceInformation::getInfo(const eServiceReference &ref, int w) +{ + return -1; +} + +std::string iStaticServiceInformation::getInfoString(const eServiceReference &ref, int w) +{ + return ""; +} + +PyObject *iStaticServiceInformation::getInfoObject(const eServiceReference &ref, int w) +{ + Py_RETURN_NONE; +} + +int iServiceInformation::getInfo(int w) +{ + return -1; +} + +std::string iServiceInformation::getInfoString(int w) +{ + return ""; +} + +PyObject* iServiceInformation::getInfoObject(int w) +{ + Py_RETURN_NONE; +} + +int iStaticServiceInformation::setInfo(const eServiceReference &ref, int w, int v) +{ + return -1; +} + +int iStaticServiceInformation::setInfoString(const eServiceReference &ref, int w, const char *v) +{ + return -1; +} + +int iServiceInformation::setInfo(int w, int v) +{ + return -1; +} + +int iServiceInformation::setInfoString(int w, const char *v) +{ + return -1; +} eAutoInitPtr init_eServiceCenter(eAutoInitNumbers::service, "eServiceCenter");