OK just cleaned up the code and fixed a bug or two I found.

Attached 3 files:
    diff.patch - Replaces kopetemimesourcefactory entries
    kopetefileengine.cpp  - Place in libkopete
    kopetefileengine.j       - Place in libkopete

You may discard:
        kopetemimesourcefactory.cpp
        kopetemimesourcefactory.h
        
I need some feedback so I can commit to svn.

Cheers,
GA

-- 
Guillermo A. Amaral, CSE
# Free & Open Source Advocate
& nick: guillermoamaral
@ blog: http://blog.guillermoamaral.com/
@ site: http://www.guillermoamaral.com/
$ irc: [EMAIL PROTECTED]
% gpg: http://downloads.guillermoamaral.com/public.asc
/*
 *	kopetefileengine.h - Kopete file engine
 * 
 *	Copyright (c) 2007      by Guillermo A. Amaral B <[EMAIL PROTECTED]>
 *	Kopete    (c) 2007      by the Kopete developers <kopete-devel@kde.org>
 * 
 *	Based on Kopete Mime Source Factory
 *	Copyright (c) 2004      by Richard Smith         <[EMAIL PROTECTED]>
 * 
 *************************************************************************
 *                                                                       *
 * 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.      *
 *                                                                       *
 *************************************************************************
 */

#ifndef KOPETEFILEENGINE_H
#define KOPETEFILEENGINE_H

#include <qabstractfileengine.h>
#include <qstring.h>
#include <QBuffer>

#include "kopete_export.h"

namespace Kopete
{
	class KOPETE_EXPORT KopeteFileEngineHandler : public QAbstractFileEngineHandler
	{
		public:
			QAbstractFileEngine *create(const QString &fileName) const;
	};
	
	class KOPETE_EXPORT KopeteFileEngine : public QAbstractFileEngine
	{
		public:
			KopeteFileEngine();
			~KopeteFileEngine();
			explicit KopeteFileEngine(const QString&);
			
			bool open(QIODevice::OpenMode openMode);
			bool close();
			qint64 size() const;
			qint64 pos() const;
			bool seek(qint64);
			bool isSequential() const;
			bool remove();
			bool rename(const QString &newName);
			bool mkdir(const QString &dirName, bool createParentDirectories) const;
			bool rmdir(const QString &dirName, bool recurseParentDirectories) const;
			bool setSize(qint64 size);
			bool caseSensitive() const;
			bool isRelativePath() const;
			QStringList entryList(QDir::Filters filters, const QStringList &filterNames) const;
			FileFlags fileFlags(FileFlags type) const;
			bool setPermissions(uint perms);
			QString fileName(FileName file=DefaultName) const;
			uint ownerId(FileOwner) const;
			QString owner(FileOwner) const;
			QDateTime fileTime(FileTime time) const;
			void setFileName(const QString &file);
			bool atEnd() const;
			
			qint64 read(char *data, qint64 maxlen);
			qint64 readLine(char *data, qint64 maxlen);
			qint64 write(const char *data, qint64 len);
		private:
			QString m_fileName;
			QByteArray m_data;
			QBuffer m_buffer;
	};
} // Kopete
#endif
// vim: set noet ts=4 sts=4 sw=4:
/*
 *	kopetefileengine.h - Kopete file engine
 *
 *	Copyright (c) 2007      by Guillermo A. Amaral B <[EMAIL PROTECTED]>
 *	Kopete    (c) 2007      by the Kopete developers <kopete-devel@kde.org>
 *
 *	Based on Kopete Mime Source Factory
 *	Copyright (c) 2004      by Richard Smith         <[EMAIL PROTECTED]>
 *
 *************************************************************************
 *                                                                       *
 * 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.      *
 *                                                                       *
 *************************************************************************
 */

#include "kopetefileengine.h"

#include "kopeteaccountmanager.h"
#include "kopetecontactlist.h"
#include "kopeteaccount.h"
#include "kopetecontact.h"
#include "kopetemetacontact.h"
#include "kopetepicture.h"

#include <kdebug.h>
#include <kiconloader.h>

#include <QPixmap>
#include <qdiriterator.h>
#include <qstring.h>
#include <qstringlist.h>

namespace Kopete
{
	QAbstractFileEngine *KopeteFileEngineHandler::create(const QString &fileName) const
	{
		bool handle = false;
		handle |= fileName.startsWith("kopete-account-icon", Qt::CaseInsensitive);
		handle |= fileName.startsWith("kopete-contact-icon", Qt::CaseInsensitive);
		handle |= fileName.startsWith("kopete-metacontact-icon", Qt::CaseInsensitive);
		handle |= fileName.startsWith("kopete-metacontact-photo", Qt::CaseInsensitive);
		handle |= fileName.startsWith("kopete-onlinestatus-icon", Qt::CaseInsensitive);
		return handle ? new KopeteFileEngine(fileName) : 0;
	}

	KopeteFileEngine::KopeteFileEngine()
	: m_buffer(&m_data)
	{
		kDebug(14010) << k_funcinfo << endl;
	}

	KopeteFileEngine::KopeteFileEngine(const QString& fileName)
	: m_fileName(fileName), m_buffer(&m_data)
	{
		kDebug(14010) << k_funcinfo << fileName << endl;
	}

	KopeteFileEngine::~KopeteFileEngine()
	{
		kDebug(14010) << k_funcinfo << m_fileName << endl;
	}

	bool KopeteFileEngine::open(QIODevice::OpenMode openMode)
	{
		kDebug(14010) << k_funcinfo << m_fileName << " " << openMode << endl;

		// flag used to signal something went wrong when creating a mimesource
		bool completed = false;

		QPixmap *tmpPixmap = 0;
		QImage *tmpImage = 0;

		// extract and decode arguments
		QStringList parts = m_fileName.split( QChar(':'), QString::SkipEmptyParts );
		for ( QStringList::Iterator it = parts.begin(); it != parts.end(); ++it )
			*it = QUrl::fromPercentEncoding( (*it).toUtf8() );

		if ( parts[0] == QString::fromLatin1("kopete-contact-icon") )
		{
			if ( parts.size() >= 4 )
			{
				Account *account = AccountManager::self()->findAccount( parts[1], parts[2] );
				if ( account )
				{
					Contact *contact = account->contacts()[ parts[3] ];
					if ( contact )
					{
						tmpPixmap = new QPixmap( contact->onlineStatus().iconFor( contact ) );
						completed = true;
					}
					else
						kDebug( 14010 ) << k_funcinfo << "kopete-contact-icon: contact not found" << endl;
				}
				else
					kDebug( 14010 ) << k_funcinfo << "kopete-contact-icon: account not found" << endl;
			}
			else
				kDebug( 14010 ) << k_funcinfo << "kopete-contact-icon: insufficient information in m_fileName: " << parts << endl;
		}
		else if ( parts[0] == QString::fromLatin1("kopete-account-icon") )
		{
			if ( parts.size() >= 3 )
			{
				Account *account = AccountManager::self()->findAccount( parts[1], parts[2] );
				if ( account )
				{
					tmpPixmap = new QPixmap( account->myself()->onlineStatus().iconFor( account->myself() ) );
					completed = true;
				}
				else
					kDebug( 14010 ) << k_funcinfo << "kopete-account-icon: account not found" << endl;
			}
			else
				kDebug( 14010 ) << k_funcinfo << "kopete-account-icon: insufficient information in m_fileName: " << parts << endl;
		}
		else if ( parts[0] == QString::fromLatin1("kopete-metacontact-icon") )
		{
			if ( parts.size() >= 2 )
			{
				MetaContact *mc = ContactList::self()->metaContact( parts[1] );
				if ( mc )
				{
					tmpPixmap = new QPixmap( SmallIcon( mc->statusIcon() ) );
					completed = true;
				}
			}
			else
				kDebug( 14010 ) << k_funcinfo << "kopete-metacontact-icon: insufficient information in m_fileName: " << parts << endl;
		}
		else if ( parts[0] == QString::fromLatin1("kopete-metacontact-photo") )
		{
			if ( parts.size() >= 2 )
			{
				MetaContact *mc = ContactList::self()->metaContact( parts[1] );

				if ( mc )
				{
					tmpImage = new QImage(mc->picture().image());
					completed = true;
				}
			}
			else
				kDebug( 14010 ) << k_funcinfo << "kopete-metacontact-photo: insufficient information in m_fileName: " << parts << endl;
		}
		else if ( parts[0] == QString::fromLatin1("kopete-onlinestatus-icon") )
		{
			if ( parts.size() >= 2 )
			{
				/*
				 * We are using a dirty trick here: this mime source is supposed to return the
				 * icon for an arbitrary KOS instance. To do this, the caller needs to ask
				 * the KOS for the mime source key first, which also ensures the icon is
				 * currently in the cache. The cache is global, so we just need to find any
				 * existing KOS instance to return us the rendered icon from the cache.
				 * To find a valid KOS, we ask Kopete's account manager to locate an existing
				 * account. We'll use the myself() instance of that account to reference its
				 * current KOS object, which in turn has access to the global KOS icon cache.
				 * Note that if the cache has been invalidated in the meantime, we'll just
				 * get an empty pixmap back.
				 */
				Account *account = AccountManager::self()->accounts().first();
				if ( account )
				{
					tmpPixmap = new QPixmap( account->myself()->onlineStatus().iconFor( parts[1] ) );
					completed = true;
				}
				else
					kDebug( 14010 ) << k_funcinfo << "kopete-onlinestatus-icon: no active account found" << endl;
			}
			else
				kDebug( 14010 ) << k_funcinfo << "kopete-onlinestatus-icon: insufficient information in m_fileName: " << parts << endl;
		}

		close();

		if ( completed )
		{
			m_buffer.open(QIODevice::WriteOnly);

			if (tmpImage != 0)
			{
				tmpImage->save(&m_buffer, "JPEG");
				delete tmpImage;
			}
			else if (tmpPixmap != 0)
			{
				tmpPixmap->save(&m_buffer, "PNG");
				delete tmpPixmap;
			}
			else
			{
				completed = false;
			}

			m_buffer.close();

			m_buffer.open(openMode);
			m_buffer.seek(0);
		}

		kDebug(14010) << k_funcinfo << "return: " << completed << endl;

		return completed;
	}

	bool KopeteFileEngine::close()
	{
		kDebug(14010) << k_funcinfo << endl;

		if(m_buffer.isOpen())
		{
			m_buffer.close();
		}

		m_data.clear();

		return true;
	}

	qint64 KopeteFileEngine::size() const
	{
		return m_buffer.size();
	}

	qint64 KopeteFileEngine::pos() const
	{
		return m_buffer.pos();
	}

	bool KopeteFileEngine::seek(qint64 newPos)
	{
		return m_buffer.seek(newPos);
	}

	bool KopeteFileEngine::isSequential() const
	{
		return false;
	}

	bool KopeteFileEngine::remove()
	{
		return false;
	}

	bool KopeteFileEngine::rename(const QString &newName)
	{
		Q_UNUSED(newName);
		return false;
	}

	bool KopeteFileEngine::mkdir(const QString &dirName, bool createParentDirectories) const
	{
		Q_UNUSED(dirName);
		Q_UNUSED(createParentDirectories);
		return false;
	}

	bool KopeteFileEngine::rmdir(const QString &dirName, bool recurseParentDirectories) const
	{
		Q_UNUSED(dirName);
		Q_UNUSED(recurseParentDirectories);
		return false;
	}

	bool KopeteFileEngine::setSize(qint64 size)
	{
		Q_UNUSED(size);
		return false;
	}

	bool KopeteFileEngine::caseSensitive() const
	{
		return false;
	}

	bool KopeteFileEngine::isRelativePath() const
	{
		return false;
	}

	QStringList KopeteFileEngine::entryList(QDir::Filters filters, const QStringList &filterNames) const
	{
		Q_UNUSED(filters);
		Q_UNUSED(filterNames);
		return QStringList();
	}

	KopeteFileEngine::FileFlags KopeteFileEngine::fileFlags(FileFlags type) const
	{
		Q_UNUSED(type);
		return 0;
	}

	bool KopeteFileEngine::setPermissions(uint perms)
	{
		Q_UNUSED(perms);
		return false;
	}

	QString KopeteFileEngine::fileName(FileName file) const
	{
		Q_UNUSED(file);
		return m_fileName;
	}

	uint KopeteFileEngine::ownerId(FileOwner owner) const
	{
		Q_UNUSED(owner);
		return 0;
	}

	QString KopeteFileEngine::owner(FileOwner owner) const
	{
		Q_UNUSED(owner);
		return QString();
	}

	QDateTime KopeteFileEngine::fileTime(FileTime time) const
	{
		Q_UNUSED(time);
		return QDateTime();
	}

	void KopeteFileEngine::setFileName(const QString &file)
	{
		m_fileName = file;
	}

	qint64 KopeteFileEngine::read(char *data, qint64 maxlen)
	{
		return m_buffer.read(data, maxlen);;
	}

	qint64 KopeteFileEngine::readLine(char *data, qint64 maxlen)
	{
		return m_buffer.readLine(data, maxlen);
	}

	qint64 KopeteFileEngine::write(const char *data, qint64 len)
	{
		Q_UNUSED(data);
		Q_UNUSED(len);
		return -1;
	}

	bool KopeteFileEngine::atEnd() const
	{
		return m_buffer.atEnd();
	}
} // END namespace Kopete

// vim: set noet ts=4 sts=4 sw=4:
Index: kopete/kopeteapplication.h
===================================================================
--- kopete/kopeteapplication.h	(revision 678750)
+++ kopete/kopeteapplication.h	(working copy)
@@ -26,7 +26,7 @@

 class KopeteWindow;
 class QSessionManager;
-class Q3MimeSourceFactory;
+class QAbstractFileEngineHandler;

 namespace Kopete
 {
@@ -78,7 +78,7 @@
 	QPointer<KopeteWindow> m_mainWindow;
 	bool m_isShuttingDown;
 	Kopete::MimeTypeHandler *m_emoticonHandler;
-	Q3MimeSourceFactory *m_mimeFactory;
+	QAbstractFileEngineHandler *m_fileEngineHandler;

 private:
 	void handleURLArgs();
Index: kopete/kopeteapplication.cpp
===================================================================
--- kopete/kopeteapplication.cpp	(revision 678750)
+++ kopete/kopeteapplication.cpp	(working copy)
@@ -38,7 +38,7 @@
 #include "kopetecommandhandler.h"
 #include "kopetecontactlist.h"
 #include "kopeteglobal.h"
-#include "kopetemimesourcefactory.h"
+#include "kopetefileengine.h"
 #include "kopetemimetypehandler.h"
 #include "kopetepluginmanager.h"
 #include "kopeteprotocol.h"
@@ -81,8 +81,7 @@
 	 */
 	QTimer::singleShot( 0, this, SLOT( slotLoadPlugins() ) );

-	m_mimeFactory = new Kopete::MimeSourceFactory;
-	Q3MimeSourceFactory::addFactory( m_mimeFactory );
+	m_fileEngineHandler = new Kopete::KopeteFileEngineHandler;

 	//Create the emoticon installer
 	m_emoticonHandler = new Kopete::EmoticonMimeTypeHandler;
@@ -94,7 +93,7 @@

 	delete m_mainWindow;
 	delete m_emoticonHandler;
-	delete m_mimeFactory;
+	delete m_fileEngineHandler;
 	//kDebug( 14000 ) << k_funcinfo << "Done" << endl;
 }

Index: libkopete/CMakeLists.txt
===================================================================
--- libkopete/CMakeLists.txt	(revision 678750)
+++ libkopete/CMakeLists.txt	(working copy)
@@ -75,7 +75,7 @@
    kopetemessagehandlerchain.cpp
    kopetemessagehandler.cpp
    kopetemetacontact.cpp
-   kopetemimesourcefactory.cpp
+   kopetefileengine.cpp
    kopetemimetypehandler.cpp
    kopeteonlinestatus.cpp
    kopeteonlinestatusmanager.cpp
@@ -103,7 +103,7 @@
  ui/addressbooklinkwidget_base.ui
  ui/addressbookselectorwidget_base.ui
  ui/avatarselectorwidget.ui
- ui/contactaddednotifywidget.ui
+ ui/contactaddednotifywidget.ui
  ui/fileconfirmbase.ui
  ui/kopeteawaydialogbase.ui
  ui/kopetepasswordwidgetbase.ui

Attachment: signature.asc
Description: This is a digitally signed message part.

_______________________________________________
kopete-devel mailing list
kopete-devel@kde.org
https://mail.kde.org/mailman/listinfo/kopete-devel

Reply via email to