summaryrefslogtreecommitdiff
path: root/src/devreaderfactory.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devreaderfactory.cpp')
-rw-r--r--src/devreaderfactory.cpp128
1 files changed, 128 insertions, 0 deletions
diff --git a/src/devreaderfactory.cpp b/src/devreaderfactory.cpp
new file mode 100644
index 0000000..c2fc656
--- /dev/null
+++ b/src/devreaderfactory.cpp
@@ -0,0 +1,128 @@
+/***************************************************************************
+ devreaderfactory.cpp
+ --------------------
+ begin : Fri Nov 16 2007
+ copyright : (C) 2007 - 2012 by Roland Riegel
+ email : feedback@roland-riegel.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "devreaderfactory.h"
+
+#include "config.h"
+
+#include "devreader.h"
+#include "devreader-bsd.h"
+#include "devreader-hpux.h"
+#include "devreader-linux-proc.h"
+#include "devreader-linux-sys.h"
+#include "devreader-linux.h"
+#include "devreader-solaris.h"
+
+#include <string>
+#include <list>
+#include <map>
+
+using namespace std;
+
+map<string, DevReader*> DevReaderFactory::m_devReaders;
+DevReaderFactory DevReaderFactory::m_instance;
+
+DevReaderFactory::DevReaderFactory()
+{
+}
+
+DevReaderFactory::~DevReaderFactory()
+{
+ for(map<string, DevReader*>::const_iterator it = m_devReaders.begin(); it != m_devReaders.end(); ++it)
+ delete it->second;
+
+ m_devReaders.clear();
+}
+
+int DevReaderFactory::findAllDevices()
+{
+#if defined HAVE_BSD
+ list<string> interfaceNames = DevReaderBsd::findAllDevices();
+#elif defined HAVE_HPUX
+ list<string> interfaceNames = DevReaderHpux::findAllDevices();
+#elif defined HAVE_LINUX
+ list<string> interfaceNames = DevReaderLinux::findAllDevices();
+#elif defined HAVE_SOLARIS
+ list<string> interfaceNames = DevReaderSolaris::findAllDevices();
+#endif
+
+ map<string, DevReader*>::iterator devReaderIt = m_devReaders.begin();
+ while(devReaderIt != m_devReaders.end())
+ {
+ list<string>::iterator interfaceIt = interfaceNames.begin();
+ list<string>::iterator interfaceItEnd = interfaceNames.end();
+
+ while(*interfaceIt != devReaderIt->first && interfaceIt != interfaceItEnd)
+ ++interfaceIt;
+
+ // delete all devices which disappeared
+ if(interfaceIt == interfaceItEnd)
+ {
+ delete devReaderIt->second;
+ m_devReaders.erase(devReaderIt++);
+ }
+ // delete all entries in the interface name list which we know of already
+ else
+ {
+ interfaceNames.erase(interfaceIt);
+ devReaderIt++;
+ }
+ }
+
+ // the interface name list now contains only devices which just appeared in the system
+ for(list<string>::const_iterator it = interfaceNames.begin(); it != interfaceNames.end(); ++it)
+ {
+ DevReader* newReader = createDevReader(*it);
+ if(newReader)
+ m_devReaders[*it] = newReader;
+ }
+
+ return m_devReaders.size();
+}
+
+int DevReaderFactory::getDeviceCount()
+{
+ return m_devReaders.size();
+}
+
+const map<string, DevReader*>& DevReaderFactory::getAllDevReaders()
+{
+ return m_devReaders;
+}
+
+DevReader* DevReaderFactory::createDevReader(const string& deviceName)
+{
+ DevReader* reader = 0;
+
+#if defined HAVE_BSD
+ reader = new DevReaderBsd(deviceName);
+#elif defined HAVE_HPUX
+ reader = new DevReaderHpux(deviceName);
+#elif defined HAVE_LINUX
+ if(DevReaderLinuxSys::isAvailable())
+ reader = new DevReaderLinuxSys(deviceName);
+ else if(DevReaderLinuxProc::isAvailable())
+ reader = new DevReaderLinuxProc(deviceName);
+ else
+ reader = 0;
+#elif defined HAVE_SOLARIS
+ reader = new DevReaderSolaris(deviceName);
+#endif
+
+ return reader;
+}
+