[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    KDE/kdenetwork/kopete/protocols/oscar/liboscar
From:       Roman Jarosz <kedgedev () centrum ! cz>
Date:       2008-08-29 20:40:42
Message-ID: 1220042442.024218.21145.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 854580 by rjarosz:

Check if message was/wasn't successfully delivered. Only messages with id greater than 0 are checked.



 M  +1 -0      CMakeLists.txt  
 M  +21 -1     client.cpp  
 M  +6 -0      client.h  
 M  +17 -0     connection.cpp  
 M  +20 -0     connection.h  
 M  +13 -0     oscarmessage.cpp  
 M  +6 -0      oscarmessage.h  
 M  +12 -0     tasks/errortask.cpp  
 M  +4 -0      tasks/errortask.h  
 A             tasks/messageacktask.cpp   [License: GPL (v2+)]
 A             tasks/messageacktask.h   [License: GPL (v2+)]
 M  +8 -0      tasks/sendmessagetask.cpp  


--- trunk/KDE/kdenetwork/kopete/protocols/oscar/liboscar/CMakeLists.txt #854579:854580
@@ -64,6 +64,7 @@
     tasks/onlinenotifiertask.cpp
     tasks/ssimodifytask.cpp
     tasks/messagereceivertask.cpp
+    tasks/messageacktask.cpp
     tasks/sendmessagetask.cpp
     tasks/icqtask.cpp
     tasks/offlinemessagestask.cpp
--- trunk/KDE/kdenetwork/kopete/protocols/oscar/liboscar/client.cpp #854579:854580
@@ -42,6 +42,7 @@
 #include "logintask.h"
 #include "connection.h"
 #include "messagereceivertask.h"
+#include "messageacktask.h"
 #include "onlinenotifiertask.h"
 #include "oscarclientstream.h"
 #include "oscarsettings.h"
@@ -118,6 +119,7 @@
 	OnlineNotifierTask* onlineNotifier;
 	OwnUserInfoTask* ownStatusTask;
 	MessageReceiverTask* messageReceiverTask;
+	MessageAckTask* messageAckTask;
 	SSIAuthTask* ssiAuthTask;
 	ICQUserInfoRequestTask* icqInfoTask;
 	ICQTlvInfoRequestTask* icqTlvInfoTask;
@@ -180,6 +182,7 @@
 	d->onlineNotifier = 0L;
 	d->ownStatusTask = 0L;
 	d->messageReceiverTask = 0L;
+	d->messageAckTask = 0L;
 	d->ssiAuthTask = 0L;
 	d->icqInfoTask = 0L;
 	d->icqTlvInfoTask = 0L;
@@ -240,7 +243,13 @@
 {
 	QList<Connection*> cList = d->connections.connections();
 	for ( int i = 0; i < cList.size(); i++ )
-		(new CloseConnectionTask( cList.at(i)->rootTask() ))->go( Task::AutoDelete );
+	{
+		Connection* c = cList.at(i);
+		(new CloseConnectionTask( c->rootTask() ))->go( Task::AutoDelete );
+		
+		foreach ( Oscar::MessageInfo info, c->messageInfoList() )
+			emit messageError( info.contact, info.id );
+	}
 
 	d->active = false;
 	d->awayMsgRequestTimer->stop();
@@ -782,6 +791,7 @@
 	d->onlineNotifier = new OnlineNotifierTask( c->rootTask() );
 	d->ownStatusTask = new OwnUserInfoTask( c->rootTask() );
 	d->messageReceiverTask = new MessageReceiverTask( c->rootTask() );
+	d->messageAckTask = new MessageAckTask( c->rootTask() );
 	d->ssiAuthTask = new SSIAuthTask( c->rootTask() );
 	d->icqInfoTask = new ICQUserInfoRequestTask( c->rootTask() );
 	d->icqTlvInfoTask = new ICQTlvInfoRequestTask( c->rootTask() );
@@ -803,6 +813,11 @@
 	connect( d->messageReceiverTask, SIGNAL( fileMessage( int, const QString, const QByteArray, Buffer ) ),
 	         this, SLOT( gotFileMessage( int, const QString, const QByteArray, Buffer ) ) );
 
+	connect( d->messageAckTask, SIGNAL(messageAck(const QString&, uint)),
+	         this, SIGNAL(messageAck(const QString&, uint)) );
+	connect( d->errorTask, SIGNAL(messageError(const QString&, uint)),
+	         this, SIGNAL(messageError(const QString&, uint)) );
+	
 	connect( d->ssiAuthTask, SIGNAL( authRequested( const QString&, const QString& ) ),
 	         this, SIGNAL( authRequestReceived( const QString&, const QString& ) ) );
 	connect( d->ssiAuthTask, SIGNAL( authReplied( const QString&, const QString&, bool ) ),
@@ -1631,6 +1646,9 @@
 		emit socketError( code, string );
 	}
 
+	foreach ( Oscar::MessageInfo info, c->messageInfoList() )
+		emit messageError( info.contact, info.id );
+
     //connection is deleted. deleteLater() is used
     d->connections.remove( c );
     c = 0;
@@ -1697,6 +1715,7 @@
 	delete d->onlineNotifier;
 	delete d->ownStatusTask;
 	delete d->messageReceiverTask;
+	delete d->messageAckTask;
 	delete d->ssiAuthTask;
 	delete d->icqInfoTask;
 	delete d->icqTlvInfoTask;
@@ -1708,6 +1727,7 @@
 	d->onlineNotifier = 0;
 	d->ownStatusTask = 0;
 	d->messageReceiverTask = 0;
+	d->messageAckTask = 0;
 	d->ssiAuthTask = 0;
 	d->icqInfoTask = 0;
 	d->icqTlvInfoTask = 0;
--- trunk/KDE/kdenetwork/kopete/protocols/oscar/liboscar/client.h #854579:854580
@@ -480,6 +480,12 @@
 	/** we've received a message */
 	void messageReceived( const Oscar::Message& );
 
+	/** a message was delivered */
+	void messageAck( const QString& contact, uint messageId );
+
+	/** a message wasn't delivered */
+	void messageError( const QString& contact, uint messageId );
+
 	/** we've received an authorization request */
 	void authRequestReceived( const QString& contact, const QString& reason );
 
--- trunk/KDE/kdenetwork/kopete/protocols/oscar/liboscar/connection.cpp #854579:854580
@@ -45,6 +45,7 @@
 	Client* client;
 
 	Task* root;
+	QHash<Oscar::DWORD, Oscar::MessageInfo> snacSequenceToMessageInfo;
 };
 
 
@@ -185,6 +186,21 @@
 	return d->clientStream->localAddress();
 }
 
+void Connection::addMessageInfo( Oscar::DWORD snacSequence, const Oscar::MessageInfo& messageInfo )
+{
+	d->snacSequenceToMessageInfo.insert( snacSequence, messageInfo );
+}
+
+Oscar::MessageInfo Connection::takeMessageInfo( Oscar::DWORD snacSequence )
+{
+	return d->snacSequenceToMessageInfo.take( snacSequence );
+}
+
+QList<Oscar::MessageInfo> Connection::messageInfoList() const
+{
+	return d->snacSequenceToMessageInfo.values();
+}
+
 RateClassManager* Connection::rateManager() const
 {
 	return d->rateClassManager;
@@ -231,6 +247,7 @@
 	//clear the family list
 	d->familyList.clear();
 	d->rateClassManager->reset();
+	d->snacSequenceToMessageInfo.clear();
 }
 
 void Connection::streamReadyRead()
--- trunk/KDE/kdenetwork/kopete/protocols/oscar/liboscar/connection.h #854579:854580
@@ -37,6 +37,17 @@
 namespace Oscar
 {
 class Settings;
+
+class MessageInfo
+{
+public:
+	MessageInfo() : id( 0 ) {}
+	bool isValid() const { return (id > 0 && !contact.isEmpty()); }
+
+	uint id;
+	QString contact;
+};
+
 }
 
 /**
@@ -151,6 +162,15 @@
 
 	QHostAddress localAddress() const;
 
+	/** Map snac sequence to message info */
+	void addMessageInfo( Oscar::DWORD snacSequence, const Oscar::MessageInfo& messageInfo );
+
+	/** Return message info for snac sequence and remove it from map */
+	Oscar::MessageInfo takeMessageInfo( Oscar::DWORD snacSequence );
+
+	/** Return message info list */
+	QList<Oscar::MessageInfo> messageInfoList() const;
+
 	/** Convenience function to get the root task for use in Tasks */
 	Task* rootTask() const;
 
--- trunk/KDE/kdenetwork/kopete/protocols/oscar/liboscar/oscarmessage.cpp #854579:854580
@@ -47,6 +47,7 @@
 		fileSize = 0;
 		fileCount = 0;
 		plugin = 0;
+		id = 0;
 	}
 	MessagePrivate( const MessagePrivate &other )
 		: QSharedData( other )
@@ -71,6 +72,7 @@
 		fileName = other.fileName;
 		fileSize = other.fileSize;
 		fileCount = other.fileCount;
+		id = other.id;
 
 		if ( other.plugin )
 			plugin = new MessagePlugin(*other.plugin);
@@ -104,6 +106,7 @@
 	DWORD fileSize;
 	WORD fileCount;
 	MessagePlugin* plugin;
+	uint id;
 };
 
 Message::Message()
@@ -470,6 +473,16 @@
 	d->plugin = plugin;
 }
 
+uint Message::id() const
+{
+	return d->id;
+}
+
+void Message::setId( uint id )
+{
+	d->id = id;
+}
+
 Message::operator bool() const
 {
 	return d->channel != -1 && d->properties != -1;
--- trunk/KDE/kdenetwork/kopete/protocols/oscar/liboscar/oscarmessage.h #854579:854580
@@ -239,6 +239,12 @@
 	 */
 	void setPlugin( MessagePlugin* plugin );
 
+	/** Get the id of the message */
+	uint id() const;
+
+	/** Set the id of the message */
+	void setId( uint id );
+
 	operator bool() const;
 
 private:
--- trunk/KDE/kdenetwork/kopete/protocols/oscar/liboscar/tasks/errortask.cpp #854579:854580
@@ -19,6 +19,7 @@
 #include <kdebug.h>
 #include "oscartypes.h"
 #include "transfer.h"
+#include "connection.h"
 
 ErrorTask::ErrorTask( Task* parent )
 	: Task( parent )
@@ -48,6 +49,10 @@
 {
 	if ( forMe( transfer ) )
 	{
+		const SnacTransfer* st = dynamic_cast<const SnacTransfer*>( transfer );
+		if ( !st )
+			return false;
+
 		Buffer* buffer = transfer->buffer();
 		//get the error code
 		Oscar::WORD errorCode = buffer->getWord();
@@ -58,10 +63,17 @@
 			kDebug(OSCAR_RAW_DEBUG) << "TLV error subcode is " 
 					<< t.data << endl;
 		}
+
+		Oscar::MessageInfo info = client()->takeMessageInfo( st->snacRequest() );
+		if ( info.isValid() )
+			emit messageError( info.contact, info.id );
+
 		return true;
 	}
 	else 
 		return false;
 }
 
+#include "errortask.moc"
+
 //kate indent-mode csands;
--- trunk/KDE/kdenetwork/kopete/protocols/oscar/liboscar/tasks/errortask.h #854579:854580
@@ -26,11 +26,15 @@
 */
 class ErrorTask : public Task
 {
+	Q_OBJECT
 public:
     ErrorTask( Task* parent );
     ~ErrorTask();
     bool take( Transfer* transfer );
 
+signals:
+	void messageError( const QString& contact, uint messageId );
+
 protected:
     bool forMe( const Transfer* transfer ) const;
 
--- trunk/KDE/kdenetwork/kopete/protocols/oscar/liboscar/tasks/sendmessagetask.cpp #854579:854580
@@ -71,6 +71,14 @@
 	SNAC s = { 0x0004, snacSubfamily, 0x0000, client()->snacSequence() };
 	Buffer* b = new Buffer();
 
+	if ( m_message.id() > 0 )
+	{
+		Oscar::MessageInfo info;
+		info.contact = m_message.receiver();
+		info.id = m_message.id();
+		client()->addMessageInfo( s.id, info );
+	}
+
 	if ( snacSubfamily == 0x0006 && m_message.messageType() != Oscar::MessageType::File )
 	{
 		Oscar::DWORD cookie1 = KRandom::random();
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic