encode/decode in fromString/toString so colons and other special characters will...
[enigma2.git] / lib / service / service.cpp
index aa1ee4d..a044c66 100644 (file)
@@ -4,7 +4,52 @@
 #include <lib/service/service.h>
 #include <lib/base/init_num.h>
 #include <lib/base/init.h>
 #include <lib/service/service.h>
 #include <lib/base/init_num.h>
 #include <lib/base/init.h>
-#include <Python.h>
+#include <lib/python/python.h>
+
+static std::string encode(const std::string s)
+{
+       int len = s.size();
+       std::string res;
+       int i;
+       for (i=0; i<len; ++i)
+       {
+               unsigned char c = s[i];
+               if ((c == ':') || (c < 32) || (c == '%'))
+               {
+                       res += "%";
+                       char hex[8];
+                       snprintf(hex, 8, "%02x", c);
+                       res += hex;
+               } else
+                       res += c;
+       }
+       return res;
+}
+
+static std::string decode(const std::string s)
+{
+       int len = s.size();
+       std::string res;
+       int i;
+       for (i=0; i<len; ++i)
+       {
+               unsigned char c = s[i];
+               if (c != '%')
+                       res += c;
+               else
+               {
+                       i += 2;
+                       if (i >= len)
+                               break;
+                       char s[3] = {s[i - 1], s[i], 0};
+                       unsigned char r = strtoul(s, 0, 0x10);
+                       if (r)
+                               res += r;
+               }
+       }
+       return res;
+}
+
 
 eServiceReference::eServiceReference(const std::string &string)
 {
 
 eServiceReference::eServiceReference(const std::string &string)
 {
@@ -35,6 +80,9 @@ eServiceReference::eServiceReference(const std::string &string)
                else
                        path=pathstr;
        }
                else
                        path=pathstr;
        }
+       
+       path = decode(path);
+       name = decode(name);
 }
 
 std::string eServiceReference::toString() const
 }
 
 std::string eServiceReference::toString() const
@@ -45,9 +93,9 @@ std::string eServiceReference::toString() const
        ret += getNum(flags);
        for (unsigned int i=0; i<sizeof(data)/sizeof(*data); ++i)
                ret+=":"+ getNum(data[i], 0x10);
        ret += getNum(flags);
        for (unsigned int i=0; i<sizeof(data)/sizeof(*data); ++i)
                ret+=":"+ getNum(data[i], 0x10);
-       ret+=":"+path;
+       ret+=":"+encode(path); /* we absolutely have a problem when the path contains a ':' (for example: http://). we need an encoding here. */
        if (name.length())
        if (name.length())
-               ret+=":"+name;
+               ret+=":"+encode(name);
        return ret;
 }
 
        return ret;
 }
 
@@ -58,7 +106,7 @@ std::string eServiceReference::toCompareString() const
        ret += ":0";
        for (unsigned int i=0; i<sizeof(data)/sizeof(*data); ++i)
                ret+=":"+getNum(data[i], 0x10);
        ret += ":0";
        for (unsigned int i=0; i<sizeof(data)/sizeof(*data); ++i)
                ret+=":"+getNum(data[i], 0x10);
-       ret+=":"+path;
+       ret+=":"+encode(path);
        return ret;
 }
 
        return ret;
 }
 
@@ -171,9 +219,9 @@ int iStaticServiceInformation::getLength(const eServiceReference &ref)
        return -1;
 }
 
        return -1;
 }
 
-bool iStaticServiceInformation::isPlayable(const eServiceReference &ref, const eServiceReference &ignore)
+int iStaticServiceInformation::isPlayable(const eServiceReference &ref, const eServiceReference &ignore)
 {
 {
-       return true;
+       return 0;
 }
 
 RESULT iServiceInformation::getEvent(ePtr<eServiceEvent> &evt, int m_nownext)
 }
 
 RESULT iServiceInformation::getEvent(ePtr<eServiceEvent> &evt, int m_nownext)
@@ -192,6 +240,11 @@ std::string iStaticServiceInformation::getInfoString(const eServiceReference &re
        return "";
 }
 
        return "";
 }
 
+PyObject *iStaticServiceInformation::getInfoObject(const eServiceReference &ref, int w)
+{
+       Py_RETURN_NONE;
+}
+
 int iServiceInformation::getInfo(int w)
 {
        return -1;
 int iServiceInformation::getInfo(int w)
 {
        return -1;
@@ -204,8 +257,27 @@ std::string iServiceInformation::getInfoString(int w)
 
 PyObject* iServiceInformation::getInfoObject(int w)
 {
 
 PyObject* iServiceInformation::getInfoObject(int w)
 {
-       Py_INCREF(Py_None);
-       return Py_None;
+       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<eServiceCenter> init_eServiceCenter(eAutoInitNumbers::service, "eServiceCenter");
 }
 
 eAutoInitPtr<eServiceCenter> init_eServiceCenter(eAutoInitNumbers::service, "eServiceCenter");