--- kdebase-3.5.6_orig/kicker/applets/media/Makefile.am	2006-07-22 10:15:16.000000000 +0200
+++ kdebase-3.5.6/kicker/applets/media/Makefile.am	2007-02-08 00:14:36.000000000 +0100
@@ -1,7 +1,7 @@
-INCLUDES = -I$(top_srcdir)/libkonq -I$(top_srcdir)/kicker/libkicker $(all_includes)
+INCLUDES = -I$(top_srcdir)/libkonq -I$(top_srcdir)/kicker/libkicker $(all_includes) -I$(top_srcdir)/kioslave/media/libmediacommon
 
 kde_module_LTLIBRARIES = media_panelapplet.la
-media_panelapplet_la_SOURCES = preferencesdialog.cpp mediumbutton.cpp mediaapplet.cpp
+media_panelapplet_la_SOURCES = mediaapplet.skel preferencesdialog.cpp mediumbutton.cpp mediaapplet.cpp 
 
 METASOURCES = AUTO
 
@@ -13,7 +13,8 @@
 EXTRA_DIST = $(lnk_DATA)
 
 media_panelapplet_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
-media_panelapplet_la_LIBADD = ../../../libkonq/libkonq.la ../../libkicker/libkickermain.la $(LIB_KDEUI) $(LIB_KIO) $(LIB_KUTILS)
+media_panelapplet_la_LIBADD = ../../../libkonq/libkonq.la ../../libkicker/libkickermain.la ../../../kioslave/media/libmediacommon/libmediacommon.la \
+				$(LIB_KDEUI) $(LIB_KIO) $(LIB_KUTILS)
 
 messages: rc.cpp
 	$(XGETTEXT) *.cpp *.h -o $(podir)/mediaapplet.pot
--- kdebase-3.5.6_orig/kicker/applets/media/mediaapplet.cpp	2007-01-15 12:31:26.000000000 +0100
+++ kdebase-3.5.6/kicker/applets/media/mediaapplet.cpp	2007-02-14 20:55:52.000000000 +0100
@@ -26,8 +26,12 @@
 #include <kdebug.h>
 #include <kpopupmenu.h>
 #include <kiconloader.h>
+#include <dcopobject.h>
+#include <dcopref.h>
+#include <dcopclient.h>
 
 #include "mediaapplet.h"
+#include "medium.h"
 
 #include "preferencesdialog.h"
 
@@ -46,35 +50,31 @@
 	: KPanelApplet(configFile, type, actions, parent, name),
 	mButtonSizeSum(0)
 {
+	DCOPObject::setObjId("StorageMediaApplet");
 	if (!parent)
 		setBackgroundMode(X11ParentRelative);
 
 	setAcceptDrops(true);
-	
+	mMedia.setAutoDelete(true);
+
 	loadConfig();
 
-	mpDirLister = new KDirLister();
+    DCOPClient *dcopClient = KApplication::dcopClient();
 
-	connect( mpDirLister, SIGNAL( clear() ),
-	         this, SLOT( slotClear() ) );
-	connect( mpDirLister, SIGNAL( started(const KURL&) ),
-	         this, SLOT( slotStarted(const KURL&) ) );
-	connect( mpDirLister, SIGNAL( completed() ),
-	         this, SLOT( slotCompleted() ) );
-	connect( mpDirLister, SIGNAL( newItems( const KFileItemList & ) ),
-	         this, SLOT( slotNewItems( const KFileItemList & ) ) );
-	connect( mpDirLister, SIGNAL( deleteItem( KFileItem * ) ),
-	         this, SLOT( slotDeleteItem( KFileItem * ) ) );
-	connect( mpDirLister, SIGNAL( refreshItems( const KFileItemList & ) ),
-	         this, SLOT( slotRefreshItems( const KFileItemList & ) ) );
+    dcopClient->connectDCOPSignal( "kded", "mediamanager", "mediumAdded(QString, bool)",
+	                   "StorageMediaApplet", "onMediumAdded(QString, bool)", true );
+	
+	dcopClient->connectDCOPSignal( "kded", "mediamanager", "mediumChanged(QString, bool)",
+	                   "StorageMediaApplet", "onMediumAdded(QString, bool)", true );
+
+	dcopClient->connectDCOPSignal( "kded", "mediamanager", "mediumRemoved(QString, bool)",
+	                   "StorageMediaApplet", "onMediumRemoved(QString, bool)", true );
 
 	reloadList();
 }
 
 MediaApplet::~MediaApplet()
 {
-	delete mpDirLister;
-	
 	while (!mButtonList.isEmpty())
 	{
 		MediumButton *b = mButtonList.first();
@@ -82,7 +82,7 @@
 		delete b;
 	}
 	
-        KGlobal::locale()->removeCatalogue("mediaapplet");
+	KGlobal::locale()->removeCatalogue("mediaapplet");
 }
 
 void MediaApplet::about()
@@ -233,126 +233,179 @@
 	emit updateLayout();
 }
 
-void MediaApplet::slotClear()
+void MediaApplet::onMediumAdded( const QString &name, bool /* allowNotification */)
 {
-	kdDebug()<<"MediaApplet::slotClear"<<endl;
+	Medium thisMedium = resolveDevNode(name);
+	KURL realUrl = extractUrlFromMedium(thisMedium); 
+ 	if ( !realUrl.isValid() )
+	{
+        onMediumRemoved(name,false);
+		return;
+	}
 
-	while (!mButtonList.isEmpty())
+	if ( realUrl.protocol()=="audiocd" || realUrl.protocol()=="camera")
 	{
-		MediumButton *b = mButtonList.first();
-		mButtonList.remove(b);
-		delete b;
+		KFileItem newEntry( realUrl, thisMedium.mimeType(), S_IRUSR|S_IRGRP|S_IROTH );
+		newEntry.setName(thisMedium.label());
+		handleFileEntry(newEntry, name);
+	}
+	else
+	{
+		KIO::SimpleJob *job = KIO::stat( realUrl, false );
+		job->setInteractive( false );
+
+		mJobDevNodeMap[job] = name;
+        mJobDevLabelMap[job] = thisMedium.label();
+
+		connect( job, SIGNAL( result( KIO::Job * ) ),
+		         this, SLOT( slotMediumStatResult( KIO::Job * ) ) );
 	}
-	
-	arrangeButtons();
 }
 
-void MediaApplet::slotStarted(const KURL &/*url*/)
+Medium MediaApplet::resolveDevNode(const QString &devNodeName)
 {
+	Medium thisMedium(QString::null,QString::null);
 
+	// We get the mount/media information from the KDE mediamanager, the
+	// same way as what the media:/ ioslave does.
+	DCOPRef mediamanager("kded", "mediamanager");
+	DCOPReply reply = mediamanager.call( "fullList" );
+	if ( !reply.isValid() )
+	{
+		return thisMedium;
+	}
+
+	Medium::List mediumList = Medium::createList(reply);
+	Medium::List::iterator it = mediumList.begin();
+	Medium::List::iterator end = mediumList.end();
+
+	for(; it!=end; ++it)
+	{
+		if( (*it).name()==devNodeName)
+		{
+			return *it;
+		}
+	}
+
+		// Couldn't find the medium entry. Sorry.
+	return thisMedium;
 }
 
-void MediaApplet::slotCompleted()
-{
-	mMedia = mpDirLister->items(KDirLister::AllItems);
+KURL MediaApplet::extractUrlFromMedium(const Medium &thisMedium) {
+	KURL thisUrl;
+	if(thisMedium.baseURL().startsWith("audiocd:"))
+	{
+		thisUrl = KURL("audiocd:/");
+	}
+	else
+	{
+		if(thisMedium.mountPoint()!=QString::null && !thisMedium.baseURL().startsWith("camera:"))
+		{
+			thisUrl = KURL(thisMedium.mountPoint());
+		}
+		else
+		{
+			thisUrl = KURL(thisMedium.baseURL());
+		}
+	}
+	return thisUrl;
 }
 
-void MediaApplet::slotNewItems(const KFileItemList &entries)
+void MediaApplet::slotMediumStatResult( KIO::Job *job )
 {
-	kdDebug()<<"MediaApplet::slotNewItems"<<endl;
+	if ( job->error() != 0 ) return;
+	
+	KIO::StatJob *stat_job = static_cast<KIO::StatJob *>( job );
+	
+	KIO::UDSEntry entry = stat_job->statResult();
+	KURL url = stat_job->url();
+	KFileItem newEntry( entry, url );
+	QString devNodeName = mJobDevNodeMap[job];
+	mJobDevNodeMap.remove( job );
+	QString devNodeLabel = mJobDevLabelMap[job];
+	mJobDevLabelMap.remove( job );
 
-	for(KFileItemListIterator it(entries); it.current(); ++it)
-	{
-		kdDebug() << "item: " << it.current()->url() << endl;
+	newEntry.setName(QString("%1 (%2)").arg(devNodeLabel).arg(newEntry.name()));
 
-		bool found = false;
-		MediumButtonList::iterator it2;
-		MediumButtonList::iterator end = mButtonList.end();
-		for ( it2 = mButtonList.begin(); it2 != end; ++it2 )
+	handleFileEntry(newEntry, devNodeName);
+}
+
+void MediaApplet::handleFileEntry( const KFileItem &newEntry, const QString &devNodeName) {
+
+	QString mimetype = newEntry.mimetype();
+	bool found = false;
+	MediumButtonList::iterator it2;
+	MediumButtonList::iterator end2 = mButtonList.end();
+	for ( it2 = mButtonList.begin(); it2 != end2; ++it2 )
+	{
+		MediumButton *button = *it2;
+		
+		if(button->fileItem().url()==newEntry.url())
 		{
-			MediumButton *button = *it2;
-			
-			if(button->fileItem().url()==it.current()->url())
+			if(mExcludedTypesList.contains(mimetype) 
+				|| mimetype=="media/cdrom_unmounted"
+				|| mimetype=="media/removable_unmounted"
+				|| mimetype=="media/camera_unmounted"
+				|| mimetype=="media/dvd_unmounted"
+				|| mimetype=="media/cdwriter_unmounted"
+				|| mimetype=="media/zip_unmounted" )
 			{
 				found = true;
-				button->setFileItem(*it.current());
+				mButtonList.remove(button);
+				delete button;
+				break;
+			}
+			else
+			{
+				found = true;
+				button->setFileItem( newEntry, devNodeName);
 				break;
 			}
 		}
-		
-		if(!found && !mExcludedList.contains(it.current()->url().url()) )
+	}
+
+	if(!found && !mExcludedList.contains(newEntry.url().url()) && !mExcludedTypesList.contains(mimetype) )
+	{
+		MediumButton *button = new MediumButton(this, newEntry, devNodeName);
+		button->show();
+		mButtonList.append(button);
+	}
+
+	// Update the list of Medium objects.
+	KFileItemListIterator it(mMedia);
+	KFileItem *file;
+	while ( (file = it.current()) != 0 )
+	{
+		++it;
+		if(file->url()==newEntry.url())
 		{
-			MediumButton *button = new MediumButton(this, *it.current());
-			button->show();
-			mButtonList.append(button);
+			// Update the FileItem that we have stored up.
+			*file = newEntry;
+			break;
 		}
 	}
+	if(file==0)	// Not found
+	{
+		mMedia.append(new KFileItem(newEntry));
+	}
 
 	arrangeButtons();
 }
 
-void MediaApplet::slotDeleteItem(KFileItem *fileItem)
+void MediaApplet::onMediumRemoved( const QString &name, bool /*allowNotification*/ )
 {
-	kdDebug()<<"MediumApplet::slotDeleteItem:"<< fileItem->url() << endl;
-
 	MediumButtonList::iterator it;
 	MediumButtonList::iterator end = mButtonList.end();
 	for ( it = mButtonList.begin(); it != end; ++it )
 	{
 		MediumButton *button = *it;
-		
-		if(button->fileItem().url()==fileItem->url())
+		if(button->devNodeName()==name)
 		{
 			mButtonList.remove(button);
 			delete button;
 			break;
 		}
 	}
-	slotCompleted();
-	arrangeButtons();
-}
-
-void MediaApplet::slotRefreshItems(const KFileItemList &entries)
-{
-	for(KFileItemListIterator it(entries); it.current(); ++it)
-	{
-		kdDebug()<<"MediaApplet::slotRefreshItems:"<<(*it.current()).url().url()<<endl;
-
-		QString mimetype = (*it.current()).mimetype();
-		bool found = false;
-
-		kdDebug()<<"mimetype="<<mimetype<<endl;
-
-		MediumButtonList::iterator it2;
-		MediumButtonList::iterator end = mButtonList.end();
-		for ( it2 = mButtonList.begin(); it2 != end; ++it2 )
-		{
-			MediumButton *button = *it2;
-			
-			if(button->fileItem().url()==(*it.current()).url())
-			{
-				if(mExcludedTypesList.contains(mimetype))
-				{
-					mButtonList.remove(button);
-					delete button;
-				}
-				else
-				{
-					button->setFileItem(*it.current());
-				}
-				found = true;
-				break;
-			}
-		}
-
-		if(!found && !mExcludedTypesList.contains(mimetype) && !mExcludedList.contains(it.current()->url().url()) )
-		{
-			MediumButton *button = new MediumButton(this, *it.current());
-			button->show();
-			mButtonList.append(button);
-		}
-	}
-
 	arrangeButtons();
 }
 
@@ -405,8 +458,6 @@
 
 void MediaApplet::reloadList()
 {
-	mpDirLister->stop();
-	
 	while (!mButtonList.isEmpty())
 	{
 		MediumButton *b = mButtonList.first();
@@ -414,9 +465,24 @@
 		delete b;
 	}
 	
-	mpDirLister->clearMimeFilter();
-	mpDirLister->setMimeExcludeFilter(mExcludedTypesList);
-	mpDirLister->openURL(KURL("media:/"));
+	DCOPRef mediamanager("kded", "mediamanager");
+	DCOPReply reply = mediamanager.call( "fullList" );
+	if ( !reply.isValid() )
+	{
+		return;
+	}
+
+	Medium::List mediumList = Medium::createList(reply);
+	Medium::List::iterator it = mediumList.begin();
+	Medium::List::iterator end = mediumList.end();
+        
+	Medium thisMedium(QString::null,QString::null);
+
+	for(; it!=end; ++it)
+	{
+		onMediumAdded( (*it).name(), false);
+	}
+
 }
 
 void MediaApplet::mousePressEvent(QMouseEvent *e)
--- kdebase-3.5.6_orig/kicker/applets/media/mediaapplet.h	2005-10-10 17:03:59.000000000 +0200
+++ kdebase-3.5.6/kicker/applets/media/mediaapplet.h	2007-02-14 20:54:47.000000000 +0100
@@ -23,7 +23,7 @@
 #ifdef HAVE_CONFIG_H
         #include <config.h>
 #endif
-
+#include <dcopobject.h>
 #include <kpanelapplet.h>
 #include <qstring.h>
 #include <kconfig.h>
@@ -33,12 +33,19 @@
 
 #include <qptrlist.h>
 #include "mediumbutton.h"
+#include "medium.h"
+
 typedef QValueList<MediumButton*> MediumButtonList;
 
 
-class MediaApplet : public KPanelApplet
+class MediaApplet : public KPanelApplet, public DCOPObject
 {
 Q_OBJECT
+K_DCOP
+
+k_dcop:
+	void onMediumAdded( const QString &name, bool allowNotification );
+	void onMediumRemoved( const QString &name, bool allowNotification );
 
 public:
 	MediaApplet(const QString& configFile, Type t = Normal, int actions = 0,
@@ -50,6 +57,7 @@
 	void about();
 	void preferences();
 
+
 protected:
 	void arrangeButtons();
 	void resizeEvent(QResizeEvent *e);
@@ -60,20 +68,21 @@
 	void mousePressEvent(QMouseEvent *e);
 
 protected slots:
-	void slotClear();
-	void slotStarted(const KURL &url);
-	void slotCompleted();
-	void slotNewItems(const KFileItemList &entries);
-	void slotDeleteItem(KFileItem *fileItem);
-	void slotRefreshItems(const KFileItemList &entries);
+	void slotMediumStatResult( KIO::Job *job );
 
 private:
-	KDirLister *mpDirLister;
+
 	MediumButtonList mButtonList;
 	QStringList mExcludedTypesList;
 	QStringList mExcludedList;
 	KFileItemList mMedia;
-        int mButtonSizeSum;
+	int mButtonSizeSum;
+
+	Medium resolveDevNode(const QString &devNodeName);
+	KURL extractUrlFromMedium(const Medium &thisMedium);
+	void handleFileEntry( const KFileItem &newEntry, const QString &devNodeName );
+	QMap<KIO::Job*,QString> mJobDevNodeMap;
+	QMap<KIO::Job*,QString> mJobDevLabelMap;
 };
 
 #endif
--- kdebase-3.5.6_orig/kicker/applets/media/mediumbutton.cpp	2006-01-19 18:01:42.000000000 +0100
+++ kdebase-3.5.6/kicker/applets/media/mediumbutton.cpp	2007-02-18 12:36:30.000000000 +0100
@@ -44,9 +44,11 @@
 #include <konq_popupmenu.h>
 #include <konq_drag.h>
 
-MediumButton::MediumButton(QWidget *parent, const KFileItem &fileItem)
+MediumButton::MediumButton(QWidget *parent, const KFileItem &fileItem, const QString &devNodeName)
 	: PanelPopupButton(parent), mActions(this, this), mFileItem(fileItem)
 {
+	mDevNodeName = devNodeName;
+
 	KAction *a = KStdAction::paste(this, SLOT(slotPaste()),
 	                               &mActions, "pasteto");
 	a->setShortcut(0);
@@ -81,9 +83,14 @@
 {
 	return mFileItem;
 }
+const QString &MediumButton::devNodeName() const
+{
+	return mDevNodeName;
+}
 
-void MediumButton::setFileItem(const KFileItem &fileItem)
+void MediumButton::setFileItem(const KFileItem &fileItem, const QString &devNodeName)
 {
+	mDevNodeName = devNodeName;
 	mFileItem.assign(fileItem);
 	setAcceptDrops(mFileItem.isWritable());
 	setTitle(mFileItem.text());
@@ -121,7 +128,15 @@
 {
     KMimeType::Ptr mime = mFileItem.determineMimeType();
     QToolTip::add(this, mime->comment());
-    setIcon(mime->icon(QString::null, false));
+
+    if ( !mFileItem.iconName().isNull())
+    {
+        setIcon(mFileItem.iconName());
+    }
+    else
+    {
+        setIcon(mime->icon(QString::null, false));
+    }
 }
 
 // Activate this code only if we find a way to have both an
--- kdebase-3.5.6_orig/kicker/applets/media/mediumbutton.h	2005-10-10 17:03:59.000000000 +0200
+++ kdebase-3.5.6/kicker/applets/media/mediumbutton.h	2007-02-08 00:14:36.000000000 +0100
@@ -35,10 +35,11 @@
 Q_OBJECT
 
 public:
-	MediumButton(QWidget *parent, const KFileItem &fileItem);
+	MediumButton(QWidget *parent, const KFileItem &fileItem, const QString &devNodeName);
 	~MediumButton();
 	const KFileItem &fileItem() const;
-	void setFileItem(const KFileItem &fileItem);
+	const QString &devNodeName() const;
+	void setFileItem(const KFileItem &fileItem, const QString &devNodeName);
 	void setPanelPosition(KPanelApplet::Position position);
 
 protected:
@@ -61,6 +62,7 @@
 	KActionCollection mActions;
 	KFileItem mFileItem;
 	QTimer mOpenTimer;
+	QString mDevNodeName;
 };
 
 #endif
--- kdebase-3.5.6_orig/kicker/applets/media/preferencesdialog.cpp	2005-10-10 17:03:59.000000000 +0200
+++ kdebase-3.5.6/kicker/applets/media/preferencesdialog.cpp	2007-02-08 00:14:36.000000000 +0100
@@ -123,7 +123,14 @@
 
 	for(; it != mimetypes.end(); ++it)
 	{
-		if ((*it)->name().startsWith("media/"))
+		QString name = (*it)->name(); 
+		if (name.startsWith("media/")
+			&& name!="media/cdrom_unmounted"
+			&& name!="media/removable_unmounted"
+			&& name!="media/camera_unmounted"
+			&& name!="media/dvd_unmounted"
+			&& name!="media/cdwriter_unmounted"
+			&& name!="media/zip_unmounted" )
 		{
 			bool ok=excludedTypesList.contains((*it)->name())==0;
 			MediumTypeItem *item = new MediumTypeItem(mpMediumTypesListView, (*it)->comment(), (*it)->name());
@@ -157,8 +164,7 @@
 		++it;
 
 		bool ok = excludedList.contains(file->url().url())==0;
-		MediumItem *item = new MediumItem(mpMediaListView,
-		                                  file->text(), *file);
+		MediumItem *item = new MediumItem(mpMediaListView, file->text()=="" ? "/" : file->text(), *file);
 		item->setOn(ok);
 	}
 }
