service: add sort of servicelist including all required layers
authorFelix Domke <tmbinc@elitedvb.net>
Sun, 9 Oct 2005 03:32:46 +0000 (03:32 +0000)
committerFelix Domke <tmbinc@elitedvb.net>
Sun, 9 Oct 2005 03:32:46 +0000 (03:32 +0000)
lib/dvb/db.cpp
lib/dvb/db.h
lib/dvb/idvb.h
lib/python/Components/ServiceList.py
lib/service/iservice.h
lib/service/listboxservice.cpp
lib/service/listboxservice.h
lib/service/servicedvb.cpp
lib/service/servicedvb.h
lib/service/servicefs.cpp
lib/service/servicefs.h

index fdcd428d720fa6fff3824502baf4abd9b2a36dbc..314a96ec3066ee39ed709fb8c673b74977007c55 100644 (file)
@@ -21,6 +21,7 @@ eDVBService::~eDVBService()
 eDVBService &eDVBService::operator=(const eDVBService &s)
 {
        m_service_name = s.m_service_name;
 eDVBService &eDVBService::operator=(const eDVBService &s)
 {
        m_service_name = s.m_service_name;
+       m_service_name_sort = s.m_service_name_sort;
        m_provider_name = s.m_provider_name;
        m_flags = s.m_flags;
        m_ca = s.m_ca;
        m_provider_name = s.m_provider_name;
        m_flags = s.m_flags;
        m_ca = s.m_ca;
@@ -30,7 +31,7 @@ eDVBService &eDVBService::operator=(const eDVBService &s)
 
 RESULT eDVBService::getName(const eServiceReference &ref, std::string &name)
 {
 
 RESULT eDVBService::getName(const eServiceReference &ref, std::string &name)
 {
-       name = convertDVBUTF8(m_service_name);
+       name = m_service_name;
        return 0;
 }
 
        return 0;
 }
 
@@ -45,7 +46,7 @@ int eDVBService::checkFilter(const eServiceReferenceDVB &ref, const eDVBChannelQ
        switch (query.m_type)
        {
        case eDVBChannelQuery::tName:
        switch (query.m_type)
        {
        case eDVBChannelQuery::tName:
-               res = m_service_name.find(query.m_string) != std::string::npos;
+               res = m_service_name_sort.find(query.m_string) != std::string::npos;
                break;
        case eDVBChannelQuery::tProvider:
                res = m_provider_name.find(query.m_string) != std::string::npos;
                break;
        case eDVBChannelQuery::tProvider:
                res = m_provider_name.find(query.m_string) != std::string::npos;
@@ -213,7 +214,11 @@ void eDVBDB::load()
                fgets(line, 256, f);
                if (strlen(line))
                        line[strlen(line)-1]=0;
                fgets(line, 256, f);
                if (strlen(line))
                        line[strlen(line)-1]=0;
-               s->m_service_name=line;
+
+               s->m_service_name = line;
+               s->m_service_name_sort = removeDVBChars(line);
+               makeUpper(s->m_service_name_sort);
+
                fgets(line, 256, f);
                if (strlen(line))
                        line[strlen(line)-1]=0;
                fgets(line, 256, f);
                if (strlen(line))
                        line[strlen(line)-1]=0;
@@ -416,10 +421,62 @@ RESULT eDVBDBQuery::getNextResult(eServiceReferenceDVB &ref)
                if (res)
                        return 0;
        }
                if (res)
                        return 0;
        }
+       
+       ref = eServiceReferenceDVB();
        return 1;
 }
 
        return 1;
 }
 
-/* (<name|provider|type|bouquet|satpos|chid> <==|...> <"string"|int>)[AND (..)] */
+int eDVBDBQuery::compareLessEqual(const eServiceReferenceDVB &a, const eServiceReferenceDVB &b)
+{
+       ePtr<eDVBService> a_service, b_service;
+       
+       int sortmode = m_query ? m_query->m_sort : eDVBChannelQuery::tName;
+       
+       if ((sortmode == eDVBChannelQuery::tName) || (sortmode == eDVBChannelQuery::tProvider))
+       {
+               if (m_db->getService(a, a_service))
+                       return 1;
+               if (m_db->getService(b, b_service))
+                       return 1;
+       }
+       
+       switch (sortmode)
+       {
+       case eDVBChannelQuery::tName:
+               return a_service->m_service_name_sort < b_service->m_service_name_sort;
+       case eDVBChannelQuery::tProvider:
+               return a_service->m_provider_name < b_service->m_provider_name;
+       case eDVBChannelQuery::tType:
+               return a.getServiceType() < b.getServiceType();
+       case eDVBChannelQuery::tBouquet:
+               return 1;
+       case eDVBChannelQuery::tSatellitePosition:
+               return (a.getDVBNamespace().get() >> 16) < (b.getDVBNamespace().get() >> 16);
+       default:
+               return 1;
+       }
+       return 0;
+}
+
+/* (<name|provider|type|bouquet|satpos|chid> <==|...> <"string"|int>)[||,&& (..)] */
+
+static int decodeType(const std::string &type)
+{
+       if (type == "name")
+               return eDVBChannelQuery::tName;
+       else if (type == "provider")
+               return eDVBChannelQuery::tProvider;
+       else if (type == "type")
+               return eDVBChannelQuery::tType;
+       else if (type == "bouquet")
+               return eDVBChannelQuery::tBouquet;
+       else if (type == "satellitePosition")
+               return eDVBChannelQuery::tSatellitePosition;
+       else if (type == "channelID")
+               return eDVBChannelQuery::tChannelID;
+       else
+               return -1;
+}
 
        /* never, NEVER write a parser in C++! */
 RESULT parseExpression(ePtr<eDVBChannelQuery> &res, std::list<std::string>::const_iterator begin, std::list<std::string>::const_iterator end)
 
        /* never, NEVER write a parser in C++! */
 RESULT parseExpression(ePtr<eDVBChannelQuery> &res, std::list<std::string>::const_iterator begin, std::list<std::string>::const_iterator end)
@@ -449,12 +506,16 @@ RESULT parseExpression(ePtr<eDVBChannelQuery> &res, std::list<std::string>::cons
                
                        /* we had only one sub expression */
                if (end_of_exp == end)
                
                        /* we had only one sub expression */
                if (end_of_exp == end)
-                       return 1;
+               {
+                       eDebug("only one sub expression");
+                       return 0;
+               }
                
                        /* otherwise we have an operator here.. */
                
                ePtr<eDVBChannelQuery> r2 = res;
                res = new eDVBChannelQuery();
                
                        /* otherwise we have an operator here.. */
                
                ePtr<eDVBChannelQuery> r2 = res;
                res = new eDVBChannelQuery();
+               res->m_sort = 0;
                res->m_p1 = r2;
                res->m_inverse = 0;
                r2 = 0;
                res->m_p1 = r2;
                res->m_inverse = 0;
                r2 = 0;
@@ -479,6 +540,7 @@ RESULT parseExpression(ePtr<eDVBChannelQuery> &res, std::list<std::string>::cons
        std::string type, op, val;
        
        res = new eDVBChannelQuery();
        std::string type, op, val;
        
        res = new eDVBChannelQuery();
+       res->m_sort = 0;
        
        int cnt = 0;
        while (begin != end)
        
        int cnt = 0;
        while (begin != end)
@@ -509,27 +571,15 @@ RESULT parseExpression(ePtr<eDVBChannelQuery> &res, std::list<std::string>::cons
                return 1;
        }
        
                return 1;
        }
        
-       if (type == "name")
-               res->m_type = eDVBChannelQuery::tName;
-       else if (type == "provider")
-               res->m_type = eDVBChannelQuery::tProvider;
-       else if (type == "type")
-               res->m_type = eDVBChannelQuery::tType;
-       else if (type == "bouquet")
-               res->m_type = eDVBChannelQuery::tBouquet;
-       else if (type == "satellitePosition")
-               res->m_type = eDVBChannelQuery::tSatellitePosition;
-       else if (type == "channelID")
-               res->m_type = eDVBChannelQuery::tChannelID;
-       else
+       res->m_type = decodeType(type);
+       
+       if (res->m_type == -1)
        {
                eDebug("malformed query: invalid type %s", type.c_str());
                res = 0;
                return 1;
        }
        
        {
                eDebug("malformed query: invalid type %s", type.c_str());
                res = 0;
                return 1;
        }
        
-       eDebug("type is %d, nice!", res->m_type);
-       
        if (op == "==")
                res->m_inverse = 0;
        else if (op == "!=")
        if (op == "==")
                res->m_inverse = 0;
        else if (op == "!=")
@@ -554,7 +604,7 @@ RESULT eDVBChannelQuery::compile(ePtr<eDVBChannelQuery> &res, std::string query)
        
        std::string current_token;
        
        
        std::string current_token;
        
-//     eDebug("splitting %s....", query.c_str());
+       eDebug("splitting %s....", query.c_str());
        unsigned int i = 0;
        const char *splitchars="()";
        int quotemode = 0, lastsplit = 0, lastalnum = 0;
        unsigned int i = 0;
        const char *splitchars="()";
        int quotemode = 0, lastsplit = 0, lastalnum = 0;
@@ -594,15 +644,45 @@ RESULT eDVBChannelQuery::compile(ePtr<eDVBChannelQuery> &res, std::string query)
 //     {
 //             printf("%s\n", a->c_str());
 //     }
 //     {
 //             printf("%s\n", a->c_str());
 //     }
+
+       int sort = eDVBChannelQuery::tName;
+               /* check for "ORDER BY ..." */
+       if (tokens.size() > 2)
+       {
+               std::list<std::string>::iterator i = tokens.end();
+               --i; --i; --i;
+               if (*i == "ORDER")
+               {
+                       ++i;
+                       if (*i == "BY")
+                       {
+                               ++i;
+                               sort = decodeType(*i);
+                               tokens.pop_back(); // ...
+                               tokens.pop_back(); // BY
+                               tokens.pop_back(); // ORDER
+                       } else
+                               sort = -1;
+               }
+       }
+       
+       if (sort == -1)
+       {       
+               eWarning("ORDER BY .. string invalid.");
+               res = 0;
+               return -1;
+       }
+       
+       eDebug("sort by %d", sort);
        
                /* now we recursivly parse that. */
        
                /* now we recursivly parse that. */
-       return  parseExpression(res, tokens.begin(), tokens.end());
-/*     
-       res = new eDVBChannelQuery();
-       res->m_type = eDVBChannelQuery::tName;
-       res->m_inverse = 0;
-       res->m_string = query;
-       return 0; */
+       int r = parseExpression(res, tokens.begin(), tokens.end());
+       
+       if (res)
+               res->m_sort = sort;
+
+       eDebug("return: %d", r);
+       return r;
 }
 
 DEFINE_REF(eDVBChannelQuery);
 }
 
 DEFINE_REF(eDVBChannelQuery);
index 084c877ade5911bd59b7c3a39e9d9ce4045574b8..604d5288c1a3e81f17aa528dc80778ef37f70448 100644 (file)
@@ -56,6 +56,8 @@ private:
 public:
        eDVBDBQuery(eDVBDB *db, const eServiceReference &source, eDVBChannelQuery *query);
        virtual RESULT getNextResult(eServiceReferenceDVB &ref);
 public:
        eDVBDBQuery(eDVBDB *db, const eServiceReference &source, eDVBChannelQuery *query);
        virtual RESULT getNextResult(eServiceReferenceDVB &ref);
+       
+       int compareLessEqual(const eServiceReferenceDVB &a, const eServiceReferenceDVB &b);
 };
 
 #endif
 };
 
 #endif
index add9ba8526829569ca8bc077381a5bc0ff5a1f70..d94bf5fd798774e64796f783027a7b571915aa21 100644 (file)
@@ -180,7 +180,8 @@ public:
        bool cacheEmpty() { return m_cache.empty(); }
 
        eDVBService();
        bool cacheEmpty() { return m_cache.empty(); }
 
        eDVBService();
-       std::string m_service_name;
+               /* m_service_name_sort is uppercase, with special chars removed, to increase sort performance. */
+       std::string m_service_name, m_service_name_sort;
        std::string m_provider_name;
        
        int m_flags;
        std::string m_provider_name;
        
        int m_flags;
@@ -194,7 +195,7 @@ public:
        RESULT getName(const eServiceReference &ref, std::string &name);
        int getLength(const eServiceReference &ref);
        
        RESULT getName(const eServiceReference &ref, std::string &name);
        int getLength(const eServiceReference &ref);
        
-       // for filtering:
+               /* for filtering: */
        int checkFilter(const eServiceReferenceDVB &ref, const eDVBChannelQuery &query);
 };
 
        int checkFilter(const eServiceReferenceDVB &ref, const eDVBChannelQuery &query);
 };
 
@@ -208,6 +209,7 @@ class iDVBChannelListQuery: public iObject
 {
 public:
        virtual RESULT getNextResult(eServiceReferenceDVB &ref)=0;
 {
 public:
        virtual RESULT getNextResult(eServiceReferenceDVB &ref)=0;
+       virtual int compareLessEqual(const eServiceReferenceDVB &a, const eServiceReferenceDVB &b)=0;
 };
 
 class eDVBChannelQuery: public iObject
 };
 
 class eDVBChannelQuery: public iObject
@@ -233,6 +235,9 @@ public:
        int m_int;
        eDVBChannelID m_channelid;
        
        int m_int;
        eDVBChannelID m_channelid;
        
+               /* sort is only valid in root, and must be from the enum above. */
+       int m_sort;
+       
        static RESULT compile(ePtr<eDVBChannelQuery> &res, std::string query);
        
        ePtr<eDVBChannelQuery> m_p1, m_p2;
        static RESULT compile(ePtr<eDVBChannelQuery> &res, std::string query);
        
        ePtr<eDVBChannelQuery> m_p1, m_p2;
index 73727403d5dba723cc90ac6f7e5878c0496ef462..93c79296203134cfea0b69c17fe971e8930e407a 100644 (file)
@@ -32,6 +32,7 @@ class ServiceList(HTMLComponent, GUIComponent):
 
        def setRoot(self, root):
                self.l.setRoot(root)
 
        def setRoot(self, root):
                self.l.setRoot(root)
+               self.l.sort()
                
                # mark stuff
        def clearMarked(self):
                
                # mark stuff
        def clearMarked(self):
index 54d7b11f29d494aa76b90ab6bc541dde00f10ce5..d0dc1e2b2cb93bdb9bbfb8f1b85422fdcaf0cd8c 100644 (file)
@@ -250,10 +250,29 @@ public:
        
                /* new, shiny interface: streaming. */
        virtual SWIG_VOID(RESULT) getNext(eServiceReference &SWIG_OUTPUT)=0;
        
                /* new, shiny interface: streaming. */
        virtual SWIG_VOID(RESULT) getNext(eServiceReference &SWIG_OUTPUT)=0;
+       
+               /* use this for sorting. output is not sorted because of either
+                - performance reasons: the whole list must be buffered or
+                - the interface would be restricted to a list. streaming
+                  (as well as a future "active" extension) won't be possible.
+               */
+       virtual int compareLessEqual(const eServiceReference &, const eServiceReference &)=0;
 };
 
 TEMPLATE_TYPEDEF(ePtr<iListableService>, iListableServicePtr);
 
 };
 
 TEMPLATE_TYPEDEF(ePtr<iListableService>, iListableServicePtr);
 
+       /* a helper class which can be used as argument to stl's sort(). */
+class iListableServiceCompare
+{
+       ePtr<iListableService> m_list;
+public:
+       iListableServiceCompare(iListableService *list): m_list(list) { }
+       bool operator()(const eServiceReference &a, const eServiceReference &b)
+       {
+               return m_list->compareLessEqual(a, b);
+       }
+};
+
 class iServiceOfflineOperations: public iObject
 {
 public:
 class iServiceOfflineOperations: public iObject
 {
 public:
index 0783872230ed6b5e54fb91279062fd2642e65762..d4cbff208a0da0f1f8077a9762156710d58dcb2a 100644 (file)
@@ -108,6 +108,19 @@ void eListboxServiceContent::setElementFont(int element, gFont *font)
                m_element_font[element] = font;
 }
 
                m_element_font[element] = font;
 }
 
+void eListboxServiceContent::sort()
+{
+       ePtr<iListableService> lst;
+  if (!m_service_center->list(m_root, lst))
+  {
+               m_list.sort(iListableServiceCompare(lst));
+                       /* FIXME: is this really required or can we somehow keep the current entry? */
+               cursorHome();
+               if (m_listbox)
+                       m_listbox->entryReset();
+       }
+}
+
 DEFINE_REF(eListboxServiceContent);
 
 eListboxServiceContent::eListboxServiceContent()
 DEFINE_REF(eListboxServiceContent);
 
 eListboxServiceContent::eListboxServiceContent()
index f560b62733fd4e2c3701b1bf879b1059faaf2c56..4e5a8dd57ac4e381cb6371222003ad07ed2d9abe 100644 (file)
@@ -45,6 +45,8 @@ public:
        void setElementPosition(int element, eRect where);
        void setElementFont(int element, gFont *font);
        
        void setElementPosition(int element, eRect where);
        void setElementFont(int element, gFont *font);
        
+       void sort();
+       
 protected:
        void cursorHome();
        void cursorEnd();
 protected:
        void cursorHome();
        void cursorEnd();
index ca08d481bd52c1b6c012aada84b1154bf1e7e3ea..a29b77ce74d160dbb93e82c559a78e5ef8524e46 100644 (file)
@@ -36,6 +36,7 @@ RESULT eStaticServiceDVBPVRInformation::getName(const eServiceReference &ref, st
 {
        ASSERT(ref == m_ref);
        name = m_parser.m_name.size() ? m_parser.m_name : ref.path;
 {
        ASSERT(ref == m_ref);
        name = m_parser.m_name.size() ? m_parser.m_name : ref.path;
+       return 0;
 }
 
 int eStaticServiceDVBPVRInformation::getLength(const eServiceReference &ref)
 }
 
 int eStaticServiceDVBPVRInformation::getLength(const eServiceReference &ref)
@@ -133,7 +134,7 @@ eDVBServiceList::~eDVBServiceList()
 {
 }
 
 {
 }
 
-RESULT eDVBServiceList::getContent(std::list<eServiceReference> &list)
+RESULT eDVBServiceList::startQuery()
 {
        ePtr<iDVBChannelList> db;
        ePtr<eDVBResourceManager> res;
 {
        ePtr<iDVBChannelList> db;
        ePtr<eDVBResourceManager> res;
@@ -150,30 +151,50 @@ RESULT eDVBServiceList::getContent(std::list<eServiceReference> &list)
                return err;
        }
        
                return err;
        }
        
-       ePtr<iDVBChannelListQuery> query;
-       
        ePtr<eDVBChannelQuery> q;
        
        if (m_parent.path.size())
        ePtr<eDVBChannelQuery> q;
        
        if (m_parent.path.size())
+       {
                eDVBChannelQuery::compile(q, m_parent.path);
                eDVBChannelQuery::compile(q, m_parent.path);
+               if (!q)
+               {
+                       eDebug("compile query failed");
+                       return err;
+               }
+       }
        
        
-       if ((err = db->startQuery(query, q)) != 0)
+       if ((err = db->startQuery(m_query, q)) != 0)
        {
                eDebug("startQuery failed");
                return err;
        }
        {
                eDebug("startQuery failed");
                return err;
        }
-       
+
+       return 0;
+}
+
+RESULT eDVBServiceList::getContent(std::list<eServiceReference> &list)
+{
        eServiceReferenceDVB ref;
        
        eServiceReferenceDVB ref;
        
-       while (!query->getNextResult(ref))
+       if (!m_query)
+               return -1;
+       
+       while (!m_query->getNextResult(ref))
                list.push_back(ref);
        return 0;
 }
 
                list.push_back(ref);
        return 0;
 }
 
-RESULT eDVBServiceList::getNext(eServiceReference &)
+RESULT eDVBServiceList::getNext(eServiceReference &ref)
 {
 {
-               /* implement me */
-       return -1;
+       if (!m_query)
+               return -1;
+       
+       return m_query->getNextResult((eServiceReferenceDVB&)ref);
+}
+
+int eDVBServiceList::compareLessEqual(const eServiceReference &a, const eServiceReference &b)
+{
+       return m_query->compareLessEqual((const eServiceReferenceDVB&)a, (const eServiceReferenceDVB&)b);
 }
 
 RESULT eServiceFactoryDVB::play(const eServiceReference &ref, ePtr<iPlayableService> &ptr)
 }
 
 RESULT eServiceFactoryDVB::play(const eServiceReference &ref, ePtr<iPlayableService> &ptr)
@@ -195,7 +216,14 @@ RESULT eServiceFactoryDVB::record(const eServiceReference &ref, ePtr<iRecordable
 
 RESULT eServiceFactoryDVB::list(const eServiceReference &ref, ePtr<iListableService> &ptr)
 {
 
 RESULT eServiceFactoryDVB::list(const eServiceReference &ref, ePtr<iListableService> &ptr)
 {
-       ptr = new eDVBServiceList(ref);
+       ePtr<eDVBServiceList> list = new eDVBServiceList(ref);
+       if (list->startQuery())
+       {
+               ptr = 0;
+               return -1;
+       }
+       
+       ptr = list;
        return 0;
 }
 
        return 0;
 }
 
@@ -389,6 +417,7 @@ RESULT eDVBServicePlay::start()
        eDebug("starting DVB service");
        r = m_service_handler.tune((eServiceReferenceDVB&)m_reference);
        m_event(this, evStart);
        eDebug("starting DVB service");
        r = m_service_handler.tune((eServiceReferenceDVB&)m_reference);
        m_event(this, evStart);
+       return 0;
 }
 
 RESULT eDVBServicePlay::stop()
 }
 
 RESULT eDVBServicePlay::stop()
@@ -459,8 +488,11 @@ RESULT eDVBServicePlay::info(ePtr<iServiceInformation> &ptr)
 RESULT eDVBServicePlay::getName(std::string &name)
 {
        if (m_dvb_service)
 RESULT eDVBServicePlay::getName(std::string &name)
 {
        if (m_dvb_service)
+       {
                m_dvb_service->getName(m_reference, name);
                m_dvb_service->getName(m_reference, name);
-       else
+               if (name.empty())
+                       name = "(...)";
+       } else
                name = "DVB service";
        return 0;
 }
                name = "DVB service";
        return 0;
 }
index accdd20d33f23ca002c6b1c25eab97980396c4e1..57dca9a0eb20c630fa943c29085af9ac3e2900bc 100644 (file)
@@ -28,14 +28,17 @@ private:
 class eDVBServiceList: public iListableService
 {
 DECLARE_REF(eDVBServiceList);
 class eDVBServiceList: public iListableService
 {
 DECLARE_REF(eDVBServiceList);
-private:
-       eServiceReference m_parent;
-       friend class eServiceFactoryDVB;
-       eDVBServiceList(const eServiceReference &parent);
 public:
        virtual ~eDVBServiceList();
        RESULT getContent(std::list<eServiceReference> &list);
        RESULT getNext(eServiceReference &ptr);
 public:
        virtual ~eDVBServiceList();
        RESULT getContent(std::list<eServiceReference> &list);
        RESULT getNext(eServiceReference &ptr);
+       int compareLessEqual(const eServiceReference &a, const eServiceReference &b);
+private:
+       RESULT startQuery();
+       eServiceReference m_parent;
+       friend class eServiceFactoryDVB;
+       eDVBServiceList(const eServiceReference &parent);
+       ePtr<iDVBChannelListQuery> m_query;
 };
 
 class eDVBServicePlay: public iPlayableService, iSeekableService, public Object, public iServiceInformation
 };
 
 class eDVBServicePlay: public iPlayableService, iSeekableService, public Object, public iServiceInformation
index 057498d751de0191cb6a79426cbdaece4b55d451..c5846abd653d4428adbc4ccefca52095813f679b 100644 (file)
@@ -163,4 +163,16 @@ RESULT eServiceFS::getNext(eServiceReference &ptr)
        return 0;
 }
 
        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;
+}
+
 eAutoInitPtr<eServiceFactoryFS> init_eServiceFactoryFS(eAutoInitNumbers::service+1, "eServiceFactoryFS");
 eAutoInitPtr<eServiceFactoryFS> init_eServiceFactoryFS(eAutoInitNumbers::service+1, "eServiceFactoryFS");
index 73bfd985d416991ddc326c547ec39a43ee2feceb..3400fb853752646f5110ba4e983f435d699f832c 100644 (file)
@@ -36,6 +36,7 @@ public:
        
        RESULT getContent(std::list<eServiceReference> &list);
        RESULT getNext(eServiceReference &ptr);
        
        RESULT getContent(std::list<eServiceReference> &list);
        RESULT getNext(eServiceReference &ptr);
+       int compareLessEqual(const eServiceReference &, const eServiceReference &);
 };
 
 #endif
 };
 
 #endif