aboutsummaryrefslogtreecommitdiff
path: root/lib/service/service.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/service/service.cpp')
-rw-r--r--lib/service/service.cpp94
1 files changed, 94 insertions, 0 deletions
diff --git a/lib/service/service.cpp b/lib/service/service.cpp
new file mode 100644
index 00000000..99199aa9
--- /dev/null
+++ b/lib/service/service.cpp
@@ -0,0 +1,94 @@
+#include <lib/service/service.h>
+#include <lib/base/init_num.h>
+#include <lib/base/init.h>
+
+eServiceReference::eServiceReference(const eString &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 )
+ {
+ 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 (pathl)
+ path=c+pathl;
+}
+
+eString eServiceReference::toString() const
+{
+ eString ret;
+ ret+=eString().sprintf("%d:", type);
+ ret+=eString().sprintf("%d", flags);
+ for (unsigned int i=0; i<sizeof(data)/sizeof(*data); ++i)
+ ret+=":"+eString().sprintf("%x", data[i]);
+ ret+=":"+path;
+ return ret;
+}
+
+
+eServiceCenter *eServiceCenter::instance;
+
+eServiceCenter::eServiceCenter()
+{
+ if (!instance)
+ instance = this;
+}
+
+eServiceCenter::~eServiceCenter()
+{
+ if (instance == this)
+ instance = 0;
+}
+
+DEFINE_REF(eServiceCenter);
+
+RESULT eServiceCenter::play(const eServiceReference &ref, ePtr<iPlayableService> &ptr)
+{
+ std::map<int,ePtr<iServiceHandler> >::iterator i = handler.find(ref.type);
+ if (i == handler.end())
+ {
+ ptr = 0;
+ return -1;
+ }
+ return i->second->play(ref, ptr);
+}
+
+RESULT eServiceCenter::record(const eServiceReference &ref, ePtr<iRecordableService> &ptr)
+{
+ std::map<int,ePtr<iServiceHandler> >::iterator i = handler.find(ref.type);
+ if (i == handler.end())
+ {
+ ptr = 0;
+ return -1;
+ }
+ return i->second->record(ref, ptr);
+}
+
+RESULT eServiceCenter::list(const eServiceReference &ref, ePtr<iListableService> &ptr)
+{
+ std::map<int,ePtr<iServiceHandler> >::iterator i = handler.find(ref.type);
+ if (i == handler.end())
+ {
+ ptr = 0;
+ return -1;
+ }
+ return i->second->list(ref, ptr);
+}
+
+RESULT eServiceCenter::addServiceFactory(int id, iServiceHandler *hnd)
+{
+ handler.insert(std::pair<int,ePtr<iServiceHandler> >(id, hnd));
+ return 0;
+}
+
+RESULT eServiceCenter::removeServiceFactory(int id)
+{
+ handler.erase(id);
+ return 0;
+}
+
+eAutoInitP0<eServiceCenter> init_eServiceCenter(eAutoInitNumbers::service, "eServiceCenter");