[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