All pastes #1893567 Raw Edit

Someone

public cpp v1 · immutable
#1893567 ·published 2010-07-02 20:33 UTC
rendered paste body
diff --git a/kdnssd/kdedmodule/dnssdwatcher.desktop b/kdnssd/kdedmodule/dnssdwatcher.desktopindex 12168a3..fd44a51 100644--- a/kdnssd/kdedmodule/dnssdwatcher.desktop+++ b/kdnssd/kdedmodule/dnssdwatcher.desktop@@ -8,6 +8,7 @@ Name[de]=DNS-SD-Dienst-berwachung Name[en_GB]=DNS-SD Service Discovery Monitor Name[es]=Monitor para descubrir servicios DNS-SD Name[et]=DNS-SD teenuste tuvastamise jlgija+Name[fr]=Dcouverte de services DNS-SD Name[hr]=Nadzornik otkrivanja usluga DNS-SD-a Name[it]=Rilevamento di servizi DNS-SD Name[kk]=DNS-SD   @@ -31,6 +32,7 @@ Comment[de]=berwacht das Netzwerk nach DNS-SD-Diensten Comment[en_GB]=Monitors the network for DNS-SD services Comment[es]=Monitorizar la red en busca de servicios DNS-SD Comment[et]=DNS-SD teenuste vrgu jlgimine+Comment[fr]=Surveille le rseau et recherche les services DNS-SD Comment[hr]=Nadgleda mreu za usluge DNS-SD-a Comment[it]=Controlla la presenza di servizi DNS-SD nella rete Comment[kk]= DNS-SD   diff --git a/kget/extensions/konqueror/CMakeLists.txt b/kget/extensions/konqueror/CMakeLists.txtindex 57d6ad7..ba47ba4 100644--- a/kget/extensions/konqueror/CMakeLists.txt+++ b/kget/extensions/konqueror/CMakeLists.txt@@ -26,7 +26,7 @@ QT4_ADD_DBUS_INTERFACE(kget_browser_integration_SRCS ../../dbus/org.kde.kget.mai  kde4_add_plugin(kget_browser_integration ${kget_browser_integration_SRCS}) -target_link_libraries(kget_browser_integration ${KDE4_KHTML_LIBS})+target_link_libraries(kget_browser_integration ${KDE4_KHTML_LIBS} ${KDE4_KIO_LIBRARY})  if(KWEBKITPART_FOUND)     target_link_libraries(kget_browser_integration ${KWEBKITPART_LIBRARIES} ${KDE4_KDEUI_LIBRARY} ${QT_QTWEBKIT_LIBRARY})@@ -37,6 +37,7 @@ install(TARGETS kget_browser_integration DESTINATION ${PLUGIN_INSTALL_DIR}) ########### install files ###############  install(FILES kget_plug_in.rc DESTINATION ${DATA_INSTALL_DIR}/khtml/kpartplugins)+install(FILES kget_plug_in.rc DESTINATION ${DATA_INSTALL_DIR}/dolphinpart/kpartplugins)  if (KWEBKITPART_FOUND)     install(FILES kget_plug_in.rc DESTINATION ${DATA_INSTALL_DIR}/kwebkitpart/kpartplugins)diff --git a/kget/extensions/konqueror/kget_plug_in.cpp b/kget/extensions/konqueror/kget_plug_in.cppindex a0ff509..f7f2f9d 100644--- a/kget/extensions/konqueror/kget_plug_in.cpp+++ b/kget/extensions/konqueror/kget_plug_in.cpp@@ -41,15 +41,167 @@ #include <QtWebKit/QWebElementCollection> #endif +KGet_plug_in::KGet_plug_in( QObject* parent )+  : Plugin(parent),+    m_dolphinPart(0),+    m_type(None)+{+    KActionMenu *menu = new KActionMenu(KIcon("kget"), i18n("Download Manager"),+                                        actionCollection());+    actionCollection()->addAction("kget_menu", menu);++    menu->setDelayed( false );+    connect( menu->menu(), SIGNAL( aboutToShow() ), SLOT( showPopup() ));++    m_dropTargetAction = new KToggleAction(i18n("Show Drop Target"), actionCollection());++    connect(m_dropTargetAction, SIGNAL(triggered()), this, SLOT(slotShowDrop()));+    actionCollection()->addAction("show_drop", m_dropTargetAction);+    menu->addAction(m_dropTargetAction);++    QAction *showLinksAction = actionCollection()->addAction("show_links");+    showLinksAction->setText(i18n("List All Links"));+    connect(showLinksAction, SIGNAL(triggered()), SLOT(slotShowLinks()));+    menu->addAction(showLinksAction);++    QAction *showSelectedLinksAction = actionCollection()->addAction("show_selected_links");+    showSelectedLinksAction->setText(i18n("List Selected Links"));+    connect(showSelectedLinksAction, SIGNAL(triggered()), SLOT(slotShowSelectedLinks()));+    menu->addAction(showSelectedLinksAction);++    if (parent) {+        if (parent->inherits("KHTMLPart")) {+            m_type = KHTMLType;+        } else if (parent->inherits("KWebKitPart")) {+            m_type = KWebkitType;+        } else if (parent->inherits("DolphinPart")) {+            m_type = DolphinType;+        }+    }++    //FIXME once DolphinPart gets exported+    if ((m_type != KHTMLType) && (m_type != KWebkitType))//TODO support also for DolphinPart? --> DolphinView::selectedUrls()+        actionCollection()->action("show_selected_links")->setVisible(false);++    if (m_type == DolphinType) {+        m_dolphinPart = qobject_cast<KParts::ReadOnlyPart*>(parent);+        connect(m_dolphinPart, SIGNAL(started(KIO::Job*)), this, SLOT(slotCheckUrlDolphin()));//TODO use aboutToOpenURL from DolphinPart instead?+    }+}+++KGet_plug_in::~KGet_plug_in()+{+}++void KGet_plug_in::slotCheckUrlDolphin()+{+    m_dolphinPartUrl = m_dolphinPart->url();+    const QString protocol = m_dolphinPartUrl.protocol();+    const bool visible = protocol.contains("ftp");+    actionCollection()->action("kget_menu")->setVisible(visible);+}+ -QStringList getLinks(QObject *obj, bool selectedOnly = false)+void KGet_plug_in::showPopup() {+    bool hasDropTarget = false;++    if(QDBusConnection::sessionBus().interface()->isServiceRegistered("org.kde.kget"))+    {+        OrgKdeKgetMainInterface kgetInterface("org.kde.kget", "/KGet", QDBusConnection::sessionBus());+        QDBusReply<bool> reply = kgetInterface.dropTargetVisible();+        if (reply.isValid())+            hasDropTarget = reply.value();+    }++    m_dropTargetAction->setChecked(hasDropTarget);++    bool enabled = false;+    if (m_type == KHTMLType) {+        const QString selectedHtml = qobject_cast<KHTMLPart*>(parent())->selectedTextAsHTML();+        DOM::HTMLDocument document;+        document.open();+        document.write( selectedHtml );+        document.close();+        enabled = (document.getElementsByTagName("a").length() > 0);+    }+#ifdef HAVE_KWEBKITPART+    else if (m_type == KWebkitType)+    {+        // TODO: Find a way to find links and images in selected content.+        // No straight forward way to accomplish this in QtWebKit without+        // resorting to javascript based hacks right now!+    }+#endif+    actionCollection()->action("show_selected_links")->setEnabled(enabled);+}++void KGet_plug_in::slotShowDrop()+{+    if(!QDBusConnection::sessionBus().interface()->isServiceRegistered("org.kde.kget")) {+        QWidget *parentWidget = 0;+        if (m_type == KHTMLType)+            parentWidget = qobject_cast<KHTMLPart*>(parent())->widget();+#ifdef HAVE_KWEBKITPART+        else if (m_type == KWebkitType)+            parentWidget = qobject_cast<KWebKitPart*>(parent())->view();+#endif+        else if (m_type == DolphinType) {+            parentWidget = qobject_cast<KParts::ReadOnlyPart*>(parent())->widget();+        }+        KRun::runCommand("kget --showDropTarget --hideMainWindow", "kget", "kget", parentWidget);+    } else {+        OrgKdeKgetMainInterface kgetInterface("org.kde.kget", "/KGet", QDBusConnection::sessionBus());+        kgetInterface.setDropTargetVisible(m_dropTargetAction->isChecked());+    }+}++void KGet_plug_in::slotShowLinks()+{+    getLinks(false);+}++void KGet_plug_in::slotShowSelectedLinks()+{+    getLinks(true);+}++void KGet_plug_in::slotImportLinks()+{+    if (m_linkList.isEmpty()) {+        KParts::ReadOnlyPart *part = qobject_cast<KParts::ReadOnlyPart *>(parent());+        KMessageBox::sorry(part ? part->widget() : 0,+                           i18n("There are no links in the active frame of the current HTML page."),+                           i18n("No Links"));+        return;+    }++    // Remove any duplicates links from the list...+    m_linkList.removeDuplicates();++    if (!QDBusConnection::sessionBus().interface()->isServiceRegistered("org.kde.kget") &&+        KToolInvocation::kdeinitExecWait("kget") != 0)+    {+        KParts::ReadOnlyPart *part = qobject_cast<KParts::ReadOnlyPart *>(parent());+        KMessageBox::sorry(part ? part->widget() : 0,+                           i18n("Unable to communicate with the KGet download manager."),+                           i18n("Communication Error"));+        return;+    }++    OrgKdeKgetMainInterface kgetInterface("org.kde.kget", "/KGet", QDBusConnection::sessionBus());+    kgetInterface.importLinks(m_linkList);+}++void KGet_plug_in::getLinks(bool selectedOnly)+{+    QObject *obj = parent();     Q_ASSERT(obj); -    QStringList linkList;+    m_linkList.clear(); -    if (obj->inherits("KHTMLPart"))-    { +    if (m_type == KHTMLType) {         KHTMLPart *htmlPart = qobject_cast<KHTMLPart*>(obj);         KParts::Part *activePart = 0;         @@ -86,9 +238,9 @@ QStringList getLinks(QObject *obj, bool selectedOnly = false)                 if ( link.isNull() || link.nodeType() != DOM::Node::ELEMENT_NODE )                     continue; -                LinkItem *item = new LinkItem( (DOM::Element) link );+                LinkItem *item = new LinkItem( (DOM::Element) link );//TODO remove C cast                 if (item->isValid())-                    linkList.append(item->url.url());+                    m_linkList.append(item->url.url());                 else                     delete item;             }@@ -97,20 +249,20 @@ QStringList getLinks(QObject *obj, bool selectedOnly = false)             for ( uint i = 0; i < images.length(); i++ )             {                 DOM::Node image  = images.item( i );-                if ( image.isNull() || image.nodeType() != DOM::Node::ELEMENT_NODE )+                if ( image.isNull() || image.nodeType() != DOM::Node::ELEMENT_NODE )//TODO remove C cast                     continue;                  LinkItem *item = new LinkItem( (DOM::Element) image );                 if (item->isValid())-                    linkList.append(item->url.url());+                    m_linkList.append(item->url.url());                 else                     delete item;             }         }+        slotImportLinks();     } #ifdef HAVE_KWEBKITPART-    else if (obj->inherits("KWebKitPart"))-    {+    else if (m_type == KWebkitType) {         KWebKitPart *part = qobject_cast<KWebKitPart*>(obj);         Q_ASSERT(part); @@ -146,149 +298,36 @@ QStringList getLinks(QObject *obj, bool selectedOnly = false)                      const QUrl url = frame->baseUrl().resolved(QUrl(element.attribute("href")));                     if (url.isValid())-                        linkList << url.toString();+                        m_linkList << url.toString();                 }             }         }+        slotImportLinks();     } #endif--    return linkList;-}--KGet_plug_in::KGet_plug_in( QObject* parent )-             :Plugin(parent)-{-    KActionMenu *menu = new KActionMenu(KIcon("kget"), i18n("Download Manager"),-                                        actionCollection());-    actionCollection()->addAction("kget_menu", menu);--    menu->setDelayed( false );-    connect( menu->menu(), SIGNAL( aboutToShow() ), SLOT( showPopup() ));--    m_dropTargetAction = new KToggleAction(i18n("Show Drop Target"), actionCollection());--    connect(m_dropTargetAction, SIGNAL(triggered()), this, SLOT(slotShowDrop()));-    actionCollection()->addAction("show_drop", m_dropTargetAction);-    menu->addAction(m_dropTargetAction);--    QAction *showLinksAction = actionCollection()->addAction("show_links");-    showLinksAction->setText(i18n("List All Links"));-    connect(showLinksAction, SIGNAL(triggered()), SLOT(slotShowLinks()));-    menu->addAction(showLinksAction);--    QAction *showSelectedLinksAction = actionCollection()->addAction("show_selected_links");-    showSelectedLinksAction->setText(i18n("List Selected Links"));-    connect(showSelectedLinksAction, SIGNAL(triggered()), SLOT(slotShowSelectedLinks()));-    menu->addAction(showSelectedLinksAction);--    if (parent && !parent->inherits("KHTMLPart") && !parent->inherits("KWebKitPart"))-        actionCollection()->action("show_selected_links")->setVisible(false);-}---KGet_plug_in::~KGet_plug_in()-{-}---void KGet_plug_in::showPopup()-{-    bool hasDropTarget = false;--    if(QDBusConnection::sessionBus().interface()->isServiceRegistered("org.kde.kget"))-    {-        OrgKdeKgetMainInterface kgetInterface("org.kde.kget", "/KGet", QDBusConnection::sessionBus());-        QDBusReply<bool> reply = kgetInterface.dropTargetVisible();-        if (reply.isValid())-            hasDropTarget = reply.value();-    }--    m_dropTargetAction->setChecked(hasDropTarget);--    if ( parent() )-    {-        bool enabled = false;-        if (parent()->inherits("KHTMLPart"))-        {-            const QString selectedHtml = qobject_cast<KHTMLPart*>(parent())->selectedTextAsHTML();-            DOM::HTMLDocument document;-            document.open();-            document.write( selectedHtml );-            document.close();-            enabled = (document.getElementsByTagName("a").length() > 0);-        }-#ifdef HAVE_KWEBKITPART-        else if (parent()->inherits("KWebKitPart"))-        {-          // TODO: Find a way to find links and images in selected content.-          // No straight forward way to accomplish this in QtWebKit without-          // resorting to javascript based hacks right now!-        }-#endif-        actionCollection()->action("show_selected_links")->setEnabled(enabled);+    else if (m_type == DolphinType) {+        const KUrl url = qobject_cast<KParts::ReadOnlyPart*>(obj)->url();+        KIO::ListJob *list = KIO::listDir(m_dolphinPartUrl, KIO::HideProgressInfo);//TODO link with KIO?+        connect(list, SIGNAL(entries(KIO::Job*,KIO::UDSEntryList)), this, SLOT(slotEntries(KIO::Job*,KIO::UDSEntryList)));+        connect(list, SIGNAL(finished(KJob*)), this, SLOT(slotImportLinks()));     } } -void KGet_plug_in::slotShowDrop()+void KGet_plug_in::slotEntries(KIO::Job *job, const KIO::UDSEntryList &entries) {-    if(!QDBusConnection::sessionBus().interface()->isServiceRegistered("org.kde.kget")) {-        QWidget *parentWidget = 0;-        if (parent())-        {-            if (parent()->inherits("KHTMLPart"))-                parentWidget = qobject_cast<KHTMLPart*>(parent())->widget();-#ifdef HAVE_KWEBKITPART-            else if (parent()->inherits("KWebKitPart"))-                parentWidget = qobject_cast<KWebKitPart*>(parent())->view();-#endif-            KRun::runCommand("kget --showDropTarget --hideMainWindow", "kget", "kget", parentWidget);+    Q_UNUSED(job)++    const QString baseUrl = m_dolphinPartUrl.url(KUrl::AddTrailingSlash);+    foreach (const KIO::UDSEntry &entry, entries) {+        //skip all found dirs+        if (!entry.isDir()) {+            const QString name = entry.stringValue(KIO::UDSEntry::UDS_NAME);+            m_linkList << baseUrl + name;         }-    } else {-        OrgKdeKgetMainInterface kgetInterface("org.kde.kget", "/KGet", QDBusConnection::sessionBus());-        kgetInterface.setDropTargetVisible(m_dropTargetAction->isChecked());     } } -void KGet_plug_in::slotShowLinks()-{-    showLinks(false);-} -void KGet_plug_in::slotShowSelectedLinks()-{-    showLinks(true);-}--void KGet_plug_in::showLinks( bool selectedOnly )-{-    QStringList linkList = getLinks(parent(), selectedOnly);--    if ( linkList.isEmpty() )-    {-        KParts::ReadOnlyPart *part = qobject_cast<KParts::ReadOnlyPart *>(parent());-        KMessageBox::sorry(part ? part->widget() : 0,-                           i18n("There are no links in the active frame of the current HTML page."),-                           i18n("No Links"));-        return;-    }--    // Remove any duplicates links from the list...-    linkList.removeDuplicates();--    if (!QDBusConnection::sessionBus().interface()->isServiceRegistered("org.kde.kget") &&-        KToolInvocation::kdeinitExecWait("kget") != 0)-    {-        KParts::ReadOnlyPart *part = qobject_cast<KParts::ReadOnlyPart *>(parent());-        KMessageBox::sorry(part ? part->widget() : 0,-                           i18n("Unable to communicate with the KGet download manager."),-                           i18n("Communication Error"));-        return;-    }--    OrgKdeKgetMainInterface kgetInterface("org.kde.kget", "/KGet", QDBusConnection::sessionBus());-    kgetInterface.importLinks(linkList);-}  KGetPluginFactory::KGetPluginFactory( QObject* parent )                   :KPluginFactory("kget", "kget", parent)diff --git a/kget/extensions/konqueror/kget_plug_in.h b/kget/extensions/konqueror/kget_plug_in.hindex 78a7a9e..ec45a40 100644--- a/kget/extensions/konqueror/kget_plug_in.h+++ b/kget/extensions/konqueror/kget_plug_in.h@@ -11,11 +11,16 @@ #ifndef PLUGIN_KGET_PLUG_IN_H #define PLUGIN_KGET_PLUG_IN_H +#include <KIO/Job> #include <kparts/plugin.h> #include <KPluginFactory>  class KToggleAction; +namespace KParts {+    class ReadOnlyPart;+}+  class KGet_plug_in : public KParts::Plugin {@@ -25,14 +30,37 @@ public:     KToggleAction *m_dropTargetAction;     virtual ~KGet_plug_in(); +    enum PartType {+        None = 0,+        KHTMLType,+        KWebkitType,+        DolphinType+    };+ private:-    void showLinks( bool );+    void getLinks(bool selectedOnly = false);  private slots:     void slotShowDrop();     void slotShowLinks();     void slotShowSelectedLinks();+    void slotImportLinks();+    /**+     * Only show the KGet Plugin in the DolphinPart, if the selected Url is ftp or sftp+     */+    void slotCheckUrlDolphin();++    /**+     * Links of the DolphinPart, gotten by a listJob+     */+    void slotEntries(KIO::Job *job, const KIO::UDSEntryList &entries);     void showPopup();++private:+    KParts::ReadOnlyPart *m_dolphinPart;+    KUrl m_dolphinPartUrl;+    PartType m_type;+    QStringList m_linkList; };  diff --git a/kget/sounds/kget.notifyrc b/kget/sounds/kget.notifyrcindex 3c9bdb6..b511fea 100644--- a/kget/sounds/kget.notifyrc+++ b/kget/sounds/kget.notifyrc@@ -9,6 +9,7 @@ Comment[de]=KGet-Download-Verwaltung Comment[en_GB]=KGet Download Manager Comment[es]=Gestor de descargas KGet Comment[et]=KGeti allalaadimiste haldur+Comment[fr]=Gestionnaire de tlchargements KGet Comment[hr]=Upravitelj preuzimanja KGet Comment[it]=Gestore degli scaricamenti KGet Comment[kk]=KGet  diff --git a/kopete/kopete/kopete.notifyrc b/kopete/kopete/kopete.notifyrcindex 75327cb..9d7c1cf 100644--- a/kopete/kopete/kopete.notifyrc+++ b/kopete/kopete/kopete.notifyrc@@ -2948,6 +2948,7 @@ Name[da]=Skriver en besked Name[de]=Nachricht wird geschrieben Name[en_GB]=Typing message Name[et]=Snumi kirjutamine+Name[fr]=Rdaction en cours Name[hr]=Pie poruku Name[it]=Messaggio in battitura Name[kk]= @@ -2971,6 +2972,7 @@ Comment[da]=En bruger er ved at skrive en besked Comment[de]=Ein Benutzer schreibt eine Nachricht Comment[en_GB]=An user is typing a message Comment[et]=Kasutaja kirjutab snumit+Comment[fr]=Un utilisateur crit un message Comment[hr]=Korisnik pie poruku Comment[it]=Un utente sta scrivendo un messaggio Comment[kk]=   diff --git a/kopete/libkopete/avdevice/CMakeLists.txt b/kopete/libkopete/avdevice/CMakeLists.txtindex ea3d27f..2186c97 100644--- a/kopete/libkopete/avdevice/CMakeLists.txt+++ b/kopete/libkopete/avdevice/CMakeLists.txt@@ -15,6 +15,8 @@ endif (LIBV4L2_FOUND) set(kopete_videodevice_LIB_SRCS     videodevice.cpp     videoinput.cpp +   dummyvideodevice.cpp+   videodevicevector.cpp    videodevicepool.cpp     bayer.cpp    sonix_compress.cpp )diff --git a/kopete/libkopete/avdevice/dummyvideodevice.cpp b/kopete/libkopete/avdevice/dummyvideodevice.cppnew file mode 100644index 0000000..91feaac--- /dev/null+++ b/kopete/libkopete/avdevice/dummyvideodevice.cpp@@ -0,0 +1,196 @@+/*+    dummyvideodevice.cpp  -  Dummy Video Device++    Copyright (c) 2009 by Alan Jones <skyphyr@gmail.com>++    Kopete    (c) 2002-2009      by the Kopete developers  <kopete-devel@kde.org>++    *************************************************************************+    *                                                                       *+    * This library is free software; you can redistribute it and/or         *+    * modify it under the terms of the GNU Lesser General Public            *+    * License as published by the Free Software Foundation; either          *+    * version 2 of the License, or (at your option) any later version.      *+    *                                                                       *+    * This program is distributed in the hope that it will be useful,       *+    * but WITHOUT ANY WARRANTY; without even the implied warranty of        *+    * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *+    * GNU General Public License for more details.                          *+    *                                                                       *+    * You should have received a copy of the GNU General Public License     *+    * along with this program.  If not, see <http://www.gnu.org/licenses/>. *+    *************************************************************************+*/++#include "dummyvideodevice.h"+#include "videoinput.h"++namespace Kopete {++namespace AV {++DummyVideoDevice::DummyVideoDevice()+	{+	//need to set a bunch of defaults for members+	m_pixelformat = PIXELFORMAT_RGB32;+	m_driver=VIDEODEV_DRIVER_NONE;+	m_input.append(VideoInput());+	minwidth = 160;+	maxwidth = 1280;+	minheight = 120;+	maxheight = 960;+	//let's be opened by default seeing this is a fallback +	opened = true;+	setSize(320, 240);+	}++int DummyVideoDevice::open()+	{+	//wow - we always succeed in opening our dummy device+	opened = true;+	return EXIT_SUCCESS;+	}+	+bool DummyVideoDevice::isOpen()+	{+	//we'll track it just incase there is situations where it's expected not to be open+	return opened;+	}+	+int DummyVideoDevice::checkDevice()+	{+	//again this is just incase anything ever relies on it failing when closed+	if(isOpen())+		{+		//need to check which, if any, of these need to be enabled for this to function properly+		m_videocapture=false;+		m_videochromakey=false;+		m_videoscale=false;+		m_videooverlay=false;+		m_videoread=false;+		m_videoasyncio=false;+		m_videostream=false;++		m_driver=VIDEODEV_DRIVER_NONE;+		return EXIT_SUCCESS;+		}+	return EXIT_FAILURE;+	}+	+int DummyVideoDevice::initDevice()+	{+	//again this is just incase anything ever relies on it failing when closed+	if(isOpen())+		{+		return EXIT_SUCCESS;+		}+	return EXIT_FAILURE;+	}+	+int DummyVideoDevice::setSize( int newwidth, int newheight)+	{+	if (isOpen())+		{+		if(newwidth  > maxwidth ) newwidth  = maxwidth;+		if(newheight > maxheight) newheight = maxheight;+		if(newwidth  < minwidth ) newwidth  = minwidth;+		if(newheight < minheight) newheight = minheight;++		currentwidth  = newwidth;+		currentheight = newheight;+		+		m_currentbuffer.width = currentwidth;+		m_currentbuffer.height = currentheight;+		m_currentbuffer.pixelformat = m_pixelformat;+		+		//let's fill the buffer up with something+		//TODO: replace this with an .svg that says there is no camera available+		m_currentbuffer.data.resize(currentwidth * currentheight * 4);+		for (int i=0; i<m_currentbuffer.data.size(); i++)+			{+			m_currentbuffer.data[i] = 255;+			}+		+		return EXIT_SUCCESS;+		}+	return EXIT_FAILURE;+	}+	+pixel_format DummyVideoDevice::setPixelFormat(pixel_format newformat)+	{+	pixel_format ret = PIXELFORMAT_NONE;+	+	if (newformat == PIXELFORMAT_RGB32)+		{+		m_pixelformat = newformat;+		ret = m_pixelformat;+		}+	+	return ret;+	}+	+int DummyVideoDevice::startCapturing()+	{+	//again this is just incase anything ever relies on it failing when closed+	if(isOpen())+		{+		return EXIT_SUCCESS;+		}+	return EXIT_FAILURE;+	}+	+int DummyVideoDevice::getFrame()+	{+	//again this is just incase anything ever relies on it failing when closed+	if(isOpen())+		{+		return EXIT_SUCCESS;+		}+	return EXIT_FAILURE;+	}+	+int DummyVideoDevice::getFrame(imagebuffer *imgbuffer)+	{+	if(imgbuffer)+	{+		imgbuffer->height      = m_currentbuffer.height;+		imgbuffer->width       = m_currentbuffer.width;+		imgbuffer->pixelformat = m_currentbuffer.pixelformat;+		imgbuffer->data        = m_currentbuffer.data;+		return EXIT_SUCCESS;+	}+	return EXIT_FAILURE;+	}+	+int DummyVideoDevice::getImage(QImage *qimage)+	{+	// do NOT delete qimage here, as it is received as a parameter+	if (qimage->width() != width() || qimage->height() != height())+		*qimage = QImage(width(), height(), QImage::Format_RGB32);++	uchar *bits=qimage->bits();+	memcpy(bits,&m_currentbuffer.data[0], m_currentbuffer.data.size());+	+	return EXIT_SUCCESS;+	}+	+int DummyVideoDevice::stopCapturing()+	{+	//again this is just incase anything ever relies on it failing when closed+	if(isOpen())+		{+		return EXIT_SUCCESS;+		}+	return EXIT_FAILURE;+	}+	+int DummyVideoDevice::close()+	{+	//we always manage to close it too - amazing :)+	opened = false;+	return EXIT_SUCCESS;+	}++}++}diff --git a/kopete/libkopete/avdevice/dummyvideodevice.h b/kopete/libkopete/avdevice/dummyvideodevice.hnew file mode 100644index 0000000..5d1e61c--- /dev/null+++ b/kopete/libkopete/avdevice/dummyvideodevice.h@@ -0,0 +1,70 @@+/*+    dummyvideodevice.h  -  Kopete Dummy Video Device++    Copyright (c) 2009 by Alan Jones <skyphyr@gmail.com>++    Kopete    (c) 2002-2009      by the Kopete developers  <kopete-devel@kde.org>++    *************************************************************************+    *                                                                       *+    * This library is free software; you can redistribute it and/or         *+    * modify it under the terms of the GNU Lesser General Public            *+    * License as published by the Free Software Foundation; either          *+    * version 2 of the License, or (at your option) any later version.      *+    *                                                                       *+    * This program is distributed in the hope that it will be useful,       *+    * but WITHOUT ANY WARRANTY; without even the implied warranty of        *+    * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *+    * GNU General Public License for more details.                          *+    *                                                                       *+    * You should have received a copy of the GNU General Public License     *+    * along with this program.  If not, see <http://www.gnu.org/licenses/>. *+    *************************************************************************+*/++#ifndef KOPETE_AVDUMMYVIDEODEVICE_H+#define KOPETE_AVDUMMYVIDEODEVICE_H++#include "videodevice.h"++namespace Kopete {++namespace AV {++/**+@author Kopete Developers+*/++class DummyVideoDevice : public VideoDevice+{++public:+	DummyVideoDevice();+	virtual ~DummyVideoDevice() {}+	+	virtual int open();+	virtual bool isOpen();+	virtual int checkDevice();+	virtual int initDevice();++	virtual int setSize( int newwidth, int newheight);++	virtual pixel_format setPixelFormat(pixel_format newformat);++	virtual int startCapturing();+	virtual int getFrame();+	virtual int getFrame(imagebuffer *imgbuffer);+	virtual int getImage(QImage *qimage);+	virtual int stopCapturing();+	virtual int close();+	+	+private:+	bool opened;+};++}++}++#endifdiff --git a/kopete/libkopete/avdevice/videodevicepool.cpp b/kopete/libkopete/avdevice/videodevicepool.cppindex 4e6b859..094f42a 100644--- a/kopete/libkopete/avdevice/videodevicepool.cpp+++ b/kopete/libkopete/avdevice/videodevicepool.cpp@@ -61,22 +61,15 @@ VideoDevicePool* VideoDevicePool::self() }  VideoDevicePool::VideoDevicePool()-: m_current_device(-1)+: m_current_device(0) { 	connect( Solid::DeviceNotifier::instance(), SIGNAL(deviceAdded(const QString&)), SLOT(deviceAdded(const QString &)) ); 	connect( Solid::DeviceNotifier::instance(), SIGNAL(deviceRemoved(const QString&)), SLOT(deviceRemoved(const QString &)) );-	/* NOTE: No locking needed as long as we don't connect with Qt::ConnectionType = Qt::DirectConnection-	         while the signals are emitted by other threads-	 */-	foreach( Solid::Device device, Solid::Device::listFromType(Solid::DeviceInterface::Video, QString()) )-		registerDevice( device ); }   VideoDevicePool::~VideoDevicePool() {-	foreach ( VideoDevice* vd, m_videodevices )-		delete vd; }  @@ -87,39 +80,44 @@ VideoDevicePool::~VideoDevicePool()  */ int VideoDevicePool::open(int device) {+    /// @todo implement me 	kDebug() << "called with device" << device;-	if (!m_videodevices.size() || (device >= m_videodevices.size()))+	m_ready.lock();+	if (!m_videodevice.size())+	{+		kDebug() << "open(): No devices found. Must scan for available devices." << m_current_device;+		scanDevices();+	}+	if (!m_videodevice.size() || (device >= m_videodevice.size())) 	{-		kDebug() << "Device not found.";+		kDebug() << "open(): Device not found. bailing out." << m_current_device;+		m_ready.unlock(); 		return EXIT_FAILURE; 	}+	int current_device = m_current_device; 	if (device < 0) 	{-		kDebug() << "Trying to load saved device.";-		device = getSavedDevice();-		if (device < 0)-		{-			if (m_current_device < 0)-				device = 0;-			else-				device = m_current_device;-			kDebug() << "Saved device is not available, using default device:" << device;-		}+		kDebug() << "Trying to load saved device (using default device if not available)";+		loadSelectedDevice();	// Set m_current_device to saved device (if device available) 	}+	else+		m_current_device = device; 	int isopen = EXIT_FAILURE;-	if ((device != m_current_device) || !isOpen())+	if ((m_current_device != current_device) || !isOpen()) 	{ 		if (isOpen()) 		{-			if (EXIT_SUCCESS == m_videodevices[m_current_device]->close())+			if (EXIT_SUCCESS == m_videodevice[current_device].close()) 				m_clients--; 			else+			{+				m_ready.unlock(); 				return EXIT_FAILURE;+			} 		}-		isopen = m_videodevices[device]->open();+		isopen = m_videodevice[m_current_device].open(); 		if (isopen == EXIT_SUCCESS) 		{-			m_current_device = device; 			loadDeviceConfig(); // Load and apply device parameters 			m_clients++; 		}@@ -130,82 +128,57 @@ int VideoDevicePool::open(int device) 		m_clients++; 	} 	kDebug() << "Number of clients: " << m_clients;+	m_ready.unlock(); 	return isopen; }  bool VideoDevicePool::isOpen() {-	if ((m_current_device >= 0) && (m_current_device < m_videodevices.size()))-		return m_videodevices[m_current_device]->isOpen();-	else-		return false;+	return m_videodevice[currentDevice()].isOpen(); }  /*!     \fn VideoDevicePool::showDeviceCapabilities(int device)  */-int VideoDevicePool::showDeviceCapabilities(int device)+int VideoDevicePool::showDeviceCapabilities(unsigned int device) {-	if (device < 0)-		device = m_current_device;-	if ((device >= 0) && (device < m_videodevices.size()))-		return m_videodevices[device]->showDeviceCapabilities();-	else-		return EXIT_FAILURE;+	return m_videodevice[device].showDeviceCapabilities(); }  int VideoDevicePool::width() {-	if ((m_current_device >= 0) && (m_current_device < m_videodevices.size()))-		return m_videodevices[m_current_device]->width();-	else-		return 0;+	return m_videodevice[currentDevice()].width(); }  int VideoDevicePool::minWidth() {-	if ((m_current_device >= 0) && (m_current_device < m_videodevices.size()))-		return m_videodevices[m_current_device]->minWidth();-	else-		return 0;+	return m_videodevice[currentDevice()].minWidth(); }  int VideoDevicePool::maxWidth() {-	if ((m_current_device >= 0) && (m_current_device < m_videodevices.size()))-		return m_videodevices[m_current_device]->maxWidth();-	else-		return 0;+	return m_videodevice[currentDevice()].maxWidth(); }  int VideoDevicePool::height() {-	if ((m_current_device >= 0) && (m_current_device < m_videodevices.size()))-		return m_videodevices[m_current_device]->height();-	else-		return 0;+	return m_videodevice[currentDevice()].height(); }  int VideoDevicePool::minHeight() {-	if ((m_current_device >= 0) && (m_current_device < m_videodevices.size()))-		return m_videodevices[m_current_device]->minHeight();-	else-		return 0;+	return m_videodevice[currentDevice()].minHeight(); }  int VideoDevicePool::maxHeight() {-	if ((m_current_device >= 0) && (m_current_device < m_videodevices.size()))-		return m_videodevices[m_current_device]->maxHeight();-	else-		return 0;+	return m_videodevice[currentDevice()].maxHeight(); }  int VideoDevicePool::setSize( int newwidth, int newheight) {-	if ((m_current_device >= 0) && (m_current_device < m_videodevices.size()))-		return m_videodevices[m_current_device]->setSize(newwidth, newheight);+	if(m_videodevice.size())+		return m_videodevice[currentDevice()].setSize(newwidth, newheight); 	else 	{ 		kDebug() << "VideoDevicePool::setSize() fallback for no device.";@@ -226,7 +199,7 @@ int VideoDevicePool::setSize( int newwidth, int newheight) int VideoDevicePool::close() { 	int ret = EXIT_FAILURE;-	if ((m_current_device < 0) || (m_current_device >= m_videodevices.size()))+	if (m_current_device >= m_videodevice.size()) 	{ 		kDebug() << "Current device out of range."; 	}@@ -242,7 +215,7 @@ int VideoDevicePool::close() 	} 	else 	{-		ret = m_videodevices[m_current_device]->close();+		ret = m_videodevice[m_current_device].close(); 		if (EXIT_SUCCESS == ret) 			m_clients--; 	}@@ -255,10 +228,9 @@ int VideoDevicePool::close() int VideoDevicePool::startCapturing() { 	kDebug() << "startCapturing() called.";-	if ((m_current_device >= 0) && (m_current_device < m_videodevices.size()))-		return m_videodevices[m_current_device]->startCapturing();-	else-		return EXIT_FAILURE;+	if(m_videodevice.size())+		return m_videodevice[currentDevice()].startCapturing();+	return EXIT_FAILURE; }  @@ -267,10 +239,9 @@ int VideoDevicePool::startCapturing()  */ int VideoDevicePool::stopCapturing() {-	if ((m_current_device >= 0) && (m_current_device < m_videodevices.size()))-		return m_videodevices[m_current_device]->stopCapturing();-	else-		return EXIT_FAILURE;+	if(m_videodevice.size())+		return m_videodevice[currentDevice()].stopCapturing();+	return EXIT_FAILURE; }  @@ -283,8 +254,8 @@ int VideoDevicePool::stopCapturing()  */ QList<NumericVideoControl> VideoDevicePool::getSupportedNumericControls() {-	if ((m_current_device >= 0) && (m_current_device < m_videodevices.size()))-		return m_videodevices[m_current_device]->getSupportedNumericControls();+	if (currentDevice() < m_videodevice.size() )+		return m_videodevice[currentDevice()].getSupportedNumericControls(); 	else 		return QList<NumericVideoControl>(); }@@ -296,8 +267,8 @@ QList<NumericVideoControl> VideoDevicePool::getSupportedNumericControls()  */ QList<BooleanVideoControl> VideoDevicePool::getSupportedBooleanControls() {-	if ((m_current_device >= 0) && (m_current_device < m_videodevices.size()))-		return m_videodevices[m_current_device]->getSupportedBooleanControls();+	if (currentDevice() < m_videodevice.size() )+		return m_videodevice[currentDevice()].getSupportedBooleanControls(); 	else 		return QList<BooleanVideoControl>(); }@@ -309,8 +280,8 @@ QList<BooleanVideoControl> VideoDevicePool::getSupportedBooleanControls()  */ QList<MenuVideoControl> VideoDevicePool::getSupportedMenuControls() {-	if ((m_current_device >= 0) && (m_current_device < m_videodevices.size()))-		return m_videodevices[m_current_device]->getSupportedMenuControls();+	if (currentDevice() < m_videodevice.size() )+		return m_videodevice[currentDevice()].getSupportedMenuControls(); 	else 		return QList<MenuVideoControl>(); }@@ -322,8 +293,8 @@ QList<MenuVideoControl> VideoDevicePool::getSupportedMenuControls()  */ QList<ActionVideoControl> VideoDevicePool::getSupportedActionControls() {-	if ((m_current_device >= 0) && (m_current_device < m_videodevices.size()))-		return m_videodevices[m_current_device]->getSupportedActionControls();+	if (currentDevice() < m_videodevice.size() )+		return m_videodevice[currentDevice()].getSupportedActionControls(); 	else 		return QList<ActionVideoControl>(); }@@ -339,8 +310,8 @@ QList<ActionVideoControl> VideoDevicePool::getSupportedActionControls()  */ int VideoDevicePool::getControlValue(quint32 ctrl_id, qint32 * value) {-	if ((m_current_device >= 0) && (m_current_device < m_videodevices.size()))-		return m_videodevices[m_current_device]->getControlValue(ctrl_id, value);+	if (currentDevice() < m_videodevice.size() )+		return m_videodevice[currentDevice()].getControlValue(ctrl_id, value); 	else 		return EXIT_FAILURE; }@@ -357,8 +328,8 @@ int VideoDevicePool::getControlValue(quint32 ctrl_id, qint32 * value)  */ int VideoDevicePool::setControlValue(quint32 ctrl_id, qint32 value) {-	if ((m_current_device >= 0) && (m_current_device < m_videodevices.size()))-		return m_videodevices[m_current_device]->setControlValue(ctrl_id, value);+	if (currentDevice() < m_videodevice.size() )+		return m_videodevice[currentDevice()].setControlValue(ctrl_id, value); 	else 		return EXIT_FAILURE; }@@ -370,10 +341,9 @@ int VideoDevicePool::setControlValue(quint32 ctrl_id, qint32 value) int VideoDevicePool::getFrame() { //	kDebug() << "VideoDevicePool::getFrame() called.";-	if ((m_current_device >= 0) && (m_current_device < m_videodevices.size()))-		return m_videodevices[m_current_device]->getFrame();-	else+	if ((m_current_device < 0) || (m_current_device >= m_videodevice.size())) 		return EXIT_FAILURE;+	return m_videodevice[currentDevice()].getFrame(); }  /*!@@ -382,10 +352,65 @@ int VideoDevicePool::getFrame() int VideoDevicePool::getImage(QImage *qimage) { //	kDebug() << "VideoDevicePool::getImage() called.";-	if ((m_current_device >= 0) && (m_current_device < m_videodevices.size()))-		return m_videodevices[m_current_device]->getImage(qimage);+	if(m_videodevice.size())+		return m_videodevice[currentDevice()].getImage(qimage); 	else-		return EXIT_FAILURE;+	{+		kDebug() << "VideoDevicePool::getImage() fallback for no device.";++		// do NOT delete qimage here, as it is received as a parameter+		if (qimage->width() != width() || qimage->height() != height())+			*qimage = QImage(width(), height(), QImage::Format_RGB32);++		uchar *bits=qimage->bits();+		switch(m_buffer.pixelformat)+		{+			case PIXELFORMAT_NONE	: break;+			case PIXELFORMAT_GREY	: break;+			case PIXELFORMAT_RGB332	: break;+			case PIXELFORMAT_RGB555	: break;+			case PIXELFORMAT_RGB555X: break;+			case PIXELFORMAT_RGB565	: break;+			case PIXELFORMAT_RGB565X: break;+			case PIXELFORMAT_RGB24	:+				{+					kDebug() << "VideoDevicePool::getImage() fallback for no device - RGB24.";+					int step=0;+					for(int loop=0;loop < qimage->numBytes();loop+=4)+					{+						bits[loop]   = m_buffer.data[step];+						bits[loop+1] = m_buffer.data[step+1];+						bits[loop+2] = m_buffer.data[step+2];+						bits[loop+3] = 255;+						step+=3;+					}+				}+				break;+			case PIXELFORMAT_BGR24	: break;+				{+					int step=0;+					for(int loop=0;loop < qimage->numBytes();loop+=4)+					{+						bits[loop]   = m_buffer.data[step+2];+						bits[loop+1] = m_buffer.data[step+1];+						bits[loop+2] = m_buffer.data[step];+						bits[loop+3] = 255;+						step+=3;+					}+				}+				break;+			case PIXELFORMAT_RGB32	: memcpy(bits,&m_buffer.data[0], m_buffer.data.size());+				break;+			case PIXELFORMAT_BGR32	: break;+			case PIXELFORMAT_YUYV   : break;+			case PIXELFORMAT_UYVY   : break;+			case PIXELFORMAT_YUV420P: break;+			case PIXELFORMAT_YUV422P: break;+			default: break;+		}+	}+	kDebug() << "VideoDevicePool::getImage() exited successfuly.";+	return EXIT_SUCCESS; }  /*!@@ -394,142 +419,203 @@ int VideoDevicePool::getImage(QImage *qimage) int VideoDevicePool::selectInput(int newinput) { 	kDebug() << "VideoDevicePool::selectInput(" << newinput << ") called.";-	if ((m_current_device >= 0) && (m_current_device < m_videodevices.size()))-		return m_videodevices[m_current_device]->selectInput(newinput);+	if(m_videodevice.size())+		return m_videodevice[currentDevice()].selectInput(newinput); 	else-		return EXIT_FAILURE;+		return 0; }  /*!     \fn Kopete::AV::VideoDevicePool::fillDeviceKComboBox(KComboBox *combobox)  */-void VideoDevicePool::fillDeviceKComboBox(KComboBox *combobox)+int VideoDevicePool::fillDeviceKComboBox(KComboBox *combobox) {+    /// @todo implement me 	kDebug() << "Called.";-	if (combobox == NULL)-		return;-	combobox->clear();-	if (m_videodevices.size())+// check if KComboBox is a valid pointer.+	if (combobox != NULL) 	{-		for (int loop = 0; loop < m_videodevices.size(); loop++)+		combobox->clear();+		kDebug() << "Combobox cleaned.";+		if(m_videodevice.size()) 		{-			combobox->addItem(m_videodevices[loop]->m_name);-			kDebug() << "Added device" << loop << ":  " << m_videodevices[loop]->m_name;+			for (int loop=0; loop < m_videodevice.size(); loop++)+			{+				combobox->addItem(m_videodevice[loop].m_name);+				kDebug() << "Added device " << loop << ": " << m_videodevice[loop].m_name;+			}+			combobox->setCurrentIndex(currentDevice());+			combobox->setEnabled(true);+			return EXIT_SUCCESS; 		}-		combobox->setCurrentIndex(m_current_device);+		combobox->setEnabled(false); 	}-	combobox->setEnabled(m_videodevices.size());+	return EXIT_FAILURE; }  /*!     \fn Kopete::AV::VideoDevicePool::fillInputKComboBox(KComboBox *combobox)  */-void VideoDevicePool::fillInputKComboBox(KComboBox *combobox)+int VideoDevicePool::fillInputKComboBox(KComboBox *combobox) {+    /// @todo implement me 	kDebug() << "Called.";-	if (combobox == NULL)-		return;-	combobox->clear();-	if ((m_current_device >= 0) && (m_current_device < m_videodevices.size()))+	if (combobox != NULL) 	{-		if (m_videodevices[m_current_device]->inputs() > 0)+		combobox->clear();+		if ( !m_videodevice.isEmpty() && (currentDevice()>=0) && currentDevice() < m_videodevice.size() ) 		{-			for (int loop = 0; loop < m_videodevices[m_current_device]->inputs(); loop++)+			if(m_videodevice[currentDevice()].inputs()>0) 			{-				combobox->addItem(m_videodevices[m_current_device]->m_input[loop].name);-				kDebug() << "Added input" << loop << ":  " << m_videodevices[m_current_device]->m_input[loop].name-				         << " (tuner: " << m_videodevices[m_current_device]->m_input[loop].hastuner << ")";+				for (int loop=0; loop < m_videodevice[currentDevice()].inputs(); loop++)+				{+					combobox->addItem(m_videodevice[currentDevice()].m_input[loop].name);+					kDebug() << "Added input " << loop << ": " << m_videodevice[currentDevice()].m_input[loop].name << " (tuner: " << m_videodevice[currentDevice()].m_input[loop].hastuner << ")";+				}+				combobox->setCurrentIndex(currentInput());+				combobox->setEnabled(true);+				return EXIT_SUCCESS; 			}-			combobox->setCurrentIndex(m_videodevices[m_current_device]->currentInput()); 		}+		combobox->setEnabled(false); 	}-	combobox->setEnabled(combobox->count());+	return EXIT_FAILURE; }  /*!     \fn Kopete::AV::VideoDevicePool::fillStandardKComboBox(KComboBox *combobox)  */-void VideoDevicePool::fillStandardKComboBox(KComboBox *combobox)+int VideoDevicePool::fillStandardKComboBox(KComboBox *combobox) {+    /// @todo implement me 	kDebug() << "Called.";-	if (combobox == NULL)-		return;-	combobox->clear();-	if ((m_current_device >= 0) && (m_current_device < m_videodevices.size()))+	if (combobox != NULL) 	{-		if (m_videodevices[m_current_device]->inputs() > 0)+		combobox->clear();+		if ( !m_videodevice.isEmpty() && currentDevice() < m_videodevice.size() ) 		{-			for (unsigned int loop = 0; loop < 25; loop++)+			if(m_videodevice[currentDevice()].inputs()>0) 			{-				if (m_videodevices[m_current_device]->m_input[currentInput()].m_standards & (1 << loop))+				for (unsigned int loop=0; loop < 25; loop++) 				{-					combobox->addItem(m_videodevices[m_current_device]->signalStandardName(1 << loop));-					kDebug() << "Added signal standard" << loop << ":  " << m_videodevices[m_current_device]->signalStandardName(1 << loop);+					if ( (m_videodevice[currentDevice()].m_input[currentInput()].m_standards) & (1 << loop) )+						combobox->addItem(m_videodevice[currentDevice()].signalStandardName( 1 << loop));+/*+				case STANDARD_PAL_B1	: return V4L2_STD_PAL_B1;	break;+				case STANDARD_PAL_G	: return V4L2_STD_PAL_G;	break;+				case STANDARD_PAL_H	: return V4L2_STD_PAL_H;	break;+				case STANDARD_PAL_I	: return V4L2_STD_PAL_I;	break;+				case STANDARD_PAL_D	: return V4L2_STD_PAL_D;	break;+				case STANDARD_PAL_D1	: return V4L2_STD_PAL_D1;	break;+				case STANDARD_PAL_K	: return V4L2_STD_PAL_K;	break;+				case STANDARD_PAL_M	: return V4L2_STD_PAL_M;	break;+				case STANDARD_PAL_N	: return V4L2_STD_PAL_N;	break;+				case STANDARD_PAL_Nc	: return V4L2_STD_PAL_Nc;	break;+				case STANDARD_PAL_60	: return V4L2_STD_PAL_60;	break;+				case STANDARD_NTSC_M	: return V4L2_STD_NTSC_M;	break;+				case STANDARD_NTSC_M_JP	: return V4L2_STD_NTSC_M_JP;	break;+				case STANDARD_NTSC_443	: return V4L2_STD_NTSC;		break; // Using workaround value because my videodev2.h header seems to not include this standard in struct __u64 v4l2_std_id+				case STANDARD_SECAM_B	: return V4L2_STD_SECAM_B;	break;+				case STANDARD_SECAM_D	: return V4L2_STD_SECAM_D;	break;+				case STANDARD_SECAM_G	: return V4L2_STD_SECAM_G;	break;+				case STANDARD_SECAM_H	: return V4L2_STD_SECAM_H;	break;+				case STANDARD_SECAM_K	: return V4L2_STD_SECAM_K;	break;+				case STANDARD_SECAM_K1	: return V4L2_STD_SECAM_K1;	break;+				case STANDARD_SECAM_L	: return V4L2_STD_SECAM_L;	break;+				case STANDARD_SECAM_LC	: return V4L2_STD_SECAM;	break; // Using workaround value because my videodev2.h header seems to not include this standard in struct __u64 v4l2_std_id+				case STANDARD_ATSC_8_VSB	: return V4L2_STD_ATSC_8_VSB;	break; // ATSC/HDTV Standard officially not supported by V4L2 but exists in videodev2.h+				case STANDARD_ATSC_16_VSB	: return V4L2_STD_ATSC_16_VSB;	break; // ATSC/HDTV Standard officially not supported by V4L2 but exists in videodev2.h+				case STANDARD_PAL_BG	: return V4L2_STD_PAL_BG;	break;+				case STANDARD_PAL_DK	: return V4L2_STD_PAL_DK;	break;+				case STANDARD_PAL	: return V4L2_STD_PAL;		break;+				case STANDARD_NTSC	: return V4L2_STD_NTSC;		break;+				case STANDARD_SECAM_DK	: return V4L2_STD_SECAM_DK;	break;+				case STANDARD_SECAM	: return V4L2_STD_SECAM;	break;+				case STANDARD_525_60	: return V4L2_STD_525_60;	break;+				case STANDARD_625_50	: return V4L2_STD_625_50;	break;+				case STANDARD_ALL	: return V4L2_STD_ALL;		break;++				combobox->insertItem(m_videodevice[currentDevice()].m_input[loop].name);+				kDebug() << "StandardKCombobox: Added input " << loop << ": " << m_videodevice[currentDevice()].m_input[loop].name << " (tuner: " << m_videodevice[currentDevice()].m_input[loop].hastuner << ")";*/ 				}-				  +				combobox->setCurrentIndex(0);	// FIXME: set to actual signal standard+				combobox->setEnabled(combobox->count());+				return EXIT_SUCCESS; 			}-			combobox->setCurrentIndex(0);	// FIXME: set to actual signal standard-		}  +		}+		combobox->setEnabled(false);+	}+	return EXIT_FAILURE;+}++/*!+    \fn Kopete::AV::VideoDevicePool::scanDevices()+ */+int VideoDevicePool::scanDevices()+{+    /// @todo implement me++	if (m_videodevice.isEmpty()) {+		kDebug() << "called";+#if defined(__linux__) && defined(ENABLE_AV)+		foreach (Solid::Device device,+				Solid::Device::listFromType(Solid::DeviceInterface::Video, QString())) {+			registerDevice( device );+		}++#endif+		kDebug() << "exited successfuly";+	} else {+		kDebug() << "Not scanning: initial device list already loaded"; 	}-	combobox->setEnabled(combobox->count());+	return EXIT_SUCCESS; } -bool VideoDevicePool::registerDevice( Solid::Device & device )+void VideoDevicePool::registerDevice( Solid::Device & device ) {-	kDebug() << "called, UDI is:\n   " << device.udi();+	kDebug() << "New video device at " << device.udi(); 	const Solid::Device * vendorDevice = &device;-	while (vendorDevice->isValid() && vendorDevice->vendor().isEmpty())-		vendorDevice = new Solid::Device(vendorDevice->parentUdi());-	/* NOTE: The device we register has usually an empty vendor string and a less meaningfull product string.-	   So we go up to the first parent device that has a non-empty vendor string,-	   because we find the expected strings describing the device there.-	 */-	if (vendorDevice->isValid())-		kDebug() << "vendor:" << vendorDevice->vendor() << ", product:" << vendorDevice->product();-	else-		kDebug() << "vendor:" << device.vendor() << ", product:" << device.product();- -	if (device.isValid())+	while ( vendorDevice->isValid() && vendorDevice->vendor().isEmpty() )+	{+		vendorDevice = new Solid::Device( vendorDevice->parentUdi() );+	}+	if ( vendorDevice->isValid() ) 	{-		Solid::Video * solidVideoDevice = device.as<Solid::Video>();-		if (solidVideoDevice)+		kDebug() << "vendor: " << vendorDevice->vendor() << ", product: " << vendorDevice->product();+	}+	Solid::Video * solidVideoDevice = device.as<Solid::Video>();+	if ( solidVideoDevice ) {+		QStringList protocols = solidVideoDevice->supportedProtocols();+		if ( protocols.contains( "video4linux" ) ) 		{-			QStringList protocols = solidVideoDevice->supportedProtocols();-			if (protocols.contains("video4linux"))+			QStringList drivers = solidVideoDevice->supportedDrivers( "video4linux" );+			if ( drivers.contains( "video4linux" ) ) 			{-				QStringList drivers = solidVideoDevice->supportedDrivers("video4linux");-				if (drivers.contains("video4linux"))+				kDebug() << "V4L device path is" << solidVideoDevice->driverHandle( "video4linux" ).toString();+				VideoDevice videodevice;+				videodevice.setUdi( device.udi() );+				videodevice.setFileName(solidVideoDevice->driverHandle( "video4linux" ).toString());+				kDebug() << "Found device " << videodevice.fileName();+				videodevice.open();+				if(videodevice.isOpen()) 				{-					VideoDevice* videodevice = new VideoDevice;-					videodevice->setUdi( device.udi() );-					videodevice->setFileName(solidVideoDevice->driverHandle("video4linux").toString());-					kDebug() << "V4L device path is" << solidVideoDevice->driverHandle("video4linux").toString();-					if (EXIT_SUCCESS == videodevice->open())-					{-						bool cap = videodevice->canCapture();-						videodevice->close();-						if (cap)-						{-							if (m_videodevices.size() == 0)-								m_current_device = 0;-							m_videodevices.push_back(videodevice);-							kDebug() << "Device is a valid video device, adding it to video device pool.";-							return true;-						}-						else-							kDebug() << "Device does not support capturing.";-					}-					else-						kDebug() << "Device could not be opened.";-					delete videodevice;+					kDebug() << "File " << videodevice.fileName() << " was opened successfuly";+					videodevice.close();+					m_videodevice.push_back(videodevice); 				} 			} 		}-		else-			kDebug() << "Device is not a video device."; 	}-	else-		kDebug() << "Not a valid Solid device: device is not available in the system.";+}++/*!+    \fn Kopete::AV::VideoDevicePool::hasDevices()+ */+bool VideoDevicePool::hasDevices()+{+    /// @todo implement me+	if(m_videodevice.size())+		return true; 	return false; } @@ -539,7 +625,7 @@ bool VideoDevicePool::registerDevice( Solid::Device & device ) int VideoDevicePool::size() {     /// @todo implement me-	return m_videodevices.size();+	return m_videodevice.size(); }  /*!@@ -556,8 +642,8 @@ int VideoDevicePool::currentDevice()  */ QString VideoDevicePool::currentDeviceUdi() {-	if ((m_current_device >= 0) && (m_current_device < m_videodevices.size()))-		return m_videodevices[m_current_device]->udi();+	if (m_videodevice.size() && (m_current_device >= 0))+		return m_videodevice[m_current_device].udi(); 	else 		return QString(); }@@ -568,10 +654,7 @@ QString VideoDevicePool::currentDeviceUdi() int VideoDevicePool::currentInput() {     /// @todo implement me-	if ((m_current_device >= 0) && (m_current_device < m_videodevices.size()))-		return m_videodevices[m_current_device]->currentInput();-	else-		return -1;+	return m_videodevice[currentDevice()].currentInput(); }  /*!@@ -580,20 +663,17 @@ int VideoDevicePool::currentInput() int VideoDevicePool::inputs() {     /// @todo implement me-	if ((m_current_device >= 0) && (m_current_device < m_videodevices.size()))-		return m_videodevices[m_current_device]->inputs();-	else-		return 0;+	return m_videodevice[currentDevice()].inputs(); }  /*!-    \fn int Kopete::AV::VideoDevicePool::getSavedDevice()-    \brief Returns the index of the saved device+    \fn void Kopete::AV::VideoDevicePool::loadSelectedDevice()+    \brief Loads and selects the saved device  */-int VideoDevicePool::getSavedDevice()+void VideoDevicePool::loadSelectedDevice() { 	kDebug() << "called";-	if (m_videodevices.size())+	if (hasDevices()) 	{ 		KConfigGroup config(KGlobal::config(), "Video Device Settings"); 		QString currentdevice = config.readEntry("Current Device", QString());@@ -601,14 +681,14 @@ int VideoDevicePool::getSavedDevice() 		if (!currentdevice.isEmpty()) 		{ 			kDebug() << "Saved device:" << currentdevice;-			QVector<VideoDevice*>::iterator vditerator;-			for( vditerator = m_videodevices.begin(); vditerator != m_videodevices.end(); ++vditerator )+			VideoDeviceVector::iterator vditerator;+			for( vditerator = m_videodevice.begin(); vditerator != m_videodevice.end(); ++vditerator ) 			{-				if ((*vditerator)->udi() == currentdevice)+				if ((*vditerator).udi() == currentdevice) 				{-					int devIndex = std::distance (m_videodevices.begin(), vditerator);-					kDebug() << "Saved device is available, device index is" << devIndex;-					return devIndex;+					m_current_device = std::distance (m_videodevice.begin(), vditerator);+					kDebug() << "Saved device is available, setting device-index to" << m_current_device;+					return; 				} 			} 			kDebug() << "Saved device is not available.";@@ -616,7 +696,6 @@ int VideoDevicePool::getSavedDevice() 		else 			kDebug() << "No device saved."; 	}-	return -1; }  /*!@@ -628,21 +707,21 @@ int VideoDevicePool::getSavedDevice() void VideoDevicePool::loadDeviceConfig() { 	kDebug() << "called";-	if ((m_current_device >= 0) && (m_current_device < m_videodevices.size()))+	if (hasDevices()) 	{ 		KConfigGroup config(KGlobal::config(), "Video Device Settings"); 		// Load input and apply-		const QString key_currentinput = QString::fromLocal8Bit( "Device %1 Current Input" ).arg( m_videodevices[m_current_device]->udi() );+		const QString key_currentinput = QString::fromLocal8Bit( "Device %1 Current Input" ).arg( m_videodevice[m_current_device].udi() ); 		const int currentinput = config.readEntry(key_currentinput, 0); 		kDebug() << "Setting input to" << currentinput;-		if (currentinput != m_videodevices[m_current_device]->currentInput())-			m_videodevices[m_current_device]->selectInput(currentinput);+		if (currentinput != m_videodevice[m_current_device].currentInput())+			m_videodevice[m_current_device].selectInput(currentinput); 		// Load video-controls and apply 		quint32 ctrl_id; 		qint32 ctrl_value; 		QString ctrl_key; 		bool ok = false;-		const QString key_control_start = QString::fromLocal8Bit( "Device %1 Input %2 Control " ).arg( m_videodevices[m_current_device]->udi() ).arg( m_videodevices[m_current_device]->currentInput() );+		const QString key_control_start = QString::fromLocal8Bit( "Device %1 Input %2 Control " ).arg( m_videodevice[m_current_device].udi() ).arg( m_videodevice[m_current_device].currentInput() ); 		QStringList ctrl_keys = config.keyList().filter(key_control_start); 		kDebug() << "Found" << ctrl_keys.size() << "saved values for video-controls"; 		foreach (ctrl_key, ctrl_keys)@@ -659,7 +738,7 @@ void VideoDevicePool::loadDeviceConfig() 				if (ok && !tmpstr.isEmpty()) 				{ 					kDebug() << "Setting control" << ctrl_id << "to value" << ctrl_value;-					m_videodevices[m_current_device]->setControlValue(ctrl_id, ctrl_value);+					m_videodevice[m_current_device].setControlValue(ctrl_id, ctrl_value); 				} 				else 					kDebug() << "Saved value for control" << ctrl_id << "is invalid:" << tmpstr;@@ -680,23 +759,23 @@ void VideoDevicePool::loadDeviceConfig() void VideoDevicePool::saveCurrentDeviceConfig() { 	kDebug() << "called";-	if ((m_current_device >= 0) && (m_current_device < m_videodevices.size()))+	if (hasDevices()) 	{ 		KConfigGroup config(KGlobal::config(), "Video Device Settings"); 		// Save current device:-		kDebug() << "Current device:" << m_videodevices[m_current_device]->udi();-		config.writeEntry( "Current Device", m_videodevices[m_current_device]->udi() );+		kDebug() << "Current device:" << m_videodevice[m_current_device].udi();+		config.writeEntry( "Current Device", m_videodevice[m_current_device].udi() ); 		// Save current device name (for debugging only):-		kDebug() << "Current device name:" << m_videodevices[m_current_device]->m_name;-		const QString name = QString::fromLocal8Bit( "Device %1 Name" ).arg( m_videodevices[m_current_device]->udi() );-		config.writeEntry( name, m_videodevices[m_current_device]->m_name );+		kDebug() << "Current device name:" << m_videodevice[m_current_device].m_name;+		const QString name = QString::fromLocal8Bit( "Device %1 Name" ).arg( m_videodevice[m_current_device].udi() );+		config.writeEntry( name, m_videodevice[m_current_device].m_name ); 		// Open device if closed: 		bool wasClosed = false;-		if (!m_videodevices[m_current_device]->isOpen())+		if (!m_videodevice[m_current_device].isOpen()) 		{ 			kDebug() << "Device is currently closed, will be opened."; 			wasClosed = true;-			if (EXIT_SUCCESS != m_videodevices[m_current_device]->open())+			if (EXIT_SUCCESS != m_videodevice[m_current_device].open()) 			{ 				kDebug() << "Failed to open the device. Saving aborted."; 				config.sync();@@ -704,18 +783,18 @@ void VideoDevicePool::saveCurrentDeviceConfig() 			} 		} 		// Save current input:-		kDebug() << "Current input:" << m_videodevices[m_current_device]->currentInput();-		const QString key_currentinput = QString::fromLocal8Bit( "Device %1 Current Input" ).arg( m_videodevices[m_current_device]->udi() );-		config.writeEntry( key_currentinput, m_videodevices[m_current_device]->currentInput() );+		kDebug() << "Current input:" << m_videodevice[m_current_device].currentInput();+		const QString key_currentinput = QString::fromLocal8Bit( "Device %1 Current Input" ).arg( m_videodevice[m_current_device].udi() );+		config.writeEntry( key_currentinput, m_videodevice[m_current_device].currentInput() ); 		// --- Save values of the controls ---: 		qint32 ctrl_value;-		const QString key_control_start = QString::fromLocal8Bit( "Device %1 Input %2 Control " ).arg( m_videodevices[m_current_device]->udi() ).arg( m_videodevices[m_current_device]->currentInput() );+		const QString key_control_start = QString::fromLocal8Bit( "Device %1 Input %2 Control " ).arg( m_videodevice[m_current_device].udi() ).arg( m_videodevice[m_current_device].currentInput() ); 		// Save values of the numeric controls:-		QList<NumericVideoControl> numCtrls = m_videodevices[m_current_device]->getSupportedNumericControls();+		QList<NumericVideoControl> numCtrls = m_videodevice[m_current_device].getSupportedNumericControls(); 		NumericVideoControl numCtrl; 		foreach (numCtrl, numCtrls) 		{-			if (EXIT_SUCCESS == m_videodevices[m_current_device]->getControlValue(numCtrl.id, &ctrl_value))+			if (EXIT_SUCCESS == m_videodevice[m_current_device].getControlValue(numCtrl.id, &ctrl_value)) 			{ 				kDebug() << "Numeric control:" << numCtrl.id << "value" << ctrl_value; 				config.writeEntry( key_control_start + QString::number(numCtrl.id), ctrl_value );@@ -724,11 +803,11 @@ void VideoDevicePool::saveCurrentDeviceConfig() 				kDebug() << "Error: couldn't get current value for numeric control" << numCtrl.id; 		} 		// Save values of the boolean controls:-		QList<BooleanVideoControl> boolCtrls = m_videodevices[m_current_device]->getSupportedBooleanControls();+		QList<BooleanVideoControl> boolCtrls = m_videodevice[m_current_device].getSupportedBooleanControls(); 		BooleanVideoControl boolCtrl; 		foreach (boolCtrl, boolCtrls) 		{-			if (EXIT_SUCCESS == m_videodevices[m_current_device]->getControlValue(boolCtrl.id, &ctrl_value))+			if (EXIT_SUCCESS == m_videodevice[m_current_device].getControlValue(boolCtrl.id, &ctrl_value)) 			{ 				kDebug() << "Boolean control:" << boolCtrl.id << "value" << ctrl_value; 				config.writeEntry( key_control_start + QString::number(boolCtrl.id), ctrl_value );@@ -737,11 +816,11 @@ void VideoDevicePool::saveCurrentDeviceConfig() 				kDebug() << "Error: couldn't get current value for boolean control" << numCtrl.id; 		} 		// Save values of the menu controls:-		QList<MenuVideoControl> menuCtrls = m_videodevices[m_current_device]->getSupportedMenuControls();+		QList<MenuVideoControl> menuCtrls = m_videodevice[m_current_device].getSupportedMenuControls(); 		MenuVideoControl menuCtrl; 		foreach (menuCtrl, menuCtrls) 		{-			if (EXIT_SUCCESS == m_videodevices[m_current_device]->getControlValue(menuCtrl.id, &ctrl_value))+			if (EXIT_SUCCESS == m_videodevice[m_current_device].getControlValue(menuCtrl.id, &ctrl_value)) 			{ 				kDebug() << "Menu-control:" << menuCtrl.id << "value" << ctrl_value; 				config.writeEntry( key_control_start + QString::number(menuCtrl.id), ctrl_value );@@ -753,7 +832,7 @@ void VideoDevicePool::saveCurrentDeviceConfig() 		// Close device again (if it was closed before): 		if (wasClosed) 		{-			if (EXIT_SUCCESS == m_videodevices[m_current_device]->close())+			if (EXIT_SUCCESS == m_videodevice[m_current_device].close()) 				kDebug() << "Device successfully closed."; 			else 				kDebug() << "Error: failed to close the device.";@@ -765,47 +844,47 @@ void VideoDevicePool::saveCurrentDeviceConfig()  void VideoDevicePool::deviceAdded( const QString & udi ) {-	kDebug() << "called with UDI" << udi;+	kDebug() << "("<< udi << ") called"; 	Solid::Device dev( udi ); 	if ( dev.is<Solid::Video>() ) 	{-		kDebug() << "Device is a video device, trying to register it.";-		if ( registerDevice( dev ) )-			emit deviceRegistered( udi );+		registerDevice( dev );+		emit deviceRegistered( udi ); 	}-	else-		kDebug() << "Device is not a video device"; }  void VideoDevicePool::deviceRemoved( const QString & udi ) {-	kDebug() << "called with UDI" << udi;+	kDebug() << "("<< udi << ") called"; 	int i = 0;-	foreach ( VideoDevice* vd, m_videodevices )+	m_ready.lock();+	foreach ( VideoDevice vd, m_videodevice ) 	{-		if ( vd->udi() == udi )+		if ( vd.udi() == udi ) 		{-			kDebug() << "Video device with UDI" << udi << "has been removed!";-			delete m_videodevices[i]; // NOTE: device is closed in destructor-			m_videodevices.remove( i );+			kDebug() << "Video device '" << udi << "' has been removed!";+			// not sure if this is safe but at this point the device node is gone already anyway+			m_videodevice.remove( i ); 			if (m_current_device == i) 			{-				if (m_videodevices.size())-					m_current_device = 0;-				else-					m_current_device = -1;+				m_current_device = 0; 				m_clients = 0; 			} 			else if (m_current_device > i) 			{ 				m_current_device--; 			}+			m_ready.unlock(); 			emit deviceUnregistered( udi );+			/* NOTE: do not emit deviceUnregistered( udi ) with mutex locked ! => potential deadlock ! */ 			return; 		} 		else+		{ 			i++;+		} 	}+	m_ready.unlock(); }  } // namespace AVdiff --git a/kopete/libkopete/avdevice/videodevicepool.h b/kopete/libkopete/avdevice/videodevicepool.hindex 8c6c8fd..f83842a 100644--- a/kopete/libkopete/avdevice/videodevicepool.h+++ b/kopete/libkopete/avdevice/videodevicepool.h@@ -25,6 +25,8 @@ #include "videoinput.h" #include <qstring.h> #include <qimage.h>+#include <q3valuevector.h>+#include <qmutex.h> #include <kcombobox.h> #include "videodevice.h" #include "kopete_export.h"@@ -32,6 +34,11 @@ #include <kglobal.h> #include <solid/device.h> +// Uncomment this line and comment out the include and using lines to +// revert to standard vector if you hit issues. It should all be fine though.+// typedef QVector<Kopete::AV::VideoDevice> VideoDeviceVector;+#include "videodevicevector.h"+using Kopete::AV::VideoDeviceVector;  namespace Kopete { @@ -64,11 +71,14 @@ public: 	int readFrame(); 	int getImage(QImage *qimage); 	int selectInput(int newinput);+	int scanDevices();+	void registerDevice( Solid::Device & dev );+	bool hasDevices(); 	int size(); 	~VideoDevicePool();-	void fillDeviceKComboBox(KComboBox *combobox);-	void fillInputKComboBox(KComboBox *combobox);-	void fillStandardKComboBox(KComboBox *combobox);+	int fillDeviceKComboBox(KComboBox *combobox);+	int fillInputKComboBox(KComboBox *combobox);+	int fillStandardKComboBox(KComboBox *combobox); 	QString currentDeviceUdi(); 	int currentDevice(); 	int currentInput();@@ -101,14 +111,14 @@ protected slots: protected: 	int xioctl(int request, void *arg); 	int errnoReturn(const char* s);-	bool registerDevice( Solid::Device & dev );-	int showDeviceCapabilities(int device = -1);-	int getSavedDevice();+	int showDeviceCapabilities(unsigned int device);+	void loadSelectedDevice(); 	void loadDeviceConfig(); // Load configuration parameters;  	int m_current_device;-	QVector<VideoDevice*> m_videodevices;	/*!< Vector of pointers to the available video devices */+	VideoDeviceVector m_videodevice; // Vector to be filled with found devices 	struct imagebuffer m_buffer; // only used when no devices were found+	QMutex m_ready;  private: 	VideoDevicePool();diff --git a/kopete/libkopete/avdevice/videodevicevector.cpp b/kopete/libkopete/avdevice/videodevicevector.cppnew file mode 100644index 0000000..bc04011--- /dev/null+++ b/kopete/libkopete/avdevice/videodevicevector.cpp@@ -0,0 +1,62 @@+/*+    videodevicevector.cpp  -  Kopete Video Device List Abstration++    Copyright (c) 2009 by Alan Jones <skyphyr@gmail.com>++    Kopete    (c) 2002-2009      by the Kopete developers  <kopete-devel@kde.org>++    *************************************************************************+    *                                                                       *+    * This library 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 3 of the License, or (at your option) any later version.      *+    *                                                                       *+    * This program is distributed in the hope that it will be useful,       *+    * but WITHOUT ANY WARRANTY; without even the implied warranty of        *+    * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *+    * GNU General Public License for more details.                          *+    *                                                                       *+    * You should have received a copy of the GNU General Public License     *+    * along with this program.  If not, see <http://www.gnu.org/licenses/>. *+    *************************************************************************+*/++#include "videodevicevector.h"++namespace Kopete {++namespace AV {++VideoDevice& VideoDeviceVector::operator[] (int i)+	{+	if (i>=size())+		{+		//we're outside the range so let's return a default camera not available VideoDevice+		return fallback;+		}+	+	//if we've made it here then we're within range+	return QVector<VideoDevice>::operator[](i);+	}+	+const VideoDevice& VideoDeviceVector::operator[] (int i) const+	{+	return at(i);+	}++const VideoDevice& VideoDeviceVector::at(int i) const+	{+	if (i>=size())+		{+		//we're outside the range so let's return a default camera not available VideoDevice+		return fallback;+		}+	+	//if we've made it here then we're within range+	return QVector<VideoDevice>::operator[](i);+	}++}++}diff --git a/kopete/libkopete/avdevice/videodevicevector.h b/kopete/libkopete/avdevice/videodevicevector.hnew file mode 100644index 0000000..6b64c47--- /dev/null+++ b/kopete/libkopete/avdevice/videodevicevector.h@@ -0,0 +1,63 @@+/*+    videodevicevector.h  -  Kopete Video Device List Abstration++    Copyright (c) 2009 by Alan Jones <skyphyr@gmail.com>++    Kopete    (c) 2002-2009      by the Kopete developers  <kopete-devel@kde.org>++    *************************************************************************+    *                                                                       *+    * This library 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 3 of the License, or (at your option) any later version.      *+    *                                                                       *+    * This program is distributed in the hope that it will be useful,       *+    * but WITHOUT ANY WARRANTY; without even the implied warranty of        *+    * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *+    * GNU General Public License for more details.                          *+    *                                                                       *+    * You should have received a copy of the GNU General Public License     *+    * along with this program.  If not, see <http://www.gnu.org/licenses/>. *+    *************************************************************************+*/++#ifndef KOPETE_AVVIDEODEVICEVECTOR_H+#define KOPETE_AVVIDEODEVICEVECTOR_H++#include "videodevice.h"+#include "dummyvideodevice.h"++namespace Kopete {++namespace AV {++/**+@author Kopete Developers+*/++class VideoDeviceVector : public QVector<VideoDevice>+{++public:+	VideoDeviceVector() {}+	~VideoDeviceVector() {}+	+	VideoDevice& operator[] (int i);++	const VideoDevice& operator[] (int i) const;+	+	const VideoDevice& at(int i) const;+	+private:+	+	DummyVideoDevice fallback;+};++}++}++++#endifdiff --git a/kopete/libkopete/ui/avatarselectorwidget.cpp b/kopete/libkopete/ui/avatarselectorwidget.cppindex b18ba2b..ddb7e11 100644--- a/kopete/libkopete/ui/avatarselectorwidget.cpp+++ b/kopete/libkopete/ui/avatarselectorwidget.cpp@@ -118,6 +118,7 @@ AvatarSelectorWidget::AvatarSelectorWidget(QWidget *parent)  #ifndef VIDEOSUPPORT_DISABLED 	VideoDevicePool* devicePool = VideoDevicePool::self();+	devicePool->scanDevices();//We've to be sure that this has been done 	if( devicePool->size() == 0 ){ 		d->mainWidget.buttonFromWebcam->hide(); 	}